Ë
    g^(hCT  ã                   ó8  — d Z ddlZddlZddlmZ ddlZddlmZ ddgZ G d„ dej                  j                  «      Z
 G d„ d	ej                  j                  «      Z G d
„ dej                  j                  «      Z G d„ dej                  j                  «      Zy)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)ÚOptional)ÚTensorÚLSTMCellÚLSTMc            
       óò   ‡ — e Zd ZdZej
                  j                  ZdgZ	 	 	 dddœde	de	de
d	dfˆ fd
„Z	 ddedeeeef      d	eeef   fd„Z	 dde	de
d	eeef   fd„Zd„ Zedd„«       Zedd„«       Zˆ xZS )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                óä  •— ||dœ}t         ‰	| �  «        || _        || _        || _        || _        |s�t        j                  j                  |d|z  fd|i|¤Ž| _	        t        j                  j                  |d|z  fd|i|¤Ž| _
        t        j                  j                  j                  j                  «       | _        �nt        j                  j                  «       | _	        t        j                  j                  «       | _
        t        j                  j                  «       | _        dD ]¡  }t        j                  j                  ||fd|i|¤Ž| j                  |<   t        j                  j                  ||fd|i|¤Ž| j                  |<   t        j                  j                  j                  j                  «       | j                  |<   Œ£ t        j                  j!                  «       | _        t        j                  j!                  «       | _        t        j                  j'                  «       | _        t        j                  j!                  «       | _        t        j                  j                  j                  j                  «       | _        t        j                  j                  j                  j                  «       | _        t        j                  j                  j                  j                  «       | _        t        j                  j                  j                  j                  «       | _        d| _        d| _        t        j8                  | _        t        j8                  | _        y )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
            €úa/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/ao/nn/quantizable/modules/rnn.pyr   zLSTMCell.__init__,   s  ø€ ð %+°UÑ;ˆÜ‰ÑÔØ#ˆŒØ%ˆÔØˆŒ	Ø&ˆÔáÜ+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Ø:ò 
H�ä!&§¡§¡Ø˜zñ"Ø04ð"Ø8Fñ"�—‘˜A‘ô "'§¡§¡Ø 
ñ"Ø15ð"Ø9Gñ"�—‘˜A‘ô !&§¡§¡× 5Ñ 5× EÑ EÓ G�—
‘
˜1’ð
Hô  Ÿ(™(×*Ñ*Ó,ˆŒÜ Ÿ8™8×+Ñ+Ó-ˆÔÜŸ™Ÿ™›ˆŒÜ Ÿ8™8×+Ñ+Ó-ˆÔäŸ™Ÿ™×-Ñ-×=Ñ=Ó?ˆŒÜ Ÿ8™8Ÿ;™;×0Ñ0×@Ñ@ÓBˆÔÜ$)§H¡H§K¡K×$9Ñ$9×$IÑ$IÓ$KˆÔ!äŸ™Ÿ™×-Ñ-×=Ñ=Ó?ˆŒà?GˆÔ)Ø=EˆÔ'Ü/4¯|©|ˆÔÜ-2¯\©\ˆÕó    ÚxÚhiddenc                 ó€  — |�
|d   �|d   €)| j                  |j                  d   |j                  «      }|\  }}| j                  sš| j	                  |«      }| j                  |«      }| j                  j                  ||«      }|j                  dd«      \  }}	}
}| j                  |«      }| j                  |	«      }	| j                  |
«      }
| j                  |«      }nÔi }t        | j                  j                  «       | j                  j                  «       | j
                  j                  «       «      D ]*  \  \  }}}}|j                   ||«       ||«      «      ||<   Œ, | j                  |d   «      }| j                  |d   «      }	| j                  |d   «      }
