Ë
    –\;jd%  ã                   ó    — d dl Z d dlZddlmZmZ ddlmZ g d¢Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zdd„Zdd„Zdd„Zd„ Zd„ Zd„ Zd„ Z G d„ d«      Zy)é    Né   )ÚIrNodeÚOperatoré   )ÚSUPPORT_QUANTIZATION_OP_DICT)Úconv2d_transposeÚmulÚmatmulÚ	matmul_v2c                 ó^  — t        | t        t        f«      sJ d«       ‚g }t        | t        «      r| j                  «       n| j                  }|t
        vrg S t
        |   d   }|D ]F  }| j                  |«      }t        |t        «      r|j                  |«       Œ6|j                  |«       ŒH |S )z�
    Get the input var names of the op.
    Args:
        op(IrNode, Operator): the input op.
    Returns:
        input_var_names or None.
    ú*The input op should be IrNode or Operator.r   )
Ú
isinstancer   r   ÚnameÚtyper   ÚinputÚlistÚextendÚappend©ÚopÚ	var_namesÚop_nameÚ	name_listr   Úvar_names         úiG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/static/quantization/utils.pyÚ_get_op_input_var_namesr      s«   € ô Ø
ŒV”XÐôð 4à3ó4ð ð €IÜ% b¬&Ô1ˆb�g‰gŒi°r·w±w€GØÔ2Ñ2Øˆ	ä,¨WÑ5°aÑ8€IÛˆØ—8‘8˜D“>ˆÜ�h¤Ô%Ø×Ñ˜XÕ&à×Ñ˜XÕ&ð ð Ðó    c                 ó^  — t        | t        t        f«      sJ d«       ‚g }t        | t        «      r| j                  «       n| j                  }|t
        vrg S t
        |   d   }|D ]F  }| j                  |«      }t        |t        «      r|j                  |«       Œ6|j                  |«       ŒH |S )Ú r   r   )
r   r   r   r   r   r   Úoutputr   r   r   r   s         r   Ú_get_op_output_var_namesr!   8   s©   € äØ
ŒV”XÐôð 4à3ó4ð ð €IÜ% b¬&Ô1ˆb�g‰gŒi°r·w±w€GØÔ2Ñ2Øˆ	ä,¨WÑ5°aÑ8€IÛˆØ—9‘9˜T“?ˆÜ�h¤Ô%Ø×Ñ˜XÕ&à×Ñ˜XÕ&ð ð Ðr   c                 ó,  — t        | t        t        f«      sJ d«       ‚t        | t        «      r| j                  «       n| j                  }|t
        vryd}t
        |   d   D ]0  }| j                  |«      }t        |«      D ]  \  }}||k(  sŒ||f}Œ Œ2 |S )z6Get the input name and index of the var_name in the opr   Nr   )r   r   r   r   r   r   r   Ú	enumerate)r   Úinput_var_namer   ÚresÚargnamer   Úindexr   s           r   Ú_get_input_name_indexr(   L   s¡   € äØ
ŒV”XÐôð 4à3ó4ð ô & b¬&Ô1ˆb�g‰gŒi°r·w±w€GØÔ2Ñ2Øà
€CÜ/°Ñ8¸Ô;ˆØ—H‘H˜WÓ%ˆ	Ü$ YÖ/‰KˆE�4Ø�~Ó%Ø Ð&‘ñ 0ð <ð
 €Jr   c                 ó0  — t        | t        t        f«      sJ d«       ‚t        | t        «      r| j                  «       n| j                  }|t
        vryt
        |   d   }d}|D ]0  }| j                  |«      }t        |«      D ]  \  }}||k(  sŒ||f}Œ Œ2 |S )z7Get the output name and index of the var_name in the opr   Nr   )r   r   r   r   r   r   r    r#   )	r   Úoutput_var_namer   r   r%   r   r   r'   Úvals	            r   Ú_get_output_name_indexr,   ^   s¤   € äØ
ŒV”XÐôð 4à3ó4ð ô & b¬&Ô1ˆb�g‰gŒi°r·w±w€GØÔ2Ñ2Øä,¨WÑ5°aÑ8€IØ
€CÛˆØ—9‘9˜T“?ˆÜ# HÖ-‰JˆE�3Ø�oÓ%Ø˜U�m‘ñ .ð ð
 €Jr   c                 óˆ   — | j                  |«      }|€J d|z   dz   «       ‚t        j                  |j                  «       «      S )z(
    Load variable value from scope
    zCannot find z
 in scope.)Úfind_varÚnpÚarrayÚ
