U
    q±Ëhu  ã                   @  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                   @  s6   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zdd
d„Zd	S )Ú	CommonGRUc                 C  s$   t  | ||¡ t|jƒ| _d| _d S )Né   )r   Ú__init__ÚlenÚoutputÚ	n_outputsÚnumber_of_gates©ÚselfZ	onnx_nodeZ
run_params© r   ú=/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/op_gru.pyr      s    zCommonGRU.__init__c                 C  s   ddt  | ¡  S )Né   )ÚnpÚexp©r   Úxr   r   r   Úf   s    zCommonGRU.fc                 C  s
   t  |¡S ©N)r   Útanhr   r   r   r   Úg   s    zCommonGRU.gc           &      C  s6  |j d }|j d }|j d }	t |||	|g¡}
g }t |d¡\}}}t |d¡\}}}t |d¡\}}}}}}t t ||f¡¡}t t ||f¡¡}t t ||f¡t ||f¡¡}|}tj||j d ddD ]ä}t ||¡t ||¡ | }t |dd¡\}}|  |¡}|  |¡}|  	t |t |¡¡t || t |¡¡ | | ¡} |  	t |t |¡¡|t |t |¡¡|   | ¡}!| j
r|!n| }"d| |" ||  }#| |#¡ |#}qÒt |¡}$|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   é   ©Zaxisé   )Úshaper   ÚemptyÚsplitZ	transposeZconcatenateÚaddÚdotr   r   Úlinear_before_resetÚappendÚlayout)&r   ÚXÚRÚBÚWÚH_0Únum_directionsZ
seq_lengthÚhidden_sizeÚ
batch_sizeÚYZh_listZw_zZw_rZw_hZr_zZr_rZr_hZw_bzZw_brZw_bhZr_bzZr_brZr_bhZgates_wZgates_rZgates_bZH_tr   ZgatesÚzÚrZ	h_defaultZh_linearÚhÚHZconcatenatedÚY_hr   r   r   Ú_step   sZ    


 

ÿþýÿÿþÿ



zCommonGRU._stepNc                 C  sP  |j d }|dkrîtj|dd}tj|dd}|d k	rDtj|dd}|d k	rZtj|dd}|d k	rptj|dd}|j d }|j d }|dkr|nt |dd¡}|d k	rª|ntjd| j | |jd}|d k	rÐ|ntj||f|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   )ÚdtypezUnsupported value z! for num_directions and operator Ú.)r)   )r   r   ZsqueezeZswapaxesÚzerosr
   r3   ÚNotImplementedErrorÚ	__class__Ú__name__r2   Zastyper	   )r   r$   r'   r%   r&   Zsequence_lensZ	initial_hZactivation_alphaZactivation_betaZactivationsZclipÚ	directionr*   r#   r!   r)   r+   ÚbZh_0r(   r,   r1   r   r   r   Ú_runH   s:    


ÿýÿýÿzCommonGRU._run)NNNNNNNNNNN)r8   Ú
__module__Ú__qualname__r   r   r   r2   r;   r   r   r   r   r      s    6           ñr   c                   @  s   e Zd Zdd„ ZdS )ÚGRUc                 C  s   t  | ||¡ d S r   )r   r   r   r   r   r   r   ƒ   s    zGRU.__init__N)r8   r<   r=   r   r   r   r   r   r>   ‚   s   r>   )Ú
__future__r   Znumpyr   Zonnx.reference.op_runr   r   r>   r   r   r   r   Ú<module>   s   w