o
    –h<  ã                   @   sî   d dl Z d dlmZ d dlm  mZ d dlmZmZm	Z	m
Z
 d dlmZ G dd„ dejjjƒZG dd„ dejƒZedkrud	Zd
ZerEdndZed	ddd
dZe  edd	¡Ze  de dd¡Ze  de dd¡ZeeeefƒZeeƒ dS dS )é    N)Úpad_packed_sequenceÚpack_padded_sequenceÚpack_sequenceÚPackedSequence)Ú
PackedLSTMc                       s,   e Zd ZdZd‡ fdd„	Zd	dd„Z‡  ZS )
Ú	HLSTMCellz‰
    A Highway LSTM Cell as proposed in Zhang et al. (2018) Highway Long Short-Term Memory RNNs for 
    Distant Speech Recognition.
    Tc                    s   t t| ƒ ¡  || _|| _tj|| ||d| _tj|| ||d| _tj|| ||d| _	tj|| ||d| _
tj|d|  ||d| _d S )N)Úbiasé   )Úsuperr   Ú__init__Ú
input_sizeÚhidden_sizeÚnnÚLinearÚWiÚWfÚWoÚWgÚgate)Úselfr   r   r   ©Ú	__class__© úU/var/www/html/env_mimamsha/lib/python3.10/site-packages/stanza/models/common/hlstm.pyr      s   zHLSTMCell.__init__Nc              	   C   s,  |   |¡ |d u r|j| d¡| jdd}||f}|d u r)|j| d¡| jdd}|  ||d d¡ |  ||d d¡ |  ||d¡ t ||d gd¡}t |  	|¡¡}t |  
|¡¡}t |  |¡¡}t |  |¡¡}t |  t ||d |gd¡¡¡}	|	| ||d   ||  }
|t |
¡ }||
fS )Nr   F)Úrequires_gradz[0]é   z[1]Úc_l_minus_one)Úcheck_forward_inputÚ	new_zerosÚsizer   Úcheck_forward_hiddenÚtorchÚcatÚFÚsigmoidr   r   r   Útanhr   r   )r   Úinputr   ÚhxÚ	rec_inputÚiÚfÚoÚgr   ÚcÚhr   r   r   Úforward   s$   
"zHLSTMCell.forward)T)NN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r/   Ú__classcell__r   r   r   r   r      s    r   c                       s0   e Zd ZdZ		d‡ fdd„	Zdd	d
„Z‡  ZS )ÚHighwayLSTMz
    A Highway LSTM network, as used in the original Tensorflow version of the Dozat parser. Note that this
    is independent from the HLSTMCell above.
    r   TFr   Nc                    s  t t| ƒ ¡  || _|| _|| _|| _|| _|| _i | _	|| _
|r#dnd| _|	| _|
| _t ¡ | _t ¡ | _t ¡ | _tj|dd| _|}t|ƒD ]C}| j t||d||d||d¡ | j t ||| j ¡¡ | j t ||| j ¡¡ | jd jj ¡  | jd jj ¡  || j }qId S )Nr	   r   T)Úinplacer   )Ú
num_layersr   Úbatch_firstÚdropoutÚbidirectionalÚrec_dropoutéÿÿÿÿ)r
   r6   r   r   r   r8   r   r9   r:   Údropout_stater;   Únum_directionsÚhighway_funcÚpadr   Ú
ModuleListÚlstmÚhighwayr   ÚDropoutÚdropÚrangeÚappendr   r   ÚdataÚzero_)r   r   r   r8   r   r9   r:   r;   r<   r@   rA   Úin_sizeÚlr   r   r   r   <   s6   


ÿùzHighwayLSTM.__init__c                 C   s\  | j d u r	dd„ n| j }g }g }t|tƒst||| jd}t| jƒD ]q}|dkr6t|  |j¡|j	|j
|jƒ}|d urZ|d || j |d | j … |d || j |d | j … fnd }| j| |||ƒ\}	\}
}| |
¡ | |¡ t|	jt | j| |jƒ¡|| j| |jƒƒ  |j	|j
|jƒ}q"| jr t|| jdd }|t |d¡t |d¡ffS )Nc                 S   s   | S ©Nr   )Úxr   r   r   Ú<lambda>\   s    z%HighwayLSTM.forward.<locals>.<lambda>)r9   r   r   )r@   Ú
isinstancer   r   r9   rG   r8   rF   rI   Úbatch_sizesÚsorted_indicesÚunsorted_indicesr?   rC   rH   r!   r$   r   rD   rA   r   r"   )r   r&   Úseqlensr'   r@   ÚhsÚcsrL   Úlayer_hxr.   ÚhtÚctr   r   r   r/   [   s    
L

BzHighwayLSTM.forward)r   TFr   Fr   NFrM   r0   r   r   r   r   r6   7   s    þr6   Ú__main__é
   Tr	   r   é   )r8   r;   é   )r!   Útorch.nnr   Útorch.nn.functionalÚ
functionalr#   Útorch.nn.utils.rnnr   r   r   r   Ú stanza.models.common.packed_lstmr   ÚmodulesÚrnnÚRNNCellBaser   ÚModuler6   r1   ÚTÚbidirÚnum_dirÚrandnr&   r'   ÚcxÚoutputÚprintr   r   r   r   Ú<module>   s$    /<÷