get_tensor)Úscoper   Úvar_nodes      r   Úload_variable_datar4   q   sE   € ð �~‰~˜hÓ'€HØÐÐI °(Ñ!:¸\Ñ!IÓIÐÜ�8‰8�H×'Ñ'Ó)Ó*Ð*r   c                 ó²   — t        |t        j                  «      sJ d«       ‚| j                  |«      }|�#|j	                  «       }|j                  ||«       yy)z?
    Set the value of var node by name, if the node exits,
    z(The type of value should be numpy array.N)r   r/   Úndarrayr.   r1   Úset)r2   Úplacer   Únp_valuer3   Útensors         r   Úset_variable_datar;   z   s^   € ô Ø”"—*‘*ôð 2à1ó2ð ð �~‰~˜hÓ'€HØÐØ×$Ñ$Ó&ˆØ�
‰
�8˜UÕ#ð r   c                 óT  — d„ }d|dz
  z  dz
  }t        |t        «      rt        |«      dk(  r|d   }t        |t        «      �r|dv sJ d«       ‚t        |«      D ]ö  \  }}|dk(  rd}|dk(  rc|rCt	        j
                  | |   |z  |z  «      | |<   t	        j                  | |   | dz
  |«      | |<   ŒW || |   |«      | |<   | |   |z  |z  | |<   Œu|rSt	        j
                  | d d …|f   |z  |z  «      | d d …|f<   t	        j                  | d d …|f   | dz
  |«      | d d …|f<   ŒÊ || d d …|f   |«      | d d …|f<   | d d …|f   |z  |z  | d d …|f<   Œø | S |dk(  rdn|}|r8t	        j
                  | |z  |z  «      } t	        j                  | | dz
  |«      } | S  || |«      } | |z  |z  } | S )Nc                 ó*   — || | |kD  <   | | | | k  <   | S ©N© )ÚxÚscales     r   Ú_clipzquant_tensor.<locals>._clip‰   s%   € Øˆˆ!ˆe‰)‰Ø˜ˆˆ!ˆuˆf‰*‰Øˆr   r   r   )éÿÿÿÿr   r   ú$quant_axis should be 0 or 1 for now.ç        ç:Œ0âŽyE>)r   r   Úlenr#   r/   ÚroundÚclip)	r@   rA   Ú
quant_axisÚweight_bitsÚonnx_formatrB   ÚbntÚiÚss	            r   Úquant_tensorrP   ‡   sß  € òð
 �˜q‘Ñ! QÑ
&€CÜ�%œÔ¤3 u£:°¢?Ø�a‘ˆÜ�%œÕØ˜ZÑ'ÐOÐ)OÓOÐ'Ü˜eÖ$‰DˆAˆqØ�CŠxØ�Ø˜QŠÙÜŸ8™8 A a¡D¨1¡H¨s¡NÓ3�A�a‘DÜŸ7™7 1 Q¡4¨#¨°©°3Ó7�A�a’Dá   1¡ q›>�A�a‘DØ˜Q™4 !™8 c™>�A�a’DáÜ Ÿh™h qª¨A¨¡w°¡{°SÑ'8Ó9�A’a˜�d‘GÜ Ÿg™g aª¨1¨¡g°¨t°a©x¸Ó=�A’a˜�d’Gá# A¢a¨ d¡G¨QÓ/�A’a˜�d‘GØ¢ 1 ™g¨™k¨CÑ/�A’a˜�d’Gð! %ð2 €Hð  š‘¨%ˆÙÜ—‘˜˜U™ S™Ó)ˆAÜ—‘˜˜C˜4 !™8 SÓ)ˆAð €Hñ �a˜“ˆAØ�E‘	˜C‘ˆAØ€Hr   c                 ó   — |dv sJ d«       ‚d|dz
  z  dz
  }t        |t        «      rFt        |«      D ]6  \  }}|dk(  rd}|dk(  r| |   |z  |z  | |<   Œ!| d d …|f   |z  |z  | d d …|f<   Œ8 | S |dk(  rdn|}| |z  |z  } | S )N)r   r   rD   r   rE   rF   r   )r   r   r#   )r@   rA   rJ   rK   rM   rN   rO   s          r   Údequant_tensorrR   ¯   s´   € Ø˜ÑÐGÐ!GÓGÐØ�˜q‘Ñ! QÑ
