
    sh5                     4   S r SSKJr  SSKJr  SSKrSrSrSr	 " S S\
5      r " S S	\5      r " S
 S\5      rS rS rS rS rSS jr\S 5       rS r\R,                  SS4S jr\R,                  SS4S jrS rS rS rS S jrS rS!S jrS rS r S r!g)"zz
The Device Array API is not implemented in the simulator. This module provides
stubs to allow tests to import correctly.
    )contextmanager)numpy_versionNzArray contains non-contiguous buffer and cannot be transferred as a single memory region. Please ensure contiguous buffer with numpy .ascontiguousarray()c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )	FakeShape   z
The FakeShape class is used to provide a shape which does not allow negative
indexing, similar to the shape in CUDA Python. (Numpy shape arrays allow
negative indexing)
c                 v   > [        U[        5      (       a  US:  a  [        S5      e[        [        U ]  U5      $ )Nr   ztuple index out of range)
isinstanceint
IndexErrorsuperr   __getitem__)selfk	__class__s     |/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/numba/cuda/simulator/cudadrv/devicearray.pyr   FakeShape.__getitem__   s4    a!a%788Y1!44     )__name__
__module____qualname____firstlineno____doc__r   __static_attributes____classcell__)r   s   @r   r   r      s    5 5r   r   c                   H    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rSrg)FakeWithinKernelCUDAArray"   a/  
Created to emulate the behavior of arrays within kernels, where either
array.item or array['item'] is valid (that is, give all structured
arrays `numpy.recarray`-like semantics). This behaviour does not follow
the semantics of Python and NumPy with non-jitted code, and will be
deprecated and removed.
c                 N    [        U[        5      (       d   eXR                  S'   g )N_item)r	   FakeCUDAArray__dict__r   items     r   __init__"FakeWithinKernelCUDAArray.__init__+   s!    $....!%gr   c                 F    [        U[        5      (       a  [        U5      $ U$ N)r	   r!   r   r#   s     r   __wrap_if_fake(FakeWithinKernelCUDAArray.__wrap_if_fake/   s    dM**,T22Kr   c                 l    U[        U R                  R                  5      ;   a/  U R                  [	        U R                  R                  U5      5      $ U R                  U R                  R                  U5      5      $ ! [         a+  n[        U[        5      (       d  [        U5      Ue S nAg S nAff = fr(   )	dirr    _ary(_FakeWithinKernelCUDAArray__wrap_if_fakegetattrr   	Exceptionr	   AttributeError)r   attrnamees      r   __getattr__%FakeWithinKernelCUDAArray.__getattr__5   s    	63tzz//**74::??H+MNN**4::+A+A(+KLL 	6a00$X.A5 1	6s   AA> )A> >
B3!B..B3c                 :    U R                   R                  X5        g r(   r    __setitem__)r   nmvals      r   __setattr__%FakeWithinKernelCUDAArray.__setattr__?   s    

r'r   c                 V    U R                  U R                  R                  U5      5      $ r(   )r.   r    r   )r   idxs     r   r   %FakeWithinKernelCUDAArray.__getitem__B   s"    ""4::#9#9##>??r   c                 :    U R                   R                  X5        g r(   r7   r   r>   r:   s      r   r8   %FakeWithinKernelCUDAArray.__setitem__E   s    

s(r   c                 ,    [        U R                  5      $ r(   )lenr    r   s    r   __len__!FakeWithinKernelCUDAArray.__len__H   s    4::r   c                    ^ [        X5      nS mUR                  S5      nU(       a  [        U4S jU 5       5      US'   [        U4S jU 5       5      nU" U0 UD6$ )Nc                 \    [        U [        5      (       a  U R                  R                  n U $ r(   )r	   r   r    r-   objs    r   convert_fakes@FakeWithinKernelCUDAArray.__array_ufunc__.<locals>.convert_fakesU   s"    #899iinnJr   outc              3   4   >#    U  H  nT" U5      v   M     g 7fr(   r   ).0orL   s     r   	<genexpr><FakeWithinKernelCUDAArray.__array_ufunc__.<locals>.<genexpr>]   s     !@Cq-"2"2C   c              3   4   >#    U  H  nT" U5      v   M     g 7fr(   r   )rP   arL   s     r   rR   rS   ^   s     4t!]1%%trT   )r/   gettuple)r   ufuncmethodargskwargscallrN   rL   s          @r   __array_ufunc__)FakeWithinKernelCUDAArray.__array_ufunc__K   s[     u%	 jj!!@C!@@F5M4t44T$V$$r   r   N)r   r   r   r   r   r%   r.   r4   r;   r   r8   rF   r^   r   r   r   r   r   r   "   s0    &6(@)%r   r   c                   (   \ rS rSrSrSrS(S jr\S 5       r\S 5       r	S r
S(S jr\S	 5       rS)S jrS rS rS*S jrS(S jr\S 5       rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S  r"S! r#S" r$S# r%S$ r&S% r'S(S& jr(S'r)g
)+r!   b   z^
Implements the interface of a DeviceArray/DeviceRecord, but mostly just
wraps a NumPy array.
Tc                     Xl         X l        g r(   r-   streamr   aryrd   s      r   r%   FakeCUDAArray.__init__j   s    	r   c                 .    U R                   R                  $ r(   r-   nbytesrE   s    r   
alloc_sizeFakeCUDAArray.alloc_sizen   s    yyr   c                 .    U R                   R                  $ r(   ri   rE   s    r   rj   FakeCUDAArray.nbytesr   s     yyr   c                 z     [        U R                  U5      nU$ ! [         a  nSU-  n[        U5      UeS nAff = f)Nz#Wrapped array has no attribute '%s')r/   r-   r1   )r   r2   attrr3   msgs        r   r4   FakeCUDAArray.__getattr__w   sC    	-499h/DK 	-7(BC %1,	-s    
:5:c                 .    [        U R                  U5      $ r(   r!   r-   )r   rd   s     r   bindFakeCUDAArray.bind   s    TYY//r   c                 "    U R                  5       $ r(   )	transposerE   s    r   TFakeCUDAArray.T   s    ~~r   Nc                 R    [        [        R                  " U R                  US95      $ )N)axes)r!   nprx   r-   )r   r|   s     r   rx   FakeCUDAArray.transpose   s    R\\$))$?@@r   c                     U R                   R                  U5      n[        U5      [        R                  [        R
                  4;  a  U$ [        X R                  S9$ )Nrd   )r-   r   typer}   ndarrayvoidr!   rd   )r   r>   rets      r   r   FakeCUDAArray.__getitem__   sC    ii##C(9RZZ11J [[99r   c                 8    U R                   R                  X5      $ r(   )r-   r8   rA   s      r   r8   FakeCUDAArray.__setitem__   s    yy$$S..r   c                     Uc!  [         R                  " U R                  5      nO[        X5        [         R                  " XR                  5        U$ r(   )r}   
empty_liker-   check_array_compatibilitycopytore   s      r   copy_to_hostFakeCUDAArray.copy_to_host   s6    ;--		*C%d0
		#yy!
r   c                 f   [        U 5        [        U 5      [        U5      pC[        U[        5      (       a  [        U5        [	        X45        OD[
        R                  " UUR                  S   (       a  SOSS[        S:  a  SOSS9n[	        X45        [
        R                  " UR                  U5        g)	z
Copy from the provided array into this array.

This may be less forgiving than the CUDA Python implementation, which
will copy data up to the length of the smallest of the two arrays,
whereas this expects the size of the arrays to be equal.
C_CONTIGUOUSCFT   r   FN)ordersubokcopy)sentry_contiguous
array_corer	   r!   r   r}   arrayflagsr   r   r-   )r   rf   rd   	self_coreary_cores        r   copy_to_deviceFakeCUDAArray.copy_to_device   s     	$(.
38c=))c"%i:xx&__^<c#+f4U$	@H
 &i:
		)..(+r   c                 @    [        U R                  R                  5      $ r(   )r   r-   shaperE   s    r   r   FakeCUDAArray.shape   s    ))r   c                 L    [        U R                  R                  " U0 UD65      $ r(   )r!   r-   ravelr   r[   r\   s      r   r   FakeCUDAArray.ravel   s    TYY__d=f=>>r   c                 L    [        U R                  R                  " U0 UD65      $ r(   )r!   r-   reshaper   s      r   r   FakeCUDAArray.reshape   s!    TYY..??@@r   c                 L    [        U R                  R                  " U0 UD65      $ r(   )r!   r-   viewr   s      r   r   FakeCUDAArray.view   s    TYY^^T<V<==r   c                 B    U R                   R                  R                  $ r(   )r-   r   c_contiguousrE   s    r   is_c_contiguousFakeCUDAArray.is_c_contiguous       yy+++r   c                 B    U R                   R                  R                  $ r(   )r-   r   f_contiguousrE   s    r   is_f_contiguousFakeCUDAArray.is_f_contiguous   r   r   c                 ,    [        U R                  5      $ r(   )strr-   rE   s    r   __str__FakeCUDAArray.__str__       499~r   c                 ,    [        U R                  5      $ r(   )reprr-   rE   s    r   __repr__FakeCUDAArray.__repr__   s    DIIr   c                 ,    [        U R                  5      $ r(   )rD   r-   rE   s    r   rF   FakeCUDAArray.__len__   r   r   c                 2    [        U R                  U:H  5      $ r(   rt   r   others     r   __eq__FakeCUDAArray.__eq__       TYY%/00r   c                 2    [        U R                  U:g  5      $ r(   rt   r   s     r   __ne__FakeCUDAArray.__ne__   r   r   c                 2    [        U R                  U:  5      $ r(   rt   r   s     r   __lt__FakeCUDAArray.__lt__       TYY.//r   c                 2    [        U R                  U:*  5      $ r(   rt   r   s     r   __le__FakeCUDAArray.__le__   r   r   c                 2    [        U R                  U:  5      $ r(   rt   r   s     r   __gt__FakeCUDAArray.__gt__   r   r   c                 2    [        U R                  U:  5      $ r(   rt   r   s     r   __ge__FakeCUDAArray.__ge__   r   r   c                 2    [        U R                  U-   5      $ r(   rt   r   s     r   __add__FakeCUDAArray.__add__   r   r   c                 2    [        U R                  U-
  5      $ r(   rt   r   s     r   __sub__FakeCUDAArray.__sub__   r   r   c                 2    [        U R                  U-  5      $ r(   rt   r   s     r   __mul__FakeCUDAArray.__mul__   r   r   c                 2    [        U R                  U-  5      $ r(   rt   r   s     r   __floordiv__FakeCUDAArray.__floordiv__   r   r   c                 2    [        U R                  U-  5      $ r(   rt   r   s     r   __truediv__FakeCUDAArray.__truediv__   r   r   c                 2    [        U R                  U-  5      $ r(   rt   r   s     r   __mod__FakeCUDAArray.__mod__   r   r   c                 2    [        U R                  U-  5      $ r(   rt   r   s     r   __pow__FakeCUDAArray.__pow__   r   r   c           	          [         R                  " U R                  [        U[	        U 5      U5      5       Vs/ s H  n[        U5      PM     sn$ s  snf r(   )r}   splitr-   rangerD   r!   )r   sectionrd   rV   s       r   r   FakeCUDAArray.split   sJ     XXdiiwD	7)KL
L !L
 	
 
s   Arc   r   r(   )Nr   )*r   r   r   r   r   __cuda_ndarray__r%   propertyrk   rj   r4   ru   ry   rx   r   r8   r   r   r   r   r   r   r   r   r   r   rF   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r!   b   s    
         -0    A:/,, * *?A>,,
1101010001001
r   r!   c                     U R                   (       a  U R                  (       d  U $ / nU R                    H%  nUR                  US:X  a  SO
[        S5      5        M'     U [	        U5         $ )a/  
Extract the repeated core of a broadcast array.

Broadcast arrays are by definition non-contiguous due to repeated
dimensions, i.e., dimensions with stride 0. In order to ascertain memory
contiguity and copy the underlying data from such arrays, we must create
a view without the repeated dimensions.

r   N)stridessizeappendslicerX   )rf   
core_indexstrides      r   r   r      sS     ;;chh
J++v{!d< uZ !!r   c                     U R                   R                  n[        [        U R                  5      [        U R
                  5      5       H   u  p#US:  d  M  US:w  d  M  X:w  a    gX-  nM"     g)z
Returns True iff `ary` is C-style contiguous while ignoring
broadcasted and 1-sized dimensions.
As opposed to array_core(), it does not call require_context(),
which can be quite expensive.
   r   FT)dtypeitemsizezipreversedr   r   )rf   r   r   r   s       r   is_contiguousr     sZ     99DXcii0(3;;2GH191~MD	 I
 r   c                     [        U 5      nUR                  S   (       d$  UR                  S   (       d  [        [        5      eg g )Nr   F_CONTIGUOUS)r   r   
ValueErrorerrmsg_contiguous_buffer)rf   cores     r   r   r     s7    c?D::n%djj.H122 /I%r   c                    U R                  5       UR                  5       p2U R                  UR                  :w  a'  [        SU R                  < SUR                  < 35      eUR                  UR                  :w  a'  [	        SU R                  < SUR                  < 35      eUR
                  UR
                  :w  a'  [	        SU R
                  < SUR
                  < 35      eg )Nzincompatible dtype: z vs. zincompatible shape: zincompatible strides: )squeezer   	TypeErrorr   r  r   )ary1ary2ary1sqary2sqs       r   r   r   %  s    \\^T\\^FzzTZZTZZ1 2 	2||v||#**djj2 3 	3~~',,6 7 	7 (r   c           	         [         R                  " U [        S:  a  SOS SS9n [        U 5        Uc  U R                  R
                  S;   a  [         R                  OU R                  n[        [         R                  " [         R                  " [        U 5      5      R                  U5      U R                  U R                  U R                  S9R                  [        U 5      S95      $ UR                  XS9  g )	Nr   FTr   r   Mm)bufferr   r   r   )r   r   )r}   r   r   r   r   charint64r!   r   r   r   r   r   r   r   r   )rf   rd   r   tobuffer_dtypes        r   	to_devicer  2  s    
((3!.!7TC c	z#&99>>T#9rxxsyyJJwwz#/44\Biiii	
 dS	d"
 	
 	#-r   c              #      #    S v   g 7fr(   r   )args    r   pinnedr  E  s     	s   c                  Z    S H  nX!;   d  M
  UR                  U5        M     [        U 0 UD6$ )N)portablewc)popdevice_array)r[   r\   
unused_args      r   mapped_arrayr  J  s0    (
JJz" ) (((r   r   c                 ,    [         R                  " XXS9$ N)r   r   r   r   r}   r   r   r   r   r   s       r   pinned_arrayr$  Q      ::E%MMr   c                 ,    [         R                  " XXS9$ r!  r"  r#  s       r   managed_arrayr'  U  r%  r   c                  p    SU;   a  UR                  S5      OSn[        [        R                  " U 0 UD6US9$ )Nrd   r   r   )r  r!   r}   r   )r[   r\   rd   s      r   r  r  Y  s4    %-%7VZZ!QFT4V4VDDr   c                    U R                   S   (       d$  U R                   S   (       d  U R                  S::  a  g[        U R                  5       Vs/ s H  oPM     nnUR	                  S S9  S/[        U R                  5      -  nU R                  R                  nU H  u  pVXCU'   X@R                  U   -  nM     [        U5      $ s  snf )zO
Given an array, compute strides for a new contiguous array of the same
shape.
r   r  r   Nc                     U S   $ )Nr   r   )xs    r   <lambda>0_contiguous_strides_like_array.<locals>.<lambda>p  s    !A$r   )keyr   )
r   ndim	enumerater   sortrD   r   r   r   rX   )rf   r+  
stridepermr   r   i_perm_s          r   _contiguous_strides_like_arrayr5  ^  s     yy CIIn$=Q (46414J6OOO' cC$$GYYF	 ))F##   > 7s   Cc                 V    U R                   S   (       a  U R                   S   (       d  gg)Nr  r   r   r   )r   )rf   s    r   _order_like_arrayr7  {  s    
yy >)Br   c                 n    [        U 5      n[        U 5      n[        U R                  U R                  UUS9$ Nr#  )r5  r7  r  r   r   )rf   rd   r   r   s       r   device_array_liker:    4    ,S1Gc"Eciisyy'#% %r   c                 n    [        U 5      n[        U 5      n[        U R                  U R                  UUS9$ r9  )r5  r7  r$  r   r   )rf   r   r   s      r   pinned_array_liker=    r;  r   c                     [        U [        5      (       a  U S4$ [        U [        R                  5      (       d"  [        R                  " U [
        S:  a  SOS SS9n [        XU5      S4$ )NFr   Tr  )r	   r!   r}   r   r   r   r  )rf   rd   r   s      r   auto_devicer?    s^    #}%%Ezc277##hh'&0d S$'--r   c                     [        U SS5      $ )z$Check if an object is a CUDA ndarrayr   F)r/   rJ   s    r   is_cuda_ndarrayrA    s    3*E22r   c                    ^  [        T 5        U 4S jnU" S[        5        U" S[        5        U" S[        R                  5        U" S[        5        g)z,Verify the CUDA ndarray interface for an objc                    > [        TU 5      (       d  [        U 5      e[        [        TU 5      U5      (       d  [        U < SU< 35      eg )Nz must be of type )hasattrr1   r	   r/   )rp   typrK   s     r   requires_attr4verify_cuda_ndarray_interface.<locals>.requires_attr  sD    sD!! &&'#t,c22 D#!FGG 3r   r   r   r   r   N)require_cuda_ndarrayrX   r}   r   r
   )rK   rF  s   ` r   verify_cuda_ndarray_interfacerI    s?    H '5!)U#'288$&#r   c                 :    [        U 5      (       d  [        S5      eg)z9Raises ValueError is is_cuda_ndarray(obj) evaluates Falsezrequire an cuda ndarray objectN)rA  r  rJ   s    r   rH  rH    s    39::  r   )r   TNr   )r   T)"r   
contextlibr   numba.np.numpy_supportr   numpyr}   DeviceRecordfrom_record_liker  rX   r   objectr   r!   r   r   r   r   r  r  r  float64r$  r'  r  r5  r7  r:  r=  r?  rA  rI  rH  r   r   r   <module>rR     s    & 0   3 
5 
5=% =%@X
F X
v"$ 3
7.& 
 
) !jj$c N  "zz4s NE
:%%	.3
 ;r   