Ë
    •\;j€5  ã                   ó®   — 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y)é    N)ÚPyLayer)Ú	ParamAttr)ÚConstant)Úunique_nameé   )ÚLayerc                 óŒ   — t        j                  | «      }|t        j                  t        j                  | «      dz   «      z  } | S )Ng      à?)ÚpaddleÚsignÚfloorÚabs)Úxr   s     ú\G:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/nn/quant/lsq.pyÚroundr      s4   € Ü�;‰;�q‹>€DØŒv�|‰|œFŸJ™J q›M¨CÑ/Ó0Ñ0€AØ€Hó    c                   ó.   — e Zd Zedd„«       Zed„ «       Zy)ÚLsqFuncc                 ó  — | j                  ||«       |||||f| _        |rµ|j                  }|j                  |j                  |   df«      }|j	                  d«      }t        j                  ||j                  «      }t        t        j                  ||«      «      j                  ||«      }	|	|z  }	|	j	                  d«      }	|	j                  |«      }	|	S t        t        j                  ||«      «      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ô   € à×Ñ˜f eÔ,Ø�r˜2˜{¨JÐ6ˆŒ	ÙØ—L‘LˆEØ—^‘^ V§\¡\°*Ñ%=¸rÐ$BÓCˆFØ×%Ñ% fÓ-ˆFÜ×'Ñ'¨¨v¯|©|Ó<ˆEÜœFŸM™M¨&°%Ó8Ó9×>Ñ>¸rÀ2ÓFˆGØ ‘oˆGØ×'Ñ'¨Ó/ˆGØ—o‘o eÓ,ˆGð ˆô œFŸM™M¨&°%Ó8Ó9×>Ñ>¸rÀ2ÓFˆGØ ‘oˆGØˆr   c                 ón  — | j                  «       \  }}| j                  \  }}}}}|r–|j                  }	|j                  |j                  |   df«      }|j	                  d«      }t        j                  ||j                  «      }t        j                  ||«      }
|
j	                  d«      }
|
j                  |	«      }
nt        j                  ||«      }
t        j                  |
|k  d«      }t        j                  |
|kD  d«      }d|z
  |z
  }|rW||z  ||z  z   |t        |
«      z  z   ||
z  z
  |z  |z  }|j                  |j                  |   df«      j                  d¬«      }nG||z  ||z  z   |t        |
«      z  z   ||
z  z
  |z  |z  j                  «       j                  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î  € à×(Ñ(Ó*‰ˆ�Ø-0¯Y©YÑ*ˆˆ2ˆr�; 
ÙØ—L‘LˆEØ—^‘^ V§\¡\°*Ñ%=¸rÐ$BÓCˆFØ×%Ñ% fÓ-ˆFÜ×'Ñ'¨¨v¯|©|Ó<ˆEÜ—-‘- ¨Ó.ˆCØ—-‘- Ó'ˆCØ—+‘+˜eÓ$‰Cä—-‘- ¨Ó.ˆCÜ—[‘[ #¨¡(¨YÓ7ˆ
Ü—[‘[ #¨¡(¨YÓ7ˆ
Ø˜JÑ&¨Ñ3ˆÙð  ‘OØ  2‘oñ&à!¤E¨#£JÑ.ñ/ð " CÑ'ñ(ð
 ñð ñð ð $×+Ñ+Ø×!Ñ! *Ñ-¨rÐ2óç‰c�qˆc‹kñ ð # R™Ø$ r™/ñ*à%¬¨c«
Ñ2ñ3ð &¨Ñ+ñ,ð
 "ñ"ð ñ÷ ‘“ß‘ �Ó" 1ñ&ð ð " KÑ/ˆØ˜JÐ&Ð&r   N)Fr   ©Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr*   r:   © r   r   r   r       s(   „ Øòó ðð" ñ.'ó ñ.'r   r   c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)ÚLsqPlusActFuncc                 ó°   — | j                  |||«       |||f| _        t        t        j                  ||z
  |«      «      j                  ||«      }||z  |z   S )N)r   r   r   r
   r   r   )r    r   r"   Úbetar#   r$   r%   Úquant_xs           r   r*   zLsqPlusActFunc.forwardf   sV   € à×Ñ˜a ¨Ô-Ø�r˜2�IˆŒ	ÜœŸ™ q¨4¡x°%Ó8Ó9×>Ñ>¸rÀ2ÓFˆØ˜‰ Ñ%Ð%r   c                 óÈ  — | j                  «       \  }}}| j                  \  }}}||z
  |z  }t        j                  ||k  d«      }	t        j                  ||kD  d«      }
d|	z
  |
z
  }|	|z  |
|z  z   |t	        |«      z  z   ||z  z
  |z  |z  j                  «       j                  d¬«      d   }|	|
