a
    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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 )    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r2tjdtdd t |}t|trVtjdtdd t|}t|  }|d u rpt	 }t
t|}t|}t|}t|}t| | j|}	t }
i   fdd}dd }| jjD ]}|	|jd	\}}}}}|d ur||d }nd }||u rn|d usJ |||}||}||d }g }|d urL||}||||
||||||	 |j< q|d u s|tu 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.   )
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 K/var/www/auris/lib/python3.9/site-packages/torch/ao/quantization/fx/fuse.py<lambda>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 } q | d S )N)
isinstancer   )Z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   Z	node_copyr   )r   r   r   r   r2   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       s    






)rootr4   pattern_to_fuse_handler_clsr   c           	   	      s   t |  }i i } fdd t|jD ]N}|jvr,| D ]6\}}g }t|||rB ||||||f||  q,qBq,S )Nc                    s   t | tr\| ^}}g } ||||| t||jD ]\}}	 ||	||| q2|t| nB|jvr|| | tur| ||< |\}
} }|
| |||f|j< d S r   )r+   tuplezipargsappendr    r   )r7   r!   matchr8   r:   sr@   Zcurrent_node_pattern
subpatternargr;   handlerapply_matchZ	match_mapr$   r%   rH      s(    




z"_find_matches.<locals>.apply_match)r-   r2   reversedr5   r    itemsr   )	r<   r4   r=   modulesr:   r!   r7   Zfuse_handler_clsr8   r$   rG   r%   r3      s&    
r3   )NN)&r.   typingr   r   r   Z$torch.ao.quantization.backend_configr   r   Z*torch.ao.quantization.backend_config.utilsr   r   r	   Ztorch.ao.quantization.utilsr
   r   Ztorch.fxr   r   r   Ztorch.fx.graphr   Zcustom_configr   Zfuse_handlerr   r   Zmatch_utilsr   r   Zpattern_utilsr   __all__boolr-   strr   r>   r3   r$   r$   r$   r%   <module>   s6     i
 