Ë
    ›¾jS  ã            
       óJ  — U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZ d dlmZmZmZmZmZmZmZmZmZmZmZ d dlZd dlmZmZ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&m'Z'm(Z(m)Z)m*Z*m+Z+ dd
l!m,Z- ddl!m.Z/ ddl!m0Z0  e	dd¬«      Z1e	e2   e3d<   d dlm4Z4 ddl5m6Z6 ddl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< e4rddl=m>Z> dhd„Z?d„ Z@d„ ZAdideBddfd„ZCdede2fd„ZDdede2fd„ZEdede2fd„ZFdede2fd„ZGdede2fd „ZHdede2fd!„ZIdede2fd"„ZJdede2fd#„ZKdede2fd$„ZLdede2fd%„ZMdede2fd&„ZNd'„ ZOd(eBdd)fd*„ZPde2fd+„ZQdid(eBde2fd,„ZRdid(eBde2fd-„ZSd.e8d/e8ddfd0„ZT	 djd1d2œd3e:d4eeB   d5eUde9fd6„ZVd7d8œd9ee8e<e;ee8   f   d:eBdeBfd;„ZWdkd<„ZXdkd=„ZYdkd>„ZZd?eege2f   d@eegef   dedefdA„Z[d?eege2f   dedefdB„Z\	 	 dldCe8dDe2dEed   ddFfdG„Z]ddHœdIdFdJedK   de8fdL„Z^	 dmdCe8dDe2dMe2ddNfdO„Z_ddHœdPdNdJedK   de8fdQ„Z`	 dndCe8dDe2ddRfdS„ZaddHœdTdRdJedK   de8fdU„Zb edV«      ZcdWedXecf   dYedZededXecf   fd[„Zd G d\„ d]ee«      Zfd^egdWeeee2gef   d9ed3eddf
d_„Zhe jÒ                  dod`„«       Zje jÒ                  da„ «       Zke jÒ                  dpdbegdceBfdd„«       Zle G de„ df«      «       Zmg dg¢Zny)qé    N)Ú
ContextVar)Ú	dataclass)ÚAnyÚCallableÚDictÚListÚMappingÚOptionalÚSequenceÚTupleÚTypeVarÚUnionÚcast)ÚSchemaÚValidationErrorÚvalidate_type)ÚVersion)Útableé   )
ÚcupyÚcupy_from_dlpackÚhas_cupyÚhas_cupy_gpuÚhas_gpuÚ	has_mxnetÚhas_tensorflowÚ	has_torchÚhas_torch_cuda_gpuÚhas_torch_mps)Úmxnet)Ú
tensorflow)ÚtorchÚDATA_VALIDATIONF)Údefault)ÚTYPE_CHECKING)Útypes)Ú
ArgsKwargsÚArrayXdÚFloatsXdÚIntsXdÚPaddedÚRagged)ÚOpsÚreturnútorch.devicec                  óF  — t         €t        d«      ‚ddlm}  ddlm} ddlm}  | «       }t        ||«      r6t         j                  j                  «       }t        j                  d|› �«      S t        ||«      rt        j                  d«      S t        j                  d«      S )	Nz<Cannot get default Torch device when Torch is not available.r   )Úget_current_ops)ÚCupyOps)ÚMPSOpszcuda:ÚmpsÚcpu)r"   Ú
ValueErrorÚbackendsr1   Úbackends.cupy_opsr2   Úbackends.mps_opsr3   Ú
isinstanceÚcudaÚcurrent_deviceÚdevice)r1   r2   r3   ÚopsÚ	device_ids        úT/home/spazio/kingdom_calls/work5/transenv/lib/python3.12/site-packages/thinc/util.pyÚget_torch_default_devicerA   9   s~   € Ü€}ÜÐWÓXÐXå)Ý*Ý(á
Ó
€CÜ�#�wÔÜ—J‘J×-Ñ-Ó/ˆ	Ü�|‰|˜e I ;Ð/Ó0Ð0Ü	�C˜Ô	 Ü�|‰|˜EÓ"Ð"ä�<‰<˜ÓÐó    c                 óv   — t        | «      rt        S t        | «      rt        S t	        dt        | «      › d�«      ‚)Nz4Only numpy and cupy arrays are supported, but found z` instead. If get_array_module module wasn't called directly, this might indicate a bug in Thinc.)Úis_numpy_arrayÚnumpyÚis_cupy_arrayr   r6   Útype)Úarrs    r@   Úget_array_modulerI   K   sA   € Ü�cÔÜˆÜ	�sÔ	ÜˆäðÜ ›9˜+ð &<ð<ó
ð 	
rB   c                  ó   — t         S ©N)r   © rB   r@   Úgpu_is_availablerM   Y   s   € Ü€NrB   Úseedc                 óÐ  — t        j                  | «       t        j                   j                  | dz  «       t        rt	        j
                  | dz  «       t        r‹t        j                   j                  | «       t        ret        r^t        j                  j                  | «       dt        j                  j                  _        dt        j                  j                  _        yyyy)z@Set the random seed across random, numpy.random and cupy.random.l        l   ÿÿÿÿ TFN)ÚrandomrN   rE   r   r"   Úmanual_seedr   r   r   r;   Úmanual_seed_allr7   ÚcudnnÚdeterministicÚ	benchmark)rN   s    r@   Úfix_random_seedrV   ]   sž   € ä
