o
    i                     @   s   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 deZdS )    N)Anycast   )mxnet)	Optimizer)
ArgsKwargsFloatsXd)convert_recursiveget_array_modulemake_tempfilemxnet2xpxp2mxnet   )Shimc                   @   s|   e Zd ZdZdd ZdedefddZdefdd	Zd
e	fddZ
ddddZdedefddZdd Zdd Zdd ZdS )	MXNetShimzrInterface between a MXNet model and a Thinc Model. This container is
    *not* a Thinc Model subclass itself.
    c                 C   s    |r|  |S | |dd fS )Nc                 S   s   dS )N. )ar   r   E/home/ubuntu/.local/lib/python3.10/site-packages/thinc/shims/mxnet.py<lambda>   s    z$MXNetShim.__call__.<locals>.<lambda>)begin_updatepredict)selfinputsis_trainr   r   r   __call__   s   
zMXNetShim.__call__r   returnc                 C   s^   t jjdd t j  | j|ji |j}W d   n1 s!w   Y  t jjdd |S )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   outputsr   r   r   r      s   zMXNetShim.predictc                    sB   t jjdd t jd | j ji  j} fd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                    s6   t jd t jj| ji | j tdd dd  S )NFc                 S   s
   t | dS )Ngrad)hasattrxr   r   r   r   8   s   
 z:MXNetShim.begin_update.<locals>.backprop.<locals>.<lambda>c                 S   s   | j S N)r&   r(   r   r   r   r   8   s    )r   r   set_recordingbackwardr#   r$   r	   )gradsr   r   r   backprop4   s
   z(MXNetShim.begin_update.<locals>.backprop)r   r   r    r+   r"   r#   r$   )r   r   outputr/   r   r.   r   r   *   s
   zMXNetShim.begin_update	optimizerc                 C   s  g }g }g }t  }| j  D ]/\}}ttt||}ttt|	|}	|
|	  |
|  |
|	j|	jf q|sEd S t|d }
|| jdf|
||
|\}}d}| j  D ]%\}}|d\}}||||  |}	|t|	 |  ||7 }qed S )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   r1   paramsr-   shapesctxkeyvaluer&   paramxpflat_params
flat_gradsstartr8   r9   r   r   r   finish_update=   s0   
zMXNetShim.finish_updateNrB   mx.context.Contextc                 C   s>   |d u rt  }|  }t| }|jj|d || |S )NrB   )r   r2   to_bytescopydeepcopyr"   
initialize
from_bytes)r   rB   model_bytescopiedr   r   r   rN   V   s   

zMXNetShim.copydevice_type	device_idc                 C   sL   |dkr|  t | _d S |dkr|  t | _d S d| d}t|)NcpugpuzUnexpected device_type: z. Try 'cpu' or 'gpu'.)rN   r   rV   r"   rW   
ValueError)r   rT   rU   msgr   r   r   	to_device_   s   zMXNetShim.to_devicec                 C   s^   t d}| j|j |d | }W d    n1 sw   Y  | j|d}t|S )Nw+br   )configstate)	r   r"   save_parametersnameseekreadcfgsrslymsgpack_dumps)r   tempweights_bytesrY   r   r   r   rM   h   s   



zMXNetShim.to_bytesc                 C   s&   t |}|d | _| |d  | S )Nr\   r]   )rc   msgpack_loadsrb   _load_params)r   
bytes_datarY   r   r   r   rQ   q   s   

zMXNetShim.from_bytesc                 C   sN   t d}|| | jj|jt d W d    d S 1 s w   Y  d S )Nr[   rL   )r   writer"   load_parametersr_   r   r2   )r   r@   re   r   r   r   rh   w   s   

"zMXNetShim._load_paramsr*   )rB   rK   )__name__
__module____qualname____doc__r   r   r   r   r   r   rJ   rN   strintrZ   rM   rQ   rh   r   r   r   r   r      s    			r   )rN   typingr   r   rc   compatr   r   
optimizersr   typesr   r   utilr	   r
   r   r   r   shimr   r   r   r   r   r   <module>   s   