
    ёi0                         S SK r S SKrS SKrS SKrS SKrS SKJr  SSKJr  SSK	J
r
JrJrJrJrJrJrJr  \" \\ R&                  SS9rS	rS
rS rS r " S S5      r " S S5      r    SS jrg)    N)static   )
get_logger   )_channelwise_quant_axis1_opsbias_correction_wcalculate_quant_cos_errordequant_tensorload_variable_dataquant_tensorset_variable_datastable_sigmoidz&%(asctime)s-%(levelname)s: %(message)s)fmtgg?c                     [         R                  " [         R                  R                  R	                  U 5      [
        [        -
  -  [        -   SSS9$ )Nr   r   )minmax)paddleclipnn
functionalsigmoidZETAGAMMAalpha_vs    c/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/static/quantization/adaround.pycompute_soft_roundingr   ,   s?    ;;		$$W->F     c                 j    [         R                  " [        U 5      [        [        -
  -  [        -   SSS9$ )Nr   r   )a_mina_max)npr   r   r   r   r   s    r   compute_soft_rounding_npr#   4   s-    77w4%<058 r   c                   0    \ rS rSrSS jrS rS rS rSrg)	AdaRoundLoss:   c                     Xl         X l        g N)default_reg_paramdefault_beta_range)self	reg_paramr*   s      r   __init__AdaRoundLoss.__init__;   s    !*"4r   c                     [         R                  R                  R                  X5      n[         R                  " [         R
                  " USS95      nU$ )N)axis)r   r   r   square_error_costmeansum)r+   ada_quantized_outputorig_outputsquare_cost
recon_losss        r   compute_recon_lossAdaRoundLoss.compute_recon_loss?   s@    ii**<< 
 [[Kb!AB
r   c                 `   ^ ^^ UUU 4S jn[         R                  R                  US U5      nU$ )Nc                     > [        T5      n [        R                  " [        R                  " [        R                  " SU -  S-
  5      T5      * S-   5      nTR
                  U-  nU$ )Nr   r   )r   r   r4   powabsr)   )h_vreg_term
round_lossr   betar+   s      r   round_loss_fn6AdaRoundLoss.compute_round_loss.<locals>.round_loss_fnG   s\    '0C zzFJJq3w{3T::Q>H
 //(:Jr   c                  0    [         R                  " S/SSS9$ )Nr   float32        )shapedtype
fill_value)r   full r   r   <lambda>1AdaRoundLoss.compute_round_loss.<locals>.<lambda>X   s    FKKqcsKr   )r   r   cond)r+   r   
warm_startrB   rC   rA   s   `` `  r   compute_round_lossAdaRoundLoss.compute_round_lossF   s-    	 YY^^K

 r   c                     U R                   u  pEX1-  nX&-
  X-
  -  nUSXE-
  -  S[        R                  " U[        R                  -  5      -   -  -   nU$ )Ng      ?r   )r*   r"   cospi)	r+   max_itercur_iterrP   
start_betaend_betawarm_start_end_iterrel_iterrB   s	            r   compute_betaAdaRoundLoss.compute_beta^   sl    #66
 )3 2*
 #!67x"%%'((
 
 r   )r*   r)   N)g{Gz?)   r   )	__name__
__module____qualname____firstlineno__r-   r9   rQ   r\   __static_attributes__rL   r   r   r%   r%   :   s    50r   r%   c                   R    \ rS rSr     SS jrS rS rS rS rS r	S	 r
S
 rSrg)AdaRoundp   Nc                    X`l         Xpl        SU l        SU l        SU l        [        5       U l        X l        Xl        X0l	        SU l
        U[        ;   a  SU l
        X@l        US-   U l        U R                  UR                  5       X5        g )Ng?   rG   r   r   .alpha)is_trainnum_iterationsrP   weight_bitsoffsetr%   adaround_lossori_weight_tensorscalescope
quant_axisr   weight_var_name
alpha_nameinitialize_alphacopy)r+   rp   weight_tensorrq   rs   weight_op_typerj   rk   s           r   r-   AdaRound.__init__q   s     !,)^!.

99DO.)H4m002EKr   c                 ^   [        XU R                  S9n[        R                  " U5      nXE-
  n[        R                  " [
        [        -
  U[        -
  -  S-
  5      * n[        R                  " UR                  SUS-   [        R                  R                  R                  U5      S9U l        g)z>
Initializes alpha parameter, same shape as the weight tensor
rr   r   rF   ri   )rH   rI   namedefault_initializerN)r   rr   r"   floorlogr   r   r   create_parameterrH   r   initializerAssignr   )r+   tensorrp   var_nametensor_scaletensor_flooralphas          r   ru   AdaRound.initialize_alpha   s     $FdooNxx-,&5.9A=>>..++H$ &		 5 5 < <U C	
r   c                     [        U R                  X R                  U5        UR                  UUU/SU R                  S9nU$ )NTprogramfeed
fetch_listreturn_numpyrq   )r   rq   rs   run)r+   r   placeexedatafp32_fetch_listweight_tensor_dequantadaround_out_tensors           r   )_calculate_output_with_adarounded_weights2AdaRound._calculate_output_with_adarounded_weights   sR     	JJ335J	
 "gg'(** & 
 #"r   c                 "   [        U R                  U R                  5      n[        U5      n[	        U R
                  R                  5       U R                  U R                  S9n[        R                  " U5      n[        R                  " XB5      nU$ Nr{   )r   rq   rt   r#   r   ro   rv   rp   rr   r"   r~   add)r+   np_alphah_alphar   rw   weight_tensor_quants         r   _calculate_quant_weight AdaRound._calculate_quant_weight   ss    %djj$//B*84 $""'')JJ
 . !ff]<""r   c                 |    U R                  5       n[        XR                  -   U R                  U R                  S9nU$ r   )r   r
   rm   rp   rr   )r+   r   r   s      r   _calculate_adarounded_weights&AdaRound._calculate_adarounded_weights   s>    "::< !/++-JJ!

 %$r   c                 &    U R                  5       nU$ r(   )r   )r+   r   s     r   update_final_weightsAdaRound.update_final_weights   s    "::<""r   c                     U R                   R                  U R                  X!5      nU R                   R                  X45      nXV-   nUUUS.nU$ )N)lossrA   r8   )rn   rQ   r   r9   )	r+   rB   rP   r   orig_out_tensorrA   r8   r   lossess	            r   get_lossAdaRound.get_loss   s]    ''::LL*

 ''::

 &$$

 r   c                     XR                   U R                  -  :  nU R                  R                  U R                   XR                  5      nX24$ r(   )rk   rP   rn   r\   )r+   cur_iterationrP   rB   s       r   update_beta_warmAdaRound.update_beta_warm   sI    "%8%84??%JJ
!!..
 r   )rn   rt   r   rj   rk   rm   ro   rr   rp   rq   rP   rl   rs   )NNNT  )r_   r`   ra   rb   r-   ru   r   r   r   r   r   r   rc   rL   r   r   re   re   p   s<    
 L4
