o
    hk                  	   @   s$  d dl Z d dlmZmZmZ d dlZd dlmZmZ d dlm	Z	 G dd dej
jZG dd dej
jZG d	d
 d
ej
jZG dd deZG dd deZG dd deZd$dedededefddZG dd dej
jZG dd deZG dd deZdd Zejfd d!Zejfd"d#ZdS )%    N)ListOptionalTuple)_VFTensor)PackedSequencec                       s\   e Zd ZddgZ fddZejjdd Zejjdd Z	ejjd	d
 Z
dd Z  ZS )QuantizedLinearscale
zero_pointc                    s   t    td |j| _|j| _t|jj	tj
d \| _| _| _| _tjj| jdd| _tjj| jdd| _|jd usDJ dtjj|jj	tj
d dd| _| dt| jj	tj
d d S )Nztorch.jit.QuantizedLinear is deprecated and will be removed in an upcoming PyTorch release. Please use the torch.ao.nn.quantized.dynamic.Linear instead.memory_formatFrequires_gradzQuantizedLinear requires a biaspacked_tensor_ptr)super__init__warningswarnin_featuresout_featurestorchfbgemm_linear_quantize_weightweightclonecontiguous_formatfloatcol_offsetsr	   r
   nn	Parameterbiasregister_bufferfbgemm_pack_quantized_matrixselfother	__class__ I/var/www/html/ai/venv/lib/python3.10/site-packages/torch/jit/quantized.pyr      s6   
zQuantizedLinear.__init__c                 C      | j t| j d S N)r   set_r   r!   r   r#   r'   r'   r(   _unpack.   s   zQuantizedLinear._unpackc                 C   .   | j tjtjtt g tjd	  d S N)dtype)
r   r+   r   zerosjitannotater   intuint8detachr,   r'   r'   r(   _pack2       zQuantizedLinear._packc              	   C   s2   t | | j| j| j| j| j| j}|	|j
S r*   )r   )fbgemm_linear_int8_weight_fp32_activationr   r   r   r   r	   r
   r   tor0   r#   inputoutr'   r'   r(   forward8   s   	zQuantizedLinear.forwardc                 C      dj di | j}|S )Nz^in_features={in_features}, out_features={out_features}, scale={scale}, zero_point={zero_point}r'   format__dict__r#   reprr'   r'   r(   
extra_reprE   s   zQuantizedLinear.extra_repr)__name__
__module____qualname____constants__r   r   r2   script_methodr-   r7   r>   rE   __classcell__r'   r'   r%   r(   r   
   s    !


r   c                       sT   e Zd Z fddZejjdd Zejjdd Zejjdd Z	d	d
 Z
  ZS )QuantizedLinearFP16c                    s   t    td |j| _|j| _|j| _t	|jj
tjd | _|jd us-J dtjj|jj
tjd dd| _| d| j d S )Nztorch.jit.QuantizedLinearFP16 is deprecated and will be removed in an upcoming PyTorch release. Please use the torch.ao.nn.quantized.dynamic.Linear instead.r   z#QuantizedLinearFP16 requires a biasFr   packed_weight)r   r   r   r   r   r   r   original_weightr   fbgemm_pack_gemm_matrix_fp16r   r   r   r   r   r   r    r"   r%   r'   r(   r   O   s    
zQuantizedLinearFP16.__init__c                 C   r)   r*   )rM   r+   r   rO   rN   r,   r'   r'   r(   r-   b   s   
zQuantizedLinearFP16._unpackc                 C   r.   r/   )
rM   r+   r   r1   r2   r3   r   r4   r5   r6   r,   r'   r'   r(   r7   h   r8   zQuantizedLinearFP16._packc                 C   s   t | | j| j}|S r*   )r   )fbgemm_linear_fp16_weight_fp32_activationr   rM   r   r;   r'   r'   r(   r>   n   s   zQuantizedLinearFP16.forwardc                 C   r?   )Nz8in_features={in_features}, out_features={out_features}, r'   r@   rC   r'   r'   r(   rE   u   s   zQuantizedLinearFP16.extra_repr)rF   rG   rH   r   r   r2   rJ   r-   r7   r>   rE   rK   r'   r'   r%   r(   rL   N   s    


