
    sgo                         d dl mZmZ d dlmZmZ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DictList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     X/var/www/html/venv/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   r   strtorchnnModuler   r   r   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        |   ||       g }|D ]  }|j                   ||              |j                  ||      }t        |j                        }|j                  |       t        |      |_	        |S )Ncall_modulez.Expecting module node to be a call_module Nodec                 >   t        | t        t        f      rF| ^}}g }|j                   |             |D ]  }|j                   |              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))
            r;   call_functioncall_method)
isinstancetuplelistappendoptargetr1   r2   
functionalreluReLUtrainingr   )	patternnargsmodulesarF   get_modulesr!   root_modules	         r   rN   z,DefaultFuseHandler.fuse.<locals>.get_modulesH   s    
 'E4=1"D13{1~. 3ANN;q>23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   )r?   r@   mapr1   r2   r3   r   )mget_matched_typess    r   rS   z2DefaultFuseHandler.fuse.<locals>.get_matched_typesd   sB    !U#S!2A677!UXX__-3A66Hr   )rC   r0   rD   r   r   setattrrB   	node_copyrA   rK   extendr@   )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_argsinputr   rK   rS   rN   rO   s     `                 @@@r   r+   zDefaultFuseHandler.fuse7   s    LLM)	<;	<)#C	(8(8$9:	(4 &&:;	  1A*6y7G7G*H'K+,@BVW $F=_=01;M
! 	/Ehuo.	/$$Y9DIIJ$K	r   )r,   r-   r.   r   r   r   r   r0   r1   r2   r3   r   r   r   r   r   r   r	   r4   r5   r+   __classcell__)r9   s   @r   r   r   3   s    T BB C01B 	B
 B 3iB *B -B #7E%((2E2Ex2O,P#PQB B 
Br   backend_configr)   c                 z    i }| j                   j                         D ]  \  }}|j                  t        ||<    |S r   )!_pattern_complex_format_to_configitemsr[   r   )r`   fusion_pattern_to_fuse_handlersrI   configs       r   '_get_fusion_pattern_to_fuse_handler_clsrf   |   sO     @B#)KKQQS J*7I+G4J +*r   )abcr   r   typingr   r   r   r   r	   r1   $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   rf   r   r   r   <module>rq      sr    # 3 3  > L J J & C + % # .F FR+!+	'8
+r   