
    `i%                         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dS )    )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dS )r   z*Base handler class for the fusion patternsnodec                     d S N )selfr   s     y/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/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
                     d S 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4T    ^  C01 	
  3i * - #7E%(2Ex2O,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                 J    t                                          |           d S 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|
R  }t          |         ||           fd|D             }|                    |          }t          |j                  }|	                    |           t          |          |_        |S )Ncall_modulez.Expecting module node to be a call_module Nodec                    t          | t          t          f          rT| ^}}g }|                     |                     |                    fd|D                        t          |          S | }|j        dk    r|j                 S |j        dk    rK|j        t          j        j	        j
        k    r,t          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   | ]} |          V  d S r   r   ).0aget_moduless     r   	<genexpr>z?DefaultFuseHandler.fuse.<locals>.get_modules.<locals>.<genexpr>Q   s+      <<!{{1~~<<<<<<r   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1 ("D13{{1~~...<<<<t<<<<<<W~~%4=(((22T_,,UX=P=U1U1U 8==??D$/$8DMKT_,,0E0E8O''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   sW    !U## 8S!2A66777!UX_-- 73A666Hr   c                 &    g | ]} |          S r   r   )r>   inputr   s     r   
<listcomp>z+DefaultFuseHandler.fuse.<locals>.<listcomp>q   s!    @@@%hhuoo@@@r   )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
extra_argsr   rP   rV   r@   rR   s    ``                @@@r   r)   zDefaultFuseHandler.fuse7   sV    |},,,< -,, $C	(8$9$9:	( 	( 	( 	( 	( 	( 	(2 &+&:;;	 	 	 	 	  10AA*6y7G*H*H'K+,@BVWW $|F=_===01;MMM@@@@<@@@
$$Y99DIJ$KK	r   )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%(2Ex2O,P#PQ? ? 
? ? ? ? ? ? ? ?r   backend_configr'   c                 j    i }| j                                         D ]\  }}|j        
t          ||<   |S r   )!_pattern_complex_format_to_configitemsr`   r   )rd   fusion_pattern_to_fuse_handlersrN   configs       r   '_get_fusion_pattern_to_fuse_handler_clsrj   y   sK     @B#)KQQSS J J*7I+G4**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.   rj   r   r   r   <module>ru      sx   # # # # # # # # ' ' ' ' ' ' ' ' ' '  > > > > > > L L L L L L J J J J J J J J J J & & & & & & & & C C C C C C + + + + + + % % % % % %     #   .C C C C C C C CL+!+	'8
+ + + + + +r   