o
    h                     @   sH  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dede#deeee$ef df deeee$ef df def
ddZ%dededee ef dee$eee e!eeeef f f f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 u rt  }t|trtd t |}t|tr%td t|}t|  }|d u r2t	 }t
t|}t|}t|}t|}t| | j|}	t }
i   fdd}dd }| jjD ]a}|	|jd\}}}}}|d urw||d }nd }||u r|d usJ |||}||}||d }g }|d ur||}||||
||||||	 |j< q^|d u s|tu r|
|| |j< q^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 S/var/www/html/ai/venv/lib/python3.10/site-packages/torch/ao/quantization/fx/fuse.py<lambda>V   s   
 z(fuse.<locals>.load_arg.<locals>.<lambda>)r   )ar$   r&   r'   load_argU   s   zfuse.<locals>.load_argc                 S   s,   t | d ts| d } t | d tr| d S )N)
isinstancer   )node_patternr&   r&   r'   default_root_node_getterX   s   z&fuse.<locals>.default_root_node_getter)NNNNN)r   r,   r   warningswarn	from_dictr   dictnamed_modulesr   r	   r   r   r   r   _find_matchesgraphr   nodesgetr"   r   r   	node_copyr   )r   r   r   r   r3   "fusion_pattern_to_fuse_handler_clsfuser_method_mapping"fusion_pattern_to_root_node_getter%fusion_pattern_to_extra_inputs_getterfusion_pairsfused_graphr*   r.   r#   maybe_last_nodepatternmatched_node_patternobjnode_to_subpatternnode_subpatternroot_node_getter	root_nodeextra_inputs_getterextra_inputsr&   r$   r'   r   .   sb   




rootr5   pattern_to_fuse_handler_clsc           	   	      s   t |  }i i } fdd t|jD ]'}|jvr=| D ]\}}g }t|||r< ||||||f||  nq!qS )Nc                    s   t | tr/| ^}}g } ||||| t||jD ]\}}	 ||	||| q|t| d S |jvrR|| | turT| ||< |\}
} }|
| |||f|j< d S d S d S r!   )r,   tuplezipargsappendr"   r   )r@   r#   matchrA   rC   srM   current_node_pattern
subpatternargrF   handlerapply_match	match_mapr&   r'   rV      s   



z"_find_matches.<locals>.apply_match)r2   r3   reversedr6   r"   itemsr   )	rI   r5   rJ   modulesrC   r#   r@   fuse_handler_clsrA   r&   rU   r'   r4   y   s   
r4   )NN)'torch.fxr   r   r   torch.fx.graphr   match_utilsr   r   pattern_utilsr	   r   r   r   backend_config.utilsr   r   r   custom_configr   fuse_handlerr   r   typingr   r   r   r   r   r   r/   torch.ao.quantization.utilsr   r   __all__boolstrr   r4   r&   r&   r&   r'   <module>   sH     
K
 