Ë
    g^(hœ"  ã                   óš  — U d dl Z d dlmZ d dlmZmZmZ d dlZd dlm	Z	 d dl
mZmZ d dlmZmZ d dlmZ dd	lmZ dd
lmZ g Zee   ed<   eeee   ee   ef   Zeeee   ee   ee	f   Ze j:                  fd„Z	 	 	 ddedeeej@                  jB                  f   deeef   deeef   deee      deee"      deee      deeef   fd„Z#y)é    N)ÚIterable)ÚAnyÚCallableÚOptional)Ú
QConfigAny)ÚMatchAllNodeÚPattern)ÚGraphÚNode)Útype_before_parametrizationsé   )Ú_is_observed_standalone_module)ÚQuantizeHandlerÚ__all__c                 óŽ  ‡ — t        |t        «      r$|^}}|t        u rt        |«      dk(  sJ d«       ‚g }n|}g }t        |t        «      rt        |t        «      ry||k(  ryt        |t        «      rt        |j                  «      |kD  ryt        |t        «      rPt        |t        j                  j                  «      r,|j                  dk7  ryt        ‰ |j                     «      |k(  s‘yt        |«      rF|j                  dk7  s|j                  |ury|j                  t        u rU|j                   d   |d   k7  r@yt        |t"        «      r|j                  dk7  s|j                  |k7  ry|j                  |k7  ry|syt        |«      t        |j                   «      k7  ryt%        ˆ fd	„t'        |j                   |«      D «       «      S )
z&Matches a node in fx against a patterné   z.Expecting getattr pattern to have two elementsTFÚcall_moduleÚcall_functionr   Úcall_methodc              3   óB   •K  — | ]  \  }}t        ‰||d ¬«      –— Œ y­w)r   )Úmax_usesN)Ú	_is_match)Ú.0ÚnodeÚ	arg_matchÚmoduless      €úb/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/ao/quantization/fx/match_utils.pyú	<genexpr>z_is_match.<locals>.<genexpr>J   s+   øè ø€ ò áˆD�)ô 	�'˜4 °Q×7Ð7ñùs   ƒ)Ú
isinstanceÚtupleÚgetattrÚlenÚ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Ô!Ø#*Ð ˆ
�[ØœÑ Ü�w“< 1Ò$ÐVÐ&VÓVÐ$Ø‰Kàˆ
Øˆä�*œdÔ#¬
°:¼|Ô(LØàˆw‚Øä�dœDÔ!¤S¨¯©£_°xÒ%?Øä�*œdÔ#¬
°:¼u¿x¹x¿¹Ô(OØ�7‰7�mÒ#ØÜ+¨G°D·K±KÑ,@ÓAÀZÒOØÜ	�*Ô	Ø�7‰7�oÒ%¨¯©¸JÑ)FØØ�[‰[œGÑ#Ø�y‰y˜‰|˜w q™zÒ)ØÜ	�J¤Ô	$Ø�7‰7�mÒ# t§{¡{°jÒ'@ØØ	�‰˜
Ò	"ØáØä
ˆ;Óœ3˜tŸy™y›>Ò)Øäó ä" 4§9¡9¨kÓ:ôó ð ó    Úgraphr   ÚpatternsÚroot_node_getter_mappingÚstandalone_module_namesÚstandalone_module_classesÚcustom_module_classesÚreturnc           
      óž  ‡‡‡‡— |€g }‰€g Š‰€g Ši }t        «       }ˆfd„Šˆfd„Št        | j                  «      D ]�  }	|	j                  |vsŒ|	j                  |vsŒ!|j	                  «       D ]\  \  }
}|j                  |
d«      }t        ||	|
«      sŒ&|	j                  |vsŒ5g } ‰|
|	|	||«        ||||«      }|	} ‰|||||
|«        Œ� Œ‘ |€J ‚| j                  D ]L  }	|	j                  dk(  sŒt        ||	j                     «      |v sŒ.|	|	dt        |	|d¬«      f||	j                  <   ŒN dt        dt        t        t        j                  j                  f   fˆˆfd	„}| j                  D ]]  }	|	j                  dk(  sŒ ||	j                  |«      st!        ||	j                     «      sŒ?|	|	dt        |	|d¬
«      f||	j                  <   Œ_ |S )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           	      ó˜   •— t        |t        «      r| |||f||j                  <   y t        |t        «      sy |D ]  } ‰| |||||«       Œ y ©N)r   r   Únamer   )Ú	last_nodeÚ	match_mapÚnode_patternÚmatched_node_patternr0   Úmatch_valueÚnÚ#_recursive_record_node_in_match_maps          €r   rE   z:_find_matches.<locals>._recursive_record_node_in_match_map{   sa   ø€ ô �l¤DÔ)àØ$ØØð	,ˆI�l×'Ñ'Ò(ô ˜L¬(Ô3Øà!ò �Ù3Ø˜y¨!Ð-AÀ7ÈKõñr3   c                 ó¨  •— t        | t        «      r°| ^}}t        |«      dk(  }g } ‰|||||«       | d   t        ur*t	        ||j
                  «      D ]  \  }	}
 ‰|	|
