U
    ­Ê¹j5  ã                   @   sÞ   d dl Z d dlmZmZmZmZmZmZ d dlZd dlm	Z	 ddl
mZmZ ejjjZG dd„ dejjƒZG dd	„ d	ejjƒZG d
d„ deƒZG dd„ deƒZG dd„ dejjƒZG dd„ dejjƒZG dd„ dejjƒZdS )é    N)ÚCallableÚListÚOptionalÚSequenceÚTupleÚUnion)ÚTensoré   )Ú_log_api_usage_onceÚ_make_ntuplec                       sr   e Zd ZdZdeedœ‡ fdd„Zeeee	e
e e
e e
e dœ‡ fdd„Zeed	œd
d„Zedœdd„Z‡  ZS )ÚFrozenBatchNorm2da!  
    BatchNorm2d where the batch statistics and the affine parameters are fixed

    Args:
        num_features (int): Number of features ``C`` from an expected input of size ``(N, C, H, W)``
        eps (float): a value added to the denominator for numerical stability. Default: 1e-5
    çñhãˆµøä>)Únum_featuresÚepsc                    sd   t ƒ  ¡  t| ƒ || _|  dt |¡¡ |  dt |¡¡ |  dt |¡¡ |  dt |¡¡ d S )NÚweightÚbiasÚrunning_meanÚrunning_var)ÚsuperÚ__init__r
   r   Zregister_bufferÚtorchZonesZzeros)Úselfr   r   ©Ú	__class__© úS/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchvision/ops/misc.pyr      s    
zFrozenBatchNorm2d.__init__)Ú
state_dictÚprefixÚlocal_metadataÚstrictÚmissing_keysÚunexpected_keysÚ
error_msgsc           	   	      s2   |d }||kr||= t ƒ  |||||||¡ d S )NZnum_batches_tracked)r   Ú_load_from_state_dict)	r   r   r   r   r   r    r!   r"   Znum_batches_tracked_keyr   r   r   r#   #   s    
      ÿz'FrozenBatchNorm2d._load_from_state_dict©ÚxÚreturnc                 C   sr   | j  dddd¡}| j dddd¡}| j dddd¡}| j dddd¡}||| j  ¡  }|||  }|| | S )Né   éÿÿÿÿ)r   Zreshaper   r   r   r   Zrsqrt)r   r%   ÚwÚbÚrvZrmÚscaler   r   r   r   Úforward5   s    zFrozenBatchNorm2d.forward)r&   c                 C   s$   | j j› d| jjd › d| j› d�S )Nú(r   z, eps=ú))r   Ú__name__r   Úshaper   )r   r   r   r   Ú__repr__@   s    zFrozenBatchNorm2d.__repr__)r   )r0   Ú
__module__Ú__qualname__Ú__doc__ÚintÚfloatr   ÚdictÚstrÚboolr   r#   r   r-   r2   Ú__classcell__r   r   r   r   r      s     ýýør   c                       sÖ   e Zd Zddddejjejjdddejjf
eee	ee
edf f e	ee
edf f ee	ee
edf ef  eeedejjf  eedejjf  e	ee
edf f ee ee edejjf ddœ‡ fdd„Z‡  ZS )	ÚConvNormActivationé   r'   NT.)Úin_channelsÚout_channelsÚkernel_sizeÚstrideÚpaddingÚgroupsÚ
norm_layerÚactivation_layerÚdilationÚinplacer   Ú
conv_layerr&   c              
      s  |d krxt ˆtƒr.t ˆ tƒr.ˆd d ˆ  }nJt ˆtƒr@tˆƒntˆ ƒ}tˆ|ƒ‰tˆ |ƒ‰ t‡ ‡fdd„t|ƒD ƒƒ}|d krˆ|d k}|||ˆ||ˆ ||d�g}|d k	r¸| ||ƒ¡ |d k	rä|
d krÌi nd|
i}| |f |Ž¡ tƒ j	|Ž  t
| ƒ || _| jtk�rt d¡ d S )Nr'   r	   c                 3   s&   | ]}ˆ| d  d ˆ |  V  qdS )r'   r	   Nr   )Ú.0Úi©rF   r@   r   r   Ú	<genexpr>\   s     z.ConvNormActivation.__init__.<locals>.<genexpr>)rF   rC   r   rG   zhDon't use ConvNormActivation directly, please use Conv2dNormActivation and Conv3dNormActivation instead.)Ú
isinstancer6   r   Úlenr   ÚtupleÚrangeÚappendr   r   r
   r?   r   r<   ÚwarningsÚwarn)r   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   r   rH   Z	_conv_dimÚlayersÚparamsr   rK   r   r   E   s@    