rL   c                
       s   e Zd Zg dZ fddZdd Zejjdd Z	ejj	dd	e
d
e
deddfddZejjdd Zejjdd Z  ZS )QuantizedRNNCellBase)
input_sizehidden_sizer   scale_hhscale_ihzero_point_ihzero_point_hhc                    s.  t    td |j| _|j| _|j| _| jstdt	|j
jtjd \}}| _| _| d| | d| t	|jjtjd \}}| _| _| d| | d| t| j
}| d| t| j}| d	| tjj|jjtjd d
d| _tjj|jjtjd d
d| _d S )Nztorch.jit.QuantizedRNNCellBase is deprecated and will be removed in an upcoming PyTorch release. Please use the torch.ao.nn.quantized.dynamic.RNNCell instead.z&Quantized RNN cells require bias termsr   	weight_ihcol_offsets_ih	weight_hhcol_offsets_hh	packed_ih	packed_hhFr   )r   r   r   r   rR   rS   r   
ValueErrorr   r   rX   r   r   r   rU   rV   r    rZ   rT   rW   r!   r   r   bias_ihbias_hh)r#   r$   rX   rY   rZ   r[   r\   r]   r%   r'   r(   r      sR   
zQuantizedRNNCellBase.__init__c                 C   sN   d}d| j v r| jdur|d7 }d| j v r| jdkr|d7 }|jdi | j S )	Nz{input_size}, {hidden_size}r   Tz, bias={bias}nonlinearitytanhz, nonlinearity={nonlinearity}r'   )rB   r   ra   rA   )r#   sr'   r'   r(   rE      s   zQuantizedRNNCellBase.extra_reprc                 C   s0   | d| jkrtd| d d| j d S )N   z'input has inconsistent input_size: got , expected )sizerR   RuntimeError)r#   r<   r'   r'   r(   check_forward_input   s
   z(QuantizedRNNCellBase.check_forward_input r<   hxhidden_labelreturnNc              	   C   sp   | d| dkrtd| d d| d| d | d| jkr6td| d| d d| j d S )	Nr   zInput batch size z doesn't match hiddenz batch size rd   hiddenz# has inconsistent hidden_size: got re   )rf   rg   rS   )r#   r<   rj   rk   r'   r'   r(   check_forward_hidden   s    z)QuantizedRNNCellBase.check_forward_hiddenc                 C   s,   | j t| j | jt| j d S r*   )r\   r+   r   r!   rX   r]   rZ   r,   r'   r'   r(   r-      s   zQuantizedRNNCellBase._unpackc                 C   sX   | j tjtjtt g tjd	  | j
tjtjtt g tjd	  d S r/   )r\   r+   r   r1   r2   r3   r   r4   r5   r6   r]   r,   r'   r'   r(   r7      s     zQuantizedRNNCellBase._pack)ri   )rF   rG   rH   rI   r   rE   r   r2   rJ   rh   r   strrn   r-   r7   rK   r'   r'   r%   r(   rQ   }   s*    
0

rQ   c                       sH   e Zd Zg dZ fddZejjd
dede	e defdd	Z
  ZS )QuantizedRNNCell)rR   rS   r   rT   rU   rV   rW   ra   c                    s"   t  | td |j| _d S )Nztorch.jit.QuantizedRNNCell is deprecated and will be removed in an upcoming PyTorch release. Please use the torch.ao.nn.quantized.dynamic.RNNCell instead.)r   r   r   r   ra   r"   r%   r'   r(   r      s
   zQuantizedRNNCell.__init__Nr<   rj   rl   c                 C   s   |  | |d u rtj|d| j|j|jd}| ||d | jdkrDt	