‡K�K�ÔÜ	‡L�L×Ñ�d˜U‘lÔ#Ýô 	×Ñ˜$Ð!6Ñ6Ô7Ýô 	�‰×Ñ˜ÔÝÕ+ô �J‰J×&Ñ& tÔ,Ø15ŒE�N‰N× Ñ Ô.Ø-2ŒE�N‰N× Ñ Õ*ð ,ˆ9ð	 rB   Úobjc                 ó2   — t        | «      xs t        | «      S )z1Check whether an object is a numpy or cupy array.)rD   rF   ©rW   s    r@   Úis_xp_arrayrZ   q   s   € ä˜#ÓÒ4¤-°Ó"4Ð4rB   c                 óH   — t         syt        | t        j                  «      ryy)z(Check whether an object is a cupy array.FT)r   r:   r   ÚndarrayrY   s    r@   rF   rF   v   s   € åØÜ	�CœŸ™Ô	&ØàrB   c                 ó:   — t        | t        j                  «      ryy)z)Check whether an object is a numpy array.TF)r:   rE   r\   rY   s    r@   rD   rD   €   s   € ä�#”u—}‘}Ô%ØàrB   c                 óH   — t         €yt        | t         j                  «      ryy©NFT)r"   r:   ÚTensorrY   s    r@   Úis_torch_arrayra   ˆ   s   € Ü€}ØÜ	�CœŸ™Ô	&ØàrB   c                 ó4   — t        | «      xr | j                  S rK   )ra   Úis_cudarY   s    r@   Úis_torch_cuda_arrayrd   ‘   s   € Ü˜#ÓÒ. 3§;¡;Ð.rB   c                 ó2   — t        | «      xs t        | «      S rK   )rd   Úis_torch_mps_arrayrY   s    r@   Úis_torch_gpu_arrayrg   •   s   € Ü˜sÓ#Ò>Ô'9¸#Ó'>Ð>rB   c                 óP   — t        | «      xr t        | d«      xr | j                  S )NÚis_mps)ra   Úhasattrri   rY   s    r@   rf   rf   ™   s"   € Ü˜#ÓÒH¤7¨3°Ó#9ÒH¸c¿j¹jÐHrB   c                 óH   — t         syt        | t        j                  «      ryyr_   )r   r:   Útfr`   rY   s    r@   Úis_tensorflow_arrayrm   �   s   € ÝØÜ	�CœŸ™Ô	#ØàrB   c                 ó8   — t        | «      xr d| j                  v S )NzGPU:)rm   r=   rY   s    r@   Úis_tensorflow_gpu_arrayro   ¦   s   € Ü˜sÓ#Ò<¨°#·*±*Ð(<Ð<rB   c                 ó\   — t         syt        | t        j                  j                  «      ryyr_   )r   r:   ÚmxÚndÚNDArrayrY   s    r@   Úis_mxnet_arrayrt   ª   s    € ÝØÜ	�CœŸ™Ÿ™Ô	'ØàrB   c                 óN   — t        | «      xr | j                  j                  dk7  S )Nr5   )rt   ÚcontextÚdevice_typerY   s    r@   Úis_mxnet_gpu_arrayrx   ³   s!   € Ü˜#ÓÒC 3§;¡;×#:Ñ#:¸eÑ#CÐCrB   c                 óÄ   — t        | t        j                  «      r| S t        r*t        | t        j                  «      r| j                  «       S t        j                  | «      S rK   )r:   rE   r\   r   r   ÚgetÚarray)Údatas    r@   Úto_numpyr}   ·   s@   € Ü�$œŸ™Ô&ØˆÝ	”j ¤t§|¡|Ô4Ø�x‰x‹zÐä�{‰{˜4Ó Ð rB   Úgpu_idzcupy.cuda.Devicec                 óä   — t         st        d«      ‚t        j                  j                  j                  | «      }|j                  «        t        rt        j                  j                  | «       |S )z=Set the current GPU device for cupy and torch (if available).zNo CUDA GPU devices detected)
r   r6   r   r;   r=   ÚDeviceÚuser   r"   Ú
set_device)r~   r=   s     r@   Úset_active_gpurƒ   À   sN   € åÜÐ7Ó8Ð8ä�Y‰Y×Ñ×$Ñ$ VÓ,€FØ
‡J�J„LåÜ�
‰
×Ñ˜fÔ%à€MrB   c                  ó4   — ddl m} m}  | d«      } ||«       y)z'Use CPU through best available backend.r   )Úget_opsÚset_current_opsr5   T)r7   r…   r†   )r…   r†   r>   s      r@   Úrequire_cpur‡   Î   s   € ç2á
�%‹.€CÙ�CÔàrB   c                 ó2   — t         rt        | ¬«       t         S )z?Use GPU if it's available. Returns True if so, False otherwise.©r~   )r   Úrequire_gpur‰   s    r@   Ú
prefer_gpur‹   Ø   s   € åÜ˜6Õ"Ü€NrB   c                 óT  — ddl m}m}m} t	        j
                  «       dk(  r"t        st        rt        d«      ‚t        d«      ‚t	        j
                  «       dk7  rt        st        d«      ‚t        st        d«      ‚t        r | |«       «       t        | «       y | |«       «       y)	Nr   )r2   r3   r†   ÚDarwinz6Cannot use GPU, installed PyTorch does not support MPSz(Cannot use GPU, PyTorch is not installedz%Cannot use GPU, CuPy is not installedzNo GPU devices detectedT)r7   r2   r3   r†   ÚplatformÚsystemr   r   r6   r   r   r   rƒ   )r~   r2   r3   r†   s       r@   rŠ   rŠ   ß   s‰   € ß:Ñ:ä‡�Ó˜HÒ$­]ÝÜÐUÓVÐVÜÐCÓDÐDÜ	�‰Ó	˜hÒ	&­xÜÐ@ÓAÐAÝÜÐ2Ó3Ð3åÙ™›	Ô"Ü�vÔð ñ 	™›Ô!àrB   ÚdstÚsrcc                 ó  — t        | t        j                  «      r t        |t        j                  «      r|| d d  y t        | «      r.t	        j
                  |d¬«      }t	        j                  | |«       y t        j                  | |«       y )NF)Úcopy)r:   rE   r\   rF   r   r{   Úcopyto)r�   r‘   s     r@   Ú
