Ë
    P/æj6E  ã                   ó<  — d Z ddlZddlZddlmZ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ÚTuple)ÚTensorÚLSTMCellÚLSTMc            	       óæ   ‡ — e Zd ZdZej
                  j                  Z	 	 	 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`

    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)
    NÚ	input_dimÚ
hidden_dimÚbiasÚreturnc                 ó°  •— ||dœ}t         ‰| �  «        || _        || _        || _        t        j                  j                  |d|z  fd|i|¤Ž| _        t        j                  j                  |d|z  fd|i|¤Ž| _	        t
        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
        j4                  | _        t
        j4                  | _        y )N©ÚdeviceÚdtypeé   r   )ç      ð?r   )ÚsuperÚ__init__Ú
input_sizeÚhidden_sizer   ÚtorchÚnnÚLinearÚigatesÚhgatesÚaoÚ	quantizedÚFloatFunctionalÚgatesÚ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   Úfactory_kwargsÚ	__class__s          €úf/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/torch/ao/nn/quantizable/modules/rnn.pyr   zLSTMCell.__init__&   s�  ø€ ð %+°UÑ;ˆÜ‰ÑÔØ#ˆŒØ%ˆÔØˆŒ	ä—h‘h—o‘oØ�q˜:‘~ñ
Ø,0ð
Ø4Bñ
ˆŒô —h‘h—o‘oØ˜˜J™ñ
Ø-1ð
Ø5Cñ
ˆŒô —X‘X—[‘[×*Ñ*×:Ñ:Ó<ˆŒ
äŸ(™(×*Ñ*Ó,ˆŒÜ Ÿ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                  |«      }| j	                  |«      }| j
                  j                  ||«      }|j                  dd«      \  }}	}
}| j                  |«      }| j                  |	«      }	| j                  |
«      }
| j                  |«      }| j                  j                  |	|«      }| j                  j                  ||
«      }| j                  j                  ||«      }|}t!        j"                  |«      }| j$                  j                  ||«      }||fS )Nr   é   r   )Úinitialize_hiddenÚshapeÚis_quantizedr   r   r   ÚaddÚchunkr!   r"   r$   r%   r&   Úmulr'   r(   r   Útanhr)   )r0   r5   r6   ÚhxÚcxr   r   r   r!   r"   r$   Úout_gater&   r'   r(   ÚcyÚtanh_cyÚhys                     r3   ÚforwardzLSTMCell.forwardL   s?  € ð ˆ>˜V A™YÐ.°&¸±)Ð2CØ×+Ñ+¨A¯G©G°A©J¸¿¹ÓGˆFØ‰ˆˆBà—‘˜Q“ˆØ—‘˜R“ˆØ—
‘
—‘˜v vÓ.ˆà7<·{±{À1ÀaÓ7HÑ4ˆ
�K ¨Hà—_‘_ ZÓ0ˆ
Ø×&Ñ& {Ó3ˆØ—N‘N 9Ó-ˆ	Ø×#Ñ# HÓ-ˆà—=‘=×$Ñ$ [°"Ó5ˆØ×&Ñ&×*Ñ*¨:°yÓAˆØ#×8Ñ8×<Ñ<¸XÀ{ÓSÐØ!ˆô —*‘*˜R“.ˆØ�]‰]×Ñ˜x¨Ó1ˆØ�2ˆvˆr4   Ú
batch_sizer;   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   r*   r+   Úquantize_per_tensorr-   r.   )	r0   rG   r;   ÚhÚcÚh_scaleÚh_zpÚc_scaleÚc_zps	            r3   r9   zLSTMCell.initialize_hiddenh   s¦   € ô �{‰{˜J¨×(8Ñ(8Ð9Ó:¼E¿K¹KØ˜×)Ñ)Ð*ó=
ˆ1ˆñ Ø"×?Ñ?‰OˆW�dØ"×=Ñ=‰OˆW�dÜ×)Ñ)Ø˜¨T¸×9PÑ9PôˆAô ×)Ñ)Ø˜¨T¸×9NÑ9NôˆAð �!ˆtˆr4   c                  ó   — y)NÚQuantizableLSTMCell© ©r0   s    r3   Ú	_get_namezLSTMCell._get_namey   s   € Ø$r4   c                 óê  — |du |du k(  sJ ‚|j                   d   }|j                   d   } | |||du¬«      }t        j                  j                  |«      |j                  _        |�.t        j                  j                  |«      |j                  _        t        j                  j                  |«      |j                  _        |�.t        j                  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
        Nr8   )r	   r
   r   )r:   r   r   Ú	Parameterr   Úweightr   r   )ÚclsÚwiÚwhÚbiÚbhr   r   Úcells           r3   Úfrom_paramszLSTMCell.from_params|   sÂ   € ð �d�
  d 
Ò+Ð+Ð+Ø—X‘X˜a‘[ˆ
Ø—h‘h˜q‘kˆÙ˜Z°KÀrÐQUÀ~ÔWˆÜ"ŸX™X×/Ñ/°Ó3ˆ�‰ÔØˆ>Ü$Ÿx™x×1Ñ1°"Ó5ˆD�K‰KÔÜ"ŸX™X×/Ñ/°Ó3ˆ�‰ÔØˆ>Ü$Ÿx™x×1Ñ1°"Ó5ˆD�K‰KÔØˆr4   c                 óf  — t        |«      | j                  k(  sJ ‚t        |d«      sJ d«       ‚| j                  |j                  |j
                  |j                  |j                  «      }|j                  |_        |j                  |j                  _        |j                  |j                  _        |S )NÚqconfigz$The float module must have 'qconfig')ÚtypeÚ_FLOAT_MODULEÚhasattrrb   Ú	weight_ihÚ	weight_hhÚbias_ihÚbias_hhrd   r   r   )r\   ÚotherÚuse_precomputed_fake_quantÚobserveds       r3   Ú
from_floatzLSTMCell.from_float�   sŠ   € ä�E‹{˜c×/Ñ/Ò/Ð/Ð/Ü�u˜iÔ(ÐPÐ*PÓPÐ(Ø—?‘?Ø�O‰O˜UŸ_™_¨e¯m©m¸U¿]¹]ó
ˆð !Ÿ=™=ˆÔØ"'§-¡-ˆ�‰ÔØ"'§-¡-ˆ�‰ÔØˆr4   ©TNN©N)F©NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   rf   ÚintÚboolr   r   r   r   rF   r9   rX   Úclassmethodrb   ro   Ú__classcell__©r2   s   @r3   r   r      sã   ø„ ñð  —H‘H×%Ñ%€Mð ØØñ$:àð$:ð ð$:ð ð	$:ð 
õ$:ðN DHñØðØ!)¨%°¸°Ñ*?Ñ!@ðà	ˆv�vˆ~Ñ	óð: 5:ñØðØ-1ðà	ˆv�vˆ~Ñ	óò"%ð òó ðð& ò	ó ô	r4   c            	       ón   ‡ — e Zd ZdZ	 	 	 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.
    Nr	   r
   r   r   c                 óT   •— ||dœ}t         ‰| �  «        t        ||fd|i|¤Ž| _        y ©Nr   r   )r   r   r   ra   r/   s          €r3   r   z_LSTMSingleLayer.__init__¤   s2   ø€ ð %+°UÑ;ˆÜ‰ÑÔÜ˜Y¨
ÑP¸ÐPÀÑPˆ�	r4   r5   r6   c                 óÊ   — g }|j                   d   }t        |«      D ]+  }| j                  ||   |«      }|j                  |d   «       Œ- t	        j
                  |d«      }||fS )Nr   )r:   Úrangera   Úappendr   Ústack)r0   r5   r6   ÚresultÚseq_lenÚiÚresult_tensors          r3   rF   z_LSTMSingleLayer.forward°   sh   € ØˆØ—'‘'˜!‘*ˆÜ�w“ò 	%ˆAØ—Y‘Y˜q ™t VÓ,ˆFØ�M‰M˜& ™)Õ$ð	%ô Ÿ™ F¨AÓ.ˆØ˜fÐ$Ð$r4   c                 óŽ   — t        j                  |i |¤Ž} | |j                  |j                  |j                  «      }||_        |S rq   )r   rb   r   r   r   ra   )r\   ÚargsÚkwargsra   Úlayers        r3   rb   z_LSTMSingleLayer.from_params¹   s?   € ä×#Ñ# TÐ4¨VÑ4ˆÙ�D—O‘O T×%5Ñ%5°t·y±yÓAˆØˆŒ
Øˆr4   rp   rq   )rs   rt   ru   rv   rw   rx   r   r   r   r   rF   ry   rb   rz   r{   s   @r3   r}   r}   �   sx   ø„ ñð ØØñ
Qàð
Qð ð
Qð ð	
Qð 
õ
Qñ%˜ð %¨°%¸À¸Ñ2GÑ)Hó %ð ñó ôr4   r}   c                   ó|   ‡ — e Zd ZdZ	 	 	 	 	 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.Nr	   r
   r   Úbatch_firstÚbidirectionalr   c                 ó²   •— ||dœ}t         ‰	| �  «        || _        || _        t	        ||fd|i|¤Ž| _        | j                  rt	        ||fd|i|¤Ž| _        y y r   )r   r   rŽ   r�   r}   Úlayer_fwÚlayer_bw)
r0   r	   r
   r   rŽ   r�   r   r   r1   r2   s
            €r3   r   z_LSTMLayer.__init__Ä   s|   ø€ ð %+°UÑ;ˆÜ‰ÑÔØ&ˆÔØ*ˆÔÜ(Ø�zñ
Ø(,ð
Ø0>ñ
ˆŒð ×ÒÜ,Ø˜:ñØ,0ðØ4BñˆD�Mð r4   r5   r6   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   r8   rr   r’   )rŽ   Ú	transposer�   r   ÚjitÚ_unwrap_optionalr‘   rg   Úflipr’   ÚcatÚdimrƒ   Ú
transpose_)r0   r5   r6   Úhx_fwÚcx_fwÚ	hidden_bwÚhx_bwÚcx_bwÚ	hidden_fwÚ	result_fwÚ
x_reversedÚ	result_bwr„   rN   rO   s                  r3   rF   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ˆ~Ðr4   c                 ó  — t        |d«      s|€J ‚|j                  d|j                  «      }|j                  d|j                  «      }|j                  d|j                  «      }|j                  d|j
                  «      }|j                  d|j                  «      }	 | |||||	«      }
t        |d|«      |
_        t        |d|› �«      }t        |d	|› �«      }t        |d
|› �d«      }t        |d|› �d«      }t        j                  ||||«      |
_        |j                  r_t        |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.
        rd   Nr   r   r   rŽ   r�   Úweight_ih_lÚweight_hh_lÚ	bias_ih_lÚ	bias_hh_lÚ_reverse)rg   Úgetr   r   r   rŽ   r�   Úgetattrrd   r}   rb   r‘   r’   )r\   rl   Ú	layer_idxrd   rŠ   r   r   r   rŽ   r�   r‹   r]   r^   r_   r`   s                  r3   ro   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 ¨T°;ÀÓNˆÜ  y°'Ó:ˆŒÜ�U˜k¨)¨Ð5Ó6ˆÜ�U˜k¨)¨Ð5Ó6ˆÜ�U˜i¨	 {Ð3°TÓ:ˆÜ�U˜i¨	 {Ð3°TÓ:ˆä)×5Ñ5°b¸"¸bÀ"ÓEˆŒà×ÒÜ˜ +¨i¨[¸Ð AÓBˆBÜ˜ +¨i¨[¸Ð AÓBˆBÜ˜ )¨I¨;°hÐ ?ÀÓFˆBÜ˜ )¨I¨;°hÐ ?ÀÓFˆBÜ-×9Ñ9¸"¸bÀ"ÀbÓIˆEŒNØˆr4   )TFFNNrq   )r   N)rs   rt   ru   rv   rw   rx   r   r   r   r   rF   ry   ro   rz   r{   s   @r3   r�   r�   Á   sŒ   ø„ Ù.ð Ø!Ø#ØØñàðð ðð ð	ð
 ðð ðð 
