
    h                        S SK r S SKrS SKJr  S SKJrJrJrJrJ	r	J
r
JrJrJr  S SKJrJr  \R"                  " / SQS9S 5       r\R"                  " SS	/S9S
 5       r\R"                  " / SQS9S 5       r\R"                  " / SQS9S 5       r\R"                  S 5       r\R"                  S 5       r\R"                  S 5       rS rS rS rS rS rS rS rS r S r!S r"S r#S r$S r%S r&S  r'\RP                  RS                  S!\" 5       \" S"S#9/5      S$ 5       r*S% r+S& r,S' r-S( r.S) r/S* r0S+ r1S, r2S- r3S. r4S/ r5S0 r6S1 r7S2 r8g)3    N)assert_allclose)	DropoutLinearModelNumpyOpsaddcloneconcatenatemap_listnoop)chaintuplify)      	   )paramsc                     U R                   $ Nparamrequests    ]/home/james-whalen/.local/lib/python3.13/site-packages/thinc/tests/layers/test_combinators.pynBr          ==    r      c                     U R                   $ r   r   r   s    r   nIr      r   r   )r         c                     U R                   $ r   r   r   s    r   nHr#      r   r   )r   r      r   c                     U R                   $ r   r   r   s    r   nOr&   "   r   r   c                     [        X5      $ r   r   )r#   r   s     r   model1r)   '       ">r   c                     [        X5      $ r   r(   )r&   r#   s     r   model2r,   ,   r*   r   c                     [        X 5      $ r   r(   )r&   s    r   model3r.   1   r*   r   c                      [         R                  " [        5         [        5         S S S 5        g ! , (       d  f       g = fr   pytestraises	TypeErrorr    r   r   test_tuplify_zeror5   6   s    	y	!	 
