Ë
    ÄÓ^j#  ã                   ó–  — U d dl Z d dlmZmZ d dl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dz  ef   Zeeee   edz  eef   Ze j8                  fd„Z	 	 	 ddedeeej>                  j@                  f   deeef   deeef   dee   dz  dee!   dz  dee   dz  deeef   fd„Z"y)é    N)ÚCallableÚIterable)ÚAny)Ú
QConfigAny)ÚMatchAllNodeÚPattern)ÚGraphÚNode)Útype_before_parametrizationsé   )Ú_is_observed_standalone_module)ÚQuantizeHandlerÚ__all__c                 ó–  ‡ — t        |t        «      r(|^}}|t        u r t        |«      dk7  rt	        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                     «      |k7  r‘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      €úo/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/ao/quantization/fx/match_utils.pyú	<genexpr>z_is_match.<locals>.<genexpr>K   s+   øè ø€ ò áˆD�)ô 	�'˜4 °Q×7Ð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Øàˆw‚Øä�dœDÔ!¤S¨¯©£_°xÒ%?Øä�*œdÔ#¬
°:¼u¿x¹x¿¹Ô(OØ�7‰7�mÒ#ØÜ'¨°·±Ñ(<Ó=ÀÒKØÜ	�*Ô	Ø�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                  |
«      }t        ||	|
«      sŒ%|	j                  |vsŒ4g } ‰|
|	|	||«        ||||«      }|	} ‰|||||
|«        ŒŽ Œ� |€t        d«      ‚| 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   rD   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>   rA   r?   Úsr,   Úis_single_argÚcurrent_node_patternÚ
subpatternÚargÚrecord_matchs              €r   rN   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   úmodules must not be Noner   T)Úis_custom_moduleÚnode_targetr   c                 óJ   •— |€t        d«      ‚| ‰v xs t        ||    «      ‰v S )NrO   )r"   r#   )rQ   r   r8   r7   s     €€r   Úis_standalone_modulez+_find_matches.<locals>.is_standalone_moduleÐ   s<   ø€ Øˆ?Ü Ð!;Ó<Ð<àÐ2Ð2ò )Ü�G˜KÑ(Ó)Ø(ð)ð	
r3   )rS   )ÚsetÚreversedÚnodesr=   ÚitemsÚgetr   r"   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_getterrA   Úquantize_handlerr>   rS   rD   rN   s       ``           @@r   Ú_find_matchesr^   Q   s  û€ ð> Ð$Ø "Ðà Ð(Ø$&Ð!àÐ&Ø"$Ðà)+€IÜ›E€Kôô&.ô4 ˜Ÿ™Ó%ò ˆØ�9‰9˜IÒ%¨$¯)©)¸;Ò*FØ19·±Ó1Aò Ñ-�Ð-Ø#;×#?Ñ#?ÀÓ#HÐ Ü˜W d¨GÕ4¸¿¹È)Ò9SØ79Ð(Ù  ¨$°Ð6JÈIÔVÙ';Ø,¨gÐ7Gó(Ð$ð !%�Iá7Ø!Ø!à,à,ØØ(ô	ñ ñ)ðð2 €ÜÐ7Ó8Ð8Ø—‘ò 
ˆà�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   r   Útypingr   r&   Útorch.ao.quantization.qconfigr   Útorch.ao.quantization.utilsr   r   Útorch.fx.graphr	   r
   Útorch.nn.utils.parametrizer   Úgraph_moduler   r]   r   r   rH   r-   Ú__annotations__r   Ú_MatchResultÚ_MatchResultWithQConfigÚmaxsizer   rY   r'   r(   r#   r^   © r3   r   ú<module>rl      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r3   