copy_arrayr•   ô   sZ   € Ü�#”u—}‘}Ô%¬*°S¼%¿-¹-Ô*HØˆ‰A‰Ü	�sÔ	Ü�j‰j˜ 5Ô)ˆÜ�‰�C˜Õä�‰�S˜#ÕrB   ç        )Úlabel_smoothingÚYÚ	n_classesr—   c          	      ó”  — |€!t        t        j                  | «      dz   «      }|dk  rt        d«      ‚|dk(  r|dk(  rt        d«      ‚d}n|dkD  st        d|› d�«      ‚||dz
  z  }|dz
  |z  }|dkD  r||k\  rt        d|› d	|› d
|› d�«      ‚t	        | «      }|j                  ||f|d¬«      }|j                  |d|z
  «       ||    S )Nr   r–   z>Label-smoothing parameter has to be greater than or equal to 0r   zn_classes should be at least 1zGn_classes should be greater than 1 when label smoothing is enabled,but z was provided.zFor z7 classes label_smoothing parameter has to be less than z, but found ú.Úfloat32)Údtype)ÚintrE   Úmaxr6   rI   ÚfullÚfill_diagonal)r˜   r™   r—   Únongold_probÚ
max_smoothÚxpÚlabel_distrs          r@   Úto_categoricalr¦   þ   s  € ð ÐÜœŸ	™	 !› qÑ(Ó)ˆ	à˜ÒÜØLó
ð 	
ð ˜#ÒØ˜Š>ÜÐ=Ó>Ð>Ø‰à˜1Š}ÜðØ �k ð1óð ð '¨)°a©-Ñ8ˆà˜a‘- 9Ñ,€JØ�1‚}˜¨JÒ6ÜØ�9�+ð =àˆl˜, Ð&7°qð:ó
ð 	
ô 
˜!Ó	€BØ—'‘'˜9 iÐ0°,Ài�'ÓP€KØ×Ñ�[ ! oÑ"5Ô6Ø�q‰>ÐrB   éÿÿÿÿ©ÚdimÚXr©   c                ó*  — t        | t        «      rt        | j                  |¬«      S t        | t        «      rt        | j                  |¬«      S t        | d«      rxt        | d«      rlt        t        | «      } t        | j                  «      dk(  ryt        | j                  «      dk(  rt        | j                  «       «      dz   S | j                  |   S t        | t        t        f«      rt        | «      dk(  ryt        | d   |¬«      S d}t        |«      ‚)zrInfer the 'width' of a batch of data, which could be any of: Array,
    Ragged, Padded or Sequence of Arrays.
    r¨   ÚshapeÚndimr   r   z=Cannot get width of object: has neither shape nor __getitem__)r:   r,   Ú	get_widthr|   r+   rj   r   r(   Úlenr¬   rž   rŸ   ÚlistÚtupler6   )rª   r©   Úerrs      r@   r®   r®   &  sÛ   € ô �!”VÔÜ˜Ÿ™ SÔ)Ð)Ü	�A”vÔ	Ü˜Ÿ™ SÔ)Ð)Ü	��GÔ	¤¨¨FÔ!3Ü”˜!ÓˆÜˆq�w‰w‹<˜1ÒØÜ�—‘‹\˜QÒÜ�q—u‘u“w“< !Ñ#Ð#à—7‘7˜3‘<ÐÜ	�Aœœe�}Ô	%Üˆq‹6�QŠ;Øä˜Q˜q™T sÔ+Ð+àMˆÜ˜‹oÐrB   c                  óJ   — d} t         st        | j                  d¬«      «      ‚y)z4Raise an ImportError if TensorFlow is not installed.z~TensorFlow support requires {pkg}: pip install thinc[tensorflow]

