+
    "Ý³jx�  ã                   óö  € ^ RI t ^ RIt^ RIt^ RIt^ RIHtHtHtHt ^ RI	t	^ RI
Hu Ht ^ RIHt ^ RIHtHtHt ^ RIHtHt ^ RIHt ^ RIHtHtHtHt ^ RIHtH t H!t!H"t"H#t# ]'       d   ^ R	I$H%t% . t&R
 R lt'R R lt(R R lt)R R lt*R t+R R lt,R R lt-R R lt.R R lt/R R lt0R R lt1R R  lt2R! R" lt3R# R$ lt4R% R& lt5R' R( lt6R) R* lt7R+ R, lt8R- R. lt9R/ R0 lt:R1 R2 lt;R3 R4 lt<R5 R6 lt=R# )7é    N)ÚTYPE_CHECKINGÚAnyÚCallableÚOptional)Úquantized_decomposed_lib)ÚGraphÚGraphModuleÚNode)ÚReplacedPatternsÚreplace_pattern_with_filters©ÚWrapperModule)ÚDerivedQuantizationSpecÚ
EdgeOrNodeÚQuantizationSpecBaseÚSharedQuantizationSpec)Ú"_get_aten_graph_module_for_patternÚ_is_bn_nodeÚ_is_conv_or_conv_transpose_nodeÚ_is_conv_transpose_fnÚfold_bn_weights_into_conv_node)ÚInternalMatchc                óv   € V ^8„  d   QhR\         R\         R\         R\         R\        \        \        3,          /# )é   Úis_per_channelÚhas_biasÚbias_is_quantizedÚis_cudaÚreturn)ÚboolÚdictÚstrr   )Úformats   "Úd/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torchao/quantization/pt2e/qat_utils.pyÚ__annotate__r%   )   sB   € ÷ ñ Üðäðô ðô ð	ô
 
Œ#Œsˆ(…^ñó    c                óv  € / pV '       d¹   \         P                  ! ^.\         P                  R7      VR&   \         P                  ! ^ .\         P                  R7      VR&   V'       d]   V'       dU   \         P                  ! ^.\         P                  R7      VR&   \         P                  ! ^ .\         P                  R7      VR&   V'       d   \         P                  ! ^4      VR&   V'       dN   VP                  4        F9  w  rV\        V\         P                  4      '       g   K'  VP                  4       WE&   K;  	  V# )zi
Optional example inputs for quantized and folded conv-bn patterns
used in convert, expressed as kwargs.
©ÚdtypeÚweight_scaleÚweight_zero_pointÚ
bias_scaleÚbias_zero_pointÚ	conv_bias)	ÚtorchÚtensorÚfloatÚintÚrandnÚitemsÚ
isinstanceÚTensorÚcuda)r   r   r   r   ÚkwargsÚkÚvs   &&&&   r$   Ú,_get_quantized_conv_bn_example_inputs_kwargsr;   )   sÑ   € ð €F÷ Ü!&§¢¨q¨c¼¿¹Ô!Eˆˆ~ÑÜ&+§l¢l°A°3¼e¿i¹iÔ&HˆÐ"Ñ#ß×)Ü#(§<¢<°°¼5¿;¹;Ô#GˆF�<Ñ Ü(-¯ª°a°SÄÇ	Á	Ô(JˆFÐ$Ñ%ßÜ#Ÿkšk¨!›nˆˆ{ÑßØ—L‘L–N‰DˆAÜ˜!œUŸ\™\×*Ô*ØŸF™F›H�“	ñ #ð €Mr&   c                ó0   € V ^8„  d   QhR\         R\         /# ©r   Úconv_fnr   ©r   )r#   s   "r$   r%   r%   E   s   € ÷ +ñ +¤(ð +¬xñ +r&   c                 ó,   a € R  V 3R llp\        V4      # )c                ó  € V ^8„  d   QhR\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  /# ©	r   ÚxÚconv_weightr.   Ú	bn_weightÚbn_biasÚbn_running_meanÚbn_running_varr   ©r/   r6   )r#   s   "r$   r%   Ú*_get_conv_bn_pattern.<locals>.__annotate__F   sx   € ÷ ñ Ü�<‰<ðä—\‘\ðô —<‘<ðô —<‘<ð	ô
 —‘ðô Ÿ™ðô Ÿ™ðô 
�‰ñr&   c           	      óN   <€ S! WV4      p \         P                  ! WWcVR R7      p V # )T)Útraining)ÚFÚ
batch_norm)rC   rD   r.   rE   rF   rG   rH   r>   s   &&&&&&&€r$   Ú_conv_bn_patternÚ._get_conv_bn_pattern.<locals>._conv_bn_patternF   s/   ø€ ñ �A IÓ.ˆÜ�LŠLØ ¸7ÈTô
ˆð ˆr&   r   )r>   rO   s   f r$   Ú_get_conv_bn_patternrQ   E   s   ø€ ÷ð ô Ð)Ó*Ð*r&   c                ó0   € V ^8„  d   QhR\         R\         /# r=   r?   )r#   s   "r$   r%   r%   Y   s   € ÷ (/ñ (/¤hð (/´8ñ (/r&   c                 ó,   a € R  V 3R llp\        V4      # )c                ó  € V ^8„  d   QhR\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  /# rB   rI   )r#   s   "r$   r%   Ú._get_qat_conv_bn_pattern.<locals>.__annotate__Z   sx   € ÷ %ñ %Ü�<‰<ð%ä—\‘\ð%ô —<‘<ð%ô —<‘<ð	%ô
 —‘ð%ô Ÿ™ð%ô Ÿ™ð%ô 
�‰ñ%r&   c           
     ó  <€ Rp\         P                  ! Wg,           4      pW8,          p	^.\        VP                  4      ,          p
