
    h                         S SK r S SK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  SSKJrJrJrJrJr  SS	KJr   " S
 S\5      rg)    N)Anycast   )mxnet)	Optimizer)
ArgsKwargsFloatsXd)convert_recursiveget_array_modulemake_tempfilemxnet2xpxp2mxnet   )Shimc                   ~    \ rS rSrSrS rS\S\4S jrS\4S jr	S\
4S	 jrSSS jjrS\S\4S jrS rS rS rSrg
)	MXNetShim   zjInterface between a MXNet model and a Thinc Model. This container is
*not* a Thinc Model subclass itself.
c                 Z    U(       a  U R                  U5      $ U R                  U5      S 4$ )Nc                     g)N. )as    K/home/james-whalen/.local/lib/python3.13/site-packages/thinc/shims/mxnet.py<lambda>$MXNetShim.__call__.<locals>.<lambda>   s    3    )begin_updatepredict)selfinputsis_trains      r   __call__MXNetShim.__call__   s*    $$V,,<<'66r   r   returnc                 6   [         R                  R                  SS9  [         R                  R                  5          U R                  " UR
                  0 UR                  D6nSSS5        [         R                  R                  SS9  W$ ! , (       d  f       N-= f)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   MXNetShim.predict   sl    
 	  E 2[[ kk6;;@&--@G !
  D 1 ! s   'B


Bc                    ^ [         R                  R                  SS9  [         R                  R                  S5        U R                  " TR
                  0 TR                  D6nU4S jnX#4$ )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                    > [         R                  R                  S5        [         R                  R                  " U R                  0 U R
                  D6  [        S S T5      $ )NFc                     [        U S5      $ )Ngrad)hasattrxs    r   r   :MXNetShim.begin_update.<locals>.backprop.<locals>.<lambda>8   s    '!V,r   c                     U R                   $ N)r3   r5   s    r   r   r7   8   s    r   )r'   r(   set_recordingbackwardr,   r-   r
   )gradsr   s    r   backprop(MXNetShim.begin_update.<locals>.backprop4   sI    KK%%e,KK  %**==$,.> r   )r'   r(   r)   r:   r+   r,   r-   )r   r   outputr=   s    `  r   r   MXNetShim.begin_update*   sW     	  D 1
!!$'fkk;V]];	 r   	optimizerc           	         / n/ n/ n[         R                  " 5       nU R                  R                  5       R	                  5        H  u  pg[        [        [        UR                  U5      5      5      n[        [        [        UR                  U5      5      5      n	UR                  U	R                  5       5        UR                  UR                  5       5        UR                  U	R                  U	R                  45        M     U(       d  g [        US   5      n
U" U R                  S4U
R!                  U5      U
R!                  U5      5      u  pSnU R                  R                  5       R	                  5        H[  u  pgUR#                  S5      u  pXX-    R%                  U5      n	UR'                  [)        U	5      5        UR+                  5         X-  nM]     g )Nr   z
mxnet-shim)r'   current_contextr+   collect_paramsitemsr   r	   r   r3   dataappendravelsizeshaper   idconcatenatepopreshapeset_datar   	zero_grad)r   rA   paramsr<   shapesctxkeyvaluer3   paramxpflat_params
flat_gradsstartrI   rJ   s                   r   finish_updateMXNetShim.finish_update=   se     "++446<<>JC(5::c?";<D8EJJsO#<=EMM%++-(LL&MM5::u{{34 ? fQi("+WWl#R^^F%;R^^E=R#
 ++446<<>JC **Q-KD5==eDENN8E?+OOME ?r   Nc                     Uc  [         R                  " 5       nU R                  5       n[        R                  " U 5      nUR
                  R                  US9  UR                  U5        U$ )NrS   )r'   rC   to_bytescopydeepcopyr+   
initialize
from_bytes)r   rS   model_bytescopieds       r   r`   MXNetShim.copyV   sV    ;$$&Cmmot$  S )+&r   device_type	device_idc                     US:X  a*  U R                  [        R                  " 5       5      U l        g US:X  a*  U R                  [        R                  " 5       5      U l        g SU S3n[        U5      e)NcpugpuzUnexpected device_type: z. Try 'cpu' or 'gpu'.)r`   r'   rj   r+   rk   
ValueError)r   rg   rh   msgs       r   	to_deviceMXNetShim.to_device_   sW    %))BFFH-DKE!))BFFH-DK,[M9NOCS/!r   c                 "   [        S5       nU R                  R                  UR                  5        UR	                  S5        UR                  5       nS S S 5        U R                  WS.n[        R                  " U5      $ ! , (       d  f       N3= f)Nw+br   )configstate)	r   r+   save_parametersnameseekreadcfgsrslymsgpack_dumps)r   tempweights_bytesrm   s       r   r_   MXNetShim.to_bytesh   sg    5!TKK''		2IIaL IIKM " M:""3'' "!s   AB  
Bc                 n    [         R                  " U5      nUS   U l        U R                  US   5        U $ )Nrr   rs   )ry   msgpack_loadsrx   _load_params)r   
bytes_datarm   s      r   rc   MXNetShim.from_bytesq   s4    !!*-x=#g,'r   c                     [        S5       nUR                  U5        U R                  R                  UR                  [
        R                  " 5       S9  S S S 5        g ! , (       d  f       g = f)Nrq   r^   )r   writer+   load_parametersru   r'   rC   )r   rQ   r{   s      r   r   MXNetShim._load_paramsw   sH    5!TJJvKK''		r7I7I7K'L "!!s   A	A
A,)r+   rx   r9   )rS   zmx.context.Context)__name__
__module____qualname____firstlineno____doc__r!   r   r   r   r   r   r[   r`   strintrn   r_   rc   r   __static_attributes__r   r   r   r   r      s_    7	j 	S 	 :  &y 2"S "S "(Mr   r   )r`   typingr   r   ry   compatr   r'   
optimizersr   typesr   r	   utilr
   r   r   r   r   shimr   r   r   r   r   <module>r      s6         " (  gM gMr   