U
    qh                     @  sD   d dl mZ d dlZd dlmZ G dd deZG dd deZdS )    )annotationsN)OpRunc                   @  sl   e Zd Zdd ZdddddZdddddZdddd	d
Zdddddddddd	ddZdddZdS )
CommonLSTMc                 C  s$   t | || t|j| _d| _d S )N   )r   __init__lenoutput	n_outputsn_gatesselfZ	onnx_nodeZ
run_params r   >/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/op_lstm.pyr      s    zCommonLSTM.__init__z
np.ndarray)xreturnc                 C  s   ddt |   S )N   )npexpr   r   r   r   r   f   s    zCommonLSTM.fc                 C  s
   t |S Nr   tanhr   r   r   r   g   s    zCommonLSTM.gc                 C  s
   t |S r   r   r   r   r   r   h   s    zCommonLSTM.hintztuple[np.ndarray, np.ndarray])	XRBWH_0C_0Pnum_directionsr   c	                 C  s  |j d }	|j d }
|j d }t|	|||
g}g }t|d\}}}|}|}tj||j d ddD ]}t|t|t|t| tjt|d  }t|dd\}}}}| |||  }| |||  }| |}|| ||  }| |||  }|| 	| }|
| |}|}qdt|}|dkrV||d d dd d d d f< | jdkrl|d }n0t|ddddg}|d d d d dd d f }||fS )Nr   r   r   Zaxis      )shaper   emptysplitdotZ	transposeaddr   r   r   appendZconcatenatelayout)r   r   r   r   r   r    r!   r"   r#   Z
seq_lengthhidden_size
batch_sizeYZh_listZp_iZp_oZp_fZH_tZC_tr   Zgatesior   cCHZconcatenatedY_hr   r   r   _step   sB    







zCommonLSTM._stepNc              
   C  sP  d}d}|j d }|dkrtj|dd}tj|dd}|d k	rjt|j dkrj|j d dkrjtj|dd}|d k	rt|j dkr|j d dkrtj|dd}|d k	rt|j dkr|j d dkrtj|dd}|d k	rt|j dkr|j d dkrtj|dd}|d k	r>t|j dkr>|j d dkr>tj|dd}|j d }|j d }| jdkrlt|dd}|d krtjd| | tjd}|d krtj|| tjd}|d krtj||ftjd}|d krtj||ftjd}ntd	|d
| j	j
d| j||||||||d\}}||j}| jdkr@|fS |||jfS )Nr'   r   r   r   r%   r$   r&   )dtypezUnsupported value z! for num_directions and operator .)r#   )r(   r   Zsqueezer   r.   ZswapaxeszerosZfloat32NotImplementedError	__class____name__r8   Zastyper9   r	   )r   r   r   r   r   Zsequence_lensZ	initial_hZ	initial_cr"   Zactivation_alphaZactivation_betaZactivationsZclip	directionr/   Zinput_forgetr.   r
   Znumber_of_peepholesr#   r0   r1   r7   r   r   r   _runL   st    

$*





       
zCommonLSTM._run)NNNNNNNNNNNNN)	r>   
__module____qualname__r   r   r   r   r8   r@   r   r   r   r   r      s&   7             r   c                   @  s   e Zd Zdd ZdS )LSTMc                 C  s   t | || d S r   )r   r   r   r   r   r   r      s    zLSTM.__init__N)r>   rA   rB   r   r   r   r   r   rC      s   rC   )
__future__r   Znumpyr   Zonnx.reference.op_runr   r   rC   r   r   r   r   <module>   s
    