
    Vh%                         d dl mZ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 d dlmZ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 ddgZ G d de      Z G d de      Zde	deeef   fdZy)    )ABCabstractmethod)AnyCallableUnionN)BackendConfig)get_fuser_method_new)_parent_nameNodePatternPattern)GraphNode)type_before_parametrizations   )FuseCustomConfig)MatchAllNodeDefaultFuseHandlerFuseHandlerc                       e Zd ZdZedefd       Zededee	e
j                  j                  f   dededee   d	ed
edeeee
j                  j(                  ef   f   dedefd       Zy)r   z*Base handler class for the fusion patternsnodec                      y N )selfr   s     U/home/dcms/DCMS/lib/python3.12/site-packages/torch/ao/quantization/fx/fuse_handler.py__init__z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
                      y r   r   )
r   r   r   r    r!   r"   r#   r$   r%   r&   s
             r   fusezFuseHandler.fuse#   s     	r   N)__name__
__module____qualname____doc__r   r   r   r   dictstrtorchnnModuler   listr   r   r   r   r   
Sequentialboolr)   r   r   r   r   r      s    4T    C01 	
  3i * - #7E%((2E2Ex2O,P#PQ  
 r   c                        e Zd Zdef fdZdedeeej                  j                  f   dededee   ded	ed
eeeej                  j$                  ef   f   dedefdZ xZS )r   r   c                 $    t         |   |       y r   )superr   )r   r   	__class__s     r   r   zDefaultFuseHandler.__init__4   s    r   r   r   r    r!   r"   r#   r$   r%   r&   r'   c
                    |j                   dk(  sJ d       t        |j                           fd |      }
fd |
      }t        |j                        \  }}t	        ||      } ||	g|
 }t        |   ||       |D cg c]
  } ||       }}|j                  ||      }t        |j                        }|j                  |       t        |      |_        |S c c}w )Ncall_modulez.Expecting module node to be a call_module Nodec                 6   t        | t        t        f      rB| ^}}g }|j                   |             |j	                  fd|D               t        |      S | }|j
                  dk(  r|j                     S |j
                  dk(  rb|j                  t        j                  j                  j                  k(  r1t        j                  j                         }j                  |_        |S |j
                  dk(  s|j
                  dk(  r|j                  S t        S )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   .   K   | ]  } |        y wr   r   ).0aget_moduless     r   	<genexpr>z?DefaultFuseHandler.fuse.<locals>.get_modules.<locals>.<genexpr>Q   s     <!{1~<s   r;   call_functioncall_method)
isinstancetupler3   appendextendoptargetr0   r1   
functionalreluReLUtrainingr   )patternnargsmodulesrK   r@   r   root_modules        r   r@   z,DefaultFuseHandler.fuse.<locals>.get_modulesH   s    
 'E4=1"D13{1~.<t<<W~%44=((22TT_,UXX=P=P=U=U1U 88==?D$/$8$8DMKTT_,0E88O''r   c                     t        | t              rt        t        |             S t        | t        j                  j
                        rt        |       S | S r   )rD   rE   mapr0   r1   r2   r   )mget_matched_typess    r   rV   z2DefaultFuseHandler.fuse.<locals>.get_matched_typesc   sB    !U#S!2A677!UXX__-3A66Hr   )rH   r/   rI   r
   r	   setattr	node_copyr3   rP   rG   rE   )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   rP   rV   r@   rR   s     `                 @@@r   r)   zDefaultFuseHandler.fuse7   s     LLM)	<;	<)#C	(8(8$9:	(2 &&:;	  1A*6y7G7G*H'K+,@BVW $F=_=01;M3?@%huo@
@$$Y9DIIJ$K	 As   C+)r*   r+   r,   r   r   r   r.   r/   r0   r1   r2   r   r3   r   r   r   r   r   r4   r5   r)   __classcell__)r9   s   @r   r   r   3   s    T ?? C01? 	?
 ? 3i? *? -? #7E%((2E2Ex2O,P#PQ? ? 
?r   backend_configr'   c                 z    i }| j                   j                         D ]  \  }}|j                  t        ||<    |S r   )!_pattern_complex_format_to_configitemsr]   r   )rb   fusion_pattern_to_fuse_handlersrN   configs       r   '_get_fusion_pattern_to_fuse_handler_clsrh   y   sO     @B#)KKQQS J*7I+G4J +*r   )abcr   r   typingr   r   r   r0   $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   r.   rh   r   r   r   <module>rs      sr    # ' '  > L J J & C + % # .C CL+!+	'8
+r   