\	        S4      '       d   ^M^ pRW«&   ^.\        VP                  4      ,          pRV^&   WP                  V
4      ,          p\         P                  ! W P                  R7      pS! WV4      p W	P                  V4      ,          p WP                  V4      ,           p \        P                  ! V VVVVRVR7      p V # )zÔ
Approximated method to fuse conv and bn. It requires only one forward pass.
conv_orig = conv / scale_factor where scale_factor = bn.weight / running_std.
This is based on `nniqat.ConvBn2d._forward_approximate`.
çñhãˆµøä>r(   T©rL   Úepséÿÿÿÿ)
r/   ÚsqrtÚlenÚshaper   ÚreshapeÚ
zeros_liker)   rM   rN   )rC   rD   r.   rE   rF   rG   rH   Úbn_epsÚrunning_stdÚscale_factorÚweight_shapeÚweight_in_channel_axisÚ
bias_shapeÚscaled_weightÚ	zero_biasr>   s   &&&&&&&        €r$   Ú_qat_conv_bn_patternÚ6_get_qat_conv_bn_pattern.<locals>._qat_conv_bn_patternZ   s÷   ø€ ð ˆÜ—j’j Õ!8Ó9ˆØ Õ.ˆØ�sœS ×!2Ñ!2Ó3Õ3ˆÜ&;¸G×&DÒ&D¡È!ÐØ/1ˆÑ,Ø�Sœ3˜{×0Ñ0Ó1Õ1ˆ
Øˆ
�1‰Ø#×&:Ñ&:¸<Ó&HÕHˆÜ×$Ò$ Y·g±gÔ>ˆ	Ù�A iÓ0ˆØ×$Ñ$ ZÓ0Õ0ˆØ×!Ñ! *Ó-Õ-ˆÜ�LŠLØØØØØØØô
ˆð ˆr&   r   )r>   rh   s   f r$   Ú_get_qat_conv_bn_patternrj   Y   s   ø€ ÷%ð %ôN Ð-Ó.Ð.r&   c                ó0   € V ^8„  d   QhR\         R\         /# r=   r?   )r#   s   "r$   r%   r%   „   s   € ÷ %<ñ %<´8ð %<Äñ %<r&   c                 ó,   a € R  V 3R llp\        V4      # )c                ó  € V ^8„  d   QhR\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  /# rB   rI   )r#   s   "r$   r%   Ú;_get_qat_conv_bn_pattern_no_conv_bias.<locals>.__annotate__…   sx   € ÷ "ñ "Ü�<‰<ð"ä—\‘\ð"ô —<‘<ð	"ô
 —<‘<ð"ô —‘ð"ô Ÿ™ð"ô Ÿ™ð"ô 
�‰ñ"r&   c           
     ó¬  <€ Rp\         P                  ! Wg,           4      pW8,          p	^.\        VP                  4      ,          p
\	        S4      '       d   ^M^ pRW«&   ^.\        VP                  4      ,          pRV^&   WP                  V
4      ,          pS! WR4      p W	P                  V4      ,          p \        P                  ! V VVVVRVR7      p V # )zM
Same as `_get_qat_conv_bn_pattern`, but handles the case with no conv bias.
rW   NTrX   rZ   )r/   r[   r\   r]   r   r^   rM   rN   )rC   rD   r.   rE   rF   rG   rH   r`   ra   rb   rc   rd   re   rf   r>   s   &&&&&&&       €r$   Ú!_qat_conv_bn_pattern_no_conv_biasÚP_get_qat_conv_bn_pattern_no_conv_bias.<locals>._qat_conv_bn_pattern_no_conv_bias…   sÐ   ø€ ð ˆÜ—j’j Õ!8Ó9ˆØ Õ.ˆØ�sœS ×!2Ñ!2Ó3Õ3ˆÜ&;¸G×&DÒ&D¡È!ÐØ/1ˆÑ,Ø�Sœ3˜{×0Ñ0Ó1Õ1ˆ
Øˆ
�1‰Ø#×&:Ñ&:¸<Ó&HÕHˆÙ�A dÓ+ˆØ×$Ñ$ ZÓ0Õ0ˆÜ�LŠLØØØØØØØô
ˆð ˆr&   r   )r>   rp   s   f r$   Ú%_get_qat_conv_bn_pattern_no_conv_biasrr   „   s   ø€ ÷"ð "ôH Ð:Ó;Ð;r&   c           	     óŽ  € ^ pV'       d   RMRpV'       d   RMRpV'       d	   W5,          MRpV'       d	   W6,          M^ pRp	^p
\         P                  p\         P                  P                  pV'       d+   VP	                  WW„WšV4      p VP                  WW„WšV4      p V # VP                  WW‰W«4      p VP                  WW‰W«4      p V # )zý
Helper function to append q-dq ops after `x`, using dummy values for the qparams
and qmin/qmax. We use dummy values here because we match with `ignore_literals=True`
and will manually replace these values after subgraph rewriting.

Return the dq node.
r,   r*   r-   r+   g      ð?i�ÿÿÿ)r/   Úint8ÚopsÚquantized_decomposedÚquantize_per_channelÚdequantize_per_channelÚquantize_per_tensorÚdequantize_per_tensor)rC   r   Úis_biasr8   Úper_channel_axisÚ	scale_keyÚzp_keyÚscaleÚzpÚqminÚqmaxr)   Úqds   &&&&         r$   Ú_append_qdqr„   ¬   s¾   € ð Ðß '‘¨^€Iß")ÑÐ/B€Fß!/ˆFÖ°S€Eß)ˆŽ¨q€BØ€DØ€DÜ�J‰J€Eä	�‰×	'Ñ	'€BßØ×#Ñ# A¨bÀDÐPUÓVˆØ×%Ñ% a°ÀdÐRWÓXˆð €Hð ×"Ñ" 1¨R°tÓCˆØ×$Ñ$ Q¨r¸ÓEˆØ€Hr&   c                ó`   € V ^8„  d   QhR\         R\         R\         R\        R\         R\        /# ©r   r   r   r   r>   Úbn_is_trainingr   ©r    r   )r#   s   "r$   r%   r%   È   sL   € ÷ A9ñ A9ÜðA9äðA9ô ðA9ô ð	A9ô
 ðA9ô ñA9r&   c                óD   a aaaaa€ RoR VVVVVV 3R llp\        V4      # )zú
Return the quantized version of QAT conv + BN pattern.
This is based on `nniqat.ConvBn2d._forward_approximate`,
used in QAT convert. We first match this pattern and replace
it with the normal [conv - bn] pattern, then fold the BN
weights into conv.
rW   c                óø   € V ^8„  d   QhR\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  /# ©r   rC   rD   rE   rF   rG   rH   r   rI   )r#   s   "r$   r%   Ú8_get_quantized_qat_conv_bn_pattern.<locals>.__annotate__Ù   sj   € ÷ .ñ .Ü�<‰<ð.ä—\‘\ð.ô —<‘<ð.ô —‘ð	.ô
 Ÿ™ð.ô Ÿ™ð.ô 
�‰ñ.r&   c           
      ó�  <€ \         P                  ! VS,           4      pW',          p^.\        VP                  4      ,          p	RV	^ &   ^.\        VP                  4      ,          p
