Ë
    ›¾jÛ  ã                   óŠ   — 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    ú[/home/spazio/kingdom_calls/work5/transenv/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)z­Pass 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Ø!�d—k‘k 6§;¡;Ð@°&·-±-Ñ@ˆ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   ø€ Ü�K‰K×%Ñ% eÔ,Ü�K‰K× Ñ  %§*¡*Ð=°·±Ò=Ü$Ù,Ñ.>Àóð r   )r$   r%   r&   r5   r(   r)   r*   )r   r   Úoutputr8   s    `  r   r   zMXNetShim.begin_update*   s[   ø€ ô 	�‰× Ñ ¨DÐ Ô1Ü
�‰×!Ñ! $Ô'Ø�—‘˜fŸk™kÐ;¨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×<Ñ<Ó>ò 	5‰JˆC�Üœ¤(¨5¯:©:°c«?Ó";Ó<ˆDÜœ¤8¨E¯J©J°s«OÓ#<Ó=ˆEØ�M‰M˜%Ÿ+™+›-Ô(Ø�L‰L˜Ÿ™›Ô&Ø�M‰M˜5Ÿ:™: u§{¡{Ð3Õ4ð	5ñ ØÜ˜f Q™iÓ(ˆÙ"+Ø�W‰W�lÐ# R§^¡^°FÓ%;¸R¿^¹^ÈEÓ=Ró#
Ñˆ�Zð ˆØŸ+™+×4Ñ4Ó6×<Ñ<Ó>ò 	‰JˆC�Ø Ÿ*™* Q›-‰KˆD�%Ø ¨°©Ð5×=Ñ=¸eÓDˆEØ�N‰Nœ8 E›?Ô+Ø�O‰OÔØ�T‰M‰Eñ	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Ø—m‘m“oˆÜ—‘˜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   € Ø˜%ÒØŸ)™)¤B§F¡F£HÓ-ˆD�KØ˜EÒ!ØŸ)™)¤B§F¡F£HÓ-ˆD�Kà,¨[¨MÐ9NÐOˆCÜ˜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Ø�K‰K×'Ñ'¨¯	©	Ô2Ø�I‰I�aŒLØ ŸI™I›KˆM÷	(ð Ÿ™¨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Ø�J‰J�vÔØ�K‰K×'Ñ'¨¯	©	´r×7IÑ7IÓ7KÐ'Ô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   