o
    pi                     @   s   d dl mZ 	ddefddZ				dded	ee d
ee dee dee defddZ	dddZ				dded	ee d
ee dee dee defddZ	ddefddZ				dded	ee d
ee dee dee defddZdS )    )List      returnc                 C   s$   d| d|  ||d   d |  S )a  Compute expected number of frames after 1D convolution

    Parameters
    ----------
    num_samples : int
        Number of samples in the input signal
    kernel_size : int
        Kernel size
    stride : int
        Stride
    padding : int
        Padding
    dilation : int
        Dilation

    Returns
    -------
    num_frames : int
        Number of frames in the output signal

    Source
    ------
    https://pytorch.org/docs/stable/generated/torch.nn.Conv1d.html#torch.nn.Conv1d
    r       )num_sampleskernel_sizestridepaddingdilationr   r   X/home/ubuntu/.local/lib/python3.10/site-packages/pyannote/audio/utils/receptive_field.pyconv1d_num_frames   s   $r   Nr   r	   r
   r   r   c           
      C   s6   | }t ||||D ]\}}}}	t|||||	d}q	|S )N)r	   r
   r   r   )zipr   )
r   r	   r
   r   r   
num_frameskspdr   r   r   multi_conv_num_frames8   s   
r   c                 C   s(   d|d |  }|| d |  d|  S )ae  Compute size of receptive field

    Parameters
    ----------
    num_frames : int, optional
        Number of frames in the output signal
    kernel_size : int
        Kernel size
    stride : int
        Stride
    padding : int
        Padding
    dilation : int
        Dilation

    Returns
    -------
    size : int
        Receptive field size
    r   r   r   )r   r	   r
   r   r   effective_kernel_sizer   r   r   conv1d_receptive_field_sizeH      r   r   c           
      C   >   | }t tt||||D ]\}}}}	t|||||	d}q|S )N)r   r	   r
   r   r   )reversedlistr   r   )
r   r	   r
   r   r   receptive_field_sizer   r   r   r   r   r   r   multi_conv_receptive_field_sized   s   "r   c                 C   s(   d|d |  }| | |d d  | S )aK  Compute center of receptive field

    Parameters
    ----------
    frame : int
        Frame index
    kernel_size : int
        Kernel size
    stride : int
        Stride
    padding : int
        Padding
    dilation : int
        Dilation

    Returns
    -------
    center : int
        Index of receptive field center
    r   r   r   )framer	   r
   r   r   r   r   r   r   conv1d_receptive_field_centerx   r   r   r   c           
      C   r   )N)r   r	   r
   r   r   )r   r   r   r   )
r   r	   r
   r   r   receptive_field_centerr   r   r   r   r   r   r   !multi_conv_receptive_field_center   s   "r!   )r   r   r   r   )NNNN)r   r   r   r   r   )r   r   r   r   r   )	typingr   intr   r   r   r   r   r!   r   r   r   r   <module>   s|   
 