øÿÿzConvNormActivation.__init__)r0   r3   r4   r   ÚnnÚBatchNorm2dÚReLUÚConv2dr6   r   r   r   r9   r   ÚModuler:   r   r;   r   r   r   r   r<   D   s2   óòr<   c                       sÆ   e Zd ZdZddddejjejjdddf	eee	ee
eef f e	ee
eef f ee	ee
eef ef  eeedejjf  eedejjf  e	ee
eef f ee ee ddœ‡ fdd	„Z‡  ZS )
ÚConv2dNormActivationaë  
    Configurable block used for Convolution2d-Normalization-Activation blocks.

    Args:
        in_channels (int): Number of channels in the input image
        out_channels (int): Number of channels produced by the Convolution-Normalization-Activation block
        kernel_size: (int, optional): Size of the convolving kernel. Default: 3
        stride (int, optional): Stride of the convolution. Default: 1
        padding (int, tuple or str, optional): Padding added to all four sides of the input. Default: None, in which case it will be calculated as ``padding = (kernel_size - 1) // 2 * dilation``
        groups (int, optional): Number of blocked connections from input channels to output channels. Default: 1
        norm_layer (Callable[..., torch.nn.Module], optional): Norm layer that will be stacked on top of the convolution layer. If ``None`` this layer won't be used. Default: ``torch.nn.BatchNorm2d``
        activation_layer (Callable[..., torch.nn.Module], optional): Activation function which will be stacked on top of the normalization layer (if not None), otherwise on top of the conv layer. If ``None`` this layer won't be used. Default: ``torch.nn.ReLU``
        dilation (int): Spacing between kernel elements. Default: 1
        inplace (bool): Parameter for the activation layer, which can optionally do the operation in-place. Default ``True``
        bias (bool, optional): Whether to use bias in the convolution layer. By default, biases are included if ``norm_layer is None``.

    r=   r'   NT.©r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   r   r&   c                    s*   t ƒ  |||||||||	|
|tjj¡ d S ©N)r   r   r   rV   rY   ©r   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   r   r   r   r   r   �   s    ôzConv2dNormActivation.__init__)r0   r3   r4   r5   r   rV   rW   rX   r6   r   r   r   r9   r   rZ   r:   r   r;   r   r   r   r   r[   }   s0   ôór[   c                       sÎ   e Zd ZdZddddejjejjdddf	eee	ee
eeef f e	ee
eeef f ee	ee
eeef ef  eeedejjf  eedejjf  e	ee
eeef f ee ee ddœ‡ fdd	„Z‡  ZS )
ÚConv3dNormActivationaë  
    Configurable block used for Convolution3d-Normalization-Activation blocks.

    Args:
        in_channels (int): Number of channels in the input video.
        out_channels (int): Number of channels produced by the Convolution-Normalization-Activation block
        kernel_size: (int, optional): Size of the convolving kernel. Default: 3
        stride (int, optional): Stride of the convolution. Default: 1
        padding (int, tuple or str, optional): Padding added to all four sides of the input. Default: None, in which case it will be calculated as ``padding = (kernel_size - 1) // 2 * dilation``
        groups (int, optional): Number of blocked connections from input channels to output channels. Default: 1
        norm_layer (Callable[..., torch.nn.Module], optional): Norm layer that will be stacked on top of the convolution layer. If ``None`` this layer won't be used. Default: ``torch.nn.BatchNorm3d``
        activation_layer (Callable[..., torch.nn.Module], optional): Activation function which will be stacked on top of the normalization layer (if not None), otherwise on top of the conv layer. If ``None`` this layer won't be used. Default: ``torch.nn.ReLU``
        dilation (int): Spacing between kernel elements. Default: 1
        inplace (bool): Parameter for the activation layer, which can optionally do the operation in-place. Default ``True``
        bias (bool, optional): Whether to use bias in the convolution layer. By default, biases are included if ``norm_layer is None``.
    r=   r'   NT.r\   c                    s*   t ƒ  |||||||||	|
