a
    d                     @   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 u rt  }t|tr,td t |}t|trJtd t|}t|  }|d u rdt	 }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 rb|d us
J |||}||}||d }g }|d ur@||}||||
||||||	 |j< q|d u st|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.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 f/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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"   r   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   .   s`    






)rootr5   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   )r8   r#   matchr9   r;   srA   Zcurrent_node_pattern
subpatternargr<   handlerapply_matchZ	match_mapr&   r'   rI      s    



z"_find_matches.<locals>.apply_match)r2   r3   reversedr6   r"   itemsr   )	r=   r5   r>   modulesr;   r#   r8   Zfuse_handler_clsr9   r&   rH   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
 