
    il)                         d dl Z d dlZd dlmZ d dlmZmZmZmZ d dl	Z	d dl
Z
ddlmZmZ ddlmZmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ  e	j8                  ddd      Zd Z G d de      Zy)    N)BytesIO)AnyDictListOptional   )Opsget_current_ops)cupyh5py)
tensorflow)	Optimizer)
ArgsKwargsArrayXd)get_array_module   )ShimthinckerasT)entry_pointsc                 ^   	 | j                          | S # t        t        f$ r Y nw xY wdD ]  }t        | |      rt	        d       t               }|j                  dk(  rd}nt        j                  j                         }| j                  }t        j                  |      5   | j                  di | | j                  | j                         | j                  | j                          t        | d      r| j#                          n| j%                          ddd       | S # 1 sw Y   | S xY w)zCall the required predict/compile/build APIs to initialize a model if it
    is a subclass of tf.keras.Model. This is required to be able to call set_weights
    on subclassed layers.)catalogue_nameeg_xeg_yeg_shapeaB  Keras subclassed models are not whole-model serializable by TensorFlow. To work around this, you must decorate your keras model subclasses with the 'keras_subclass' decorator. The decorator requires a single X/Y input of fake-data that can be used to initialize your subclass model properly when loading the saved version.cpuCPU_make_train_functionN )
get_configAttributeErrorNotImplementedErrorhasattr
ValueErrorr
   device_typetftestgpu_device_name
eg_compiledevicecompilebuildr   predictr   r   make_train_function)keras_model	prop_nameopsr*   compile_argss        g/var/www/vps2.regionflexible.com/Desarrollo/venv/lib/python3.12/site-packages/thinc/shims/tensorflow.pymaybe_handshake_modelr4      s"    /0  D 	{I.O   C
%((*))L	6	 	.+l++../K,,-; 67,,.++-	. 	. s    &&"A6D""D,c                        e Zd ZU dZeed      ed<   ddedef fdZd Z	de
d	efd
Zde
fdZde
fdZdefdZ	 ddeeeef      fdZd Zej.                  d        Zd Zd ZdedefdZd Zd Z xZS )TensorFlowShimzInterface between a TensorFlow model and a Thinc Model. This container is
    *not* a Thinc Model subclass itself.

    Reference for custom training:
    https://www.tensorflow.org/tutorials/customization/custom_training_walkthrough
    z	tf.Tensor	gradientsmodel	optimizerc                 6    t         |   |||       d | _        y N)super__init__r7   )selfr8   configr9   	__class__s       r3   r=   zTensorFlowShim.__init__I   s    	2    c                 z    g dt         ffd}| j                  j                  |       dj                        S )Nlinec                 (    j                  |        y r;   )append)rC   liness    r3   
accumulatez*TensorFlowShim.__str__.<locals>.accumulateP   s    LLrA   )print_fn
)str_modelsummaryjoin)r>   rG   rF   s     @r3   __str__zTensorFlowShim.__str__M   s:    	S 	 	Z0yyrA   Xis_trainc                 J    |r| j                  |      S | j                  |      S r;   )begin_updater-   )r>   rO   rP   s      r3   __call__zTensorFlowShim.__call__V   s$    $$Q''<<?"rA   c                 F   t         j                  j                  j                         }t         j                  j                  j	                  d        | j
                  |j                  i |j                  }t         j                  j                  j	                  |       |S )Nr   )r&   r   backendlearning_phaseset_learning_phaserK   argskwargs)r>   rO   	old_phaseYs       r3   r-   zTensorFlowShim.predict\   sl    HH$$335	
++A.DKK,188,
++I6rA   c                 >    t         j                  j                  j                  d       t        j                         j                          j                  j                           j                  j                  i j                   fd}|fS )Nr   c                    j                  d d d        t        j                        dk(  rj                  d   g}nt        j                  d         }|j	                  
j
                  j                         j                  	||       }|d t        j                         }|dd  }
