
    ёi4                         S SK r S SKrS SKJr  S SKJr  S SKJr  S SKJ	r	  SSK
Jr  S r " S	 S
\5      r " S S\5      r " S S\5      r " S S\5      rg)    N)PyLayer)	ParamAttr)Constant)unique_name   )Layerc                     [         R                  " U 5      nU[         R                  " [         R                  " U 5      S-   5      -  n U $ )Ng      ?)paddlesignfloorabs)xr   s     S/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/nn/quant/lsq.pyroundr      s4    ;;q>Dv||FJJqMC/00AH    c                   8    \ rS rSr\SS j5       r\S 5       rSrg)LsqFunc    c                    U R                  X5        X4XVU4U l        U(       a  UR                  nUR                  UR                  U   S45      nUR	                  S5      n[
        R                  " X!R                  5      n[        [
        R                  " X5      5      R                  XE5      n	X-  n	U	R	                  S5      n	U	R                  U5      n	U	$ [        [
        R                  " X5      5      R                  XE5      n	X-  n	U	$ )N   r   )
save_for_backwardothershapereshape	transposer
   broadcast_tor   divideclip)
ctxweightalphagQnQpper_channel
quant_axissizesquant_ws
             r   forwardLsqFunc.forward!   s    f,2J6	LLE^^V\\*%=r$BCF%%f-F''||<EFMM&89>>rFGoG''/Gooe,G  FMM&89>>rFGoGr   c                 `   U R                  5       u  p#U R                  u  pEpgnU(       a  UR                  n	UR                  UR                  U   S45      nUR	                  S5      n[
        R                  " X2R                  5      n[
        R                  " X#5      n
U
R	                  S5      n
U
R                  U	5      n
O[
        R                  " X#5      n
[
        R                  " X:  S5      n[
        R                  " X:  S5      nSU-
  U-
  nU(       aQ  X-  X-  -   U[        U
5      -  -   X-  -
  U-  U-  nUR                  UR                  U   S45      R                  SS9nOAX-  X-  -   U[        U
5      -  -   X-  -
  U-  U-  R                  5       R                  SS9S   nX-  nX4$ )Nr   r   float32      ?r   axisr   )saved_tensorr   r   r   r   r
   r   r   castr   sum	unsqueeze)r!   grad_weightr"   r#   r$   r%   r&   r'   r(   r)   q_w
lower_flag
upper_flagmiddle_flag
grad_alphas                  r   backwardLsqFunc.backward3   s   ((*-0YY*r
LLE^^V\\*%=r$BCF%%f-F''||<E--.C--'C++e$C--.C[[#(Y7
[[#(Y7
J&3 O o&!E#J./ "'(
    $++!!*-r2cqck  #$/*%c
23 &+,
 ""  "1&  "/&&r    N)Fr   __name__
__module____qualname____firstlineno__staticmethodr+   r<   __static_attributes__r>   r   r   r   r       s(     " .' .'r   r   c                   4    \ rS rSr\S 5       r\S 5       rSrg)LsqPlusActFunce   c                     U R                  XU5        XEU4U l        [        [        R                  " X-
  U5      5      R                  XV5      nXr-  U-   $ )N)r   r   r   r
   r   r    )r!   r   r#   betar$   r%   r&   quant_xs           r   r+   LsqPlusActFunc.forwardf   sL    a-2I	qx%89>>rF%%r   c                    U R                  5       u  p#nU R                  u  pVnX$-
  U-  n[        R                  " X:  S5      n	[        R                  " X:  S5      n
SU	-
  U
-
  nX-  X-  -   U[	        U5      -  -   X-  -
  U-  U-  R                  5       R                  SS9S   nX-   U-  U-  R                  5       R                  SS9S   nX-  nXU4$ )Nr.   r/   r   r0   )r2   r   r
   r3   r   r4   r5   )r!   grad_xr   r#   rJ   r$   r%   r&   q_xr8   r9   r:   r;   	grad_betas                 r   r<   LsqPlusActFunc.backwardm   s   ))+$II	rx5 [[#(Y7
[[#(Y7
J&3 O o&!E#J./ "'(
   SUYAYq" 	 %/!388:DD!DLQO 	 %9,,r   r>   Nr?   r>   r   r   rG   rG   e   s(    & & - -r   rG   c                   >   ^  \ rS rSr      SU 4S jjrS rSrU =r$ )FakeQuantActLSQPlus   c                   > [         TU ]  5          Xl        X l        X0l        X@l        X`l        Xpl        U R                  (       a  SU l        SU R                  -  S-
  U l	        O2SU R                  S-
  -  * U l        SU R                  S-
  -  S-
  U l	        U(       a  U S3OSn[        R                  " U5      U l        [        U R                  [        S5      SS9n	U R                  / U	S	S
9U l        SU R                   l        U R                  (       dn  U(       a  U S3OSn
[        R                  " U
5      U l        [        U R$                  [        S5      SS9nU R                  / US	S
9U l        SU R&                  l        SU l        g )Nr   r   r   .scalequant_dequant.scaler/   Tnameinitializer	trainabler.   r   attrdtypeFz.betazquant_dequant.betag        )super__init__bitsall_positive	symmetric
batch_initrY   reduce_typer%   r&   r   generate_scale_namer   r   create_parametersstop_gradient
_beta_namerJ   
init_state)self
quant_bitsrb   rc   rd   r^   rY   re   scale_prefixs_attrbeta_prefix	beta_attr	__class__s               r   r`   FakeQuantActLSQPlus.__init__   si    			 	("$	&DGlQ&DG dii!m,-DGDIIM*Q.DG*.$v4I&//=!!x}
 &&RfI&N$~~,0TF%.6JK)22;?DO!__(3-4I --y	 . DI ',DII#r   c           	         U R                   S:X  aJ  [        R                  R                  U R                  [        R                  R
                  R                  S9  U R                  (       dZ  U R                   S:X  aJ  [        R                  R                  U R                  [        R                  R
                  R                  S9  U R                  S:X  Ga(  [        R                  " S[        R                  " UR                  5       U R                  -  5      -  5      U l        [        R                   " UR#                  5       5      n[        R$                  " UR#                  5       5      nU R                  R'                  X2-
  U R                  U R(                  -
  -  5        U R                  (       d4  U R                  R'                  X R                  U R(                  -  -
  5        U =R                  S-  sl	        GO0U R                  U R*                  :  Ga   [        R                   " UR#                  5       5      n[        R$                  " UR#                  5       5      nU R                  R'                  U R                  S-  SX2-
  -  U R                  U R(                  -
  -  -   5        U R                  (       dG  U R                  R'                  U R                  S-  SX R                  U R(                  -  -
  -  -   5        U =R                  S-  sl	        OU =R                  S-  sl	        SUl        U R                  (       dM  [.        R1                  XR                  U R                  U R                  U R(                  U R                  5      nU$ [2        R1                  XR                  U R                  U R(                  U R                  SS	9nU$ )
Nmaxopr   r/   r   ?皙?F)r'   )re   r
   distributed
all_reduceri   ReduceOpMAXrc   rJ   rl   	to_tensormathsqrtnumelr&   r$   mindetachrv   	set_valuer%   rd   rj   rG   applyr   )rm   
activationmin_amax_aq_as        r   r+   FakeQuantActLSQPlus.forward   s   u$))6--66:: *  ~~$"2"2e";))		f0099== *  ??a%%dii
 0 0 2TWW <==DF JJz0023EJJz0023EFFem$''0ABC>>		##EFFTWW,<$<=OOq O__t.JJz0023EJJz0023EFFsem4$''8IJJ >>		##FFSL3%&&4772B*B#CC OOq OOOq O#(
 ~~ &&FFDIItvvtwwC 
 --FFDFFDGGTWW%   C 
r   )r%   r&   rk   rg   rb   rd   rJ   ra   r$   rl   rY   re   ri   rc   )FF   r.   NNr@   rA   rB   rC   r`   r+   rE   __classcell__rs   s   @r   rS   rS      s'     :x+ +r   rS   c                   B   ^  \ rS rSr        SU 4S jjrS rSrU =r$ )FakeQuantWeightLSQPlus   c
                 f  > [         TU ]  5          Xl        X l        X0l        X`l        X@l        Xl        U(       a  SOSU l        U(       a  SOSU l	        Xl
        U R                  (       a  SU l        SU R                  -  S-
  U l        O2SU R                  S-
  -  * U l        SU R                  S-
  -  S-
  U l        SU l        U(       a  U S3OSn
[        R                  " U
5      U l        [#        U R                   [%        S5      SS9nU R'                  U/XS	9U l        S
U R(                  l        g )Nr   r   r   rV   rW   r/   TrX   r\   F)r_   r`   ra   rb   r'   quant_linearrd   rY   r(   collect_axisre   r%   r&   rl   r   rf   rg   r   r   rh   ri   rj   )rm   rn   rb   r'   rd   channel_numr   r^   rY   re   ro   rp   rs   s               r   r`   FakeQuantWeightLSQPlus.__init__   s    		 	(&($	+!!-A1&DGlQ&DG dii!m,-DGDIIM*Q.DG*.$v4I&//=!!x}
 &&-f ' 
  %r   c                 z
   U R                   S:X  aJ  [        R                  R                  U R                  [        R                  R
                  R                  S9  U R                  S:X  Ga,  [        R                  " S[        R                  " UR                  5       U R                  -  5      -  5      U l        SU R                  -  S-
  U l        U R                   (       a  UR#                  5       R%                  UR&                  S   S45      n[        R(                  " X R*                  S9n[        R,                  " X R*                  S9n[        R.                  " [        R0                  " [        R2                  " US	U-  -
  5      [        R2                  " US	U-  -   5      /5      SS9nU R                  R5                  XPR                  -  5        O[        R(                  " UR#                  5       5      n[        R,                  " UR#                  5       5      nU R                  R5                  [/        [        R2                  " US	U-  -
  5      [        R2                  " US	U-  -   5      /5      U R                  -  5        U =R                  S-  sl        GOEU R                  U R6                  :  Ga  SU R                  -  S-
  U l        U R                   (       a  UR#                  5       R%                  UR&                  S   S45      n[        R(                  " X R*                  S9n[        R,                  " X R*                  S9n[        R.                  " [        R0                  " [        R2                  " US	U-  -
  5      [        R2                  " US	U-  -   5      /5      SS9nU R                  R5                  US
-  SU-  U R                  -  -   5        O[        R(                  " UR#                  5       5      n[        R,                  " UR#                  5       5      nU R                  R5                  U R                  S
-  S[/        [        R2                  " US	U-  -
  5      [        R2                  " US	U-  -   5      /5      -  U R                  -  -   5        U =R                  S-  sl        O/U R                  U R6                  :X  a  U =R                  S-  sl        SUl        [:        R=                  UU R                  U R                  U R>                  U R                  U R                   U R@                  5      nU$ )Nrv   rw   r   r/   r   r   r   r0      ry   rz   F)!re   r
   r{   r|   ri   r}   r~   rl   r   r   r   r   r&   r$   ra   divr'   r   r   r   meanr   stdrv   stackr   r   rd   rj   r   r   r%   r(   )rm   r"   
weight_tmpr   r   ri   w_qs          r   r+   FakeQuantWeightLSQPlus.forward.  s   u$))6--66:: *  ??a%%cDIIfllntww6N,O&OPDF$))|a'DH#]]_44fll1or5JK
{{:4E4EFjj2C2CDJJLLD1s7N3VZZq3w5OP 	   XX.{{6==?3jj1  D1s7N3VZZq3w5OP hh OOq O__t.$))|a'DH#]]_44fll1or5JK
{{:4E4EFjj2C2CDJJLLD1s7N3VZZq3w5OP 	   S37TXX+=!=>{{6==?3jj1  FFSLD1s7N3VZZq3w5OP hh	 OOq O__/OOq O$mmFFFFGGGGOO
 
r   )r%   r&   rg   rb   rd   ra   r   r   r$   rl   rY   r'   r(   r   re   ri   )FFr   NFr.   NNr   r   s   @r   r   r      s/     6%pD Dr   r   )r   r
   paddle.autogradr   paddle.frameworkr   paddle.nn.initializerr   paddle.utilsr   layer.layersr   r   r   rG   rS   r   r>   r   r   <module>r      sZ      # & * $  B'g B'J"-W "-Jh% hV}U }r   