U
    KºcÁ  ã                   @   s¬   d dl Z d dlZd dlmZ d dlmZ d dlmZmZm	Z	m
Z
 G dd„ deƒZG dd„ deƒZe	ed	œd
d„ZG dd„ deƒZe	ed	œdd„Zdd„ ZG dd„ deƒZdS )é    N)ÚGraphModule)ÚGraph)ÚUnionÚDictÚAnyÚSetc                       sF   e Zd Zeejjeee	f f e
ee dœ‡ fdd„Zdd„ Z‡  ZS )ÚFusedGraphModule©ÚrootÚgraphÚpreserved_attr_namesc                    sF   || _ ‡ fdd„| j D ƒ}tƒ  ˆ |¡ |D ]}t| ||| ƒ q,d S )Nc                    s"   i | ]}t ˆ |ƒr|tˆ |ƒ“qS © ©ÚhasattrÚgetattr©Ú.0Úattr©r
   r   úI/tmp/pip-unpacked-wheel-gikjz4vx/torch/ao/quantization/fx/graph_module.pyÚ
<dictcomp>
   s     
  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   s4   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__   s    
zFusedGraphModule.__deepcopy__©Ú__name__Ú
__module__Ú__qualname__r   r   r    r!   r   Ústrr   r   r   r   r'   Ú__classcell__r   r   r   r   r      s   .
r   c                       sF   e Zd Zeejjeee	f f e
ee dœ‡ fdd„Zdd„ Z‡  ZS )ÚObservedGraphModuler	   c                    sd   t ddddddddd	d
g
ƒ |¡| _‡ fdd„| jD ƒ}tƒ  ˆ |¡ |D ]}t| ||| ƒ qJd S )NZ_activation_post_process_mapZ _activation_post_process_indexesZ	_patternsZ_qconfig_mapZ_prepare_custom_configZ_equalization_qconfig_mapZ_node_name_to_scopeZ_qconfig_mappingZ_is_qatZ_observed_node_namesc                    s"   i | ]}t ˆ |ƒr|tˆ |ƒ“qS r   r   r   r   r   r   r   %   s     
  z0ObservedGraphModule.__init__.<locals>.<dictcomp>)ÚsetÚunionr   r   r   r   r   r   r   r   r      s$    ö
özObservedGraphModule.__init__c                 C   s4   t j ¡ }t | j¡|_t|t | j¡t | j¡ƒS r   )	r   r    r!   r"   r#   r$   r.   r   r   r%   r   r   r   r'   -   s    
z ObservedGraphModule.__deepcopy__r(   r   r   r   r   r.      s   .r.   )ÚmoduleÚreturnc                 C   s
   t | tƒS r   )Ú
isinstancer.   ©r1   r   r   r   Úis_observed_module2   s    r5   c                       sF   e Zd Zeejjeee	f f e
ee dœ‡ fdd„Zdd„ Z‡  ZS )ÚObservedStandaloneGraphModuler	   c                    s&   |  tddgƒ¡}tƒ  |||¡ d S )NZ'_standalone_module_input_quantized_idxsZ(_standalone_module_output_quantized_idxs)r0   r/   r   r   )r   r
   r   r   r   r   r   r   6   s
    þz&ObservedStandaloneGraphModule.__init__c                 C   s4   t j ¡ }t | j¡|_t|t | j¡t | j¡ƒS r   )	r   r    r!   r"   r#   r$   r6   r   r   r%   r   r   r   r'   <   s    
z*ObservedStandaloneGraphModule.__deepcopy__r(   r   r   r   r   r6   5   s   .r6   c                 C   s
   t | tƒS r   )r3   r6   r4   r   r   r   Úis_observed_standalone_moduleA   s    r7   c                 C   sD   t | ƒD ]6}d|krtt| |ƒtjjƒrt| |ƒ}|||| < qd S ©NZ_packed_weight)Údirr3   r   r   Ú_CÚScriptObject)r   ZdestinationÚprefixZ	keep_varsÚ	attr_nameZpacked_weightr   r   r   Ú_save_packed_weightD   s    ÿ
r>   c                       sV   e Zd ZdZeejjee	e
f f eee	 dœ‡ fdd„Z‡ fdd„Zdd„ Z‡  ZS )	ÚQuantizedGraphModulea	   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	   c                    sP   || _ ‡ fdd„| j D ƒ}tƒ  ˆ |¡ |D ]}t| ||| ƒ q,|  t¡ d S )Nc                    s"   i | ]}t ˆ |ƒr|tˆ |ƒ“qS r   r   r   r   r   r   r   S   s     
  z1QuantizedGraphModule.__init__.<locals>.<dictcomp>)r   r   r   r   Z_register_state_dict_hookr>   r   r   r   r   r   Q   s    zQuantizedGraphModule.__init__c           
   	      st   g }|D ]:}	|	  d¡rt||	 tjjƒrt| |	||	 ƒ | |	¡ q|D ]}	| |	¡ qHtƒ  	|||||||¡ d S r8   )
Ú
startswithr3   r   r:   r;   r   ÚappendÚpopr   Ú_load_from_state_dict)
r   Z
state_dictr<   Zlocal_metadataÚstrictZmissing_keysZunexpected_keysZ
error_msgsZattrs_to_popr=   r   r   r   rC   Y   s    z*QuantizedGraphModule._load_from_state_dictc                 C   s4   t j ¡ }t | j¡|_t|t | j¡t | j¡ƒS r   )	r   r    r!   r"   r#   r$   r?   r   r   r%   r   r   r   r'   h   s    
z!QuantizedGraphModule.__deepcopy__)r)   r*   r+   Ú__doc__r   r   r    r!   r   r,   r   r   r   r   rC   r'   r-   r   r   r   r   r?   K   s   .r?   )r   r"   Ztorch.fxr   Ztorch.fx.graphr   Útypingr   r   r   r   r   r.   Úboolr5   r6   r7   r>   r?   r   r   r   r   Ú<module>   s   