
    i                         d dl Z d dl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 ddlmZmZmZmZmZ dd	lmZ  G d
 de      Zy)    N)Anycast   )mxnet)	Optimizer)
ArgsKwargsFloatsXd)convert_recursiveget_array_modulemake_tempfilemxnet2xpxp2mxnet   )Shimc                   j    e Zd ZdZd ZdedefdZdefdZde	fdZ
ddd
ZdedefdZd Zd Zd Zy	)	MXNetShimzrInterface between a MXNet model and a Thinc Model. This container is
    *not* a Thinc Model subclass itself.
    c                 P    |r| j                  |      S | j                  |      d fS )Nc                      y)N. )as    b/var/www/vps2.regionflexible.com/Desarrollo/venv/lib/python3.12/site-packages/thinc/shims/mxnet.py<lambda>z$MXNetShim.__call__.<locals>.<lambda>   s        )begin_updatepredict)selfinputsis_trains      r   __call__zMXNetShim.__call__   s*    $$V,,<<'66r   r   returnc                 8   t         j                  j                  d       t         j                  j                         5   | j                  |j
                  i |j                  }ddd       t         j                  j                  d       S # 1 sw Y   +xY w)zPass inputs through to the underlying MXNet model, and return the
        output. No conversions are performed. The MXNet model is set into
        evaluation mode.
        F
train_modeNT)mxautogradset_trainingpause_modelargskwargs)r   r   outputss      r   r   zMXNetShim.predict   sy    
 	  E 2[[  	A!dkk6;;@&--@G	A
  D 1	A 	As   'BBc                     t         j                  j                  d       t         j                  j                  d        | j                  j
                  i j                  }fd}||fS )a%  Pass the inputs through to the underlying MXNet model, keeping
        track of which items in the input are tensors requiring gradients.
        If the model returns a single value, it is converted into a one-element
        tuple. Return the outputs and a callback to backpropagate.
        Tr"   c                     t         j                  j                  d       t        j                  j                  | j                  i | j
                   t        d d       S )NFc                     t        | d      S )Ngrad)hasattrxs    r   r   z:MXNetShim.begin_update.<locals>.backprop.<locals>.<lambda>8   s    '!V, r   c                     | j                   S N)r/   r1   s    r   r   z:MXNetShim.begin_update.<locals>.backprop.<locals>.<lambda>8   s
     r   )r$   r%   set_recordingbackwardr)   r*   r
   )gradsr   s    r   backpropz(MXNetShim.begin_update.<locals>.backprop4   sI    KK%%e,KK  %**==$,.> r   )r$   r%   r&   r5   r(   r)   r*   )r   r   outputr8   s    `  r   r   zMXNetShim.begin_update*   s[     	  D 1
!!$'fkk;V]];	 xr   	optimizerc           	         g }g }g }t        j                         }| j                  j                         j	                         D ]  \  }}t        t        t        |j                  |                  }t        t        t        |j                  |                  }	|j                  |	j                                |j                  |j                                |j                  |	j                  |	j                  f        |sy t        |d         }
 || j                  df|
j!                  |      |
j!                  |            \  }}d}| j                  j                         j	                         D ]_  \  }}|j#                  d      \  }}||||z    j%                  |      }	|j'                  t)        |	             |j+                          ||z  }a y )Nr   z
mxnet-shim)r$   current_contextr(   collect_paramsitemsr   r	   r   r/   dataappendravelsizeshaper   idconcatenatepopreshapeset_datar   	zero_grad)r   r:   paramsr7   shapesctxkeyvaluer/   paramxpflat_params
flat_gradsstartrB   rC   s                   r   finish_updatezMXNetShim.finish_update=   s}     "++446<<> 	5JC(5::c?";<D8EJJsO#<=EMM%++-(LL&MM5::u{{34	5 fQi("+WWl#R^^F%;R^^E=R#
Z ++446<<> 	JC **Q-KD%5==eDENN8E?+OOTME	r   Nc                     |t        j                         }| j                         }t        j                  |       }|j
                  j                  |       |j                  |       |S )NrL   )r$   r<   to_bytescopydeepcopyr(   
initialize
from_bytes)r   rL   model_bytescopieds       r   rX   zMXNetShim.copyV   sV    ;$$&Cmmot$  S )+&r   device_type	device_idc                     |dk(  r)| j                  t        j                               | _        y |dk(  r)| j                  t        j                               | _        y d| d}t        |      )NcpugpuzUnexpected device_type: z. Try 'cpu' or 'gpu'.)rX   r$   ra   r(   rb   
ValueError)r   r^   r_   msgs       r   	to_devicezMXNetShim.to_device_   sW    %))BFFH-DKE!))BFFH-DK,[M9NOCS/!r   c                    t        d      5 }| j                  j                  |j                         |j	                  d       |j                         }d d d        | j                  d}t        j                  |      S # 1 sw Y   -xY w)Nw+br   )configstate)	r   r(   save_parametersnameseekreadcfgsrslymsgpack_dumps)r   tempweights_bytesrd   s       r   rW   zMXNetShim.to_bytesh   sn    5! 	(TKK''		2IIaL IIKM	( M:""3''	( 	(s   AA??Bc                 l    t        j                  |      }|d   | _        | j                  |d          | S )Nrh   ri   )ro   msgpack_loadsrn   _load_params)r   
bytes_datard   s      r   r[   zMXNetShim.from_bytesq   s4    !!*-x=#g,'r   c                     t        d      5 }|j                  |       | j                  j                  |j                  t        j                                d d d        y # 1 sw Y   y xY w)Nrg   rV   )r   writer(   load_parametersrk   r$   r<   )r   rJ   rq   s      r   ru   zMXNetShim._load_paramsw   sU    5! 	MTJJvKK''		r7I7I7K'L	M 	M 	Ms   AA  A)r4   )rL   zmx.context.Context)__name__
__module____qualname____doc__r   r   r   r   r   r   rT   rX   strintre   rW   r[   ru   r   r   r   r   r      s_    7	j 	S 	 :  &y 2"S "S "(Mr   r   )rX   typingr   r   ro   compatr   r$   
optimizersr   typesr   r	   utilr
   r   r   r   r   shimr   r   r   r   r   <module>r      s6         " (  gM gMr   