U
    9%e                     @   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< 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 \/var/www/html/Darija-Ai-API/env/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
 