o
    IhX                     @   s<  d dl 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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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 Q/var/www/vscode/kcb/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   r2   "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   




rootr4   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!   matchr@   rB   srL   current_node_pattern
subpatternargrE   handlerapply_match	match_mapr$   r%   rU      s,   




z"_find_matches.<locals>.apply_match)r-   r2   reversedr5   r    itemsr   )	rH   r4   rI   modulesrB   r!   r?   fuse_handler_clsr@   r$   rT   r%   r3      s*   

r3   )NN)&r.   typingr   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__boolr-   strr   rJ   r3   r$   r$   r$   r%   <module>   sH   
h
 