| j                  |d   «      }| j                   j#                  |	|«      }| j$                  j#                  ||
«      }| j&                  j                  ||«      }|}t)        j*                  |«      }| j,                  j#                  ||«      }||fS )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   ÚforwardzLSTMCell.forwardf   s
  € ð ˆ>˜V A™YÐ.°&¸±)Ð2CØ×+Ñ+¨A¯G©G°A©J¸¿¹ÓGˆFØ‰ˆˆBà×ÒØ—[‘[ “^ˆFØ—[‘[ “_ˆFØ—J‘J—N‘N 6¨6Ó2ˆEà;@¿;¹;ÀqÈ!Ó;LÑ8ˆJ˜ Y°àŸ™¨Ó4ˆJØ×*Ñ*¨;Ó7ˆKØŸ™ yÓ1ˆIØ×'Ñ'¨Ó1‰Hð ˆDÜ03Ø—
‘
× Ñ Ó"Ø—‘×"Ñ"Ó$Ø—‘×"Ñ"Ó$ó1ò =Ñ,‘��e˜f fð
 "ŸI™I¡f¨Q£i±¸³Ó<��S’	ð=ð Ÿ™¨¨g©Ó7ˆJØ×*Ñ*¨4°©>Ó:ˆKØŸ™ t¨F¡|Ó4ˆIØ×'Ñ'¨¨X©Ó7ˆHà—=‘=×$Ñ$ [°"Ó5ˆØ×&Ñ&×*Ñ*¨:°yÓAˆØ#×8Ñ8×<Ñ<¸XÀ{ÓSÐØ!ˆô —*‘*˜R“.ˆØ�]‰]×Ñ˜x¨Ó1ˆØ�2ˆvˆr:   Ú
batch_sizerA   c                 óZ  — t        j                  || j                  f«      t        j                  || j                  f«      }}|rd| j                  \  }}| j                  \  }}t        j
                  |||| j                  ¬«      }t        j
                  |||| j                  ¬«      }||fS )N©ÚscaleÚ
zero_pointr   )r   Úzerosr   r0   r1   Úquantize_per_tensorr3   r4   )	r5   rR   rA   ÚhÚcÚh_scaleÚh_zpÚc_scaleÚc_zps	            r9   r?   zLSTMCell.initialize_hidden‘   s¦   € ô �{‰{˜J¨×(8Ñ(8Ð9Ó:¼E¿K¹KØ˜×)Ñ)Ð*ó=
ˆ1ˆñ Ø"×?Ñ?‰OˆW�dØ"×=Ñ=‰OˆW�dÜ×)Ñ)Ø˜¨T¸×9PÑ9PôˆAô ×)Ñ)Ø˜¨T¸×9NÑ9NôˆAð �!ˆtˆr:   c                  ó   — y)NÚQuantizableLSTMCell© ©r5   s    r9   Ú	_get_namezLSTMCell._get_name¢   s   € Ø$r:   c                 ó¶  — |du |du k(  sJ ‚|j                   d   }|j                   d   } | |||du|¬«      }|s¾t        j                  j                  |«      |j                  _        |�.t        j                  j                  |«      |j                  _        t        j                  j                  |«      |j                  _        |�.t        j                  j                  |«      |j                  _        |S t        ||g||g|j                  |j                  g«      D ]·  \  }	}
}t        |	j                  dd¬«      |j                  «       «      D ])  \  }}t        j                  j                  |«      |_        Œ+ |
€Œat        |
j                  dd¬«      |j                  «       «      D ])  \  }}t        j                  j                  |«      |_        Œ+ Œ¹ |S )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
        Nr>   )r
   r   r   r   r   r   )Údim)r@   r   r   Ú	Parameterr   Úweightr   r    rD   rC   rF   )ÚclsÚwiÚwhÚbiÚbhr   r   r   r   ÚwÚbr$   Úw_chunkrL   Úb_chunks                  r9   Úfrom_paramszLSTMCell.from_params¥   s�  € ð �d�
  d 