z   |z  |z  j                  «       j                  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   s"  € à×)Ñ)Ó+‰ˆˆ5�$Ø—I‘I‰	ˆˆ2ˆrØ�4‰x˜5Ñ ˆÜ—[‘[ #¨¡(¨YÓ7ˆ
Ü—[‘[ #¨¡(¨YÓ7ˆ
Ø˜JÑ&¨Ñ3ˆð  ‘OØ  2‘oñ&à!¤E¨#£JÑ.ñ/ð " CÑ'ñ(ð
 ñð ñ÷ ‰S‹Uß‰Y˜AˆYÓ˜qñ"ð 	ð ˜:Ñ%¨Ñ/°!Ñ3×8Ñ8Ó:×DÑDÈ!ÐDÓLÈQÑOð 	ð ˜vÑ%ˆØ�z 9Ð,Ð,r   Nr;   r@   r   r   rB   rB   e   s(   „ Øñ&ó ð&ð ñ-ó ñ-r   rB   c                   ó2   ‡ — e Zd Z	 	 	 	 	 	 dˆ fd„	Zd„ Zˆ xZS )ÚFakeQuantActLSQPlusc                 ó  •— t         ‰| �  «        	 || _        || _        || _        || _        || _        || _        | j                  rd| _        d| j                  z  dz
  | _	        n2d| j                  dz
  z   | _        d| j                  dz
  z  dz
  | _	        |r|› d�nd}t        j                  |«      | _        t        | j                  t        d«      d¬«      }	| j                  g |	d	¬
