
    Vhs              	       J   d dl mZmZ d dlZd dlmZ d dlmZmZ d dlm	Z	 ddl
mZmZ g dZdded	ed
edefdZd Zd Zd Z G d dej&                        Z G d de      Z G d de      Z G d de      Z G d dej.                        Z G d de      Z G d de      Zy)    )AnyOptionalN)_VFTensor)PackedSequence   )_quantize_and_dequantize_weight_quantize_weight)RNNCellBaseRNNCellLSTMCellGRUCellRNNBaseLSTMGRUget_quantized_weighttensorpermutationdimreturnc                 &    | j                  ||      S N)index_select)r   r   r   s      [/home/dcms/DCMS/lib/python3.12/site-packages/torch/ao/nn/quantized/reference/modules/rnn.py_apply_permutationr      s    sK00    c                     t        | |      }|g}dD cg c]  }||z   	 c}D ].  }t        | |      rt        | |      }nd }|j                  |       0 |S c c}w )N)_qscheme_dtype_scale_zero_point	_axis_int)getattrhasattrappend)modulewnweightparamsn
param_nameparams          r   #_get_weight_and_quantization_paramsr-      sm    VR FXFTQ 
 6:&FJ/EEe Ms   Ac                 H    t        | |      sy t        | |      }t        | }|S r   )r$   r-   r
   r&   r'   r)   r(   s       r   r   r   *   s*    620<Fv&FMr   c                 H    t        | |      sy t        | |      }t        | }|S r   )r$   r-   r	   r/   s       r   $_get_quantize_and_dequantized_weightr1   2   s*    620<F,f5FMr   c                   `     e Zd Z	 	 	 ddededededdf
 fdZd Zd	 Zd
 Zd Z	d Z
d Z xZS )r   N
input_sizehidden_sizebias
num_chunksr   c                     t         	|   ||||||       |)t        j                  t        j                  ddd}||dd}t        |      dk(  sJ d       | j                  ||       y )	N)devicedtype      ?r   qschemer9   scale
zero_pointF)	weight_ih	weight_hhis_decomposed   zSExpected length for weight_qparams_dict to be 3 for QuantizedRNNCellBase(Reference))super__init__torchper_tensor_affinequint8len_init_weight_qparams_dict)
selfr3   r4   r5   r6   r8   r9   weight_qparams_dictweight_qparams	__class__s
            r   rD   zRNNCellBase.__init__;   s     	T:fE 	 	
 & 22	N ,+!&# #$)	a`	a)&&':FCr   c           
         |J |d   | _         |j                         D ]`  \  }}|dk(  r|d   }|d   }t        | |dz   |       t        | |dz   |       |d t        j                  t        j
                  fv s$J t        d| d| j                                       ||d   }t        |t        j                        r|j                         j                         n%t        j                  |t        j                  |	      }| j                  |d
z   |       |d   }	t        |	t        j                        r|	j                         j                         n%t        j                  |	t        j                  |	      }
| j                  |dz   |
       |t        j
                  k(  ry|d   }t        |t        j                        r|j                         j                         n%t        j                  |t        j                  |	      }| j                  |dz   |       n9| j                  |dz   t        j                  dt        j                  |	             t        | |dz   t!        | |dz         j#                                c y )NrA   r<   r9   r   r   	qscheme:  is not support in r=   r9   r8   r    r>   r!   axis_axisr   r"   )rA   itemssetattrrE   rF   per_channel_affine	Exception	_get_name
isinstancer   detachcloner   floatregister_bufferintr#   item)rJ   rK   r8   keyrL   weight_qschemeweight_dtyper=   scale_tensorzp	zp_tensorrR   axis_tensors                r   rI   z%RNNCellBase._init_weight_qparams_dictZ   sO   "...0A#6#<#<#> +	VCo%+I6N)'2LD#
*N;D#.,7!''((&   N++>t~~?O>PQ	  )&w/ "%6 LLN((*e5;;vN 
 $$S8^\B#L1 ""ell3 IIK%%'b		&I 
 $$S=%8)D!U%=%==)&1D &dELL9 ++-"\\$eiiO  
 ((wD ((gu||AUYYv'V cK/sW}1M1R1R1TUW+	Vr   c                      y)NzQuantizedRNNCellBase(Reference) rJ   s    r   rX   zRNNCellBase._get_name   s    0r   c                     t        | d      S Nr?   r   ri   s    r   get_quantized_weight_ihz#RNNCellBase.get_quantized_weight_ih       #D+66r   c                     t        | d      S Nr@   rl   ri   s    r   get_quantized_weight_hhz#RNNCellBase.get_quantized_weight_hh   rn   r   c                     t        | d      S rk   r1   ri   s    r   get_weight_ihzRNNCellBase.get_weight_ih       3D+FFr   c                     t        | d      S rp   rs   ri   s    r   get_weight_hhzRNNCellBase.get_weight_hh   ru   r   )NNN)__name__
__module____qualname__r^   boolrD   rI   rX   rm   rq   rt   rw   __classcell__rM   s   @r   r   r   :   sk      DD D 	D
 D 
D>.V`177GGr   r   c                        e Zd ZdZ	 	 	 	 	 ddededededeeee	f      ddf fd	Z
d
 Zddedee   defdZed        Z xZS )r   
    We'll store weight_qparams for all the weights (weight_ih and weight_hh),
    we need to pass in a `weight_qparams_dict` that maps from weight name,
    e.g. weight_ih, to the weight_qparams for that weight
    Nr3   r4   r5   nonlinearityrK   r   c                 H    |||d}t        	|   |||fddi| || _        y )Nr8   r9   rK   r6   r   )rC   rD   r   )
