
    shm                     p   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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 \RZ                  R*                  4S! jr.\ " S" S#5      5       r/S$\S%\4S& jr0g)'    )	dataclass)partial)AnyCallableOptionalN)	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                      څ/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/torch/ao/quantization/pt2e/representation/rewrite.py_qdq_quantized_linearr1      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_i32r/   s                        r0   _reference_quantized_linearr@   <   sJ   ( 99>>;?D		$$YBRSIGGEKK Eekk*J 		%%&&G 'J++22EKKJWH G 	IINN%%KK"Y.		
 	  YY^^!!'=HKKEJJWFMr2   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                  r0   _qdq_dynamic_quantized_linearrD   q   s     "II::II[G 99))==KD YY++AA|+uzzF ))00FF

K yy~~$$,,V)LHOr2   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   rB   r   roundr5   r7   r4   r   r6   r   r   r   r8   r9   )r,   r    r!   rC   r"   r#   r$   r%   r&   r'   r   r   x_i32r   r;   r<   r=   r>   r?   r.   s                       r0   #_reference_dynamic_quantized_linearrK      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Or2   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.   r/   s                            r0   _qdq_quantized_conv2drV      s    " VF!fG1vHJVNFYY++AA|+uzzF ))00FF

K yy~~))11
H YY++??)]5::F Mr2   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$ )NrN   r   F)r   r   r   r4   r5   r6   r   rO   r   r7   r8   r9   	unsqueezer:   r   )r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   rP   rQ   rR   rS   rT   rU   r;   r<   r=   r>   r?   r/   s                              r0   _reference_quantized_conv2drZ      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Mr2   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.   r/   s                 r0   _qdq_quantized_add_relurd   F  s     YY++AA|	5::F YY++AA|	5::F Hyy~~""8,HYY++??^	5::F Mr2   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
)
r5   r   r7   r   r   r   r:   r9   r4   r   r   r   r   r^   r_   r`   r(   r)   ra   rb   rJ   y_i32out_i32r/   s                 r0   _reference_quantized_add_reluri   `  s      GGEKK EGGEKK E		!!					E 		!!					E mn,GYY^^!!'9EHHTFMr2   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                 r0   _qdq_quantized_addrk     s     YY++AA|	5::F YY++AA|	5::F HYY++??^	5::F Mr2   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)
   )r5   r   r7   rI   r   r   r4   r   rf   s                 r0   _reference_quantized_addro     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Mr2   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$ rM   )	r   r   r   r   r   r   max_pool2d_with_indicesr   r   )r   r   r   r    r!   r(   r)   r*   r+   kernel_sizerP   rQ   rR   	ceil_moder,   r.   _r/   s                     r0   _qdq_quantized_max_pool2dru     s     KFGHIYY++AA|+uzzF ))..88@@VhKHa YY++??^M5::F Mr2   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$ rM   )	r   r4   r5   r7   r   r   rq   r   r   )r   r   r   r    r!   r(   r)   r*   r+   rr   rP   rQ   rR   rs   rJ   rh   rt   r.   r/   s                      r0   _reference_quantized_max_pool2drw     s     KFGHI;;t+6DGGEKK E77??k7iJGQ I-.?H{{8]BH[[$FMr2   c                 z    [         R                  R                  R                  XX#U[         R                  5      nU$ r   )r   r   r   r   r   r,   scale
zero_pointra   rb   xs         r0   _quantize_per_tensor_int8r}     s0    		&&::zi	A Hr2   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$ rF   )r   rI   r5   r7   r4   r   ry   s         r0   #_reference_quantize_per_tensor_int8r     s^     	A 	AA	5;;A	AA),A	5::AHr2   c                 z    [         R                  R                  R                  XX#U[         R                  5      nU$ r   )r   r   r   r   r   )r   rz   r{   ra   rb   r,   s         r0   _dequantize_per_tensor_int8r     s0    YY++AAZIuzzF Mr2   c                     [         R                  R                  R                  XU5      n U R	                  [         R
                  5      U-
  U-  R	                  [         R
                  S9$ rF   )r   r   r   r4   r5   float32)r   rz   r{   ra   rb   s        r0   %_reference_dequantize_per_tensor_int8r     sO     99>>;D WWU]]#j0E9==EMM=RRr2   c           	      z    [         R                  R                  R                  XX#XE[         R                  5      nU$ r   )r   r   r   quantize_per_channelr   )r,   scaleszero_pointsch_axisra   rb   r/   s          r0   _quantize_per_channel_int8r   *  s2     YY++@@iEJJF Mr2   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      $ NrX   )	r   	transposer   r   r4   rI   r5   r7   r   )r,   r   r   r   ra   rb   rh   s          r0   $_reference_quantize_per_channel_int8r   3  su     __Vb1Fiinn""FO$''4{BIG oog3G::ejj!!r2   c           	      z    [         R                  R                  R                  XX#XE[         R                  5      nU$ r   )r   r   r   dequantize_per_channelr   )r   r   r   r   ra   rb   r.   s          r0   _dequantize_per_channel_int8r   >  s2     yy--DDkI%**H Or2   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   r4   r   r5   r7   float)r   r   r   r   ra   rb   rJ   r.   s           r0   &_reference_dequantize_per_channel_int8r   H  sq     99>>;D??4"-DGGEKK E#''4v=Hx"5HOr2   gmc                 "    [        U S/SSSS.S9$ )NrX            )rN   rm   rn   )exclude_literalsliteral_to_ph_idx)r   )r   s    r0   '_replace_ph_qdq_per_channel_replacementr   V  s    7
bT!!5L r2   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   r2   r0   r   r   \  s[    
 #s(O#IM;-*D!EFMMQHX{m[.H%IJQr2   r   modelreturnc                 $   [         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        U
 H  nURL                  nURN                  nURP                  nURR                  nURT                  n[W        X5      n[K        U5        [W        X5      n[K        U5        U(       a  U" U5      nU(       a  U" U5      nURY                  5         URY                  5         [[        XU5        M     U $ )Nrm   rn   )   r   rG   rN   )r   r   i)rN   r   r   r   r   r   )r   rX   )r   ).r   randintr   randnr   zerosinttensorfinfor   epsr   r
   rD   rK   r   r   r1   r@   r   rV   rZ   rd   ri   rk   ro   ru   rw   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                    r0   r   r   k  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-*%44&&"..)<<!-!D!D4WM*738U*;7(1G!0=K4! +$ Lr2   )1dataclassesr   	functoolsr   typingr   r   r   r   !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__r1   r@   rD   rK   rV   rZ   rd   ri   rk   ro   ru   rw   r}   r   r   r   r   r   r   r   fxr   r   r   r   r2   r0   <module>r      s    !  * *  7 I B  ! 6 '
 F2jB,^0fOd4"J2&R88 
S"0D0D  R R RHK HK Hr2   