Ë
    ›¾j¹  ã                   ó<  — d dl mZmZmZmZmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZmZmZmZmZ  ej(                  d«      d	d	e	d
fdee   dee   dee	   dede	eef   f
d„«       Zde	dededeeef   fd„Zde	dededeeeegef   f   fd„Zde	dedefd„Zy	)é    )ÚAnyÚCallableÚOptionalÚTupleÚTypeé   )Úregistry)ÚModel)Ú	MXNetShim)Ú
ArgsKwargs)Úconvert_recursiveÚis_mxnet_arrayÚis_xp_arrayÚmxnet2xpÚxp2mxnetzMXNetWrapper.v1NÚmxnetÚconvert_inputsÚconvert_outputsÚmodel_classÚ
model_nameÚreturnc                 ó\   — |€t         }|€t        } ||t        ||dœt        | «      g¬«      S )a)  Wrap a MXNet model, so that it has the same API as Thinc models.
    To optimize the model, you'll need to create a MXNet optimizer and call
    optimizer.step() after each batch.

    Your MXNet model's forward method can take arbitrary args and kwargs,
    but must return either a single tensor as output or a tuple. You may find the
    MXNet register_forward_hook helpful if you need to adapt the output.

    The convert functions are used to map inputs and outputs to and from your
    MXNet model. Each function should return the converted output, and a callback
    to use during the backward pass. So:

        Xmxnet, get_dX = convert_inputs(X)
        Ymxnet, mxnet_backprop = model.shims[0](Xmxnet, is_train)
        Y, get_dYmxnet = convert_outputs(Ymxnet)

    To allow maximum flexibility, the MXNetShim expects ArgsKwargs objects
    on the way into the forward and backward passes. The ArgsKwargs objects
    will be passed straight into the model in the forward pass, and straight
    into `mxnet.autograd.backward` during the backward pass.
    )r   r   )ÚattrsÚshims)Úconvert_mxnet_default_inputsÚconvert_mxnet_default_outputsÚforwardr   )Úmxnet_modelr   r   r   r   s        úc/home/spazio/kingdom_calls/work5/transenv/lib/python3.12/site-packages/thinc/layers/mxnetwrapper.pyÚMXNetWrapperr    
   s@   € ð: ÐÜ5ˆØÐÜ7ˆÙØÜØ!/ÀOÑTÜ˜Ó%Ð&ô	ð ó    ÚmodelÚXÚis_trainc                 óÞ   ‡	‡
‡— | j                   d   }| j                   d   } || ||«      \  }Š	 | j                  d   ||«      \  }Š || ||f|«      \  }Š
dt        dt        fˆ	ˆ
ˆfd„}||fS )z}Return the output of the wrapped MXNet model for the given input,
    along with a callback to handle the backward pass.
    r   r   r   ÚdYr   c                 ó8   •—  ‰| «      } ‰|«      } ‰|«      }|S ©N© )r&   ÚdYmxnetÚdXmxnetÚdXÚget_dXÚget_dYmxnetÚmxnet_backprops       €€€r   Úbackpropzforward.<locals>.backprop>   s$   ø€ Ù˜b“/ˆÙ  Ó)ˆÙ�G‹_ˆØˆ	r!   )r   r   r   )r"   r#   r$   r   r   ÚXmxnetÚYmxnetÚYr0   r-   r.   r/   s            @@@r   r   r   3   s…   ú€ ð —[‘[Ð!1Ñ2€NØ—k‘kÐ"3Ñ4€Oá# E¨1¨hÓ7�N€FˆFØ+˜UŸ[™[¨™^¨F°HÓ=Ñ€FˆNÙ$ U¨Q°¨K¸ÓB�N€A€{ð”Sð œS÷ ð ˆhˆ;Ðr!   c                 ó:  ‡— ˆfd„}t        t        ||«      }t        |t        «      rd„ }||fS t        |t        «      rd„ }t        t        «       |¬«      |fS t        |t
        t        f«      rd„ }t        t        |«      i ¬«      |fS d„ }t        |fi ¬«      |fS )Nc                 ó   •— t        | ‰¬«      S )N)Úrequires_grad)r   )Úxr$   s    €r   ú<lambda>z.convert_mxnet_default_inputs.<locals>.<lambda>M   s   ø€ œ( 1°HÔ=€ r!   c                 ó,   — t        t        t        | «      S r(   )r   r   r   )r+   s    r   Úreverse_conversionz8convert_mxnet_default_inputs.<locals>.reverse_conversionQ   s   € Ü$¤^´X¸wÓGÐGr!   c                 óD   — t        t        t        | «      }|j                  S r(   )r   r   r   Úkwargs©r+   r,   s     r   r:   z8convert_mxnet_default_inputs.<locals>.reverse_conversionW   s   € Ü"¤>´8¸WÓEˆBØ—9‘9Ðr!   ©Úargsr<   c                 óD   — t        t        t        | «      }|j                  S r(   ©r   r   r   r?   r=   s     r   r:   z8convert_mxnet_default_inputs.<locals>.reverse_conversion^   s   € Ü"¤>´8¸WÓEˆBØ—7‘7ˆNr!   c                 óJ   — t        t        t        | «      }|j                  d   S )Nr   rA   r=   s     r   r:   z8convert_mxnet_default_inputs.<locals>.reverse_conversione   s   € Ü"¤>´8¸WÓEˆBØ—7‘7˜1‘:Ðr!   )r   r   Ú
isinstancer   ÚdictÚtupleÚlist)r"   r#   r$   Ú	xp2mxnet_Ú	convertedr:   s     `   r   r   r   J   s¥   ø€ ó >€IÜ!¤+¨y¸!Ó<€IÜ�)œZÔ(ò	Hð Ð,Ð,Ð,Ü	�IœtÔ	$ò	ô œu›w¨yÔ9Ð;MÐMÐMÜ	�I¤¤t˜}Ô	-ò	ô œu YÓ/¸Ô;Ð=OÐOÐOò	ô  	˜|°BÔ7Ð9KÐKÐKr!   ÚX_Ymxnetc                 ód   ‡— |\  }Št        t        t        ‰«      }dt        dt        fˆfd„}||fS )Nr&   r   c                 óP   •— t        t        t        | «      }t        ‰ffd|i¬«      S )NÚ
head_gradsr>   )r   r   r   r   )r&   r*   r2   s     €r   r:   z9convert_mxnet_default_outputs.<locals>.reverse_conversionp   s'   ø€ Ü#¤K´¸2Ó>ˆÜ  	˜|°\À7Ð4KÔLÐLr!   )r   r   r   r   r   )r"   rI   r$   r#   r3   r:   r2   s         @r   r   r   l   s>   ø€ Ø�I€A€vÜœ.¬(°FÓ;€AðMœsð M¤zõ Mð Ð Ð Ð r!   )Útypingr   r   r   r   r   Úconfigr	   r"   r
   r   r   Útypesr   Úutilr   r   r   r   r   ÚlayersÚstrr    Úboolr   r   r   r)   r!   r   ú<module>rT      s  ðß 7Õ 7å Ý Ý Ý ß UÕ Uð €‡�Ð"Ó#ð *.Ø*.Ø$Øñ%à˜XÑ&ð%ð ˜hÑ'ð%ð �e‘ð	%ð
 ð%ð ˆ3�ˆ8�_ò%ó $ð%ðP�5ð ˜Sð ¨Dð °U¸3À¸=Ñ5Ió ð.LØðLØðLØ$(ðLà
ˆ:�x  ¨cÐ 1Ñ2Ð2Ñ3óLðD!¨ð !¸#ð !Èô !r!   