U
    ©Ê¹j�  ã                   @   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ƒr,t d¡ t  |¡}t|tƒrJt d¡ t |¡}t|  ¡ ƒ}|d krdt	ƒ }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�rb|d k	�s
t‚| ||¡}||ƒ}| |d ¡}g }|d k	�r@||ƒ}| |||
||||||¡	ˆ |j< q¼|d k�st|tkr¼|
 ||¡ˆ |j< q¼t| |
ƒ} | S )Nz‘Passing a fuse_custom_config_dict to fuse is deprecated and will not be supported in a future version. Please pass in a FuseCustomConfig instead.z�Passing 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© ú\/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/ao/quantization/fx/fuse.pyÚ<lambda>V   ó    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 } q | d S )Néÿÿÿÿ)Ú
isinstancer   )Z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"   ÚAssertionErrorr   r   Z	node_copyr   )r   r   r   r   r3   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   .   sr    
ÿ

ÿ
  ÿÿ

       þ
)Úrootr5   Ú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   )r9   r#   Úmatchr:   r<   ÚsrB   Zcurrent_node_patternÚ
subpatternÚargr=   Úhandler©Úapply_matchZ	match_mapr&   r'   rJ   †   s    



z"_find_matches.<locals>.apply_match)r2   r3   Úreversedr6   r"   Úitemsr   )	r>   r5   r?   Úmodulesr<   r#   r9   Zfuse_handler_clsr:   r&   rI   r'   r4   y   s    ÿ
r4   )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   r/   Ztorch.ao.quantization.utilsr   r   Ú__all__ÚboolÚstrr   r4   r&   r&   r&   r'   Ú<module>   s6    ü  üûL
 ü