o
    i                  
   @   sP  d dl mZmZmZmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ eZeZed	d!d	e
eef d
ee
eef  de
eef fddZde
eef dededeeef fddZ	d"de
eef dee dee ddfddZdededefddZded	ed
edefddZdededeeef fddZdededefdd ZdS )#    )CallableOptionalTuplecast   )Ops)registry)Model)Paddedzbidirectional.v1Nl2rr2lreturnc                 C   s,   |du r|   }td| j t| |gtdS )zLStitch two RNN models into a bidirectional layer. Expects squared sequences.Nbi)layersinit)copyr	   nameforwardr   )r   r    r   N/home/ubuntu/.local/lib/python3.10/site-packages/thinc/layers/bidirectional.pybidirectional   s   r   modelXis_trainc           
         sb   j \}}tj|}|||\} |||\}tj||}dtdtf fdd}	||	fS )NdZr   c                    s*   t j| \}} |}|}t||S N)_splitops_sum)r   d_l2r_Zd_r2l_ZdX_l2rdX_r2lbp_l2r_Zbp_r2l_Zr   r   r   backprop   s   
zforward.<locals>.backprop)r   _reverser   _concatenateOutTInT)
r   r   r   r   r   X_revl2r_Zr2l_ZZr&   r   r#   r   r      s   
r   Yc                 C   sH   |d ur
t | j|nd\}}| jd j||d | jd j||d d S )NNNr   )r   r/      )r   r   r   
initialize)r   r   r/   Y1Y2r   r   r   r   &   s   r   r   Xpc                 C   s    t |jd d d |j|j|jS )Nr1   r
   data	size_at_tlengthsindices)r   r5   r   r   r   r'   .   s    r'   c                 C   s(   t | jj|j|jfdd|j|j|jS )N)axis)r
   xpconcatenater7   r8   r9   r:   )r   r   r   r   r   r   r(   2   s   r(   c                 C   sz   |j jd d }|j ttttf dtd |f }|j ttttf dt|f }t||j|j|jt||j|j|jfS )Nr;   r   .)	r7   shaper   r   slicer
   r8   r9   r:   )r   r5   halfX_l2rX_r2lr   r   r   r   ;   s   " r   Ypc                 C   s   t | j|j | j| j| jS r   r6   )r5   rD   r   r   r   r   F   s   r   r   r0   )typingr   r   r   r   backendsr   configr   r   r	   typesr
   r*   r)   r   r   boolr   r   r'   r(   r   r   r   r   r   r   <module>   s>    

*	

	