
    sh%                         S SK JrJr  S SKJrJrJr  S SKrS SKJ	r	  S SK
Jr  S SKJr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  SS/r " S S\5      r " S S\5      rS\	S\\\4   4S jrg)    )ABCabstractmethod)AnyCallableUnionN)BackendConfig)get_fuser_method_new)_parent_nameNodePatternPattern)GraphNode)type_before_parametrizations   )FuseCustomConfig)MatchAllNodeDefaultFuseHandlerFuseHandlerc                       \ rS rSrSr\S\4S j5       r\S\S\	\
\R                  R                  4   S\S\S	\\   S
\S\S\	\\\R                  R*                  \4   4   S\S\4S j5       rSrg)r      z*Base handler class for the fusion patternsnodec                     g N )selfr   s     y/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/torch/ao/quantization/fx/fuse_handler.py__init__FuseHandler.__init__   s        load_argnamed_modulesfused_graph	root_nodeextra_inputsmatched_node_patternfuse_custom_configfuser_method_mappingis_qatreturnc
                     g r   r   )
r   r    r!   r"   r#   r$   r%   r&   r'   r(   s
             r   fuseFuseHandler.fuse#   s     	r   r   N)__name__
__module____qualname____firstlineno____doc__r   r   r   r   dictstrtorchnnModuler   listr   r   r   r   r   
Sequentialboolr+   __static_attributes__r   r   r   r   r      s    4T    C01 	
  3i * - #7E%((2E2Ex2O,P#PQ  
 r   c                      ^  \ rS rSrS\4U 4S jjrS\S\\\	R                  R                  4   S\S\S\\   S	\S
\S\\\\	R                  R&                  \4   4   S\S\4S jrSrU =r$ )r   3   r   c                 $   > [         TU ]  U5        g r   )superr   )r   r   	__class__s     r   r   DefaultFuseHandler.__init__4   s    r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   c
                   ^^^^ UR                   S:X  d   S5       eT[        UR                  5         mUUU4S jmT" U5      n
U4S jmT" U
5      n[        UR                  5      u  p[	        X5      nU" U	/U
Q76 n[        TU   X5        U Vs/ s H  nU" U5      PM     nnUR                  XA5      n[        UR                  5      nUR                  U5        [        U5      Ul        U$ s  snf )Ncall_modulez.Expecting module node to be a call_module Nodec                 J  > [        U [        [        45      (       aB  U tp/ nUR                  T" U5      5        UR	                  U4S jU 5       5        [        U5      $ U nUR
                  S:X  a  TUR                     $ UR
                  S:X  ac  UR                  [        R                  R                  R                  :X  a1  [        R                  R                  5       nTR                  Ul        U$ UR
                  S:X  d  UR
                  S:X  a  UR                  $ [        $ )zGiven a node pattern, extract the corresponding modules
e.g. input: (relu_node, (bn_node, conv_node))
     output: (relu_module, (bn_module, conv_module))
c              3   4   >#    U  H  nT" U5      v   M     g 7fr   r   ).0aget_moduless     r   	<genexpr>?DefaultFuseHandler.fuse.<locals>.get_modules.<locals>.<genexpr>Q   s     <t!{1~~ts   rB   call_functioncall_method)
isinstancetupler7   appendextendoptargetr4   r5   
functionalreluReLUtrainingr   )patternnargsmodulesrS   rG   r!   root_modules        r   rG   ,DefaultFuseHandler.fuse.<locals>.get_modulesH   s    
 'E4=11"13{1~.<t<<W~%44=((22TT_,UXX=P=P=U=U1U 88==?D$/$8$8DMKTT_,0E88O''r   c                    > [        U [        5      (       a  [        [        TU 5      5      $ [        U [        R                  R
                  5      (       a  [        U 5      $ U $ r   )rL   rM   mapr4   r5   r6   r   )mget_matched_typess    r   r_   2DefaultFuseHandler.fuse.<locals>.get_matched_typesc   sH    !U##S!2A677!UXX__--3A66Hr   )rP   r3   rQ   r
   r	   setattr	node_copyr7   rX   rO   rM   )r   r    r!   r"   r#   r$   r%   r&   r'   r(   matched_modulesmatched_module_typesmodule_parent_namemodule_namefuser_methodfused_moduleinput
extra_argsr   rX   r_   rG   rZ   s     `                 @@@r   r+   DefaultFuseHandler.fuse7   s     LLM)	<;	<)#C	(8(8$9:	(2 &&:;	  1A*6y7G7G*H'+,@W $F=_=01;M3?@<%huo<
@$$Y9DIIJ$K	 As   C-r   )r-   r.   r/   r0   r   r   r   r2   r3   r4   r5   r6   r   r7   r   r   r   r   r   r8   r9   r+   r:   __classcell__)r?   s   @r   r   r   3   s    T ?? C01? 	?
 ? 3i? *? -? #7E%((2E2Ex2O,P#PQ? ? 
? ?r   backend_configr)   c                 ~    0 nU R                   R                  5        H  u  p#UR                  c  M  [        X'   M     U$ r   )!_pattern_complex_format_to_configitemsrg   r   )rm   fusion_pattern_to_fuse_handlersrV   configs       r   '_get_fusion_pattern_to_fuse_handler_clsrs   y   sE     @B#)KKQQS*7I+4 T +*r   )abcr   r   typingr   r   r   r4   $torch.ao.quantization.backend_configr   +torch.ao.quantization.fuser_method_mappingsr	   torch.ao.quantization.utilsr
   r   r   torch.fx.graphr   r   torch.nn.utils.parametrizer   custom_configr   match_utilsr   __all__r   r   r2   rs   r   r   r   <module>r~      sr    # ' '  > L J J & C + % # .C CL+!+	'8
+r   