Ë
    ÄÓ^jÒW  ã                   ó,  — d Z ddlZddl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)Ú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f   dz  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
            €ún/var/www/ramen.bs-engineer-server.com/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.   )r4   r:   r;   ÚhxÚcxr   r   r#   r&   r'   r)   Úout_gateÚgateÚkeyr+   r,   r-   ÚcyÚtanh_cyÚhys                       r8   Ú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ˆr9   Ú
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/   r0   Úquantize_per_tensorr2   r3   )	r4   rQ   r@   ÚhÚcÚh_scaleÚh_zpÚc_scaleÚc_zps	            r8   r>   zLSTMCell.initialize_hidden‘   s§   € ô �K‰K˜ T×%5Ñ%5Ð6Ó7Ü�K‰K˜ T×%5Ñ%5Ð6Ó7ð ˆñ Ø"×?Ñ?‰OˆW�dØ"×=Ñ=‰OˆW�dÜ×)Ñ)Ø˜¨T¸×9PÑ9PôˆAô ×)Ñ)Ø˜¨T¸×9NÑ9NôˆAð �!ˆtˆr9   c                  ó   — y)NÚQuantizableLSTMCell© ©r4   s    r8   Ú	_get_namezLSTMCell._get_name£   s   € Ø$r9   c                 óÈ  — |du |du k7  rt        d«      ‚|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
        Nz/bi and bh must both be None or both have valuesr=   )r	   r
   r   r   r   r   )Údim)ÚAssertionErrorr?   r   r   Ú	Parameterr   Úweightr   r   rC   rB   rE   )ÚclsÚwiÚwhÚbiÚbhr   r   r   r   ÚwÚbr#   Úw_chunkrK   Úb_chunks                  r8   Úfrom_paramsz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ò @‘��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Ó$?˜�	ñ@ð@ð ˆr9   c                 óx  — t        |«      | j                  ur$t        d| j                  › dt        |«      › �«      ‚t        |d«      st        d«      ‚| j	                  |j
                  |j                  |j                  |j                  |¬«      }|j                  |_	        |j                  |j                  _	        |j                  |j                  _	        |r`|j                  j                  «       D ]  }|j                  |_	        Œ |j                  j                  «       D ]  }|j                  |_	        Œ |S )NúExpected module type ú, got Úqconfigz$The float module must have 'qconfig'r   )ÚtypeÚ_FLOAT_MODULEre   Úhasattrrq   Ú	weight_ihÚ	weight_hhÚbias_ihÚbias_hhru   r   r   rE   )rh   ÚotherÚuse_precomputed_fake_quantr   Úobservedr6   s         r8   Ú
from_floatz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�•	ð*àˆr9   ©TNN©N)F)NNF)FF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   rw   Ú__constants__ÚintÚboolr   r   ÚtuplerP   r>   rb   Úclassmethodrq   r€   Ú__classcell__©r7   s   @r8   r   r      sö   ø„ ñð, —H‘H×%Ñ%€MØ"�O€Mð ØØð8:ð ò8:àð8:ð ð8:ð ð	8:ð 
õ8:ðv AEñ)Øð)Ø!& v¨v ~Ñ!6¸Ñ!=ð)à	ˆv�vˆ~Ñ	ó)ðX 5:ñØðØ-1ðà	ˆv�vˆ~Ñ	óò$%ð ò#ó ð#ðJ òó ôr9   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f   dz  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   )	r4   r	   r
   r   r   r   r   r5   r7   s	           €r8   r   z_LSTMSingleLayer.__init__î   s=   ø€ ð %+°UÑ;ˆÜ‰ÑÔÜØ�zð
Ø(,¸+ñ
ØIWñ
ˆ�	r9   r:   r;   c                 óÊ   — g }|j                   d   }t        |«      D ]+  }| j                  ||   |«      }|j                  |d   «       Œ- t	        j
                  |d«      }||fS )Nr   )r?   Úranger   Úappendr   Ústack)r4   r:   r;   ÚresultÚseq_lenÚiÚresult_tensors          r8   rP   z_LSTMSingleLayer.forwardþ   sh   € ØˆØ—'‘'˜!‘*ˆÜ�w“ò 	%ˆAØ—Y‘Y˜q ™t VÓ,ˆFØ�M‰M˜& ™)Õ$ð	%ô Ÿ™ F¨AÓ.ˆØ˜fÐ$Ð$r9   c                 ó¦   — t        j                  |i |¤Ž} | |j                  |j                  |j                  |j
                  ¬«      }||_        |S )Nr   )r   rq   r   r   r   r   r   )rh   ÚargsÚkwargsr   Úlayers        r8   rq   z_LSTMSingleLayer.from_params  sL   € ä×#Ñ# TÐ4¨VÑ4ˆÙØ�O‰O˜T×-Ñ-¨t¯y©yÀd×FVÑFVô
ˆð ˆŒ
Øˆr9   r�   r‚   )rƒ   r„   r…   r†   rˆ   r‰   r   r   rŠ   rP   r‹   rq   rŒ   r�   s   @r8   r�   r�   ç   s}   ø„ ñð ØØð
ð ò
àð
ð ð
ð ð	
ð 
õ
ñ %˜ð %¨¨v°v¨~Ñ)>ÀÑ)Eó %ð ñó ôr9   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f   dz  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)r4   r	   r
   r   r    r¡   r   r   r   r5   r7   s             €r8   r   z_LSTMLayer.__init__  s†   ø€ ð %+°UÑ;ˆÜ‰ÑÔØ&ˆÔØ*ˆÔÜ(Ø�zð
Ø(,¸+ñ
ØIWñ
ˆŒð ×ÒÜ,ØØðð Ø'ñ	ð
 !ñˆD�Mð r9   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£   rx   Úflipr¤   Úcatrd   r•   Ú
transpose_)r4   r:   r;   Úhx_fwÚcx_fwÚ	hidden_bwÚhx_bwÚcx_bwÚ	hidden_fwÚ	result_fwÚ
x_reversedÚ	result_bwr–   rX   rY   s                  r8   rP   z_LSTMLayer.forward0  s  € Ø×ÒØ—‘˜A˜qÓ!ˆAØˆ>Ø'‰LˆE‘5à!‰LˆE�5Ø26ˆ	Ø×ÒØˆ}Ø‘à˜a™�Ø˜a™�Øˆ}Ø‘à˜a™�Ø˜a™�ØÐ  UÐ%6Ø! 5˜L�	Øˆ=˜U˜]Ø‰Iô —	‘	×*Ñ*¨5Ó1Ü—	‘	×*Ñ*¨5Ó1ðˆ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ˆ~Ðr9   c                 óH  — t        |d«      s|€t        d«      ‚|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.
        ru   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)rx   re   Úgetr   r   r   r    r¡   Úgetattrru   r�   rq   r£   r¤   )rh   r}   Ú	layer_idxru   rœ   r   r   r   r    r¡   r   r�   ri   rj   rk   rl   s                   r8   r€   z_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Ø�B˜˜B¨Kð :ó ˆEŒNð ˆr9   )TFFNNr‚   )r   N)rƒ   r„   r…   r†   rˆ   r‰   r   r   rŠ   rP   r‹   r€   rŒ   r�   s   @r8   rŸ   rŸ     s–   ø„ Ù.ð Ø!Ø#ØØðð òàðð ðð ð	ð
 ðð ðð 
õñ85˜ð 5¨¨v°v¨~Ñ)>ÀÑ)Eó 5ðn ò0ó ô0r9   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f   dz  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  r9t!        j"                  dd¬«       |dk(  rt!        j"                  d	|› 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.é   )Ú
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   ó’   •K  — | ]>  }t        ‰j                  ‰j                  ‰j                  fd ‰j                  ‰dœ‰¤Ž–— Œ@ y­w)FrÅ   N)rŸ   r   r   r¡   )Ú.0Ú_r5   r4   r   s     €€€r8   ú	<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)r4   r   r   rÀ   r   r    rÁ   r¡   r   r   r   rÔ   r5   r7   s   `         ` @€r8   r   zLSTM.__init__¹  s€  û€ ð %+°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ˆ�r9   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   r   rS   éÿÿÿÿéþÿÿÿ)r    r¦   Úsizer¡   r   rV   r   rÊ   r   Úsqueeze_r@   rW   r   r“   rÀ   r§   r¨   rÌ   r   ÚreshapeÚsqueezeÚ	enumeraterÔ   r”   r•   r?   )r4   r:   r;   Úmax_batch_sizeÚnum_directionsrV   rÈ   ÚhxcxÚhidden_non_optrH   rI   ÚidxÚhx_listÚcx_listr�   rX   rY   Ú	hx_tensorÚ	cx_tensors                      r8   rP   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ÚQuantizableLSTMr`   ra   s    r8   rb   zLSTM._get_name=  s   € Ø r9   c           
      ó  — t        || j                  «      s$t        d| j                  › dt        |«      › �«      ‚t	        |d«      s|st        d«      ‚ | |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 |j1                  «        t(        j*                  j,                  j3                  |d¬	«      }|S )
