o
    ߗik                     @   sH  d dl Z d dlmZmZmZmZmZmZ d dlm	Z	m
Z
 d dlmZmZ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mZmZ ddlmZmZ ddl 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 )    N)AnyCallableDictListTupleUnion)BackendConfigget_native_backend_config)get_fuser_method_mapping)get_fusion_pattern_to_extra_inputs_getter&get_fusion_pattern_to_root_node_getter)NodePatternPattern)GraphModulemap_argNode)Graph   )FuseCustomConfig)'_get_fusion_pattern_to_fuse_handler_clsFuseHandler)	_is_matchMatchAllNode)_sorted_patterns_dictfuser   modelis_qatfuse_custom_configbackend_configreturnc                    s  |d u rt  }t|trtjdtdd t |}t|tr+tjdtdd t|}t|  }|d u r8t	 }t
t|}t|}t|}t|}t| | j|}	t }
i   fdd}dd }| jjD ]a}|	|jd	\}}}}}|d ur}||d }nd }||u r|d usJ |||}||}||d }g }|d ur||}||||
||||||	 |j< qd|d u s|tu r|
|| |j< qdt| |
} | 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.   )
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 [/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/torch/ao/quantization/fx/fuse.py<lambda>S   s   
 z(fuse.<locals>.load_arg.<locals>.<lambda>)r   )ar%   r'   r(   load_argR   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_getterU   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#   r   r   	node_copyr   )r   r   r   r   r5   "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       s   




rootr7   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   )rB   r$   matchrC   rE   srO   current_node_pattern
subpatternargrH   handlerapply_match	match_mapr'   r(   rX      s,   




z"_find_matches.<locals>.apply_match)r0   r5   reversedr8   r#   itemsr   )	rK   r7   rL   modulesrE   r$   rB   fuse_handler_clsrC   r'   rW   r(   r6      s*   

r6   )NN)'r1   typingr   r   r   r   r   r   $torch.ao.quantization.backend_configr   r	   *torch.ao.quantization.backend_config.utilsr
   r   r   torch.ao.quantization.utilsr   r   torch.fxr   r   r   torch.fx.graphr   custom_configr   fuse_handlerr   r   match_utilsr   r   pattern_utilsr   __all__boolstrr   r6   r'   r'   r'   r(   <module>   sH    
h
 