
    h                        S SK JrJrJrJrJrJrJr  S SKrSSK	J
r  SSKJr  SSKJrJrJr  SSKJrJr  SSKJrJrJrJrJrJr  \" S	5      r\" S
5      r\" S5      r\" S\S9r\" S\S9r  S$S\!S\S\ S\\"S4   S\\\!\4      S\\/\4   4S jjr#SSS\S4S\S\\   S\\   S\\   S\\   S\!S\\\4   4S jjr$S\\\4   S\S \%S\\\4   4S! jr&S" r'S# r(g)%    )AnyCallableDictOptionalTupleTypeTypeVarN   )
tensorflow)Model)TensorFlowShimkeras_model_fnsmaybe_handshake_model)
ArgsKwargsArrayXd)assert_tensorflow_installedconvert_recursiveis_tensorflow_arrayis_xp_arraytensorflow2xpxp2tensorflowInTOutTInFuncXType)boundYTypenameXYinput_shape.compile_argsreturnc                 F   ^ ^^^^ SSS.nTc  UmO0 UETEmUUUUU 4S jnU$ )aK  Decorate a custom keras subclassed model with enough information to
serialize and deserialize it reliably in the face of the many restrictions
on keras subclassed models.

name (str): The unique namespace string to use to represent this model class.
X (Any): A sample X input for performing a forward pass on the network.
Y (Any): A sample Y input for performing a backward pass on the network.
input_shape (Tuple[int, ...]): A set of input shapes for building the network.
compile: Arguments to pass directly to the keras `model.compile` call.

