U
    yh&                     @   s6  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
 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mZ d dlZd dlm Z m!Z! d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   )	_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)FuseCustomConfig)'_get_fusion_pattern_to_fuse_handler_clsFuseHandler)AnyCallableDictListTupleUnionN)PatternNodePatternfuser   )modelis_qatfuse_custom_configbackend_configreturnc                    s  |d krt  }t|tr2tjdtdd t |}t|trVtjdtdd t|}t|  }|d krpt	 }t
t|}t|}t|}t|}t| | j|}	t }
i   fdd}dd }| jjD ]}|	|jd	\}}}}}|d k	r||d }nd }||krn|d k	st|||}||}||d }g }|d k	rL||}||||
||||||	 |j< q|d ks|tkr|
|| |j< qt| |
} | 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.r
   )
stacklevelzPassing 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 O/var/www/html/venv/lib/python3.8/site-packages/torch/ao/quantization/fx/fuse.py<lambda>]       z(fuse.<locals>.load_arg.<locals>.<lambda>)r   )ar%   r'   r(   load_arg\   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)r   r.   dictwarningswarnFutureWarning	from_dictr   named_modulesr   r	   r   r   r   r   _find_matchesgraphr   nodesgetr#   AssertionErrorr   r   Z	node_copyr   )r   r   r   r   r5   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   /   sz    



  

       
)rootr7   pattern_to_fuse_handler_clsr    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>   srD   Zcurrent_node_pattern
subpatternargr?   handlerapply_matchZ	match_mapr'   r(   rL      s    



z"_find_matches.<locals>.apply_match)r0   r5   reversedr8   r#   itemsr   )	r@   r7   rA   modulesr>   r$   r;   Zfuse_handler_clsr<   r'   rK   r(   r6      s    
r6   )NN)'Ztorch.fxr   r   r   Ztorch.fx.graphr   Zmatch_utilsr   r   Zpattern_utilsr	   r   r   r   Zbackend_config.utilsr   r   r   Zcustom_configr   Zfuse_handlerr   r   typingr   r   r   r   r   r   r1   Ztorch.ao.quantization.utilsr   r   __all__boolstrr   r6   r'   r'   r'   r(   <module>   s6      R
 