
    ёih                         S SK r S SKrS SKJr  SSKJr   " S S\R
                  5      rS rSS jrS	 r	S
 r
S rS rS rS rS rS r\R"                  \R$                  4\\R&                  \R(                  4\0rg)    N)nn   )utilsc                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )Identity   z$a layer to replace bn or relu layersc                 "   > [         TU ]  5         g N)super__init__)selfargskwargs	__class__s      i/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/quantization/imperative/fuse_utils.pyr   Identity.__init__   s        c                     U$ r
    )r   inputs     r   forwardIdentity.forward   s    r   r   )	__name__
__module____qualname____firstlineno____doc__r   r   __static_attributes____classcell__)r   s   @r   r   r      s    . r   r   c                    SnU R                   (       a  U R                  5         Sn/ nS S /nU R                  5        H  u  pE[        U[        R
                  5      (       a  XCS'   [        U[        R                  5      (       a  XCS'   US   (       d  MW  US   (       d  Mc  [        U5      S:X  d  Mt  UR                  U5        S S /nM     [        X5      n U(       a  U R                  5         g g )NFTr   r      )trainingevalnamed_sublayers
isinstancer   Conv2DBatchNorm2Dlenappendfuse_layerstrain)modelis_train	fuse_listtmp_pairnamelayers         r   fuse_conv_bnr2   !   s    H~~

Id|H,,.eRYY''QKeR^^,,QKA;;8A;;3x=A+=X&d|H / )E r   c                 d    USL a  [         R                  " U 5      n U H  n[        X5        M     U $ )a  
fuse layers in layers_to_fuse

Args:
    model(paddle.nn.Layer): The model to be fused.
    layers_to_fuse(list): The layers' names to be fused. For
        example,"fuse_list = [["conv1", "bn1"], ["conv2", "bn2"]]".
        A TypeError would be raised if "fuse" was set as
        True but "fuse_list" was None.
                          Default: None.
    inplace(bool): Whether apply fusing to the input model.
                   Default: False.

Return
    fused_model(paddle.nn.Layer): The fused model.
F)copydeepcopy_fuse_layers)r,   layers_to_fuseinplacelayerss       r   r*   r*   6   s1    " %e$ U# !Lr   c                    / nU H5  n[         R                  " X5      u  pEUR                  [        XE5      5        M7     [	        U5      n[        U5       H+  u  px[         R                  " X5      u  pE[        XEXg   5        M-     g)z"fuse all the layers in layers_listN)r   find_parent_layer_and_sub_namer)   getattr
_fuse_func	enumeratesetattr)	r,   layers_list
layer_list
layer_nameparent_layersub_name
new_layersiitems	            r   r6   r6   N   s}    J!
!&!E!E"
 	',9:	 "
 J'J[)!&!E!E"
 	
6	 *r   c                    [        S U  5       5      n[        R                  US5      nS/[        U 5      -  nU" U 6 nU S   R                  R                  5        H&  u  pVUR                  U5        U S   R                  U	 M(     U S   R                  R                  5        H&  u  pWUR                  U5        U S   R                  U	 M(     XCS'   [        S[        U 5      5       H%  n[        5       n	U S   R                  U	l        XU'   M'     U$ )z&choose the fuse method and fuse layersc              3   8   #    U  H  n[        U5      v   M     g 7fr
   )type).0ms     r   	<genexpr>_fuse_func.<locals>.<genexpr>`   s     .:a$q'':s   Nr   r   )tupletypes_to_fusion_methodgetr(   _forward_pre_hooksitemsregister_forward_pre_hook_forward_post_hooksregister_forward_post_hookranger   r"   )
rA   typesfusion_methodrE   fused_layer	handle_idpre_hook_fnhook_fnrF   identitys
             r   r=   r=   ^   s   .:..E*..ud;M#j/)J,K",Q-"B"B"H"H"J	--k:qM,,Y7 #K )n@@FFH	..w7rN..y9 I  qM1c*o&:&qM22 1 ' r   c                     U R                   UR                   :X  d   S5       eU R                   (       a'  UR                  U R                  :X  d   S5       e[        e[	        X5      $ )z"fuse conv and bn for train or evalz:Conv and BN both must be in the same mode (train or eval).z?Output channel of Conv2d must match num_features of BatchNorm2d)r"   _num_features_out_channelsNotImplementedError_fuse_conv_bn_eval)convbns     r   _fuse_conv_bnrg   r   sb    ==BKK' D' }}4#5#55 	
M	
5 "!!$++r   c           	      0   U R                   (       d  UR                   (       a   S5       e[        R                  " U 5      n[        UR                  UR
                  UR                  UR                  UR                  UR                  UR
                  5      u  p4UR                  R                  U5        UR
                  c:  [        R                  " UR                  /SUR
                  R                  S9Ul        UR
                  R                  U5        U$ )zfuse conv and bn for evalFusion only for eval!Tshapeis_biasdtype)r"   r4   r5   _fuse_conv_bn_weightsweightbias_mean	_variance_epsilon	set_valuepaddlecreate_parameterrb   rm   )re   rf   
fused_convfused_weight
fused_biass        r   rd   rd      s    F/FF-t$J4



		
 L - 11++,d"''--

 OOj)r   c                 P   Uc  [         R                  " U5      nUc  [         R                  " U5      nUc  [         R                  " U5      n[         R                  " X4-   5      nXU-  R	                  S/S/[        U R                  5      S-
  -  -   5      -  n X-
  U-  U-  U-   nX4$ )z$fuse weights and bias of conv and bnrO   r   )ru   
zeros_like	ones_likersqrtreshaper(   rk   )conv_wconv_bbn_rmbn_rvbn_epsbn_wbn_bbn_var_rsqrts           r   rn   rn      s    ~""5)|&|  '<</Ll*33	sc&,,'!+,, F n,t3d:F>r   c                     U R                   UR                   :X  d   S5       eU R                   (       a4  UR                  U R                  R                  S   :X  d   S5       e[        e[        X5      $ )zfuse linear and bnz<Linear and BN both must be in the same mode (train or eval).r   z=Output channel of Linear must match num_features of BatchNorm)r"   ra   ro   rk   rc   _fuse_linear_bn_eval)linearrf   s     r   _fuse_linear_bnr      sk    ??bkk) F) 6==#6#6q#99 	
K	
9 "!#F//r   c           	      J   U R                   (       d  UR                   (       a   S5       e[        R                  " U 5      n[        UR                  UR
                  UR                  UR                  UR                  UR                  UR
                  5      u  p4UR                  R                  U5        UR
                  cG  [        R                  " UR                  R                  S   /SUR
                  R                  S9Ul        UR
                  R                  U5        U$ )zfuse linear and bn for evalri   r   Trj   )r"   r4   r5   _fuse_linear_bn_weightsro   rp   rq   rr   rs   rt   ru   rv   rk   rm   )r   rf   fused_linearrx   ry   s        r   r   r      s    2;;H1HH/==(L6



		
 L !!,/ "33&&,,Q/0''--

 
+r   c                     Uc  [         R                  " U5      nU[         R                  " X4-   5      -  nXR                  S5      -  nX-
  U-  U-   n	X4$ )z&fuse weights and bias of linear and bnrO   )ru   r{   r}   	unsqueeze)
linear_wlinear_br   r   r   r   r   bn_scalefused_wfused_bs
             r   r   r      s]     $$U+fll5>22H++B//G8+d2Gr   )F)r4   ru   r    r   Layerr   r2   r*   r6   r=   rg   rd   rn   r   r   r   r&   r'   LinearBatchNorm1DrQ   r   r   r   <module>r      s       rxx *07 (,. 02	 YYYY r   