o
    wi                     @  sT   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G dd	 d	eZdS )
    )annotationsN)OpRunc                   @  sJ   e Zd Zdd Zdd Zdd Zdd Z																				dd
dZd	S )	CommonRNNc                 C  sn  t | || | jdv rd| _n| jdkrd| _n	td| jd| jd ur8t| j| jkr8td| j d| jd urNt| j| jkrNtd| j d| | j	d	 | jd uret| jd	kre| jd	 nd | jd urwt| jd	krw| jd	 nd | _
t| j	dkr| | j	d | jd urt| jdkr| jd nd | jd urt| jdkr| jd nd | _t|j| _d S )
N)forwardreverse   bidirectional   zUnknown direction .z;activation_alpha must have the same size as num_directions=z:activation_beta must have the same size as num_directions=r   )r   __init__	directionnum_directionsRuntimeErroractivation_alphalenactivation_beta
choose_actactivationsf1f2output	n_outputs)self	onnx_node
run_params r   V/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/onnx/reference/ops/op_rnn.pyr      sL   









zCommonRNN.__init__c                   s4   |dv r| j S |dv r fddS td|d)N)Tanhtanh)Affineaffinec                   s   |    S Nr   )xalphabetar   r   <lambda>H   s    z&CommonRNN.choose_act.<locals>.<lambda>zUnknown activation function r
   )_f_tanhr   )r   namer$   r%   r   r#   r   r   D   s
   zCommonRNN.choose_actc                 C  s
   t |S r!   )npr   )r   r"   r   r   r   r'   K   s   
zCommonRNN._f_tanhc              
   C  s   g }|}t j||jd ddD ]'}| t |t |t |t | t jt |d  }	||	 |	}qt |}
| j	dkrGt 
|
d}||d fS )Nr   axisr	   r   )r)   splitshaper   dot	transposeaddappendconcatenater   expand_dims)r   XRBWH_0h_listH_tr"   Hconcatenatedr   r   r   r   _stepN   s    


zCommonRNN._stepNc                 C  sv  |j d | _| jdkrvtj|dd}tj|dd}|d ur$tj|dd}|d ur/tj|dd}|d ur:tj|dd}|j d }|j d }|dkrJ|nt|dd}|d urW|n	tjd| |jd}|d urg|n	tj||f|jd}|}|}ntd| j d| jj	d	| 
|||||\}}|dkrt|g d
}|d d d d dd d f }||j}| jdkr|fS ||fS )Nr   r   r*   r,   r	   )dtypezUnsupported value z! for num_directions and operator r
   )r	   r   r      )r.   r   r)   squeezeswapaxeszerosr?   NotImplementedError	__class____name__r>   r0   astyper   )r   r5   r8   r6   r7   sequence_lens	initial_hr   r   r   clipr   hidden_sizelayout
batch_sizebh_0r9   YY_hr   r   r   _run^   s:   


 zCommonRNN._run)
NNNNNNNNNN)rF   
__module____qualname__r   r   r'   r>   rR   r   r   r   r   r      s     8r   c                   @     e Zd ZdS )RNN_7NrF   rS   rT   r   r   r   r   rV          rV   c                   @  rU   )RNN_14NrW   r   r   r   r   rY      rX   rY   )	
__future__r   numpyr)   onnx.reference.op_runr   r   rV   rY   r   r   r   r   <module>   s    