"	!	!   /
=c                     [         R                  " [        5         [        U 5        S S S 5        g ! , (       d  f       g = fr   r0   r)   s    r   test_tuplify_oner9   ;   s!    	y	! 
"	!	!   0
>c                 P    [        X5      n[        UR                  5      S:X  d   eg Nr   r   lenlayersr)   r,   models      r   test_tuplify_tworB   @   s#    F#Eu||!!!r   c                     [         R                  " S[        05         X-  n[        UR                  5      S:X  d   e S S S 5        g ! , (       d  f       g = f)N&r   r   define_operatorsr   r>   r?   r@   s      r   test_tuplify_operator_tworG   E   s>    			g	/5<< A%%% 
0	/	/    A
Ac                      [        [        5       [        5       5      n [        R                  " S/5      nU R	                  U5      nX!U4:X  d   eg )N
   )r   r   numpyonespredict)rA   rL   outs      r   test_tuplify_dulicates_inputrO   K   s@    DFDF#E::rdD
--
C,r   c                 |    [        U5      n[        X"5      n[        R                  " SU 4SS9nUR	                  US9  g )Nr   floatdtypeX)r   r   rK   rL   
initialize)r   r&   linearrA   rL   s        r   test_tuplify_initializerX   R   s:    BZFF#E::q"gW-D	tr   c                 R    [        XU5      n[        UR                  5      S:X  d   eg Nr!   r=   r)   r,   r.   rA   s       r   test_tuplify_threer\   Y   s%    FF+Eu||!!!r   c                    [         R                  " S[        05         X-  U-  n[        UR                  5      S:X  d   e[        UR                  S   R                  5      S:X  d   e S S S 5        g ! , (       d  f       g = f)NrD   r   r   rE   r[   s       r   test_tuplify_operator_threer^   ^   sf     
		g	/&(5<< A%%%5<<?))*a/// 
0	/	/   AA22
B c                      [         R                  " [        5         [        5         S S S 5        g ! , (       d  f       g = fr   r1   r2   r3   r   r4   r   r   test_chain_zerorb   g   s    	y	! 
"	!	!r6   c                     [         R                  " [        5         [        U 5        S S S 5        g ! , (       d  f       g = fr   ra   r8   s    r   test_chain_onerd   l   s!    	y	!f 
"	!	!r:   c                 P    [        X5      n[        UR                  5      S:X  d   eg r<   r   r>   r?   r@   s      r   test_chain_tworg   q   s#    &!Eu||!!!r   c                     [         R                  " S[        05         X-	  n[        UR                  5      S:X  d   e S S S 5        g ! , (       d  f       g = f)N>>r   r   rF   r   r>   r?   r@   s      r   test_chain_operator_twork   v   s?    			u	. 5<< A%%% 
/	.	.rH   c                 R    [        XU5      n[        UR                  5      S:X  d   eg rZ   rf   r[   s       r   test_chain_threerm   |   s%    &&)Eu||!!!r   c                    [         R                  " S[        05         X-	  U-	  n[        UR                  5      S:X  d   e[        UR                  S   R                  5      S:X  d   e S S S 5        g ! , (       d  f       g = f)Nri   r   r   rj   r[   s       r   test_chain_operator_threero      sg     
		u	. F*5<< A%%%5<<?))*a/// 
/	.	.r_   c                     [        X5      n[        X25      n[        UR                  5      S:X  d   e[        UR                  5      S:X  d   eg r<   rf   )r)   r,   r.   merge1merge2s        r   test_chain_right_branchrs      sF     6"F6"Fv}}"""v}}"""r   opsT)use_blisc                 ~   [         R                  " / SQ/SS9n[        [        S5      [	        5       [        S5      5      nXl        UR                  X5        U" USS9u  p4U" U5        [        [        S5      [	        5       [        SS5      5      nUR                  X5        [        [        S5      [	        5       [        S5      5      nUR                  SS5        UR                  US 5        [        [        SS5      [	        5       [        SS5      5      nUR                  SS5        UR                  S U5        [        R                  " [        5         [        [        5       5        S S S 5        [        R                  " [        5         [        5         S S S 5        g ! , (       d  f       N<= f! , (       d  f       g = f)	Nr   r   r!      frR   r   Tis_trainr&   r   )rK   asarrayr   r   r   rt   rV   set_dimr1   r2   r3   )rt   datarA   Ybackprops        r   
test_chainr      s/   ==,s3D&)WYq	2EI	T t,KAQK&)WYq!5E	T &)WYq	2E	MM$	T4 &A,	6!Q<8E	MM$	T4 	y	!fh 
"	y	! 
"	! 
"	!	!	!s   F	F.
F+.
F<c                 H    [        U 5      n[        U[        5      (       d   eg r   )r
   
isinstancer   )r)   rA   s     r   test_concatenate_oner      s    EeU####r   c                 P    [        X5      n[        UR                  5      S:X  d   eg r<   r
   r>   r?   r@   s      r   test_concatenate_twor      s#    'Eu||!!!r   c                     [         R                  " S[        05         X-  n[        UR                  5      S:X  d   e S S S 5        g ! , (       d  f       g = f)N|r   r   rF   r
   r>   r?   r@   s      r   test_concatenate_operator_twor      s?    			k 2	35<< A%%% 
4	3	3rH   c                 R    [        XU5      n[        UR                  5      S:X  d   eg rZ   r   r[   s       r   test_concatenate_threer      s%    /Eu||!!!r   c                     [         R                  " S[        05         X-  U-  n[        UR                  5      S:X  d   e S S S 5        g ! , (       d  f       g = f)Nr   r!   r   r[   s       r   test_concatenate_operator_threer      sD    			k 2	3&(5<< A%%% 
4	3	3s   #A


Ac                 
   [        U 5      n[        US5      n[        R                  " SU4SS9nUR	                  US9  UR                  U5      nUR                  U5      nUR                  5       UR                  5       :w  d   eg )NrJ   ry   rR   rT   )r   r	   rK   rL   rV   rM   sum)r#   r   r)   rA   rL   output_from_clonedoutput_from_origs          r   test_clone_changes_predictionsr      s{    BZF&"E::r2hc*D	tt,~~d+!!#'7';';'====r   c                 "   [        [        U 5      S5      n[        UR                  5      S:X  d   e[	        5       nUR                  5        H0  nUR                  U;  d   eUR                  UR                  5        M2     [        U5      S:X  d   eg )Nr    r   )r	   r   r>   r?   setwalkidr   )r#   r   rA   seen_idsnodes        r   test_clone_gives_distinct_idsr      sv    &*a Eu||!!!uH

wwh&&&TWW  x=Ar   c                      [        [        5       S5      n [        U R                  5      S:X  d   eU R                  S:X  d   eg Nr   r   )r	   r   r>   r?   namerA   s    r   test_clone_noopr      s9    &(AEu||!!!::r   c                  r    [        5       n [        U R                  5      S:X  d   eU R                  S:X  d   eg r   )r
   r>   r?   r   r   s    r   test_concatenate_noopr      s2    MEu||!!!::r   c                  "   [         R                  " / SQSS9n [        [        5       [        5       5      nUR	                  X 5        U" U SS9u  p#[         R
                  " X 5      (       d   eU" U5      n[         R
                  " X@5      (       d   eg )Nr   r   r!   ry   rR   Trz   )rK   r|   r   r   rV   array_equalr~   rA   r   r   dXs        r   	test_noopr      su    ==#.D68$E	T t,KAQ%%%%	!BR&&&&r   c                    ^ [         R                  " / SQ/SS9m[        [        5       [        5       5      n U R	                  TT5        U " TSS9u  p[        U4S jU R                   5       5      n[         R                  " X5      (       d   eU" U5      nUR                  TR                  :X  d   e[        U [        5       5      n[        UR                  5      S:X  d   eU R	                  TT5        UR                  T5      n[        U4S jUR                   5       5      n[         R                  " X5      (       d   eg )	Nrw   ry   rR   Trz   c              3   D   >#    U  H  oR                  T5      v   M     g 7fr   rM   .0layerr~   s     r   	<genexpr>test_add.<locals>.<genexpr>   s     ;lU]]4  l    r!   c              3   D   >#    U  H  oR                  T5      v   M     g 7fr   r   r   s     r   r   r      s     <mU]]4  mr   )rK   r|   r   r   rV   r   r?   r   shaper>   rM   )rA   r   r   Y2r   r,   r~   s         @r   test_addr      s    ==,s3D&(#E	T4 t,KA	;ell;	;BQ####	!B88tzz!!!!Fv}}"""	T4 tA	<fmm<	<BQ####r   c                     [         R                  " / SQ/SS9n [        R                  " [        5         [        5         S S S 5        [        [        5       [        5       5      n/ Ul        U" U SS9u  p#[         R                  " X5      (       d   eU" U5      n[         R                  " X@5      (       d   eg ! , (       d  f       N}= f)Nrw   ry   rR   Trz   )	rK   r|   r1   r2   r3   r   r   _layersr   r   s        r   test_add_edge_casesr     s    ==,s3D	y	! 
"&(#EEMt,KAT%%%%	!BR&&&& 
"	!s   B55
Cc            	         [         R                  " / SQ/ SQ/SS9n [        [        5       [        5       5      nUR	                  X 5        U" U SS9u  p#UR
                  S   [        UR                   Vs/ s H   oDR                  U 5      R
                  S   PM"     sn5      :X  d   eU" U5      nUR
                  U R
                  :X  d   eg s  snf )Nr   )rx   r    r   ry   rR   Trz   r   )	rK   r|   r
   r   rV   r   r   r?   rM   )r~   rA   r   r   r   r   s         r   test_concatenater     s    ==)Y/s;D&(+E	T t,KA771:UummD177:UVVVV	!B88tzz!!! Vs   3'C
c                  2   Sn Sn[         R                  " SU 4SS9[         R                  " SU 4SS9/nU Vs/ s H  o3R                  S   U4PM     nn[	        [        5       5      nUR                  X$ Vs/ s H  n[         R                  " USS9PM     snS9  U" US	S
9u  px[        U[        5      (       d   e[        U5      [        U5      :X  d   eUR                  S   n	[        X'5       H   u  p[        U	R                  U
5      U5        M"     U" U5      n[        U[        5      (       d   e[        U5      [        U5      :X  d   eUS   R                  US   R                  :X  d   eUS   R                  US   R                  :X  d   eg s  snf s  snf )Nrx   r   r   ry   rR   r!   r   )rU   r   Trz   r   )rK   zerosrL   r   r   r   rV   r   listr>   r?   zipr   rM   )r   r&   XsxY_shapesrA   r   Ysr   r   rU   r   dXss                r   test_map_listr     si   	
B	
B
++q"gS
)5::q"gS+I	JB*,-"QR "H-VXE	rRekk%s;RSd+LBb$r7c"gLLOEBa(!, 
2,Cc4    s8s2wq6<<2a5;;&&&q6<<2a5;;&&& .Rs   F5F
)9rK   r1   numpy.testingr   	thinc.apir   r   r   r   r   r	   r
   r   r   thinc.layersr   r   fixturer   r   r#   r&   r)   r,   r.   r5   r9   rB   rG   rO   rX   r\   r^   rb   rd   rg   rk   rm   ro   rs   markparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r4   r   r   <module>r      s     )
 
 
 ( y! " 1v  y! " |$ %      

"
&"
0

"
&"
0# Xt-D EF G0$
"
&"
&>  '$$	'"'r   