U
    KcH                     @   sD  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mZ dd	lmZmZ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 Z d dl!m"Z"m#Z# dgZ$dee%eeee&ef df eeee&ef d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   )BackendConfigget_native_backend_config)get_fuser_method_mapping&get_fusion_pattern_to_root_node_getter)get_fusion_pattern_to_extra_inputs_getter)&get_fusion_pattern_to_fuse_handler_cls)FuseCustomConfig)*)AnyCallableDictListTupleUnionN)PatternNodePatternfuse)modelis_qatfuse_custom_configbackend_configreturnc                    s  |d krt  }t|tr,td t |}t|trJtd t|}| }| j}t|	 }|d krnt
 }tt|}t|}t|}	t|}
t|||}t }i   fdd}dd }|jD ]}||jd\}}}}}|d k	r||d }nd }||krh|d k	st|	||}||}|
|d }g }|d k	rF||}||||||||||	 |j< q|d ksz|tkr||| |j< qt|j}t|||} | S )NzPassing a fuse_custom_config_dict to fuse is deprecated and will not be supported in a future version. Please pass in a FuseCustomConfig instead.zPassing a backend_config_dict to prepare is deprecated and will not be supported in a future version. Please pass in a BackendConfig instead.c                    s   t |  fddS )Nc                    s
    | j  S N)name)nodeenv A/tmp/pip-unpacked-wheel-gikjz4vx/torch/ao/quantization/fx/fuse.py<lambda>T       z(fuse.<locals>.load_arg.<locals>.<lambda>)r   )ar%   r'   r(   load_argS   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_getterV   s    
z&fuse.<locals>.default_root_node_getter)NNNNN)r   r.   r   warningswarn	from_dictr   graphdictnamed_modulesr   r
   r   r   r   r   _find_matchesr   nodesgetr#   AssertionErrorr   r	   Z	node_copysetpreserved_attributesr   )r   r   r   r    Z
input_rootZinput_graphr5   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(   r   ,   sx    



  


       
)rootr3   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	   )r<   r$   matchr=   r?   srE   Zcurrent_node_pattern
subpatternargr@   handlerapply_matchZ	match_mapr'   r(   rM      s    



z"_find_matches.<locals>.apply_match)r4   r5   reversedr7   r#   itemsr   )	rA   r3   rB   modulesr?   r$   r<   valuer=   r'   rL   r(   r6   x   s    
r6   )NN)*Ztorch.fxr   r   r   Ztorch.fx.graphr   Zgraph_moduler   Zmatch_utilsr   r	   Zpattern_utilsr
   r    r   r   Zbackend_config.utilsr   r   r   Zbackend_config_utilsr   Zcustom_configr   Zfusion_patternstypingr   r   r   r   r   r   r0   Z(torch.ao.quantization.quantization_typesr   r   __all__boolstrr   ZFuseHandlerr6   r'   r'   r'   r(   <module>   s8      M 
 