||| j| j| j| j| j| j| j| j| j| j| j| j}|S | jdkrit	||| j| j| j| j| j| j| j| j| j| j| j| j}|S |}td| j )Nr   r0   deviceri   rb   reluzUnknown nonlinearity: )rh   r   r1   rf   rS   r0   rr   rn   ra   r   quantized_rnn_tanh_cellrX   rZ   r_   r`   r\   r]   rY   r[   rU   rT   rV   rW   quantized_rnn_relu_cellrg   )r#   r<   rj   retr'   r'   r(   r>      sX   

$
zQuantizedRNNCell.forwardr*   )rF   rG   rH   rI   r   r   r2   rJ   r   r   r>   rK   r'   r'   r%   r(   rp      s
    &rp   c                
       sR   e Zd Z fddZejj	d	dedee	eef  de	eef fddZ
  ZS )
QuantizedLSTMCellc                       t  | td d S )Nztorch.jit.QuantizedLSTMCell is deprecated and will be removed in an upcoming PyTorch release. Please use the torch.ao.nn.quantized.dynamic.LSTMCell instead.r   r   r   r   r"   r%   r'   r(   r   .     zQuantizedLSTMCell.__init__Nr<   rj   rl   c                 C   s   |  | |d u rtj|d| j|j|jd}||f}| ||d d | ||d d t	||| j
| j| j| j| j| j| j| j| j| j| j| jS )Nr   rq   z[0]rd   z[1])rh   r   r1   rf   rS   r0   rr   rn   r   quantized_lstm_cellrX   rZ   r_   r`   r\   r]   rY   r[   rU   rT   rV   rW   )r#   r<   rj   r1   r'   r'   r(   r>   5  s0   
zQuantizedLSTMCell.forwardr*   )rF   rG   rH   r   r   r2   rJ   r   r   r   r>   rK   r'   r'   r%   r(   rw   -  s    
rw   c                       s@   e Zd Z fddZejjd	dedee defddZ	  Z
S )
QuantizedGRUCellc                    rx   )Nztorch.jit.QuantizedGRUCell is deprecated and will be removed in an upcoming PyTorch release. Please use the torch.ao.nn.quantized.dynamic.GRUCell instead.ry   r"   r%   r'   r(   r   T  rz   zQuantizedGRUCell.__init__Nr<   rj   rl   c                 C   sz   |  | |d u rtj|d| j|j|jd}| ||d t	||| j
| j| j| j| j| j| j| j| j| j| j| jS )Nr   rq   ri   )rh   r   r1   rf   rS   r0   rr   rn   r   quantized_gru_cellrX   rZ   r_   r`   r\   r]   rY   r[   rU   rT   rV   rW   r#   r<   rj   r'   r'   r(   r>   [  s,   
zQuantizedGRUCell.forwardr*   )rF   rG   rH   r   r   r2   rJ   r   r   r>   rK   r'   r'   r%   r(   r|   S  s    &r|   rd   tensorpermutationdimrl   c                 C   s   |  ||S r*   )index_select)r   r   r   r'   r'   r(   apply_permutationu  s   r   c                
       s   e Zd Zg dZejf fdd	Zejjde	de
e	 ddfdd	Zejjde	de
e	 deeeef fd
dZejj	dde	deeeef deddfddZejjde	de	de
e	 ddfddZejjde	de
e	 de	fddZ  ZS )QuantizedRNNBase)	moderR   rS   
num_layersr   batch_firstdropoutbidirectionalr0   c                    s  t    td j| _j| _j| _j| _j| _j	| _	| jdkr,| j	r,J j
| _
j| _| jr9dnd}|| _| jsCJ | jdkrQ| jdkrQtd|tjkrb|tjkrbtd| g | _t| jD ]o t|D ]h} dkry| jn| j| }|dkrd	nd
 fdd}|d\}}|d\}	}
|tjkrtjj||	||
}ntjj| |}tjj|	 |
}tjj||}t| d  d | | j| qpqjd S )Nztorch.jit.QuantizedRNNBase is deprecated and will be removed in an upcoming PyTorch release. Please use the torch.ao.nn.quantized.dynamic instead.GRU   rd   LSTMz.Only LSTM or GRU is supported for QuantizedRNNUnsupported dtype: r   _reverseri   c                    sD   d|  d   }d|  d   }t |}t |}||fS )Nweight__lbias_)getattr)ihhhweight_name	bias_namer   r   layerr$   suffixr'   r(   get_weight_bias  s
   

z2QuantizedRNNBase.__init__.<locals>.get_weight_biasihhhcell_params__)r   r   r   r   r   rR   rS   r   r   r   r   r   r0   rg   r   int8float16all_weightsrangeops	quantizedmake_quantized_cell_paramslinear_prepack_fp16r   make_quantized_cell_params_fp16setattrappend)r#   r$   r0   num_directions	directionlayer_input_sizer   rX   r_   rZ   r`   cell_paramsr\   r]   r%   r   r(   r     s^   




zQuantizedRNNBase.__init__r<   batch_sizesrl   Nc                 C   sd   |d urdnd}|  |krtd| d|   | j|dkr0td| j d|d d S )Nr      zinput must have z dimensions, got z5input.size(-1) must be equal to input_size. Expected z, got )r   rg   rR   rf   )r#   r<   r   expected_input_dimr'   r'   r(   check_input  s   zQuantizedRNNBase.check_inputc                 C   sT   |d urt |d }n| jr|dn|d}| jrdnd}| j| || jf}|S )Nr   rd   r   )r4   r   rf   r   r   rS   )r#   r<   r   
mini_batchr   expected_hidden_sizer'   r'   r(   get_expected_hidden_size  s   z)QuantizedRNNBase.get_expected_hidden_sizeExpected hidden size {}, got {}rj   r   msgc                 C   s(   |  |krt||t|  d S r*   )rf   rg   rA   list)r#   rj   r   r   r'   r'   r(   check_hidden_size  s   z"QuantizedRNNBase.check_hidden_sizerm   c                 C   s,   |  || | ||}| j||dd d S )Nr   )r   r   r   r   r#   r<   rm   r   r   r'   r'   r(   check_forward_args  s
   