|tjj¡ d S r]   )r   r   r   rV   ZConv3dr^   r   r   r   r   Á   s    ôzConv3dNormActivation.__init__)r0   r3   r4   r5   r   rV   ZBatchNorm3drX   r6   r   r   r   r9   r   rZ   r:   r   r;   r   r   r   r   r_   ¯   s0   ôór_   c                       st   e Zd ZdZejjejjfeee	dejj
f e	dejj
f ddœ‡ fdd„Zeedœdd	„Zeedœd
d„Z‡  ZS )ÚSqueezeExcitationaE  
    This block implements the Squeeze-and-Excitation block from https://arxiv.org/abs/1709.01507 (see Fig. 1).
    Parameters ``activation``, and ``scale_activation`` correspond to ``delta`` and ``sigma`` in eq. 3.

    Args:
        input_channels (int): Number of channels in the input image
        squeeze_channels (int): Number of squeeze channels
        activation (Callable[..., torch.nn.Module], optional): ``delta`` activation. Default: ``torch.nn.ReLU``
        scale_activation (Callable[..., torch.nn.Module]): ``sigma`` activation. Default: ``torch.nn.Sigmoid``
    .N)Úinput_channelsÚsqueeze_channelsÚ
activationÚscale_activationr&   c                    sX   t ƒ  ¡  t| ƒ tj d¡| _tj ||d¡| _tj ||d¡| _	|ƒ | _
|ƒ | _d S )Nr'   )r   r   r
   r   rV   ZAdaptiveAvgPool2dÚavgpoolrY   Úfc1Úfc2rc   rd   )r   ra   rb   rc   rd   r   r   r   r   ì   s    
zSqueezeExcitation.__init__)Úinputr&   c                 C   s2   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡S r]   )re   rf   rc   rg   rd   ©r   rh   r,   r   r   r   Ú_scaleû   s
    



zSqueezeExcitation._scalec                 C   s   |   |¡}|| S r]   )rj   ri   r   r   r   r-     s    
zSqueezeExcitation.forward)r0   r3   r4   r5   r   rV   rX   ZSigmoidr6   r   rZ   r   r   rj   r-   r;   r   r   r   r   r`   à   s   ûúr`   c                	       sj   e Zd ZdZdejjdddfeee e	e
dejjf  e	e
dejjf  e	e eedœ‡ fdd„Z‡  ZS )	ÚMLPa  This block implements the multi-layer perceptron (MLP) module.

    Args:
        in_channels (int): Number of channels of the input
        hidden_channels (List[int]): List of the hidden channel dimensions
        norm_layer (Callable[..., torch.nn.Module], optional): Norm layer that will be stacked on top of the linear layer. If ``None`` this layer won't be used. Default: ``None``
        activation_layer (Callable[..., torch.nn.Module], optional): Activation function which will be stacked on top of the normalization layer (if not None), otherwise on top of the linear layer. If ``None`` this layer won't be used. Default: ``torch.nn.ReLU``
        inplace (bool, optional): Parameter for the activation layer, which can optionally do the operation in-place.
            Default is ``None``, which uses the respective default values of the ``activation_layer`` and Dropout layer.
        bias (bool): Whether to use bias in the linear layer. Default ``True``
        dropout (float): The probability for the dropout layer. Default: 0.0
    NTg        .)r>   Úhidden_channelsrD   rE   rG   r   Údropoutc                    sÐ   |d kri nd|i}g }	|}
|d d… D ]\}|	  tjj|
||d�¡ |d k	rZ|	  ||ƒ¡ |	  |f |Ž¡ |	  tjj|f|Ž¡ |}
q(|	  tjj|
|d |d�¡ |	  tjj|f|Ž¡ tƒ j|	Ž  t| ƒ d S )NrG   r(   )r   )rQ   r   rV   ZLinearZDropoutr   r   r
   )r   r>   rl   rD   rE   rG   r   rm   rU   rT   Zin_dimZ
hidden_dimr   r   r   r     s    zMLP.__init__)r0   r3   r4   r5   r   rV   rX   r6   r   r   r   rZ   r:   r7   r   r;   r   r   r   r   rk     s   øørk   c                       s:   e Zd ZdZee dœ‡ fdd„Zeedœdd„Z‡  Z	S )ÚPermutez™This module returns a view of the tensor input with its dimensions permuted.

    Args:
        dims (List[int]): The desired ordering of dimensions
    )Údimsc                    s   t ƒ  ¡  || _d S r]   )r   r   ro   )r   ro   r   r   r   r   ;  s    
zPermute.__init__r$   c                 C   s   t  || j¡S r]   )r   Zpermutero   )r   r%   r   r   r   r-   ?  s    zPermute.forward)
r0   r3   r4   r5   r   r6   r   r   r-   r;   r   r   r   r   rn   4  s   rn   )rR   Útypingr   r   r   r   r   r   r   r   Úutilsr
   r   rV   Z
functionalZinterpolaterZ   r   Z
Sequentialr<   r[   r_   r`   rk   rn   r   r   r   r   Ú<module>   s    
7921'-