
    8hn                     |   S SK Jr  S SKJr  S SKJrJrJ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JrJrJr  S S
KJr  S SKJr  S/rS rS rS rS rS rS r S r!S r"S r#S r$S r%S r&S r'S r(S r)S r*S r+S r,S r-S  r.S!\R^                  R.                  4S" jr0\ " S# S$5      5       r1S%\S&\4S' jr2g)(    )	dataclass)partial)AnyCallableOptionalN)$_disable_aten_to_metadata_assertions)	out_dtype)quantized_decomposed_lib)_WrapperModule)"_get_aten_graph_module_for_pattern,_replace_literals_with_existing_placeholders'_replace_literals_with_new_placeholders"remove_tensor_overload_for_qdq_ops)GraphModule)replace_pattern reference_representation_rewritec                    [         R                  R                  R                  XX#U[         R                  5      n[         R                  R                  R                  UUUUU	[         R                  5      n[         R                  R
                  R                  R                  UUU
5      n[         R                  R                  R                  UXX[         R                  5      nU$ N)	torchopsquantized_decomposeddequantize_per_tensorint8atenlineardefaultquantize_per_tensor)x_i8x_scalex_zero_pointx_quant_minx_quant_max	weight_i8weight_scaleweight_zero_pointweight_quant_minweight_quant_max	bias_fp32	out_scaleout_zero_pointout_quant_minout_quant_maxx_fp32weight_fp32out_fp32out_i8s                      k/var/www/fran/franai/venv/lib/python3.13/site-packages/torch/ao/quantization/pt2e/representation/rewrite.py_qdq_quantized_linearr2      s    " YY++AA|+uzzF ))00FF