RV
^&   WP	                  V	4      ,          p\        VSRVR7      pS'       dK   \         P                  ! VR,          V P                  R7      pS'       d   \        VSRVR7      pS! WV4      p M	S! WR4      p WP	                  V
4      ,          p S'       d   WR,          P	                  V
4      ,           p \        P                  ! V VVVVSSR7      p V # )	é   F©r{   r8   r.   r(   TNrX   rZ   )
r/   r[   r\   r]   r^   r„   r_   r)   rM   rN   )rC   rD   rE   rF   rG   rH   r8   ra   rb   rc   re   rf   rg   r   r`   r‡   r>   r   r   s   &&&&&&,      €€€€€€r$   Ú_quantized_qat_conv_bn_patternÚJ_get_quantized_qat_conv_bn_pattern.<locals>._quantized_qat_conv_bn_patternÙ   s4  ø€ ô —j’j °&Õ!8Ó9ˆØ Õ.ˆØ�sœS ×!2Ñ!2Ó3Õ3ˆØˆ�Q‰Ø�Sœ3˜{×0Ñ0Ó1Õ1ˆ
Øˆ
�1‰Ø#×&:Ñ&:¸<Ó&HÕHˆÜ#ØØØØô	
ˆ÷ Ü×(Ò(¨°Õ)<ÀAÇGÁGÔLˆIß Ü'ØØ"Ø Ø!ô	�	ñ ˜¨)Ó4‰Aá˜¨$Ó/ˆAØ×$Ñ$ ZÓ0Õ0ˆßØ˜;Õ'×/Ñ/°
Ó;Õ;ˆAÜ�LŠLØØØØØØ#Øô
ˆð ˆr&   r   )r   r   r   r>   r‡   r�   r`   s   fffff @r$   Ú"_get_quantized_qat_conv_bn_patternr’   È   s#   ý€ ð €F÷.õ .ô` Ð7Ó8Ð8r&   c                ó`   € V ^8„  d   QhR\         R\         R\         R\        R\         R\        /# r†   rˆ   )r#   s   "r$   r%   r%     sL   € ÷ 3@ñ 3@Üð3@äð3@ô ð3@ô ð	3@ô
 ð3@ô ñ3@r&   c                óD   a aaaaa€ RoR VVVVVV 3R llp\        V4      # )zI
Quantized QAT conv - bn pattern with bn weights being folded into conv.
rW   c                óø   € V ^8„  d   QhR\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  /# r‹   rI   )r#   s   "r$   r%   Ú?_get_folded_quantized_qat_conv_bn_pattern.<locals>.__annotate__  sj   € ÷ $ñ $Ü�<‰<ð$ä—\‘\ð$ô —<‘<ð$ô —‘ð	$ô
 Ÿ™ð$ô Ÿ™ð$ô 
�‰ñ$r&   c           
      óÈ   <€ \        VSR VR7      pS'       d"   VR,          pS'       d   \        VSRVR7      pMRpS! WV4      p \        P                  ! V VVVVS
S	R7      p V # )Fr�   r.   TNrX   )r„   rM   rN   )rC   rD   rE   rF   rG   rH   r8   Úbiasr   r`   r‡   r>   r   r   s   &&&&&&, €€€€€€r$   Ú%_folded_quantized_qat_conv_bn_patternÚX_get_folded_quantized_qat_conv_bn_pattern.<locals>._folded_quantized_qat_conv_bn_pattern  s�   ø€ ô "ØØØØô	
ˆ÷ Ø˜+Õ&ˆDß Ü"ØØ"Ø Ø!ô	�øð ˆDÙ�A DÓ)ˆÜ�LŠLØØØØØØ#Øô
ˆð ˆr&   r   )r   r   r   r>   r‡   r™   r`   s   fffff @r$   Ú)_get_folded_quantized_qat_conv_bn_patternr›     s#   ý€ ð €F÷$õ $ôL Ð>Ó?Ð?r&   c                ó@   € V ^8„  d   QhRRR\         R\         R\        /# ©r   Úmatchr   Úoriginal_graphÚpattern_graphr   ©r   r    )r#   s   "r$   r%   r%   B  s6   € ÷ Nñ NØðNäðNô ðNô 
ñ	Nr&   c                óê   € V P                   P                  4        FK  p\        V4      '       g   K  \        VP                  4      ^8„  ;'       d    VP                  ^,          RJu # 	  \        R4      h)zk
Match filter for the subgraph rewriter that returns True if the conv node in
the original graph has bias.
Nz5Could not find conv node in matched conv + bn pattern)Ú	nodes_mapÚvaluesr   r\   ÚargsÚ
ValueError)rž   rŸ   r    Úns   &&& r$   Ú_has_conv_bias_filterr¨   B  s[   € ð �_‰_×#Ñ#Ö%ˆÜ*¨1×-Ô-Ü�q—v‘v“; ‘?×<Ð< q§v¡v¨a¥y¸Ð'<Ò<ñ &ô ÐLÓ
MÐMr&   c                ó@   € V ^8„  d   QhRRR\         R\         R\        /# r�   r¡   )r#   s   "r$   r%   r%   Q  s6   € ÷ 	Kñ 	KØð	Käð	Kô ð	Kô 
ñ		Kr&   c                ó$   € \        WV4      '       * # )zu
Match filter for the subgraph rewriter that returns True if the conv node in
the original graph does NOT have bias.
)r¨   )rž   rŸ   r    s   &&&r$   Ú_no_conv_bias_filterr«   Q  s   € ô % U¸MÓJÔJÐJr&   c                ó0   € V ^8„  d   QhR\         R\        /# ©r   r§   r   ©r
   r    )r#   s   "r$   r%   r%   ]  s   € ÷ ñ ”Dð œTñ r&   c                 ó.  € V P                   \        P                  P                  P                  P
                  \        P                  P                  P                  P                  \        P                  P                  P                  P
                  39   # ©N)Útargetr/   ru   rv   ry   Údefaultr0   rw   ©r§   s   &r$   Ú_is_quantizer´   ]  sc   € Ø�8‰8Ü�	‰	×&Ñ&×:Ñ:×BÑBÜ�	‰	×&Ñ&×:Ñ:×AÑAÜ�	‰	×&Ñ&×;Ñ;×CÑCðñ ð r&   c                ó0   € V ^8„  d   QhR\         R\        /# r­   r®   )r#   s   "r$   r%   r%   e  s   € ÷ ñ ”dð œtñ r&   c                 ó.  € V P                   \        P                  P                  P                  P
                  \        P                  P                  P                  P                  \        P                  P                  P                  P
                  39   # r°   )r±   r/   ru   rv   rz   r²   r0   rx   r³   s   &r$   Ú_is_dequantizer·   e  sc   € Ø�8‰8Ü�	‰	×&Ñ&×<Ñ<×DÑDÜ�	‰	×&Ñ&×<Ñ<×CÑCÜ�	‰	×&Ñ&×=Ñ=×EÑEðñ ð r&   c                ót   € V ^8„  d   QhR\         R\        \        \        \        \        3,          3,          /# )r   Úrr   )r   r!   r"   Útupler
   )r#   s   "r$   r%   r%   m  s2   € ÷ nñ nÔ"2ð n´t¼CÄÄtÌTÀzÕARÐ<RÕ7Sñ nr&   c                ó¢  € R R lpR R lp\        \        V P                  4      P                  4       4      pV! V4      w  rEpV! V P                  4      w  rxp	Ve   Q hV	e   Q hRWG3RWX3/p
V! \        V P                  P                  4       4      4      w  p pVP                  vrÞpVP                  vppp\        V\        4      '       g   Q h\        V\        4      '       g   Q h\        V\        4      '       g   Q h\        V\        4      '       g   Q hV P                  V,          pV P                  V,          p\        V4      '       d`   V! V4      w  pppV! V4      w  pppV P                  V,          pV P                  V,          pV P                  V,          pVV3V
R&   VV3V
R&   VV3V
R	&   VV3V
R
&   \        VP                  4      ^8”  dû   \        VP                  4      ^8”  dá   VP                  ^,          pVP                  ^,          p\        V\        4      '       g   Q h\        V\        4      '       g   Q hV P                  V,          p\        V4      '       d`   V! V4      w  pppV! V4      w  pppV P                  V,          pV P                  V,          p V P                  V,          p!V V3V
R&   V!V3V
R&   VV3V
R&   V
# )a‹  
Helper function to extract the nodes in the conv-bn fusion pattern after
subgraph rewriting, in the form of a map:

    {name: (original_node, replacement_node)}