rJ   r3   r4   r5   r   r8   r9   rK   factory_kwargsrM   s
            r   rD   zRNNCell.__init__   s:     #6

 	[$W1WW(r   c                      y)NzQuantizedRNNCell(Reference)rh   ri   s    r   rX   zRNNCell._get_name       ,r   inputhxc                 &   |j                         dv sJ d|j                          d       |j                         dk(  }|s|j                  d      }|Gt        j                  |j	                  d      | j
                  |j                  |j                        }n|s|j                  d      n|}| j                  dk(  rKt        j                  ||| j                         | j                         | j                  | j                        }nt| j                  dk(  rKt        j                  ||| j                         | j                         | j                  | j                        }n|}t!        d	| j                         |s|j#                  d      }|S )
Nr      z6RNNCell: Expected input to be 1-D or 2-D but received 	-D tensorr   r   rQ   tanhreluzUnknown nonlinearity: )r   	unsqueezerE   zerossizer4   r9   r8   r   r   rnn_tanh_cellrt   rw   bias_ihbias_hhrnn_relu_cellRuntimeErrorsqueezerJ   r   r   
is_batchedrets        r   forwardzRNNCell.forward   sp   yy{ 
 
 	[ DEIIK=PYZ	[ 
 YY[A%
OOA&E:

1t//u{{5<<B )3aB&##""$""$C &(##""$""$C C!78I8I7JKLL++a.C
r   c           	      J    | |j                   |j                  |j                  |j                  |j                  j
                  |j                  j                  |      }|j                  |_        |j                  |_        |j                  |_        |j                  |_	        |S r   )
r3   r4   r5   r   r?   r8   r9   r@   r   r   clsmodrK   ref_mods       r   
from_floatzRNNCell.from_float   s|    NNOOHHMM  MM
  MMMM++++r   )Tr   NNNr   )rx   ry   rz   __doc__r^   r{   strr   dictr   rD   rX   r   r   classmethodr   r|   r}   s   @r   r   r      s     "8<)) ) 	)
 ) &d38n5) 
)$-
)V )&)9 )V )V  r   r   c                        e Zd ZdZ	 	 	 	 ddedededeeee	f      ddf
 fdZ
