
    ȅi                     R   S SK r S SKJr  S SKJr  S SKJrJr  S SKJ	r	J
r
Jr  S SKJrJr  S SKJrJrJr  S SKJ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/r  SS\S\ S\\!\"\4   -  S-  S\\!\"\4   -  S-  S\4
S jjr#S\S\S\!\\4   S\!\"\$\\\\\!\\4   4   4   4S jr%g)    N)Callable)Any)BackendConfigget_native_backend_config)get_fuser_method_mapping)get_fusion_pattern_to_extra_inputs_getter&get_fusion_pattern_to_root_node_getter)NodePatternPattern)GraphModulemap_argNode)Graph   )FuseCustomConfig)'_get_fusion_pattern_to_fuse_handler_clsFuseHandler)	_is_matchMatchAllNode)_sorted_patterns_dictfuser   modelis_qatfuse_custom_configbackend_configreturnc                 B  ^ Uc
  [        5       n[        U[        5      (       a0  [        R                  " S[
        SS9  [         R                  " U5      n[        U[        5      (       a0  [        R                  " S[
        SS9  [        R                  " U5      n[        U R                  5       5      nUc
  [        5       n[        [        U5      5      n[        U5      n[        U5      n[        U5      n[        X R                   U5      n	[#        5       n
0 mU4S jnS nU R                   R$                   H  nU	R'                  UR(                  S5      u  nnnnnUb  UR'                  US 5      nOS nXL an  Uc  [+        S5      eUR'                  X5      nU" U5      nUR'                  US 5      n/ nUb  U" U5      nUR-                  UUU
UUUUUU5	      TUR(                  '   M  Ub  U[.        L d  M  U
R1                  X5      TUR(                  '   M     [3        X
5      n U $ )	NzPassing a fuse_custom_config_dict to fuse is deprecated and will not be supported in a future version. Please pass in a FuseCustomConfig instead.   )
stacklevelzPassing a backend_config_dict to prepare is deprecated and will not be supported in a future version. Please pass in a BackendConfig instead.c                 $   > [        U U4S j5      $ )Nc                 "   > TU R                      $ N)name)nodeenvs    W/home/james-whalen/.local/lib/python3.13/site-packages/torch/ao/quantization/fx/fuse.py<lambda>(fuse.<locals>.load_arg.<locals>.<lambda>T   s    s499~    )r   )ar%   s    r&   load_argfuse.<locals>.load_argS   s    q566r)   c                 z    [        U S   [        5      (       d  U S   n [        U S   [        5      (       d  M  U S   $ )N)
isinstancer   )node_patterns    r&   default_root_node_getter&fuse.<locals>.default_root_node_getterV   s=    \"-t44'+L \"-t44Br)   )NNNNNz:fuse handler object must not be None for matched root node)r   r/   dictwarningswarnFutureWarning	from_dictr   named_modulesr   r   r   r   r	   r   _find_matchesgraphr   nodesgetr#   AssertionErrorr   r   	node_copyr   )r   r   r   r   r8   "fusion_pattern_to_fuse_handler_clsfuser_method_mapping"fusion_pattern_to_root_node_getter%fusion_pattern_to_extra_inputs_getterfusion_pairsfused_graphr+   r1   r$   maybe_last_nodepatternmatched_node_patternobjnode_to_subpatternnode_subpatternroot_node_getter	root_nodeextra_inputs_getterextra_inputsr%   s                           @r&   r   r   !   sJ    !-/$d++N		
 .778JK.$''K		
 '00@,,./M24)>/?*& 4NC)O*& -V-)
 !5WXL 'KC7 
 !! TYY(FG	
  )044T4@O"O"{$P   BEE  ))=>I"G"K"K# L".23GH !XX$"$
C		N $<(G(224BC		NU "Z +ELr)   rootr:   pattern_to_fuse_handler_clsc                 4  ^	^
 [        U R                  5       5      n0 m
0 nU	U
4S jm	[        UR                  5       HX  nUR                  T
;  d  M  UR                  5        H/  u  pg/ n[        X5U5      (       d  M  T	" UUXVU" U5      4UU5          MV     MZ     T
$ )Nc                 f  > [        U [        5      (       aR  U tpV/ nT" XQX'U5        [        XaR                  5       H  u  pT" XX'U5        M     UR	                  [        U5      5        g UR
                  T;  a9  UR	                  U5        U [        La  XU'   Uu  pnU
U UUU4TUR
                  '   g g g r"   )r/   tuplezipargsappendr#   r   )rF   r$   matchrG   rI   srU   current_node_pattern
subpatternargrL   handlerapply_match	match_maps               r&   r]   "_find_matches.<locals>.apply_match   s    gu%%HA/1 >PQ#&tYY#7
UBT $8 !''.B(CD yy	)$++D1 ,./6t,27/I!,*,Idii( /	 *r)   )r3   r8   reversedr;   r#   itemsr   )rO   r:   rP   modulesrI   r$   rF   fuse_handler_clsrG   r]   r^   s            @@r&   r9   r9      s    
 4%%'(G 	  +-6 %99I%-H-N-N-P)35$WG44(8(>?,*  .Q & r)   )NN)&r4   collections.abcr   typingr   $torch.ao.quantization.backend_configr   r   *torch.ao.quantization.backend_config.utilsr   r   r	   torch.ao.quantization.utilsr
   r   torch.fxr   r   r   torch.fx.graphr   custom_configr   fuse_handlerr   r   match_utilsr   r   pattern_utilsr   __all__boolr3   strr   rS   r9    r)   r&   <module>rs      s    $  
 = / /   + N 0 0  	 DH<@	hhh )4S>9D@h "DcN2T9	h
 hV7
77 "&gx&7!87 
#uT7Kd49oMN
NO	7r)   