The following names must exist in the map:

    "conv", "conv_weight", "conv_input", "bn", "getitem"

The following names may exist in the map:

    "conv_weight_q", "conv_weight_dq", "conv_bias",
    "conv_bias_q", "conv_bias_dq"
c                óˆ   € V ^8„  d   QhR\         \        ,          R\        \        \        \        \        ,          3,          /# )r   Únodesr   )Úlistr
   rº   r   )r#   s   "r$   r%   Ú0_get_conv_bn_pattern_nodes.<locals>.__annotate__~  s.   € ÷ 2ñ 2œ$œt�*ð 2¬¬t´T¼8ÄD½>Ð/IÕ)Jñ 2r&   c                ó  € RRRr2pV  Fq  pVP                   R8w  d   K  \        V4      '       d	   Ve   Q hTp\        V4      '       d	   Ve   Q hTpVP                  \        P
                  8X  g   Ki  Ve   Q hTpKs  	  Vf   Q hVf   Q hWV3# )zx
Return a 3-tuple of (conv_node, bn_node, getitem_node).
This asserts that the match contains exactly one of each node.
NÚcall_function)Úopr   r   r±   ÚoperatorÚgetitem)r½   Ú	conv_nodeÚbn_nodeÚgetitem_noder§   s   &    r$   Ú
_get_nodesÚ._get_conv_bn_pattern_nodes.<locals>._get_nodes~  s¤   € ð
 ,0°°t˜Lˆ	ÛˆAØ�t‰t�Ô&ÙÜ.¨q×1Ò1Ø Ò(Ð(Ð(Ø�	Ü˜1�~Š~Ø’Ð&�Ø�Ø�x‰xœ8×+Ñ+Ö+Ø#Ò+Ð+Ð+Ø ’ñ ð Ò$Ð$Ð$ØÒ"Ð"Ð"Ø LÐ1Ð1r&   c                ó\   € V ^8„  d   QhR\         R\        \         \         \         3,          /# r­   )r
   rº   )r#   s   "r$   r%   r¿   ”  s&   € ÷ 
&ñ 
&œ4ð 
&¤E¬$´´dÐ*:Õ$;ñ 
&r&   c                ó  € \        V 4      '       g   Q hV P                  ^ ,          p\        V\        4      '       g   Q h\	        V4      '       g   Q hVP                  ^ ,          p\        V\        4      '       g   Q hW!V 3# )z3
Return a 3-tuple of (orig_node, q_node, dq_node).
)r·   r¥   r5   r
   r´   )r§   Úq_nodeÚ	orig_nodes   &  r$   Ú_get_q_dq_nodesÚ3_get_conv_bn_pattern_nodes.<locals>._get_q_dq_nodes”  sq   € ô ˜a× Ò Ð Ð Ø—‘˜•ˆÜ˜&¤$×'Ò'Ð'Ð'Ü˜F×#Ò#Ð#Ð#Ø—K‘K •Nˆ	Ü˜)¤T×*Ò*Ð*Ð*Ø 1Ð%Ð%r&   ÚconvÚbnÚconv_weight_qÚconv_weight_dqÚ
conv_inputrD   Úconv_bias_qÚconv_bias_dqr.   )r¾   Ú_filter_nodes_mapr£   r¤   ÚreplacementsÚkeysr¥   r5   r
   r·   r\   )"r¹   rÈ   rÎ   Úoriginal_nodesÚo_convÚo_bnÚ	o_getitemÚr_convÚr_bnÚ	r_getitemÚmappingÚp_convÚ_Úp_conv_inputÚp_conv_weightÚr_conv_inputÚr_conv_weightÚo_conv_inputÚo_conv_weightÚp_conv_weight_qÚp_conv_weight_dqÚr_conv_weight_qÚr_conv_weight_dqÚo_conv_weight_qÚo_conv_weight_dqÚp_conv_biasÚr_conv_biasÚo_conv_biasÚp_conv_bias_qÚp_conv_bias_dqÚr_conv_bias_qÚr_conv_bias_dqÚo_conv_bias_qÚo_conv_bias_dqs"   &                                 r$   Ú_get_conv_bn_pattern_nodesrù   m  sÉ  € õ"2õ,
&ô Ô+¨A¯K©KÓ8×?Ñ?ÓAÓB€NÙ(¨Ó8Ñ€F�)Ù(¨¯©Ó8Ñ€F�)ð ÒÐÐØÒÐÐà�Ð Øˆtˆlð€Gñ  ¤ Q§[¡[×%5Ñ%5Ó%7Ó 8Ó9�N€VˆQ�Ø(.¯©Ð%€\ 1Ø(.¯©Ð%€\�= 1Ü�l¤D×)Ò)Ð)Ð)Ü�m¤T×*Ò*Ð*Ð*Ü�l¤D×)Ò)Ð)Ð)Ü�m¤T×*Ò*Ð*Ð*Ø—;‘;˜|Õ,€LØ—K‘K Õ.€Mô �m×$Ò$Ù;JØó<
Ñ8ˆ�Ð(8ñ <KØó<
Ñ8ˆ�Ð(8ð Ÿ™ MÕ2ˆØŸ+™+ oÕ6ˆØŸ;™;Ð'7Õ8ÐØ$3°_Ð#Eˆ�Ñ Ø%5Ð7GÐ$HˆÐ Ñ!Ø)¨<Ð8€GˆLÑØ+¨]Ð;€GˆMÑô ˆ6�;‰;Ó˜!Ô¤ F§K¡KÓ 0°1Ô 4Ø—k‘k !•nˆØ—k‘k !•nˆÜ˜+¤t×,Ò,Ð,Ð,Ü˜+¤t×,Ò,Ð,Ð,Ø—k‘k +Õ.ˆô ˜+×&Ò&Ù9HÈÓ9UÑ6ˆK˜¨Ù9HÈÓ9UÑ6ˆK˜¨ØŸ+™+ kÕ2ˆKØŸK™K¨Õ6ˆMØŸ[™[¨Õ8ˆNØ&3°]Ð%CˆG�MÑ"Ø'5°~Ð&FˆG�NÑ#Ø +¨[Ð9ˆ�ÑØ€Nr&   c                ót   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          /# )r   r£   r   )r!   r
   )r#   s   "r$   r%   r%   Þ  s,   € ÷ ñ ¤¤d¬D jÕ!1ð ´d¼4Ä¸:Õ6Fñ r&   c                óv   € / pV P                  4        F"  w  r#Vf   K  VP                  R8X  d   K  W1V&   K$  	  V# )zÄ
Return a filtered `nodes_map` returned from the subgraph rewriter.
The filtered `nodes_map` will contain only nodes that are actually
matched in the pattern, excluding None or placeholder nodes.
Úplaceholder)r4   rÂ   )r£   Únew_nodes_mapÚpattern_nodeÚ
graph_nodes   &   r$   r×   r×   Þ  sE   € ð ')€MØ$-§O¡OÖ$5Ñ ˆàÒÙà�?‰?˜mÔ+ÙØ&0�lÓ#ñ %6ð Ðr&   c                ó0   € V ^8„  d   QhR\         R\         /# )r   Úoriginal_nodeÚnew_node©r
   )r#   s   "r$   r%   r%   ñ  s   € ÷ Añ A´ð AÄñ Ar&   c                ó  € \        V 4      '       g   Q h\        V4      '       g   Q h\        VP                  4      p\        V4      ^8  d   VP	                  R4       \        VR,          4      V P                  R,          ,           Vn        R# )a  