z#QuantizedRNNBase.check_forward_argsr   c                 C   s   |d u r|S t ||S r*   r   r#   rj   r   r'   r'   r(   permute_hidden  s   
zQuantizedRNNBase.permute_hidden)r   )rF   rG   rH   rI   r   r   r   r2   rJ   r   r   r   r   r4   r   ro   r   r   r   rK   r'   r'   r%   r(   r   y  sH    C		$r   c                       s\  e Zd ZdddgiZ fddZejjdede	e
eef  de	e d	ed
e	e de
ee
eef f fddZejj	ddede	e
eef  de
ee
eef f fddZejj	ddede	e
eef  de
ee
eef f fddZejjde
eef de	e de
eef fddZejjdede
eef de	e ddfddZdddZ  ZS )QuantizedLSTMr>   forward_packedforward_tensorc                    s   t  || td d S )Nztorch.jit.QuantizedLSTM is deprecated and will be removed in an upcoming PyTorch release. Please use the torch.ao.nn.quantized.dynamic.LSTM instead.ry   )r#   r$   r0   r%   r'   r(   r     s   zQuantizedLSTM.__init__r<   rj   r   max_batch_sizesorted_indicesrl   c                 C   s   |d u r | j r	dnd}tj| j| || j|j|jd}||f}n| ||}| ||| |d u s3J tj	||| j
| j| jt| j| j| j | j| jdd}|d }	|dd  }
|	|
fS )Nr   rd   rq   F)r0   use_dynamicr   )r   r   r1   r   rS   r0   rr   r   r   quantized_lstmr   r   r   r   trainingr   )r#   r<   rj   r   r   r   r   r1   resultoutputrm   r'   r'   r(   forward_impl
  s:   	
zQuantizedLSTM.forward_implNc           	      C   L   d }| j r
|dn|d}d }d }| |||||\}}|| ||fS Nr   rd   r   rf   r   r   	r#   r<   rj   r   r   r   unsorted_indicesr   rm   r'   r'   r(   r   6  s   
zQuantizedLSTM.forward_tensorc           
      C   L   |\}}}}t |d }| |||||\}}	t||||}|| |	|fS Nr   r4   r   r   r   
r#   r<   rj   input_r   r   r   r   r   rm   r'   r'   r(   r   E     
zQuantizedLSTM.forward_packedr   c                 C   s(   |d u r|S t |d |t |d |fS r   r   r   r'   r'   r(   r   S  s
   zQuantizedLSTM.permute_hiddenrm   c                 C   s@   |  || | ||}| |d |d | |d |d d S )Nr   z"Expected hidden[0] size {}, got {}rd   z"Expected hidden[1] size {}, got {}r   r   r'   r'   r(   r   ]  s   