«      | _        d| j                   _        | j                  sn|r|› d�nd}
t        j                  |
«      | _        t        | j$                  t        d«      d¬«      }| j                  g |d	¬
«      | _        d| j&                  _        d| _        y )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_initrP   Úreduce_typer$   r%   r   ÚgenerateÚ_scale_namer   r   Úcreate_parameterÚsÚstop_gradientÚ
_beta_namerD   Ú
init_state)ÚselfÚ
quant_bitsÚall_postiverZ   r[   rU   rP   r\   Úscale_prefixÚs_attrÚbeta_prefixÚ	beta_attrÚ	__class__s               €r   rW   zFakeQuantActLSQPlus.__init__‹   su  ø€ ô 	‰ÑÔð		ð ˆŒ	Ø'ˆÔØ"ˆŒØ$ˆŒØˆŒ	Ø&ˆÔà×ÒàˆDŒGØ˜Ÿ™‘l QÑ&ˆD�Gð ˜dŸi™i¨!™mÑ,Ð-ˆDŒGØ˜DŸI™I¨™MÑ*¨QÑ.ˆDŒGá*.˜$˜˜v‘Ð4IˆÜ&×/Ñ/°Ó=ˆÔäØ×!Ñ!¬x¸«}Èô
ˆð ×&Ñ&¨R°fÀIÐ&ÓNˆŒØ$ˆ�‰Ôà�~Š~Ù,0˜T˜F %™.Ð6JˆKÜ)×2Ñ2°;Ó?ˆDŒOä!Ø—_‘_´(¸3³-È4ôˆIð ×-Ñ-Ø˜y°	ð .ó ˆDŒIð ',ˆD�I‰IÔ#àˆ�r   c                 óŠ  — | j                   dk(  rMt        j                  j                  | j                  t        j                  j
                  j                  ¬«       | j                  s\| j                   dk(  rMt        j                  j                  | j                  t        j                  j
                  j                  ¬«       | j                  dk(  �r!t        j                  dt        j                  |j                  «       | j                  z  «      z  «      | _        t        j                   |j#                  «       «      }t        j$                  |j#                  «       «      }| j                  j'                  ||z
  | j                  | j(                  z
  z  «       | j                  s5| j                  j'                  || j                  | j(                  z  z
  «       | xj                  dz  c_	        �n)| j                  | j*                  k  rût        j                   |j#                  «       «      }t        j$                  |j#                  «       «      }| j                  j'                  | j                  dz  d||z
  z  | j                  | j(                  z
  z  z   «       | j                  sH| j                  j'                  | j                  dz  d|| j                  | j(                  z  z
  z  z   «       | xj                  dz  c_	        n| xj                  dz  c_	        d|_        | j                  sNt.        j1                  || j                  | j                  | j                  | j(                  | j                  «      }|S t2        j1                  || j                  | j                  | j(                  | j                  d¬	«      }|S )
NÚmax©Úopr   r-   r   çÍÌÌÌÌÌì?çš™™™™™¹?F)r&   )r\   r
   ÚdistributedÚ
all_reducer`   ÚReduceOpÚMAXrZ   rD   rc   Ú	to_tensorÚmathÚsqrtÚnumelr%   r#   ÚminÚdetachrm   Ú	set_valuer$   r[   ra   rB   Úapplyr   )rd   Ú
activationÚmin_aÚmax_aÚq_as        r   r*   zFakeQuantActLSQPlus.forwardÇ   s½  € Ø×Ñ˜uÒ$Ü×Ñ×)Ñ)Ø—‘œ6×-Ñ-×6Ñ6×:Ñ:ð *ô ð �~Š~ $×"2Ñ"2°eÒ";Ü×Ñ×)Ñ)Ø—	‘	œf×0Ñ0×9Ñ9×=Ñ=ð *ô ð �?‰?˜aÓÜ×%Ñ%Ø”d—i‘i 
× 0Ñ 0Ó 2°T·W±WÑ <Ó=Ñ=óˆDŒFô —J‘J˜z×0Ñ0Ó2Ó3ˆEÜ—J‘J˜z×0Ñ0Ó2Ó3ˆEØ�F‰F×Ñ˜e e™m°·±¸$¿'¹'Ñ0AÑBÔCØ—>’>Ø—	‘	×#Ñ# E¨D¯F©F°T·W±WÑ,<Ñ$<Ô=Ø�OŠO˜qÑ �OØ�_‰_˜tŸ™Ò.Ü—J‘J˜z×0Ñ0Ó2Ó3ˆEÜ—J‘J˜z×0Ñ0Ó2Ó3ˆEØ�F‰F×ÑØ—‘˜‘˜s e¨e¡mÑ4¸¿¹À$Ç'Á'Ñ8IÑJÑJôð —>’>Ø—	‘	×#Ñ#Ø—F‘F˜S‘L 3¨%°$·&±&¸4¿7¹7Ñ2BÑ*BÑ#CÑCôð �OŠO˜qÑ ŽOà�OŠO˜qÑ �OØ#(ˆ
Ô Ø�~Š~Ü ×&Ñ&Ø˜DŸF™F D§I¡I¨t¯v©v°t·w±wÀÇÁóˆCð ˆ
ô —-‘-Ø˜DŸF™F D§F¡F¨D¯G©G°T·W±WÈ%ð  ó ˆCð ˆ
r   )FFé   r,   NN©r<   r=   r>   rW   r*   Ú__classcell__©rk   s   @r   rK   rK   Š   s"   ø„ ð ØØØØØõ:öx+r   rK   c                   ó6   ‡ — e Zd Z	 	 	 	 	 	 	 	 dˆ fd„	Zd„ Zˆ xZS )ÚFakeQuantWeightLSQPlusc
                 óX  •— t         ‰| �  «        	 || _        || _        || _        || _        || _        || _        |rdnd| _        |rdnd| _	        |	| _
        | j                  rd| _        d| j                  z  dz
  | _        n2d| j                  dz
  z   | _        d| j                  dz
  z  dz
  | _        d| _        |r|› d�nd}
t        j                  |
«      | _        t#        | j                   t%        d«      d¬«      }| j'                  |g||¬	«      | _        d
| j(                  _        y )Nr   r   r   rM   rN   r-   TrO   rS   F)rV   rW   rX   rY   r&   Úquant_linearr[   rP   r'   Úcollect_axisr\   r$   r%   rc   r   r]   r^   r   r   r_   r`   ra   )rd   re   rf   r&   r[   Úchannel_numr‰   rU   rP   r\   rg   rh   rk   s               €r   rW   zFakeQuantWeightLSQPlus.__init__ö   s.  ø€ ô 	‰ÑÔð	ð ˆŒ	Ø'ˆÔØ&ˆÔØ(ˆÔØ$ˆŒØˆŒ	Ù+™!°ˆŒÙ!-™A°1ˆÔØ&ˆÔà×ÒàˆDŒGØ˜Ÿ™‘l QÑ&ˆD�Gð ˜dŸi™i¨!™mÑ,Ð-ˆDŒGØ˜DŸI™I¨™MÑ*¨QÑ.ˆDŒGàˆŒÙ*.˜$˜˜v‘Ð4IˆÜ&×/Ñ/°Ó=ˆÔÜØ×!Ñ!¬x¸«}Èô
ˆð ×&Ñ&Ø�- f°Eð 'ó 
ˆŒð  %ˆ�‰Õr   c                 óh
  — | j                   dk(  rMt        j                  j                  | j                  t        j                  j
                  j                  ¬«       | j                  dk(  �r't        j                  dt        j                  |j                  «       | j                  z  «      z  «      | _        d| j                  z  dz
  | _        | j                   r÷|j#                  «       j%                  |j&                  d   df«      }t        j(                  || j*                  ¬«      }t        j,                  || j*                  ¬«      }t        j.                  t        j0                  t        j2                  |d	|z  z
  «      t        j2                  |d	|z  z   «      g«      d¬«      }| j                  j5                  || j                  z  «       n«t        j(                  |j#                  «       «      }t        j,                  |j#                  «       «      }| j                  j5                  t/        t        j2                  |d	|z  z
  «      t        j2                  |d	|z  z   «      g«      | j                  z  «       | xj                  dz  c_        �n@| j                  | j6                  k  �rød| j                  z  dz
  | _        | j                   �r |j#                  «       j%                  |j&                  d   df«      }t        j(                  || j*                  ¬«      }t        j,                  || j*                  ¬«      }t        j.                  t        j0                  t        j2                  |d	|z  z
  «      t        j2                  |d	|z  z   «      g«      d¬«      }| j                  j5                  |d
z  d|z  | j                  z  z   «       n¾t        j(                  |j#                  «       «      }t        j,                  |j#                  «       «      }| j                  j5                  | j                  d
z  dt/        t        j2                  |d	|z  z
  «      t        j2                  |d	|z  z   «      g«      z  | j                  z  z   «       | xj                  dz  c_        n.| j                  | j6                  k(  r| xj                  dz  c_        d|_        t:        j=                  || j                  | j                  | j>                  | j                  | j                   | j@                  «      }|S )Nrm   rn   r   r-   r   r   r   r.   é   rp   rq   F)!r\   r
   rr   rs   r`   rt   ru   rc   rv   rw   rx   ry   r%   r#   rX   Údivr&   r{   r   r   ÚmeanrŠ   Ústdrm   Ústackr   r|   r[   ra   r   r}   r$   r'   )rd   r!   Ú
weight_tmpr�   r�   r`   Úw_qs          r   r*   zFakeQuantWeightLSQPlus.forward.  s×  € Ø×Ñ˜uÒ$Ü×Ñ×)Ñ)Ø—‘œ6×-Ñ-×6Ñ6×:Ñ:ð *ô ð �?‰?˜aÓÜ×%Ñ% c¬D¯I©I°f·l±l³nÀtÇwÁwÑ6NÓ,OÑ&OÓPˆDŒFØ˜$Ÿ)™)‘| aÑ'ˆDŒHØ×ÒØ#Ÿ]™]›_×4Ñ4°f·l±lÀ1±oÀrÐ5JÓK�
Ü—{‘{ :°D×4EÑ4EÔF�Ü—j‘j °$×2CÑ2CÔD�Ü—J‘JÜ—L‘LÜŸ™ D¨1¨s©7¡NÓ3´V·Z±ZÀÀqÈ3ÁwÁÓ5OÐPóð ô	�ð —‘× Ñ   T§X¡X¡Õ.ä—{‘{ 6§=¡=£?Ó3�Ü—j‘j §¡£Ó1�Ø—‘× Ñ ÜÜŸ™ D¨1¨s©7¡NÓ3´V·Z±ZÀÀqÈ3ÁwÁÓ5OÐPóð —h‘hñôð �OŠO˜qÑ �OØ�_‰_˜tŸ™Ó.Ø˜$Ÿ)™)‘| aÑ'ˆDŒHØ×ÓØ#Ÿ]™]›_×4Ñ4°f·l±lÀ1±oÀrÐ5JÓK�
Ü—{‘{ :°D×4EÑ4EÔF�Ü—j‘j °$×2CÑ2CÔD�Ü—J‘JÜ—L‘LÜŸ™ D¨1¨s©7¡NÓ3´V·Z±ZÀÀqÈ3ÁwÁÓ5OÐPóð ô	�ð —‘× Ñ   S¡¨3°©7°T·X±XÑ+=Ñ!=Õ>ä—{‘{ 6§=¡=£?Ó3�Ü—j‘j §¡£Ó1�Ø—‘× Ñ Ø—F‘F˜S‘LØÜÜŸ™ D¨1¨s©7¡NÓ3´V·Z±ZÀÀqÈ3ÁwÁÓ5OÐPóñð —h‘hñ	ñôð �OŠO˜qÑ ŽOØ�_‰_ §¡Ò/Ø�OŠO˜qÑ �Oà$ˆÔÜ�m‰mØØ�F‰FØ�F‰FØ�G‰GØ�G‰GØ×ÑØ�O‰Oó
ˆð ˆ
r   )FFr‚   NFr,   NNrƒ   r…   s   @r   r‡   r‡   õ   s)   ø„ ð ØØØØØØØõ6%öp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™      sZ   ðó ã Ý #Ý &Ý *Ý $å  òôB'ˆgô B'ôJ"-�Wô "-ôJh˜%ô hôV}˜Uõ }r   