o
    so™iO   ã                   @  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„Zdd	d
„Zddd„Zddd„Zddd„ZdS )Ú
LSTMHelperÚparamsr   ÚreturnÚNonec                 K  s¸  d}d}d}d}d}d}d}d}	d	}
d
}|||g}|D ]}||v s(J d|› ƒ‚q|| j d | _| jdkrÙ| ¡ D ]\}}||krKtj|dd||< q:|| j d }|| j d }| |	d¡}|| }|dkrj|nt |dd¡}||v ry|| ntjd|
 | tjd}||v r|| n	tj|| tjd}||v rŸ|| n	tj||ftjd}||v r±|| n	tj||ftjd}|| _	|| | _
|| | _|| _|| _|| _|| _|| _d S tƒ ‚)NÚXÚWÚRÚBÚ	initial_hÚ	initial_cÚPÚlayouté   é   zMissing Required Input: r   é   ©Úaxiséÿÿÿÿé   )Údtype)ÚshapeÚnum_directionsÚitemsÚnpÚsqueezeÚgetÚswapaxesÚzerosÚfloat32r
   r   r   r   r   ÚH_0ÚC_0ÚLAYOUTÚNotImplementedError)Úselfr   r
   r   r   r   r#   r$   r   r%   Únumber_of_gatesÚnumber_of_peepholesÚrequired_inputsÚiÚkÚvÚhidden_sizeÚ
batch_sizer   ÚxÚbÚpÚh_0Úc_0© r5   úT/home/ubuntu/.local/lib/python3.10/site-packages/onnx/backend/test/case/node/lstm.pyÚ__init__   sb   

€ÿýÿýÿýÿý


zLSTMHelper.__init__r0   ú
np.ndarrayc                 C  s   ddt  | ¡  S )Nr   )r   Úexp©r'   r0   r5   r5   r6   ÚfO   s   zLSTMHelper.fc                 C  ó
   t  |¡S ©N©r   Útanhr:   r5   r5   r6   ÚgR   ó   
zLSTMHelper.gc                 C  r<   r=   r>   r:   r5   r5   r6   ÚhU   rA   zLSTMHelper.hútuple[np.ndarray, np.ndarray]c                 C  s¼  | j jd }| jjd }| j jd }t || j||g¡}g }t | jd¡\}}}| j}	| j}
tj| j | j jd ddD ]c}t 	|t 
| j¡¡t 	|	t 
| j¡¡ tjt | jd¡Ž  }t |dd¡\}}}}|  |||
  ¡}|  |||
  ¡}|  |¡}||
 ||  }|  |||  ¡}||  |¡ }| |¡ |}	|}
q;t |¡}| 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#   r   Úemptyr   Úsplitr   r$   ÚdotÚ	transposer   r   Úaddr   r;   r@   rB   ÚappendÚconcatenater%   )r'   Ú
seq_lengthr.   r/   ÚYÚh_listÚp_iÚp_oÚp_fÚH_tÚC_tr0   Úgatesr+   Úor;   ÚcÚCÚHÚconcatenatedÚY_hr5   r5   r6   ÚstepX   sD   ÿþÿ




ýzLSTMHelper.stepN)r   r   r   r	   )r0   r8   r   r8   )r   rC   )Ú__name__Ú
__module__Ú__qualname__r7   r;   r@   rB   rZ   r5   r5   r5   r6   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 )ÚLSTMr   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   çš™™™™™¹?r   r^   ©r
   r   r   Ú rY   ©ÚinputsÚoutputsr.   r   Útest_lstm_defaults©ri   rj   Úname©r   ÚarrayÚastyper"   ÚonnxÚhelperÚ	make_nodeÚonesr   rZ   r   )ÚinputÚ
input_sizer.   Úweight_scaler(   Únoder   r   ÚlstmÚ_rY   r5   r5   r6   Úexport_defaults‚   s4   &ÿÿþÿþ
üzLSTM.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  	|	|
fd¡}t
| |||d}| ¡ \}}t|| |||g| t j¡gdd d S )N)r_   r`   ra   )rb   rc   rd   )ç      @ç       @g      "@r   r   re   r^   )r
   r   r   r   rg   rY   rh   r   Útest_lstm_with_initial_biasrl   )r   ro   rp   r"   rq   rr   rs   rt   r!   rJ   r   rZ   r   )ru   rv   r.   rw   Úcustom_biasr(   rx   r   r   ÚW_BÚR_Br   ry   rz   rY   r5   r5   r6   Úexport_initial_biasŸ   sJ   ÿüÿþÿþÿ

üzLSTM.export_initial_biasc               
   C  sx  t  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d| | f¡ t j¡}	t  	| j
d | j
d ¡ t j¡}
t  d| j
d |f¡ t j¡}t  d| j
d |f¡ t j¡}|t  d|| f¡ t j¡ }t| |||	|||d}| ¡ \}}t|| |||	|
|||g| t j¡gdd d S )N)r_   r`   ra   rb   )rc   rd   r|   r}   r   r   re   r^   )r
   r   r   r   Úsequence_lensr   r   r   rg   rY   rh   r   r   r   )r
   r   r   r   r   r   r   Útest_lstm_with_peepholesrl   )r   ro   rp   r"   rq   rr   rs   rt   r!   Úrepeatr   Úint32r   rZ   r   )ru   rv   r.   rw   r(   r)   rx   r   r   r   Úseq_lensÚinit_hÚinit_cr   ry   rz   rY   r5   r5   r6   Úexport_peepholesÉ   sR   ÿüÿþÿþ ÿÿ
üzLSTM.export_peepholesc                  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 )Nr_   r`   ra   rb   rc   rd   r   é   g333333Ó?r   r   r^   rf   rL   rY   )ri   rj   r.   r   )r
   r   r   r   Útest_lstm_batchwiserl   rn   )ru   rv   r.   rw   r(   r   rx   r   r   ry   rL   rY   r5   r5   r6   Úexport_batchwiseö   s>   *ûÿþÿþ
üzLSTM.export_batchwiseN)r   r	   )r[   r\   r]   Ústaticmethodr{   r‚   rŠ   r   r5   r5   r5   r6   r^      s    ),r^   )Ú
__future__r   Útypingr   Únumpyr   rq   Úonnx.backend.test.case.baser   Úonnx.backend.test.case.noder   r   r^   r5   r5   r5   r6   Ú<module>   s   r