+
    "Ý³j[à  ã            
       óR  € ^ 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
t
Ht ^ RIHtHtHtHt ^ RIHt ^ RIHtHt ^ RIHtHt ^ RIHtHt ^ R	IHt ^ R
IHtH t H!t!H"t"H#t# ^ RI$H%t%H&t&H't' ^ RI(H)t)H*t* ^ RI+H,t, ^ RI-H.t. ^ RI/H0t0 ^ RI1H2t2H3t3H4t4H5t5H6t6 ^ RI7H8t8 ^ RI9H:t:H;t;H<t< ^ RI=H>t> ^ RI?H@t@HAtA ^ RIBHCtC ^ RIDHEtE ^ RIFHGtG ^ RIHHItI ^ RIJHKtK ^ RILHMtM . R=OtN]Pž                  ]P                   ]P¢                  ]P¤                  ]P¦                  ]P¨                  ]Pª                  ]P¬                  ]P®                  ]P°                  .
tY]P´                  ]P¶                  P¸                  Pº                  P¼                  ]P¾                  ]P¶                  P¸                  PÀ                  P¼                  /taR R ltbR R ltcR>R R  lltdR>R! R" llteR# R$ ltfR% R& ltgR' R( lthR) R* ltiR+ R, ltjR- R. ltkR/ R0 ltlR1 R2 ltmR3 R4 ltnR?R5 R6 lltoR@R7 R8 lltpRAR9 R: lltqRBR; R< lltrR# )Cé    N)ÚAnyÚCallableÚOptionalÚUnion)ÚBackendConfigÚget_native_backend_config)Úget_fused_module_classesÚget_pattern_to_dtype_configsÚget_qat_module_classesÚ-get_root_module_to_quantized_reference_module)Úquantized_decomposed_lib)Úconvert_eq_obsÚupdate_obs_for_equalization)ÚConvertCustomConfigÚPrepareCustomConfig)Ú_is_observed_moduleÚ_is_observed_standalone_module)Úlower_to_fbgemm)Ú)_compare_prepare_convert_qconfig_mappingsÚ_generate_node_name_to_qconfigÚ&_is_qconfig_supported_by_dtype_configsÚ_update_qconfig_for_fusionÚ_update_qconfig_for_qat)Ú_get_moduleÚ graph_module_from_producer_nodesÚnode_arg_is_weight)Ú
QConfigAnyÚqconfig_equals)ÚQConfigMapping)Ú_remove_qconfig)ÚDeQuantStub)Ú_parent_nameÚget_qparam_dictÚis_per_channelÚto_underlying_dtypeÚweight_is_quantized)ÚGraphModule)ÚArgumentÚGraphÚNode)Ú_USER_PRESERVED_ATTRIBUTES_KEY)Ú
NodeSourceÚNodeSourceAction)Útype_before_parametrizations)ÚFROM_NODE_KEY)Úcollect_producer_nodes)Ú_is_activation_post_process)Úcreate_getattr_from_value)Ú_assert_and_get_unique_devicec                ó    € V ^8„  d   QhR\         \        \        P                  P                  3,          R\
        \        \        3,          RR/# )é   ÚmodelÚpreserved_attrsÚreturnN)r   r'   ÚtorchÚnnÚModuleÚdictÚstrr   )Úformats   "Úb/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torchao/quantization/pt2e/convert.pyÚ__annotate__r@   g   s@   € ÷ 	(ñ 	(Ü”œeŸh™hŸo™oÐ-Õ.ð	(äœ#œs˜(•^ð	(ð 