j                  Xt        |      t        
j                        k(  sJ d       t        
j                  |      D ]  \  }}|j                  |        n(|D cg c]  }t        j                  |       c}
_        t        t        |      i       S c c}w )Nr   r   )output_gradientszgradients must match)rX   rY   )__exit__lenrX   listextendrK   trainable_variablesgradientr7   zip
assign_addr&   Variabler   tuple)d_outputwrt_tensorsall_gradientsdX	opt_gradsvariablenew_variablefrO   outputr>   tapes           r3   backpropz-TensorFlowShim.begin_update.<locals>.backpropj   s#   MM$d+166{a vvayk"166!9ot{{>>? MMh * M }QVV-B%ab)I~~)9~T^^)<<T>TT<.1$..).L 6*Hl''56 ;D!DQ"++a.!D59R88 "Es   E)
r&   r   rU   rW   GradientTape	__enter__watchrX   rK   rY   )r>   rO   rs   rq   rr   s   `` @@r3   rR   zTensorFlowShim.begin_updatec   sp    
++A. 

166aff11	92 xrA   c                    | j                   t        d      t        | j                         t        | j                  j                        k(  sJ g }g }g }t        | j                   | j                  j                        D ]  \  }}|j                         }|j                         }|j                  |j                  |j                  f       |j                  |j                                |j                  |j                                 t        |d         } || j                  df|j                  |      |j                  |            \  }	}
d}t        | j                   | j                  j                        D ]F  \  }}|j                  d      \  }}|	|||z    j                  |      }|j!                  |       ||z  }H d | _         y )NzcThere are no gradients for optimization. Be sure to call begin_update before calling finish_update.r   ztensorflow-shim)r7   r$   r`   rK   rc   re   numpyrE   sizeshaperavelr   idconcatenatepopreshapeassign)r>   r9   paramsgradsshapesgradrn   paramxpflat_params
flat_gradsstartry   rz   s                 r3   finish_updatezTensorFlowShim.finish_update   s   >>!1  4>>"c$++*I*I&JJJJ !$..$++2Q2QR 	'ND(NN$E::<DMM5::u{{34MM%++-(LL&	' fQi("+WW'("..*@"..QVBW#
Z !$..$++2Q2QR 	ND( **Q-KD%5==eDEOOE"TME		
 rA   
state_dictc                     || j                         }| j                  j                  D ]D  }g }|j                  D ]   }|j	                  ||j
                            " |j                  |       F y r;   )_create_state_dictrK   layersweightsrE   nameset_weights)r>   r   layercurrent_layer_weightsweights        r3   _load_weights_from_state_dictz,TensorFlowShim._load_weights_from_state_dict   sr     002J[['' 	5E$&!-- F%,,Z-DEF34		5rA   c                     i }| j                   j                  D ]0  }|j                  D ]  }|j                         ||j                  <   ! 2 |S r;   )rK   r   r   rx   r   )r>   r   r   r   s       r3   r   z!TensorFlowShim._create_state_dict   sO    
[['' 	9E-- 9*0,,.
6;;'9	9 rA   c              #   D  K   d| j                    d}i }|j                         D ]  \  }}t        |d      s|j                  |      s%t        t        |t        j                        saJ t        |t        j                  j                  j                        rt	        j                  |      }t        |t        j                        sJ |||j                  |d      <    |r7| j                         }| j                  |       d  | j                  |       y d  y w)Ntensorflow__
startswith )r|   itemsr#   r   r   
isinstancerx   ndarraycoreasnumpyreplacer   r   )r>   r   
key_prefixr   kvbackups          r3   
use_paramszTensorFlowShim.use_params   s     "477)1-

LLN 	:DAqq,'ALL,D<%a777!!TYY^^%;%;< LLO%a77789
199Z45	: ,,.F..z:..v6s   5D D 
CD c                    | j                   j                         }t        j                  j                  j                          t        j                  j                  j                  |      | _         | j                          y)zsimilar to tf.keras.models.clone_model()
        But the tf.keras.models.clone_model changes the names of tf.Variables.
        This method even preserves that
        N)	rK   to_jsonr&   r   rU   clear_sessionmodelsmodel_from_jsonr   )r>   model_json_configs     r3   _clone_modelzTensorFlowShim._clone_model   sT    
 !KK//1
&&(hhoo556GH**,rA   c                 >   | j                   j                         }d | _         t        j                  j                  j                          t        j                  |       }t        j                  j                  j                  |      |_         |j                          |S r;   )rK   r   r&   r   rU   r   copydeepcopyr   r   r   )r>   r   copieds      r3   r   zTensorFlowShim.copy   sl     KK//1
&&(t$778IJ,,.rA   r%   	device_idc                 "   |dk(  r/t        j                  d      5  | j                          d d d        y |dk(  r>t        j                  dj                  |            5  | j                          d d d        y y # 1 sw Y   y xY w# 1 sw Y   y xY w)Nr   z/CPUgpuz/GPU:{})r&   r*   r   format)r>   r%   r   s      r3   	to_devicezTensorFlowShim.to_device   s    %6" $!!#$ $E!9++I67 $!!#$ $ "$ $$ $s   A9B9BBc                    t               }	 t        j                  |d      5 }| j                  j	                  |d       d d d        |j                         S # 1 sw Y   xY w# t        $ r$ t        | j                  d      st        d      Y nw xY wt        j                  | j                  j                         | j                  j                  | j                  j                         fS )Nwh5)save_formatr   zXCouldn't serialize to h5, and model has no factory function for component serialization.)r   r   FilerK   savegetvaluer"   r#   r$   keras_model_fnsgetr   get_weights)r>   filelikerp   s      r3   to_byteszTensorFlowShim.to_bytes   s    9		8S) 6Q   56$$&&6 6 # 	4;;(89 <  :	 	DKK667{{))4;;+B+B+DDDs(   A$ A A$ A!A$ $*BBc                    t               }|j                  dk(  rd}nt        j                  j	                         }t        |t        t        f      rt        j                  j                  j                          t        |      }|j                  d       t        j                  |d      5 }t        j                  |      5  t        j                  j                   j#                  |      | _        d d d        	 d d d        y |\  }}| j$                  t&        j)                  |      }t        j                  j                  j                          t        j                  |      5  t+        | j$                  d      r3| j$                  j,                  }	 ||	j.                  i |	j0                  }
n |       }
d d d        t3        
      | _        | j$                  j7                  |       y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   MxY w)Nr   r   r   reg_args)r
   r%   r&   r'   r(   r   rJ   bytesr   rU   r   r   seekr   r   r*   r   
load_modelrK   r   r   r#   r   rX   rY   r4   _model_initializedr   )r>   datar1   r*   r   rp   r   model_weightsmodel_fnak	new_models              r3   
from_byteszTensorFlowShim.from_bytes   s   "$??e#FWW,,.F dS%L)HH**,t}HMM!8S) QYYv& @"$((//"<"<Q"?DK@ 
 )-%;;&**>:HHH**,6" +4;;	2%)[[%8%8B ("'' ?RYY ?I (
I+ '<I&FD#.@ @ + +s1   +G6/G*0	G6%AH*G3	/G66G?H)NNr;   ) __name__
__module____qualname____doc__r   r   __annotations__r   r=   rN   r   boolrS   r-   rR   r   r   r   rJ   r   r   r   
contextlibcontextmanagerr   r   r   intr   r   r   __classcell__)r@   s   @r3   r6   r6   ?   s     [)**c 3  #* # #   j   Dy @ :>	5"4W#56	5  *-$S $S $E /rA   r6   ) r   r   ior   typingr   r   r   r   	cataloguerx   backendsr	   r
   compatr   r   r   r&   
optimizersr   typesr   r   utilr   shimr   creater   r4   r6   r   rA   r3   <module>r      sY       , ,   +  % " ' # ")""7G$G'TV/T V/rA   