
    i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        [/var/www/vps2.regionflexible.com/Desarrollo/venv/lib/python3.12/site-packages/thinc/util.pyget_torch_default_devicerA   9   s~    }WXX)*(

C#wJJ--/	||eI;/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        rt        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    
KK	LLdUl# 	$!667 	+ JJ&&t,15ENN  .-2ENN  * ,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"    #H73#9Hcjj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!    #C3;;#:#: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xxz{{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YY$$V,F
JJL

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	jj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,&7q:
 	
 
!	B''9i0,i'PK[!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))	Av	S))	G	F!3!qww<1\Qquuw<!##773<	Ae}	%q6Q;QqTs++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 )zEither 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Us   )r:   r'   r   r   items
from_itemsdictr   )r   r   rW   	convertedkeyvaluer   s   ``     r@   r   r   W  s     }C  	C	$%hd399;>OP	$$Y//	C		))+ 	#JC#HlC@C%heDE"IcN	# 	C	LOPD!(L$?PP	C	UQT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)zEither 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	$$XtCIIK/@AAA	C	))+ 	:JC(3777(5999	: 
C	*S%"8 	9D(4888	9 #9 	B 89 9sH   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5mD	L	){{))55i@''	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 )zConvert 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     <(c8$&&(,,.4466#EKK$6$6$@$@$NOOc8$&&(,,.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*%!**,OO**66}E		L	)!,,.OO**66}E	((3	 YYy''( 	HIGI	H+"6 YYy''( 	4((3I	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 )zConvert 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)c8$??$$OO22<<YGM#M22c8$??$$<<	 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*%!**,EE%%m4	EE$$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     )$c8$##%--//#I$A$A$CDDc8$##%--//<<	 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     /tfA6$q'$tAwi0	 	5Ekk599UB3G"Ha3q6"HIGKK%))E"234	5 9eDk2D&499V+<"<= #Is   B;
)__name__
__module____qualname__r	  r   r   r   r	   r   r   r  rL   rB   r@   r   r     sc     LN>> > 	>
 hwsCx014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	)zValidate 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}Btyy'8&9;
YZdYef!$1s|n==!!&),G!!&),GF}++36a3q6A:"1AAw112MM&56}%77g''---K 0#6CfS9:!$1f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GGIIIaff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    99

"1$**VCII;O  99

"0F399+N  #rB   N)r  r  r  r   r&   Shape__annotations__DTypesclassmethodr(   rI  rK  rL   rB   r@   rE  rE  f  s>    >;;<<5W 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# 3d 3(5S 5T 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Wffhw&778BE8K
Vud{#3;SE3J3GNQ89# 5 9C 9C 9(  '+ ^$ 	8 =A. .*25/.., JO'+BF6 7;33$,UO33. /4'+  ;?55(055( :
3=
!*-9<c8m>* >&6
6sC.3469<6AD6	6@   " " C 3     ,rB   