ñ	(ó    c                óÈ   € \         P                   ! V4      V P                  \        &   V P                  \        ,          P                  4        F  w  r#\	        WV4       K  	  R# )zXStore preserved attributes to the model.meta so that it can be preserved during deepcopyN)ÚcopyÚmetar+   ÚitemsÚsetattr)r6   r7   Ú	attr_nameÚattrs   &&  r?   Úattach_preserved_attrs_to_modelrI   g   sH   € ô
 26·²¸?Ó1K€E‡J�JÔ-Ñ.ð !Ÿ:™:Ô&DÕE×KÑKÖM‰ˆ	Ü� $Ö'ó NrA   c                óP   € V ^8„  d   QhR\         P                  P                  RR/# )r5   r6   r8   N)r9   r:   r;   )r>   s   "r?   r@   r@   s   s"   € ÷ 
ñ 
¤%§(¡(§/¡/ð 
°dñ 
rA   c                 ó–   € \        V \        4      '       g3   \        R\        \	        V 4      4      ,           R,           R,           4      hR# )z#input model must be a GraphModule, z Please make zsure to follow the tutorials.Nz,input model must be a GraphModule, Got type:)Ú
isinstancer'   Ú
ValueErrorr=   Útype)r6   s   &r?   Ú_check_is_graph_modulerO   s   sK   € Ü�eœ[×)Ò)Üðä”$�u“+Óõð õð .õ	.ó
ð 	
ñ *rA   c                óf  € V ^8„  d   QhR\         P                  P                  R\        R\        \
        \         P                  P                  3,          R\        \
        \        \
        \        3,          3,          R\        \
        \        3,          R\        \         P                  ,          RR/# ©	r5   r6   ÚnodeÚmodulesÚnode_name_to_scopeÚnode_name_to_qconfigÚmodel_devicer8   N©r9   Úfxr'   r*   r<   r=   r:   r;   ÚtuplerN   r   r   Údevice)r>   s   "r?   r@   r@   ~   s˜   € ÷ P#ñ P#Ü�8‰8×ÑðP#ä
ðP#ô ”#”u—x‘x—‘Ð&Õ'ðP#ô œS¤%¬¬T¨	Õ"2Ð2Õ3ð	P#ô
 œs¤J˜Õ/ðP#ô œ5Ÿ<™<Õ(ðP#ð 
ñP#rA   c                ó
  a€ V P                   pVf   Q h\        VP                  \        4      '       g   Q h\	        WS4      w  rxW!P                  ,          p	\        V	R4      '       d   V	P                  W4       R# \        ;QJ dZ    V3R l\        VP                  4      \        VP                  P                  4       4      ,            4       F  '       d   K   RMO	  RMK! V3R l\        VP                  4      \        VP                  P                  4       4      ,            4       4      p
V
'       g   \        V	4      '       gX   VP                  V4      ;_uu_ 4        VP                  VP                  ^ ,          4       VP                  V4       RRR4       R# V	P                   pRp\        V	R4      '       d   V	P"                  pR pR pV\$        9   Ed¼   V'       Eg³   R	pRpV	P'                  4       w  pp\)        V	P*                  4      '       d¤   \-        V	P.                  4      p\0        P2                  P4                  P6                  P8                  p\0        P2                  P4                  P:                  P8                  pV	P<                  pV	P>                  p\A        V4      pR
VRVRVRVRVRV/pM¡\0        P2                  P4                  PB                  P8                  p\0        P2                  P4                  PD                  P8                  p\G        V4      p\-        V4      pV	P<                  pV	P>                  p\A        V4      pR
VRVRVRVRV/pVP                  V4      ;_uu_ 4        VP                  ^ ,          pV.pVPI                  4        Fi  w  ppVR9   dL   \        V\F        \,        34      '       g0   \K        V VWx,           V,           VV4      pVPM                  V4       KX  VPM                  V4       Kk  	  VPO                  VV\Q        V4      / 4      pV! VV4       V.VR,          ,           pVPS                  V\Q        V4      V! VV4      4      p VP                  V 4       V! V V4       VP                  V4       RRR4       R# V'       Ed   R	p\0        P2                  P4                  PB                  PT                  p\A        V4      pV\0        PV                  \0        PX                  39   g   Q R4       hV	P<                  pV	P>                  p\[        V	R\0        P\                  4      p!\[        V	R\0        P^                  ! \0        P`                  4      Pb                  4      p"RVRVRV"RV/p\d        V!,          p#VP                  V4      ;_uu_ 4        VP                  ^ ,          pVP                  ^ ,          .p$VPI                  4        F  w  pp%V$PM                  V%4       K  	  VPO                  R	V#\Q        V$4      / 4      p&VPO                  R	\f        Ph                  V&^ 3/ 4      p'VPO                  R	\f        Ph                  V&^3/ 4      p(VR,          pVR,          pVR,          pR
V'RV(RVRVRV/pRRR4       VP                  V4      ;_uu_ 4        VP                  ^ ,          pV.pVPI                  4        F3  w  ppVR9   d   TpVPM                  V4       K"  VPM                  V4       K5  	  VPO                  VV\Q        V4      / 4      pV! VV4       V.VR,          ,           p\0        P2                  P4                  PD                  PT                  pVPS                  V\Q        V4      V! VV4      4      p VP                  V 4       V! V V4       VP                  V4       RRR4       R# V\0        Pj                  8X  dÐ   \0        P2                  P4                  Pl                  Pn                  p)VP                  V4      ;_uu_ 4        VP                  ^ ,          pVPO                  R	V)V\0        Pj                  3/ 4      p*VPO                  R	V)V*\0        PF                  3/ 4      p+VP                  V+4       VP                  V4       RRR4       R# R#   + '       g   i     R# ; i  + '       g   i     R# ; i  + '       g   i     ELS; i  + '       g   i     R# ; i  + '       g   i     R# ; i)aU  Replace activation_post_process module call node with quantize and
dequantize node working with decomposed Tensor

Before:
... -> observer_0(x) -> ...
After:
... -> torch.ops.quantized_decomposed.quantize_per_tensor(x, ...) ->
torch.ops.quantized_decomposed.dequantize_per_tensor() -> ...

or quantize_per_channel and dequantize_per_channel
NÚconvertc              3   ó<   <"  € T F  p\        VS4      x € K  	  R # 5i©N©Ú_has_none_qconfig©Ú.0ÚnrU   s   & €r?   Ú	<genexpr>ÚM_replace_observer_with_quantize_dequantize_node_decomposed.<locals>.<genexpr>�   ó#   øé € ð á:ˆAô 	˜!Ð1×2Ð2Û:ùó   ƒFTÚ
is_dynamicc                 ó˜   € / pR VP                   9   d7   VP                   R ,          P                  pV\        P                  8w  d   RV/pV# )ÚvalÚ	out_dtype)rD   Údtyper9   Úfloat32)Údequantize_opÚ
input_nodeÚdequantize_op_kwargsÚdq_out_dtypes   &&  r?   Úadd_dequantize_op_kwargsÚ\_replace_observer_with_quantize_dequantize_node_decomposed.<locals>.add_dequantize_op_kwargs³   sE   € Ø!ÐØ�J—O‘OÔ#Ø%Ÿ?™?¨5Õ1×7Ñ7ˆLØœuŸ}™}Ô,Ø(3°\Ð'BÐ$Ø#Ð#rA   c                 ób   € \        VR \        P                  .4      .V P                  \        &   R# )Ú.replace_observer_with_quantize_dequantize_nodeN)r,   r-   ÚCREATErD   r/   )Úqdq_nodeÚoriginal_nodes   &&r?   Ú!add_quantize_dequantize_node_infoÚe_replace_observer_with_quantize_dequantize_node_decomposed.<locals>.add_quantize_dequantize_node_info»   s.   € ô ØØ@Ü!×(Ñ(Ð)óð(
ˆ�‰”mÓ$rA   Úcall_functionÚ_scale_Ú_zero_point_Ú_axis_Ú_quant_min_Ú_quant_max_Ú_dtype_:é   NNzVonly uint8 and int8 are supported in reference flow for dynamic quantization right nowÚqschemeÚepsÚ_eps_©r|   r}   )8ÚgraphrL   Útargetr=   Ú_get_module_path_and_prefixÚhasattrr\   ÚallÚlistÚargsÚusersÚkeysÚ_is_conversion_supportedÚinserting_beforeÚreplace_all_uses_withÚ
erase_noderl   rh   ÚSUPPORTED_QDTYPESÚcalculate_qparamsr$   rƒ   ÚintÚch_axisr9   ÚopsÚquantized_decomposedÚquantize_per_channelÚdefaultÚdequantize_per_channelÚ	quant_minÚ	quant_maxr%   Úquantize_per_tensorÚdequantize_per_tensorÚfloatrE   r2   ÚappendÚcreate_noderY   r{   ÚtensorÚuint8Úint8ÚgetattrÚper_tensor_affineÚfinform   r„   Ú_QSCHEME_TO_CHOOSE_QPARAMS_OPÚoperatorÚgetitemÚfloat16Úconvert_element_typeÚno_fuse),r6   rR   rS   rT   rU   rV   r‡   Úmodule_pathÚprefixÚactivation_post_processÚskip_replacementrl   rh   rr   ry   Ú	node_typeÚquantize_opÚscaleÚ
zero_pointr—   rn   r�   rž   Údtype_Úqparamsro   Úquantize_op_inputsÚkeyÚvalue_or_nodeÚqparam_nodeÚquantized_nodeÚ	dq_inputsÚdequantized_noderƒ   r„   Úchoose_qparams_opÚchoose_qparams_op_inputsÚvalueÚchoose_qparams_nodeÚ
scale_nodeÚzero_point_nodeÚdtype_convert_opÚconvert_fp16_nodeÚconvert_fp32_nodes,   &&&&f&                                      r?   Ú:_replace_observer_with_quantize_dequantize_node_decomposedrÊ   ~   sü  ø€ ð& �K‰K€EØÒÐÐÜ�d—k‘k¤3×'Ò'Ð'Ð'Ü5ØÐ"6óÑ€Kð &§k¡kÕ2ÐÜÐ&¨	×2Ò2Ø×'Ñ'¨Ô4Ù÷ “sô ä�d—i‘i“¤4¨¯
©
¯©Ó(9Ó#:Ö:ó—s—s’sô ä�d—i‘i“¤4¨¯
©
¯©Ó(9Ó#:Ö:óó Ð÷ Ô7Ð8O×PÒPð ×#Ñ# D×)Õ)Ø×&Ñ& t§y¡y°¥|Ô4Ø×Ñ˜TÔ"÷ *ñ 	ð $×)Ñ)€Eà€JÜÐ&¨×5Ò5Ø,×7Ñ7ˆ
ò$ò
ð Ô!Õ!¯:¨:ð $ˆ	Ø*.ˆØ3×EÑEÓGÑˆˆzÜÐ1×9Ñ9×:Ò:ÜÐ1×9Ñ9Ó:ˆGÜŸ)™)×8Ñ8×MÑM×UÑUˆKä—	‘	×.Ñ.×EÑE×MÑMð ð 0×9Ñ9ˆIØ/×9Ñ9ˆIÜ(¨Ó/ˆFà˜5Ø 
Ø˜'Ø˜yØ˜yØ˜6ð‰Gô  Ÿ)™)×8Ñ8×LÑL×TÑTˆKÜ!ŸI™I×:Ñ:×PÑP×XÑXˆMÜ˜%“LˆEÜ˜Z›ˆJØ/×9Ñ9ˆIØ/×9Ñ9ˆIÜ(¨Ó/ˆFà˜5Ø 
Ø˜yØ˜yØ˜6ðˆGð ×#Ñ# D×)Õ)ØŸ™ 1�ˆJØ", ÐØ&-§m¡m¦oÑ"��]ð Ð5Ô5Ü" =´5¼#°,×?Ò?ô #<ØØØ#Õ,¨sÕ2Ø%Ø$ó#�Kð '×-Ñ-¨kÖ:ð '×-Ñ-¨mÖ<ñ1 '6ð4 #×.Ñ.Ø˜;¬Ð.@Ó(AÀ2óˆNñ .¨n¸dÔCð (Ð(Ð+=¸bÕ+AÕAˆIØ$×2Ñ2ØÜ�iÓ Ù(¨¸
ÓCó Ðð ×&Ñ&Ð'7Ô8á-Ð.>ÀÔEØ×Ñ˜TÔ"÷[ *Ñ)÷\ 
ˆð $ˆ	Ü—i‘i×4Ñ4×HÑH×OÑOˆô
 % UÓ+ˆØœ%Ÿ+™+¤u§z¡zÐ2Ô2ð 	
ð-ó	
Ð2ð ,×5Ñ5ˆ	Ø+×5Ñ5ˆ	ÜÐ1°9¼e×>UÑ>UÓVˆÜÐ-¨u´e·k²kÄ%Ç-Á-Ó6P×6TÑ6TÓUˆð
 ˜9Ø˜9Ø�SØ�vð	
ˆô :¸'ÕBÐà×#Ñ# D×)Õ)ØŸ™ 1�ˆJØ(,¯	©	°!­ ~Ð$Ø%Ÿm™mžo‘
��Uð )×/Ñ/°Ö6ñ .ð #(×"3Ñ"3ØÐ!2´EÐ:RÓ4SÐUWó#Ðð ×*Ñ*Ø¤×!1Ñ!1Ð4GÈÐ3KÈRóˆJð $×/Ñ/Ø¤×!1Ñ!1Ð4GÈÐ3KÈRóˆOð   Õ.ˆIØ Õ.ˆIØ˜IÕ&ˆEà˜:Ø Ø˜yØ˜yØ˜5ðˆG÷) *ð: ×#Ñ# D×)Õ)ØŸ™ 1�ˆJØ", ÐØ&-§m¡m¦oÑ"��]ð Ð5Ô5ð #0�KØ&×-Ñ-¨kÖ:ð '×-Ñ-¨mÖ<ñ '6ð #×.Ñ.Ø˜;¬Ð.@Ó(AÀ2óˆNñ .¨n¸dÔCð (Ð(Ð+=¸bÕ+AÕAˆIô "ŸI™I×:Ñ:×PÑP×WÑWˆMØ$×2Ñ2ØÜ�iÓ Ù(¨¸
ÓCó Ðð ×&Ñ&Ð'7Ô8á-Ð.>ÀÔEà×Ñ˜TÔ"÷M *Ñ)ðN 
”%—-‘-Ô	ä Ÿ9™9×9Ñ9×NÑN×VÑVÐØ×#Ñ# D×)Õ)ØŸ™ 1�ˆJØ %× 1Ñ 1ØÐ!1°JÄÇÁÐ3NÐPRó!Ðð !&× 1Ñ 1ØÐ!1Ð4EÄuÇ{Á{Ð3SÐUWó!Ðð ×&Ñ&Ð'8Ô9Ø×Ñ˜TÔ"÷ *Ñ)ñ 
 ÷} *Ö)ñ 	ú÷T *×)Ð)ú÷Z *×)Ð)ú÷: *×)Ð)ú÷T *×)Ð)ús@   Å4b!Í1Db5Ö Cc	Ú DcàA>c1â!b2	â5c	ã	c	ãc.	ã1d	c                óf  € V ^8„  d   QhR\         P                  P                  R\        R\        \
        \         P                  P                  3,          R\        \
        \        \
        \        3,          3,          R\        \
        \        3,          R\        \         P                  ,          RR/# rQ   rW   )r>   s   "r?   r@   r@   ”  s˜   € ÷ O#ñ O#Ü�8‰8×ÑðO#ä
ðO#ô ”#”u—x‘x—‘Ð&Õ'ðO#ô œS¤%¬¬T¨	Õ"2Ð2Õ3ð	O#ô
 œs¤J˜Õ/ðO#ô œ5Ÿ<™<Õ(ðO#ð 
ñO#rA   c           
     ó>  a€ Vf   Q h\        VP                  \        4      '       g   Q hV P                  p\	        WS4      w  rxW!P                  ,          p	\
        ;QJ dZ    V3R l\        VP                  4      \        VP                  P                  4       4      ,            4       F  '       d   K   RMO	  RMK! V3R l\        VP                  4      \        VP                  P                  4       4      ,            4       4      p
V
'       g   \        V	4      '       gX   VP                  V4      ;_uu_ 4        VP                  VP                  ^ ,          4       VP                  V4       RRR4       R# V	P                  pRp\        V	R4      '       d   V	P                   pV\"        P$                  \"        P&                  \"        P(                  \"        P*                  \"        P,                  39   Ed‡   V'       Eg~   RpRpV	P/                  4       w  pp\1        V	P2                  4      '       d1   \5        V	P6                  4      pRVRVR	VR
V/p\"        P8                  pM.\;        V4      p\5        V4      pRVRVR
V/p\"        P<                  pVP                  V4      ;_uu_ 4        VP                  ^ ,          pV.pVP?                  4        FM  w  ppVR9   d0   \A        V VWx,           V,           VV4      pVPC                  V4       K<  VPC                  V4       KO  	  VPE                  WÞ\G        V4      / 4      pVPI                  RV3R7      pVP                  V4       VP                  V4       RRR4       R# V'       d÷   Rp\"        PJ                  p\"        PL                  PN                  PP                  R9   pR
VRV/pVP                  V4      ;_uu_ 4        VP                  ^ ,          pV.pVP?                  4        F  w  ppVPC                  V4       K  	  VPE                  WÞ\G        V4      / 4      pVPI                  RV3R7      pVP                  V4       VP                  V4       RRR4       R# V\"        PR                  8X  dÀ   RpRpR
V/pVP                  V4      ;_uu_ 4        VP                  ^ ,          pV.pVP?                  4        F  w  ppVPC                  V4       K  	  VPE                  WÞ\G        V4      / 4      pVPI                  RV3R7      pVP                  V4       VP                  V4       RRR4       R# R#   + '       g   i     R# ; i  + '       g   i     R# ; i  + '       g   i     R# ; i  + '       g   i     R# ; i)zÁReplace activation_post_process module call node with quantize and
dequantize node

Before:
... -> observer_0(x) -> ...
After:
... -> torch.quantize_per_tensor(x, ...) -> x.dequantize() -> ...
Nc              3   ó<   <"  € T F  p\        VS4      x € K  	  R # 5ir^   r_   ra   s   & €r?   rd   ÚB_replace_observer_with_quantize_dequantize_node.<locals>.<genexpr>­  rf   rg   FTrh   r{   r|   r}   r~   r�   Ú
dequantize)r�   Ú_reduce_range_Úcall_methodÚtor†   )ÚfbgemmÚx86)*rL   rˆ   r=   r‡   r‰   r‹   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   rl   rŠ   rh   r9   Úquint8Úqint8Úqint32Úfloat8_e5m2Úfloat8_e4m3fnr•   r$   rƒ   r–   r—   rš   r¡   rŸ   rE   r2   r¢   r£   rY   rÑ   Úquantize_per_tensor_dynamicÚbackendsÚ	quantizedÚenginer­   )r6   rR   rS   rT   rU   rV   r‡   r°   r±   r²   r³   rl   rh   r´   rµ   r¶   r·   r—   r¹   ro   rº   r»   r¼   r½   r¾   rÀ   Úreduce_rangerÃ   s   &&&&f&                      r?   Ú/_replace_observer_with_quantize_dequantize_noderß   ”  sç  ø€ ð  ÒÐÐÜ�d—k‘k¤3×'Ò'Ð'Ð'Ø�K‰K€EÜ5ØÐ"6óÑ€Kð &§k¡kÕ2Ð÷ “sô ä�d—i‘i“¤4¨¯
©
¯©Ó(9Ó#:Ö:ó—s—s’sô ä�d—i‘i“¤4¨¯
©
¯©Ó(9Ó#:Ö:óó Ð÷ Ô7Ð8O×PÒPð ×#Ñ# D×)Õ)Ø×&Ñ& t§y¡y°¥|Ô4Ø×Ñ˜TÔ"÷ *ñ 	ð $×)Ñ)€Eà€JÜÐ&¨×5Ò5Ø,×7Ñ7ˆ
àÜ�‰Ü�‰Ü�‰Ü×ÑÜ×Ñðõ ÷ ˆzð $ˆ	Ø*.ˆØ3×EÑEÓGÑˆˆzÜÐ1×9Ñ9×:Ò:ÜÐ1×9Ñ9Ó:ˆGà˜5Ø 
Ø˜'Ø˜5ð	ˆGô  ×4Ñ4‰Kä˜%“LˆEÜ˜Z›ˆJØ  %¨¸ÀYÐPUÐVˆGÜ×3Ñ3ˆKð ×#Ñ# D×)Õ)ØŸ™ 1�ˆJØ", ÐØ&-§m¡m¦oÑ"��]ð Ð5Ô5ô #<ØØØ#Õ,¨sÕ2Ø%Ø$ó#�Kð '×-Ñ-¨kÖ:ð '×-Ñ-¨mÖ<ñ! '6ð$ #×.Ñ.Ø¬Ð.@Ó(AÀ2óˆNð  %×0Ñ0°À^ÐDUÐ0ÓVÐØ×&Ñ&Ð'7Ô8Ø×Ñ˜TÔ"÷5 *Ñ)÷6 
ð $ˆ	Ü×7Ñ7ˆô —~‘~×/Ñ/×6Ñ6Ð:KÑKˆØ˜eÐ%5°|ÐDˆà×#Ñ# D×)Õ)ØŸ™ 1�ˆJØ", ÐØ%Ÿm™mžo‘
��UØ"×)Ñ)¨%Ö0ñ .ð #×.Ñ.Ø¬Ð.@Ó(AÀ2óˆNð  %×0Ñ0°À^ÐDUÐ0ÓVÐØ×&Ñ&Ð'7Ô8Ø×Ñ˜TÔ"÷ *Ñ)ð 
”%—-‘-Ô	Ø!ˆ	ØˆØ˜eÐ$ˆØ×#Ñ# D×)Õ)ØŸ™ 1�ˆJØ", ÐØ%Ÿm™mžo‘
��Uð #×)Ñ)¨%Ö0ñ .ð
 #×.Ñ.Ø¬Ð.@Ó(AÀ2óˆNð  %×0Ñ0°À^ÐDUÐ0ÓVÐØ×&Ñ&Ð'7Ô8Ø×Ñ˜TÔ"÷ *Ñ)ñ	 
 ÷} *Ö)ñ 	ú÷T *×)Ð)ú÷J *×)Ð)ú÷  *×)Ð)ús3   Ä84UÊ'C
U#ÏBU7Ò/BVÕU 	Õ#U4	Õ7V	ÖV	c                ó4   € V ^8„  d   QhR\         R\        RR/# ©r5   rR   r‡   r8   N©r*   r)   )r>   s   "r?   r@   r@   .  s$   € ÷ 	<ñ 	<Ü
ð	<Üð	<à	ñ	<rA   c                 óÆ   € V P                   ^ ,          p\        V\        4      '       g   Q RV 24       hV P                  V4       VP	                  V 4       \        W!4       R# )r   z@Expecting the for call custom module node to be a Node, but got N)r�   rL   r*   r’   r“   Ú_insert_dequantize_node)rR   r‡   Úcall_custom_module_nodes   && r?   Ú6_replace_observer_or_dequant_stub_with_dequantize_noderæ   .  sa   € ð #Ÿi™i¨�lÐÜÐ-¬t×4Ò4ð Ø
JÐKbÐJcÐdóÐ4ð 	×ÑÐ6Ô7Ø	×Ñ�TÔÜÐ3Ö;rA   c                óX   € V ^8„  d   QhR\         P                  P                  R\        /# )r5   r²   r8   )r9   r:   r;   Úbool)r>   s   "r?   r@   r@   :  s"   € ÷ ñ ´e·h±h·o±oð Ì$ñ rA   c                 óÔ   € V P                   pR p\        V R4      '       d   V P                  pV\        9   ;'       d    V'       * ;'       g    T;'       g    V\        P
                  8H  # )Frh   )rl   rŠ   rh   r”   r9   r­   )r²   rl   rh   s   &  r?   r�   r�   :  sh   € Ø#×)Ñ)€Eà€JÜÐ&¨×5Ò5Ø,×7Ñ7ˆ
ð 
Ô#Ñ	#×	8Ð	8¨Z¬÷ 	"ð 	"Ø÷	"ð 	"à”E—M‘MÑ!ðrA   c                ó^   € V ^8„  d   QhR\         R\        \        \        3,          R\        /# )r5   rR   rU   r8   )r(   r<   r=   r   rè   )r>   s   "r?   r@   r@   H  s-   € ÷ 
ñ 
Ü
ð
Ü*.¬s´J¨Õ*?ð
ä	ñ
rA   c                óˆ   € \        V \        4      ;'       d,    V P                  V9   ;'       d    WP                  ,          RJ # )zTCheck if a node has a qconfig of None, i.e. user requested to not quantize
the node
N)rL   r*   Úname)rR   rU   s   &&r?   r`   r`   H  sC   € ô 	�4œÓ÷ 	4ð 	4Ø�I‰IÐ-Ñ-÷	4ð 	4à §¡Õ+¨tÐ3ðrA   c                ó4   € V ^8„  d   QhR\         R\        RR/# )r5   ÚobservedÚbackend_configr8   N)r'   r   )r>   s   "r?   r@   r@   U  s"   € ÷ )ñ )¤Kð )Äð )ÐSWñ )rA   c                ó  € V P                   P                   Fi  pVP                  R8w  d   K  VP                   FC  pV'       g   K  \	        W#4      '       g   K   \        V4      pVf   K1  \        W4      pV! 4        KE  	  Kk  	  R# )zéExtract the subgraph that produces the weight for dynamic quant
or weight only quant node and run the subgraph to observe the weight.
Note that the observers of dynamic quant or weight only quant ops are
run during the convert step.
r{   N)r‡   ÚnodesÚopr�   r   r0   r   )rî   rï   rR   Únode_argÚweight_observer_nodesÚweight_observer_modules   &&    r?   Ú_run_weight_observersrö   U  so   € ð —‘×$Ô$ˆØ�7‰7�oÔ%ÙØŸ	œ	ˆHç‰xÔ.¨t×>Ô>Ü(>¸xÓ(HÐ%Ø(Ò0ÙÜ)IØó*Ð&ñ 'Ö(ó "ó %rA   c                ó@   € V ^8„  d   QhR\         R\        R\        RR/# )r5   ÚargrR   r‡   r8   N)r   r*   r)   )r>   s   "r?   r@   r@   k  s(   € ÷ 
ñ 
¬Cð 
´tð 
ÄEð 
Èdñ 
rA   c                óâ  € \        V \        4      '       dI   V P                  R8X  d8   V P                  R8X  d'   V P                  ^ ,          pVP                  W4       R# \        V \        \        34      '       d   V  F  p\        WAV4       K  	  R# \        V \        4      '       d&   V P                  4        F  p\        WAV4       K  	  R# \        P                  ! R\        V 4       24       R# )zwIf the arg is a dequantize Node, or a list/tuple/dict of dequantize Node,
we'll recursively remove the dequantize Node
rÑ   rÏ   z6Unsupported node type in recursive remove dequantize: N)rL   r*   rò   rˆ   r�   Úreplace_input_withrŒ   rY   Ú"_maybe_recursive_remove_dequantizer<   ÚvaluesÚwarningsÚwarnrN   )rø   rR   r‡   Úquantize_nodeÚarg_elements   &&&  r?   rû   rû   k  s¬   € ô �#”t×Ò §¡¨=Ô!8¸S¿Z¹ZÈ<Ô=WØŸ™ �ˆð 	×Ñ Ö3Ü	�Cœ$¤˜×	'Ò	'ÛˆKÜ.¨{À%ÖHó ä	�Cœ×	Ò	ØŸ:™:ž<ˆKÜ.¨{À%ÖHó (ô 	�ŠØDÄTÈ#ÃYÀKÐPö	
rA   c          
      óÐ   € V ^8„  d   QhR\         R\        \        \        \        \        3,          3,          R\        \        \
        3,          R\        \        \        3,          /# )r5   Úobs_noderT   rU   r8   )r*   r<   r=   rY   rN   r   )r>   s   "r?   r@   r@   €  sT   € ÷ 6ñ 6Üð6äœS¤%¬¬T¨	Õ"2Ð2Õ3ð6ô œs¤J˜Õ/ð6ô Œ3”ˆ8…_ñ	6rA   c                óL  € V P                   ^ ,          p\        V\        4      '       g   Q RV 24       hVP                  V9   d   W#P                  ,          RJ MRpV'       d‹   \	        V P
                  4      pV'       d
   V^ ,          MRpRpV FM  pVP                  R8X  g   K  VP                  \        P                  P                  P                  8X  g   KK  Tp M	  V'       d   TpRp	MTpRp	V'       d)   VP                  V9   d   WP                  ,          w  r«W©3# Rp
W©3# )aQ  Given and observer node, get the `Scope` or the fully qualified name for
the submodule containing the observed node, also return a prefix of "_input"
when the observed node is an input of a F.linear op, and not the output of another
quantized op.
TODO: this logic is hacky, we should think about how to remove it or make it more
general
z.Expecting observed node to be a Node, but got Nr{   Ú_inputÚ )r�   rL   r*   rì   rŒ   rŽ   rò   rˆ   r9   r:   Ú
functionalÚlinear)r  rT   rU   Úobserved_nodeÚis_input_observer_onlyrŽ   Úfirst_linear_use_or_first_useÚlinear_noderc   r±   r°   Ú_s   &&&         r?   r‰   r‰   €  s!  € ð —M‘M !Õ$€Mô
 �m¤T×*Ò*ð Ø
8¸¸ÐHóÐ*ð
 ×ÑÐ!5Ô5ð 	×/Ñ/Õ0°DÑ8àð ÷
 ô �X—^‘^Ó$ˆß49¨¨a®¸tÐ%ØˆÛˆAØ�t‰t�Ö&¨1¯8©8´u·x±x×7JÑ7J×7QÑ7QÖ+QØ�Ùñ ÷ Ø,7Ð)Ø‰ð )6Ð%Øˆ÷ 	&Ø)×.Ñ.Ð2DÔDà+×,NÑ,NÕO‰ˆð ÐÐð ˆØÐÐrA   c                ó4   € V ^8„  d   QhR\         R\        RR/# rá   râ   )r>   s   "r?   r@   r@   ¹  s&   € ÷ Dñ D¤$ð D¬uð D¸ñ DrA   c                ó   € VP                  V 4      ;_uu_ 4        VP                  RV 34      p\        V P                  4       F  pW2Jg   K
  VP	                  W4       K  	  RRR4       R#   + '       g   i     R# ; i)z-Inserts dequantize node for `node` in `graph`rÏ   N)Úinserting_afterrÑ   r<   rŽ   rú   )rR   r‡   Údequantize_nodeÚ	user_nodes   &&  r?   rä   rä   ¹  s]   € à	×	Ñ	˜t×	$Õ	$Ø×+Ñ+¨L¸4¸'ÓBˆÜ˜dŸj™jÖ)ˆIØÕ/Ø×,Ñ,¨TÖCñ *÷ 
%×	$×	$Ò	$ús   š.A,ÁA,Á,A=	c                óÄ   € V ^8„  d   QhR\         R\        \        \        P                  P
                  3,          R\        \        P                  P
                  ,          /# )r5   rR   rS   r8   )r*   r<   r=   r9   r:   r;   r   )r>   s   "r?   r@   r@   Â  sC   € ÷ ñ Ü
ðÜœc¤5§8¡8§?¡?Ð2Õ3ðäŒe�h‰h�o‰oÕñrA   c                óÐ   € V P                   P                  4        FG  pVP                  R8X  g   K  V\        VP                  4      ,          p\        V4      '       g   KE  Vu # 	  R# )zP
If the node is observed, return the observer
instance. Otherwise, return None.
Úcall_moduleN)rŽ   r�   rò   r=   rˆ   r1   )rR   rS   Úmaybe_obs_nodeÚ	maybe_obss   &&  r?   Ú_maybe_get_observer_for_noder  Â  sR   € ð Ÿ*™*Ÿ/™/Ö+ˆØ×Ñ Ö-Ø¤ N×$9Ñ$9Ó :Õ;ˆIÜ*¨9×5Ô5Ø Ò ñ	 ,ñ
 rA   c                óà   € V ^8„  d   QhR\         R\        \        \        P                  P
                  3,          R\        P                  P                  R\        R\        \        ,          RR/# )r5   rR   rS   r6   Úis_referencerï   r8   N)r*   r<   r=   r9   r:   r;   rX   r'   rè   r   r   )r>   s   "r?   r@   r@   Ñ  se   € ÷ =<ñ =<Ü
ð=<ä”#”u—x‘x—‘Ð&Õ'ð=<ô �8‰8×Ñð=<ô ð	=<ô
 œ]Õ+ð=<ð 
ñ=<rA   c                ó  € V'       d0   \         P                  P                  P                  P                  pM.\         P                  P                  P                  P
                  pV\        V P                  4      ,          pVP                  R,          P                  p\        V P                  4      p\        \        V4      4       F”  p	W—9   g   K  W‰,          p
V
P                  R8X  g   K&  V
P                  R8X  g   K9  V
P                  ^ ,          pV P                  W«4       \        V
P                   4      ^ 8X  g   Ky  VP"                  P%                  V
4       K–  	  VP                  R,          P&                  p\        V4      ^ 8”  d,   V^ ,          ^ 8X  g   Q R4       h \)        WP"                  4       V! WdR7      p\+        V P                  4      w  rï\-        W,          Wý4       WÑ\        V P                  4      &   R# )a|  Converts a observed standalone module to a quantized standalone module by calling
the fx convert api, currently using the same `is_reference` flag as parent, but we may
changing this behavior in the future (e.g. separating quantization and lowering for
standalone module as well)

Args:
  - node: The call_module node of the observed standalone module
  - modules: named_module of original model
  - model: original model
  - is_reference: a flag from parent provided by user to decide if we want to
    produce a reference model or a fbgemm/qnnpack model
  - backend_config: backend configuration of the target backend of quantization
Ú_observed_graph_module_attrsrÑ   rÏ   zCurrently only quantized)rï   N)r9   ÚaoÚquantizationÚquantize_fxÚconvert_to_reference_fxÚ
convert_fxr=   rˆ   rD   Ú&standalone_module_input_quantized_idxsrŒ   r�   ÚrangeÚlenrò   rú   rŽ   r‡   r“   Ú'standalone_module_output_quantized_idxsrä   r"   rF   )rR   rS   r6   r  rï   Ú
convert_fnÚobserved_standalone_moduleÚsm_input_quantized_idxsr�   Úidxrø   rÿ   Úsm_output_quantized_idxsÚquantized_standalone_moduleÚparent_namerì   s   &&&&&           r?   Úconvert_standalone_moduler,  Ñ  s‹  € ÷* Ü—X‘X×*Ñ*×6Ñ6×NÑN‰
ä—X‘X×*Ñ*×6Ñ6×AÑAˆ
ð /6´c¸$¿+¹+Ó6FÕ.GÐØ8×=Ñ=Ø&õç,Ñ,ð ô �—	‘	‹?€DÜ”S˜“YÖˆØÖ)Ø•)ˆCØ�v‰v˜Ö&¨3¯:©:¸Ö+EØ #§¡¨¥�Ø×'Ñ'¨Ô;Ü�s—y‘y“> QÖ&Ø—K‘K×*Ñ*¨3Ö/ñ  ð  :×>Ñ>Ø&õ ç-Ñ-ð ô Ð#Ó$ qÔ(Ø'¨Õ*¨aÔ/ÐKÐ1KÓKÐ/Ø(ô 	  §k¡kÔ2ñ #-Ø"ô#Ðô % T§[¡[Ó1Ñ€KäˆGÕ  $ÔDØ ;ŒC�—‘ÓÓrA   c                ó(  € V ^8„  d   QhR\         R\        \        \        P                  P
                  3,          R\        \        ,          R\        \        \        3,          R\        R\        R\        R\        \        P                  ,          R	R
/	# )r5   rR   rS   Úobserved_node_namesrU   rï   Úis_decomposedr  rV   r8   N)r*   r<   r=   r9   r:   r;   Úsetr   r   rè   r   rZ   )r>   s   "r?   r@   r@     s•   € ÷ Q9ñ Q9Ü
ðQ9ä”#”u—x‘x—‘Ð&Õ'ðQ9ô œS�ðQ9ô œs¤J˜Õ/ð	Q9ô
 "ðQ9ô ðQ9ô ðQ9ô œ5Ÿ<™<Õ(ðQ9ð 
ñQ9rA   c                óÆ  € V\        V P                  4      ,          pVP                  p	Rp
\        V4      p\	        W‹4      '       dF   VP
                  p
VP                  4       p\        V P                  4      w  rÍ\        W,          WØ4       V P                  V9   pV	e   \        W4      '       g	   V'       g   R# \        V4      pVP                  \        V4      . 4      p\        V	V4      '       g   R# \        V	4      pV'       g   R# RpTp\	        V\         P"                  P$                  P&                  P(                  4      '       d   TpV^ ,          pRV/p\	        V\         P$                  P*                  4      '       dr   V	P-                  4       pV	P-                  4       pV! VP.                  4       V! VP0                  4       \3        V4      p\3        V4      pVP5                  RVRV/4       EMh\	        V\         P$                  P6                  \         P$                  P8                  34      '       d“   VP:                   F�  p\=        VV4      '       g   K  VP?                  R4      '       g   K0  \A        VV4      pV	P-                  4       p
V
PB                  \         PD                  8X  d	   V
! V4       \3        V
4      VV&   Kƒ  	  M’V
RJ pV'       d<   V	P-                  4       p
Ve   TpM\G        V4      pV'       d   V
PI                  V4       V'       * pV'       d   V'       d	   V'       g   V
! VP,                  4       VP5                  \3        V
4      4       \K        V4      pVP                  \M        V4      R4      pVf   Q R\M        V4       24       hVPO                  VV4      p Ve   V V^ &   R# \        V P                  4      w  rÍ\        W,          VV 4       R# )a–  Convert a weighted module to reference quantized module in the model
If the QConfig of a QAT module is not set, the module will still be converted to
a float module.

Args:
  - node: The call_module node of the observed standalone module
  - modules: named_module of original model
  - observed_node_names: names for the set of observed fx node, we can skip
    this conversion if the node is not observed
Nr/  Ú	weight_ihÚ	weight_hhÚweightz3No reference quantized module class configured for )(r=   rˆ   Úqconfigr   rL   Úweight_fake_quantÚto_floatr"   rF   rì   r`   r
   ÚgetrN   r   r&   r9   r  r:   Ú	intrinsicÚ_FusedModuleÚRNNCellBaser4  r2  r3  r#   ÚupdateÚLSTMÚGRUÚ_flat_weights_namesrŠ   Ú
startswithr§   rl   rÖ   r3   rÒ   r   r.   Ú
from_float)!rR   rS   r.  rU   rï   r/  r  rV   Úoriginal_moduler5  Úweight_post_processÚqat_module_classesr+  rì   Úis_observedÚpattern_to_dtype_configsÚdtype_configsÚis_weight_quantizedÚfused_moduleÚfloat_moduleÚwq_or_wq_dictÚweight_post_process_ihÚweight_post_process_hhÚweight_qparams_ihÚweight_qparams_hhÚwnr4  Úis_ptqrZ   Úis_qatÚ)root_module_to_quantized_reference_moduleÚref_qmodule_clsÚref_qmodules!   &&&&&&&&                         r?   Úconvert_weighted_modulerV    sO  € ð( œc $§+¡+Ó.Õ/€OØ)×1Ñ1€GØÐÜ/°Ó?Ðä�/×6Ò6ð .×?Ñ?ÐØ)×2Ñ2Ó4ˆä(¨¯©Ó5ÑˆÜ�Õ$ dÔ<à—)‘)Ð2Ñ2€Kð 	ŠÜ˜T×8Ò8ßáô  <¸NÓKÐØ,×0Ñ0´°oÓ1FÈÓK€MÜ1°'¸=×IÒIÙô .¨gÓ6Ð÷ Ùà€LØ"€Lä�/¤5§8¡8§;¡;×#8Ñ#8×#EÑ#E×FÒFØ#ˆØ# A•ˆð % mÐ4€MÜ�,¤§¡× 4Ñ 4×5Ò5Ø!(§¡Ó!1ÐØ!(§¡Ó!1ÐÙ˜|×5Ñ5Ô6Ù˜|×5Ñ5Ô6Ü+Ð,BÓCÐÜ+Ð,BÓCÐØ×ÑàÐ.ØÐ.ðö	
ô 
�L¤5§8¡8§=¡=´%·(±(·,±,Ð"?×	@Ò	@ð ×2Ô2ˆBÜ�| R×(Ô(¨R¯]©]¸8×-DÔ-DÜ  ¨rÓ2�Ø&-§n¡nÓ&6Ð#Ø&×,Ñ,´·±Ô;Ù'¨Ô/Ü$3Ð4GÓ$H�˜bÓ!ò 3ð %¨Ð,ˆßØ")§.¡.Ó"2ÐØÒ'Ø%‘ä6°|ÓD�ßØ#×&Ñ& vÔ.ð( ”ˆß§,·6Ù × 3Ñ 3Ô4à×Ñœ_Ð-@ÓAÔBô 	6°nÓEð .ð @×CÑCÜ$ \Ó2°Dó€Oð Ò&ð Ø
=Ô>ZÐ[gÓ>hÐ=iÐjóÐ&ð "×,Ñ,¨\¸=ÓI€KØÒØ%ˆ�Q‹ä(¨¯©Ó5ÑˆÜ�Õ$ d¨KÖ8rA   c                ób  € V ^8„  d   QhR\         R\        R\        \        \        \
        \        3,          R3,          R\        R\        R\        \        \        \
        \        3,          R3,          R\        \        \        \
        \        3,          R3,          R	\        R
\        R\         /
# )r5   r6   r  Úconvert_custom_configNÚis_standalone_moduleÚ_remove_qconfig_flagÚqconfig_mappingrï   r/  Úkeep_original_weightsr8   ©	r'   rè   r   r   r<   r=   r   r   r   )r>   s   "r?   r@   r@   ¥  sµ   € ÷ Fñ FÜðFäðFô !Ô!4´d¼3Ä¸8µnÀdÐ!JÕKðFô ð	Fô
 ðFô œ>¬4´´S°­>¸4Ð?Õ@ðFô œ-¬¬c´3¨h­¸Ð=Õ>ðFô ðFô  ðFô ñFrA   c	                ó  € Vf   \        4       p\        V\        4      '       d4   \        P                  ! R\
        ^R7       \         P                  ! V4      p\        V\        4      '       d>   \        P                  ! R\
        ^R7       V'       d   \        P                  ! V4      MRp\        P                  ! V4      pVe   \        V\        4      '       g   Q h\        V\        4      '       d4   \        P                  ! R\
        ^R7       \        P                  ! V4      pVf   \        4       p\        V 4      '       g   Q R4       hV P                  R,          p	V	P                  p
V	P                  pV	P                   pV	P"                  p\        V P%                  RR	7      4      pV'       dÙ   V	P&                  p\        P                  ! V4      pV	P(                  '       d   \+        WV4       \-        W4       \/        Wõ4       \1        V VV P2                  WZ4      pVP5                  4        FU  w  ppVV9   g   Q R
V R24       hVV,          f   K%  \7        VVV,          4      '       d   K@  Q RV RV RVV,           24       h	  TpV	P8                  e   \;        W4      p\=        WV4       \?        W4       ^ pVP@                  pVPB                  p\E        V4      p\G        VPI                  4       4      p\K        V4      p\M        V4      p\O        V 4      p\Q        V P2                  PR                  4       EFL  pVPT                  R8X  d-   TpV^,          pVV9   d   \W        VV P2                  4       K?  KA  VPT                  R8X  dÐ   \Y        V4      ^ 8X  d   Kd  TpVPZ                  ^ ,          p \        V \P        \F        34      '       d*   V F!  p!\]        V V!,          VV P2                  4       K#  	  K¾  \        V \^        \        34      '       d#   ^ V9   d   \]        V VV P2                  4       Kú  Kü  \        P                  ! R\a        V 4       24       EK!  VPT                  R8X  g   EK5  \c        VV4      p"V"f   Q h\e        V"4      '       d/   V'       d   \g        V VVV
VV4       EKs  \i        V VVV
VV4       EK†  \        V"\j        4      '       d   \m        VV P2                  4       EKµ  \o        V"4      '       d   \q        VWàW4       EKÖ  \s        V"4      \u        V4      Pw                  V4      Pw                  V4      9   g   EK  \s        V"4      V9   d   \s        V"^ ,          4      V9  d   EK:  \y        VVVVVVVV4       EKO  	  V P2                  P{                  4        \}        W P2                  4      p V'       g   \        WW¨4      p V'       d   \�        V 4       V Pƒ                  4        V P                  P…                  RR4       V # )a+  
We will convert an observed model (a module with observer calls) to a reference
quantized model, the rule is simple:
1. for each observer module call in the graph, we'll convert it to calls to
   quantize and dequantize functions based on the observer instance
2. for weighted operations like linear/conv, we need to convert them to reference
   quantized module, this requires us to know whether the dtype configured for the
   weight is supported in the backend, this is done in prepare step and the result
   is stored in observed_node_names, we can decide whether we need to swap the
   module based on this set

Args:
   * `is_standalone_module`: when this flag is True, it means we are quantizing
   a submodule that is not inlined in parent module, and will be quantized
   separately as one unit.

   * `is_decomposed`: a boolean flag to indicate whether we want to use the
    quantize operator for decomposed quantized tensor
    (torch.ops.quantized_decomposed.quantize_per_tensor) or default/standalone
    quantized tensor (torch.quantize_per_tensor)

Returns:
     a quantized standalone module, whether input/output is quantized is
     specified by prepare_custom_config, with
     input_quantized_idxs, output_quantized_idxs, please
     see docs for :func:`~torch.ao.quantization.prepare_fx` for details
NúšPassing a convert_custom_config_dict to convert is deprecated and will not be supported in a future version. Please pass in a ConvertCustomConfig instead.©Ú
stacklevelz�Passing a QConfig dictionary to convert is deprecated and will not be supported in a future version. Please pass in a QConfigMapping instead.z�Passing a backend_config_dict to prepare is deprecated and will not be supported in a future version. Please pass in a BackendConfig instead.z-incoming model must be produced by prepare_fxr  F)Úremove_duplicatezExpected key z  in convert node_name_to_qconfigzExpected k zD to have the same value in prepare and convert QConfigMappings, but z was updated to ÚplaceholderÚoutputz1Unsupported node type for output_quantized_idxs: r  )Cr   rL   r<   rý   rþ   ÚFutureWarningÚ	from_dictr   rC   Údeepcopyr   r   r   rD   rT   Úprepare_custom_configr.  rU   Únamed_modulesr[  rR  r   r   r   r   r‡   rE   r   Ú!equalization_node_name_to_qconfigr   r   rö   Úinput_quantized_indexesÚoutput_quantized_indexesr   rY   r�   r   r	   r3   rŒ   rñ   rò   rä   r#  r�   rû   r*   rN   r   r1   rÊ   rß   r!   ræ   r   r,  r.   r0  ÚunionrV  Úeliminate_dead_coder'   r   r    Údelete_all_unused_submodulesÚpop)#r6   r  rX  rY  rZ  r[  rï   r/  r\  Úobserved_graph_module_attrsrT   rh  r.  rU   rS   Úprepare_qconfig_mappingÚmodules_copyÚconvert_node_name_to_qconfigÚkÚvÚweight_eq_obs_dictÚplaceholder_node_seen_cntÚinput_quantized_idxsÚoutput_quantized_idxsrS  Úroot_module_classesrD  Úfused_module_classesrV   rR   Úcur_placeholder_node_idxÚreturn_noderd  r(  Úmods#   &&&&&&&&&                          r?   r\   r\   ¥  s�  € ðL Ò$Ü 3Ó 5ÐäÐ'¬×.Ò.Ü�ŠðQäØõ		
ô !4× =Ò =Ð>SÓ TÐä�/¤4×(Ò(Ü�ŠðLäØõ		
÷ :IŒN×$Ò$ _Ô5Èdð 	ô —m’m OÓ4€OØÒ"¤j°Ä.×&QÒ&QÐQÐQä�.¤$×'Ò'Ü�ŠðKäØõ		
ô '×0Ò0°Ó@ˆàÒÜ2Ó4ˆä˜u×%Ò%ÐVÐ'VÓVÐ%Ø"'§*¡*Ð-KÕ"LÐà#×6Ñ6ð ð 	$×9Ñ9ð ð %@×$SÑ$SÐà#×8Ñ8ð ô �5×&Ñ&¸Ð&Ó>Ó?€G÷ à'×7Ñ7ð 	 ô —}’} WÓ-ˆà&×-×-Ð-Ü# OÔDÜ" 5Ô:ä1Ø#ô	
ô (FØ�< §¡¨oó(
Ð$ð )×.Ñ.Ö0‰DˆAˆqØÐ4Ô4ð Ø ˜sÐ"BÐCóÐ4ð ,¨AÕ.Ô:Ü% aÐ)EÀaÕ)H×IÔIð Ø! ! ð %Ø˜#Ð-Ð.JÈ1Õ.MÐ-NðPóÐIñ 1ð  <Ðà"×DÑDÒPô 9¸ÓHÐÜ�uÐ'9Ô:ô ˜%Ô0ð !"ÐØ&;×&SÑ&SÐØ'<×'UÑ'UÐô 	6°nÓEð .ô  Ð I× NÑ NÓ PÓQÐÜ/°Ó?ÐÜ3°NÓCÐÜ0°Ó7€Lä�U—[‘[×&Ñ&×'ˆØ�7‰7�mÔ#Ø'@Ð$Ø%¨Õ*Ð%Ø'Ð+?Ô?ô
 (¨¨e¯k©kÖ:ñ @ð �W‰W˜Ô äÐ(Ó)¨QÔ.Ùð ˆKØ—Y‘Y˜q•\ˆFä˜&¤4¬ -×0Ò0Û0�CÜ6Ø˜s� [°%·+±+öó 1ô ˜F¤T¬4 L×1Ò1ð Ð-Ô-Ü6°v¸{ÈEÏKÉKÖXñ .ô —’ØGÌÈVËÀ~ÐV÷ð �W‰W˜×%Ü˜d GÓ,ˆCØ’?Ð"�?Ü*¨3×/Ò/ß ÜNØØØØ*Ø,Ø$÷ô DØØØØ*Ø,Ø$÷ô ˜C¤×-Ò-ÜFØ˜%Ÿ+™+÷ô 0°×4Ò4Ü)Ø˜'¨,÷ô
 .¨cÓ2´cÐ:MÓ6N×6TÑ6TØ"ó7ç‰eÐ(Ó)÷*ô 1°Ó5Ð9MÔMÜ4°S¸µVÓ<ÐDWÔWâÜ'ØØØ'Ø(Ø"Ø!Ø Ø ÷	ñ[ (ðr 
‡K�K×#Ñ#Ô%Ü˜Ÿ{™{Ó+€E÷ ÜØÐ);ó
ˆ÷ Ü˜ÔØ	×&Ñ&Ô(Ø	‡J�J‡N�NÐ1°4Ô8Ø€LrA   c                ób  € V ^8„  d   QhR\         R\        R\        \        \        \
        \        3,          R3,          R\        R\        R\        \        \        \
        \        3,          R3,          R\        \        \        \
        \        3,          R3,          R	\        R
\        R\         /
# )r5   Úgraph_moduler  rX  NrY  r    r[  rï   r/  r\  r8   r]  )r>   s   "r?   r@   r@   ®  s©   € ÷ -ñ -Üð-äð-ô !Ô!4´d¼3Ä¸8µnÀdÐ!JÕKð-ô ð	-ô
 ð-ô œ>¬4´´S°­>¸4Ð?Õ@ð-ô œ-¬¬c´3¨h­¸Ð=Õ>ð-ô ð-ô  ð-ô ñ-rA   c	                ó†  € Vf   \        4       p\        V\        4      '       d4   \        P                  ! R\
        ^R7       \         P                  ! V4      p\        V 4       VP                  p	V	 U
u/ uF"  p
\        W
4      '       g   K  V
\        W
4      bK$  	  pp
\        V VVVVVVVVR7	      p\        WË4       V# u up
i )z_`is_standalone_module`: see docs in :func:`~torch.ao.quantization.prepare_standalone_module_fx`r_  r`  )rZ  r[  rï   r/  r\  )r   rL   r<   rý   rþ   re  rf  rO   Úpreserved_attributesrŠ   r§   r\   rI   )r�  r  rX  rY  r    r[  rï   r/  r\  Úpreserved_attr_namesrH   r7   rÜ   s   &&&&&&&&&    r?   Ú_convert_fxr…  ®  sÓ   € ð Ò$Ü 3Ó 5ÐäÐ'¬×.Ò.Ü�ŠðQäØõ		
ô !4× =Ò =Ð>SÓ TÐä˜<Ô(Ø0×EÑEÐñ )óá(ˆDÜ�<×&ô 	*ˆŒg�lÓ)Ò)Ù(ð ð ô ØØØØØ,Ø'Ø%Ø#Ø3ô
€Iô $ IÔ?ØÐùò's   Á3B>ÂB>c                ó&  € V ^8„  d   QhR\         R\        \        \        \        \
        3,          R3,          R\        \        \        \        \
        3,          R3,          R\        \        \        \        \
        3,          R3,          R\         /# )r5   r�  rX  Nr[  rï   r8   )r'   r   r   r<   r=   r   r   r   )r>   s   "r?   r@   r@   Þ  sw   € ÷ 1ñ 1Üð1ä Ô!4´d¼3Ä¸8µnÀdÐ!JÕKð1ô œ>¬4´´S°­>¸4Ð?Õ@ð1ô œ-¬¬c´3¨h­¸Ð=Õ>ð	1ô
 ñ1rA   c           
     ó&   € \        V RVRVVRR7      # )a»  Convert a calibrated or trained model to a reference quantized model, with
decomposed representation for quantized Tensor
see https://github.com/pytorch/rfcs/blob/master/RFC-0019-Extending-PyTorch-Quantization-to-Custom-Backends.md for more details,
reference quantized model is a standard representation of a quantized model provided
by FX Graph Mode Quantization, it can be further lowered to run on the target
hardware, like accelerators

Note: this is not public API

Args:
    * `graph_module` (GraphModule): A prepared and calibrated/trained model (GraphModule)

    * `convert_custom_config` (ConvertCustomConfig): custom configurations for convert function.
        See :func:`~torch.ao.quantization.quantize_fx.convert_fx` for more details.

    * `_remove_qconfig` (bool): Option to remove the qconfig attributes in the model after convert.

    * `qconfig_mapping` (QConfigMapping): config for specifying how to convert a model for quantization.
        See :func:`~torch.ao.quantization.quantize_fx.convert_fx` for more details.

     * `backend_config` (BackendConfig): A configuration for the backend which describes how
        operators should be quantized in the backend. See
        :func:`~torch.ao.quantization.quantize_fx.convert_fx` for more details.

Return:
    A reference quantized model (GraphModule) with operators working with decomposed quantized Tensor

Example::

    # prepared_model: the model after prepare_fx/prepare_qat_fx and calibration/training
    # TODO: add backend_config after we split the backend_config for fbgemm and qnnpack
    # e.g. backend_config = get_default_backend_config("fbgemm")
    reference_quantized_model = _convert_to_reference_decomposed_fx(prepared_model)

TF)r  rX  r    r[  rï   r/  )r…  )r�  rX  r[  rï   s   &&&&r?   Ú#_convert_to_reference_decomposed_fxrˆ  Þ  s'   € ôR ØØØ3ØØ'Ø%Øôð rA   )r\   r,  rV  r^   )FFN)FNFTNNFF)NFTNNFF)NNN)srC   r«   rý   Útypingr   r   r   r   r9   Ú$torch.ao.quantization.backend_configr   r   Ú*torch.ao.quantization.backend_config.utilsr	   r
   r   r   Ú$torch.ao.quantization.fx._decomposedr   Ú"torch.ao.quantization.fx._equalizer   r   Ú&torch.ao.quantization.fx.custom_configr   r   Ú%torch.ao.quantization.fx.graph_moduler   r   Ú(torch.ao.quantization.fx.lower_to_fbgemmr   Ú.torch.ao.quantization.fx.qconfig_mapping_utilsr   r   r   r   r   Útorch.ao.quantization.fx.utilsr   r   r   Útorch.ao.quantization.qconfigr   r   Ú%torch.ao.quantization.qconfig_mappingr   Útorch.ao.quantization.quantizer    Útorch.ao.quantization.stubsr!   Útorch.ao.quantization.utilsr"   r#   r$   r%   r&   Útorch.fxr'   Útorch.fx.graphr(   r)   r*   Útorch.fx.graph_moduler+   Útorch.fx.tracebackr,   r-   Útorch.nn.utils.parametrizer.   Útorchao.quantization.pt2er/   Ú%torchao.quantization.pt2e.graph_utilsr0   Ú"torchao.quantization.pt2e.observerr1   Útorchao.quantization.pt2e.utilsr2   Útorchao.utilsr3   Ú__all__rÕ   rÖ   r×   r¥   r¦   Úuint16Úint16Úint32rØ   rÙ   r”   r¨   r˜   r™   Úchoose_qparamsr¤   Úper_tensor_symmetricÚchoose_qparams_symmetricrª   rI   rO   rÊ   rß   ræ   r�   r`   rö   rû   r‰   rä   r  r,  rV  r\   r…  rˆ  © rA   r?   Ú<module>rª     s   ðó Û Û ß 1Ó 1ã ÷÷ó õ J÷÷÷õ E÷õ ÷ñ ÷
 EÝ @Ý :Ý 3÷õ õ !ß 0Ñ 0Ý @ß ;Ý Cå 3Ý HÝ JÝ EÝ 7ò€ð 
‡L�LØ	‡K�KØ	‡L�LØ	‡K�KØ	‡J�JØ	‡L�LØ	‡K�KØ	‡K�KØ	×ÑØ	×ÑðÐ ð 
×Ñ˜UŸY™Y×;Ñ;×JÑJ×QÑQØ	×Ñ §	¡	× >Ñ >× WÑ W× ^Ñ ^ð!Ð õ	(õ
÷P#÷lO#õt	<õõ
õ)õ,
õ*6õrDõõ=<÷@Q9÷hF÷R-÷`1ñ 1rA   