Nrs   rt   ru   r¶   r   F)r    r   T)Úinplace)rÌ   rw   re   rv   rx   r   r   rÀ   r   r    rÁ   r¡   r½   ru   r“   rŸ   r€   rÔ   rË   Útrainr   r    ÚquantizationÚprepare_qatÚevalÚprepare)rh   r}   ru   r   r   rá   s         r8   r€   zLSTM.from_float@  sZ  € ä˜% ×!2Ñ!2Ô3Ü Ø'¨×(9Ñ(9Ð':¸&ÄÀeÃÀÐNóð ô �u˜iÔ(±Ü Ð!VÓWÐWÙØ×ÑØ×ÑØ×ÑØ�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Øˆr9   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     r8   Úfrom_observedzLSTM.from_observedb  s   € ô "ð1ó
ð 	
r9   )r=   TFg        FNNr‚   )NF)rƒ   r„   r…   r†   r   r   r   rw   rˆ   r‰   rÊ   r   r   rŠ   rP   rb   r‹   r€   rñ   rŒ   r�   s   @r8   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ñZ5)˜ð 5)¨¨v°v¨~Ñ)>ÀÑ)Eó 5)òn!ð òó ððB ñ
ó ô
r9   )r†   rÍ   rÐ   r   r   Ú__all__r   ÚModuler   r�   rŸ   r   r`   r9   r8   ú<module>rô      s}   ðñó Û ã Ý ð �vÐ
€ôRˆu�x‰x�‰ô Rôj'�u—x‘x—‘ô 'ôTG�—‘—‘ô GôTO
ˆ5�8‰8�?‰?õ O
r9   