Copy over literal args in conv, such as stride and padding, from the matched node
in the original graph to its replacement in the new graph.

This is needed due to the following limitation in the subgraph rewriter when used
with dynamo export: literal (non-tensor) args are not supported in the match and
replacement patterns. This is because dynamo export automatically inlines these
literal args, making them dead placeholder nodes. In the future, we should check
if dynamo export can optionally disable this inlining, or if subgraph rewriter
can do the copying for us. See https://github.com/pytorch/pytorch/issues/100419.

Note: Unlike other tensor args like conv weights and biases, literal args are
preserved in the original nodes after replacement, so we can access them here.
N:Né   N:r  NN)r   r¾   r¥   r\   Úappendrº   )r  r  Únew_argss   && r$   Ú_copy_over_literal_conv_argsr  ñ  sl   € ô +¨=×9Ò9Ð9Ð9Ü*¨8×4Ò4Ð4Ð4ä�H—M‘MÓ"€HÜ
ˆ8ƒ}�qÔà�‰˜ÔÜ˜( 2�,Ó'¨-×*<Ñ*<¸RÕ*@Õ@€H†Mr&   c                ó0   € V ^8„  d   QhR\         R\         /# ©r   r  Úreplacement_noder  )r#   s   "r$   r%   r%   
  s    € ÷ Wñ WÜðWÜ+/ñWr&   c                ó<  € \        V 4      '       g   Q h\        V4      '       g   Q hRV P                  9  d   R# V P                  R,          P                  p/ p\        VP	                  4       4      pV^ ,          ^,          W1P
                  ^ ,          &   V^,          ^,          W1P
                  ^,          &   \        VP
                  4      ^8”  d4   \        V4      ^8”  d$   V^,          ^,          W1P
                  ^,          &   W1P                  R,          n        R# )a
  
Update the `input_qspec_map` in the annotation after subgraph rewriting.

The original annotation referred to the nodes in the original graph,
so the keys in the `input_qspec_map` will need to be updated to reflect
the corresponding nodes in the replacement graph.
Úquantization_annotationN)r   ÚmetaÚinput_qspec_mapr¾   r4   r¥   r\   )r  r  Úoriginal_input_qspec_mapr  Úall_configss   &&   r$   Ú._update_conv_input_qspec_map_after_replacementr  
  sö   € ô +¨=×9Ò9Ð9Ð9Ü*Ð+;×<Ò<Ð<Ð<Ø ¨×(:Ñ(:Ô:ÙØ,×1Ñ1Ø!õ ç�oð ð €Oô Ð/×5Ñ5Ó7Ó8€Kà0;¸Aµ¸qÕ0A€O×)Ñ)¨!Õ,Ñ-à0;¸Aµ¸qÕ0A€O×)Ñ)¨!Õ,Ñ-ä
Ð× Ñ Ó! AÔ%¬#¨kÓ*:¸QÔ*>Ø4?ÀµNÀ1Õ4Eˆ×-Ñ-¨aÕ0Ñ1ØGV×ÑÐ3Õ4ÖDr&   c                óR   € V ^8„  d   QhR\         R\        \         \         3,          /# )r   ÚnodeÚoriginal_to_replacement_node)r
   r!   )r#   s   "r$   r%   r%   *  s)   € ÷ 1Fñ 1FÜ
ð1Fä"&¤t¬T zÕ"2ñ1Fr&   c                ó4  aa€ R V3R lloR V3R llpRV P                   9  d   R# V P                   R,          p/ pVP                  P                  4        F   w  rVSP                  WU4      pV! V4      WG&   K"  	  WCn        V! VP                  4      Vn        R# )aQ  
Update the `SharedQuantizationSpec`s and `DerivedQuantizationSpec`s
used in `node`'s quantization annotation after subgraph rewriting.

The original annotation referred to the nodes in the original graph,
so the nodes used in these special quantization specs will need to
be updated to the corresponding nodes in the replacement graph.
c                ó$   € V ^8„  d   QhR\         /# )r   Úedge_or_node)r   )r#   s   "r$   r%   Ú>_update_special_qspecs_after_replacement.<locals>.__annotate__7  s   € ÷ Wñ W¬Jñ Wr&   c                 óŒ  <€ \        V \        4      '       d   T pSP                  W4      # \        V \        4      '       dq   \	        V 4      ^8X  da   \
        ;QJ d    R V  4       F  '       d   K   RM	  RM! R V  4       4      '       d'   V w  r#SP                  W"4      SP                  W34      3# \        R\        V 4      4      h)r   c              3   óB   "  € T F  p\        V\        4      x € K  	  R # 5ir°   )r5   r
   )Ú.0rC   s   & r$   Ú	<genexpr>ÚZ_update_special_qspecs_after_replacement.<locals>._get_new_edge_or_node.<locals>.<genexpr>>  s   é € Ð>±¨A”J˜q¤$×'Ð'³ùs   ‚FTz"unexpected type for edge_or_node: )r5   r
   Úgetrº   r\   Úallr¦   Útype)r  Ú_nodeÚsrcÚdestr  s   &   €r$   Ú_get_new_edge_or_nodeÚG_update_special_qspecs_after_replacement.<locals>._get_new_edge_or_node7  s£   ø€ Ü�l¤D×)Ò)Ø ˆEØ/×3Ñ3°EÓAÐAä�|¤U×+Ò+Ü�LÓ! QÔ&ß“Ñ>±Ó>——’Ñ>±Ó>×>Ò>à$‰IˆCà,×0Ñ0°Ó:Ø,×0Ñ0°Ó<ðð ô
 ÐAÄ4ÈÓCUÓVÐVr&   c                ó$   € V ^8„  d   QhR\         /# )r   Úqspec)r   )r#   s   "r$   r%   r  H  s   € ÷ ñ Ô2ñ r&   c                 ó  <€ \        V \        4      '       d   S! V P                  4      p\        V4      # \        V \        4      '       d9   V P                   Uu. uF  pS! V4      NK  	  pp\
        P                  ! WR 7      # V # u upi ))Úderived_from)r5   r   r  r   r*  ÚdataclassesÚreplace)r(  Únew_edge_or_noderC   Únew_derived_fromr%  s   &   €r$   Ú_get_new_qspecÚ@_update_special_qspecs_after_replacement.<locals>._get_new_qspecH  s{   ø€ Ü�eÔ3×4Ò4Ù4°U×5GÑ5GÓHÐÜ)Ð*:Ó;Ð;Ü˜Ô6×7Ò7ØBG×BTÒBTÓUÑBT¸QÑ 5°aÖ 8ÑBTÐÐUÜ×&Ò& uÔLÐLàˆLùò  Vs   ÁBr  N)r  r  r4   r  Úoutput_qspec)	r  r  r/  Ú