|||«       Œ t        |«      dkD  r8|r|j                  t        |«      «       y |j                  t        |«      «       y |j                  |d   «       y |j                  |«       y )Nr   r   )	r   r    r"   r!   r/   r,   ÚappendÚextendÚlist)r0   r   r?   rB   r@   Úsr,   Úis_single_argÚcurrent_node_patternÚ
subpatternÚargÚrecord_matchs              €r   rO   z#_find_matches.<locals>.record_matchŽ   sÔ   ø€ Ü�gœuÔ%ØˆHˆA�Ü ›I¨™NˆMØ/1Ð Ù˜˜D )Ð-AÀ9ÔMØ�q‰z¤Ñ(Ü'*¨4°·±Ó';ò Y‘O�J Ù  ¨S°$Ð8LÈiÕXðYäÐ'Ó(¨1Ò,ñ !Ø(×/Ñ/´Ð6JÓ0KÕLà(×/Ñ/´Ð5IÓ0JÕKà$×+Ñ+Ð,@ÀÑ,CÕDà ×'Ñ'¨Õ-r3   r   T)Úis_custom_moduleÚnode_targetr   c                 ó8   •— |€J ‚| ‰v xs t        ||    «      ‰v S r=   )r#   )rQ   r   r8   r7   s     €€r   Úis_standalone_modulez+_find_matches.<locals>.is_standalone_moduleÎ   s7   ø€ ØÐ"Ð"Ð"àÐ2Ð2ò )Ü�G˜KÑ(Ó)Ø(ð)ð	
r3   )rS   )ÚsetÚreversedÚnodesr>   ÚitemsÚgetr   r)   r#   r*   r   r-   Údictr&   r'   r(   r   )r4   r   r5   r6   r7   r8   r9   r@   Úall_matchedr   r0   Úquantize_handler_clsÚroot_node_getterrB   Úquantize_handlerr?   rS   rE   rO   s       ``           @@r   Ú_find_matchesr^   P   s  û€ ð> Ð$Ø "Ðà Ð(Ø$&Ð!àÐ&Ø"$Ðà)+€IÜ›E€Kôô&.ô4 ˜Ÿ™Ó%ò ˆØ�9‰9˜IÒ%¨$¯)©)¸;Ò*FØ19·±Ó1Aò Ñ-�Ð-Ø#;×#?Ñ#?ÀÈÓ#NÐ Ü˜W d¨GÕ4¸¿¹È)Ò9SØ79Ð(Ù  ¨$°Ð6JÈIÔVÙ';Ø,¨gÐ7Gó(Ð$ð !%�Iá7Ø!Ø!à,à,ØØ(ô	ñ ñ)ðð2 ÐÐÐØ—‘ò 
ˆà�G‰G�}Ó$Ü�W˜TŸ[™[Ñ)Ó*Ð.CÒCð ØØÜ  gÀÔEð	$ˆI�d—i‘iÒ ð
ð
¬#ð 
¼¼SÄ%Ç(Á(Ç/Á/Ð=QÑ8Rö 
ð —‘ò ˆØ�7‰7�mÓ#Ù  §¡¨gÔ6Ü-¨g°d·k±kÑ.BÕCð ØØÜ  gÀDÔIð	$ˆI�d—i‘iÒ ðð Ðr3   )NNN)$ÚsysÚcollections.abcr   Útypingr   r   r   r&   Útorch.ao.quantization.qconfigr   Útorch.ao.quantization.utilsr   r	   Útorch.fx.graphr
   r   Útorch.nn.utils.parametrizer   Úgraph_moduler   r]   r   r   rI   r-   Ú__annotations__r    Ú_MatchResultÚ_MatchResultWithQConfigÚmaxsizer   rY   r'   r(   r#   r^   © r3   r   ú<module>rl      s5  ðä 
Ý $ß *Ñ *ã Ý 4ß =ß &Ý Cå 8Ý -ð €ˆˆc‰Ó ð �T˜4 ™: x°Ñ'8¸/ÐIÑJ€àØˆ$ˆt‰*�h˜wÑ'¨¸*ÐDñÐ ð 03¯{©{ó .ðl 48Ø6:Ø15ñTØðTà�#�u—x‘x—‘Ð&Ñ'ðTð �7˜OÐ+Ñ,ðTð # 7¨HÐ#4Ñ5ð	Tð
 & d¨3¡iÑ0ðTð  (¨¨T©
Ñ3ðTð $ D¨¡IÑ.ðTð 
ˆ#ˆ|Ð
ÑôTr3   