U
    Kc                     @   s   d dl Z d dlmZmZ ddlmZ d dlmZmZ ddl	m
Z
 d dlmZmZ d dlmZmZmZmZ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 deZG dd deZdS )    N)NodeGraph   )_parent_name)NodePatternPattern)get_fuser_method_new)ABCabstractmethod)AnyCallableDictOptionalUnionList   )FuseCustomConfig)MatchAllNode)type_before_parametrizationsDefaultFuseHandlerFuseHandlerc                   @   sj   e Zd ZdZedddZeeee	e
jjf eeee eeeeeee
jjef f  eed
ddZdS )	r   z0 Base handler class for the fusion patterns
    nodec                 C   s   d S N selfr   r   r   L/tmp/pip-unpacked-wheel-gikjz4vx/torch/ao/quantization/fx/fusion_patterns.py__init__   s    zFuseHandler.__init__
load_argnamed_modulesfused_graph	root_nodeextra_inputsmatched_node_patternfuse_custom_configfuser_method_mappingis_qatreturnc
           
      C   s   d S r   r   )
r   r    r!   r"   r#   r$   r%   r&   r'   r(   r   r   r   fuse   s    zFuseHandler.fuseN)__name__
__module____qualname____doc__r   r   r
   r   r   strtorchnnModuler   r   r   r   r   r   r   r   
Sequentialboolr*   r   r   r   r   r      s    c                       sj   e Zd Zed fddZeeeej	j
f eeee eeeeeeej	jef f  eed
ddZ  ZS )r   r   c                    s   t  | d S r   )superr   r   	__class__r   r   r   ,   s    zDefaultFuseHandler.__init__r   c
                    s   |j dkstdt|j fdd|}
 fdd  |
}t|j\}}t||}||	f|
 }t| || g }|D ]}||| q|||}t	|j
}|| t||_
|S )Ncall_modulez.Expecting module node to be a call_module Nodec                    s   t | ttfrH| ^}}g }| | |D ]}| | q,t|S | }|jdkr`|j S |jdkr|jtjjj	krtj
 }j|_|S |jdks|jdkr|jS tS dS )z Given a node pattern, extract the corresponding modules
            e.g. input: (relu_node, (bn_node, conv_node))
                 output: (relu_module, (bn_module, conv_module))
            r8   call_functionZcall_methodN)
isinstancetuplelistappendoptargetr0   r1   Z
functionalreluZReLUZtrainingr   )patternnargsmodulesar@   )get_modulesr!   root_moduler   r   rF   >   s"    


z,DefaultFuseHandler.fuse.<locals>.get_modulesc                    s2   t | trtt | S t | tjjr.t| S | S r   )r:   r;   mapr0   r1   r2   r   )m)get_matched_typesr   r   rJ   Z   s
    
z2DefaultFuseHandler.fuse.<locals>.get_matched_types)r>   AssertionErrorr/   r?   r   r   setattrr=   Z	node_copyr<   rC   extendr;   )r   r    r!   r"   r#   r$   r%   r&   r'   r(   Zmatched_modulesZmatched_module_typesZmodule_parent_namemodule_nameZfuser_methodZfused_module
extra_argsinputr   rC   r   )rJ   rF   r!   rG   r   r*   1   s$    




zDefaultFuseHandler.fuse)r+   r,   r-   r   r   r   r   r/   r0   r1   r2   r   r   r   r   r   r   r   r   r3   r4   r*   __classcell__r   r   r6   r   r   +   s    )r0   Ztorch.fx.graphr   r   utilsr   Z(torch.ao.quantization.quantization_typesr   r   Zfuser_method_mappingsr   abcr	   r
   typingr   r   r   r   r   r   Zcustom_configr   Zmatch_utilsr   Ztorch.nn.utils.parametrizer   __all__r   r   r   r   r   r   <module>   s    