Ò+Ð+Ð+Ø—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ò @‘��1�eÜ%(¨¯©°¸¨Ó):¸E¿L¹L»NÓ%Kò >‘M�G˜TÜ"'§(¡(×"4Ñ"4°WÓ"=�D•Kð>ð ‘=Ü),¨Q¯W©W°Q¸A¨WÓ->ÀÇÁÃÓ)Oò @™˜ Ü$)§H¡H×$6Ñ$6°wÓ$?˜�	ñ@ð@ð ˆr:   c                 ó.  — t        |«      | j                  k(  sJ ‚t        |d«      sJ d«       ‚| j                  |j                  |j
                  |j                  |j                  |¬«      }|j                  |_        |j                  |j                  _        |j                  |j                  _        |r`|j                  j                  «       D ]  }|j                  |_        Œ |j                  j                  «       D ]  }|j                  |_        Œ |S )NÚqconfigz$The float module must have 'qconfig'r	   )ÚtypeÚ_FLOAT_MODULEÚhasattrrq   Ú	weight_ihÚ	weight_hhÚbias_ihÚbias_hhrs   r   r    rF   )rh   ÚotherÚuse_precomputed_fake_quantr   Úobservedr7   s         r9   Ú
from_floatzLSTMCell.from_floatÊ   sæ   € ä�E‹{˜c×/Ñ/Ò/Ð/Ð/Ü�u˜iÔ(ÐPÐ*PÓPÐ(Ø—?‘?Ø�O‰OØ�O‰OØ�M‰MØ�M‰MØ#ð #ó 
ˆð !Ÿ=™=ˆÔØ"'§-¡-ˆ�‰ÔØ"'§-¡-ˆ�‰ÔÙà—_‘_×+Ñ+Ó-ò *�Ø!ŸM™M�•	ð*à—_‘_×+Ñ+Ó-ò *�Ø!ŸM™M�•	ð*àˆr:   ©TNN©N)F)NNF)FF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   ru   Ú__constants__ÚintÚboolr   r   r   ÚtuplerQ   r?   rc   Úclassmethodrq   r~   Ú__classcell__©r8   s   @r9   r   r      sö   ø„ ñð* —H‘H×%Ñ%€MØ"�O€Mð ØØð8:ð ò8:àð8:ð ð8:ð ð	8:ð 
õ8:ðv DHñ)Øð)Ø!)¨%°¸°Ñ*?Ñ!@ð)à	ˆv�vˆ~Ñ	ó)ðX 5:ñØðØ-1ðà	ˆv�vˆ~Ñ	óò"%ð ò"ó ð"ðH òó ôr:   c            
       ót   ‡ — e Zd ZdZ	 	 	 dddœdedededdfˆ fd	„Zdd
edee	eef      fd„Z
ed„ «       Zˆ xZS )Ú_LSTMSingleLayerzº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                óV   •— ||dœ}t         ‰| �  «        t        ||f||dœ|¤Ž| _        y ©Nr   )r   r   )r   r   r   r   )	r5   r
   r   r   r   r   r   r6   r8   s	           €r9   r   z_LSTMSingleLayer.__init__è   s=   ø€ ð %+°UÑ;ˆÜ‰ÑÔÜØ�zð
Ø(,¸+ñ
ØIWñ
ˆ�	r:   r;   r<   c                 óÊ   — g }|j                   d   }t        |«      D ]+  }| j                  ||   |«      }|j                  |d   «       Œ- t	        j
                  |d«      }||fS )Nr   )r@   Úranger   Úappendr   Ústack)r5   r;   r<   ÚresultÚseq_lenÚiÚresult_tensors          r9   rQ   z_LSTMSingleLayer.forwardø   sh   € ØˆØ—'‘'˜!‘*ˆÜ�w“ò 	%ˆAØ—Y‘Y˜q ™t VÓ,ˆFØ�M‰M˜& ™)Õ$ð	%ô Ÿ™ F¨AÓ.ˆØ˜fÐ$Ð$r:   c                 ó¦   — t        j                  |i |¤Ž} | |j                  |j                  |j                  |j
                  ¬«      }||_        |S )Nr	   )r   rq   r   r   r   r   r   )rh   ÚargsÚkwargsr   Úlayers        r9   rq   z_LSTMSingleLayer.from_params  sL   € ä×#Ñ# 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ˆ   rQ   r‰   rq   rŠ   r‹   s   @r9   r�   r�   á   s}   ø„ ñð ØØð
ð ò
àð
ð ð
ð ð	
ð 
õ
ñ %˜ð %¨°%¸À¸Ñ2GÑ)Hó %ð ñó ôr:   r�   c                   ó‚   ‡ — e Zd ZdZ	 	 	 	 	 dddœdedededed	ed
dfˆ fd„Zddedee	eef      fd„Z
edd„«       Zˆ xZS )Ú
_LSTMLayerz#A single bi-directional LSTM layer.FNr	   r
   r   r   Úbatch_firstÚbidirectionalr   c                ó¶   •— ||dœ}	t         ‰
| �  «        || _        || _        t	        ||f||dœ|	¤Ž| _        | j                  rt	        ||f||dœ|	¤Ž| _        y y r�   )r   r   rž   rŸ   r�   Úlayer_fwÚlayer_bw)r5   r
   r   r   rž   rŸ   r   r   r   r6   r8   s             €r9   r   z_LSTMLayer.__init__  s†   ø€ ð %+°UÑ;ˆÜ‰ÑÔØ&ˆÔØ*ˆÔÜ(Ø�zð
Ø(,¸+ñ
ØIWñ
ˆŒð ×ÒÜ,ØØðð Ø'ñ	ð
 !ñˆD�Mð r:   r;   r<   c                 ó  — | j                   r|j                  dd«      }|€d\  }}n|\  }}d }| j                  r&|€d }n
|d   }|d   }|€d }n
|d   }|d   }|�|�||f}|€|€d }n>t        j                  j                  |«      t        j                  j                  |«      f}| j                  ||«      \  }	}t        | d«      rü| j                  rð|j                  d«      }
| j                  |
|«      \  }}|j                  d«      }t        j                  |	|g|	j                  «       dz
  «      }|€|€d }d }n«|€#t        j                  j                  |«      \  }}n†|€#t        j                  j                  |«      \  }}nat        j                  |d   |d   gd«      }t        j                  |d   |d   gd«      }n$|	}t        j                  j                  |«      \  }}| j                   r|j                  dd«       |||ffS )Nr   r>   )NNr¢   )rž   Ú	transposerŸ   r   ÚjitÚ_unwrap_optionalr¡   rv   Úflipr¢   Úcatre   r“   Ú
transpose_)r5   r;   r<   Úhx_fwÚcx_fwÚ	hidden_bwÚhx_bwÚcx_bwÚ	hidden_fwÚ	result_fwÚ
x_reversedÚ	result_bwr”   rY   rZ   s                  r9   rQ   z_LSTMLayer.forward*  s  € Ø×ÒØ—‘˜A˜qÓ!ˆAØˆ>Ø'‰LˆE‘5à!‰LˆE�5Ø59ˆ	Ø×ÒØˆ}Ø‘à˜a™�Ø˜a™�Øˆ}Ø‘à˜a™�Ø˜a™�ØÐ  UÐ%6Ø! 5˜L�	Øˆ=˜U˜]Ø‰IäŸ	™	×2Ñ2°5Ó9¼5¿9¹9×;UÑ;UØó<ð ˆIð  $Ÿ}™}¨Q°	Ó:Ñˆ	�9ä�4˜Ô$¨×);Ò);ØŸ™ ›ˆJØ#'§=¡=°¸YÓ#GÑ ˆI�yØ!Ÿ™ qÓ)ˆIä—Y‘Y 	¨9Ð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ˆqà×ÒØ×Ñ˜a Ô#à˜˜1�vˆ~Ðr:   c                 ó6  — t        |d«      s|€J ‚|j                  d|j                  «      }|j                  d|j                  «      }|j                  d|j                  «      }|j                  d|j
                  «      }|j                  d|j                  «      }	|j                  dd	«      }
 | |||||	|
¬
«      }t        |d|«      |_        t        |d|› �«      }t        |d|› �«      }t        |d|› �d«      }t        |d|› �d«      }t        j                  |||||
¬
«      |_        |j                  rat        |d|› d�«      }t        |d|› d�«      }t        |d|› d�d«      }t        |d|› d�d«      }t        j                  |||||
¬
«      |_        |S )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.
        rs   Nr   r   r   rž   rŸ   r   Fr	   Úweight_ih_lÚweight_hh_lÚ	bias_ih_lÚ	bias_hh_lÚ_reverse)rv   Úgetr   r   r   rž   rŸ   Úgetattrrs   r�   rq   r¡   r¢   )rh   r{   Ú	layer_idxrs   rš   r   r   r   rž   rŸ   r   r›   ri   rj   rk   rl   s                   r9   r~   z_LSTMLayer.from_float`  sÁ  € ô �u˜iÔ(¨WÐ-@ÐAÐAà—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Ø�B˜˜B¨Kð :ó ˆEŒNð ˆr:   )TFFNNr€   )r   N)r�   r‚   rƒ   r„   r†   r‡   r   r   r   rˆ   rQ   r‰   r~   rŠ   r‹   s   @r9   r�   r�     s–   ø„ Ù.ð Ø!Ø#ØØðð òàðð ðð ð	ð
 ðð ðð 
