
    Vh                         d dl Z d dlmc mc mZ ddgZ G d de j                  j                  j                  j                        Z	 G d de	      Z
 G d de	      Zy)    NBatchNorm2dBatchNorm3dc                   H     e Zd Z	 d	 d fdZedd       Zed        Z xZS )
_BatchNormc                     ||d}t        |   |||ddfi | | j                  dt        j                  di |       | j                  dt        j                  di |       y )NdevicedtypeTscale
zero_point)g      ?)r   )super__init__register_buffertorchtensorselfnum_featuresepsmomentumr	   r
   factory_kwargs	__class__s          W/home/dcms/DCMS/lib/python3.12/site-packages/torch/ao/nn/quantized/modules/batchnorm.pyr   z_BatchNorm.__init__
   sa     %+U;sHdDSNSWell&I.&IJ\5<<+L^+LM    c                 \   |j                   }t        |      | j                  k(  r|d   }|j                         \  }} | |j                  |j
                        }|j                  |_        |j                  |_        |j                  |_        |j                  |_	        ||_
        ||_        |S )Nr   )activation_post_processtype_NNI_BN_RELU_MODULEcalculate_qparamsr   r   weightbiasrunning_meanrunning_varr   r   )clsmoduse_precomputed_fake_quantr   r   r   new_mods          r   
from_floatz_BatchNorm.from_float   s    "%"="=9///a&C3EEGzc&&0xx"//!oo'r   c                 P    | |j                   |j                  |j                  |j                  j                  |j                  j
                        }|j                  |_        |j                  |_        |j                  |_        |j                  |_        ||_	        ||_
        |S Nr   )r   r   r   r    r	   r
   r!   r"   r#   r   r   )r$   bnoutput_scaleoutput_zero_pointqbns        r   from_referencez_BatchNorm.from_reference!   s{    OOFFKK99##))//
 YY
77??.. 	*
r   gh㈵>g?NNreturnNF)	__name__
__module____qualname__r   staticmethodr(   classmethodr/   __classcell__r   s   @r   r   r   	   s=    GKN	N    r   r   c                        e Zd ZdZej
                  Z	 d		 d
 fdZd Zd Z	de
j                  de
j                  fdZedd       Z xZS )r   z@This is the quantized version of :class:`~torch.nn.BatchNorm2d`.r2   c                 4    ||d}t        |   |||fi | y r*   r   r   r   s          r   r   zBatchNorm2d.__init__8   s%     %+U;sHGGr   c                      y)NQuantizedBatchNorm2d r   s    r   	_get_namezBatchNorm2d._get_name>       %r   c                 J    t        |j                        dk7  rt        d      y )N   #Input shape must be `(N, C, H, W)`!lenshape
ValueErrorr   inputs     r   _check_input_dimzBatchNorm2d._check_input_dimA   &     u{{q BCC !r   rL   c           
          t         j                  j                  j                  || j                  | j
                  | j                  | j                  | j                  | j                  | j                        S N)r   ops	quantizedbatch_norm2dr    r!   r"   r#   r   r   r   rK   s     r   forwardzBatchNorm2d.forwardG   Y     yy""//KKIIHHJJOO	
 		
r   c                 2    t         j                  | ||      S N)r&   r   r(   r$   r%   r&   s      r   r(   zBatchNorm2d.from_floatU   "    $$1K % 
 	
r   r0   r1   r3   )r4   r5   r6   __doc__nniBNReLU2dr   r   rB   rM   r   TensorrT   r8   r(   r9   r:   s   @r   r   r   3   s`    K,, HLH	H&D
U\\ 
ell 
 
 
r   c                        e Zd ZdZej
                  Zd	 fd	Zd Zd Z	de
j                  de
j                  fdZed
d       Z xZS )r   z@This is the quantized version of :class:`~torch.nn.BatchNorm3d`.c                 4    ||d}t        |   |||fi | y r*   r=   r   s          r   r   zBatchNorm3d.__init__a   s#    $*U;sHGGr   c                      y)NQuantizedBatchNorm3dr@   rA   s    r   rB   zBatchNorm3d._get_namee   rC   r   c                 J    t        |j                        dk7  rt        d      y )N   rF   rG   rK   s     r   rM   zBatchNorm3d._check_input_dimh   rN   r   rL   r2   c           
          t         j                  j                  j                  || j                  | j
                  | j                  | j                  | j                  | j                  | j                        S rP   )r   rQ   rR   batch_norm3dr    r!   r"   r#   r   r   r   rK   s     r   rT   zBatchNorm3d.forwardn   rU   r   c                 2    t         j                  | ||      S rW   rX   rY   s      r   r(   zBatchNorm3d.from_float|   rZ   r   r0   r3   )r4   r5   r6   r[   r\   BNReLU3dr   r   rB   rM   r   r^   rT   r8   r(   r9   r:   s   @r   r   r   \   sP    K,,H&D
U\\ 
ell 
 
 
r   )r   torch.ao.nn.intrinsicaonn	intrinsicr\   __all__modules	batchnormr   r   r   r@   r   r   <module>rp      sV     # # -
('!!++66 'T&
* &
R$
* $
r   