
    h                     .   S SK r S SKrS SKJrJr  S SKJr  S SKJr  S SK	J
r
JrJrJr  SSKJr  SSKJrJr  \R&                  S	 5       rS
 rS r\R.                  R1                  SS9\" \" SSSS95      S 5       5       r\R.                  R1                  SS9\" \" SSSS95      S 5       5       r\R.                  R1                  SS9\" SS9\" \" SSSS95      S 5       5       5       r\R.                  R1                  SS9\" \" SSSS95      \" SS9S 5       5       5       r\R.                  R1                  SS9\" \" SSSS95      S 5       5       r\R.                  R1                  SS9\" \" SSSS95      S 5       5       r\R&                  S 5       rS r S r!\R.                  RE                  S\ RF                  " SS/S S!9SS/4\ RF                  " S"S/S S!9S"S/4\ RF                  " SS"/S S!9SS"/4\ RF                  " S"S"/S S!9S"S"/4/5      S# 5       r$S$ r%g)%    N)givensettings)	MagicMock)assert_allclose)SGDDropoutLinearchain   )arrays_OI_O_BI)	get_model	get_shapec                      [        5       n U $ N)r	   models    X/home/james-whalen/.local/lib/python3.13/site-packages/thinc/tests/layers/test_linear.pyr   r      s    HEL    c                 (    U R                   S:X  d   eg )Nlinear)namer   s    r   test_linear_default_namer      s    ::!!!r   c                  L   [        S[        R                  S9n SU l        SU l        [        S[        R                  S9nSUl        SUl        [        5       Ul        [        5       nUR                  X5        UR                  S5      c   eUR
                  R                  5         g )N)   
   )shapespecr   float32)   nI)