õñ84˜ð 4¨°%¸À¸Ñ2GÑ)Hó 4ðl ò)ó ô)r:   r�   c                   óÔ   ‡ — e Zd ZdZej
                  j                  Z	 	 	 	 	 	 	 dddœdededede	d	e	d
e
de	de	ddfˆ fd„Zddedeeeef      fd„Zd„ Zedd„«       Zed„ «       Zˆ xZS )r   aX  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
                óÌ  •‡ ‡
‡— ||	dœŠt         ‰‰ �  «        |‰ _        |‰ _        |‰ _        |‰ _        |‰ _        t        |«      ‰ _        |‰ _	        d‰ _
        t        |t        j                  «      r(d|cxk  rdk  rn t        d«      ‚t        |t        «      rt        d«      ‚|dkD  r5t!        j"                  d«       |dk(  rt!        j"                  d|› d|› �«       t%        ‰ j                  ‰ j                  ‰ j
                  fd‰ j                  ‰
d	œ‰¤Žg}|j'                  ˆˆ ˆ
fd
„t)        d|«      D «       «       t*        j,                  j/                  |«      ‰ _        y )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.z‡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   ó’   •K  — | ]>  }t        ‰j                  ‰j                  ‰j                  fd ‰j                  ‰dœ‰¤Ž–— Œ@ y­w)FrÀ   N)r�   r   r   rŸ   )Ú.0Ú_r6   r5   r   s     €€€r9   ú	<genexpr>z LSTM.__init__.<locals>.<genexpr>æ  sY   øè ø€ ò 
ð ô Ø× Ñ Ø× Ñ Ø—	‘	ðð "Ø"×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   zLSTM.__init__ª  sv  û€ ð %+°UÑ;ˆÜ‰ÑÔØ$ˆŒØ&ˆÔØ$ˆŒØˆŒ	Ø&ˆÔÜ˜W“~ˆŒØ*ˆÔØˆŒô ˜7¤G§N¡NÔ3Ø˜Ô$ 1Ô$ô ðóð ô ˜'¤4Ô(äðóð ð
 �QŠ;Ü�M‰Mð.ôð
 ˜QŠÜ—‘ðBàBIÀð K&Ø&0 \ð3ôô Ø—‘Ø× Ñ Ø—	‘	ðð "Ø"×0Ñ0Ø'ñð !ñð

