o
    ‡ZŽhÖ  ã                   @   sÒ   d dl Z d dlmZmZ d dlZd dlmZ d dlmZ g d¢Z	G dd„ deƒZ
G dd	„ d	eƒZd
edefdd„Zdeejjef dedefdd„ZG dd„ deƒZd
edefdd„Zdd„ ZG dd„ deƒZdS )é    N)ÚAnyÚUnion)ÚGraphModule)ÚGraph)ÚFusedGraphModuleÚObservedGraphModuleÚObservedStandaloneGraphModuleÚQuantizedGraphModulec                       óJ   e Zd Zdeejjeee	f f de
dee f‡ fdd„Zdd„ Z‡  ZS )r   ÚrootÚgraphÚpreserved_attr_namesc                    sF   || _ ‡ fdd„| j D ƒ}tƒ  ˆ |¡ |D ]
}t| ||| ƒ qd S )Nc                    ó"   i | ]}t ˆ |ƒr|tˆ |ƒ“qS © ©ÚhasattrÚgetattr©Ú.0Úattr©r   r   úT/var/www/auris/lib/python3.10/site-packages/torch/ao/quantization/fx/graph_module.pyÚ
<dictcomp>   ó    ý
ÿz-FusedGraphModule.__init__.<locals>.<dictcomp>)r   ÚsuperÚ__init__Úsetattr©Úselfr   r   r   Zpreserved_attrsr   ©Ú	__class__r   r   r      s   
þÿzFusedGraphModule.__init__c                 C   ó4   t j ¡ }t | j¡|_t|t | j¡t | j¡ƒS ©N)	ÚtorchÚnnÚModuleÚcopyÚdeepcopyÚ__dict__r   r   r   ©r   ÚmemoZfake_modr   r   r   Ú__deepcopy__&   ó   


ýzFusedGraphModule.__deepcopy__©Ú__name__Ú
__module__Ú__qualname__r   r#   r$   r%   ÚdictÚstrr   r   Úsetr   r+   Ú__classcell__r   r   r   r   r      s    þýür   c                       r
   )r   r   r   r   c                    sP   h d£  |¡| _‡ fdd„| jD ƒ}tƒ  ˆ |¡ |D ]
}t| ||| ƒ qd S )N>
   Z_is_qatZ_node_name_to_scopeZ"_equalization_node_name_to_qconfigZ_node_name_to_qconfigZ_activation_post_process_mapZ_prepare_custom_configZ _activation_post_process_indexesZ_qconfig_mappingÚ	_patternsZ_observed_node_namesc                    r   r   r   r   r   r   r   r   C   r   z0ObservedGraphModule.__init__.<locals>.<dictcomp>)Úunionr   r   r   r   r   r   r   r   r   1   s   õ
þÿzObservedGraphModule.__init__c                 C   r!   r"   )	r#   r$   r%   r&   r'   r(   r   r   r   r)   r   r   r   r+   O   r,   z ObservedGraphModule.__deepcopy__r-   r   r   r   r   r   0   s    þýür   ÚmoduleÚreturnc                 C   s   t | dƒo	d| jv S ©NÚmetaÚ_observed_graph_module_attrs)r   r:   ©r7   r   r   r   Ú_is_observed_moduleY   s   r=   ÚmodelÚ	attr_namec                 C   s(   t | dƒrd| jv rt| jd |ƒS d S r9   )r   r:   r   )r>   r?   r   r   r   Ú_get_observed_graph_module_attr]   s   r@   c                       r
   )r   r   r   r   c                    s"   |  ddh¡}tƒ  |||¡ d S )NZ'_standalone_module_input_quantized_idxsZ(_standalone_module_output_quantized_idxs)r6   r   r   )r   r   r   r   r   r   r   r   f   s   þÿz&ObservedStandaloneGraphModule.__init__c                 C   r!   r"   )	r#   r$   r%   r&   r'   r(   r   r   r   r)   r   r   r   r+   t   r,   z*ObservedStandaloneGraphModule.__deepcopy__r-   r   r   r   r   r   e   s    þýür   c                 C   s   t | ƒo	| jd jS )Nr;   )r=   r:   Zis_observed_standalone_moduler<   r   r   r   Ú_is_observed_standalone_module~   s   
þrA   c                 C   sD   t | ƒD ]}d|v rtt| |ƒtjjƒrt| |ƒ}|||| < qd S ©NZ_packed_weight)ÚdirÚ
isinstancer   r#   Ú_CÚScriptObject)r   ÚdestinationÚprefixZ	keep_varsr?   Zpacked_weightr   r   r   Ú_save_packed_weight…   s   
ÿ
€ûrI   c                       sZ   e Zd ZdZdeejjee	e
f f dedee	 f‡ fdd„Z‡ fdd„Zd	d
„ Z‡  ZS )r	   a  This class is created to make sure PackedParams
    (e.g. LinearPackedParams, Conv2dPackedParams) to appear in state_dict
    so that we can serialize and deserialize quantized graph module with
    torch.save(m.state_dict()) and m.load_state_dict(state_dict)
    r   r   r   c                    sP   || _ ‡ fdd„| j D ƒ}tƒ  ˆ |¡ |D ]
}t| ||| ƒ q|  t¡ d S )Nc                    r   r   r   r   r   r   r   r   œ   r   z1QuantizedGraphModule.__init__.<locals>.<dictcomp>)r   r   r   r   Z_register_state_dict_hookrI   r   r   r   r   r   •   s   
þzQuantizedGraphModule.__init__c           
   	      st   g }|D ]}	|	  d¡r!t||	 tjjƒr!t| |	||	 ƒ | |	¡ q|D ]}	| |	¡ q$tƒ  	|||||||¡ d S rB   )
Ú
startswithrD   r#   rE   rF   r   ÚappendÚpopr   Ú_load_from_state_dict)
r   Z
state_dictrH   Zlocal_metadataÚstrictZmissing_keysZunexpected_keysÚ
error_msgsZattrs_to_popr?   r   r   r   rM   ¦   s"   

€ùz*QuantizedGraphModule._load_from_state_dictc                 C   r!   r"   )	r#   r$   r%   r&   r'   r(   r	   r   r   r)   r   r   r   r+   Ä   r,   z!QuantizedGraphModule.__deepcopy__)r.   r/   r0   Ú__doc__r   r#   r$   r%   r1   r2   r   r   r3   r   rM   r+   r4   r   r   r   r   r	   Ž   s    þýür	   )r&   Útypingr   r   r#   Ztorch.fxr   Ztorch.fx.graphr   Ú__all__r   r   Úboolr=   r$   r%   r2   r@   r   rA   rI   r	   r   r   r   r   Ú<module>   s(   )ÿÿ
þ	