r   numpyndarrayndimdtypemaxr	   
initializeget_dimassert_called_with)Xyr   s      r   test_linear_dimensions_on_datar+      s    emm4AAFAG5==1AAFAGKAEHE	Q==***EEr   zFlaky, skip temporarily)reasonr   )	max_batchmax_outmax_inc                     [        U 5      n[        U 5      u  p#nU u  pVnUR                  U5      u  pUR                  U5      n
[	        X5        g r   )r   r   begin_updatepredictr   )	W_b_inputr   nr_batchnr_outnr_inWbinput_fwd_via_begin_updatefinish_updatefwd_via_predict_batchs              r   !test_begin_update_matches_predictr=   %   sR     i E'	2HeLA&*/*<*<V*D'!MM&1(@r   c                 4  ^ [        U 5      n[        U 5      u  p#nU u  pVnUR                  U5      u  p[        5       mU4S jn
[        R
                  " X#4SS9nU	" U5      nUR                  U
5        UR                   H  nUR                  U4T;   a  M   e   g )Nc                 d   > TR                  U 5        UR                  UR                  :X  d   eX4$ r   )addr   )keydatagradientkwargs	seen_keyss       r   sgd<test_finish_update_calls_optimizer_with_weights.<locals>.sgd:   s-    czzX^^+++~r   fr$   )	r   r   r1   setr!   onesr;   param_namesid)r3   r   r4   r5   r6   r7   r8   r9   outputr;   rF   grad_BOgrad_BIr   rE   s                 @r   /test_finish_update_calls_optimizer_with_weightsrQ   0   s     i E'	2HeLA&!..v6FI
 jj(+37GG$G	!!$9,,, "r   d   )max_examplesc           	      B   U u  pnUR                   u  pE[        XE5      nUR                  SU5        UR                  SU5        [        R                  " S[        R
                  " USS9[        R
                  " USS9SS9nXr-   nUR                  U5      n	[        XSSS	9  g )
Nr7   r8   z	oi,bi->bofloat64rI   Foptimizeg{Gz?rtolatolr   r	   	set_paramr!   einsumasarrayr2   r   
r3   r7   r8   r9   r5   r6   r   	einsummedexpected_outputpredicted_outputs
             r   test_predict_smallrc   F   s     LA&GGMF6!E	OOC	OOCay)fI.	I  mO}}V,$DtLr         )deadlinec           	      B   U u  pnUR                   u  pE[        XE5      nUR                  SU5        UR                  SU5        [        R                  " S[        R
                  " USS9[        R
                  " USS9SS9nXr-   nUR                  U5      n	[        XSSS	9  g )
Nr7   r8   z	bi,oi->bor   rI   FrV   g-C6?rX   r[   r_   s
             r   test_predict_extensiverh   ]   s     LA&GGMF6!E	OOC	OOCfI.ay)	I  mO}}V,$EOr   c                     [        [        U 5      [        S5      5      n[        U 5      u  p#nU u  pVnUR	                  U5      u  p[        S UR                  5        5       5      (       d   eg )N      ?c              3   *   #    U  H	  oS :H  v   M     g7f        N .0vals     r   	<genexpr>6test_dropout_gives_zero_activations.<locals>.<genexpr>{   s     ;%:ccz%:   )r
   r   r   r   r1   allflatten)
r3   r   r4   r5   r6   r7   r8   r9   fwd_dropped_s
             r   #test_dropout_gives_zero_activationsry   t   sc     )I&5E'	2HeLA&''/NK;[%8%8%:;;;;;r   c                    [        [        U 5      [        S5      5      n[        U 5      u  p#nU u  pVnUR	                  5        H$  nUR
                  S:X  d  M  SUR                  S'   M&     UR                  U5      u  p[        R                  " X#4SS9nU
" U5      n[        S UR                  5        5       5      (       d   eg )Nrj   dropoutdropout_raterH   rI   c              3   *   #    U  H	  oS :H  v   M     g7frl   rn   ro   s     r   rr   4test_dropout_gives_zero_gradients.<locals>.<genexpr>   s     7%6ccz%6rt   )r
   r   r   r   walkr   attrsr1   r!   rK   ru   rv   )r3   r   r4   r5   r6   r7   r8   r9   noderw   r;   rO   rP   s                r   !test_dropout_gives_zero_gradientsr   ~   s     )I&5E'	2HeLA&

99	!),DJJ~&  "'!3!3F!;Kjj(+37GG$G7W__%677777r   c                  :    [        SS5      R                  5       n U $ )Nr   )r	   r&   r   s    r   model2r      s    1aL##%ELr   c                     U R                  S5      S:X  d   eU R                  S5      S:X  d   eU R                  S5      c   eU R                  S5      c   eg )NnOr   r    r7   r8   )r'   	get_param)r   s    r   	test_initr      s^    >>$1$$$>>$1$$$C ,,,C ,,,r   c                    U R                   R                  SU R                  S5      5      nU R                   R                  SU R                  S5      5      nU R                  U5      n[	        US   US   5        SU R                  S5      S'   SUS'   U R                  U5      n[	        X25        SU R                  S5      S'   SUS'   U R                  U5      n[	        X25        g )	N   r    r   g       @r8   r   r   g      @r   r   )opsalloc2fr'   r2   r   r   )r   r9   target_scoresscoress       r   test_predict_biasr      s    ZZ6>>$#78FJJ&&q&..*>?M^^F#FF1I}Q/0"FS!M$^^F#FF*"FS!M$^^F#FF*r   z
X,expectedrm   rH   rI   rj   c                    [         R                  " / SQSS9R                  S5      n[         R                  " SS/SS9n[        UR                  S   UR                  S   5      nUR                  SU5        UR                  S	U5        UR                  U R                  S
5      5      n[        UR                  5       U5        g )Nrj   rm   rm   rj   rH   rI   r   r   rm   r   r   r7   r8   )r   )	r!   r^   reshaper	   r   r\   r2   r   ravel)r)   expectedr7   biasr   r   s         r   test_predict_weightsr      s     	*#6>>vFA==#s3/D1771:qwwqz*E	OOC	OOC]]199W-.FFLLNH-r   c                  h   [         R                  " / SQSS9R                  S5      n [         R                  " SS/SS9n[        SS5      nUR	                  SU 5        UR	                  SU5        [        S	SSS
9nS Ul        [         R                  " SS//SS9n[         R                  " S	S//SS9n[         R                  " SS	//SS9n[         R                  " S	S	//SS9nUR                  U5      u  p[        US   US   5        [         R                  " SS//SS9n
U	" U
5        UR                  5       R                  5        H=  u  nu  pU" XU5      u  pUR	                  US   U5        UR                  US   U5        M?     UR                  S5      nUR                  S5      n 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      u  p[         R                  " SS//SS9n
U" U
5        UR                  5       R                  5        H  u  nu  n nU" XU5        M     UR                  S5      nUR                  S5      n 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g )Nr   rH   rI   r   rm   r   r7   r8   rj   )L2	grad_clipr   r   g      r   r   )r   r   )r   r   )r!   r^   r   r	   r\   r   averagesr1   r   get_gradientsitemsset_gradr   )r7   r   r   rF   fftfftttr   backproprC   rA   paramd_paramr8   r;   dWs                    r   test_updater      s   *#6>>vFA==#s3/D1aLE	OOC	OOC
ccS
)CCL	c
|3	/B	c
|3	/B	c
|3	/B	c
|3	/B ))"-FF4L&,/}}tSk]#6HX!&!4!4!6!<!<!>eS1A&s1vw' "?
 	AAQ43;;Q43;;T7c>>T7c>>T7c>>T7c>> "..r2F}}sDk]#6H(++-335WaCB 6AAQ43;;Q43;; T7iT7iT7j   T7ir   )&r!   pytest
hypothesisr   r   mockr   numpy.testingr   	thinc.apir   r   r	   r
   
strategiesr   utilr   r   fixturer   r   r+   markskipr=   rQ   rc   rh   ry   r   r   r   r   parametrizer^   r   r   rn   r   r   <module>r      s     &  ) 1 1 ' '  
" 23~1Q78A 9 4A 23~1Q78- 9 4-( 23	s~1Q78M 9  4M( 23~Br:;	4P  < 4P( 23~1Q78< 9 4< 23~1Q78
8 9 4
8  
-+" 	Sz	-Sz:	Sz	-Sz:	Sz	-Sz:	Sz	-Sz:		.	.5 r   