
    i2                         d dl Z ddlmZ ddlmZmZmZ ddlmZ ddl	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mZ  ej(                  d       G d de             Ze ej.                  dddd      Zd ZydZd Zy)    N   )registry)cublascupycupyx)DeviceTypes)is_cupy_arrayis_mxnet_gpu_arrayis_tensorflow_gpu_arrayis_torch_cuda_arraymxnet2xptensorflow2xptorch2xp   )_custom_kernels)NumpyOps)OpsCupyOpsc                       e Zd ZdZeZeZ	 d0dede	ddfdZ
dddZ fd	Zd1 fd
	Zd1 fd	Zd1 fd	Zd1 fd	Zd2dZd3dZd4 fd	Z fdZ fdZd1dZd1dZ	 	 	 	 	 d5dededededef
 fdZ	 	 	 	 	 d5dededededef
 fdZd1def fdZd1def fdZd6 fd	Zd6 fd	Zd1 fd 	Z d1 fd!	Z!d" Z"dd# fd$
Z#dd# fd%
Z$ fd&Z% fd'Z& fd(Z' fd)Z( fd*Z) fd+Z*d, Z+d- Z,	 d7d.Z-d8d/Z. xZ/S )9r   r   device_type	device_idreturnNc                      || _         || _        y N)r   r   )selfr   r   kwargss       h/var/www/vps2.regionflexible.com/Desarrollo/venv/lib/python3.12/site-packages/thinc/backends/cupy_ops.py__init__zCupyOps.__init__   s     '"    )
byte_orderc                    t        |t        j                        s|j                         }|r2|j                  j                  |      }t        j                  ||      }|S )Ndtype)
isinstancenumpyndarraygetr#   newbyteorderasarray)r   datar    r#   s       r   to_numpyzCupyOps.to_numpy    sG    $.88:DJJ++J7E==U3Dr   c                 l    |j                   dv rt        j                  ||      S t        | 	  ||      S Nfloat32float64)r#   r   
gather_addsuper)r   tableindices	__class__s      r   r1   zCupyOps.gather_add(   s5    ;;00"--eW==7%eW55r   c                 p    |j                   dv rt        j                  ||      S t        | 	  ||      S Nr.   inplace)r#   r   dishr2   r   Xr9   r5   s      r   r:   zCupyOps.dish.   s6    77,,"''7;;7<7<33r   c                     |j                   |j                   k(  r&|j                   dv rt        j                  |||      S t        | 	  |||      S r7   )r#   r   backprop_dishr2   r   dYr<   r9   r5   s       r   r>   zCupyOps.backprop_dish4   sK    77bhh177.D#D"00QHH7(Q(@@r   c                 r    |j                   dv rt        j                  ||d      S t        | 	  ||      S Nr.   g      @r9   	thresholdr8   )r#   r   gelur2   r;   s      r   rE   zCupyOps.gelu:   s8    77,,"''7cJJ7<7<33r   c                     |j                   |j                   k(  r'|j                   dv rt        j                  |||d      S t        | 	  |||      S rB   )r#   r   backprop_gelur2   r?   s       r   rG   zCupyOps.backprop_gelu@   sN    77bhh177.D#D"00QSVWW7(Q(@@r   c                 4   t        |t        j                        st        |t        j                        rt        d      |r|j                  }|r|j                  }|| j
                  j                  ||      S | j
                  j                  |||       |S )NzaEncountered a numpy array when processing with cupy. Did you call model.ops.asarray on your data?)out)r$   r%   r&   