RETURNS (Callable): The decorated class.
adammse)	optimizerlossc                 .  >^ ^ [        U4S j5      T l        [        U4S j5      T l        [        U4S j5      T l        [        U4S j5      T l        [        U4S j5      T l        [        T5      U 4S j5       nT R                  mU4S jnUT l        T $ )Nc                    > T$ N )instr   s    X/home/james-whalen/.local/lib/python3.13/site-packages/thinc/layers/tensorflowwrapper.py<lambda>1keras_subclass.<locals>.call_fn.<locals>.<lambda>6   s    T    c                    > T$ r+   r,   )r-   r!   s    r.   r/   r0   7   s    {r1   c                    > T$ r+   r,   )r-   r"   s    r.   r/   r0   8   s    r1   c                    > T$ r+   r,   )r-   r   s    r.   r/   r0   9       1r1   c                    > T$ r+   r,   )r-   r    s    r.   r/   r0   :   r5   r1   c                     > T" U 0 UD6$ r+   r,   )	call_argscall_kwargsclazzs     r.   create_component9keras_subclass.<locals>.call_fn.<locals>.create_component<   s    )3{33r1   c                    > T" U /UQ70 UD6   [         R                  " U5        [         R                  " U5        [	        X5      U l        g ! [         a  n[        SU 35      eS nAff = f)NzIn order to serialize Keras Subclass models, the constructor arguments must be serializable. This allows thinc to recreate the code-based model with the same configuration.
The encountered error is: )srsly
json_dumpsBaseException
ValueErrorr   eg_args)selfargskwargs_errwrapped_inits       r.   __init__1keras_subclass.<locals>.call_fn.<locals>.__init__C   st    ///	  &  ( &d3DL !  1 268 s   ,A 
A)A$$A))propertycatalogue_nameeg_shape
eg_compileeg_xeg_yr   rH   )	r:   r;   rH   rG   r   r    r"   r!   r   s	   `  @r.   call_fnkeras_subclass.<locals>.call_fn4   sy    '(9:!":;#$=>n-
n-
			4 
	4 ~~	4 "r1   r,   )r   r   r    r!   r"   compile_defaultsrP   s   `````  r.   keras_subclassrS      s=    ( &,U;';*;l; B Nr1   r   tensorflow_modelconvert_inputsconvert_outputsr'   model_class
model_namec           	         [        5         [        U [        R                  R                  R
                  5      (       d  S[        U 5       3n[        U5      e[        U 5      n Uc  [        nUc  [        nU" U[        [        XS9/XS.S9$ )zWrap a TensorFlow model, so that it has the same API as Thinc models.
To optimize the model, you'll need to create a TensorFlow optimizer and call
optimizer.apply_gradients after each batch.
z%Expected tf.keras.models.Model, got: )r'   )rU   rV   )shimsattrs)r   
isinstancetfkerasmodelsr   typerA   r   _convert_inputs_convert_outputsforwardr   )rT   rU   rV   r'   rW   rX   errs          r.   TensorFlowWrapperre   X   s      !&(=(=>>5d;K6L5MNo,-=>(*.DE!/T	 r1   modelis_trainc                    ^
^^ U R                   S   nU R                   S   nU R                  S   nU" XU5      u  nm
U(       a  U" Xb5      u  nmOU" Xb5      nU" XU5      u  nmS[        S[        4U
UU4S jjn	X4$ )zzReturn the output of the wrapped TensorFlow model for the given input,
along with a callback to handle the backward pass.
rU   rV   r   dYr#   c                 4   > T" U 5      nT" U5      nT" U5      $ r+   r,   )ri   dY_tensorflowdX_tensorflowget_dXget_dY_tensorflowtensorflow_backprops      r.   backpropforward.<locals>.backprop   s"    )"-+M:m$$r1   )r[   rZ   r   r   )rf   r   rg   rU   rV   rT   X_tensorflowY_tensorflowr    rp   rm   rn   ro   s             @@@r.   rc   rc   u   s     [[!12Nkk"34O{{1~)%H=L&,<\,T))'?*5IA%T %c % %
 ;r1   c                 2  ^ U4S jn[        [        X15      n[        U[        5      (       a  S nXE4$ [        U[        5      (       a  S n[        [        5       US9U4$ [        U[
        [        45      (       a  S n[        U0 S9U4$ S n[        U40 S9U4$ )Nc                    > [        U TS9$ )N)requires_grad)r   )xrg   s    r.   r/   !_convert_inputs.<locals>.<lambda>   s    }QhGr1   c                 ,    [        [        [        U 5      $ r+   r   r   r   )dXtfs    r.   reverse_conversion+_convert_inputs.<locals>.reverse_conversion   s    $%8-NNr1   c                 D    [        [        [        U 5      nUR                  $ r+   )r   r   r   rE   r{   dXs     r.   r|   r}      s    "#6tLB99r1   )rD   rE   c                 D    [        [        [        U 5      nUR                  $ r+   r   r   r   rD   r   s     r.   r|   r}      s    "#6tLB77Nr1   c                 J    [        [        [        U 5      nUR                  S   $ )Nr   r   r   s     r.   r|   r}      s    "#6tLB771:r1   )r   r   r\   r   dicttuplelist)rf   r   rg   xp2tensorflow_	convertedr|   s     `   r.   ra   ra      s    GN!+~AI)Z((	O ,,	It	$	$	 uwy9;MMM	It}	-	-	 y46HHH	 	|B79KKKr1   c                 8    [        [        [        U5      nS nX44$ )Nc                 ,    [        [        [        U 5      $ r+   )r   r   r   )ri   s    r.   r|   ,_convert_outputs.<locals>.reverse_conversion   s     mR@@r1   rz   )rf   Ytfrg   r    r|   s        r.   rb   rb      s"    -}cBAA   r1   r+   ))typingr   r   r   r   r   r   r	   r>   compatr   r]   rf   r   rZ   r   r   r   typesr   r   utilr   r   r   r   r   r   r   r   r   r   r   strintrS   re   boolrc   ra   rb   r,   r1   r.   <module>r      sv   F F F  %  J J '  env		w'w' .2;
;; ; sCx	;
 4S>*; vh;@ *.*.#$"X& h' }	
 e  39:5d#  t dHn@U 8L@!r1   