o
    Zh+                     @   s  d dl mZmZ d dlZd dlm  m  mZ d dl	m  m  m  m
Z d dlm  m  m  mZ d dlm  m  m
Z d dlm  m  mZ d dlm  m  m  mZ d dlmZ d dlm  mZ d dlmZ d dlmZ ddlmZm Z  ddl!m"Z"m#Z#m$Z$ ej%jZ&dej'd	ej(fd
dZ)dej'd	ej(fddZ*dej'd	ej(fddZ+dej'd	e,ej( fddZ-dej'd	e,ej( fddZ.dej'd	ej(fddZ/dej'd	ej(fddZ0dej'd	e,ej( fddZ1deded	ej(fddZ2deded	ej(fddZ3deded	ej(fd d!Z4deded	ej(fd"d#Z5d	e6e7e6eef f fd$d%Z8	d)deded&ee6e7e6eef f  d	ee fd'd(Z9dS )*    )CallableOptionalN)GraphModule)Node   )NSSingleResultTypeNSSingleResultValuesType)get_target_type_strgetattr_from_fqnreturn_first_non_observer_nodemodreturnc                 C   s
   | j  S Nweightdetachr    r   J/var/www/auris/lib/python3.10/site-packages/torch/ao/ns/fx/weight_utils.pymod_weight_detach   s   
r   c                 C   s   | d j  S Nr   r   r   r   r   r   mod_0_weight_detach   s   r   c                 C   s   |   d S r   )_weight_biasr   r   r   r   mod_weight_bias_0   s   r   c                 C   sD   g }t | jD ]\}}d|v sd|v r| j|  }|| q|S )Nweight_ih_lweight_hh_l)	enumerate_flat_weights_names_flat_weightsr   append)r   residx
param_nameparam_valuer   r   r   get_lstm_weight"   s   
r$   c                 C   sd   g }| j D ]*}||j d d d  d d  ||j d d d  d d  q|S )Nr      r   )_all_weight_valuesr   param__getstate__)r   r    weight_valuer   r   r   get_qlstm_weight+   s
   
(*r*   c                 C   sP   t | tjtjtjfr| j S t | tjtj	tj
fr"| d j S |  d S r   )
isinstancennConv1dConv2dConv3dr   r   nni
ConvReLU1d
ConvReLU2d
ConvReLU3dr   r   r   r   r   get_conv_mod_weight3   s
   
r4   c                 C   s<   t | tjr| j S t | tjr| d j S |  d S r   )r+   r,   Linearr   r   r0   
LinearReLUr   r   r   r   r   get_linear_mod_weight<   s
   
r7   c                 C   s   t | tjr(g }t| jD ]\}}d|v sd|v r%| j|  }|| q|S t | tjs8J dt	|  dg }| j
D ]*}||j d d d  d d  ||j d d d  d d  q=|S )Nr   r   ztype z not handled yetr   r%   r   )r+   r,   LSTMr   r   r   r   r   nnqdtyper&   r'   r(   )r   r    r!   r"   r#   r)   r   r   r   get_lstm_mod_weightsE   s   
 
(*r;   nodegmc                 C   sR   | j d }t|tsJ t||}t|tsJ |jdksJ t||j}| S Nr   get_attr)argsr+   r   r   opr
   targetr   )r<   r=   weight_arg_nodeweight_noder   r   r   r   get_conv_fun_weightW   s   

rE   c                 C   s:   | j d }t|tsJ |jdksJ t||j}| S r>   )r@   r+   r   rA   r
   rB   r   )r<   r=   Zqconv_state_nodeZqconv_state_objr   r   r   get_qconv_fun_weightb   s
   
rF   c           	      C   s(  | j d }t|tsJ |jdkr:| j d }t|tsJ |j d }t|ts)J |jdks0J t||j}| S |jdkr|jdksFJ | j d }t|tsRJ |j d }t|ts^J |j d }|j d }t|tsoJ |jdksvJ t||j}| |S |jdksJ t||j}| S )Nr   call_moduler   r?   Zcall_method)r@   r+   r   rA   r
   rB   r   to)	r<   r=   Zlinear_second_argrC   rD   r   Zdequant_nodeZto_fp16_nodeZtarget_dtyper   r   r   get_linear_fun_weightk   s2   








rI   c                 C   sF   | j d }t|tsJ |jdksJ t||j}| \\}}}|S r>   )r@   r+   r   rA   r
   rB   r(   )r<   r=   Zpacked_weight_nodeZpacked_weightr   Z_bias_namer   r   r   get_qlinear_fun_weight   s   
rK   c                  C   sx  i t jttjttjttjtt	j
tt	jtt	jttjtt jttjttjttjtt	jtt	jtt	jttjtt jti tjttjttjtt	jtt	jtt	jttjtt jttjttjttjttjttjtt	jtt	jtt jjjtt jttjtitj t!tj"t!tj#t!t$j t%t$j"t%t$j#t%t$j&t%t$j't%t$j(t%tjt)t$jt*t$j+t*id} | S )N)rG   call_function),r,   r-   r   r0   r1   r   nnqr   nnqatnniqatZConvBn1dZConvBnReLU1dnniqr.   r2   ZConvBn2dZConvBnReLU2dr/   r3   ZConvBn3dZConvBnReLU3dr5   r6   r9   Z
LinearBn1dmodulesZlinearZNonDynamicallyQuantizableLinearr8   r$   r*   FZconv1drE   Zconv2dZconv3dtoqrF   Zconv1d_reluZconv2d_reluZconv3d_relurI   rK   Zlinear_relu)"op_to_type_to_weight_extraction_fnr   r   r   &get_op_to_type_to_weight_extraction_fn   s   	 !"#$
%'(,=rU   rT   c                 C   s  t jj}d }t|dr|j| j d }|d u rt }t| |}|}| jdkrP|d }|	 D ]\}}	| j
|krM|	| |}
||
g| j|| j|dd|d	  S q.d S | jdkrt| j
ts]J t|| j
}|d }|	 D ]\}}	t||kr|	|}
||
g| j|| j|dd|d	  S qkd S )N_node_name_to_scoper   rL   )	r:   valuesZprev_node_nameZprev_node_target_typeZref_node_nameZref_node_target_typeZindex_within_argZindex_of_argfqnrG   )r   ZWEIGHTvaluehasattrrV   namerU   r	   rA   itemsrB   r+   strr
   r:   )r<   r=   rT   Zres_typerX   Zref_node_typeZprev_node_typeZfunction_mappingZtarget_fn_typeZweight_extraction_fnr   r   Zmodule_mappingZtarget_mod_typer   r   r   extract_weight_from_node   sX   





"

r^   r   ):typingr   r   ZtorchZtorch.ao.nn.intrinsicZaor,   Z	intrinsicr0   Ztorch.ao.nn.intrinsic.qatZqatrO   Ztorch.ao.nn.intrinsic.quantizedZ	quantizedrP   Ztorch.ao.nn.qatrN   Ztorch.ao.nn.quantizedrM   Ztorch.ao.nn.quantized.dynamicZdynamicr9   Ztorch.nnZtorch.nn.functionalZ
functionalrR   Ztorch.fxr   Ztorch.fx.graphr   Zns_typesr   r   utilsr	   r
   r   opsrS   ModuleZTensorr   r   r   listr$   r*   r4   r7   r;   rE   rF   rI   rK   dictr]   rU   r^   r   r   r   r   <module>   sP    				&F