ValueErrorTxpdot)r   xyrI   trans1trans2s         r   gemmzCupyOps.gemmF   s~    a':a+G?  AA;77;;q!$$GGKK1#K&Jr   c                 F   t        |      r| j                  j                  ||      }nbt        |      rt	        |      }nKt        |      rt        |      }n4t        |      rt        |      }n| j                  j                  ||      }||j                  |d      }|S )Nr"   F)r#   copy)r	   rL   r)   r   r   r   r   r
   r   arrayastype)r   r*   r#   rU   s       r   r)   zCupyOps.asarrayV   s    GGOODO6E &TNE$T*!$'E%TNEGGMM$eM4ELLu5L9Er   c                    |st        d      t        t        d |D                    dk7  rt        d      t        t        d |D                    dk7  rt        d      t        t        d |D                    dk7  rt        d      t        d	 |D              r|d
   j                  dvrt
        |   ||      S t        j                  ||      S )zPerform padding on a list of arrays so that they each have the same
        length, by taking the maximum dimension across each axis. This only
        works on non-empty sequences with the same `ndim` and `dtype`.
        zCannot pad empty sequencec              3   4   K   | ]  }|j                     y wr   )ndim.0seqs     r   	<genexpr>zCupyOps.pad.<locals>.<genexpr>p   s     ,388,   r   z)Cannot pad sequences with different ndimsc              3   4   K   | ]  }|j                     y wr   r"   rZ   s     r   r]   zCupyOps.pad.<locals>.<genexpr>r   s     -399-r^   z*Cannot pad sequences with different dtypesc              3   :   K   | ]  }|j                   d d   yw)r   N)shaperZ   s     r   r]   zCupyOps.pad.<locals>.<genexpr>t   s     1S399QR=1   z4Cannot pad sequences that differ on other dimensionsc              3   :   K   | ]  }|j                   d      yw)C_CONTIGUOUSN)flagsrZ   s     r   r]   zCupyOps.pad.<locals>.<genexpr>x   s     =399^,=rb   r   )r/   r0   int32int64)rJ   lensetallr#   r2   padr   )r   seqsround_tor5   s      r   rk   zCupyOps.padh   s     899s,t,,-2HIIs---.!3IJJs1D112a7STT ===a W
 B
 7;tX..""422r   c                 h    |j                   dv rt        j                  |      S t        | 	  |      S r-   )r#   r   maxoutr2   )r   r<   r5   s     r   ro   zCupyOps.maxout   s0    77,,"))!,,7>!$$r   c                     |j                   dv r&|j                   dk(  rt        j                  |||      S t        | 	  |||      S Nr.   rf   )r#   r   backprop_maxoutr2   )r   r@   whichPr5   s       r   rr   zCupyOps.backprop_maxout   sD    88--%++2H"222ua@@7*2ua88r   c                 *    |s||dkD  z  S ||dkD  z  }|S Nr    )r   r<   r9   s      r   reluzCupyOps.relu   s%    A;QJAHr   c                 *    |s||dkD  z  S ||dkD  z  }|S rv   rw   )r   r@   Yr9   s       r   backprop_reluzCupyOps.backprop_relu   s%    Q<
a!e	r   slopeoffsetmin_valmax_valr9   c                     |j                   dv rt        j                  ||||||      S t        | 	  ||||||      S )Nr.   )r9   r|   r}   r~   r   )r#   r   clipped_linearr2   )r   r<   r|   r}   r~   r   r9   r5   s          r   r   zCupyOps.clipped_linear   sb     77,,"11  7) *  r   c           	          |j                   |j                   k(  r*|j                   dv rt        j                  |||||||      S t        | 	  |||||||      S )Nr.   )r|   r}   r~   r   r9   )r@   r<   r|   r}   r~   r   r9   )r#   r   backprop_clipped_linearr2   )	r   r@   r<   r|   r}   r~   r   r9   r5   s	           r   r   zCupyOps.backprop_clipped_linear   sw     77bhh177.D#D"::  72 3  r   c                     |j                   |j                   k(  r&|j                   dv rt        j                  |||      S t        | 	  |||      S r7   )r#   r   backprop_hard_swishr2   r?   s       r   r   zCupyOps.backprop_hard_swish   sK    77bhh177.D#D"66r1gNN7.r1g.FFr   c                     |j                   |j                   k(  r&|j                   dv rt        j                  |||      S t        | 	  |||      S r7   )r#   r   backprop_hard_swish_mobilenetr2   r?   s       r   r   z%CupyOps.backprop_hard_swish_mobilenet   sL    77bhh177.D#D"@@QPWXX78Q8PPr   c                 r    |j                   dv rt        j                  |||      S t        | 	  |||      S Nr.   rC   )r#   r   mishr2   )r   r<   rD   r9   r5   s       r   r   zCupyOps.mish   s8    77,,"''7iPP7<9g66r   c                     |j                   |j                   k(  r'|j                   dv rt        j                  ||||      S t        | 	  ||||      S r   )r#   r   backprop_mishr2   )r   r@   r<   rD   r9   r5   s        r   r   zCupyOps.backprop_mish   sS    77bhh177.D#D"00Aw)  7(Q	7CCr   c                 r    |j                   dv rt        j                  ||d      S t        | 	  ||      S Nr.   g      1@rC   r8   )r#   r   swishr2   r;   s      r   r   zCupyOps.swish   s8    77,,"((GtLL7=G=44r   c                     |j                   |j                   cxk(  r|j                   k(  r+n n(|j                   dv rt        j                  ||||d      S t        | 	  ||||      S r   )r#   r   backprop_swishr2   )r   r@   r<   rz   r9   r5   s        r   r   zCupyOps.backprop_swish   sa    77bhh)!'')agg9O.O"11Aq'T  7)"aG)DDr   c                 |    d }t        j                   ||      d      }|t        j                  ||      |z  z  }|S )Nc                 N    | j                  d      }t        j                  |      S )N)reshaper   nrm2)r<   X_vecs     r   frobenius_normz-CupyOps.clip_gradient.<locals>.frobenius_norm  s    IIbME;;u%%r   g-q=)r   maximumminimum)r   gradientrD   r   	grad_norms        r   clip_gradientzCupyOps.clip_gradient   s=    	& LL!95A	DLLI6BBr   lengthsc                    |j                   dv r)||j                   dk(  rt        j                  |||      S t        | 	  |||      S )zGiven an (M, N) sequence of vectors, return an (M, N*(nW*2+1)) sequence.
        The new sequence is constructed by concatenating nW preceding and succeeding
        vectors onto each column in the sequence, to extract a window of features.
        r.   rf   r   )r#   r   seq2colr2   )r   r\   nWr   r5   s       r   r   zCupyOps.seq2col
  sL    
 99..Ow}}7"**3GDD7?3G?<<r   c                    |j                   dv r)||j                   dk(  rt        j                  |||      S t        | 	  |||      S Nr.   rf   r   )r#   r   backprop_seq2colr2   )r   r@   r   r   r5   s       r   r   zCupyOps.backprop_seq2col  sL    88--Ow}}7"33BGLL7+BG+DDr   c                     |j                   dv r&|j                   dk(  rt        j                  ||      S t        | 	  ||       y r   )r#   r   reduce_meanr2   r   r<   r   r5   s      r   r   zCupyOps.reduce_mean  s=    77,,'1I"..q'BBG7+r   c                     |j                   dv r%|j                   dk(  rt        j                  ||      S t        | 	  ||       y rq   )r#   r   backprop_reduce_meanr2   )r   d_meansr   r5   s      r   r   zCupyOps.backprop_reduce_mean$  s=    ==22w}}7O"77IIG(':r   c                     |j                   dv r%|j                   dk(  rt        j                  ||      S t        | 	  ||       y rq   )r#   r   
