
    i                        d dl mZmZmZmZmZmZmZ d dlZddl	m
Z ddlmZ ddlmZmZmZ ddlmZmZ ddlmZmZmZmZmZmZ  ed	      Z ed
      Z ed      Z ede      Z ede      Z 	 d$de!dede dee"df   deee!ef      deegef   fdZ#dddedfdedee   dee   dee   dee   de!deeef   fdZ$deeef   ded e%deeef   fd!Z&d" Z'd# Z(y)%    )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                 B     ddd}|ni | fd}|S )ao  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                      t        fd       _        t        fd       _        t        fd       _        t        fd       _        t        fd       _        t               fd       } j                  fd}| _         S )Nc                     S N )instr   s    o/var/www/vps2.regionflexible.com/Desarrollo/venv/lib/python3.12/site-packages/thinc/layers/tensorflowwrapper.py<lambda>z1keras_subclass.<locals>.call_fn.<locals>.<lambda>6   s    T     c                     S r+   r,   )r-   r!   s    r.   r/   z1keras_subclass.<locals>.call_fn.<locals>.<lambda>7   s    { r0   c                     S r+   r,   )r-   r"   s    r.   r/   z1keras_subclass.<locals>.call_fn.<locals>.<lambda>8   s     r0   c                     S r+   r,   )r-   r   s    r.   r/   z1keras_subclass.<locals>.call_fn.<locals>.<lambda>9       1 r0   c                     S r+   r,   )r-   r    s    r.   r/   z1keras_subclass.<locals>.call_fn.<locals>.<lambda>:   r4   r0   c                       | i |S r+   r,   )	call_argscall_kwargsclazzs     r.   create_componentz9keras_subclass.<locals>.call_fn.<locals>.create_component<   s    )3{33r0   c                      | g|i | 	 t        j                  |       t        j                  |       t	        ||      | _        y # t        $ r}t        d|       d }~ww xY w)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__z1keras_subclass.<locals>.call_fn.<locals>.__init__C   sv    ///	  &  ( &dF3DL !  1 268 s   *A 	A'A""A')propertycatalogue_nameeg_shape
eg_compileeg_xeg_yr   rF   )	r9   r:   rF   rE   r   r    r"   r!   r   s	   `  @r.   call_fnzkeras_subclass.<locals>.call_fn4   sy    '(9:!":;#$=>n-
n-
			4 
	4 ~~	4 "r0   r,   )r   r   r    r!   r"   compile_defaultsrM   s   `````  r.   keras_subclassrO      s=    ( &,U;';*;l; B Nr0   r   tensorflow_modelconvert_inputsconvert_outputsr'   model_class
model_namec                    t                t        | t        j                  j                  j
                        sdt        |        }t        |      t        |       } |t        }|t        } ||t        t        | |      g||d      S )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'   )rQ   rR   )shimsattrs)r   
isinstancetfkerasmodelsr   typer?   r   _convert_inputs_convert_outputsforwardr   )rP   rQ   rR   r'   rS   rT   errs          r.   TensorFlowWrapperra   X   s      !&(=(=>5d;K6L5MNo,-=>(*.)DE!/OT	 r0   modelis_trainc                    
 | j                   d   }| j                   d   }| j                  d   } || ||      \  }
|r |||      \  }n	 |||      } || ||      \  }dt        dt        f
fd}	||	fS )zReturn the output of the wrapped TensorFlow model for the given input,
    along with a callback to handle the backward pass.
    rQ   rR   r   dYr#   c                 4     |       } |      } |      S r+   r,   )re   dY_tensorflowdX_tensorflowget_dXget_dY_tensorflowtensorflow_backprops      r.   backpropzforward.<locals>.backprop   s"    )"-+M:m$$r0   )rW   rV   r   r   )rb   r   rc   rQ   rR   rP   X_tensorflowY_tensorflowr    rl   ri   rj   rk   s             @@@r.   r_   r_   u   s     [[!12Nkk"34O{{1~)%H=L&,<\8,T))'h?*5,IA%T %c %
 h;r0   c                 (   fd}t        t        ||      }t        |t              rd }||fS t        |t              rd }t        t               |      |fS t        |t
        t        f      rd }t        |i       |fS d }t        |fi       |fS )Nc                     t        |       S )N)requires_grad)r   )xrc   s    r.   r/   z!_convert_inputs.<locals>.<lambda>   s    }QhG r0   c                 ,    t        t        t        |       S r+   r   r   r   )dXtfs    r.   reverse_conversionz+_convert_inputs.<locals>.reverse_conversion   s    $%8-NNr0   c                 D    t        t        t        |       }|j                  S r+   )r   r   r   rC   ru   dXs     r.   rv   z+_convert_inputs.<locals>.reverse_conversion   s    "#6tLB99r0   )rB   rC   c                 D    t        t        t        |       }|j                  S r+   r   r   r   rB   rx   s     r.   rv   z+_convert_inputs.<locals>.reverse_conversion   s    "#6tLB77Nr0   c                 J    t        t        t        |       }|j                  d   S )Nr   r{   rx   s     r.   rv   z+_convert_inputs.<locals>.reverse_conversion   s    "#6tLB771:r0   )r   r   rX   r   dicttuplelist)rb   r   rc   xp2tensorflow_	convertedrv   s     `   r.   r]   r]      s    GN!+~qAI)Z(	O ,,,	It	$	 uwy9;MMM	It}	-	 y46HHH	 	|B79KKKr0   c                 :    t        t        t        |      }d }||fS )Nc                 ,    t        t        t        |       S r+   )r   r   r   )re   s    r.   rv   z,_convert_outputs.<locals>.reverse_conversion   s     mR@@r0   rt   )rb   Ytfrc   r    rv   s        r.   r^   r^      s%    -}cBAA    r0   r+   ))typingr   r   r   r   r   r   r	   r<   compatr   rY   rb   r   rV   r   r   r   typesr   r   utilr   r   r   r   r   r   r   r   r   r   r   strintrO   ra   boolr_   r]   r^   r,   r0   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@!r0   