o
    Ih+                     @   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   O/var/www/vscode/kcb/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=   qconv_state_nodeqconv_state_objr   r   r   get_qconv_fun_weightb   s
   
rH   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?   call_method)r@   r+   r   rA   r
   rB   r   to)	r<   r=   linear_second_argrC   rD   r   dequant_nodeto_fp16_nodetarget_dtyper   r   r   get_linear_fun_weightk   s2   








rP   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=   packed_weight_nodepacked_weightr   _bias_namer   r   r   get_qlinear_fun_weight   s   
rU   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)rI   call_function),r,   r-   r   r0   r1   r   nnqr   nnqatnniqatConvBn1dConvBnReLU1dnniqr.   r2   ConvBn2dConvBnReLU2dr/   r3   ConvBn3dConvBnReLU3dr5   r6   r9   
LinearBn1dmoduleslinearNonDynamicallyQuantizableLinearr8   r$   r*   Fconv1drE   conv2dconv3dtoqrH   conv1d_reluconv2d_reluconv3d_relurP   rU   linear_relu)"op_to_type_to_weight_extraction_fnr   r   r   &get_op_to_type_to_weight_extraction_fn   s   	 !"#$
%'(,=ro   rn   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   rV   )	r:   valuesprev_node_nameprev_node_target_typeref_node_nameref_node_target_typeindex_within_argindex_of_argfqnrI   )r   WEIGHTvaluehasattrrp   namero   r	   rA   itemsrB   r+   strr
   r:   )r<   r=   rn   res_typerx   ref_node_typeprev_node_typefunction_mappingtarget_fn_typeweight_extraction_fnr   r   module_mappingtarget_mod_typer   r   r   extract_weight_from_node   sX   





"

r   r   ):typingr   r   torchtorch.ao.nn.intrinsicaor,   	intrinsicr0   torch.ao.nn.intrinsic.qatqatrY   torch.ao.nn.intrinsic.quantized	quantizedr\   torch.ao.nn.qatrX   torch.ao.nn.quantizedrW   torch.ao.nn.quantized.dynamicdynamicr9   torch.nntorch.nn.functional
functionalre   torch.fxr   torch.fx.graphr   ns_typesr   r   utilsr	   r
   r   opsri   ModuleTensorr   r   r   listr$   r*   r4   r7   r;   rE   rH   rP   rU   dictr~   ro   r   r   r   r   r   <module>   sP    				&F