U
    d                     @   s*  d dl mZmZmZ d dlmZ ddl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
lmZ ddlmZ ddlmZ ddlT d dlmZmZmZmZmZmZ d dlmZmZ dee eee!ef  eee!ef  edddZ"eeeeef ee!eeeee#eeef f f dddZ$dS )    )GraphModuleNodemap_arg)Graph   )FusedGraphModule)is_matchMatchAllNode)sorted_patterns_dict   )get_fuser_method_mapping)&get_fusion_pattern_to_root_node_getter))get_fusion_pattern_to_extra_inputs_getter)get_native_backend_config_dict)&get_fusion_pattern_to_fuse_handler_cls)*)CallableTupleDictAnyOptionalList)PatternNodePatternN)modelis_qatfuse_custom_config_dictbackend_config_dictreturnc                    sn  |d kri }| }| j }t| }|d kr0t }tt|}t|}t|}	t|}
t	|||}t
 }i   fdd}dd }|jD ]}||jd\}}}}}|d k	r||d }nd }||kr(|d k	st|	||}||}|
|d }g }|d k	r||}||||||||||	 |j< q|d ks:|tkr||| |j< qt|dg }t|||} | S )Nc                    s   t |  fddS )Nc                    s
    | j  S N)name)nodeenv A/tmp/pip-unpacked-wheel-ua33x9lu/torch/ao/quantization/fx/fuse.py<lambda>:       z(fuse.<locals>.load_arg.<locals>.<lambda>)r   )ar"   r$   r%   load_arg9   s    zfuse.<locals>.load_argc                 S   s    t | d ts| d } q | d S )N)
isinstancer   )Znode_patternr$   r$   r%   default_root_node_getter<   s    
z&fuse.<locals>.default_root_node_getter)NNNNNpreserved_attributes)graphdictnamed_modulesr   r
   r   r   r   r   _find_matchesr   nodesgetr    AssertionErrorfuser	   Z	node_copysetr   )r   r   r   r   Z
input_rootZinput_graphr0   Z"fusion_pattern_to_fuse_handler_clsZfuser_method_mappingZ"fusion_pattern_to_root_node_getterZ%fusion_pattern_to_extra_inputs_getterZfusion_pairsZfused_graphr)   r,   r!   Zmaybe_last_nodepatternmatched_node_patternobjnode_to_subpatternZnode_subpatternZroot_node_getter	root_nodeZextra_inputs_getterZextra_inputsr-   r$   r"   r%   r5      sd      


       r5   )rootr.   patternsr   c           	   	      s   t |  }i i } fdd t|jD ]N}|jkr,| D ]6\}}g }t|||rB ||||||f||  q,qBq,S )Nc                    s   t | tr\| ^}}g } ||||| t||jD ]\}}	 ||	||| q2|t| nB|jkr|| | tk	r| ||< |\}
} }|
| |||f|j< d S r   )r+   tuplezipargsappendr    r	   )r7   r!   matchr8   r:   sr@   Zcurrent_node_pattern
subpatternargr;   handlerapply_matchZ	match_mapr$   r%   rH   j   s    



z"_find_matches.<locals>.apply_match)r/   r0   reversedr2   r    itemsr   )	r<   r.   r=   modulesr:   r!   r7   valuer8   r$   rG   r%   r1   ^   s    
r1   )NN)%Ztorch.fxr   r   r   Ztorch.fx.graphr   Zgraph_moduler   Zmatch_utilsr   r	   Zpattern_utilsr
   Zbackend_config.utilsr   r   r   Zbackend_configr   Zbackend_config_utilsr   Zfusion_patternstypingr   r   r   r   r   r   Z(torch.ao.quantization.quantization_typesr   r   boolstrr5   ZFuseHandlerr1   r$   r$   r$   r%   <module>   s4      A 
 