annotationÚnew_input_qspec_mapÚ
input_noder(  Únew_input_noder%  s	   &f      @r$   Ú(_update_special_qspecs_after_replacementr6  *  s•   ù€ ÷Wð W÷"ð ð !¨¯	©	Ô1ÙØ—‘Ð4Õ5€JàÐØ'×7Ñ7×=Ñ=Ö?Ñˆ
Ø5×9Ñ9¸*ÓQˆÙ.<¸UÓ.CÐÓ+ñ @ð "5ÔÙ,¨Z×-DÑ-DÓE€JÖr&   c                ó0   € V ^8„  d   QhR\         R\         /# ©r   Úmr   ©r	   )r#   s   "r$   r%   r%   ^  s   € ÷ (ñ (œð (¬ñ (r&   c           	      ó‚  € \         P                  ! ^^^4      \         P                  ! ^^^4      \         P                  ! ^4      \         P                  ! ^4      \         P                  ! ^4      \         P                  ! ^4      \         P                  ! ^4      3p\         P                  ! ^^^^4      \         P                  ! ^^^^4      \         P                  ! ^4      \         P                  ! ^4      \         P                  ! ^4      \         P                  ! ^4      \         P                  ! ^4      3p\        ;QJ d0    R V P                  P                   4       F  '       g   K   RM%	  RM!! R V P                  P                   4       4      pV'       g   V # \         P
                  P                  4       '       d   RR.MR.pV Fs  p\        V \        P                  WR7      p \        V \        P                  W%R7      p \        V \        P                  WR7      p \        V \        P                  W%R7      p Ku  	  V # )rŽ   c              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir°   ©r   ©r  r§   s   & r$   r  Ú$_fuse_conv_bn_qat.<locals>.<genexpr>u  ó   é € Ð7© A”˜Q—�«ùó   ‚TF©r   )r/   r3   ÚanyÚgraphr½   r7   Úis_availableÚ_fuse_conv_bn_qat_helperrM   Úconv1dÚconv2dÚconv_transpose1dÚconv_transpose2d)r9  Ú_conv1d_bn_example_inputsÚ_conv2d_bn_example_inputsÚhas_bnÚis_cuda_optionsr   s   &     r$   Ú_fuse_conv_bn_qatrO  ^  s”  € ô 	�Š�A�q˜!ÓÜ�Š�A�q˜!ÓÜ�Š�A‹Ü�Š�A‹Ü�Š�A‹Ü�Š�A‹Ü�Š�A‹ð!Ðô 	�Š�A�q˜!˜QÓÜ�Š�A�q˜!˜QÓÜ�Š�A‹Ü�Š�A‹Ü�Š�A‹Ü�Š�A‹Ü�Š�A‹ð!Ð÷ ‹SÑ7¨¯©¯ªÓ7�S�SŠSÑ7¨¯©¯ªÓ7Ó7€FßØˆÜ',§z¡z×'>Ñ'>×'@Ò'@�t˜U‘mÀuÀg€OÛ"ˆÜ$ØŒq�x‰xÐ2ô
ˆô %ØŒq�x‰xÐ2ô
ˆô %ØŒq×!Ñ!Ð#<ô
ˆô %ØŒq×!Ñ!Ð#<ô
Šñ #ð €Hr&   c          
      ón   € V ^8„  d   QhR\         R\        R\        \        R3,          R\        R\         /# ©r   r9  r>   Úexample_inputs.r   r   ©r	   r   rº   r   r    )r#   s   "r$   r%   r%   ‰  sI   € ÷ nñ nÜðnäðnô œ#˜s˜(•Oðnô ð	nô
 ñnr&   c                óž  € V P                   P                  4        V P                  4        \        V4      p\	        VVV4      p\        V4      p\	        VVV4      p\        V VV\        .RR7      pV P                  4        \        V4      p	\	        V	VV4      p
\        V VV
\        .RR7      pV P                  4        / pW‹,            FÙ  p\        V4      pVR,          ^ ,          P                  P                  RR4      pVP                  4        F�  w  ppVw  ppVP                  Vn        VR9   d=   V'       d5   RVP                  9  d$   \        P                  ! V4      VP                  R&   \!        V4      '       d   \#        VV4       \%        VV4       VVV&   K�  	  KÛ  	  V P                   P&                   F  p\)        VV4       K  	  V # )a=  
Given a graph of decomposed aten ops, replace the (conv + bn) pattern with
the fused QAT subgraph equivalent. The input graph should already be annotated.
The annotations in the original nodes will be preserved in the corresponding
nodes in the new subgraph.

Note: This also handles the (conv + bn + relu) pattern.
T)Úmatch_filtersÚignore_literalsrÐ   Únn_module_stackN)rÔ   rD   )rD  Úeliminate_dead_codeÚ	recompilerQ   r   rj   r   r¨   rr   r«   rù   r  r  r4   ÚcopyÚdeepcopyr   r  r  r½   r6  )r9  r>   rR  r   Úconv_bn_patternÚmatch_patternÚqat_conv_bn_patternÚ"replacement_pattern_with_conv_biasÚreplacements_with_conv_biasÚ qat_conv_bn_pattern_no_conv_biasÚ replacement_pattern_no_conv_biasÚreplacements_no_conv_biasÚ!all_original_to_replacement_nodesr¹   Úreplacement_dictÚconv_nn_moduler9   Ú
node_tupler  r  r§   s   &&&&                 r$   rF  rF  ‰  sÛ  € ð ‡G�G×ÑÔ!Ø‡K�K„Mä*¨7Ó3€OÜ6ØØØó€Mô 3°7Ó;ÐÜ)KØØØó*Ð&ô
 #?Ø	ØØ*Ü,Ð-Øô#Ðð ‡K�K„Mô (MÈWÓ'UÐ$Ü'IØ(ØØó(Ð$ô
 !=Ø	ØØ(Ü+Ð,Øô!Ðð ‡K�K„Mð( )+Ð%Ø(×DÐDˆÜ5°aÓ8Ðà)¨&Õ1°!Õ4×9Ñ9×=Ñ=Ð>OÐQUÓVˆØ-×3Ñ3Ö5‰MˆAˆzØ.8Ñ+ˆMÐ+à$1×$6Ñ$6ÐÔ!ð Ð2Ô2ß"Ø%Ð-=×-BÑ-BÔBä;?¿=º=ÈÓ;XÐ ×%Ñ%Ð&7Ñ8Ü.¨}×=Ò=ä,¨]Ð<LÔMä>Ø!Ð#3ôð @PÐ-¨mÓ<ó' 6ñ	 Eð4 �W‰W�]Œ]ˆÜ0°Ð4UÖVñ ð €Hr&   c                ó$   € V ^8„  d   QhR\         /# ©r   r9  r:  )r#   s   "r$   r%   r%   ú  s   € ÷ ñ ¤+ñ r&   c           
     ó–  € \         P                  P                  P                  pV P                  P
                   Fç  pVP                  R8w  g,   VP                  V8w  g   \        VP                  4      ^8X  d   KA  \        VP                  4       Fr  pV P                  P                  V4      ;_uu_ 4        V P                  P                  RWP                  VP                  4      pRRR4       VP                  VX4       Kt  	  V P                  P!                  V4       Ké  	  V P#                  4        R#   + '       g   i     LW; i)a?  
Helper function to duplicate all dequantize nodes in the graph if the
node has more than one user. For example:

Before:
  quantize -> dequantize -> a
                      \--> b
                      \--> c

After:
  quantize -> dequantize_1 -> a
        \--> dequantize_2 -> b
        \--> dequantize_3 -> c

This is useful for subgraph rewriting. E.g. if we wish to match the
pattern [dequantize - a] above, subgraph matching would fail because
the dequantize node has users outside the matched portion of the graph.
Instead, we match [dequantize_1 - a], which is safe.
rÁ   N)r/   ru   rv   rz   rD  r½   rÂ   r±   r\   Úusersr¾   Úinserting_beforeÚcreate_noder¥   r8   Úreplace_input_withÚ
erase_noderY  )r9  Údq_opr§   Úuserr  s   &    r$   Ú_duplicate_dequantize_noderr  ú  sØ   € ô( �I‰I×*Ñ*×@Ñ@€EØ�W‰W�]Œ]ˆØ�4‰4�?Ô" a§h¡h°%Ô&7¼3¸q¿w¹w»<È1Ô;LÙÜ˜Ÿ™–MˆDØ—‘×)Ñ)¨!×,Õ,ØŸ7™7×.Ñ.¨ÀÇvÁvÈqÏxÉxÓX�÷ -à×#Ñ# A xÖ0ñ "ð 	
�‰×Ñ˜1Öñ ð ‡K�K†M÷	 -×,ús   Â72D8	Ä8Ec                ó$   € V ^8„  d   QhR\         /# ri  r:  )r#   s   "r$   r%   r%     s   € ÷ ñ ¤ñ r&   c           	     óª  € \         P                  P                  P                  pV P                  P
                   Fì  pVP                   Uu. uF+  pVP                  R8X  g   K  VP                  V8X  g   K)  VNK-  	  pp\        V4      ^8”  g   KV  V P                  P                  V^ ,          4      ;_uu_ 4        V P                  P                  RW^ ,          P                  / 4      pRRR4       V F/  pVP                  X4       V P                  P                  V4       K1  	  Kî  	  V P                  4        R# u upi   + '       g   i     L`; i)a   
