
    h73                     	   S SK r S SK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  S SKJr  SSKJrJr  \R(                  S 5       r\R(                  S 5       r\R(                  S	 5       r\R(                  S
 5       r\R(                  S 5       r\R(                  S 5       r\R(                  S 5       r\R(                  S 5       r\R:                  R=                  \(       + SS9S 5       r\R:                  R=                  \(       + SS9S 5       r \R:                  R=                  \(       + SS9S 5       r!\R:                  R=                  \(       + SS9S 5       r"\R:                  R=                  \(       + SS9S 5       r#\R:                  R=                  \(       + SS9S 5       r$\R:                  R=                  \(       + SS9S 5       r%\R:                  R=                  \(       + SS9S 5       r&\R:                  R=                  \(       + SS9S 5       r'\R:                  R=                  \(       + SS9S 5       r(\R:                  R=                  \(       + SS9S 5       r)\R:                  R=                  \(       + SS9S 5       r*\R:                  R=                  \(       + SS9S 5       r+\R:                  R=                  \(       + SS9S 5       r,\R:                  R=                  \(       + SS9S 5       r-\R:                  R=                  \(       + SS9S  5       r.\R:                  R=                  \(       + SS9S! 5       r/\R:                  R=                  \(       + SS9\R:                  R=                  \(       + S"S9S# 5       5       r0\R:                  R=                  \(       + SS9\R:                  Rc                  S$\ Rd                  " S%S&S'9S(/ 4\ Rd                  " S%S&S'9\ Rd                  " S%S&S'9/S/ 4\ Rd                  " S%S&S'9\ Rd                  " S%S&S'94S/ 4\ Rd                  " S%S&S'9\ Rd                  " S%S&S'9S).S S*S+/4\" \ Rd                  " S%S&S'9\ Rd                  " S%S&S'94S,\ Rd                  " S%S&S'905      SS,/4/5      S- 5       5       r3\R:                  R=                  \(       + SS9S. 5       r4\R:                  R=                  \(       + SS9S/ 5       r5g)0    N)	Adam
ArgsKwargsLinearModelTensorFlowWrapperget_current_opskeras_subclasstensorflow2xpxp2tensorflow)has_cupy_gpuhas_tensorflow)to_categorical   )check_input_convertersmake_tempdirc                      g)N    r       d/home/james-whalen/.local/lib/python3.13/site-packages/thinc/tests/layers/test_tensorflow_wrapper.pyn_hiddenr          r   c                      g)Ni  r   r   r   r   
input_sizer      s    r   c                      g)N
   r   r   r   r   	n_classesr      r   r   c                      g)N   r   r   r   r   answerr    $   s    r   c                 8    [        5       nUR                  SU 4S9$ )Nr   )shape)r   alloc)r   opss     r   Xr%   )   s    

C99Az?9++r   c                 J    [        5       n[        UR                  U /5      US9$ )Nr   )r   r   	asarray1i)r    r   r$   s      r   Yr)   /   s"    

