U
    rh                     @  sb   d dl mZ d dlmZ d dlZd dlZd dlmZ d dl	m
Z
 G dd dZG dd	 d	eZdS )
    )annotations)AnyN)Base)expectc                   @  s:   e Zd ZdddddZddddd	Zd
dddZdS )	RNNHelperr   None)paramsreturnc                 K  sV  d}d}d}d}d}d}|||g}|D ]}	|	|ks&t d|	 q&|t| jd | _| jd	krL|D ]"}
|
|krftj||
 dd
||
< qf|| jd }|| jd	 }||d}|| }|dkr|nt|dd	}||kr|| ntjd| tj	d}||kr
|| ntj||ftj	d}|| _
|| | _|| | _|| _|| _|| _nt d S )NXWRBZ	initial_hlayoutzMissing Required Input: r      Zaxis   )Zdtype)AssertionErrorstrshapenum_directionsnpZsqueezegetZswapaxeszerosfloat32r
   r   r   r   H_0LAYOUTNotImplementedError)selfr   r
   r   r   r   r   r   Zrequired_inputsikhidden_size
batch_sizer   xbZh_0 r%   C/tmp/pip-unpacked-wheel-xnis5xre/onnx/backend/test/case/node/rnn.py__init__   sD    



zRNNHelper.__init__z
np.ndarray)r#   r	   c                 C  s
   t |S )N)r   tanh)r   r#   r%   r%   r&   f?   s    zRNNHelper.fztuple[np.ndarray, np.ndarray]r	   c              
   C  s.  | j jd }| jjd }| j jd }t|| j||g}g }| j}tj| j | j jd ddD ]T}| t|t	| j
t|t	| j tjt| jd  }|| |}q\t|}	| jdkr|	|d d dd d d d f< | jdkr|d }
n0t	|ddddg}|d d d d dd d f }
||
fS )Nr   r   r   r   r      )r
   r   r   r   emptyr   splitr)   dotZ	transposer   r   addr   appendconcatenater   )r   Z
seq_lengthr!   r"   YZh_listZH_tr#   HZconcatenatedY_hr%   r%   r&   stepB   s0    




zRNNHelper.stepN)__name__
__module____qualname__r'   r)   r5   r%   r%   r%   r&   r      s   /r   c                   @  sT   e Zd ZeddddZeddddZeddddZeddd	d
ZdS )RNNr   r*   c            
      C  s   t ddgddgddgggt j} d}d}d	}tjjd
dddgddg|d}|t d||ft j }|t d||ft j }t| ||d}|	 \}}	t
|| ||g|	t jgdd d S )N      ?       @      @      @      @      @r      皙?r9   r
   r   r    r4   inputsoutputsr!   r   )r
   r   r   Ztest_simple_rnn_defaultsrD   rE   namer   arrayastyper   onnxhelper	make_nodeonesr   r5   r   )
input
input_sizer!   weight_scalenoder   r   rnn_r4   r%   r%   r&   export_defaultsb   s(    &   zRNN.export_defaultsc                  C  s  t dddgdddgddd	gggt j} d
}d}d}d}tjjdddddgddg|d}|t d||ft j }|t d||ft j }|t d|ft j }t d|ft j}	t j	||	fdd}
t
| |||
d}| \}}t|| |||
g|t jgdd d S )Nr:   r;   r<   r=   r>   r?         @       @      "@r+      rA   r9   r
   r   r   r   rB   r4   rC   r   r   r
   r   r   r   Z!test_simple_rnn_with_initial_biasrF   )r   rI   rJ   r   rK   rL   rM   rN   r   r1   r   r5   r   )rO   rP   r!   Zcustom_biasrQ   rR   r   r   W_BR_Br   rS   rT   r4   r%   r%   r&   export_initial_biasz   s4    $

zRNN.export_initial_biasc                  C  s  t dddgdddgddd	ggd
ddgdddgdddgggt j} d}d}tjjdddddgddg|d}t jd||t j}t jd||t j}t jd|t j}t jd|t j}t j	||fdd}t
| |||d}	|	 \}
}t|| |||g|t jgd d! d S )"Nr:   r;   r<   r=   r>   r?   rV   rW   rX   g      $@g      &@g      (@g      *@g      ,@g      .@g      0@g      1@g      2@r+   rY   r9   r
   r   r   r   rB   r4   rC   r   r   rZ   Ztest_rnn_seq_lengthrF   )r   rI   rJ   r   rK   rL   rM   randomZrandnr1   r   r5   r   )rO   rP   r!   rR   r   r   r[   r\   r   rS   rT   r4   r%   r%   r&   export_seq_length   s8    

zRNN.export_seq_lengthc                  C  s   t ddggddggddgggt j} d}d}d	}d
}tjjddddgddg||d}|t d
||ft j }|t d
||ft j }t| |||d}|	 \}	}
t
|| ||g|	t j|
t jgdd d S )Nr:   r;   r<   r=   r>   r?   r   r@   g      ?r   r9   r
   r   r   r2   r4   )rD   rE   r!   r   )r
   r   r   r   Ztest_simple_rnn_batchwiserF   rH   )rO   rP   r!   rQ   r   rR   r   r   rS   r2   r4   r%   r%   r&   export_batchwise   s,    *zRNN.export_batchwiseN)r6   r7   r8   staticmethodrU   r]   r_   r`   r%   r%   r%   r&   r9   a   s   "#r9   )
__future__r   typingr   Znumpyr   rK   Zonnx.backend.test.case.baser   Zonnx.backend.test.case.noder   r   r9   r%   r%   r%   r&   <module>   s   R