õñ,4˜ð 4¨°%¸À¸Ñ2GÑ)Hó 4ðl òó ôr4   r�   c                   óÊ   ‡ — e Zd ZdZej
                  j                  Z	 	 	 	 	 	 	 d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
    Nr   r   Ú
num_layersr   rŽ   Údropoutr�   r   c
           	      ó6  •— ||	dœ}
t         ‰| �  «        || _        || _        || _        || _        || _        t        |«      | _        || _	        d| _
        |rdn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}t'        d|«      D ]J  }|j)                  t%        | j                  | j                  | j
                  fd| j                  d
œ|
¤Ž«       ŒL t*        j,                  j/                  |«      | _        y )Nr   Fé   r8   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   r   r   r   r®   r   rŽ   Úfloatr¯   r�   ÚtrainingÚ
isinstanceÚnumbersÚNumberrx   Ú
ValueErrorÚwarningsÚwarnr�   r�   r‚   r   r   Ú
ModuleListÚlayers)r0   r   r   r®   r   rŽ   r¯   r�   r   r   r1   Únum_directionsr»   r‹   r2   s                 €r3   r   zLSTM.__init__N  sº  ø€ ð %+°UÑ;ˆÜ‰ÑÔØ$ˆŒØ&ˆÔØ$ˆŒØˆŒ	Ø&ˆÔÜ˜W“~ˆŒØ*ˆÔØˆŒÙ+™°ˆô ˜7¤G§N¡NÔ3Ø˜Ô$ 1Ô$ô ðóð ô ˜'¤4Ô(äðóð ð
 �QŠ;Ü�M‰Mð.ôð
 ˜QŠÜ—‘ðBàBIÀð K&Ø&0 \ð3ôô Ø—‘Ø× Ñ Ø—	‘	ðð "Ø"×0Ñ0ñð !ñð	