C#--1YGGr   c                    SS K nUR                  R                  UR                  R                  R	                  X4S9UR                  R                  R                  5       UR                  R                  R	                  U SS9UR                  R                  R                  5       UR                  R                  R	                  SSS9/5      nU$ )Nr   input_shaperelu)
activationr   softmax)
tensorflowkeras
SequentiallayersDenseLayerNormalization)r   r   tftf_models       r   r7   r7   5   s    xx""HHOO!!(!FHHOO..0HHOO!!(v!>HHOO..0HHOO!!"!;	
H Or   c                     [        U 5      $ N)r   )r7   s    r   modelr:   E   s    X&&r   zneeds TensorFlow)reasonc                      SS K n [        5       nUR                  SSSS9n[        U5      n[	        X0R
                  5      (       d   e[        X1S9nUR                  R                  X$5      (       d   eg )Nr   r      T)zeros)r$   )	r0   r   alloc2fr   
isinstanceTensorr
   xparray_equal)r6   r$   	xp_tensor	tf_tensornew_xp_tensors        r   ,test_tensorflow_wrapper_roundtrip_conversionrG   J   se    

CAq-Ii(Ii++++!)5M66i7777r   c                  Z   SS K n U R                  R                  U R                  R                  R	                  SSS9/5      n[        [        U5      [        5      (       d   e[        R                  " [        5         [        [        SS5      5        S S S 5        g ! , (       d  f       g = f)Nr   r   r   r+   r   r=   )r0   r1   r2   r3   r4   r@   r   r   pytestraises
ValueErrorr   )r6   keras_models     r   9test_tensorflow_wrapper_construction_requires_keras_modelrN   V   ss    ((%%rxx'<'<RU'<'S&TUK'4e<<<<	z	"&A,' 
#	"	"s   =B
B*c                     U R                  U5      c   e[        U R                  S   5      S:w  d   eU R                  U R	                  5       5      c   eg )Nr    )predictstrshims
from_bytesto_bytes)r:   r%   r)   s      r   #test_tensorflow_wrapper_built_modelrV   `   sR     =='''u{{1~"$$$ENN,-999r   c                 &    U R                  U5        g r9   )rQ   r:   r%   s     r   test_tensorflow_wrapper_predictrY   j   s    	MM!r   c                 *   [        5       n[        5       n[        S5       HJ  nU " USS9u  pxUR                  U5      nXr-
  UR                  S   -  n	U" U	5        U R                  U5        ML     U R                  U5      R                  5       n
X:X  d   eg )Nd   Tis_trainr   )r   r   rangeasarrayr"   finish_updaterQ   argmaxr:   r%   r)   r    	optimizerr$   iguessesbackprop	d_guesses	predicteds              r   &test_tensorflow_wrapper_train_overfitsri   o   s    I

C3Z!!d3++g&[GMM!$44	I&  a '')Ir   c                    SS K n[        5       n/ n[        5       n[        S5       H  nU " USS9u  pUR	                  U	5      n	X-
  U	R
                  S   -  nU
" U5        U R                  S   R                   Vs/ s H  oR                  U5      PM     nnUR                  U5        M     U R                  U5        U R                  S   R                  b   e[        [        U5      5       H_  nUS:X  a  M  SnXh   nXhS-
     n[        UU5       H0  u  nnUU:g  R                  5       R                  5       (       d  M.  SnM2     USL a  M_   e   g s  snf )Nr   r=   Tr\   Fr   )r0   r   r   r^   r_   r"   rS   	gradientsidentityappendr`   lenzipnumpyany)r:   r%   r)   r    r6   rc   rk   r$   rd   re   rf   rg   var
shim_grads
found_diff
curr_grads
prev_gradscurrprevs                      r   ,test_tensorflow_wrapper_accumulate_gradientsry      sG   II

C1X!!d3++g&[GMM!$44	27++a.2J2JK2J3kk#&2J
K$  
	";;q>##+++ 3y>"6
\
1u%
j*5JD$##%))++!
 6 T!!! # Ls   :Ec           	        ^^^^ SS K mSU4m[        5       n[        SUR                  " T6 [	        UR                  S/5      TS9TS9 " UUUU4S jSTR                  R                  5      5       m[        T" 5       5      n[        5       n[        S5       HJ  nU" U S	S
9u  pUR                  U	5      n	X-
  U	R                  S   -  nU
" U5        UR                  U5        ML     UR                  U 5      R                  5       nX:X  d   eUR!                  UR#                  5       5        UR                  U 5      R                  5       U:X  d   eg )Nr   r   zfoo.v1r'   r%   r)   r,   c                   V   >^  \ rS rSrUU UUU4S jrS YR
                  4S jrSrU =r$ )Jtest_tensorflow_wrapper_serialize_model_subclass.<locals>.CustomKerasModel   c                    > [         TU ]  " S0 UD6  TR                  R                  R	                  SSTS9U l        TR                  R                  R	                  TSSS9U l        g )Nr   in_dense)namer,   	out_denser/   )r   r.   r   )super__init__r1   r3   r4   r   r   )selfkwargsCustomKerasModel	__class__r,   r   r6   s     r   r   Stest_tensorflow_wrapper_serialize_model_subclass.<locals>.CustomKerasModel.__init__   sd    "D2<V<HHOO11 2 DM  XX__22	 3 DNr   returnc                 F    U R                  U5      nU R                  U5      $ r9   r   r   )r   inputsxs      r   callOtest_tensorflow_wrapper_serialize_model_subclass.<locals>.CustomKerasModel.call   s    f%A>>!$$r   r   )	__name__
__module____qualname____firstlineno__r   rA   r   __static_attributes____classcell__)r   r   r,   r   r6   s   @r   r   r}      s"    	 		%")) 	% 	%r   r   2   Tr\   )r0   r   r	   r?   r   r(   r1   r   r   r   r^   r_   r"   r`   rQ   ra   rT   rU   )r%   r)   r   r   r    r$   r:   rc   rd   re   rf   rg   rh   r   r,   r6   s      `         @@@r   0test_tensorflow_wrapper_serialize_model_subclassr      s6    j/K

C
++{
#
s+y
A	% %288>> %% .01EI2Y!!d3++g&[GMM!$44	I&  a '')I 
U^^%& ==""$...r   c                  h   SS K n  " S SU R                  R                  5      n[        R                  " [
        5         [        U" 5       5        S S S 5        [        S[        R                  " SS/5      [        R                  " S/5      SSS	0S
9 " S SU R                  R                  5      5       n[        U" 5       5      nUR                  UR                  5       5      nUR                  S   R                  R                  S	:X  d   e[        U[        5      (       d   eg ! , (       d  f       N= f)Nr   c                       \ rS rSrS rSrg)Wtest_tensorflow_wrapper_keras_subclass_decorator_compile_args.<locals>.UndecoratedModel   c                     U$ r9   r   r   r   s     r   r   \test_tensorflow_wrapper_keras_subclass_decorator_compile_args.<locals>.UndecoratedModel.call       Mr   r   Nr   r   r   r   r   r   r   r   r   UndecoratedModelr          	r   r   	TestModel              ?r   lossbinary_crossentropy)r%   r)   r,   compile_argsc                       \ rS rSrS rSrg)Ptest_tensorflow_wrapper_keras_subclass_decorator_compile_args.<locals>.TestModel   c                     U$ r9   r   r   s     r   r   Utest_tensorflow_wrapper_keras_subclass_decorator_compile_args.<locals>.TestModel.call   r   r   r   Nr   r   r   r   r   r      s    	r   )r0   r1   r   rJ   rK   rL   r   r	   rp   arrayrT   rU   rS   _modelr   r@   )r6   r   r   r:   s       r   =test_tensorflow_wrapper_keras_subclass_decorator_compile_argsr      s    288>> 
 
z	"*,- 
# 
++sCj
!
++se
34BHHNN  ik*EU^^-.E;;q>  %%)>>>>eU####% 
#	"s   D##
D1c                     SS K n  " S SU R                  R                  5      n[        R                  " [
        5         [        U" 5       5        S S S 5        [        S[        R                  " SS/5      [        R                  " S/5      SS9 " S	 SU R                  R                  5      5       n[        [        U" 5       5      [        5      (       d   eg ! , (       d  f       N= f)
Nr   c                       \ rS rSrS rSrg)Jtest_tensorflow_wrapper_keras_subclass_decorator.<locals>.UndecoratedModel   c                     U$ r9   r   r   s     r   r   Otest_tensorflow_wrapper_keras_subclass_decorator.<locals>.UndecoratedModel.call   r   r   r   Nr   r   r   r   r   r      r   r   r   r   r   r   r   r{   c                       \ rS rSrS rSrg)Ctest_tensorflow_wrapper_keras_subclass_decorator.<locals>.TestModel   c                     U$ r9   r   r   s     r   r   Htest_tensorflow_wrapper_keras_subclass_decorator.<locals>.TestModel.call  r   r   r   Nr   r   r   r   r   r      s    	r   )r0   r1   r   rJ   rK   rL   r   r	   rp   r   r@   )r6   r   r   s      r   0test_tensorflow_wrapper_keras_subclass_decoratorr      s    288>> 
 
z	"*,- 
# u{{C:.%++se2DRVBHHNN 
 '	4e<<<< 
#	"s   C
C$c                    SS K n[        S[        R                  " SS/5      [        R                  " S/5      SS9 " S SUR                  R
                  5      5       n[        U" SS	S
95      n[        UR                  S   R                  S5      (       d   eUR                  S   R                  R                  nSUR                  ;   d   eSUR                  ;   d   e0 n	XS'   [        R                  " [        5         [        U" SU	S
95        S S S 5        UR!                  UR#                  5       5      ng ! , (       d  f       N.= f)Nr   r   r   r   r   r{   c                   2   ^  \ rS rSrSU 4S jjrS rSrU =r$ )Wtest_tensorflow_wrapper_keras_subclass_decorator_capture_args_kwargs.<locals>.TestModeli  c                 \   > [         TU ]  U 5        USL d   eUR                  SS 5      c   eg )NTother)r   r   get)r   customr   r   s      r   r   `test_tensorflow_wrapper_keras_subclass_decorator_capture_args_kwargs.<locals>.TestModel.__init__  s5    GT" T>!>::gt,888r   c                     U$ r9   r   r   s     r   r   \test_tensorflow_wrapper_keras_subclass_decorator_capture_args_kwargs.<locals>.TestModel.call  r   r   r   )F)r   r   r   r   r   r   r   r   )r   s   @r   r   r     s    	9	 	r   T9  )r   eg_argsr   key)r0   r	   rp   r   r1   r   r   hasattrrS   r   r   argsr   rJ   rK   rL   rT   rU   )
r%   r)   r   r   r    r6   r   r:   args_kwargsobjs
             r   Dtest_tensorflow_wrapper_keras_subclass_decorator_capture_args_kwargsr   	  s    u{{C:.%++se2DRV	BHHNN 		 iD9:E5;;q>(()4444++a.''//K;#####k((((( CJ	z	")D45 
# U^^-.E	 
#	"s   ?D88
Ec                 .    U R                  5       nUc   eg r9   )copy)r:   r   s     r   &test_tensorflow_wrapper_can_copy_modelr   /  s    ::<Dr   c                     [        U R                  S   5      nSU;   d   eSU;   d   eSU;   d   eSU;   d   eSU;   d   eg )Nr   layer_normalizationdensezTotal paramszTrainable paramszNon-trainable params)rR   rS   )r:   r%   summarys      r   %test_tensorflow_wrapper_print_summaryr   5  sZ    %++a.!G G+++gW$$$(((!W,,,r   c                 P    U R                  5       nUc   eU R                  U5        g r9   )rU   rT   )r:   r%   model_bytess      r    test_tensorflow_wrapper_to_bytesr   A  s*     .."K"""	[!r   c                     [        5        nUS-  nU R                  U5        U R                  U5      nUc   e S S S 5        g ! , (       d  f       g = f)Nzmodel.h5)r   to_disk	from_disk)r:   r%   r)   r    tmp_path
model_fileanother_models          r   $test_tensorflow_wrapper_to_from_diskr   I  sC    	8
*
j!
3(((	 
s   -A
Ac                 r    U R                  U5        U R                  5       nU R                  U5      nUc   eg r9   )rQ   rU   rT   )r:   r%   r   r   s       r   "test_tensorflow_wrapper_from_bytesr   R  s6    	MM!.."K$$[1M$$$r   c                 Z   [        5       n[        5       nU R                  UR                  5         U R	                  U5      R                  5       c   e S S S 5        [        S5       HT  nU R                  U5      u  pxUR                  U5      nXr-
  UR                  S   -  n	U" U	5        U R                  U5        MV     U R                  UR                  5         U R	                  U5      R                  5       n
S S S 5        W
U:X  d   eg ! , (       d  f       N= f! , (       d  f       N(= f)Nr   r   )r   r   
use_paramsaveragesrQ   ra   r^   begin_updater_   r"   r`   rb   s              r   "test_tensorflow_wrapper_use_paramsr   Z  s    I

C			),,	-}}Q&&(444 
.2Y!..q1++g&[GMM!$44	I&  
		),,	-MM!$++-	 
. 
.	- 
.	-s   #D D
D
D*c                 :    [        U 5      nUR                  5         g r9   )r   to_cpur7   r:   s     r   test_tensorflow_wrapper_to_cpur   m  s    h'E	LLNr   zneeds GPU/cupyc                 &    U R                  S5        g )Nr   )to_gpurX   s     r   test_tensorflow_wrapper_to_gpur   s  s     
LLOr   zdata,n_args,kwargs_keys)r   r=   f)dtyper   )abr   r   cc                     SS K nUR                  R                  UR                  R                  R	                  SSS9/5      n[        U5      nUR                  S   nU" XPSS9u  px[        XxXX#R                  5        g )Nr   r   rI   r+   convert_inputsTr\   )	r0   r1   r2   r3   r4   r   attrsr   rA   )	datan_argskwargs_keysr6   rM   r:   r   r)   rf   s	            r   &test_tensorflow_wrapper_convert_inputsr   y  sm     ((%%rxx'<'<RU'<'S&TUKk*E[[!12N t<KA1k99Mr   c                      " S S[         5      n[        XS9n[        X!5      (       d   eUR                  5       S:X  d   eg )Nc                       \ rS rSrS rSrg)Atest_tensorflow_wrapper_thinc_model_subclass.<locals>.CustomModeli  c                     g)Nr   r   )r   s    r   fnDtest_tensorflow_wrapper_thinc_model_subclass.<locals>.CustomModel.fn  s    r   r   N)r   r   r   r   r  r   r   r   r   CustomModelr     s    	r   r  )model_classr   )r   r   r@   r  )r7   r  r:   s      r   ,test_tensorflow_wrapper_thinc_model_subclassr    s?    e  h@Ee))))88:r   c                 <    [        U SS9nUR                  S:X  d   eg )Ncool)
model_name)r   r   r   s     r   ,test_tensorflow_wrapper_thinc_set_model_namer	    s     h6:E::r   )6rp   rJ   	thinc.apir   r   r   r   r   r   r	   r
   r   thinc.compatr   r   
thinc.utilr   utilr   r   fixturer   r   r   r    r%   r)   r7   r:   markskipifrG   rN   rV   rY   ri   ry   r   r   r   r   r   r   r   r   r   r   r   r   parametrizer>   r   r  r	  r   r   r   <module>r     s    
 
 
 6 % 7         , ,
 H H
   ' ' &/AB8 C8 &/AB( C( &/AB: C: &/AB C &/AB C &/AB" C"D &/AB./ C./b &/AB$ C$: &/AB= C=, &/AB"/ C"/J &/AB C
 &/AB- C- &/AB" C" &/AB) C) &/AB% C% &/AB C$ &/AB C
 &/AB$-=> ? C &/AB 
V3	'B/
++fC
(%++fC*H	I1bQ
++fC
(%++fC*H	I1bQ{{6-EKKc4R	SUVY\^aXbc	U[[s3U[[s5STWZ\a\g\ghnvy\zV{	|~  CF  BG  	HN CN &/AB C &/AB  C r   