ó
    Eñi#  ã                   óœ  • % S SK r S SKJrJr  S SKJr  S SKrS SKJr  S SK	J
r
Jr  S SKJrJr  S SKJr  SS	KJr  SS
KJr  / r\\   \S'   \\\\   \S-  \4   r\\\\   \S-  \\4   r\ R8                  4S jr   SS\S\\\R>                  R@                  4   S\\\4   S\\\4   S\\   S-  S\\!   S-  S\\   S-  S\\\4   4S jjr"g)é    N)ÚCallableÚIterable)ÚAny)Ú
QConfigAny)ÚMatchAllNodeÚPattern)ÚGraphÚNode)Útype_before_parametrizationsé   )Ú_is_observed_standalone_module)ÚQuantizeHandlerÚ__all__c                 ó  ^ • [        U[        5      (       a)  UtpEU[        L a  [        U5      S:w  a  [	        S5      e/ nOUn/ n[        U[
        5      (       a  [        U[        5      (       a  gX:X  a  g[        U[        5      (       a  [        UR                  5      U:”  a  g[        U[
        5      (       aX  [        U[        R                  R                  5      (       a/  UR                  S:w  a  g[        T UR                     5      U:w  a  gO£[!        U5      (       aK  UR                  S:w  d  UR                  ULa  gUR                  [        L a  UR"                  S   US   :w  a  gOH[        U[$        5      (       a"  UR                  S:w  d  UR                  U:w  a  gOUR                  U:w  a  gU(       d  g[        U5      [        UR"                  5      :w  a  g['        U 4S	 j[)        UR"                  U5       5       5      $ )
z&Matches a node in fx against a patterné   z.Expecting getattr pattern to have two elementsTFÚcall_moduleÚcall_functionr   Úcall_methodc              3   ó>   >#   • U  H  u  p[        TXS S9v •  M     g7f)r   )Úmax_usesN)Ú	_is_match)Ú.0ÚnodeÚ	arg_matchÚmoduless      €Úa/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/ao/quantization/fx/match_utils.pyÚ	<genexpr>Ú_is_match.<locals>.<genexpr>K   s#   øé € ð â:‰OˆDô 	�'˜4°QÖ7Ú:ùs   ƒ)Ú
isinstanceÚtupleÚgetattrÚlenÚAssertionErrorÚtypeÚ
issubclassr   r
   ÚusersÚtorchÚnnÚModuleÚopr   ÚtargetÚcallableÚargsÚstrÚallÚzip)r   r   Úpatternr   Ú
self_matchÚarg_matchess   `     r   r   r      s¢  ø€ ä�'œ5×!Ñ!Ø#*Ð ˆ
ØœÒ Ü�7‹|˜qÓ Ü$Ð%UÓVÐVØˆKøàˆ
Øˆä�*œd×#Ñ#¬
°:¼|×(LÑ(LØàƒØä�dœD×!Ñ!¤S¨¯©£_°xÓ%?Øä�*œd×#Ñ#¬
°:¼u¿x¹x¿¹×(OÑ(OØ�7‰7�mÓ#ØÜ'¨°·±Ñ(<Ó=ÀÓKØð Lä	�*×	Ñ	Ø�7‰7�oÓ%¨¯©¸JÒ)FØØ�[‰[œGÒ#Ø�y‰y˜‰|˜w q™zÓ)ØøÜ	�J¤×	$Ñ	$Ø�7‰7�mÓ# t§{¡{°jÓ'@Øð (Aà	�‰˜
Ó	"ØæØä
ˆ;Óœ3˜tŸy™y›>Ó)Øäô ä" 4§9¡9¨kÔ:óó ð ó    Úgraphr   ÚpatternsÚroot_node_getter_mappingÚstandalone_module_namesÚstandalone_module_classesÚcustom_module_classesÚreturnc           
      óî  ^^^^• Uc  / nTc  / mTc  / m0 n[        5       nU4S jmU4S jm[        U R                  5       H›  n	U	R                  U;  d  M  U	R                  U;  d  M'  UR	                  5        H`  u  p«UR                  U
5      n[        XU
5      (       d  M)  U	R                  U;  d  M;  / nT" X©X�U5        U" XÑU5      nU	nT" UUUUU
U5          M™     M�     Uc  [        S5      eU R                   HL  n	U	R                  S:X  d  M  [        XR                     5      U;   d  M2  U	U	S[        X‘SS94XyR                  '   MN     S[        S	[        [        [        R                  R                   4   4UU4S
 jjnU R                   He  n	U	R                  S:X  d  M  U" U	R                  U5      (       d  [#        XR                     5      (       d  MK  U	U	S[        X‘SS94XyR                  '   Mg     U$ )a�  
Matches the nodes in the input graph to quantization patterns, and
outputs the information needed to quantize them in future steps.

Inputs:
  - graph: an fx.Graph object
  - modules: a mapping of fully qualified module name to instance,
      for example, {'foo': ModuleFoo, ...}
  - patterns: a mapping from a tuple of nodes in reverse order to
      uninitialized QuantizeHandler subclass.

Outputs a map of
  node_name ->
    (node, matched_values, matched_pattern, QuantizeHandler instance,
     qconfig)

For example, {
  'relu_1': (relu_1, [relu_1], torch.nn.functional.relu,
             <CopyNodeQuantizeHandler instance>, QConfig(...)),
  ...
}
Nc           	      ó¨   >• [        U[        5      (       a  U UUU4XR                  '   g [        U[        5      (       d  g U H  nT" XXcXE5        M     g )N)r   r
   Únamer   )Ú	last_nodeÚ	match_mapÚnode_patternÚmatched_node_patternr1   Úmatch_valueÚnÚ#_recursive_record_node_in_match_maps          €r   rE   Ú:_find_matches.<locals>._recursive_record_node_in_match_map|   sY   ø€ ô �l¤D×)Ñ)àØ$ØØð	,ˆI×'Ñ'Ò(ô ˜L¬(×3Ñ3Øã!�Ù3Ø¨!À7öò "r4   c                 ó¶  >• [        U [        5      (       a²  U tpV[        U5      S:H  n/ nT" XQX#U5        U S   [        La(  [	        XaR
                  5       H  u  pšT" XšXU5        M     [        U5      S:”  a=  U(       a  UR                  [        U5      5        g UR                  [        U5      5        g UR                  US   5        g UR                  U5        g )Nr   r   )	r   r    r"   r!   r0   r-   ÚappendÚextendÚlist)r1   r   r?   rB   r@   Úsr-   Úis_single_argÚcurrent_node_patternÚ
subpatternÚargÚrecord_matchs              €r   rP   Ú#_find_matches.<locals>.record_match�   sÀ   ø€ Ü�gœu×%Ñ%ØˆHˆAÜ ›I¨™NˆMØ/1Ð Ù˜ )À9ÔMØ�q‰z¤Ò(Ü'*¨4·±Ö';‘O�JÙ  °$ÈiÖXñ (<äÐ'Ó(¨1Ó,ö !Ø(×/Ñ/´Ð6JÓ0KÕLà(×/Ñ/´Ð5IÓ0JÕKà$×+Ñ+Ð,@ÀÑ,CÕDà ×'Ñ'¨Õ-r4   úmodules must not be Noner   T)Úis_custom_moduleÚnode_targetr   c                 óX   >• Uc  [        S5      eU T;   =(       d    [        X   5      T;   $ )NrR   )r#   r$   )rT   r   r9   r8   s     €€r   Úis_standalone_moduleÚ+_find_matches.<locals>.is_standalone_moduleÐ   s:   ø€ Ø‰?Ü Ð!;Ó<Ð<àÐ2Ñ2÷ )Ü�GÑ(Ó)Ø(ñ)ð	
r4   )rV   )ÚsetÚreversedÚnodesr>   ÚitemsÚgetr   r#   r*   r$   r+   r   r.   Údictr'   r(   r)   r   )r5   r   r6   r7   r8   r9   r:   r@   Úall_matchedr   r1   Úquantize_handler_clsÚroot_node_getterrB   Úquantize_handlerr?   rV   rE   rP   s       ``           @@r   Ú_find_matchesrb   Q   së  û€ ð> Ñ$Ø "Ðà Ñ(Ø$&Ð!àÑ&Ø"$Ðà)+€IÜ›E€Kõõ&.ô4 ˜Ÿ™Ö%ˆØ�9‰9˜IÕ%¨$¯)©)¸;Õ*FØ19·±Ö1AÑ-�Ø#;×#?Ñ#?ÀÓ#HÐ Ü˜W¨G×4Ó4¸¿¹È)Õ9SØ79Ð(Ù  °ÈIÔVÙ';Ø,Ð7Gó(Ð$ð !%�Iá7Ø!Ø!à,à,ØØ(ô	ò ó) 2Bñ &ð2 �ÜÐ7Ó8Ð8Ø—”ˆà�G‰G�}Õ$Ü�WŸ[™[Ñ)Ó*Ð.CÕCð ØØÜ ÀÑEð	$ˆI—i‘iÓ ñ ð
¬#ð 
¼¼SÄ%Ç(Á(Ç/Á/Ð=QÑ8R÷ 
ð 
ð —”ˆØ�7‰7�mÕ#Ù  §¡¨g×6Ñ6Ü-¨g·k±kÑ.B×CÓCð ØØÜ ÀDÑIð	$ˆI—i‘iÓ ñ ð Ðr4   )NNN)#ÚsysÚcollections.abcr   r   Útypingr   r'   Útorch.ao.quantization.qconfigr   Útorch.ao.quantization.utilsr   r   Útorch.fx.graphr	   r
   Útorch.nn.utils.parametrizer   Úgraph_moduler   ra   r   r   rJ   r.   Ú__annotations__r    Ú_MatchResultÚ_MatchResultWithQConfigÚmaxsizer   r]   r(   r)   r$   rb   © r4   r   Ú<module>rp      s0  ðä 
ß .Ý ã Ý 4ß =ß &Ý Cå 8Ý -ð €ˆˆc‰Ó ð �T˜4 ™: w°¡~°ÐFÑG€àØˆ$ˆt‰*�g ‘n o°zÐAñÐ ð 03¯{©{ô /ðn 15Ø37Ø.2ñVØðVà�#�u—x‘x—‘Ð&Ñ'ðVð �7˜OÐ+Ñ,ðVð # 7¨HÐ#4Ñ5ð	Vð
 " #™Y¨Ñ-ðVð  $ D™z¨DÑ0ðVð   ™9 tÑ+ðVð 
ˆ#ˆ|Ð
ÑöVr4   