U
    yhk                     @   s   d dl Z d dlmZ d dlmZmZ ddlmZ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 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eee	ef dddZdS )    N)BackendConfig)NodeGraph   )_parent_nameNodePatternPattern)get_fuser_method_new)ABCabstractmethod)AnyCallableDictListUnion   )FuseCustomConfig)MatchAllNode)type_before_parametrizationsDefaultFuseHandlerFuseHandlerc                   @   sj   e Zd ZdZeedddZeeee	e
jjf 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   W/var/www/html/venv/lib/python3.8/site-packages/torch/ao/quantization/fx/fuse_handler.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   
Sequentialboolr*   r   r   r   r   r      s    c                       sf   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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   Z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   rE   ?   s"    


z,DefaultFuseHandler.fuse.<locals>.get_modulesc                    s2   t | trtt | S t | tjjr.t| S | S r   )r9   r:   mapr0   r1   r2   r   )m)get_matched_typesr   r   rI   [   s
    
z2DefaultFuseHandler.fuse.<locals>.get_matched_types)r=   AssertionErrorr/   r>   r   r	   setattrr<   Z	node_copyr;   rB   extendr:   )r   r    r!   r"   r#   r$   r%   r&   r'   r(   Zmatched_modulesZmatched_module_typesZmodule_parent_namemodule_namefuser_methodZfused_module
extra_argsinputr   rB   r   )rI   rE   r!   rF   r   r*   2   s$    




zDefaultFuseHandler.fuse)r+   r,   r-   r   r   r   r   r/   r0   r1   r2   r   r   r   r   r   r   r   r3   r4   r*   __classcell__r   r   r6   r   r   ,   s    )backend_configr)   c                 C   s.   i }| j  D ]\}}|jd k	rt||< q|S r   )Z!_pattern_complex_format_to_configitemsrN   r   )rR   Zfusion_pattern_to_fuse_handlersr@   configr   r   r   '_get_fusion_pattern_to_fuse_handler_clsr   s
    

rU   )r0   Z$torch.ao.quantization.backend_configr   Ztorch.fx.graphr   r   utilsr   r   r   Zfuser_method_mappingsr	   abcr
   r   typingr   r   r   r   r   Zcustom_configr   Zmatch_utilsr   Ztorch.nn.utils.parametrizer   __all__r   r   rU   r   r   r   r   <module>   s"   G 