Removes duplicate dequant nodes in the graph, for an operator that has
multiple dequant nodes as a user, replace them with a single dequant node
that can be shared across all the uses. This should be seen as the "reverse"
of `_duplicate_dequantize_node`.
rÁ   N)r/   ru   rv   rz   rD  r½   rk  rÂ   r±   r\   Úinserting_afterrm  r¥   Úreplace_all_uses_withro  rY  )r9  rp  r§   rq  Údq_usersr  Údq_users   &      r$   Ú_remove_extra_dequantizery    s  € ô �I‰I×*Ñ*×@Ñ@€EØ�W‰W�]Œ]ˆð Ÿšó
á�Ø�w‰w˜/Ñ)ô à.2¯k©k¸UÑ.B÷ ˆDÙð 	ð 
ô
 ˆx‹=˜1ÖØ—‘×(Ñ(¨°!­×5Õ5ØŸ7™7×.Ñ.Ø# U°Q­K×,<Ñ,<¸bó�÷ 6ó $�Ø×-Ñ-¨hÔ7Ø—‘×"Ñ" 7Ö+ó $ñ ð ‡K�K†Mùò
÷ 6×5ús   ÁD=Á$D=Á7D=Â;/EÅEc                ó0   € V ^8„  d   QhR\         R\         /# r
  r  )r#   s   "r$   r%   r%   3  s   € ÷ ñ ¬ð Äñ r&   c                óz  € V P                   VP                   8X  g   Q hV P                   \        P                  P                  P                  P
                  \        P                  P                  P                  P
                  39   d   ^pM‡V P                   \        P                  P                  P                  P
                  \        P                  P                  P                  P
                  39   d   ^pM\        RV P                    R24      hVP                  RV V P                  VR ,           Vn
        R# )zz
Given a pair of quantize or dequantize nodes, copy over all literal args
from the original node to the replacement node.
z)Expected quantize/dequantize nodes, got 'Ú'N)r±   r/   ru   rv   ry   r²   rz   rw   rx   r¦   r¥   )r  r  Ústart_copy_arg_indexs   && r$   Ú_copy_over_q_dq_argsr~  3  s  € ð ×ÑÐ#3×#:Ñ#:Ô:Ð:Ð:Ø×ÑÜ�	‰	×&Ñ&×:Ñ:×BÑBÜ�	‰	×&Ñ&×<Ñ<×DÑDð ô ð
  !ÑØ	×	Ñ	Ü�	‰	×&Ñ&×;Ñ;×CÑCÜ�	‰	×&Ñ&×=Ñ=×EÑEð"ô 
ð
  !ÑäØ7¸×8LÑ8LÐ7MÈQÐOó