ˆð 	�‰õ 
ô ˜1˜jÓ)ô
ô 	
ô —h‘h×)Ñ)¨&Ó1ˆ�r:   r;   r<   c                 óî  — | j                   r|j                  dd«      }|j                  d«      }| j                  rdnd}|€¡t	        j
                  ||| j                  t        j                  |j                  ¬«      }|j                  d«       |j                  r#t	        j                  |dd|j                  ¬«      }t        | j                  «      D �cg c]  }||f‘Œ }}nÓt        j                  j!                  |«      }t#        |d   t$        «      rŸ|d   j'                  | j                  ||| j                  «      }	|d   j'                  | j                  ||| j                  «      }
t        | j                  «      D �cg c]*  }|	|   j)                  d«      |
|   j)                  d«      f‘Œ, }}n|}g }g }t+        | j,                  «      D ]s  \  }} ||||   «      \  }\  }}|j/                  t        j                  j!                  |«      «       |j/                  t        j                  j!                  |«      «       Œu t	        j0                  |«      }t	        j0                  |«      }|j'                  d|j2                  d   |j2                  d   «      }|j'                  d|j2                  d   |j2                  d   «      }| j                   r|j                  dd«      }|||ffS c c}w c c}w )	Nr   r>   é   )r   r   r   rT   éÿÿÿÿéþÿÿÿ)rž   r¤   ÚsizerŸ   r   rW   r   rÅ   r   Úsqueeze_rA   rX   r   r‘   r½   r¥   r¦   rÇ   r   ÚreshapeÚsqueezeÚ	enumeraterÏ   r’   r“   r@   )r5   r;   r<   Úmax_batch_sizeÚnum_directionsrW   rÃ   ÚhxcxÚhidden_non_optrI   rJ   ÚidxÚhx_listÚcx_listr›   rY   rZ   Ú	hx_tensorÚ	cx_tensors                      r9   rQ   zLSTM.forwardô  s“  € Ø×ÒØ—‘˜A˜qÓ!ˆAàŸ™ ›ˆØ"×0Ò0™°aˆØˆ>Ü—K‘KØØØ× Ñ Ü—k‘kØ—x‘xôˆEð �N‰N˜1ÔØ�~Š~Ü×1Ñ1Ø °¸!¿'¹'ô�ô -2°$·/±/Ó,BÖC q�U˜E’NÐCˆDÑCä"ŸY™Y×7Ñ7¸Ó?ˆNÜ˜.¨Ñ+¬VÔ4Ø# AÑ&×.Ñ.Ø—O‘O ^°^ÀT×EUÑEUó�ð $ AÑ&×.Ñ.Ø—O‘O ^°^ÀT×EUÑEUó�ô
  % T§_¡_Ó5öàð ˜‘W—_‘_ QÓ'¨¨C©¯©¸Ó);Ò<ð�ñ ð
 &�àˆØˆÜ# 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ð	:ô —K‘K Ó(ˆ	Ü—K‘K Ó(ˆ	ð ×%Ñ% b¨)¯/©/¸"Ñ*=¸y¿¹ÈrÑ?RÓSˆ	Ø×%Ñ% b¨)¯/©/¸"Ñ*=¸y¿¹ÈrÑ?RÓSˆ	à×ÒØ—‘˜A˜qÓ!ˆAà�9˜iÐ(Ð(Ð(ùòE Dùòs   ÃK-Æ/K2c                  ó   — y)NÚQuantizableLSTMra   rb   s    r9   rc   zLSTM._get_name+  s   € Ø r:   c           
      ó°  — t        || j                  «      sJ ‚t        |d«      s|sJ ‚ | |j                  |j                  |j
                  |j                  |j                  |j                  |j                  |¬«      }t        |d|«      |_        t        |j
                  «      D ])  }t        j                  |||d|¬«      |j                  |<   Œ+ |j                   r=|j#                  «        t$        j&                  j(                  j+                  |d¬«      }|S |j-                  «        t$        j&                  j(                  j/                  |d¬«      }|S )Nrs   r	   F)rž   r   T)Úinplace)rÇ   ru   rv   r   r   r½   r   rž   r¾   rŸ   rº   rs   r‘   r�   r~   rÏ   rÆ   Útrainr   r!   ÚquantizationÚprepare_qatÚevalÚprepare)rh   r{   rs   r   r}   rÝ   s         r9   r~   zLSTM.from_float.  s0  € ä˜% ×!2Ñ!2Ô3Ð3Ð3Ü�u˜iÔ(©GÐ3Ð3ÙØ×ÑØ×ÑØ×ÑØ�J‰JØ×ÑØ�M‰MØ×ÑØ#ô	
