ó
    EñiÒW  ã                   ó,  • S r SSKrSSKrSSKrSSKJr  SS/r " S S\R                  R                  5      r " S S\R                  R                  5      r	 " S	 S
\R                  R                  5      r
 " S S\R                  R                  5      rg)z�
We will recreate all the RNN modules as we require the modules to be decomposed
into its building blocks to be able to observe.
é    N)ÚTensorÚLSTMCellÚLSTMc            
       ó  ^ • \ rS rSrSr\R                  R                  rS/r	   SSS.S\
S\
S	\S
S4U 4S jjjjr SS\S\\\4   S-  S
\\\4   4S jjr SS\
S\S
\\\4   4S jjrS r\SS j5       r\SS j5       rSrU =r$ )r   é   a×  A quantizable long short-term memory (LSTM) cell.

For the description and the argument types, please, refer to :class:`~torch.nn.LSTMCell`

`split_gates`: specify True to compute the input/forget/cell/output gates separately
to avoid an intermediate tensor which is subsequently chunk'd. This optimization can
be beneficial for on-device inference latency. This flag is cascaded down from the
parent classes.

Examples::

    >>> import torch.ao.nn.quantizable as nnqa
    >>> rnn = nnqa.LSTMCell(10, 20)
    >>> input = torch.randn(6, 10)
    >>> hx = torch.randn(3, 20)
    >>> cx = torch.randn(3, 20)
    >>> output = []
    >>> for i in range(6):
    ...     hx, cx = rnn(input[i], (hx, cx))
    ...     output.append(hx)
Úsplit_gatesNF©r   Ú	input_dimÚ
hidden_dimÚbiasÚreturnc                óì  >• XES.n[         T	U ]  5         Xl        X l        X0l        X`l        U(       d‘  [        R                  R                  " USU-  4SU0UD6U l	        [        R                  R                  " USU-  4SU0UD6U l
        [        R                  R                  R                  R                  5       U l        GO[        R                  R                  5       U l	        [        R                  R                  5       U l
        [        R                  R                  5       U l        S H¢  n[        R                  R                  " X4SU0UD6U R                  U'   [        R                  R                  " X"4SU0UD6U R                  U'   [        R                  R                  R                  R                  5       U R                  U'   M¤     [        R                  R!                  5       U l        [        R                  R!                  5       U l        [        R                  R'                  5       U l        [        R                  R!                  5       U l        [        R                  R                  R                  R                  5       U l        [        R                  R                  R                  R                  5       U l        [        R                  R                  R                  R                  5       U l        [        R                  R                  R                  R                  5       U l        SU l        SU l        [        R8                  U l        [        R8                  U l        g )N©ÚdeviceÚdtypeé   r   )ÚinputÚforgetÚcellÚoutput)ç      ð?r   )ÚsuperÚ__init__Ú
input_sizeÚhidden_sizer   r   ÚtorchÚnnÚLinearÚigatesÚhgatesÚaoÚ	quantizedÚFloatFunctionalÚgatesÚ
ModuleDictÚSigmoidÚ
input_gateÚforget_gateÚTanhÚ	cell_gateÚoutput_gateÚfgate_cxÚigate_cgateÚfgate_cx_igate_cgateÚogate_cyÚinitial_hidden_state_qparamsÚinitial_cell_state_qparamsÚquint8Úhidden_state_dtypeÚcell_state_dtype)
Úselfr
   r   r   r   r   r   Úfactory_kwargsÚgÚ	__class__s
            €Ú`/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/ao/nn/quantizable/modules/rnn.pyr   ÚLSTMCell.__init__,   sj  ø€ ð %+Ñ;ˆÜ‰ÑÔØ#ŒØ%ÔØŒ	Ø&ÔæÜ+0¯8©8¯?ª?Ø˜1˜z™>ñ,Ø04ð,Ø8Fñ,ˆDŒKô ,1¯8©8¯?ª?Ø˜A 
