U
    rhL                      @  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                   @  sZ   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dZddddZdS )
LSTMHelperr   None)paramsreturnc                 K  s  d}d}d}d}d}d}d}d}	d	}
d
}|||g}|D ]}||ks6t d| q6|| jd | _| jdkr|D ]"}||krrtj|| dd||< qr|| 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|| tjd}||kr@|| ntj||ftjd}||krf|| ntj||ftjd}|| _	|| | _
|| | _|| _|| _|| _|| _|| _nt d S )NXWRB	initial_h	initial_cPlayout      zMissing Required Input: r      Zaxis   )Zdtype)AssertionErrorshapenum_directionsnpZsqueezegetZ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_peepholesZrequired_inputsikhidden_size
batch_sizer   xbpZh_0Zc_0 r-   D/tmp/pip-unpacked-wheel-xnis5xre/onnx/backend/test/case/node/lstm.py__init__   s`    



zLSTMHelper.__init__z
np.ndarray)r*   r	   c                 C  s   ddt |   S )Nr   )r   expr#   r*   r-   r-   r.   fO   s    zLSTMHelper.fc                 C  s
   t |S Nr   tanhr1   r-   r-   r.   gR   s    zLSTMHelper.gc                 C  s
   t |S r3   r4   r1   r-   r-   r.   hU   s    zLSTMHelper.hztuple[np.ndarray, np.ndarray]r	   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 ]}t	|t
| jt	|	t
| j tjt| jd  }t|dd\}}}}| |||
  }| |||
  }| |}||
 ||  }| |||  }|| | }|| |}	|}
qvt|}| jdkrp||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   r   emptyr   splitr   r    dotZ	transposer   r   addr   r2   r6   r7   appendconcatenater!   )r#   Z
seq_lengthr(   r)   YZh_listZp_iZp_oZp_fZH_tZC_tr*   Zgatesr&   or2   cCHZconcatenatedY_hr-   r-   r.   stepX   sB    



zLSTMHelper.stepN)__name__
__module____qualname__r/   r2   r6   r7   rE   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 )LSTMr   r8   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   rI   r
   r   r    rD   inputsoutputsr(   r   )r
   r   r   Ztest_lstm_defaultsrS   rT   namer   arrayastyper   onnxhelper	make_nodeonesr   rE   r   )input
input_sizer(   weight_scaler$   noder   r   lstm_rD   r-   r-   r.   export_defaults   s:    &   zLSTM.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 	|	|
fd}t
| |||d}| \}}t|| |||g|t jgdd d S )NrJ   rK   rL   rM   rN   rO         @       @g      "@r   r   rP   rI   r
   r   r   r   rQ   rD   rR   r   )r
   r   r   r   Ztest_lstm_with_initial_biasrU   )r   rX   rY   r   rZ   r[   r\   r]   r   r>   r   rE   r   )r^   r_   r(   r`   Zcustom_biasr$   ra   r   r   ZW_BZR_Br   rb   rc   rD   r-   r-   r.   export_initial_bias   sJ    $

zLSTM.export_initial_biasc               
   C  s  t ddddgddddgggt j} d	}d
}d}d	}d
}tjjdddddddddg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 )NrJ   rK   rL   rM   rN   rO   re   rf   r   r   rP   rI   r
   r   r   r   Zsequence_lensr   r   r   rQ   rD   rR   r   r   r   )r
   r   r   r   r   r   r   Ztest_lstm_with_peepholesrU   )r   rX   rY   r   rZ   r[   r\   r]   r   repeatr   Zint32r   rE   r   )r^   r_   r(   r`   r$   r%   ra   r   r   r   Zseq_lensZinit_hZinit_cr   rb   rc   rD   r-   r-   r.   export_peepholes   s^            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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 )NrJ   rK   rL   rM   rN   rO   r      g333333?r   r   rI   r
   r   r   r?   rD   )rS   rT   r(   r   )r
   r   r   r   Ztest_lstm_batchwiserU   rW   )r^   r_   r(   r`   r$   r   ra   r   r   rb   r?   rD   r-   r-   r.   export_batchwise   s>    *zLSTM.export_batchwiseN)rF   rG   rH   staticmethodrd   rg   ri   rk   r-   r-   r-   r.   rI      s   ),rI   )
__future__r   typingr   Znumpyr   rZ   Zonnx.backend.test.case.baser   Zonnx.backend.test.case.noder   r   rI   r-   r-   r-   r.   <module>   s   r