# #"	%# r   re   c                    US   R                   n0 nUR                  5        GH  u  nn[        R                  SU 35        X   n[	        XO5      nX   nS nUR                  5       R                   HH  nUR                  S:X  d  M  UR                  UU5        UR                  5       R                  U5      nUnMJ     [        R                  " 5       n[        R                  " 5       n[        R                  " UU5         [        R                  R                  R!                  5          [#        UUUUUU	S9n[        R$                  " SS/UR&                  Q7SS9n[        R$                  " S	S/UR&                  Q7SS9n[        R$                  " S
SS/SS9n[        R$                  " SSS/SS9nUR)                  UUUU5      n[        R*                  R-                  U
S9nUS   nUR/                  U5        S S S 5        S S S 5        UR1                  U5        [2        R2                  " 5       n U n![5        U " 5       5       GH  u  n"n#U n![2        R2                  " 5       n UR1                  UU#U/SUS9n$WR7                  5       n%UR9                  UUUU#UU%5      n&[;        U$S   U&S   5      n'U(       a  U'S:  a  [        R                  S5          OUR=                  U"5      u  n(n)U$S   U&S   U(U)S.n*UR1                  UU*WR?                  5        V+s/ s H  n+U+R                   PM     sn+SS9n,[        R                  SU"S SU
S S[@        RB                  " U,S   5      S S[@        RB                  " U,S   5      S S[@        RB                  " U,S   5      S SU U!-
  S S35        [D        RF                  RI                  5         U"U	:X  d  GM    O   WRK                  5       X'   U(       a%  [M        UX   UURN                  URP                  S 9X'   AGM     URS                  5        H  n[U        UUUX   5        M     g ! , (       d  f       GNF= f! , (       d  f       GNP= fs  sn+f )!Nr   zStart adaround op: fetch)rq   rs   rx   rk   r   r0   rF   )r|   rH   rI   r   rB   r   rP   bool)learning_rater   Tr   gGz?z)The cosine error is small, skip training.)r   r   rB   rP   )r   r   r   zIter dz, lr z.5fz, loss z, loss_round z, loss_recon r   z, time s)rl   )+r|   items_loggerinfor   global_blockopstype_rename_inputvarr   Programprogram_guardr   utilsunique_nameguardre   r   rH   r   	optimizerAdamminimizer   time	enumerater   r   r	   r   valuesr"   r3   sysstdoutflushr   r   rr   rl   keysr   )-data_loaderfp32_programr   r   rq   r   quantized_op_pairsweight_op_pairs
scale_dictrk   lrbias_correction	fast_modefetch_op_namefinal_weight_tensor_quant_dictrs   quant_op_out_namerx   weight_var_tensorrp   r   _opstartup_programtrain_programadaroundr   r   beta_tensorwarm_start_tensortrain_fetches_lossr   r   
start_timeprev_start_timeir   np_orig_out_tensoradaround_weight_tensor_dequantnp_adaround_out_tensor	cos_errorrB   rP   	feed_dictvouts-                                                r   run_adaroundr      s    qM&&M%'".@.F.F.H***?*;<=(9.uF+,,.22Cxx7"!!-1BC".";";"="A"A%# !2 3 !..*(  @LL$$**,  ! /--H %kk&2O112O
 #)++*2O112#
 !++B7)K !'!"a! "*!2!2!#	" ((--B-?I%f-Dt$I - AL 	 YY[
$ /GAt(OJ!$$+,! ") " 668 + BB #2 # 2"1%'=a'@I Y-HI'88;D*#5a#8'=a'@(	I '',>,E,E,GH,GqAFF,GH!	  C LL!uE"SQ0E]SUSZSZ[^_`[aSbcfRggtuwu|u|  ~A  BC  ~D  vE  FI  uJ  JQ  R\  _n  Rn  or  Qs  st  u JJN"g 0j ))+ 	'7 >O!.?##$00?*; } /IB .224*;		
 5[ -, A@j Is+   =)Q&CP34Q
Q3
Q=Q
Q	)r   gMbP?FT)loggingr   r   numpyr"   r   r   
log_helperr   r   r   r   r	   r
   r   r   r   r   r_   INFOr   r   r   r   r#   r%   re   r   rL   r   r   <module>r      s     
     #	 	 	 gll H 	
3 3ln  n v X
r   