Enable TensorFlow support with thinc.api.enable_tensorflow()ztensorflow>=2.0.0,<2.6.0)ÚpkgN)r   ÚImportErrorÚformat)Útemplates    r@   Úassert_tensorflow_installedr¸   B  s)   € ð R€HÝÜ˜(Ÿ/™/Ð.H˜/ÓIÓJÐJð rB   c                  ó&   — t         st        d«      ‚y)z/Raise an ImportError if MXNet is not installed.zjMXNet support requires mxnet: pip install thinc[mxnet]

Enable MXNet support with thinc.api.enable_mxnet()N)r   rµ   rL   rB   r@   Úassert_mxnet_installedrº   I  s   € åÜØzó
ð 	
ð rB   c                  ó&   — t         st        d«      ‚y)z1Raise an ImportError if PyTorch is not installed.z8PyTorch support requires torch: pip install thinc[torch]N)r   rµ   rL   rB   r@   Úassert_pytorch_installedr¼   Q  s   € åÜÐTÓUÐUð rB   Úis_matchÚconvert_itemc                 óü  ‡ ‡—  ‰ |«      r ‰|«      S t        |t        «      r9t        ‰ ‰t        |j	                  «       «      «      }t        j
                  |«      S t        |t        «      r;i }|j	                  «       D ]$  \  }}t        ‰ ‰|«      }t        ‰ ‰|«      }|||<   Œ& |S t        |t        «      r|D �cg c]  }t        ‰ ‰|«      ‘Œ c}S t        |t        «      rt        ˆˆ fd„|D «       «      S |S c c}w )zîEither convert a single value if it matches a given function, or
    recursively walk over potentially nested lists, tuples and dicts applying
    the conversion, and returns the same type. Also supports the ArgsKwargs
    dataclass.
    c              3   ó8   •K  — | ]  }t        ‰‰|«      –— Œ y ­wrK   )Úconvert_recursive)Ú.0Úitemr¾   r½   s     €€r@   ú	<genexpr>z$convert_recursive.<locals>.<genexpr>n  s   øè ø€ ÒUÈÔ& x°¸t×DÑUùs   ƒ)r:   r'   rÁ   r°   ÚitemsÚ
from_itemsÚdictr±   )r½   r¾   rW   Ú	convertedÚkeyÚvaluerÃ   s   ``     r@   rÁ   rÁ   W  sì   ù€ ñ �„}Ù˜CÓ Ð Ü	�CœÔ	$Ü% h°¼dÀ3Ç9Á9Ã;Ó>OÓPˆ	Ü×$Ñ$ YÓ/Ð/Ü	�CœÔ	Øˆ	ØŸ)™)›+ò 	#‰JˆC�Ü# H¨l¸CÓ@ˆCÜ% h°¸eÓDˆEØ"ˆI�cŠNð	#ð ÐÜ	�CœÔ	ØLOÖPÀDÔ! (¨L¸$Õ?ÒPÐPÜ	�CœÔ	ÜÔUÐQTÔUÓUÐUàˆ
ùò	 Qs   Â;C9c              #   óÈ  K  —  | |«      r|–— yt        |t        «      r,t        | t        |j	                  «       «      «      E d{  –—†  yt        |t
        «      rA|j	                  «       D ]-  \  }}t        | |«      E d{  –—†  t        | |«      E d{  –—†  Œ/ yt        |t        «      st        |t        «      r|D ]  }t        | |«      E d{  –—†  Œ yy7 Œ“7 ŒZ7 ŒH7 Œ­w)zÎEither yield a single value if it matches a given function, or recursively
    walk over potentially nested lists, tuples and dicts yielding matching
    values. Also supports the ArgsKwargs dataclass.
    N)r:   r'   Úiterate_recursiver°   rÅ   rÇ   r±   )r½   rW   rÉ   rÊ   rÃ   s        r@   rÌ   rÌ   s  sË   è ø€ ñ
 �„}Ø‹	Ü	�CœÔ	$Ü$ X¬t°C·I±I³KÓ/@ÓA×AÑAÜ	�CœÔ	ØŸ)™)›+ò 	:‰JˆC�Ü(¨°3Ó7×7Ð7Ü(¨°5Ó9×9Ñ9ñ	:ô 
�CœÔ	¤*¨S´%Ô"8Øò 	9ˆDÜ(¨°4Ó8×8Ñ8ñ	9ð #9ð 	Bøð 8øØ9øð 9úsH   ‚AC"ÁCÁ:C"ÂCÂC"ÂCÂ;C"ÃC Ã	C"ÃC"ÃC"Ã C"Ú	xp_tensorÚrequires_gradr=   ztorch.Tensorc                 óš  — t        «        |€
t        «       }t        | d«      r:| j                  «       }t        j
                  j                  j                  |«      }nKt        | d«      r*t        j
                  j                  j                  | «      }nt	        j                  | «      }|j                  |«      }|r|j                  «        |S )z3Convert a numpy or cupy tensor to a PyTorch tensor.ÚtoDlpackÚ
