o
    so™i¯  ã                   @  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                   @  s4   e Zd Zddd„Zdd	d
„Zddd„Zddd„ZdS )Ú	GRUHelperÚparamsr   ÚreturnÚNonec                 K  sb  d}d}d}d}d}d}d}d}	|||g}
|
D ]}||v s$J d	|› ƒ‚q|| j d
 | _| jdkr®| ¡ D ]\}}||krGtj|d
d||< q6|| j d }|| j d }| |d
¡}|| }|d
krf|nt |d
d¡}||v ru|| nt d|	 | ¡}||v r†|| nt ||f¡}| |d
¡}|| _|| | _	|| | _
|| _|| _|| _|| _d S tƒ ‚)NÚXÚWÚRÚBÚ	initial_hÚlinear_before_resetÚlayouté   zMissing Required Input: r   é   ©Úaxiséÿÿÿÿé   )ÚshapeÚnum_directionsÚitemsÚnpÚsqueezeÚgetÚswapaxesÚzerosr
   r   r   r   ÚH_0ÚLBRÚLAYOUTÚNotImplementedError)Úselfr   r
   r   r   r   r   r    r!   Únumber_of_gatesÚrequired_inputsÚiÚkÚvÚhidden_sizeÚ
batch_sizer   ÚxÚbÚh_0Úlbr© r/   úS/home/ubuntu/.local/lib/python3.10/site-packages/onnx/backend/test/case/node/gru.pyÚ__init__   sH   

€ÿý


zGRUHelper.__init__r+   ú
np.ndarrayc                 C  s   ddt  | ¡  S )Nr   )r   Úexp©r#   r+   r/   r/   r0   Úf?   s   zGRUHelper.fc                 C  s
   t  |¡S )N)r   Útanhr4   r/   r/   r0   ÚgB   s   
zGRUHelper.gútuple[np.ndarray, np.ndarray]c                  C  sJ  | j jd }| jjd }| j jd }t || j||g¡}g }t | jd¡\}}}t | jd¡\}	}
}t | j	d¡\}}}}}}t 
t ||f¡¡}t 
t |	|
f¡¡}t t ||f¡t ||f¡¡}| j}tj| j | j jd ddD ]q}t ||¡t ||¡ | }t |dd¡\}}|  |¡}|  |¡}|  t |t 
|¡¡t || t 
|¡¡ | | ¡}|  t |t 
|¡¡|t |t 
|¡¡|   | ¡}| jrÑ|n|}d| | ||  }| |¡ |}qst |¡}| jdkrý||d d …dd d …d d …f< | jdkr|d }||fS t 
|g d¢¡}|d d …d d …dd d …f }||fS )	Nr   r   r   r   é   r   r   )r   r   r   r   )r
   r   r   r   Úemptyr   Úsplitr   r   r   Ú	transposeÚconcatenateÚaddÚdotr5   r7   r    Úappendr!   ) r#   Ú
seq_lengthr)   r*   ÚYÚh_listÚw_zÚw_rÚw_hÚr_zÚr_rÚr_hÚw_bzÚw_brÚw_bhÚr_bzÚr_brÚr_bhÚgates_wÚgates_rÚgates_bÚH_tr+   ÚgatesÚzÚrÚ	h_defaultÚh_linearÚhÚHÚconcatenatedÚY_hr/   r/   r0   ÚstepE   s\    

ÿþýÿÿþÿ


ýzGRUHelper.stepN)r   r   r   r	   )r+   r2   r   r2   )r   r8   )Ú__name__Ú
__module__Ú__qualname__r1   r5   r7   r]   r/   r/   r/   r0   r      s
    

/
r   c                   @  sD   e Zd Zeddd„ƒZeddd„ƒZeddd„ƒZedd	d
„ƒZdS )ÚGRUr   r	   c                  C  sÐ   t  ddgddgddggg¡ t j¡} d}d}d	}d
}tjjdg d¢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   é   çš™™™™™¹?r   ra   ©r
   r   r   Ú r\   ©ÚinputsÚoutputsr)   r   Útest_gru_defaults©rm   rn   Úname©r   ÚarrayÚastypeÚfloat32ÚonnxÚhelperÚ	make_nodeÚonesr   r]   r   )ÚinputÚ
input_sizer)   Úweight_scaler$   Únoder   r   ÚgruÚ_r\   r/   r/   r0   Úexport_defaultsx   s4   &ÿÿþÿþ
üzGRU.export_defaultsc                  C  s"  t  g d¢g d¢g d¢gg¡ t j¡} d}d}d}d}d}tjjdg d¢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 )N©rb   rc   rd   ©re   rf   rg   ©g      @g       @g      "@r   ri   ra   ©r
   r   r   r   rk   r\   rl   r   r   Útest_gru_with_initial_biasrp   )r   rs   rt   ru   rv   rw   rx   ry   r   r=   r   r]   r   )rz   r{   r)   r|   Úcustom_biasr$   r}   r   r   ÚW_BÚR_Br   r~   r   r\   r/   r/   r0   Úexport_initial_bias•   sJ   ÿüÿþÿþÿ

üzGRU.export_initial_biasc                  C  s"  t  g d¢g d¢g d¢gg d¢g d¢g d¢gg¡ t j¡} d}d}d}tjjd	g d
¢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ƒ   )g      $@g      &@g      (@)g      *@g      ,@g      .@)g      0@g      1@g      2@r   rh   ra   r„   rk   r\   rl   r   r   Útest_gru_seq_lengthrp   )r   rs   rt   ru   rv   rw   rx   ÚrandomÚrandnr=   r   r]   r   )rz   r{   r)   r$   r}   r   r   r‡   rˆ   r   r~   r   r\   r/   r/   r0   Úexport_seq_length¿   sB   þÿûüÿÿ

üzGRU.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
}d}tjjdg d¢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 )Nrb   rc   rd   re   rf   rg   r   r9   r   gš™™™™™É?r   ra   rj   rB   r\   )rm   rn   r)   r   )r
   r   r   r   Útest_gru_batchwiserp   rr   )rz   r{   r)   r$   r|   r   r}   r   r   r~   rB   r\   r/   r/   r0   Úexport_batchwiseè   s>   *ûÿþÿþ
üzGRU.export_batchwiseN)r   r	   )r^   r_   r`   Ústaticmethodr€   r‰   r   r   r/   r/   r/   r0   ra   w   s    )(ra   )Ú
__future__r   Útypingr   Únumpyr   rv   Úonnx.backend.test.case.baser   Úonnx.backend.test.case.noder   r   ra   r/   r/   r/   r0   Ú<module>   s   h