
    h                     L   S SK r S SKrS SKrS SKJrJrJrJrJrJ	r	  S SK
Jr  \R                  " SS/S9S 5       r\R                  " / SQS9S	 5       rS
 r\R                   R#                  S\" 5       \" 5       /5      \R                   R#                  S/ SQ5      S 5       5       r\R                   R#                  S\" 5       \" 5       /5      S 5       r\R                   R#                  S\" 5       \" 5       /5      \R                   R#                  SSSSSS/4SSSSSS/4SSSS/ SQ4SSSS/ SQ4SSSSS/4SSSS/ SQ4SSSS/ SQ4SSSS/ SQ4/5      S 5       5       rS r\R                   R,                  S 5       rS  r\R                   R3                  \(       + S!S"9S# 5       rg)$    N)LSTMNumpyOpsOpsPyTorchLSTMfix_random_seedwith_padded)	has_torch      )paramsc                     U R                   $ Nparamrequests    V/home/james-whalen/.local/lib/python3.13/site-packages/thinc/tests/layers/test_lstm.pynIr   
       ==    )r
         	   c                     U R                   $ r   r   r   s    r   nOr      r   r   c                  `   [        5       n [        R                  " S5      [        R                  " S5      [        R                  " S5      /nU R                  U5      nUR                  nUR
                  nUR                  S:X  d   eUS   S:X  d   eUS   S:X  d   eUS   S:X  d   eUS   S:X  d   eUS	   S:X  d   eUS
   S:X  d   eUS   S:X  d   eUS   S:X  d   eU R                  U5      nUS   R                  S:X  d   eUS   R                  S:X  d   eUS   R                  S:X  d   eg )N)      )   r   )r   r   )r      r   r   r    r
   r   r   r   r   r   )r   numpyzeroslist2paddeddata	size_at_tshapepadded2list)opsseqspaddedarrr%   unpaddeds         r   test_list2paddedr-      sJ   
*CKKV!4ekk&6IJD__T"F
++C  I99	!!!Q<1Q<1Q<1Q<1Q<1Q<1Q<1Q<1v&HA;&&&A;&&&A;&&&r   r(   znO,nI))r
   r   )r   r   )d      )r   r   c                 &   [        [        XSS95      R                  5       nUR                  5        H1  nXl        UR                  S5      c   eUR                  S5      b  M1   e   UR                  5        H  nUR                  S5      (       a?  UR                  S5      nUR                  US-  U-  US-  -   US-  U-  US-  -   -   4:X  d   eUR                  S5      (       d  Mp  UR                  S5      nUR                  SSSU4:X  a  M   e   g )Nr
   depthr   HC0r   r   )r   r   
initializewalkr(   	has_param	get_paramr&   )r(   r   r   modelnoder   s         r   test_LSTM_init_with_sizesr:   )   s
    R1-.99;E

	~~f%111~~e$000	 
 

>>&!!^^F+F<<q&2+26*b1frkBF.BC$    >>%  ^^E*F<<Aq!R=000 r   c                 t   SnSn[         R                  " SS/SS/SS//SS9n[        [        X5      5      R	                  U/S9nUR                  5        H	  nXl        M     U" U/S	S
9u  pgU" U5      n[         R                  " U5      R                  [         R                  " U/5      R                  :X  d   eg )Nr
   r   皙?g      ?fdtypeXTis_train)	r!   asarrayr   r   r4   r5   r(   vstackr&   )	r(   r   r   rB   r8   r9   ysbackprop_ysdXss	            r   test_LSTM_fwd_bwd_shapes_simplerJ   >   s    	
B	
BSzD$<#s<CHAR%00A307E

 QC$/OB
b/C<<""ellA3&7&=&====r   znO,nI,depth,bi,lengthsF       r    r   T)r   r   r   )r   r   r      )r   r
   
   r   )r    r    r   )r   r   r   c           	      ~   U Vs/ s H  n[         R                  " Xb4SS9PM     nn[        [        XX4S95      R	                  US9nUR                  5        H	  n	X	l        M     U" USS9u  pU" U
5      n[         R                  " U5      R                  [         R                  " U5      R                  :X  d   eg s  snf )Nr>   r?   )r2   birA   TrC   )	r!   onesr   r   r4   r5   r(   rF   r&   )r(   r   r   r2   rP   lengthslengthXsr8   r9   rG   rH   rI   s                r   test_BiLSTM_fwd_bwd_shapesrU   K   s     =D	DG&%**f\
-GB	DR589DDrDJE

 B.OB
b/C<<""ell2&6&<&<<<< 
Es    B:c                     [        S5        Sn SnS n[        [        X5      5      nSS/SS/SS//nSS/SS/SS//nU Vs/ s H+  ocR                  R	                  USS	9R                  S
5      PM-     nnU Vs/ s H+  osR                  R	                  USS	9R                  S
5      PM-     nnUR                  XE5      nUR                  U5      u  p[        [        X5       V
Vs/ s H  u  pX-
  S-  R                  5       PM     snn
5      nUR                  U5      u  p[        X5       V
Vs/ s H	  u  pX-
  PM     nn
nU	" U5      nUR                  U5        UR                  U5      u  p[        X5       V
Vs/ s H	  u  pX-
  PM     nn
nU	" U5      n[        [        X5       V
Vs/ s H  u  pX-
  S-  R                  5       PM     snn
5      nX:  d   X45       eg s  snf s  snf s  snn
f s  snn
f s  snn
f s  snn
f )Nr   r   c                     USU-  -  nXS-  4$ )NgMbP?r    )keyweightsgradients      r   sgdtest_LSTM_learns.<locals>.sgdi   s    58##1$$r   r<   g?g333333?g?r>   r?   )r
   )r   r   r   r(   rE   reshaper4   begin_updatesumzipfinish_update)r   r   r\   r8   rB   YxyYhsbp_Yhsyhloss1dYhsrI   loss2s                  r   test_LSTM_learnsrm   c   s   A	
B	
B% R%E
sc3Z#s,A
sc3Z#s,ACDE1a		1C		(	0	0	91AECDE1a		1C		(	0	0	91AEQ"E$$Q'KCCK@K5226a-$$&K@AE$$Q'KC #C,urBFD,
,C	$$Q'KC #C,urBFD,
,CCK@K5226a-$$&K@AE=(5.(= 	FE A, -@s$   2G 92G%$!G*
.G0;G6)!G<
c                     Sn SnSnSnSn[         R                  R                  SSX#-  S9n[         R                  " US5      n/ nSn[	        [        X5      5      R                  5       nUR                  R                  X55       H  n	[        U	5      n	U(       a[  [        U	5      nU	 V
s/ s HB  n
[         R                  " [         R                  R                  SS	[        U5      U45      S
S9PMD     nn
OOU	 Vs/ s HB  n[         R                  " [         R                  R                  SS	[        U5      U45      S
S9PMD     nnUR                  U5        M     [        R                   " 5       nU H  nUR#                  [        U5      5      u  pM!     [        R                   " 5       nX#-  n[%        SUUU-
  UUU-
  -  UU-
  U-  4-  5        g s  sn
f s  snf )N   i     rN   )scalelocsizer
   Fg        r=   r>   r?   z>--- %i samples in %s seconds (%f samples/s, %.7f s/sample) ---)r!   randomnormalmaximumr   r   r4   r(   	minibatchlistmaxrE   uniformintappendtimeitdefault_timerr`   print)r   r   n_batch