™Nñ,Ø15ð,Ø9Gñ,ˆDŒKô +0¯(©(¯+©+×*?Ñ*?×*OÑ*OÓ*QˆDŽJô  Ÿ(™(×-Ñ-Ó/ˆDŒKÜŸ(™(×-Ñ-Ó/ˆDŒKÜŸ™×,Ñ,Ó.ˆDŒJÛ:�ä!&§¡§¢Øñ"Ø04ð"Ø8Fñ"�—‘˜A‘ô "'§¡§¢Øñ"Ø15ð"Ø9Gñ"�—‘˜A‘ô !&§¡§¡× 5Ñ 5× EÑ EÓ G�—
‘
˜1“ñ ;ô  Ÿ(™(×*Ñ*Ó,ˆŒÜ Ÿ8™8×+Ñ+Ó-ˆÔÜŸ™Ÿ™›ˆŒÜ Ÿ8™8×+Ñ+Ó-ˆÔäŸ™Ÿ™×-Ñ-×=Ñ=Ó?ˆŒÜ Ÿ8™8Ÿ;™;×0Ñ0×@Ñ@ÓBˆÔÜ$)§H¡H§K¡K×$9Ñ$9×$IÑ$IÓ$KˆÔ!äŸ™Ÿ™×-Ñ-×=Ñ=Ó?ˆŒà?GˆÔ)Ø=EˆÔ'Ü/4¯|©|ˆÔÜ-2¯\©\ˆÕó    ÚxÚhiddenc                 ó‚  • Ub  US   b  US   c)  U R                  UR                  S   UR                  5      nUu  p4U R                  (       d—  U R	                  U5      nU R                  U5      nU R                  R                  XV5      nUR                  SS5      u  p‰p«U R                  U5      nU R                  U	5      n	U R                  U
5      n
U R                  U5      nOÓ0 n[        U R                  R                  5       U R                  R                  5       U R
                  R                  5       5       H(  u  u  p×pVUR                  U" U5      U" U5      5      XÍ'   M*     U R                  US   5      nU R                  US   5      n	U R                  US   5      n
U R                  US   5      nU R                   R#                  X”5      nU R$                  R#                  XŠ5      nU R&                  R                  Xï5      nUn[(        R*                  " U5      nU R,                  R#                  UU5      nUU4$ )Nr   é   r   r   r   r   r   )Úinitialize_hiddenÚshapeÚis_quantizedr   r   r    r$   ÚaddÚchunkr'   r(   r*   r+   ÚzipÚitemsÚvaluesr,   Úmulr-   r.   r   Útanhr/   )r5   r<   r=   ÚhxÚcxr   r    r$   r'   r(   r*   Úout_gateÚgateÚkeyr,   r-   r.   ÚcyÚtanh_cyÚhys                       r9   ÚforwardÚLSTMCell.forwardf   sñ  € ð ‰>˜V A™YÑ.°&¸±)Ñ2CØ×+Ñ+¨A¯G©G°A©J¸¿¹ÓGˆFØ‰ˆà××Ø—[‘[ “^ˆFØ—[‘[ “_ˆFØ—J‘J—N‘N 6Ó2ˆEà;@¿;¹;ÀqÈ!Ó;LÑ8ˆJ YàŸ™¨Ó4ˆJØ×*Ñ*¨;Ó7ˆKØŸ™ yÓ1ˆIØ×'Ñ'¨Ó1‰Hð ˆDÜ03Ø—
‘
× Ñ Ó"Ø—‘×"Ñ"Ó$Ø—‘×"Ñ"Ó$ö1Ñ,‘�˜fð
 "ŸI™I¡f¨Q£i±¸³Ó<�“	ñ1ð Ÿ™¨¨g©Ó7ˆJØ×*Ñ*¨4°©>Ó:ˆKØŸ™ t¨F¡|Ó4ˆIØ×'Ñ'¨¨X©Ó7ˆHà—=‘=×$Ñ$ [Ó5ˆØ×&Ñ&×*Ñ*¨:ÓAˆØ#×8Ñ8×<Ñ<¸XÓSÐØ!ˆô —*’*˜R“.ˆØ�]‰]×Ñ˜x¨Ó1ˆØ�2ˆvˆr;   Ú
batch_sizerB   c                 óL  • [         R                  " XR                  45      [         R                  " XR                  45      pCU(       aZ  U R                  u  pVU R                  u  px[         R
                  " X5X`R                  S9n[         R
                  " XGX€R                  S9nX44$ )N©ÚscaleÚ
zero_pointr   )r   Úzerosr   r0   r1   Úquantize_per_tensorr3   r4   )	r5   rT   rB   ÚhÚcÚh_scaleÚh_zpÚc_scaleÚc_zps	            r9   r@   ÚLSTMCell.initialize_hidden‘   s“   € ô �KŠK˜×%5Ñ%5Ð6Ó7Ü�KŠK˜×%5Ñ%5Ð6Ó7ð ö Ø"×?Ñ?‰OˆWØ"×=Ñ=‰OˆWÜ×)Ò)Ø¨T×9PÑ9PñˆAô ×)Ò)Ø¨T×9NÑ9NñˆAð ˆtˆr;   c                 ó   • g)NÚQuantizableLSTMCell© ©r5   s    r9   Ú	_get_nameÚLSTMCell._get_name£   s   € Ø$r;   c                 óÌ  • USL USL :w  a  [        S5      eUR                  S   nUR                  S   nU " UUUSLUS9nU(       dÀ  [        R                  R	                  U5      UR
                  l        Ub.  [        R                  R	                  U5      UR
                  l        [        R                  R	                  U5      UR                  l        Ub.  [        R                  R	                  U5      UR                  l        U$ [        X/X4/UR
                  UR                  /5       Hµ  u  pšn[        U	R                  SSS9UR                  5       5       H)  u  pÍ[        R                  R	                  U5      Ul        M+     U
c  M`  [        U
R                  SSS9UR                  5       5       H)  u  pí[        R                  R	                  U5      Ul        M+     M·     U$ )z¥Uses the weights and biases to create a new LSTM cell.

Args:
    wi, wh: Weights for the input and hidden layers
    bi, bh: Biases for the input and hidden layers
Nz/bi and bh must both be None or both have valuesr?   )r
   r   r   r   r   r   )Údim)ÚAssertionErrorrA   r   r   Ú	Parameterr   Úweightr   r    rE   rD   rG   )ÚclsÚwiÚwhÚbiÚbhr   r   r   r   ÚwÚbr$   Úw_chunkrM   Úb_chunks                  r9   Úfrom_paramsÚLSTMCell.from_params¦   s‰  € ð �$ˆJ˜B $˜JÓ'Ü Ð!RÓSÐSØ—X‘X˜a‘[ˆ
Ø—h‘h˜q‘kˆÙØ Ø"Ø˜D�.Ø#ñ	
ˆö Ü!&§¡×!3Ñ!3°BÓ!7ˆD�K‰KÔØ‰~Ü#(§8¡8×#5Ñ#5°bÓ#9�—‘Ô Ü!&§¡×!3Ñ!3°BÓ!7ˆD�K‰KÔØ‰~Ü#(§8¡8×#5Ñ#5°bÓ#9�—‘Ô ð ˆô  # B 8¨b¨X¸¿¹ÀTÇ[Á[Ð7QÖR‘��eÜ%(¨¯©°¸¨Ð):¸E¿L¹L»NÖ%K‘M�GÜ"'§(¡(×"4Ñ"4°WÓ"=�D–Kñ &Lð “=Ü),¨Q¯W©W°Q¸A¨WÐ->ÀÇÁÃÖ)O™˜Ü$)§H¡H×$6Ñ$6°wÓ$?˜ž	ó *Pñ  Sð ˆr;   c                 ó�  • [        U5      U R                  La$  [        SU R                   S[        U5       35      e[        US5      (       d  [        S5      eU R	                  UR
                  UR                  UR                  UR                  US9nUR                  Ul	        UR                  UR                  l	        UR                  UR                  l	        U(       ad  UR                  R                  5        H  nUR                  Ul	        M     UR                  R                  5        H  nUR                  Ul	        M     U$ )NúExpected module type ú, got Úqconfigz$The float module must have 'qconfig'r	   )ÚtypeÚ_FLOAT_MODULErj   Úhasattrrv   Ú	weight_ihÚ	weight_hhÚbias_ihÚbias_hhr{   r   r    rG   )rm   ÚotherÚuse_precomputed_fake_quantr   Úobservedr7   s         r9   Ú
from_floatÚLSTMCell.from_floatÌ   s  € ä�‹;˜c×/Ñ/Ò/Ü Ø'¨×(9Ñ(9Ð':¸&ÄÀeÃÀÐNóð ô �u˜i×(Ñ(Ü Ð!GÓHÐHØ—?‘?Ø�O‰OØ�O‰OØ�M‰MØ�M‰MØ#ð #ð 
ˆð !Ÿ=™=ˆÔØ"'§-¡-ˆ�‰ÔØ"'§-¡-ˆ�‰ÔÞà—_‘_×+Ñ+Ö-�Ø!ŸM™M�–	ñ .à—_‘_×+Ñ+Ö-�Ø!ŸM™M�–	ñ .àˆr;   )r   r*   r4   r,   r.   r(   r$   r    r   r3   r-   r   r1   r0   r'   r   r/   r+   r   ©TNN©N)F)NNF)FF)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   r   r}   Ú__constants__ÚintÚboolr   r   ÚtuplerR   r@   rf   Úclassmethodrv   r†   Ú__static_attributes__Ú__classcell__©r8   s   @r9   r   r      sû   ø† ñð, —H‘H×%Ñ%€MØ"�O€Mð ØØð8:ð ò8:àð8:ð ð8:ð ð	8:ð 
÷8:ñ 8:ðv AEñ)Øð)Ø!& v¨v ~Ñ!6¸Ñ!=ð)à	ˆv�vˆ~Ñ	õ)ðX 5:ñØðØ-1ðà	ˆv�vˆ~Ñ	õò$%ð ó#ó ð#ðJ óó ör;   c            
       óˆ   ^ • \ rS rSrSr   SSS.S\S\S\S	S4U 4S
 jjjjrSS\S\	\\4   S-  4S jjr
\S 5       rSrU =r$ )Ú_LSTMSingleLayeréç   z®A single one-directional LSTM layer.

The difference between a layer and a cell is that the layer can process a
sequence, while the cell only expects an instantaneous value.
NFr	   r
   r   r   r   c                óP   >• XES.n[         TU ]  5         [        X4X6S.UD6U l        g ©Nr   )r   r   )r   r   r   r   )	r5   r
   r   r   r   r   r   r6   r8   s	           €r9   r   Ú_LSTMSingleLayer.__init__î   s7   ø€ ð %+Ñ;ˆÜ‰ÑÔÜØð
Ø(,ñ
ØIWñ
ˆ�	r;   r<   r=   c                 óÌ   • / nUR                   S   n[        U5       H+  nU R                  X   U5      nUR                  US   5        M-     [        R
                  " US5      nXb4$ )Nr   )rA   Úranger   Úappendr   Ústack)r5   r<   r=   ÚresultÚseq_lenÚiÚresult_tensors          r9   rR   Ú_LSTMSingleLayer.forwardþ   s_   € ØˆØ—'‘'˜!‘*ˆÜ�w–ˆAØ—Y‘Y˜q™t VÓ,ˆFØ�M‰M˜& ™)Ö$ñ  ô Ÿš F¨AÓ.ˆØÐ$Ð$r;   c                 ó    • [         R                  " U0 UD6nU " UR                  UR                  UR                  UR
                  S9nX4l        U$ )Nr	   )r   rv   r   r   r   r   r   )rm   ÚargsÚkwargsr   Úlayers        r9   rv   Ú_LSTMSingleLayer.from_params  sJ   € ä×#Ò# TÐ4¨VÑ4ˆÙØ�O‰O˜T×-Ñ-¨t¯y©yÀd×FVÑFVñ
ˆð Œ
Øˆr;   )r   rˆ   r‰   )rŠ   r‹   rŒ   r�   rŽ   r�   r‘   r   r   r’   rR   r“   rv   r”   r•   r–   s   @r9   r˜   r˜   ç   s‚   ø† ñð ØØð
ð ò
àð
ð ð
ð ð	
ð 
÷
ñ 
ñ %˜ð %¨¨v°v¨~Ñ)>ÀÑ)Eõ %ð ñó ör;   r˜   c                   ó˜   ^ • \ rS rSrSr     SSS.S\S\S\S	\S
\SS4U 4S jjjjrSS\S\	\\4   S-  4S jjr
\SS j5       rSrU =r$ )Ú
_LSTMLayeri  z#A single bi-directional LSTM layer.FNr	   r
   r   r   Úbatch_firstÚbidirectionalr   c                ó¶   >• XgS.n	[         T
U ]  5         X@l        XPl        [	        X4X8S.U	D6U l        U R                  (       a  [	        UU4UUS.U	D6U l        g g r›   )r   r   r­   r®   r˜   Úlayer_fwÚlayer_bw)r5   r
   r   r   r­   r®   r   r   r   r6   r8   s             €r9   r   Ú_LSTMLayer.__init__  s|   ø€ ð %+Ñ;ˆÜ‰ÑÔØ&ÔØ*ÔÜ(Øð
Ø(,ñ
ØIWñ
ˆŒð ××Ü,ØØðð Ø'ñ	ð
 !ñˆD�Mð r;   r<   r=   c                 óL  • U R                   (       a  UR                  SS5      nUc  Su  p4OUu  p4S nU R                  (       a)  Uc  S nO
US   nUS   nUc  S nO
US   nUS   nUb  Ub  Xg4nUc  Uc  S nO>[        R                  R                  U5      [        R                  R                  U5      4nU R                  X5      u  p˜[        U S5      (       Ga  U R                  (       aò  UR                  S5      n
U R                  X¥5      u  pµUR                  S5      n[        R                  " X›/U	R                  5       S-
  5      nUc  Uc  S nS nO¬Uc"  [        R                  R                  U5      u  pÞO‡Uc"  [        R                  R                  U5      u  pÞOb[        R                  " US   US   /S5      n[        R                  " US   US   /S5      nO#U	n[        R                  R                  U5      u  pÞU R                   (       a  UR                  SS5        XÍU44$ )Nr   r?   )NNr±   )r­   Ú	transposer®   r   ÚjitÚ_unwrap_optionalr°   r~   Úflipr±   Úcatri   r    Ú
transpose_)r5   r<   r=   Úhx_fwÚcx_fwÚ	hidden_bwÚhx_bwÚcx_bwÚ	hidden_fwÚ	result_fwÚ
x_reversedÚ	result_bwr¡   r[   r\   s                  r9   rR   Ú_LSTMLayer.forward0  s   € Ø××Ø—‘˜A˜qÓ!ˆAØ‰>Ø'‰LˆE�5à!‰LˆEØ26ˆ	Ø××Ø‰}Ø‘à˜a™�Ø˜a™�Ø‰}Ø‘à˜a™�Ø˜a™�ØÑ  UÑ%6Ø!˜L�	Ø‰=˜U™]Ø‰Iô —	‘	×*Ñ*¨5Ó1Ü—	‘	×*Ñ*¨5Ó1ðˆIð  $Ÿ}™}¨QÓ:Ñˆ	ä�4˜×$Ò$¨×);×);ØŸ™ ›ˆJØ#'§=¡=°Ó#GÑ ˆIØ!Ÿ™ qÓ)ˆIä—Y’Y 	Ð5°y·}±}³ÈÑ7JÓKˆFØÑ  YÑ%6Ø�Ø‘ØÑ"ÜŸ™×3Ñ3°IÓ>‘��AØÑ"ÜŸ™×3Ñ3°IÓ>‘��Aä—K’K ¨1¡¨y¸©|Ð <¸aÓ@�Ü—K’K ¨1¡¨y¸©|Ð <¸aÓ@‘àˆFÜ—9‘9×-Ñ-¨iÓ8‰DˆAà××Ø×Ñ˜a Ô#à˜1�vˆ~Ðr;   c           	      óD  • [        US5      (       d  Uc  [        S5      eUR                  SUR                  5      nUR                  SUR                  5      nUR                  SUR
                  5      nUR                  SUR                  5      nUR                  SUR                  5      n	UR                  S	S
5      n
U " UUUUU	U
S9n[        USU5      Ul	        [        USU 35      n[        USU 35      n[        USU 3S5      n[        USU 3S5      n[        R                  XÍXïU
S9Ul        UR                  (       a\  [        USU S35      n[        USU S35      n[        USU S3S5      n[        USU S3S5      n[        R                  XÍXïU
S9Ul        U$ )z•
There is no FP equivalent of this class. This function is here just to
mimic the behavior of the `prepare` within the `torch.ao.quantization`
flow.
r{   Nú3other must have qconfig or qconfig must be providedr   r   r   r­   r®   r   Fr	   Úweight_ih_lÚweight_hh_lÚ	bias_ih_lÚ	bias_hh_lÚ_reverse)r~   rj   Úgetr   r   r   r­   r®   Úgetattrr{   r˜   rv   r°   r±   )rm   rƒ   Ú	layer_idxr{   r¨   r   r   r   r­   r®   r   r©   rn   ro   rp   rq   s                   r9   r†   Ú_LSTMLayer.from_floatg  sÁ  € ô �u˜i×(Ñ(¨W©_Ü Ð!VÓWÐWà—Z‘Z ¨e×.>Ñ.>Ó?ˆ
Ø—j‘j °×0AÑ0AÓBˆØ�z‰z˜& %§*¡*Ó-ˆØ—j‘j °×0AÑ0AÓBˆØŸ
™
 ?°E×4GÑ4GÓHˆØ—j‘j °Ó6ˆáàààààØ#ñ
ˆô    y°'Ó:ˆŒÜ�U˜k¨)¨Ð5Ó6ˆÜ�U˜k¨)¨Ð5Ó6ˆÜ�U˜i¨	 {Ð3°TÓ:ˆÜ�U˜i¨	 {Ð3°TÓ:ˆä)×5Ñ5Ø�B¨ð 6ð 
ˆŒð ××Ü˜ +¨i¨[¸Ð AÓBˆBÜ˜ +¨i¨[¸Ð AÓBˆBÜ˜ )¨I¨;°hÐ ?ÀÓFˆBÜ˜ )¨I¨;°hÐ ?ÀÓFˆBÜ-×9Ñ9Ø˜¨Kð :ð ˆEŒNð ˆr;   )r­   r®   r±   r°   )TFFNNr‰   )r   N)rŠ   r‹   rŒ   r�   rŽ   r�   r‘   r   r   r’   rR   r“   r†   r”   r•   r–   s   @r9   r¬   r¬     s›   ø† Ù.ð Ø!Ø#ØØðð òàðð ðð ð	ð
 ðð ðð 
÷ñ ñ85˜ð 5¨¨v°v¨~Ñ)>ÀÑ)Eõ 5ðn ó0ó ö0r;   r¬   c                   óê   ^ • \ rS rSrSr\R                  R                  r       SSS.S\	S\	S\	S	\
S
\
S\S\
S\
SS4U 4S jjjjrSS\S\\\4   S-  4S jjrS r\SS j5       r\S 5       rSrU =r$ )r   i›  a  A quantizable long short-term memory (LSTM).

For the description and the argument types, please, refer to :class:`~torch.nn.LSTM`

Attributes:
    layers : instances of the `_LSTMLayer`

.. note::
    To access the weights and biases, you need to access them per layer.
    See examples below.

Examples::

    >>> import torch.ao.nn.quantizable as nnqa
    >>> rnn = nnqa.LSTM(10, 20, 2)
    >>> input = torch.randn(5, 3, 10)
    >>> h0 = torch.randn(2, 3, 20)
    >>> c0 = torch.randn(2, 3, 20)
    >>> output, (hn, cn) = rnn(input, (h0, c0))
    >>> # To get the weights:
    >>> # xdoctest: +SKIP
    >>> print(rnn.layers[0].weight_ih)
    tensor([[...]])
    >>> print(rnn.layers[0].weight_hh)
    AssertionError: There is no reverse path in the non-bidirectional layer
FNr	   r   r   Ú
num_layersr   r­   Údropoutr®   r   r   c
                óÔ  >^ ^
^• X‰S.m[         TT ]  5         UT l        UT l        UT l        UT l        UT l        [        U5      T l        UT l	        ST l
        [        U[        R                  5      (       a%  SUs=::  a  S::  a  O  O[        U[        5      (       a  [        S5      eUS:”  a6  [         R"                  " SSS9  US:X  a  [         R"                  " S	U S
U 3SS9  [%        T R                  T R                  T R
                  4ST R                  T
S.TD6/nUR'                  UU U
4S j[)        SU5       5       5        [*        R,                  R/                  U5      T l        g )Nr   Fr   r?   zbdropout should be a number in range [0, 1] representing the probability of an element being zeroedz|dropout option for quantizable LSTM is ignored. If you are training, please, use nn.LSTM version followed by `prepare` step.é   )Ú
stacklevelz‡dropout option adds dropout after all but last recurrent layer, so non-zero dropout expects num_layers greater than 1, but got dropout=z and num_layers=©r­   r®   r   c              3   ó˜   >#   • U  H?  n[        TR                  TR                  TR                  4S TR                  TS.TD6v •  MA     g7f)FrÕ   N)r¬   r   r   r®   )Ú.0Ú_r6   r5   r   s     €€€r9   Ú	<genexpr>Ú LSTM.__init__.<locals>.<genexpr>ø  sZ   øé € ð 
ò *�ô Ø× Ñ Ø× Ñ Ø—	‘	ðð "Ø"×0Ñ0Ø'ñð !öò *ùs   ƒAA
)r   r   r   r   rÐ   r   r­   ÚfloatrÑ   r®   ÚtrainingÚ
isinstanceÚnumbersÚNumberr‘   Ú
ValueErrorÚwarningsÚwarnr¬   Úextendrž   r   r   Ú
ModuleListÚlayers)r5   r   r   rÐ   r   r­   rÑ   r®   r   r   r   rå   r6   r8   s   `         ` @€r9   r   ÚLSTM.__init__¹  sn  û€ ð %+Ñ;ˆÜ‰ÑÔØ$ˆŒØ&ˆÔØ$ˆŒØˆŒ	Ø&ˆÔÜ˜W“~ˆŒØ*ˆÔØˆŒô ˜7¤G§N¡N×3Ñ3Ø˜Õ$ 1Ö$Ü˜'¤4×(Ñ(äðóð ð �Q‹;Ü�MŠMð.ð ò	ð ˜Q‹Ü—’ðBàBIÀð K&Ø&0 \ð3ð  !òô Ø—‘Ø× Ñ Ø—	‘	ðð "Ø"×0Ñ0Ø'ñð !ñð

ˆð 	�‰ö 
ô ˜1˜jÔ)ó
ô 	
ô —h‘h×)Ñ)¨&Ó1ˆ�r;   r<   r=   c                 ó   • U R                   (       a  UR                  SS5      nUR                  S5      nU R                  (       a  SOSnUc¤  [        R
                  " UUU R                  [        R                  UR                  S9nUR                  S5        UR                  (       a!  [        R                  " USSUR                  S9n[        U R                  5       Vs/ s H  oeU4PM     nnO×[        R                  R!                  U5      n[#        US   [$        5      (       až  US   R'                  U R                  XCU R                  5      n	US   R'                  U R                  XCU R                  5      n
[        U R                  5       Vs/ s H)  nX›   R)                  S5      X«   R)                  S5      4PM+     nnOUn/ n/ n[+        U R,                  5       Hr  u  p¾U" XU   5      u  nu  nnUR/                  [        R                  R!                  U5      5        UR/                  [        R                  R!                  U5      5        Mt     [        R0                  " U5      n[        R0                  " U5      nUR'                  SUR2                  S   UR2                  S   5      nUR'                  SUR2                  S   UR2                  S   5      nU R                   (       a  UR                  SS5      nUUU44$ s  snf s  snf )	Nr   r?   rÓ   )r   r   r   rV   éÿÿÿÿéþÿÿÿ)r­   r´   Úsizer®   r   rY   r   rÛ   r   Úsqueeze_rB   rZ   r   rž   rÐ   rµ   r¶   rÝ   r   ÚreshapeÚsqueezeÚ	enumeraterå   rŸ   r    rA   )r5   r<   r=   Úmax_batch_sizeÚnum_directionsrY   rØ   ÚhxcxÚhidden_non_optrJ   rK   ÚidxÚhx_listÚcx_listr©   r[   r\   Ú	hx_tensorÚ	cx_tensors                      r9   rR   ÚLSTM.forward  s�  € Ø××Ø—‘˜A˜qÓ!ˆAàŸ™ ›ˆØ"×0×0™°aˆØ‰>Ü—K’KØØØ× Ñ Ü—k‘kØ—x‘xñˆEð �N‰N˜1ÔØ�~�~Ü×1Ò1Ø °¸!¿'¹'ñ�ô -2°$·/±/Ô,BÓCÒ,B q˜E“NÑ,BˆDÐCˆDä"ŸY™Y×7Ñ7¸Ó?ˆNÜ˜.¨Ñ+¬V×4Ñ4Ø# AÑ&×.Ñ.Ø—O‘O ^ÀT×EUÑEUó�ð $ AÑ&×.Ñ.Ø—O‘O ^ÀT×EUÑEUó�ô
  % T§_¡_Ô5óâ5˜ð ‘W—_‘_ QÓ'¨©¯©¸Ó);Ó<Ù5ð ð �ð
 &�àˆØˆÜ# D§K¡KÖ0‰JˆCÙ˜a c¡Ó+‰IˆA‰v��1Ø�N‰Nœ5Ÿ9™9×5Ñ5°aÓ8Ô9Ø�N‰Nœ5Ÿ9™9×5Ñ5°aÓ8Ö9ñ 1ô —K’K Ó(ˆ	Ü—K’K Ó(ˆ	ð ×%Ñ% b¨)¯/©/¸"Ñ*=¸y¿¹ÈrÑ?RÓSˆ	Ø×%Ñ% b¨)¯/©/¸"Ñ*=¸y¿¹ÈrÑ?RÓSˆ	à××Ø—‘˜A˜qÓ!ˆAà�9˜iÐ(Ð(Ð(ùòE Dùòs   Ã!LÆ0Lc                 ó   • g)NÚQuantizableLSTMrd   re   s    r9   rf   ÚLSTM._get_name=  s   € Ø r;   c                 ó  • [        XR                  5      (       d$  [        SU R                   S[        U5       35      e[	        US5      (       d  U(       d  [        S5      eU " UR
                  UR                  UR                  UR                  UR                  UR                  UR                  US9n[        USU5      Ul        [        UR                  5       H&  n[        R!                  XUSUS9UR"                  U'   M(     UR$                  (       a:  UR'                  5         [(        R*                  R,                  R/                  USS	9nU$ UR1                  5         [(        R*                  R,                  R3                  USS	9nU$ )
Nry   rz   r{   rÅ   r	   F)r­   r   T)Úinplace)rÝ   r}   rj   r|   r~   r   r   rÐ   r   r­   rÑ   r®   rÌ   r{   rž   r¬   r†   rå   rÜ   Útrainr   r!   ÚquantizationÚprepare_qatÚevalÚprepare)rm   rƒ   r{   r   r…   ró   s         r9   r†   ÚLSTM.from_float@  sW  € ä˜%×!2Ñ!2×3Ñ3Ü Ø'¨×(9Ñ(9Ð':¸&ÄÀeÃÀÐNóð ô �u˜i×(Ñ(¶Ü Ð!VÓWÐWÙØ×ÑØ×ÑØ×ÑØ�J‰JØ×ÑØ�M‰MØ×ÑØ#ñ	
ˆô # 5¨)°WÓ=ˆÔÜ˜×)Ñ)Ö*ˆCÜ#-×#8Ñ#8Ø˜G°ÀKð $9ð $ˆH�O‰O˜CÓ ñ +ð �>�>Ø�N‰NÔÜ—x‘x×,Ñ,×8Ñ8¸È4Ð8ÐPˆHð ˆð �M‰MŒOÜ—x‘x×,Ñ,×4Ñ4°XÀtÐ4ÐLˆHØˆr;   c                 ó   • [        S5      e)NzuIt looks like you are trying to convert a non-quantizable LSTM module. Please, see the examples on quantizable LSTMs.)ÚNotImplementedError)rm   rƒ   s     r9   Úfrom_observedÚLSTM.from_observedb  s   € ô "ð1ó
ð 	
r;   )	r­   r   r®   rÑ   r   r   rå   rÐ   rÜ   )r?   TFg        FNNr‰   )NF)rŠ   r‹   rŒ   r�   rŽ   r   r   r   r}   r�   r‘   rÛ   r   r   r’   rR   rf   r“   r†   r  r”   r•   r–   s   @r9   r   r   ›  s÷   ø† ñð6 —H‘H—M‘M€Mð ØØ!ØØ#ØØðK2ð "òK2àðK2ð ðK2ð ð	K2ð
 ðK2ð ðK2ð ðK2ð ðK2ð ðK2ð 
÷K2ñ K2ñZ5)˜ð 5)¨¨v°v¨~Ñ)>ÀÑ)Eõ 5)òn!ð óó ððB ñ
ó ö
r;   )rŽ   rÞ   rá   r   r   Ú__all__r   ÚModuler   r˜   r¬   r   rd   r;   r9   Ú<module>r
     s}   ðñó Û ã Ý ð �vÐ
€ôRˆu�x‰x�‰ô Rôj'�u—x‘x—‘ô 'ôTG�—‘—‘ô GôTO
ˆ5�8‰8�?‰?õ O
r;   