ˆô # 5¨)°WÓ=ˆÔÜ˜×)Ñ)Ó*ò 	ˆCÜ#-×#8Ñ#8Ø�s˜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                 ó   — t        d«      ‚)NzuIt looks like you are trying to convert a non-quantizable LSTM module. Please, see the examples on quantizable LSTMs.)ÚNotImplementedError)rh   r{   s     r9   Úfrom_observedzLSTM.from_observedK  s   € ô "ð1ó
ð 	
r:   )r>   TFg        FNNr€   )NF)r�   r‚   rƒ   r„   r   r   r   ru   r†   r‡   rÅ   r   r   r   rˆ   rQ   rc   r‰   r~   rí   rŠ   r‹   s   @r9   r   r   �  sð   ø„ ñð4 —H‘H—M‘M€Mð ØØ!ØØ#ØØðH2ð "òH2àðH2ð ðH2ð ð	H2ð
 ðH2ð ðH2ð ðH2ð ðH2ð ðH2ð 
õH2ñT5)˜ð 5)¨°%¸À¸Ñ2GÑ)Hó 5)òn!ð òó ðð8 ñ
ó ô
r:   )r„   rÈ   rË   Útypingr   r   r   Ú__all__r   ÚModuler   r�   r�   r   ra   r:   r9   ú<module>rñ      s€   ðñó Û Ý ã Ý ð �vÐ
€ôKˆu�x‰x�‰ô Kô\'�u—x‘x—‘ô 'ôT�—‘—‘ô ôDF
ˆ5�8‰8�?‰?õ F
r:   