U
    qh                     @  sT   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G dd	 d	eZdS )
    )annotationsN)OpRunc                
   @  s6   e Zd Zdd Zdd Zdd Zdd Zdd
dZd	S )	CommonRNNc                 C  sx  t | || | jdkr d| _n$| jdkr2d| _ntd| jd| jd k	rpt| j| jkrptd| j d| jd k	rt| j| jkrtd| j d| | j	d	 | jd k	rt| jd	kr| jd	 nd | jd k	rt| jd	kr| jd	 nd | _
t| j	dkrh| | j	d | jd k	r8t| jdkr8| jd nd | jd k	r`t| jdkr`| jd nd | _t|j| _d S )
N)Zforwardreverse   bidirectional   zUnknown direction .z;activation_alpha must have the same size as num_directions=z:activation_beta must have the same size as num_directions=r   )r   __init__	directionnum_directionsRuntimeErroractivation_alphalenactivation_beta
choose_actactivationsf1f2output	n_outputs)selfZ	onnx_nodeZ
run_params r   =/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/op_rnn.pyr
      s`    

zCommonRNN.__init__c                   s8   |dkr| j S |dkr$ fddS td|dd S )N)ZTanhtanh)ZAffineZaffinec                   s   |    S Nr   )xalphabetar   r   <lambda>H       z&CommonRNN.choose_act.<locals>.<lambda>zUnknown activation function r	   )_f_tanhr   )r   namer   r   r   r   r   r   D   s
    zCommonRNN.choose_actc                 C  s
   t |S r   )npr   )r   r   r   r   r   r"   K   s    zCommonRNN._f_tanhc              
   C  s   g }|}t j||jd ddD ]N}| t |t |t |t | t jt |d  }	||	 |	}qt |}
| j	dkrt 
|
d}||d fS )Nr   Zaxisr   r   )r$   splitshaper   dot	transposeaddappendZconcatenater   Zexpand_dims)r   XRBWH_0Zh_listZH_tr   HZconcatenatedr   r   r   r   _stepN   s     


zCommonRNN._stepNc                 C  s~  |j d | _| jdkrtj|dd}tj|dd}|d k	rHtj|dd}|d k	r^tj|dd}|d k	rttj|dd}|j d }|j d }|dkr|nt|dd}|d k	r|ntjd| |jd}|d k	r|ntj||f|jd}|}|}ntd| j d| jj	d	| 
|||||\}}|dkrXt|dddd
g}|d d d d dd d f }||j}| jdkrv|fS ||fS )Nr   r   r%   r&   r   )dtypezUnsupported value z! for num_directions and operator r	      )r(   r   r$   ZsqueezeZswapaxeszerosr4   NotImplementedError	__class____name__r3   r*   Zastyper   )r   r-   r0   r.   r/   Zsequence_lensZ	initial_hr   r   r   Zclipr   Zhidden_sizeZlayoutZ
batch_sizebZh_0r1   YZY_hr   r   r   _run^   s:    


 
zCommonRNN._run)
NNNNNNNNNN)r9   
__module____qualname__r
   r   r"   r3   r<   r   r   r   r   r      s   8          r   c                   @  s   e Zd ZdS )RNN_7Nr9   r=   r>   r   r   r   r   r?      s   r?   c                   @  s   e Zd ZdS )RNN_14Nr@   r   r   r   r   rA      s   rA   )	
__future__r   Znumpyr$   Zonnx.reference.op_runr   r   r?   rA   r   r   r   r   <module>   s    