ð 	
ð 	×ÑÐ3Ð3Ð4Ø
×
Ñ
Ð1Ð2Ð
3õ	4ð Ör&   c                ó0   € V ^8„  d   QhR\         R\         /# r8  r:  )r#   s   "r$   r%   r%   Q  s   € ÷ 5ñ 5œð 5¬ñ 5r&   c                 ó~  € \         P                  ! ^^^4      \         P                  ! ^^^4      \         P                  ! ^4      \         P                  ! ^4      \         P                  ! ^4      \         P                  ! ^4      3p\         P                  ! ^^^^4      \         P                  ! ^^^^4      \         P                  ! ^4      \         P                  ! ^4      \         P                  ! ^4      \         P                  ! ^4      3p\        ;QJ d0    R V P                  P                   4       F  '       g   K   RM%	  RM!! R V P                  P                   4       4      pV'       g   V # \         P
                  P                  4       '       d   RR.MR.pV Fs  p\        V \        P                  WR7      p \        V \        P                  W%R7      p \        V \        P                  WR7      p \        V \        P                  W%R7      p Ku  	  V P                  P                   FÞ  pVP                  \         P                  P                  P                   P"                  8X  g   KB  VP$                  ^ ,          P&                  R8X  g   Kf  VP$                  ^,          ^8X  g   K€  RVP(                  R,          P+                  4        UUu. uF  w  rxV^,          NK  	  upp9   g   KÃ  V P                  P-                  V4       Kà  	  V P                  P/                  4        V P1                  4        V # u uppi )rŽ   c              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir°   r=  r>  s   & r$   r  Ú$_fold_conv_bn_qat.<locals>.<genexpr>f  r@  rA  TFrB  Úget_attrz&torch.nn.modules.batchnorm.BatchNorm2drW  )r/   r3   rC  rD  r½   r7   rE  Ú_fold_conv_bn_qat_helperrM   rG  rH  rI  rJ  r±   ru   ÚatenÚadd_r6   r¥   rÂ   r  r4   ro  rX  rY  )	r9  Ú#_quantized_conv1d_bn_example_inputsÚ#_quantized_conv2d_bn_example_inputsrM  rN  r   r  rã   Úvals	   &        r$   Ú_fold_conv_bn_qatrŠ  Q  sA  € ô 	�Š�A�q˜!ÓÜ�Š�A�q˜!ÓÜ�Š�A‹Ü�Š�A‹Ü�Š�A‹Ü�Š�A‹ð+Ð'ô 	�Š�A�q˜!˜QÓÜ�Š�A�q˜!˜QÓÜ�Š�A‹Ü�Š�A‹Ü�Š�A‹Ü�Š�A‹ð+Ð'÷ ‹SÑ7¨¯©¯ªÓ7�S�SŠSÑ7¨¯©¯ªÓ7Ó7€FßØˆÜ',§z¡z×'>Ñ'>×'@Ò'@�t˜U‘mÀuÀg€OÛ"ˆÜ$ØŒq�x‰xÐ<ô
ˆô %ØŒq�x‰xÐ<ô
ˆô %ØŒq×!Ñ!Ð#Fô
ˆô %ØŒq×!Ñ!Ð#Fô
Šñ #ð —‘—”ˆà�K‰Kœ5Ÿ9™9Ÿ>™>×.Ñ.×5Ñ5Ö5Ø—	‘	˜!•—‘ :Ö-Ø—	‘	˜!• Ö!Ø8Ø%)§Y¡YÐ/@Õ%A×%GÑ%GÔ%IÔJÑ%I™6˜1��A—�Ñ%IÒJöKð �G‰G×Ñ˜tÖ$ñ ð ‡G�G×ÑÔ!Ø‡K�K„Mà€Hùó Ks   ËL9
c          
      ón   € V ^8„  d   QhR\         R\        R\        \        R3,          R\        R\         /# rQ  rS  )r#   s   "r$   r%   r%   ‰  sI   € ÷ _ñ _Üð_äð_ô œ#˜s˜(•Oð_ô ð	_ô
 ñ_r&   c           
     ó„  € V P                   P                  4        V P                  4        \        V 4       . p\        P
                  ! RR.RR.RR.RR.4      pV Fz  w  pppp	V'       g   V'       d   K  \        WgWƒ4      p
\        WgW�V	4      p\        VVV3/ V
B p\        WgW�V	4      p\        VVV3/ V
B pVP                  \        V VVRR7      4       K|  	  V P                  4        \        V 4       V EF  p\        V4      pVP                  4        F  w  ppVP                  Vn        K  	  \!        VR,          !   \!        VR,          !   RV9   d*   RV9   g   Q h\!        VR,          !   \!        VR,          !   RpVR	,          w  ppVR
,          w  ppVR,          w  ppRV9   d   VR,          w  pp\#        VVVVV 4       \%        VP&                  4      P                  4        F"  p\)        V4      '       g   K  \+        VV4       K$  	  EK  	  V P                   P                  4        V P                  4        V # )zf
Replace the quantized (conv + bn) pattern with conv with bn weights folded into the weights of conv.
TF)rV  rÒ   rÓ   rÕ   rÖ   NrÐ   rÑ   rD   r.   )rD  rX  rY  rr  Ú	itertoolsÚproductr;   r’   r   r›   Úextendr   ry  rù   r¤   r  r~  r   r×   r£   r   r  )r9  r>   rR  r   rØ   Úreplacement_optionsr   r   r   r‡   r8   r]  Úreplacement_patternr¹   Únode_mapr  r  r.   rã   rÅ   rÆ   rD   s   &&&&                  r$   r„  r„  ‰  sg  € ð ‡G�G×ÑÔ!Ø‡K�K„MÜ˜qÔ!ð €LÜ#×+Ò+Ø	ˆuˆØ	ˆuˆØ	ˆuˆØ	ˆuˆó	Ðó 
ñ	ØØØØ÷ ×-ÙÜ=ØÐ&7ó
ˆô ;ØÐ&7À.ó
ˆô ;ØØØñ
ð ñ	
ˆô HØÐ&7À.ó
Ðô AØØØñ
ð ñ	
Ðð 	×ÑÜ(ØØØ#Ø $ô	ö	
ñ5 
ðD ‡K�K„MÜ˜QÔäˆÜ-¨aÓ0ˆð 08¯©Ö/@Ñ+ˆMÐ+Ø$1×$6Ñ$6ÐÖ!ñ 0Aô 	˜h Õ7Ò8Ü˜hÐ'7Õ8Ò9Ø˜HÔ$Ø! XÔ-Ð-Ð-Ü  (¨=Õ"9Ò:Ü  (¨>Õ":Ò;ð ˆ	Ø! &Õ)‰ˆˆIØ •~‰ˆˆGØ# MÕ2ÑˆˆKØ˜(Ô"Ø% kÕ2‰NˆQ�	Ü& y°+¸yÈ'ÐSTÔUô /¨q¯{©{Ó;×BÑBÖDˆMÜ.¨}×=Ô=Ü,¨]¸IÖFô Eñ3 ð: ‡G�G×ÑÔ!Ø‡K�K„MØ€Hr&   )>rZ  r+  r�  rÃ   Útypingr   r   r   r   r/   Útorch.nn.functionalÚnnÚ
functionalrM   Ú$torch.ao.quantization.fx._decomposedr   Útorch.fxr   r	   r
   Útorch.fx.subgraph_rewriterr   r   Ú&torchao.quantization.pt2e.export_utilsr   Ú#torchao.quantization.pt2e.quantizerr   r   r   r   Útorchao.quantization.pt2e.utilsr   r   r   r   r   Ú6torch.fx.passes.utils.matcher_with_name_node_map_utilsr   Ú__all__r;   rQ   rj   rr   r„   r’   r›   r¨   r«   r´   r·   rù   r×   r  r  r6  rO  rF  rr  ry  r~  rŠ  r„  © r&   r$   Ú<module>r      sÚ   ðó Û Û Û ß 9Ó 9ã ß Ð Ý Iß -Ñ -ß Uå @÷ó ÷õ ÷ ÝTà
€õõ8+õ((/õV%<òPõ8A9õH3@õlNõ	Kõõõnõbõ&Aõ2Wõ@1Fõh(õVnõbõ@õ2õ<5÷p_r&   