
    ȅi`                         S SK JrJr  S SKJr  S SK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)Callable)AnyN)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   S\S\4S j5       rSrg)r      z*Base handler class for the fusion patternsnodec                     g N )selfr   s     _/home/james-whalen/.local/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   
Sequentialboolr*   __static_attributes__r   r   r   r   r      s    4T    C01 	
  3i * - #7EHH,?,?(,J#JK  
 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   S\S\4S jrSrU =r$ )r   4   r   c                 $   > [         TU ]  U5        g r   )superr   )r   r   	__class__s     r   r   DefaultFuseHandler.__init__5   s    r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   c
                   ^^^^ UR                   S:w  a  [        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                 H  > [        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  ab  UR                  [        R                  R                  R                  L 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   rA   call_functioncall_method)
isinstancetupler6   appendextendoptargetr3   r4   
functionalreluReLUtrainingr   )patternnargsmodulesrR   rF   r    root_modules        r   rF   ,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   )rK   rL   mapr3   r4   r5   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   )rO   AssertionErrorr2   rP   r	   r   setattr	node_copyr6   rW   rN   rL   )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   rW   r^   rF   rY   s     `                 @@@r   r*   DefaultFuseHandler.fuse8   s     <<=( !QRR#C	(8(8$9:	(2 &&:;	  1A*6y7G7G*H'+,@W $F=_=01;M3?@<%huo<
@$$Y9DIIJ$K	 As   C1r   )r,   r-   r.   r/   r   r   r   r1   r2   r3   r4   r5   r   r6   r   r
   r   r   r7   r8   r*   r9   __classcell__)r>   s   @r   r   r   4   s    T >> C01> 	>
 > 3i> *> -> #7EHH,?,?(,J#JK> > 
> >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_handlersrU   configs       r   '_get_fusion_pattern_to_fuse_handler_clsrs   y   sE     @B#)KKQQS*7I+4 T +*r   )abcr   r   collections.abcr   typingr   r3   $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   r1   rs   r   r   r   <module>r      sr    # $   > L J J & C + % # .B BJ+!+	'8
+r   