U
    r±Ëh¬  ã                   @  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                   @  sJ   e Zd Zdddœdd„Zdddœdd	„Zdddœd
d„Zddœdd„ZdS )Ú	GRUHelperr   ÚNone)ÚparamsÚreturnc                 K  sd  d}d}d}d}d}d}d}d}	|||g}
|
D ]}||ks.t d	|› ƒ‚q.|| jd
 | _| jdkrZ|D ]"}||krjtj|| d
d||< qj|| jd }|| jd }| |d
¡}|| }|d
krÊ|nt |d
d¡}||krè|| nt d|	 | ¡}||kr|| nt ||f¡}| |d
¡}|| _|| | _	|| | _
|| _|| _|| _|| _ntƒ ‚d S )NÚXÚWÚRÚBZ	initial_hZlinear_before_resetÚlayouté   zMissing Required Input: r   é   ©Zaxiséÿÿÿÿé   )ÚAssertionErrorÚshapeÚnum_directionsÚnpZsqueezeÚgetZswapaxesÚzerosr
   r   r   r   ÚH_0ÚLBRÚLAYOUTÚNotImplementedError)Úselfr   r
   r   r   r   r   r   r   Únumber_of_gatesZrequired_inputsÚiÚkÚhidden_sizeÚ
batch_sizer   ÚxÚbZh_0Zlbr© r&   úC/tmp/pip-unpacked-wheel-xnis5xre/onnx/backend/test/case/node/gru.pyÚ__init__   sF    
ÿ
ý 

zGRUHelper.__init__z
np.ndarray)r$   r	   c                 C  s   ddt  | ¡  S )Nr   )r   Úexp©r   r$   r&   r&   r'   Úf?   s    zGRUHelper.fc                 C  s
   t  |¡S )N)r   Útanhr*   r&   r&   r'   ÚgB   s    zGRUHelper.gztuple[np.ndarray, np.ndarray]©r	   c                  C  sL  | 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 ]ä}t ||¡t ||¡ | }t |dd¡\}}|  |¡}|  |¡}|  t |t 
|¡¡t || t 
|¡¡ | | ¡}|  t |t 
|¡¡|t |t 
|¡¡|   | ¡}| jr¤|n|}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   r   Úemptyr   Úsplitr   r   r   Z	transposeÚconcatenateÚaddÚdotr+   r-   r   Úappendr   ) r   Z
seq_lengthr"   r#   Ú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'   ÚstepE   sZ     

ÿþýÿÿþÿ


zGRUHelper.stepN)Ú__name__Ú
__module__Ú__qualname__r(   r+   r-   r<   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 )Ú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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   é   çš™™™™™¹?r   r@   r
   r   r   Ú r;   ©ÚinputsÚoutputsr"   r   )r
   r   r   Ztest_gru_defaults©rK   rL   Úname©r   ÚarrayÚastypeÚfloat32ÚonnxÚhelperÚ	make_nodeÚonesr   r<   r   )ÚinputÚ
input_sizer"   Úweight_scaler   Únoder   r   ÚgruÚ_r;   r&   r&   r'   Úexport_defaultsx   s:    &   ÿÿþÿþüzGRU.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}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 )NrA   rB   rC   rD   rE   rF   ç      @ç       @ç      "@r   rH   r@   r
   r   r   r   rI   r;   rJ   r   r   ©r
   r   r   r   Ztest_gru_with_initial_biasrM   )r   rP   rQ   rR   rS   rT   rU   rV   r   r2   r   r<   r   )rW   rX   r"   rY   Zcustom_biasr   rZ   r   r   ÚW_BÚR_Br   r[   r\   r;   r&   r&   r'   Úexport_initial_bias•   sJ    $ÿ
üÿþÿþÿ
üzGRU.export_initial_biasc                  C  s2  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}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 )"NrA   rB   rC   rD   rE   rF   r^   r_   r`   g      $@g      &@g      (@g      *@g      ,@g      .@g      0@g      1@g      2@r   rG   r@   r
   r   r   r   rI   r;   rJ   r   r   ra   Ztest_gru_seq_lengthrM   )r   rP   rQ   rR   rS   rT   rU   ÚrandomZrandnr2   r   r<   r   )rW   rX   r"   r   rZ   r   r   rb   rc   r   r[   r\   r;   r&   r&   r'   Ú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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 )NrA   rB   rC   rD   rE   rF   r   r/   r   gš™™™™™É?r   r@   r
   r   r   r6   r;   )rK   rL   r"   r   )r
   r   r   r   Ztest_gru_batchwiserM   rO   )rW   rX   r"   r   rY   r   rZ   r   r   r[   r6   r;   r&   r&   r'   Úexport_batchwiseè   s>    *ûÿþÿþüzGRU.export_batchwiseN)r=   r>   r?   Ústaticmethodr]   rd   rf   rg   r&   r&   r&   r'   r@   w   s   )(r@   )Ú
__future__r   Útypingr   Znumpyr   rS   Zonnx.backend.test.case.baser   Zonnx.backend.test.case.noder   r   r@   r&   r&   r&   r'   Ú<module>   s   h