
    Ph%                        d dl Z d dlmZ d dlmZmZmZ d dlmZ d dl	m
Z
mZmZ d dlmZmZmZ g dZ edej$                  j&                  j(                        Z G d	 d
ej$                  j&                  j(                        Z G d deej,                        Z G d deej.                        Z G d deej0                        Zy)    N)_single_pair_triple)_FusedModule)TupleTypeVarUnion)	_size_1_t	_size_2_t	_size_3_t)Conv1dConv2dConv3dMOD)boundc                       e Zd ZeZ	 	 	 ddededeedf   deedf   deedf   deedf   d	ed
eedf   dedededdfdZ	d Z
ed        Zd Zy)_ConvNdNin_channelsout_channelskernel_size.stridepaddingdilation
transposedoutput_paddinggroupsbiaspadding_modereturnc                     ||d}t        j                  j                  j                  j                  | |||||||||	|
|fi | |sJ d       || _        |j                  |      | _        y )N)devicedtypez'qconfig must be provided for QAT module)factory_kwargs)nnmodulesconvr   __init__qconfigweightweight_fake_quant)selfr   r   r   r   r   r   r   r   r   r   r   r(   r!   r"   r#   s                   gC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/ao/nn/qat/modules/conv.pyr'   z_ConvNd.__init__   sx     %+U;


(({L+)/(J)7|	gWe	g AAAw!(~!N    c                 n    | j                  || j                  | j                        | j                        S N_conv_forwardr*   r)   r   r+   inputs     r,   forwardz_ConvNd.forward+   *    !!%)?)?)LdiiXXr-   c                 R   t        |      | j                  k(  s.J d| j                  z   dz   | j                  j                  z          t        |d      sJ d       |j                  sJ d       t        t        |      t              r|d   }|j                  } | |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  du|j                  |
      }|j                   |_        |j                  |_        |S )	zCreate a qat module from a float module

            Args:
               `mod`: a float module, either produced by torch.ao.quantization utilities
               or directly from user
        zqat.z.from_float only works for r(   z,Input float module must have qconfig definedz,Input float module must have a valid qconfigr   N)r   r   r   r   r   r   r(   )type_FLOAT_MODULE__name__hasattrr(   
issubclassr   r   r   r   r   r   r   r   r   r   r)   )clsmodr(   qat_convs       r,   
from_floatz_ConvNd.from_float.   s    CyC--- 	
ll+, (()	
- sI&V(VV&{{JJJ{d3i.a&C++s(8(8#//!jj#++!jjsxxt/C$'$4$4gG **r-   c                    t        |       }|j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  du| j                  	      }t        j                  j                  | j                  j                               |_        | j                  <t        j                  j                  | j                  j                               |_	        t!        |t"              r^|g}t%        |d      sJ |j'                         }|j)                  |        |j*                  | }|j-                  | j.                         |S |S )z This works for both single qat conv, and the qat conv - relu modules
        to convert the qat module to a floating point module
        N_FLOAT_RELU_MODULE)r7   _FLOAT_CONV_MODULEr   r   r   r   r   r   r   r   r   torchr$   	Parameterr)   detachr;   r   r:   rA   appendr8   traintraining)r+   r<   r&   r%   relufuseds         r,   to_floatz_ConvNd.to_floatI   s#    4j%%KKLLMMKKIIT!	 hh((););)=>99 **499+;+;+=>DIc<(fG3 4555))+DNN4 %C%%w/EKK&LKr-   )NNN)r9   
__module____qualname__r   r8   intr   boolstrr'   r4   staticmethodr?   rK    r-   r,   r   r      s    M O!O"O $CHoO sCx	O
  S/O !c?O "O "'sCxO O O  #O !%O.Y  4r-   r   c                        e Zd ZdZej
                  Zej
                  Z	 	 	 	 	 	 	 	 	 ddedede	de	de
ee	f   de	d	ed
ededdf fdZe fd       Z xZS )r   aZ  
    A Conv1d module attached with FakeQuantize modules for weight,
    used for quantization aware training.

    We adopt the same interface as :class:`~torch.nn.Conv1d`

    Similar to :class:`~torch.nn.Conv2d`, with FakeQuantize modules initialized to
    default.

    Attributes:
        weight_fake_quant: fake quant module for weight
    Nr   r   r   r   r   r   r   r   r   r   c                     t        |      }t        |      }t        |t              r|n
t        |      }t        |      }t        |   ||||||dt        d      |||	|
||       y NFr   )r   r   r   r   r   r   r   r   r(   r!   r"   )r   
isinstancerP   superr'   r+   r   r   r   r   r   r   r   r   r   r(   r!   r"   kernel_size_stride_padding_	dilation_	__class__s                    r,   r'   zConv1d.__init__w   w     {+&/(#67GG<LH%	"1:% 	 	r-   c                 $    t         |   | |      S r/   rW   r?   r<   r=   r]   s     r,   r?   zConv1d.from_float       w!#s++r-   	   r   rd   rd   TzerosNNN)r9   rL   rM   __doc__r$   r   r8   rB   rN   r
   r	   rP   rO   r'   classmethodr?   __classcell__r]   s   @r,   r   r   g   s     IIM &'23'( "%,!" ( #	
  Y/ %    # !%B , ,r-   r   c                        e Zd ZdZej
                  Zej
                  Z	 	 	 	 	 	 	 	 	 ddedede	de	de
ee	f   de	d	ed
ededdf fdZd Ze fd       Z xZS )r   a  
    A Conv2d module attached with FakeQuantize modules for weight,
    used for quantization aware training.

    We adopt the same interface as `torch.nn.Conv2d`, please see
    https://pytorch.org/docs/stable/nn.html?highlight=conv2d#torch.nn.Conv2d
    for documentation.

    Similar to `torch.nn.Conv2d`, with FakeQuantize modules initialized to
    default.

    Attributes:
        weight_fake_quant: fake quant module for weight
    Nr   r   r   r   r   r   r   r   r   r   c                     t        |      }t        |      }t        |t              r|n