reduce_maxr2   r   s      r   r   zCupyOps.reduce_max*  s=    77,,'1I"--a99Gq'*r   c                     |j                   dv r5|j                   dk(  r&|j                   dk(  rt        j                  |||      S t        | 	  |||       y rq   )r#   r   backprop_reduce_maxr2   )r   d_maxesrs   r   r5   s       r   r   zCupyOps.backprop_reduce_max0  sN    MM33w&("66wwOOG'@r   c                     |j                   dv r%|j                   dk(  rt        j                  ||      S t        | 	  ||      S rq   )r#   r   
reduce_sumr2   r   s      r   r   zCupyOps.reduce_sum:  s@    77,,'1I"--a997%a11r   c                     |j                   dv r%|j                   dk(  rt        j                  ||      S t        | 	  ||      S rq   )r#   r   backprop_reduce_sumr2   )r   d_sumsr   r5   s      r   r   zCupyOps.backprop_reduce_sum@  s@    <<11gmmw6N"66vwGG7.vw??r   c                 .    t        j                  ||      S r   )r   hash)r   idsseeds      r   r   zCupyOps.hashF  s    ##C..r   c                 >    | j                   j                  |||       y r   )_xp2scatter_add)r   r3   r4   valuess       r   r   zCupyOps.scatter_addI  s    		eWf5r   c
           
          t        ||       t        ||       t        ||       t        ||d|z
  d|z
  ||||       |j                  d       ||||fS )Nr   r   )_check_compatible_shapeadam_kernelfill)
r   weightsr   mom1mom2beta1beta2eps
learn_ratemod_rates
             r   adamzCupyOps.adamL  s`     	 2..j!e)QYWdD	
 	a$,,r   c                 ^    t               j                  ||||      }| j                  |      S )N)periodrI   )r   position_encoder)   )r   NDr   rI   	positionss         r   r   zCupyOps.position_encodeY  s,    J..q!F.L	||I&&r   )gpur   )F)NFFr   )r   )      ?        r   r   F)g      4@F)r   )i'  N)0__name__
__module____qualname__namer   rL   r   r   r   intr   r+   r1   r:   r>   rE   rG   rR   r)   rk   ro   rr   rx   r{   floatboolr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r5   s   @r   r   r      s   D	BD BC#&#;>#	# ,0 64A4A $34%9   	
   @  	
    >G$ GQD Q7D5E
 +/ 
= 37 E,;+A2@/6 VY-'r   z9T grad, T lr, T one_minus_beta1, T one_minus_beta2, T epszT param, T m, T vzm += one_minus_beta1 * (grad - m);
        v += one_minus_beta2 * (grad * grad - v);
        param -= lr * m / (sqrt(v) + eps);r   c                     | j                   |j                   k7  r'd| j                    d|j                    }t        |      y )Nz!arrays have incompatible shapes: z and )ra   rJ   )uvmsgs      r   r   r   k  s;    ww!''1!''%yIo r   )r%    r   compatr   r   r   typesr   utilr	   r
   r   r   r   r   r   r   	numpy_opsr   opsr   r   ElementwiseKernelr   r   rw   r   r   <module>r      s      ( (       iF'c F' F'R
 ($((C	. 	K Kr   