ˆô ˜1˜jÓ)ò 
	ˆEØ�M‰MÜØ×$Ñ$Ø×$Ñ$Ø—I‘Iðð !&Ø"&×"4Ñ"4ñð %ñõ	ð
	ô —h‘h×)Ñ)¨&Ó1ˆ�r4   r5   r6   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   r8   r±   )r   r   r   rI   éÿÿÿÿéþÿÿÿ)rŽ   r”   Úsizer�   r   rL   r   r²   r   Úsqueeze_r;   rM   r   r�   r®   r•   r–   r´   r   ÚreshapeÚsqueezeÚ	enumerater»   r‚   rƒ   r:   )r0   r5   r6   Úmax_batch_sizer¼   rL   Ú_ÚhxcxÚhidden_non_optr@   rA   ÚidxÚhx_listÚcx_listr‹   rN   rO   Ú	hx_tensorÚ	cx_tensors                      r3   rF   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ÚQuantizableLSTMrV   rW   s    r3   rX   zLSTM._get_nameÌ  s   € Ø r4   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 )Nrd   F)rŽ   T)Úinplace)r´   rf   rg   r   r   r®   r   rŽ   r¯   r�   r«   rd   r�   r�   ro   r»   r³   Útrainr   r   ÚquantizationÚprepare_qatÚevalÚprepare)r\   rl   rd   rn   rÉ   s        r3   ro   zLSTM.from_floatÏ  s+  € ä˜% ×!2Ñ!2Ô3Ð3Ð3Ü�u˜iÔ(©GÐ3Ð3ÙØ×ÑØ×ÑØ×ÑØ�J‰JØ×ÑØ�M‰MØ×Ñó
ˆô # 5¨)°WÓ=ˆÔÜ˜×)Ñ)Ó*ò 	ˆCÜ#-×#8Ñ#8Ø�s˜G°ð $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Øˆr4   c                 ó   — t        d«      ‚)NzuIt looks like you are trying to convert a non-quantizable LSTM module. Please, see the examples on quantizable LSTMs.)ÚNotImplementedError)r\   rl   s     r3   Úfrom_observedzLSTM.from_observedë  s   € ô "ð1ó
ð 	
r4   )r8   TFg        FNNrq   )rs   rt   ru   rv   r   r   r   rf   rw   rx   r²   r   r   r   r   rF   rX   ry   ro   rÙ   rz   r{   s   @r3   r   r   1  sÚ   ø„ ñð4 —H‘H—M‘M€Mð ØØ!ØØ#ØØñE2àðE2ð ðE2ð ð	E2ð
 ðE2ð ðE2ð ðE2ð ðE2ð 
õE2ñN5)˜ð 5)¨°%¸À¸Ñ2GÑ)Hó 5)òn!ð òó ðð6 ñ
ó ô
r4   )rv   rµ   r¸   Útypingr   r   r   r   Ú__all__r   ÚModuler   r}   r�   r   rV   r4   r3   ú<module>rÝ      s€   ðñó Û ß "ã Ý ð �vÐ
€ôGˆu�x‰x�‰ô GôT!�u—x‘x—‘ô !ôHm�—‘—‘ô mô`B
ˆ5�8‰8�?‰?õ B
r4   