
    {-j4                         d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 ddl
mZ d Z G d	 d
e          Z G d de          Z G d de          Z G d de          ZdS )    N)PyLayer)	ParamAttr)Constant)unique_name   )Layerc                     t          j        |           }|t          j        t          j        |           dz             z  } | S )Ng      ?)paddlesignfloorabs)xr   s     S/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/paddle/nn/quant/lsq.pyroundr      s5    ;q>>Dv|FJqMMC/000AH    c                   <    e Zd Zedd            Zed             ZdS )LsqFuncFr   c                 @   |                      ||           |||||f| _        |r|j        }|                    |j        |         df          }|                    d          }t          j        ||j                  }t          t          j        ||                    	                    ||          }	|	|z  }	|	                    d          }	|	                    |          }	n;t          t          j        ||                    	                    ||          }	|	|z  }	|	S )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   forwardzLsqFunc.forward!   s   fe,,,r2{J6	 	&LE^^V\*%=r$BCCF%%f--F'v|<<EFM&%8899>>r2FFGoG''//Gooe,,GGFM&%8899>>r2FFGoGr   c                    |                                  \  }}| j        \  }}}}}|r|j        }	|                    |j        |         df          }|                    d          }t          j        ||j                  }t          j        ||          }
|
                    d          }
|
                    |	          }
nt          j        ||          }
t          j        |
|k     d          }t          j        |
|k    d          }d|z
  |z
  }|ra||z  ||z  z   |t          |
          z  z   ||
z  z
  |z  |z  }|                    |j        |         df          
                    d          }nV||z  ||z  z   |t          |
          z  z   ||
z  z
  |z  |z  
                                                    d          d         }||z  }||fS )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   backwardzLsqFunc.backward3   s   ((**-0Y*2r;
 		/LE^^V\*%=r$BCCF%%f--F'v|<<E-..C--''C++e$$CC-..C[#(Y77
[#(Y77
J&3 	 O 2o&!E#JJ./ "C'(
    $++!*-r2 cqckk J #R$r/*%c

23 &+,
 ""  ""1&  "K/J&&r   N)Fr   __name__
__module____qualname__staticmethodr*   r:    r   r   r   r       sM           \" .' .' \.' .' .'r   r   c                   :    e Zd Zed             Zed             ZdS )LsqPlusActFuncc                     |                      |||           |||f| _        t          t          j        ||z
  |                                        ||          }||z  |z   S )N)r   r   r   r
   r   r   )r    r   r"   betar#   r$   r%   quant_xs           r   r*   zLsqPlusActFunc.forwardf   sc    a---r2I	q4x%8899>>r2FF%%r   c                    |                                  \  }}}| j        \  }}}||z
  |z  }t          j        ||k     d          }	t          j        ||k    d          }
d|	z
  |
z
  }|	|z  |
|z  z   |t	          |          z  z   ||z  z
  |z  |z                                                      d          d         }|	|
z   |z  |z                                                      d          d         }||z  }|||fS )Nr,   r-   r   r.   )r0   r   r
   r1   r   r2   r3   )r    grad_xr   r"   rD   r#   r$   r%   q_xr6   r7   r8   r9   	grad_betas                 r   r:   zLsqPlusActFunc.backwardm   s2   ))++5$I	2r4x5 [#(Y77
[#(Y77
J&3 O 2o&!E#JJ./ "C'(
   SUUYAYq" 	 :%/!388::DD!DLLQO 	 v%z9,,r   Nr;   r@   r   r   rB   rB   e   sH        & & \& - - \- - -r   rB   c                   2     e Zd Z	 	 	 	 	 	 d fd	Zd Z xZS )FakeQuantActLSQPlusF   r,   Nc                    t                                                       	 || _        || _        || _        || _        || _        || _        | j        rd| _        d| j        z  dz
  | _	        n(d| j        dz
  z   | _        d| j        dz
  z  dz
  | _	        |r| dnd}t          j        |          | _        t          | j        t          d          d          }	|                     g |	d	
          | _        d| j        _        | j        so|r| dnd}
t          j        |
          | _        t          | j        t          d          d          }|                     g |d	
          | _        d| j        _        d| _        d S )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_initrQ   reduce_typer$   r%   r   generate_scale_namer   r   create_parametersstop_gradient
_beta_namerD   
init_state)self
quant_bitsrZ   r[   r\   rV   rQ   r]   scale_prefixs_attrbeta_prefix	beta_attr	__class__s               r   rX   zFakeQuantActLSQPlus.__init__   s    			 	("$	& 	/DGlQ&DGG di!m,-DGDIM*Q.DG*.I$4I&/==!x}}
 
 
 &&RfI&NN$~ 
	,,0JT....6JK)2;??DO!_(3--4  I --y	 .  DI ',DI#r   c                 *   | j         dk    r:t          j                            | j        t          j        j        j                   | j        sE| j         dk    r:t          j                            | j        t          j        j        j                   | j	        dk    rt          j
        dt          j        |                                | j        z            z            | _        t          j        |                                          }t          j        |                                          }| j                            ||z
  | j        | j        z
  z             | j        s*| j                            || j        | j        z  z
             | xj	        dz  c_	        n| j	        | j        k     rt          j        |                                          }t          j        |                                          }| j                            | j        dz  d||z
  z  | j        | j        z
  z  z              | j        s8| j                            | j        dz  d|| j        | j        z  z
  z  z              | xj	        dz  c_	        n| xj	        dz  c_	        d|_        | j        s9t.                              || j        | j        | j        | j        | j                  }n4t2                              || j        | j        | j        | j        d	          }|S )
