
    h              
          S SK JrJrJrJr  SSKJr  SSKJr  SSK	J
r
  SSKJr  \r\r\R                  " S5       SS	\
\\4   S
\\
\\4      S\
\\4   4S jj5       rS\
\\4   S\S\S\\\4   4S jr SS\
\\4   S\\   S\\   SS4S jjrS\S\S\4S jrS\S	\S
\S\4S jrS\S\S\\\4   4S jrS\S\S\4S jrg)    )CallableOptionalTuplecast   )Ops)registry)Model)Paddedzbidirectional.v1Nl2rr2lreturnc                 l    Uc  U R                  5       n[        SU R                   3[        X/[        S9$ )zLStitch two RNN models into a bidirectional layer. Expects squared sequences.bi)layersinit)copyr
   nameforwardr   )r   r   s     T/home/james-whalen/.local/lib/python3.13/site-packages/thinc/layers/bidirectional.pybidirectionalr      s1    
 {hhj2chhZ'3*4HH    modelXis_trainc                    ^ ^
^ T R                   u  p4[        T R                  U5      nU" X5      u  nm
U" XR5      u  nm[        T R                  Xg5      nS[        S[
        4U
UU 4S jjn	X4$ )NdZr   c                 j   > [        TR                  U 5      u  pT" U5      nT" U5      n[        X45      $ N)_splitops_sum)r   d_l2r_Zd_r2l_ZdX_l2rdX_r2lbp_l2r_Zbp_r2l_Zr   s        r   backpropforward.<locals>.backprop   s5    !%))R0'"'"F##r   )r   _reverser!   _concatenateOutTInT)r   r   r   r   r   X_revl2r_Zr2l_ZZr)   r'   r(   s   `         @@r   r   r      sl    ||HCUYY"E!&OE8%*OE8UYY-A$T $c $ $ ;r   Yc                     Ub  [        U R                  U5      OSu  p4U R                  S   R                  XS9  U R                  S   R                  XS9  g )NNNr   )r   r3      )r    r!   r   
initialize)r   r   r3   Y1Y2s        r   r   r   &   sN     ()}veii#,HR	LLO)	LLO)r   r!   Xpc                 z    [        UR                  S S S2   UR                  UR                  UR                  5      $ )Nr6   r   data	size_at_tlengthsindices)r!   r:   s     r   r+   r+   .   s+    "''#A#,bjj"**EEr   c                     [        U R                  R                  UR                  UR                  4SS9UR                  UR
                  UR                  5      $ )N)axis)r   xpconcatenater=   r>   r?   r@   )r!   r   r   s      r   r,   r,   2   sH    CHHchh/b9	 r   c           	         UR                   R                  S   S-  nUR                   [        [        [        [        4   S[	        S U5      45         nUR                   [        [        [        [        4   S[	        U5      45         n[        X1R                  UR                  UR                  5      [        XAR                  UR                  UR                  5      4$ )NrB   r   .)	r=   shaper   r   slicer   r>   r?   r@   )r!   r:   halfX_l2rX_r2ls        r   r    r    ;   s    77==!DGGDue|,sE$4E.FGHEGGDue|,sE$K.@ABEullBJJ

;ullBJJ

; r   Ypc                     [        U R                  UR                  -   U R                  U R                  U R                  5      $ r   r<   )r:   rL   s     r   r"   r"   F   s,    "''BGG#R\\2::rzzJJr   r   r5   )typingr   r   r   r   backendsr   configr	   r   r
   typesr   r.   r-   r   r   boolr   r   r+   r,   r    r"    r   r   <module>rT      so   2 2     
#$=AI	sDy	I (sDy)9 :I
39I %I5d#  t dHn@U " KO*d* (*9A$*	*F# F6 Ff Fc  V    E&&.$9 KV K KF Kr   