d	 Z	 dd
edeeeef      deeef   fdZedd       Z xZS )r   r   Nr3   r4   r5   rK   r   c                 :    |||d}t        |   |||fddi| y )Nr   r6      rC   rD   	rJ   r3   r4   r5   r8   r9   rK   r   rM   s	           r   rD   zLSTMCell.__init__   2     #6

 	[$W1WWr   c                      y)NzQuantizedLSTMCell(Reference)rh   ri   s    r   rX   zLSTMCell._get_name  s    -r   r   r   c                    |j                         dv sJ d|j                          d       |j                         dk(  }|s|j                  d      }|Kt        j                  |j	                  d      | j
                  |j                  |j                        }||f}n,|s(|d   j                  d      |d   j                  d      fn|}t        j                  ||| j                         | j                         | j                  | j                        }|s(|d   j                  d      |d   j                  d      f}|S )Nr   z7LSTMCell: Expected input to be 1-D or 2-D but received r   r   r   rQ   r   )r   r   rE   r   r   r4   r9   r8   r   	lstm_cellrt   rw   r   r   r   )rJ   r   r   r   r   r   s         r   r   zLSTMCell.forward  s/    yy{ 
 
 	\ EUYY[MQZ[	\ 
 YY[A%
OOA&E:KK

1t//u{{5<<E BAK"Q%//!$beooa&89QSBmm  LLLL
 q6>>!$c!fnnQ&78C
r   c                 4    | |j                   |j                  |j                  |j                  j                  |j                  j
                  |      }|j                  |_        |j                  |_        |j                  |_        |j                  |_        |S r   	r3   r4   r5   r?   r8   r9   r@   r   r   )r   r   rK   use_precomputed_fake_quantr   s        r   r   zLSTMCell.from_float/  s    NNOOHHMM  MM
  MMMM++++r   TNNNr   )F)rx   ry   rz   r   r^   r{   r   r   r   r   rD   rX   r   tupler   r   r   r|   r}   s   @r   r   r      s     8<XX X 	X &d38n5X 
X . DH!)%*?!@	vv~	@  r   r   c                        e Zd ZdZ	 	 	 	 ddedededeeee	f      ddf
 fdZ
d	 Zdd
edee   defdZed        Z xZS )r   r   Nr3   r4   r5   rK   r   c                 :    |||d}t        |   |||fddi| y )Nr   r6   rB   r   r   s	           r   rD   zGRUCell.__init__G  r   r   c                      y)NzQuantizedGRUCell(Reference)rh   ri   s    r   rX   zGRUCell._get_nameW  r   r   r   r   c                    |j                         dv sJ d|j                          d       |j                         dk(  }|s|j                  d      }|Gt        j                  |j	                  d      | j
                  |j                  |j                        }n|s|j                  d      n|}t        j                  ||| j                         | j                         | j                  | j                        }|s|j                  d      }|S )Nr   z6GRUCell: Expected input to be 1-D or 2-D but received r   r   r   rQ   )r   r   rE   r   r   r4   r9   r8   r   gru_cellrt   rw   r   r   r   r   s        r   r   zGRUCell.forwardZ  s    yy{ 
 
 	[ DEIIK=PYZ	[ 
 YY[A%
OOA&E:

1t//u{{5<<B )3aBll  LLLL
 ++a.C
r   c                 4    | |j                   |j                  |j                  |j                  j                  |j                  j
                  |      }|j                  |_        |j                  |_        |j                  |_        |j                  |_        |S r   r   r   s       r   r   zGRUCell.from_floatx  r   r   r   r   )rx   ry   rz   r   r^   r{   r   r   r   r   rD   rX   r   r   r   r   r|   r}   s   @r   r   r   @  s     8<XX X 	X &d38n5X 
X -V &)9 V <  r   r   c                   v     e Zd Z	 	 	 	 	 	 	 	 	 ddededededededed	ed
edeeee	f      ddf fdZ
d Z xZS )r   Nmoder3   r4   
num_layersr5   batch_firstdropoutbidirectional	proj_sizerK   r   c                     t         |   |||||||||	|
|       |Ot        j                  t        j                  ddd}ddi}| j
                  D ]  }|j                  d      s|||<    | j                  ||
       y )Nr:   r   r;   rA   Fr(   )rC   rD   rE   rF   rG   _flat_weights_names