&€CÜ�%œÔÜ˜eÖ$‰DˆAˆqØ�CŠxØ�Ø˜QŠØ˜‘t˜a‘x #‘~��!’àšA˜q˜D™' A™+¨Ñ+�’!�Q�$’ð %ð €Hð  š‘¨%ˆØ�‰I˜‰OˆØ€Hr   c                 óˆ  — d}d|dz
  z  dz
  }|j                  «       }t        |t        «      �rà|dk(  rºt        |«      D ]  \  }}	||   |	z  |z  ||<   Œ | |z
  }
|
j	                  |
j
                  d   d«      j                  d«      }| j	                  | j
                  d   d«      j                  d«      }|j	                  |j
                  d   d«      j                  d«      }|||z   z  }�n`t        |«      D ]  \  }}	|dd…|f   |	z  |z  |dd…|f<   Œ | |z
  }
t        j                  t        |
j
                  d   «      D �cg c]  }|
dd…|f   j                  «       ‘Œ c}«      }t        j                  t        | j
                  d   «      D �cg c]  }| dd…|f   j                  «       ‘Œ c}«      }t        j                  t        |j
                  d   «      D �cg c]  }|dd…|f   j                  «       ‘Œ c}«      }|||z   z  }n?||z  |z  }| |z
  j                  «       }| j                  «       |j                  «       |z   z  }|j                  dk(  r@t        j                  || j
                  «      }t        j                  || j
                  «      }||z   |z  }t        ||||«      }|S c c}w c c}w c c}w )z$
    Bias correction for weight
    rF   r   r   rC   N)Úcopyr   r   r#   ÚreshapeÚshapeÚmeanÚstdr/   r0   ÚrangeÚndimÚresizerP   )r@   Úx_quantÚscale_vrJ   rK   ÚepsrM   Ú	x_dequantrN   rO   Ú
quant_biasÚ	mean_biasÚstd_origÚ	std_quantÚstd_biasÚquantized_param_vs                   r   Úbias_correction_wrf   À   s�  € ð €CØ�˜q‘Ñ! QÑ
&€CØ—‘“€IÜ�'œ4Õ Ø˜Š?Ü! 'Ö*‘��1Ø(¨™|¨aÑ/°#Ñ5�	˜!’ð +à˜Y™ˆJØ"×*Ñ*¨:×+;Ñ+;¸AÑ+>ÀÓC×HÑHÈÓLˆIØ—y‘y §¡¨¡¨RÓ0×4Ñ4°RÓ8ˆHØ!×)Ñ)¨)¯/©/¸!Ñ*<¸bÓA×EÑEÀbÓIˆIØ 9¨s¡?Ñ3ŠHä! 'Ö*‘��1Ø")ª!¨Q¨$¡-°!Ñ"3°cÑ"9�	š!˜Q˜$’ð +à˜Y™ˆJÜŸ™Ü27¸
×8HÑ8HÈÑ8KÔ2LÓMÑ2L¨Q�šA˜q˜DÑ!×&Ñ&Õ(Ð2LÑMóˆIô —x‘x¼¸a¿g¹gÀa¹jÔ8IÓ JÑ8I°1 ¢1 a 4¡§¡¥Ð8IÑ JÓKˆHÜŸ™Ü05°i·o±oÀaÑ6HÔ0IÓJÑ0I¨1�š1˜a˜4‘×$Ñ$Õ&Ð0IÑJóˆIð   9¨s¡?Ñ3‰Hà˜gÑ%¨Ñ+ˆ	Ø˜‘]×(Ñ(Ó*ˆ	Ø—5‘5“7˜iŸm™m›o°Ñ3Ñ4ˆØ‡~�~˜ÒÜ—9‘9˜X q§w¡wÓ/ˆÜ—I‘I˜i¨¯©Ó1ˆ	à˜YÑ&¨(Ñ2€IÜ$Ø�7˜J¨óÐð Ðùò' Nùâ JùâJs   ÅJ5ÆJ:Ç!J?c           	      óÆ   — t        j                  | dk  t        j                  | «      dt        j                  | «      z   z  ddt        j                  |  «      z   z  «      }|S )Nr   r   )r/   ÚwhereÚexp)r@   Úsigs     r   Ústable_sigmoidrk   ë   sI   € Ü
�(‰(�1�q‘5œ"Ÿ&™& ›) q¬2¯6©6°!«9¡}Ñ5°q¸AÄÇÁÈÀrÃ
¹NÑ7KÓ
L€CØ€Jr   c                 ó"  — t        j                  | j                  «       |j                  «       «      t         j                  j	                  | j                  «       «      t         j                  j	                  |j                  «       «      z  z  }|S r>   )r/   ÚinnerÚflattenÚlinalgÚnorm)Úorig_tensorÚ
qdq_tensorÚcos_sims      r   Úcalculate_quant_cos_errorrt   ð   sg   € Ü�h‰h�{×*Ñ*Ó,¨j×.@Ñ.@Ó.BÓCÜ
�	‰	�‰�{×*Ñ*Ó,Ó-Ü
�)‰)�.‰.˜×+Ñ+Ó-Ó
.ñ	/ñ€Gð €Nr   c                 ó  — | j                  «       }|j                  D ]å  }|j                  dk(  sŒ|j                  d«      j                  }| j                  |«      }g }|j                  j                  «       D ]4  \  }}|j                  sŒ|j                  |«       |j                  |«       Œ6 |D ]  }|j                  |«       Œ |j                  |j                  d«      «       |j                  j                  d|«       Œç y )NÚwhileÚ	sub_blockÚX)Úglobal_blockÚopsr   ÚattrÚidÚblockÚvarsÚitemsÚpersistableÚ_clone_variabler   Ú_remove_varr   r   ÚdescÚ	set_input)Úprogramry   Ú_opÚ	_block_idÚ_blockÚpersistablesÚ_nameÚ_vars           r   Ú$move_persistable_var_to_global_blockrŒ   ø   s×   € à×'Ñ'Ó)€LØ×ÔˆØ�8‰8�wÓØŸ™ Ó-×0Ñ0ˆIØ—]‘] 9Ó-ˆFØˆLØ%Ÿ{™{×0Ñ0Ö2‘��tØ×#Ó#Ø ×0Ñ0°Ô6Ø ×'Ñ'¨Õ.ð  3ó &�Ø×"Ñ" 5Õ)ð &à×Ñ §	¡	¨#£Ô/Ø�H‰H×Ñ˜s LÕ1ñ  r   c                 ó.   — | |z
  dz  j                  «       S )Né   )rW   )ÚgtÚpreds     r   Úl2_lossr‘   
  s   € Ø�$‰Y˜1Ñ×"Ñ"Ó$Ð$r   c                   ó(   — e Zd Zdd„Zdd„Zd„ Zd„ Zy)Útqdmc                 ó<   — || _         || _        || _        d| _        y )Nr   )ÚtotalÚ
bar_formatÚncolsÚn)Úselfr•   r–   r—   s       r   Ú__init__ztqdm.__init__  s   € ØˆŒ
Ø$ˆŒØˆŒ
Øˆ�r   c                 óÄ  — | xj                   |z  c_         dt        | j                   | j                  z  | j                  z  «      z  }d| j                  t	        |«      z
  z  }| j
                  j                  d«      d   }t        j                  j                  d|› d|› d|› d| j                   › d| j                  › �
«       t        j                  j                  «        y )	NÚ=r   Ú|r   Úz=>z| Ú/)r˜   rH   r•   r—   rG   r–   ÚsplitÚsysÚstderrÚwriteÚflush)r™   r˜   ÚaÚbÚprefixs        r   Úupdateztqdm.update  s­   € Ø�Š�!‰�Ø”%˜Ÿ™ $§*¡*Ñ,°·
±
Ñ:Ó;Ñ;ˆØ�4—:‘:¤ A£Ñ&Ñ'ˆØ—‘×&Ñ& sÓ+¨AÑ.ˆÜ�
‰
×Ñ˜2˜f˜X Q q c¨¨A¨3¨b°·±°¸¸$¿*¹*¸ÐFÔGÜ�
‰
×ÑÕr   c                 ó   — | S r>   r?   )r™   s    r   Ú	__enter__ztqdm.__enter__  s   € Øˆr   c                 óB   — t         j                  j                  d«       y )NÚ
)r¡   r¢   r£   )r™   Úexc_typeÚexc_valÚexc_tbs       r   Ú__exit__ztqdm.__exit__   s   € Ü�
‰
×Ñ˜Õr   N)zLoading|{bar}éP   )r   )Ú__name__Ú
__module__Ú__qualname__rš   r¨   rª   r°   r?   r   r   r“   r“     s   „ óóòór   r“   )r   é   F)r   rµ   )rµ   )r¡   Únumpyr/   Úbase.frameworkr   r   Úquant_configr   Ú_channelwise_quant_axis1_opsr   r!   r(   r,   r4   r;   rP   rR   rf   rk   rt   rŒ   r‘   r“   r?   r   r   Ú<module>rº      sh   ðó ã ç .Ý 6ò Ð òò4ò(ò$ò&+ò
$ó%óPó"(òVò
ò2ò$%÷ò r   