K yy~~$$,,V[)LHYY++??)]5::F M    c                    [         R                  R                  R                  XU5      n [         R                  R                  R                  XXU	5      nU R	                  [         R
                  5      nUR	                  [         R
                  5      n[        [         R                  R                  R                  R                  [         R                  X-
  UU-
  S 5      nX-  n[        [         R                  R                  R                  R                  [         R                  U
U5      nUU-   n[        [         R                  R                  R                  R                  [         R                  UX-  U-  5      U-   n[         R                  R                  R                  UX5      R	                  [         R                  5      nU$ r   )r   r   r   clamptoint16r	   r   r   int32divTensormulr   )r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   x_i16
weight_i16acc_i32
bias_scalebias_i32r0   s                        r1   _reference_quantized_linearrA   =   sJ   ( 99>>;?D		$$YBRSIGGEKK Eekk*J 		%%&&G 'J++22EKKJWH G 	IINN%%KK"Y.		
 	  YY^^!!'=HKKEJJWFMr3   c
                 D   [         R                  R                  R                  XX#[         R                  5      u  p[         R                  R                  R                  X
XU[         R                  5      n[         R                  R                  R                  XXU[         R                  5      n [         R                  R                  R                  UUUUU[         R                  5      n[         R                  R                  R                  R                  XU	5      nU$ r   )
r   r   r   choose_qparamsr   r   r   r   r   r   )r-   r!   r"   x_epsr#   r$   r%   r&   r'   r(   r   r    r   r.   r/   s                  r1   _qdq_dynamic_quantized_linearrE   r   s     "II::II[G 99))==KD YY++AA|+uzzF ))00FF

K yy~~$$,,V)LHOr3   c
                 t   [         R                  R                  R                  XX#[         R                  5      u  pX
-  n [         R
                  " U 5      n U R                  [         R                  S9nX-   n[         R                  " XU5      nUR                  [         R                  S9n[         R                  R                  R                  XGU5      nUR                  [         R                  5      nUR                  [         R                  5      n[        [         R                  R                  R                  R                  [         R                  X-
  X-
  S 5      nX-  n[        [         R                  R                  R                  R                  [         R                  U	U5      nUU-   nUX-  -  nU$ Ndtype)r   r   r   rC   r   roundr6   r8   r5   r   r7   r	   r   r   r9   r:   )r-   r!   r"   rD   r#   r$   r%   r&   r'   r(   r   r    x_i32r   r<   r=   r>   r?   r@   r/   s                       r1   #_reference_dynamic_quantized_linearrL      sL    "II::II[G
 F [[ FIIEKKI(E EKKK8E88%**8%D		$$YBRSIGGEKK Eekk*J 		%%&G 'J++22EKKJWH G'01HOr3   c                    SS/nSS/nSS/nSnSS/nSn[         R                  R                  R                  XX#U[         R                  5      n[         R                  R                  R                  UUUUU	[         R                  5      n[         R                  R
                  R                  R                  UUU
UUUUUU5	      n[         R                  R                  R                  UXX[         R                  5      nU$ N   r   F)	r   r   r   r   r   r   convolutionr   r   )r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   stridepaddingdilation
transposedoutput_paddinggroupsr-   r.   r/   r0   s                            r1   _qdq_quantized_conv2drW      s    " VF!fG1vHJVNFYY++AA|+uzzF ))00FF

K yy~~))11
H YY++??)]5::F Mr3   c                    SS/nSS/nSS/nSnSS/nSn[         R                  R                  R                  XU5      n [         R                  R                  R                  XXU	5      nU R	                  [         R
                  5      nUR	                  [         R
                  5      n[        [         R                  R                  R                  R                  [         R                  UU-
  UU-
  S UUUUUU5      nX-  n[        [         R                  R                  R                  R                  [         R                  U
U5      nUR                  S5      nUR                  S5      nUU-   n[        [         R                  R                  R                  R                  [         R                  UX-  U-  5      U-   n[         R                  R                  R                  UX5      R	                  [         R                  5      nU$ )NrO   r   F)r   r   r   r5   r6   r7   r	   rP   r   r8   r9   r:   	unsqueezer;   r   )r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   rQ   rR   rS   rT   rU   rV   r<   r=   r>   r?   r@   r0   s                              r1   _reference_quantized_conv2dr[      s   " VF!fG1vHJVNF 99>>;?D		$$YBRSIGGEKK Eekk*J 		""**&&G 'J ++22EKKJWH !!"%H!!"%H G 	IINN%%KK"Y.		
 	  YY^^!!'=HKKEJJWFMr3   c
                    [         R                  R                  R                  XX(U	[         R                  5      n
[         R                  R                  R                  X4XXU	[         R                  5      nX-   n[         R                  R
                  R                  U5      n[         R                  R                  R                  XXxU	[         R                  5      nU$ r   )r   r   r   r   r   r   relur   r   r   r    y_i8y_scaley_zero_pointr)   r*   	quant_min	quant_maxr-   y_fp32r/   r0   s                 r1   _qdq_quantized_add_relure   G  s     YY++AA|	5::F YY++AA|	5::F Hyy~~""8,HYY++??^	5::F Mr3   c
                 N   U R                  [        R                  5      n
UR                  [        R                  5      n[        [        R                  R
                  R                  R                  [        R                  X-
  X-  5      n
[        [        R                  R
                  R                  R                  [        R                  X-
  XF-  5      nX-   U-   n[        R                  R
                  R                  XU	5      R                  [        R                  5      nU$ )z
See comments for `_reference_quantized_add` for more information on
how to derive the formula for out_i8 based on x_i8 and y_i8
)
r6   r   r8   r	   r   r   r;   r:   r5   r   r   r   r    r_   r`   ra   r)   r*   rb   rc   rK   y_i32out_i32r0   s                 r1   _reference_quantized_add_relurj   a  s      GGEKK EGGEKK E		!!					E 		!!					E mn,GYY^^!!'9EHHTFMr3   c
                 j   [         R                  R                  R                  XX(U	[         R                  5      n
[         R                  R                  R                  X4XXU	[         R                  5      nX-   n[         R                  R                  R                  XXxU	[         R                  5      nU$ r   )r   r   r   r   r   r   r^   s                 r1   _qdq_quantized_addrl     s     YY++AA|	5::F YY++AA|	5::F HYY++??^	5::F Mr3   c
                    U R                  [        R                  5      n
UR                  [        R                  5      n[        R                  " X-  X-
  -  5      R                  [        R                  5      n
[        R                  " XF-  X-
  -  5      R                  [        R                  5      nX-   U-   nSnSn	[        R                  R
                  R                  XU	5      R                  [        R                  5      nU$ )a  
    # How to Derive the formula for out_i8 based on x_i8 and y_i8
    # (since quantized add takes x_i8, y_i8 and their quantization parameters, and produce an out_i8)

    # out_i8 is quantized output, we can write down the formula for it first:
out_i8 = out_f32 / out_scale + out_zero_point           (1)

    # then out_fp32 is computed from x_f32 + y_f32, and the x_fp32 and y_fp32 are the dequantized x_i8 and y_i8
    out_f32 = x_f32 + y_f32           (2)
    x_fp32 = (x_i8 - x_zero_point) * x_scale         (3)
    y_fp32 = (y_i8 - y_zero_point) * y_scale         (4)

    # applying the above fomula to the out_i8 equation we can get the following:
    out_i8 = out_fp32 / out_scale + out_zero_point             # (1)
       = (x_f32 + y_f32) / out_scale + out_zero_point      # applying (2) to substitute out_fp32 with x_fp32 + y_fp32
       = ((x_i8 - x_zero_point) * x_scale + (y_i8 - y_zero_point) * y_scale) / out_scale + out_zero_point  # apply (3) and (4)
   )r6   r   r8   rJ   r   r   r5   r   rg   s                 r1   _reference_quantized_addrp     s    : GGEKK EGGEKK EKK,1EFGJJ5;;WEKK,1EFGJJ5;;WEmn,GIIYY^^!!'i@CCEJJOFMr3   c	                 r   Sn	Sn
SnSnSn[         R                  R                  R                  XX#U[         R                  5      n[         R                  R
                  R                  R                  XXX5      u  nn[         R                  R                  R                  XXgU[         R                  5      nU$ rN   )	r   r   r   r   r   r   max_pool2d_with_indicesr   r   )r   r   r    r!   r"   r)   r*   r+   r,   kernel_sizerQ   rR   rS   	ceil_moder-   r/   _r0   s                     r1   _qdq_quantized_max_pool2drv     s     KFGHIYY++AA|+uzzF ))..88@@VhKHa YY++??^M5::F Mr3   c	                 |   Sn	Sn
SnSnSn[         R                  " XU5      n U R                  [         R                  5      n[         R                  R
                  R                  R                  X-
  XXU5      u  nnXU-  -  U-   n[         R                  " UXx5      nUR                  [         R                  5      nU$ rN   )	r   r5   r6   r8   r   r   rr   r   r   )r   r   r    r!   r"   r)   r*   r+   r,   rs   rQ   rR   rS   rt   rK   ri   ru   r/   r0   s                      r1   _reference_quantized_max_pool2drx     s     KFGHI;;t+6DGGEKK E77??k7iJGQ I-.?H{{8]BH[[$FMr3   c                 z    [         R                  R                  R                  XX#U[         R                  5      nU$ r   )r   r   r   r   r   r-   scale
zero_pointrb   rc   xs         r1   _quantize_per_tensor_int8r~      s0    		&&::zi	A Hr3   c                     X-  n[         R                  " U5      nUR                  [         R                  S9nXR-   n[         R                  " XSU5      nUR                  [         R
                  S9nU$ rG   )r   rJ   r6   r8   r5   r   rz   s         r1   #_reference_quantize_per_tensor_int8r     s^     	A 	AA	5;;A	AA),A	5::AHr3   c                 z    [         R                  R                  R                  XX#U[         R                  5      nU$ r   )r   r   r   r   r   )r   r{   r|   rb   rc   r-   s         r1   _dequantize_per_tensor_int8r     s0    YY++AAZIuzzF Mr3   c                     [         R                  R                  R                  XU5      n U R	                  [         R
                  5      U-
  U-  R	                  [         R
                  S9$ rG   )r   r   r   r5   r6   float32)r   r{   r|   rb   rc   s        r1   %_reference_dequantize_per_tensor_int8r     sO     99>>;D WWU]]#j0E9==EMM=RRr3   c           	      z    [         R                  R                  R                  XX#XE[         R                  5      nU$ r   )r   r   r   quantize_per_channelr   )r-   scaleszero_pointsch_axisrb   rc   r0   s          r1   _quantize_per_channel_int8r   +  s2     YY++@@iEJJF Mr3   c                 \   [         R                  " XS5      n [         R                  R                  R	                  [         R
                  " X-  5      R                  [         R                  5      U-   XE5      n[         R                  " XcS5      nUR                  [         R                  5      $ NrY   )	r   	transposer   r   r5   rJ   r6   r8   r   )r-   r   r   r   rb   rc   ri   s          r1   $_reference_quantize_per_channel_int8r   4  su     __Vb1Fiinn""FO$''4{BIG oog3G::ejj!!r3   c           	      z    [         R                  R                  R                  XX#XE[         R                  5      nU$ r   )r   r   r   dequantize_per_channelr   )r   r   r   r   rb   rc   r/   s          r1   _dequantize_per_channel_int8r   ?  s2     yy--DDkI%**H Or3   c                 <   [         R                  R                  R                  XU5      n [         R                  " XS5      n U R                  [         R                  5      nXb-
  R                  [         R                  5      U-  n[         R                  " XsS5      nU$ r   )r   r   r   r5   r   r6   r8   float)r   r   r   r   rb   rc   rK   r/   s           r1   &_reference_dequantize_per_channel_int8r   I  sq     99>>;D??4"-DGGEKK E#''4v=Hx"5HOr3   gmc                 "    [        U S/SSSS.S9$ )NrY            )rO   rn   ro   )exclude_literalsliteral_to_ph_idx)r   )r   s    r1   '_replace_ph_qdq_per_channel_replacementr   W  s    7
bT!!5L r3   c                       \ rS rSr% Sr\\S4   \S'   \\S'   \\S'   Sr	\
\\/\4      \S'   Sr\
\\/\4      \S	'   S
rg)_RewriteInfoi]  zData needed for rewrite, this includes example inputs, pattern and replacement functions
and post transformation functions for the exported pattern and replacement GraphModule
.example_inputspatternreplacementNpattern_post_transreplacement_post_trans )__name__
__module____qualname____firstlineno____doc__tupler   __annotations__r   r   r   r   r   __static_attributes__r   r3   r1   r   r   ]  s[    
 #s(O#IM;-*D!EFMMQHX{m[.H%IJQr3   r   modelreturnc                 p   [         R                  " SSS[         R                  S9[         R                  " S[         R                  S9[         R
                  " S[         R                  S9[         R                  " S/[         R                  S9[         R                  " S/[         R                  S9[         R                  " SSS[         R                  S9[         R                  " S[         R                  S9[         R
                  " S[         R                  S9[         R                  " S/[         R                  S9[         R                  " S/[         R                  S9[         R                  " S[         R                  S9[         R                  " S[         R                  S9[         R
                  " S[         R                  S9[         R                  " S/[         R                  S9[         R                  " S/[         R                  S94n[         R                  " S[         R                  S9SS[         R                  " [         R                  5      R                  [         R                  " SSS[         R                  S9[         R                  " S[         R                  S9[         R
                  " S[         R                  S9[         R                  " S/[         R                  S9[         R                  " S/[         R                  S9[         R                  " S[         R                  S94
n[         R                  " SSS[         R                  S9[         R                  " S[         R                  S9[         R
                  " S[         R                  S9[         R                  " S/[         R                  S9[         R                  " S/[         R                  S9[         R                  " SSS[         R                  S9[         R                  " S[         R                  S9[         R
                  " S[         R                  S9[         R                  " S/[         R                  S9[         R                  " S/[         R                  S9[         R                  " S[         R                  S9[         R                  " S[         R                  S9[         R
                  " S[         R                  S9[         R                  " S/[         R                  S9[         R                  " S/[         R                  S94n[         R                  " SSS[         R                  S9[         R                  " S[         R                  S9[         R
                  " S[         R                  S9[         R                  " SSS[         R                  S9[         R                  " S[         R                  S9[         R
                  " S[         R                  S9[         R                  " S[         R                  S9[         R
                  " S[         R                  S9[         R                  " S/[         R                  S9[         R                  " S/[         R                  S94
n[         R                  " SSS[         R                  S9[         R                  " S[         R                  S9[         R
                  " S[         R                  S9[         R                  " S/[         R                  S9[         R                  " S/[         R                  S9[         R                  " S[         R                  S9[         R
                  " S[         R                  S9[         R                  " S/[         R                  S9[         R                  " S/[         R                  S94	n[         R                  " SS	S	S	[         R                  S9[         R                  " S[         R                  S9[         R
                  " S[         R                  S9[         R                  " S/[         R                  S9[         R                  " S/[         R                  S94n[         R                  " SSS[         R                  S9[         R                  " S[         R                  S9[         R
                  " S[         R                  S9[         R                  " S/[         R                  S9[         R                  " S/[         R                  S94n[         R                  " SS	S	S	[         R                  S9[         R                  " S	[         R                  S9[         R
                  " S	[         R                  S9SSS4n[         R                  " SSS[         R                  S9[         R                  " S	[         R                  S9[         R
                  " S	[         R                  S9SSS4n	[        U[        [        5      [        [        5      [        [         SSSS
[         R                  " [         R                  5      R                  S	0S9[        [         SSSS
[         R                  " [         R                  5      R                  S	0S95      [        U[        ["        5      [        [$        5      [&        [&        5      [        U[        [(        5      [        [*        5      [        [&        S/S9[        [&        S/S95      [        U[        [,        5      [        [.        5      5      [        U[        [0        5      [        [2        5      5      [        U[        [4        5      [        [6        5      [&        [&        5      [        U[        [8        5      [        [:        5      5      [        U[        [<        5      [        [>        5      5      [        U[        [@        5      [        [B        5      [D        [D        5      [        U	[        [F        5      [        [H        5      [D        [D        5      /
n
[K        U 5        [M        5          U
 H  nURN                  nURP                  nURR                  nURT                  nURV                  n[Y        X5      n[K        U5        [Y        UU5      n[K        U5        U(       a  U" U5      nU(       a  U" U5      nUR[                  5         UR[                  5         []        XU5        M     S S S 5        U $ ! , (       d  f       U $ = f)Nrn   ro   )   r   rH   rO   )r   r   i)rO   r   r   r   r   r   )r   rY   )r   )/r   randintr   randnr   zerosinttensorfinfor   epsr   r   rE   rL   r   r   r2   rA   r   rW   r[   re   rj   rl   rp   rv   rx   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	recompiler   )r    _QUANTIZED_LINEAR_EXAMPLE_INPUTS(_DYNAMIC_QUANTIZED_LINEAR_EXAMPLE_INPUTS _QUANTIZED_CONV2d_EXAMPLE_INPUTS)_QUANTIZED_ADD_OR_ADD_RELU_EXAMPLE_INPUTS$_QUANTIZED_MAX_POOL2D_EXAMPLE_INPUTS(_QUANTIZE_PER_TENSOR_INT8_EXAMPLE_INPUTS*_DEQUANTIZE_PER_TENSOR_INT8_EXAMPLE_INPUTS)_QUANTIZE_PER_CHANNEL_INT8_EXAMPLE_INPUTS+_DEQUANTIZE_PER_CHANNEL_INT8_EXAMPLE_INPUTS_REWRITE_INFO_LISTrewrite_infor   r   r   r   r   s                    r1   r   r   l  s   dCuzz:AU[[)AUYY'dV599-cU%)),dCuzz:AU[[)AUYY'dV599-cU%)),AU[[)AU[[)AUYY'dV599-cU%)),($& 	F%++.EMM"&&dCuzz:AU[[)AUYY'dV599-cU%)),AU[[)0, 	dCUZZ@AU[[)AUYY'dV599-cU%)),dCUZZ@AU[[)AUYY'dV599-cU%)),AU[[)AU[[)AUYY'dV599-cU%)),($& 	dCUZZ@AU[[)AUYY'dCUZZ@AU[[)AUYY'AU[[)AUYY'dV599-cU%)),1- 	dCUZZ@AU[[)AUYY'dV599-cU%)),AU[[)AUYY'dV599-cU%)),
,( 	Aq!Qekk2AU[[)AUYY'dV599-cU%)),0, 	dCUZZ@AU[[)AUYY'dV599-cU%)),2. 	Aq!Qekk2AU[[)AUYY'	1- 	dCUZZ@AU[[)AUYY'	3/ 	489>?<#'CEKK4N4R4RTU"V <#'CEKK4N4R4RTU"V	
 	,016733	
 	,0167;rdS;rdS	
 	52389	

 	5-.34	

 	045:;33	
 	445>?	

 	667@A	

 	556?@33	
 	778AB33	
}EN 'u-	-	/.L)88N"**G&22K!-!@!@%1%H%H"8QG.w7<K /{;!,W5%4[A!!#EK8' / 
0, L- 
0	/, Ls   B=t&&
t5)3dataclassesr   	functoolsr   typingr   r   r   r   torch._export.utilsr   !torch._higher_order_ops.out_dtyper	   $torch.ao.quantization.fx._decomposedr
   'torch.ao.quantization.pt2e.export_utilsr    torch.ao.quantization.pt2e.utilsr   r   r   r   torch.fxr   torch.fx.subgraph_rewriterr   __all__r2   rA   rE   rL   rW   r[   re   rj   rl   rp   rv   rx   r~   r   r   r   r   r   r   r   fxr   r   r   r   r3   r1   <module>r      s    !  * *  D 7 I B  ! 6 '
 F2jB,^0fOd4"J2&R88 
S"0D0D  R R RLK LK Lr3   