startswithrI   )rJ   r   r3   r4   r   r5   r   r   r   r   r8   r9   rK   rL   r'   rM   s                  r   rD   zRNNBase.__init__  s     		
 & 22	N $3E":.. ===*.<'+= 	&&':FCr   c           
         |d   | _         |j                         D ]  \  }}|dk(  r|d   }|d   }t        | |dz   |       t        | |dz   |       |d t        j                  t        j
                  fv s$J t        d| d| j                                       || j                  |dz   t        j                  |d	   t        j                  |
             | j                  |dz   t        j                  |d   t        j                  |
             |t        j
                  k(  r=| j                  |dz   t        j                  |d   t        j                  |
             n9| j                  |dz   t        j                  dt        j                  |
             t        | |dz   t        | |dz         j                                 y )NrA   r<   r9   r   r   rO   rP   r    r=   rQ   r!   r>   rS   rR   r   r"   )rA   rT   rU   rE   rF   rV   rW   rX   r]   r   r\   r^   r#   r_   )rJ   rK   r8   r`   rL   ra   rb   s          r   rI   z!RNNBase._init_weight_qparams_dict  s   0A#6#<#<#> '	VCo%+I6N)'2LD#
*N;D#.,7!''((&   N++>t~~?O>PQ	  )$$(NLL&w/u{{6 $$-'LL&|4EIIf "U%=%==((g*62%))F ((gu||AUYYv'V cK/sW}1M1R1R1TUO'	Vr   )	r   TFg        Fr   NNN)rx   ry   rz   r   r^   r{   r\   r   r   r   rD   rI   r|   r}   s   @r   r   r     s     !#8<(D(D (D 	(D
 (D (D (D (D (D (D &d38n5(D 
(DT)Vr   r   c            	            e Zd ZdZ fdZdeeef   dee   deeef   fdZdedee   dee	e	e	f   fd	Z
ded
eeef   dee   fdZd Zd ZddZd Zed        Z xZS )r   zReference Quantized LSTM Module
    We'll store weight_qparams for all the weights in _flat_weights, we need to pass in
    a `weight_qparams_dict` that maps from weight name, e.g. weight_ih_l0,
    to the weight_qparams for that weight
    c                 ,    t        |   dg|i | y )Nr   r   rJ   argskwargsrM   s      r   rD   zLSTM.__init__  s    1$1&1r   r   r   r   c                 F    ||S t        |d   |      t        |d   |      fS )Nr   r   )r   )rJ   r   r   s      r   permute_hiddenzLSTM.permute_hidden  s8    
 I!"Q%57IqE;8
 
 	
r   r   batch_sizesc                     |t        |d         }n.| j                  r|j                  d      n|j                  d      }| j                  rdnd}| j                  |z  || j
                  f}|S )Nr   r   r   )r^   r   r   r   r   r4   )rJ   r   r   
mini_batchnum_directionsexpected_hidden_sizes         r   get_expected_cell_sizezLSTM.get_expected_cell_size  sn     "[^,J*.*:*:A