__dlpack__)r¼   rA   rj   rÐ   r"   ÚutilsÚdlpackÚfrom_dlpackÚ
from_numpyÚtoÚrequires_grad_)rÍ   rÎ   r=   Údlpack_tensorÚtorch_tensors        r@   Úxp2torchrÚ   …  s    € ô Ôà€~Ü)Ó+ˆäˆy˜*Ô%Ø!×*Ñ*Ó,ˆÜ—{‘{×)Ñ)×5Ñ5°mÓD‰Ü	�˜LÔ	)Ü—{‘{×)Ñ)×5Ñ5°iÓ@‰ä×'Ñ'¨	Ó2ˆà—?‘? 6Ó*€LáØ×#Ñ#Ô%àÐrB   )r>   rÙ   r>   r-   c                óª  — ddl m} t        «        t        | «      rjt	        ||«      r,| j                  «       j                  «       j                  «       S t        t        j                  j                  j                  | «      «      S t	        ||«      s|€,| j                  «       j                  «       j                  «       S t        j                  | «      S )zÂConvert a torch tensor to a numpy or cupy tensor depending on the `ops` parameter.
    If `ops` is `None`, the type of the resultant tensor will be determined by the source tensor's device.
    r   ©ÚNumpyOps)ÚapirÝ   r¼   rd   r:   Údetachr5   rE   r   r"   rÒ   rÓ   Ú	to_dlpackr   Úasarray)rÙ   r>   rÝ   s      r@   Útorch2xprâ      sž   € õ äÔÜ˜<Ô(Ü�c˜8Ô$Ø×&Ñ&Ó(×,Ñ,Ó.×4Ñ4Ó6Ð6ä#¤E§K¡K×$6Ñ$6×$@Ñ$@ÀÓ$NÓOÐOä�c˜8Ô$¨¨Ø×&Ñ&Ó(×,Ñ,Ó.×4Ñ4Ó6Ð6ä—<‘< Ó-Ð-rB   Úas_variablez	tf.Tensorc                 óž  — t        «        t        | d«      r:| j                  «       }t        j                  j
                  j                  |«      }n[t        | d«      r:| j                  «       }t        j                  j
                  j                  |«      }nt        j                  | «      }|r?t        j                  |j                  «      5  t        j                  ||¬«      }ddd«       |du rC|du r?t        j                  |j                  «      5  t        j                  |«      }ddd«       |S |S # 1 sw Y   ŒRxY w# 1 sw Y   |S xY w)zAConvert a numpy or cupy tensor to a TensorFlow Tensor or VariablerÐ   rÑ   )Ú	trainableNF)r¸   rj   rÐ   rl   ÚexperimentalrÓ   rÔ   rÑ   Úconvert_to_tensorr=   ÚVariableÚstop_gradient)rÍ   rÎ   rã   rØ   Ú	tf_tensors        r@   Úxp2tensorflowrë   µ  s  € ô  Ô!Üˆy˜*Ô%Ø!×*Ñ*Ó,ˆÜ—O‘O×*Ñ*×6Ñ6°}ÓE‰	Ü	�˜LÔ	)Ø!×,Ñ,Ó.ˆÜ—O‘O×*Ñ*×6Ñ6°}ÓE‰	ä×(Ñ(¨Ó3ˆ	Ùô �Y‰Y�y×'Ñ'Ó(ñ 	HÜŸ™ I¸ÔGˆI÷	Hà˜Ñ +°Ñ"6ô �Y‰Y�y×'Ñ'Ó(ñ 	4Ü×(Ñ(¨Ó3ˆI÷	4àÐˆ9Ð÷	Hð 	Hú÷
	4àÐús   ÃD6ÄEÄ6D?ÅErê   c                óZ  — ddl m} t        «        t        | «      rPt	        ||«      r| j                  «       S t        j                  j                  j                  | «      }t        |«      S t	        ||«      s|€| j                  «       S t        j                  | j                  «       «      S )zÅConvert a Tensorflow tensor to numpy or cupy tensor depending on the `ops` parameter.
    If `ops` is `None`, the type of the resultant tensor will be determined by the source tensor's device.
    r   rÜ   )rÞ   rÝ   r¸   ro   r:   rE   rl   ræ   rÓ   rà   r   r   rá   )rê   r>   rÝ   rØ   s       r@   Útensorflow2xprí   Ï  s‚   € õ äÔ!Ü˜yÔ)Ü�c˜8Ô$Ø—?‘?Ó$Ð$äŸO™O×2Ñ2×<Ñ<¸YÓGˆMÜ# MÓ2Ð2ä�c˜8Ô$¨¨Ø—?‘?Ó$Ð$ä—<‘< 	§¡Ó 1Ó2Ð2rB   zmx.nd.NDArrayc                 óô   — t        «        t        | d«      r0| j                  «       }t        j                  j                  |«      }nt        j                  j                  | «      }|r|j                  «        |S )z1Convert a numpy or cupy tensor to a MXNet tensor.rÐ   )rº   rj   rÐ   rq   rr   rÔ   rÕ   Úattach_grad)rÍ   rÎ   rØ   Ú	mx_tensors       r@   Úxp2mxnetrñ   å  s_   € ô ÔÜˆy˜*Ô%Ø!×*Ñ*Ó,ˆÜ—E‘E×%Ñ% mÓ4‰	ä—E‘E×$Ñ$ YÓ/ˆ	ÙØ×ÑÔØÐrB   rð   c                ó\  — ddl m} t        «        t        | «      rCt	        ||«      r| j                  «       j                  «       S t        | j                  «       «      S t	        ||«      s|€| j                  «       j                  «       S t        j                  | j                  «       «      S )z1Convert a MXNet tensor to a numpy or cupy tensor.r   rÜ   )rÞ   rÝ   rº   rx   r:   rß   Úasnumpyr   Úto_dlpack_for_writer   rá   )rð   r>   rÝ   s      r@   Úmxnet2xprõ   ô  s‰   € õ äÔÜ˜)Ô$Ü�c˜8Ô$Ø×#Ñ#Ó%×-Ñ-Ó/Ð/ä# I×$AÑ$AÓ$CÓDÐDä�c˜8Ô$¨¨Ø×#Ñ#Ó%×-Ñ-Ó/Ð/ä—<‘< 	× 1Ñ 1Ó 3Ó4Ð4rB   ÚPartialTÚfunc.ÚargsÚkwargsc                 óZ   — t        j                  | g|¢­i |¤Ž}| j                  |_        |S )znWrapper around functools.partial that retains docstrings and can include
    other workarounds if needed.
    )Ú	functoolsÚpartialÚ__doc__)r÷   rø   rù   Úpartial_funcs       r@   rü   rü     s0   € ô ×$Ñ$ TÐ;¨DÒ;°FÑ;€LØŸ<™<€LÔØÐrB   c                   óV   — e Zd Zg fdedededeeeeef      ee	eef      f   ddf