z QuantizedLSTM.check_forward_argsc                 C   "   t |tr| ||S | ||S r*   
isinstancer   r   r   r~   r'   r'   r(   r>   n     
zQuantizedLSTM.forwardr*   )rF   rG   rH   __overloads__r   r   r2   rJ   r   r   r   r4   r   r   r   r   r   r   r>   rK   r'   r'   r%   r(   r      sl    +

	
r   c                       s   e Zd ZdddgiZ fddZejjdede	e de	e d	e
d
e	e deeef fddZejj	ddede	e deeef fddZejj	ddede	e deeef fddZdddZ  ZS )QuantizedGRUr>   r   r   c                    s    t  j|i | td d S )Nztorch.jit.QuantizedGRU is deprecated and will be removed in an upcoming PyTorch release. Please use the torch.ao.nn.quantized.dynamic.GRU instead.ry   )r#   argskwargsr%   r'   r(   r   x  s   zQuantizedGRU.__init__r<   rj   r   r   r   rl   c           
      C   s   |d u r| j r	dnd}tj| j| || j|j|jd}n| ||}| ||| |d u rDt	||| j
| j| jt| j| j| j | j	}nt	|||| j
| j| jt| j| j| j 	}|d }|d }	||	fS )Nr   rd   rq   r   )r   r   r1   r   rS   r0   rr   r   r   quantized_grur   r   r   r   r   r   )
r#   r<   rj   r   r   r   r   r   r   rm   r'   r'   r(   r     sJ   	
zQuantizedGRU.forward_implNc           	      C   r   r   r   r   r'   r'   r(   r     s   
zQuantizedGRU.forward_tensorc           
      C   r   r   r   r   r'   r'   r(   r     r   zQuantizedGRU.forward_packedc                 C   r   r*   r   r~   r'   r'   r(   r>     r   zQuantizedGRU.forwardr*   )rF   rG   rH   r   r   r   r2   rJ   r   r   r4   r   r   r   r   r   r>   rK   r'   r'   r%   r(   r   u  sH    
5

r   c                 C   s   t d i }|  D ]\}}|| u rqt|}||ur |||< q| D ]
\}}t| || q%t| tjj	r;t
| S t| tjjrFt| S t| tjjrQt| S | S )Nzvquantize_rnn_cell_modules function has been deprecated. Please use torch.ao.quantization.quantize_dynamic API instead.)r   r   named_modulesquantize_rnn_cell_modulesitemsr   r   r   r   LSTMCellrw   GRUCellr|   RNNCellrp   )modulereassignnamemodnew_modr'   r'   r(   r     s(   r   c                 C   s   t d i }|  D ]\}}|| u rqt||}||ur!|||< q| D ]
\}}t| || q&t| tjj	rQ|tj
krAt| S |tjkrJt| S td| | S )Nztquantize_linear_modules function has been deprecated. Please use torch.ao.quantization.quantize_dynamic API instead.r   )r   r   r   quantize_linear_modulesr   r   r   r   r   Linearr   r   r   rL   rg   r   r0   r   r   r   r   r'   r'   r(   r     s(   


r   c                 C   s   t d i }|  D ]\}}|| u rqt||}||ur!|||< q| D ]
\}}t| || q&t| tjj	rN|tj
krI|tjkrItd| t| |S t| tjjrYt| S | S )Nzqquantize_rnn_modules function has been deprecated. Please use torch.ao.quantization.quantize_dynamic API instead.r   )r   r   r   quantize_rnn_modulesr   r   r   r   r   r   r   r   rg   r   r   r   r   r'   r'   r(   r   	  s(   

r   )rd   )r   typingr   r   r   r   r   r   torch.nn.utils.rnnr   r2   ScriptModuler   rL   rQ   rp   rw   r|   r4   r   r   r   r   r   r   r   r   r'   r'   r'   r(   <module>   s&    D/lD&" uc