1J"00aOOn, 

 $#r   hiddenc                     | j                  ||       | j                  |d   | j                  ||      d       | j                  |d   | j                  ||      d       y )Nr   z"Expected hidden[0] size {}, got {}r   z"Expected hidden[1] size {}, got {})check_inputcheck_hidden_sizeget_expected_hidden_sizer   )rJ   r   r   r   s       r   check_forward_argszLSTM.check_forward_args  sf     	,1I))%=0	

 	1I''{;0	
r   c                     i }| j                   D ]@  }t        | |      r+|j                  d      rt        | |      }nt	        | |      }nd}|||<   B |S zdictionary from flat_weight_name to quantized weight or (unquantized) bias
        e.g.
        {
          "weight_ih_l0": quantized_weight,
          "bias_ih_l0": unquantized_bias,
          ...
        }
        r(   Nr   r$   r   r   r#   rJ   quantized_weight_bias_dictr'   weight_or_biass       r   get_quantized_weight_bias_dictz#LSTM.get_quantized_weight_bias_dict  e     &("** 	<BtR ==*%9$%CN%,T2%6N!%-;&r*	< *)r   c                     g }| j                   D ]S  }t        | |      r2t        | |      }|j                  d      rt	        | |      }t        | }nd }|j                  |       U |S Nr(   r   r$   r#   r   r-   r	   r%   rJ   flat_weightsr'   r(   r)   s        r   get_flat_weightszLSTM.get_flat_weights.  o    ** 	(BtR  r*==*@rJF<fEF'	( r   c                 v   |}d }t        |t              r|\  }}}}t        |d         }njd }|j                         dk(  }| j                  rdnd}	|s|j                  |	      }| j                  r|j                  d      n|j                  d      }d }d }|| j                  rdnd}
| j                  dkD  r| j                  n| j                  }t        j                  | j                  |
z  |||j                  |j                        }t        j                  | j                  |
z  || j                  |j                  |j                        }||f}n|rb|d   j                         dk7  s|d   j                         dk7  rd|d   j                          d|d   j                          d}t        |      |d   j                         dk7  s|d   j                         dk7  r6d	|d   j                          d|d   j                          d}t        |      |d   j                  d      |d   j                  d      f}| j!                  ||      }| j#                  |||       |ht%        j&                  ||| j)                         | j*                  | j                  | j,                  | j.                  | j                  | j                  	      }n]t%        j&                  |||| j)                         | j*                  | j                  | j,                  | j.                  | j                  	      }|d   }|dd  }t        |t              r"t        ||||      }|| j!                  ||      fS s9|j1                  	      }|d   j1                  d      |d   j1                  d      f}|| j!                  ||      fS )
Nr   rB   r   r   rQ   z=For batched 3-D input, hx and cx should also be 3-D but got (z-D, z-D) tensorsz?For unbatched 2-D input, hx and cx should also be 2-D but got ()rY   r   r^   r   r   r   r   r   r   r4   rE   r   r   r9   r8   r   r   r   r   lstmr   r5   r   trainingr   )rJ   r   r   
orig_inputr   sorted_indicesunsorted_indicesmax_batch_sizer   	batch_dimr   real_hidden_sizeh_zerosc_zerosmsgresultoutputr   output_packeds                      r   r   zLSTM.forward;  s   
j.1CH@E;0@ Q0NK)J!--1I	2.2.>.>UZZ]EJJqMN!N#:"&"4"4Q!N"&..1"4$:J:J  kk.0 kk||G kk.0  kk||G 7#B"!uyy{a'2a599;!+;446qEIIK=RUYY[MQ\^  +3//!uyy{a'2a599;!+;446qEIIK=RUYY[MQ\^  +3//Q%//!,beooa.@AB $$R8Br;7XX%%'		""  
F XX%%'		""
F j.1*^5EM !$"5"5f>N"OOO	2 )++A.q	0A0A!0DE4..v7GHHHr   c                      y)NzQuantizedLSTM(Reference)rh   ri   s    r   rX   zLSTM._get_name  s    )r   c           
          | |j                   |j                  |j                  |j                  |j                  |j
                  |j                  |      }|j                  D ]  }t        ||t        ||              |S N)rK   
r3   r4   r   r5   r   r   r   r   rU   r#   r   r   rK   r   r'   s        r   r   zLSTM.from_float  q    NNOONNHHOOKK 3	
 )) 	3BGRb!12	3r   r   )rx   ry   rz   r   rD   r   r   r   r   r^   r   r   r   r   r   rX   r   r   r|   r}   s   @r   r   r     s    2	