d„Z
y)ÚDataValidationErrorÚnamerª   r˜   Úerrorsr.   Nc           	      ó€  — d|› d�}dt        |«      › dt        |«      › �}g }|D ]\  }dj                  |j                  dg «      D �	cg c]  }	t        |	«      ‘Œ c}	«      }
|j	                  |
|j                  d«      f«       Œ^ ||t        |«      g}t        j                  | dd	j                  |«      z   «       y
c c}	w )z8Custom error for validating inputs / outputs at runtime.zData validation error in 'ú'zX: z Y: z -> ÚlocÚmsgz

ú
N)rG   Újoinrz   ÚstrÚappendr   r6   Ú__init__)Úselfr  rª   r˜   r  ÚmessageÚ	type_infor|   ÚerrorÚpÚerr_locÚresults               r@   r  zDataValidationError.__init__  s¸   € ð /¨t¨f°AÐ6ˆØœ$˜q›'˜ $¤t¨A£w iÐ0ˆ	ØˆØò 	5ˆEØ—k‘k°5·9±9¸UÀBÓ3GÖ"H¨a¤3 q¥6Ò"HÓIˆGØ�K‰K˜ %§)¡)¨EÓ"2Ð3Õ4ð	5ð ˜9¤e¨D£kÐ2ˆÜ×Ñ˜D &¨4¯9©9°VÓ+<Ñ"<Õ=ùò #Is   ÁB;
)Ú__name__Ú
__module__Ú__qualname__r	  r   r   r   r	   r   r   r  rL   rB   r@   r   r     sc   „ ð LNñ>àð>ð ð>ð ð	>ð
 �h˜w s¨C xÑ0Ñ1°4¸¸SÀ#¸X¹Ñ3GÐGÑHð>ð 
