U
    yh+                  	   @   sp  d dl Z d dlmZ d dlm  mZ d dlm  m  m  m	Z
 d dl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 e jjZd dlmZ d dlmZ ddlmZmZm Z  ddl!m"Z"m#Z# d dl$m%Z%m&Z&m'Z'm(Z( ej)e j*dd	d
Z+ej)e j*dddZ,ej)e j*dddZ-ej)e%e j* dddZ.ej)e%e j* dddZ/ej)e j*dddZ0ej)e j*dddZ1ej)e%e j* dddZ2eee j*dddZ3eee j*dddZ4eee j*dddZ5eee j*dd d!Z6e'e7e'e(e(f f d"d#d$Z8d(eee&e'e7e'e(e(f f  e&e# d%d&d'Z9dS ))    N)GraphModule)Node   )get_target_type_strgetattr_from_fqnreturn_first_non_observer_node)NSSingleResultValuesTypeNSSingleResultType)ListOptionalDictCallable)modreturnc                 C   s
   | j  S )Nweightdetachr    r   M/var/www/html/venv/lib/python3.8/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 ]0\}}d|ks&d|k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 ]T}||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   sT   t | tjtjtjfr | j S t | tjtj	tj
frD| d j S |  d S d S r   )
isinstancennConv1dConv2dConv3dr   r   nni
ConvReLU1d
ConvReLU2d
ConvReLU3dr   r   r   r   r   get_conv_mod_weight3   s    
r5   c                 C   s@   t | tjr| j S t | tjr0| d j S |  d S d S r   )r,   r-   Linearr   r   r1   
LinearReLUr   r   r   r   r   get_linear_mod_weight?   s
    
r8   c                 C   s   t | tjrPg }t| jD ]0\}}d|ks2d|kr| j|  }|| q|S t | tjspt	dt
|  dg }| jD ]T}||j d d d  d d  ||j d d d  d d  qz|S d S )Nr   r   ztype z not handled yetr   r&   r   )r,   r-   LSTMr   r   r   r   r    nnqdAssertionErrortyper'   r(   r)   )r   r!   r"   r#   r$   r*   r   r   r   get_lstm_mod_weightsG   s     
(*r=   )nodegmr   c                 C   sR   | j d }t|tstt||}t|ts0t|jdks>tt||j}| S Nr   get_attr)	argsr,   r   r;   r   opr   targetr   )r>   r?   weight_arg_nodeweight_noder   r   r   r   get_conv_fun_weightX   s    

rG   c                 C   s:   | j d }t|tst|jdks&tt||j}| S r@   )rB   r,   r   r;   rC   r   rD   r   )r>   r?   Zqconv_state_nodeZqconv_state_objr   r   r   get_qconv_fun_weightb   s
    
rH   c           	      C   s0  | j d }t|tst|jdkrt| j d }t|ts:t|j d }t|tsRt|jdks`tt||j}| S |jdkr|jdkst| j d }t|tst|j d }t|tst|j d }|j d }t|tst|jdkstt||j}| |S |jdkstt||j}| S d S )Nr   call_moduler   rA   Zcall_method)	rB   r,   r   r;   rC   r   rD   r   to)	r>   r?   Zlinear_second_argrE   rF   r   Zdequant_nodeZto_fp16_nodeZtarget_dtyper   r   r   get_linear_fun_weightj   s2    







rK   c                 C   sF   | j d }t|tst|jdks&tt||j}| \\}}}|S r@   )rB   r,   r   r;   rC   r   rD   r)   )r>   r?   Zpacked_weight_nodeZpacked_weightr   Z_bias_namer   r   r   get_qlinear_fun_weight   s    
rM   )r   c               F   C   s,  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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   r1   r2   r   nnqr   nnqatnniqatZConvBn1dZConvBnReLU1dnniqr/   r3   ZConvBn2dZConvBnReLU2dr0   r4   ZConvBn3dZConvBnReLU3dr6   r7   r:   Z
LinearBn1dmodulesZlinearZNonDynamicallyQuantizableLinearr9   r%   r+   FZconv1drG   Zconv2dZconv3dtoqrH   Zconv1d_reluZconv2d_reluZconv3d_relurK   rM   Zlinear_relu)"op_to_type_to_weight_extraction_fnr   r   r   &get_op_to_type_to_weight_extraction_fn   s                                       ,            =rW   )r>   r?   rV   r   c                 C   s  t jj}d }t|dr&|j| j d }|d kr4t }t| |}|}| jdkr|d }|	 D ]>\}}	| j
|kr\|	| |}
||
g| j|| j|dd|d	  S q\nx| jdkrt| j
tstt|| j
}|d }|	 D ]>\}}	t||kr|	|}
||
g| j|| j|dd|d	  S qd S )N_node_name_to_scoper   rN   )	r<   valuesZprev_node_nameZprev_node_target_typeZref_node_nameZref_node_target_typeZindex_within_argZindex_of_argfqnrI   )r   ZWEIGHTvaluehasattrrX   namerW   r   rC   itemsrD   r,   strr;   r   r<   )r>   r?   rV   Zres_typerZ   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   sR    




r`   )N):ZtorchZtorch.nnr-   Ztorch.nn.functionalZ
functionalrT   Ztorch.ao.nn.quantized.dynamicZaoZ	quantizedZdynamicr:   Ztorch.ao.nn.quantizedrO   Ztorch.ao.nn.intrinsic.qatZ	intrinsicZqatrQ   Ztorch.ao.nn.qatrP   Ztorch.ao.nn.intrinsicr1   Ztorch.ao.nn.intrinsic.quantizedrR   ZopsrU   Ztorch.fxr   Ztorch.fx.graphr   utilsr   r   r   Zns_typesr   r	   typingr
   r   r   r   ModuleZTensorr   r   r   r%   r+   r5   r8   r=   rG   rH   rK   rM   r_   rW   r`   r   r   r   r   <module>   sD   
%
D 