t        |      }t        |      }t        |   ||||||dt        d      |||	|
||       y rU   )r   rV   rP   rW   r'   rX   s                    r,   r'   zConv2d.__init__   su     [)-(#67E'N(O	 8% 	 	r-   c                 n    | j                  || j                  | j                        | j                        S r/   r0   r2   s     r,   r4   zConv2d.forward   r5   r-   c                 $    t         |   | |      S r/   r`   ra   s     r,   r?   zConv2d.from_float   rb   r-   rc   )r9   rL   rM   rf   r$   r   r8   rB   rN   r   r	   rP   rO   r'   r4   rg   r?   rh   ri   s   @r,   r   r           IIM &'23'( "%,!" ( #	
  Y/ %    # !%BY , ,r-   r   c                        e Zd ZdZej
                  Zej
                  Z	 	 	 	 	 	 	 	 	 ddedede	de	de
ee	f   de	d	ed
ededdf fdZd Ze fd       Z xZS )r   a  
    A Conv3d module attached with FakeQuantize modules for weight,
    used for quantization aware training.

    We adopt the same interface as `torch.nn.Conv3d`, please see
    https://pytorch.org/docs/stable/nn.html?highlight=conv3d#torch.nn.Conv3d
    for documentation.

    Similar to `torch.nn.Conv3d`, with FakeQuantize modules initialized to
    default.

    Attributes:
        weight_fake_quant: fake quant module for weight
    Nr   r   r   r   r   r   r   r   r   r   c                     t        |      }t        |      }t        |t              r|n
t        |      }t        |      }t        |   ||||||dt        d      |||	|
||       y rU   )r   rV   rP   rW   r'   rX   s                    r,   r'   zConv3d.__init__   r^   r-   c                 n    | j                  || j                  | j                        | j                        S r/   r0   r2   s     r,   r4   zConv3d.forward	  r5   r-   c                 $    t         |   | |      S r/   r`   ra   s     r,   r?   zConv3d.from_float  rb   r-   rc   )r9   rL   rM   rf   r$   r   r8   rB   rN   r   r	   rP   rO   r'   r4   rg   r?   rh   ri   s   @r,   r   r      rn   r-   r   )rC   torch.nnr$   torch.nn.modules.utilsr   r   r   torch.ao.nn.intrinsicr   typingr   r   r	   torch.nn.common_typesr
   r   r   __all__r%   r&   r   r   r   r   r   rR   r-   r,   <module>ry      s      : : . ( ( A A e2::??223Ubjjoo%% Un3,Wbii 3,j8,Wbii 8,t8,Wbii 8,r-   