ô>rB   r   r  c                 óÖ  — t        j                  |«      }t        |j                  «      }t	        |«      dk7  r6t	        |«      › ddj                  |«      › d�}d|› �}t        | ||d|ig«      ‚|j                  |d      }|j                  |d      }	g }
|�a|j                  t        urOt        |t        «      rt	        |«      d
kD  r|d	d
 }t        ||j                  «      }|r|
j                  d|dœ«       |�`t        j                  |«      j                  }|t        j                  j                   ur%t        |d„ f|«      }|r|
j                  d|dœ«       |
rt        | |||
«      ‚y	)zÉValidate the input and output of a forward function against the type
    annotations, if available. Used in Model.initialize with the input and
    output samples as they pass through the network.
    é   z (z, ú)zIInvalid forward function. Expected 3 arguments (model, X, is_train), got r  r   é   Né   )rª   )r  r  c                 ó   — | S rK   rL   )Úxs    r@   ú<lambda>z+validate_fwd_input_output.<locals>.<lambda>B  s   € ¨a€ rB   )r˜   )r   Úfrom_functionr°   Úmodel_fieldsr¯   r  r   Ú
annotationr   r:   r   r
  ÚinspectÚ	signatureÚreturn_annotationÚ	SignatureÚempty)r  r÷   rª   r˜   ÚschemaÚfieldsÚ
bad_paramsr²   Úx_fieldÚy_fieldr  Úrets               r@   Úvalidate_fwd_input_outputr,  )  sf  € ô ×!Ñ! $Ó'€FÜ�&×%Ñ%Ó&€FÜ
ˆ6ƒ{�aÒÜ˜F›�} B t§y¡y°Ó'8Ð&9¸Ð;ˆ
ØYÐZdÐYeÐfˆÜ! $¨¨1°°s¨|¨nÓ=Ð=Ø×!Ñ! &¨¡)Ñ,€GØ×!Ñ! &¨¡)Ñ,€GØ€FØ€}˜×+Ñ+´3Ñ6Ü�aœÔ¤3 q£6¨A¢:Ø�"�1�ˆAÜ˜A˜w×1Ñ1Ó2ˆÙØ�M‰M &°Ñ5Ô6Ø€}Ü×Ñ Ó%×7Ñ7ˆØ”g×'Ñ'×-Ñ-Ñ-Ü ¡KÐ 0°#Ó6ˆCÙØ—‘ f°SÑ9Ô:ÙÜ! $¨¨1¨fÓ5Ð5ð rB   c              #   ó    K  — t        j                  | d¬«      }|–— |j                  «        t        j                  |j
                  «       y ­w)NF)ÚmodeÚdelete)ÚtempfileÚNamedTemporaryFileÚcloseÚosÚremover  )r.  Úfs     r@   Úmake_tempfiler6  I  s6   è ø€ ä×#Ñ#¨°eÔ<€AØ
‚GØ‡G�G„IÜ‡I�Iˆa�f‰fÕùs   ‚AAc              #   óâ   K  — t        j                  «       5  t        j                  «       }t        j	                  | «       d –— t        j	                  |«       d d d «       y # 1 sw Y   y xY w­wrK   )Ú	threadingÚLockr#   rz   Úset)Ú
validationÚprevs     r@   Údata_validationr=  Q  sQ   è ø€ ä	�‰Ó	ñ "Ü×"Ñ"Ó$ˆÜ×Ñ˜JÔ'ÛÜ×Ñ˜DÔ!÷	"÷ "ñ "üs   ‚A/—AA#Á	A/Á#A,Á(A/r  Úid_colorc              #   óÎ   K  — t         rWt        j                  j                  j	                  | |«       d–— t        j                  j                  j                  «        yd–— y­w)zxContext manager to register the executed code as an NVTX range. The
    ranges can be used as markers in CUDA profiling.N)r   r   r;   ÚnvtxÚ	RangePushÚRangePop)r  r>  s     r@   Úuse_nvtx_rangerC  Z  s=   è ø€ õ Ü�	‰	�‰× Ñ  ¨(Ô3ÛÜ�	‰	�‰×ÑÕ!äùs   ‚A#A%c                   óp   — e Zd ZU dZej
                  ed<   ej                  ed<   ede	fd„«       Z
de	fd„Zy)Ú	ArrayInfoz4Container for info for checking array compatibility.r¬   r�   rH   c                 ó>   —  | |j                   |j                  ¬«      S )N©r¬   r�   rG  )ÚclsrH   s     r@   Ú
from_arrayzArrayInfo.from_arraym  s   € á˜Ÿ™¨#¯)©)Ô4Ð4rB   c                 óü   — |j                   | j                   k7  r%t        d| j                   › d|j                   › �«      ‚|j                  | j                  k7  r%t        d| j                  › d|j                  › �«      ‚y )NzShape mismatch in backprop. Y: z, dY: zType mismatch in backprop. Y: )r¬   r6   r�   )r  rH   s     r@   Úcheck_consistencyzArrayInfo.check_consistencyq  ss   € Ø�9‰9˜Ÿ
™
Ò"ÜØ1°$·*±*°¸VÀCÇIÁIÀ;ÐOóð ð �9‰9˜Ÿ
™
Ò"ÜØ0°·±°¸FÀ3Ç9Á9À+ÐNóð ð #rB   N)r  r  r  rý   r&   ÚShapeÚ__annotations__ÚDTypesÚclassmethodr(   rI  rK  rL   rB   r@   rE  rE  f  s>   … á>à�;‰;ÓØ�<‰<Óàð5˜Wò 5ó ð5ð Wô rB   rE  )rI   rA   rV   rF   rD   rƒ   r‹   rŠ   r•   r¦   r®   rÚ   râ   rí   rë   r,  r   r6  rC  rE  r   r   )r.   r/   )r   rK   )r.   N)FN)FF)F)Úr)r§   )oÚ
contextlibrû   r!  r3  rŽ   rP   r0  r8  Úcontextvarsr   Údataclassesr   Útypingr   r   r   r   r	   r
   r   r   r   r   r   rE   Úconfection.validationr   r   r   Úpackaging.versionr   Úwasabir   Úcompatr   r   r   r   r   r   r   r   r   r   r    rq   r!   rl   r"   r#   ÚboolrM  r%   Ú r&   r'   r(   r)   r*   r+   r,   rÞ   r-   rA   rI   rM   rž   rV   rZ   rF   rD   ra   rd   rg   rf   rm   ro   rt   rx   r}   rƒ   r‡   r‹   rŠ   r•   Úfloatr¦   r®   r¸   rº   r¼   rÁ   rÌ   rÚ   râ   rë   rí   rñ   rõ   rö   rü   r6   r   r	  r,  Úcontextmanagerr6  r=  rC  rE  Ú__all__rL   rB   r@   ú<module>r^     sÏ  ðÜ Û Û Û 	Û Û Û Û Ý "Ý !÷÷ ÷ ñ ó ß HÑ HÝ %Ý ÷÷ ÷ õ  Ý $Ý á$.Ð/@È%Ô$P€�˜DÑ!Ó På  å ß H× HáÝóò$
òñ3˜#ð 3 dó 3ð(5�Sð 5˜Tó 5ð
�sð ˜tó ð˜ð  ó ð˜ð  ó ð/˜Sð / Tó /ð?˜Cð ? Dó ?ðI˜Cð I Dó Ið˜Sð  Tó ð= ð =¨ó =ð˜ð  ó ðD˜Cð D Dó Dò!ð˜3ð Ð#5ó ð�Tó ñ�sð  4ó ñ˜ð  Dó ð*�Gð  'ð ¨dó ð  $ð%ð !ò	%Øð%à˜‰}ð%ð ð	%ð
 ó%ðR IKòØˆW�f˜f h¨wÑ&7Ð7Ñ8ðØBEðàóó8Kó
óVðØ˜�u˜d�{Ñ#ðØ3;¸S¸EÀ3¸JÑ3GðØNQðàóð89 ¨#¨°¨Ñ 5ð 9¸Cð 9ÀCó 9ð(  Ø'+ñØðàðð �^Ñ$ðð ó	ð8 =Aò.Ø ð.Ø*2°5©/ð.àó.ð, JOñØðØ'+ðØBFðàóð6 7;ò3Øð3Ø$,¨U¡Oð3àó3ð. /4ñØðØ'+ðàóð  ;?ò5Øð5Ø(0°©ð5àó5ñ( �:Ó€ðØ
�3˜�=Ñ
!ðØ*-ðØ9<ðàˆc�8ˆmÑóô>˜*ô >ð&6Ø
ð6Ø˜s C¨Ð.°Ð3Ñ4ð6Ø9<ð6ØADð6à	ó6ð@ ×Ñòó ðð ×Ññ"ó ð"ð ×Ññ˜Cð ¨3ò ó ðð ÷ð ó ðò,�rB   