&&.!	
 f%	
 
vv~			
$$*26*:$	sC}	$"

 ffn%
 f%	
$**`ID*  r   r   c                   L     e Zd ZdZ fdZd Zd ZddZd Ze	d        Z
 xZS )	r   zReference Quantized GRU Module
    We'll store weight_qparams for all the weights in _flat_weights, we need to pass in
    a `weight_qparams_dict` that maps from weight name, e.g. weight_ih_l0,
    to the weight_qparams for that weight
    c                 J    d|v rt        d      t        |   dg|i | y )Nr   z=proj_size argument is only supported for LSTM, not RNN or GRUr   )
ValueErrorrC   rD   r   s      r   rD   zGRU.__init__  s4    & O  	000r   c                     i }| j                   D ]@  }t        | |      r+|j                  d      rt        | |      }nt	        | |      }nd}|||<   B |S r   r   r   s       r   r   z"GRU.get_quantized_weight_bias_dict  r   r   c                     g }| j                   D ]S  }t        | |      r2t        | |      }|j                  d      rt	        | |      }t        | }nd }|j                  |       U |S r   r   r   s        r   r   zGRU.get_flat_weights  r   r   c                    |}t        |t              r|\  }}}}t        |d         }nd }|j                         dv sJ d|j                          d       |j                         dk(  }| j                  rdnd}	|sU|j                  |	      }|t|j                         dk7  rt        d|j                          d      |j                  d      }n2|0|j                         dk7  rt        d	|j                          d      | j                  r|j                  d      n|j                  d      }d }d }|V| j                  rdnd}
t        j                  | j                  |
z  || j                  |j                  |j                  
      }n| j                  ||      }| j!                  |||       |ht#        j$                  ||| j'                         | j(                  | j                  | j*                  | j,                  | j                  | j                  	      }n]t#        j$                  |||| j'                         | j(                  | j                  | j*                  | j,                  | j                  	      }|d   }|d   }t        |t              r"t        ||||      }|| j                  ||      fS s"|j/                  	      }|j/                  d      }|| j                  ||      fS )Nr   )r   rB   z2GRU: Expected input to be 2-D or 3-D but received r   rB   r   r   z7For unbatched 2-D input, hx should also be 2-D but got z5For batched 3-D input, hx should also be 3-D but got rQ   )rY   r   r^   r   r   r   r   r   r   rE   r   r   r4   r9   r8   r   r   r   grur   r5   r   r   r   )rJ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                  r   r   zGRU.forward  s    
j.1CH@E;0@ Q0NK99; #  [ DEIIK=PYZ[  )J!--1I	2>vvx1}*UVXV\V\V^U__hi  aB>bffh!m&OPRPVPVPXzYbc  /3.>.>UZZ]EJJqMN!N#:"&"4"4Q!N.0  kk||B $$R8Br;7WW%%'		""  
F WW%%'		""
F  j.1*^5EM !$"5"5f>N"OOO	2*4..v7GHHHr   c                      y)NzQuantizedGRU(Reference)rh   ri   s    r   rX   zGRU._get_name<  s    (r   c           
          | |j                   |j                  |j                  |j                  |j                  |j
                  |j                  |      }|j                  D ]  }t        ||t        ||              |S r   r   r   s        r   r   zGRU.from_float?  r   r   r   )rx   ry   rz   r   rD   r   r   r   rX   r   r   r|   r}   s   @r   r   r     s8    1**YIv)  r   r   )r   )typingr   r   rE   torch.nnnnr   r   torch.nn.utils.rnnr   utilsr	   r
   __all__r^   r   r-   r   r1   r   r   r   r   r   r   r   rh   r   r   <module>r     s         - D	1v 1F 1 1V 1]G".. ]G@Xk XvH{ HVFk FRTVbjj TVnN7 Nb\' \r   