Nmaxopr   r-   r   ?皙?F)r&   )r]   r
   distributed
all_reducera   ReduceOpMAXr[   rD   rd   	to_tensormathsqrtnumelr%   r#   mindetachrm   	set_valuer$   r\   rb   rB   applyr   )re   
activationmin_amax_aq_as        r   r*   zFakeQuantActLSQPlus.forward   s   u$$))6-6: *    ~ 	$"2e";";))	f09= *    ?a%di
 0 0 2 2TW <=== DF Jz002233EJz002233EFeem$'0ABCCC> >	##EDFTW,<$<===OOq OOO_t..Jz002233EJz002233EFseem4$'8IJJ   > 	##FSL3%$&472B*B#CC   OOq OOOOOq OO#(
 ~ 	 &&DFDItvtw CC --DFDFDGTW%    C 
r   )FFrL   r,   NNr<   r=   r>   rX   r*   __classcell__rk   s   @r   rK   rK      sa         : : : : : :x+ + + + + + +r   rK   c                   6     e Zd Z	 	 	 	 	 	 	 	 d fd	Zd Z xZS )FakeQuantWeightLSQPlusFrL   Nr,   c
                 X   t                                                       	 || _        || _        || _        || _        || _        || _        |rdnd| _        |rdnd| _	        |	| _
        | j        rd| _        d| j        z  dz
  | _        n(d| j        dz
  z   | _        d| j        dz
  z  dz
  | _        d| _        |r| dnd}
t          j        |
          | _        t#          | j        t%          d          d          }|                     |g||	          | _        d
| j        _        d S )Nr   r   r   rN   rO   r-   TrP   rT   F)rW   rX   rY   rZ   r&   quant_linearr\   rQ   r'   collect_axisr]   r$   r%   rd   r   r^   r_   r   r   r`   ra   rb   )re   rf   rZ   r&   r\   channel_numr   rV   rQ   r]   rg   rh   rk   s               r   rX   zFakeQuantWeightLSQPlus.__init__   sX    		 	(&($	+2!!!-4AA1& 	/DGlQ&DGG di!m,-DGDIM*Q.DG*.I$4I&/==!x}}
 
 
 &&-fE ' 
 
  %r   c                 L	   | j         dk    r:t          j                            | j        t          j        j        j                   | j        dk    rt          j        dt          j
        |                                | j        z            z            | _        d| j        z  dz
  | _        | j        r|                                                    |j        d         df          }t          j        || j                  }t          j        || j                  }t          j        t          j        t          j        |d	|z  z
            t          j        |d	|z  z             g          d          }| j                            || j        z             nt          j        |                                          }t          j        |                                          }| j                            t/          t          j        |d	|z  z
            t          j        |d	|z  z             g          | j        z             | xj        dz  c_        n| j        | j        k     rd| j        z  dz
  | _        | j        r|                                                    |j        d         df          }t          j        || j                  }t          j        || j                  }t          j        t          j        t          j        |d	|z  z
            t          j        |d	|z  z             g          d          }| j                            |d
z  d|z  | j        z  z              nt          j        |                                          }t          j        |                                          }| j                            | j        d
z  dt/          t          j        |d	|z  z
            t          j        |d	|z  z             g          z  | j        z  z              | xj        dz  c_        n | j        | j        k    r| xj        dz  c_        d|_        t:                              || j        | j        | j        | j        | j        | j                   }|S )Nrm   rn   r   r-   r   r   r   r.      rp   rq   F)!r]   r
   rr   rs   ra   rt   ru   rd   rv   rw   rx   ry   r%   r#   rY   divr&   r{   r   r   meanr   stdrm   stackr   r|   r\   rb   r   r}   r$   r'   )re   r!   
weight_tmpr   r   ra   w_qs          r   r*   zFakeQuantWeightLSQPlus.forward.  s'   u$$))6-6: *    ?a%cDIfllnntw6N,O,O&OPPDF$)|a'DH #]]__44fl1or5JKK
{:D4EFFFj$2CDDDJLD1s7N33VZq3w5O5OP  	     TX....{6==??33j11  D1s7N33VZq3w5O5OP  h   OOq OOO_t..$)|a'DH #]]__44fl1or5JKK
{:D4EFFFj$2CDDDJLD1s7N33VZq3w5O5OP  	     S37TX+=!=>>>>{6==??33j11  FSLD1s7N33VZq3w5O5OP  h	   OOq OOO_//OOq OO$mmFFGGO
 
 
r   )FFrL   NFr,   NNr   r   s   @r   r   r      sn         6% 6% 6% 6% 6% 6%pD D D D D D Dr   r   )rw   r
   paddle.autogradr   paddle.frameworkr   paddle.nn.initializerr   paddle.utilsr   layer.layersr   r   r   rB   rK   r   r@   r   r   <module>r      sQ     # # # # # # & & & & & & * * * * * * $ $ $ $ $ $              B' B' B' B' B'g B' B' B'J"- "- "- "- "-W "- "- "-Jh h h h h% h h hV} } } } }U } } } } }r   