batch_sizeseq_lenrR   batchesuniform_lengthsr8   batch_lengths_batchstartrT   rG   bp_ysend	n_sampless                     r   test_benchmark_LSTM_fwdr      s   	B	BGJGll!!9M!NGmmGQ'GGOR%002E,,ZA]+-(G
 '	 'A LL((cCL"3EFc '	  E  -	  -G LL((cCL"3EFc  -	   	u# B$   "E&&tBx0	E  


 C$I	HcEk9e#<sU{i>W
X	Y)s   (A	G8A	Gc                  h    [        [        SSSS95      R                  5       n U R                  5         g )Nr   T)rP   )r   r   r4   r8   s    r   test_lstm_initr      s*    Qd+,779E	r   zneeds PyTorch)reasonc                  l    [        [        SSSS95      R                  5       n U R                  S:X  d   eg )Nr   r   r1   zwith_padded(noop))r   r   r4   namer   s    r   test_pytorch_lstm_initr      s1    Aq23>>@E::,,,,r   )r}   r!   pytest	thinc.apir   r   r   r   r   r   thinc.compatr	   fixturer   r   r-   markparametrizer:   rJ   rU   rm   skipr   r   skipifr   rX   r   r   <module>r      s      T T " 1v  |$ %'* 
 34"FG1 H 51& 
 34	> 5	> 
 34	
Aq%!	REAq6"	
Aq$	"	
Aq%#	
Aq$	RD-(	RD)$	RD)$	= 5=): & &R
 	M/:- ;-r   