§
    ƒÛgt4  ã                   ó$  — d Z ddlmZ ddlZdZdZdZ G d„ de¦  «        Z	 G d„ de
¦  «        Z G d	„ d
e
¦  «        Zd„ Zd„ Zd„ Zd„ Zdd„Zed„ ¦   «         Zd„ Zej        ddfd„Zej        ddfd„Zd„ Zd„ Zd„ Zd d„Zd„ Zd!d„Zd„ Zd„ Zd„ ZdS )"zz
The Device Array API is not implemented in the simulator. This module provides
stubs to allow tests to import correctly.
é    )ÚcontextmanagerNz™Array contains non-contiguous buffer and cannot be transferred as a single memory region. Please ensure contiguous buffer with numpy .ascontiguousarray()c                   ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )Ú	FakeShapezº
    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                 ó¨   •— t          |t          ¦  «        r|dk     rt          d¦  «        ‚t          t          | ¦  «                             |¦  «        S )Nr   ztuple index out of range)Ú
isinstanceÚintÚ
IndexErrorÚsuperr   Ú__getitem__)ÚselfÚkÚ	__class__s     €ú^/granary/edev/quantum/lib/python3.11/site-packages/numba/cuda/simulator/cudadrv/devicearray.pyr   zFakeShape.__getitem__   sJ   ø€ Ý�a�ÑÔð 	9 ! a¢% %ÝÐ7Ñ8Ô8Ð8Ý•Y Ñ%Ô%×1Ò1°!Ñ4Ô4Ð4ó    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__classcell__)r   s   @r   r   r      sB   ø€ € € € € ðð ð5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5r   r   c                   óB   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )ÚFakeWithinKernelCUDAArrayaG  
    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                 óH   — t          |t          ¦  «        sJ ‚|| j        d<   d S )NÚ_item)r   ÚFakeCUDAArrayÚ__dict__©r   Úitems     r   Ú__init__z"FakeWithinKernelCUDAArray.__init__*   s*   € Ý˜$¥Ñ.Ô.Ð.Ð.Ð.Ø!%ˆŒ�gÑÐÐr   c                 óN   — t          |t          ¦  «        rt          |¦  «        S |S ©N)r   r   r   r   s     r   Ú__wrap_if_fakez(FakeWithinKernelCUDAArray.__wrap_if_fake.   s'   € Ý�d�MÑ*Ô*ð 	Ý,¨TÑ2Ô2Ð2àˆKr   c                 óì   — |t          | j        j        ¦  «        v r-|                      t	          | j        j        |¦  «        ¦  «        S |                      | j                             |¦  «        ¦  «        S r    )Údirr   Ú_aryÚ(_FakeWithinKernelCUDAArray__wrap_if_fakeÚgetattrr   )r   Úattrnames     r   Ú__getattr__z%FakeWithinKernelCUDAArray.__getattr__4   s_   € Ø•s˜4œ:œ?Ñ+Ô+Ð+Ð+Ø×&Ò&¥w¨t¬z¬ÀÑ'IÔ'IÑJÔJÐJà×&Ò& t¤z×'=Ò'=¸hÑ'GÔ'GÑHÔHÐHr   c                 ó<   — | j                              ||¦  «         d S r    ©r   Ú__setitem__)r   ÚnmÚvals      r   Ú__setattr__z%FakeWithinKernelCUDAArray.__setattr__:   s    € ØŒ
×Ò˜r 3Ñ'Ô'Ð'Ð'Ð'r   c                 ó\   — |                       | j                             |¦  «        ¦  «        S r    )r%   r   r   )r   Úidxs     r   r   z%FakeWithinKernelCUDAArray.__getitem__=   s&   € Ø×"Ò" 4¤:×#9Ò#9¸#Ñ#>Ô#>Ñ?Ô?Ð?r   c                 ó<   — | j                              ||¦  «         d S r    r*   ©r   r0   r-   s      r   r+   z%FakeWithinKernelCUDAArray.__setitem__@   s    € ØŒ
×Ò˜s CÑ(Ô(Ð(Ð(Ð(r   c                 ó*   — t          | j        ¦  «        S r    )Úlenr   ©r   s    r   Ú__len__z!FakeWithinKernelCUDAArray.__len__C   s   € Ý�4”:‰ŒÐr   c                 óÚ   ‡— t          ||¦  «        }d„ Š|                     d¦  «        }|rt          ˆfd„|D ¦   «         ¦  «        |d<   t          ˆfd„|D ¦   «         ¦  «        } ||i |¤ŽS )Nc                 óH   — t          | t          ¦  «        r| j        j        } | S r    )r   r   r   r$   ©Úobjs    r   Úconvert_fakesz@FakeWithinKernelCUDAArray.__array_ufunc__.<locals>.convert_fakesP   s#   € Ý˜#Õ8Ñ9Ô9ð %Ø”i”n�àˆJr   Úoutc              3   ó.   •K  — | ]} ‰|¦  «        V — Œd S r    © )Ú.0Úor;   s     €r   ú	<genexpr>z<FakeWithinKernelCUDAArray.__array_ufunc__.<locals>.<genexpr>X   s-   øè è € Ð!@Ð!@°q - -°Ñ"2Ô"2Ð!@Ð!@Ð!@Ð!@Ð!@Ð!@r   c              3   ó.   •K  — | ]} ‰|¦  «        V — Œd S r    r>   )r?   Úar;   s     €r   rA   z<FakeWithinKernelCUDAArray.__array_ufunc__.<locals>.<genexpr>Y   s-   øè è € Ð4Ð4¨!�]�] 1Ñ%Ô%Ð4Ð4Ð4Ð4Ð4Ð4r   )r&   ÚgetÚtuple)r   ÚufuncÚmethodÚargsÚkwargsÚcallr<   r;   s          @r   Ú__array_ufunc__z)FakeWithinKernelCUDAArray.__array_ufunc__F   sœ   ø€ õ �u˜fÑ%Ô%ˆð	ð 	ð 	ð �jŠj˜ÑÔˆØð 	AÝ!Ð!@Ð!@Ð!@Ð!@¸CÐ!@Ñ!@Ô!@Ñ@Ô@ˆF�5‰MÝÐ4Ð4Ð4Ð4¨tÐ4Ñ4Ô4Ñ4Ô4ˆØˆt�TÐ$˜VÐ$Ð$Ð$r   N)r   r   r   r   r   r%   r(   r.   r   r+   r6   rK   r>   r   r   r   r   !   sœ   € € € € € ðð ð&ð &ð &ðð ð ðIð Ið Ið(ð (ð (ð@ð @ð @ð)ð )ð )ðð ð ð%ð %ð %ð %ð %r   r   c                   ó.  — e Zd ZdZdZd'd„Zed„ ¦   «         Zed„ ¦   «         Zd„ Z	d'd„Z
ed	„ ¦   «         Zd(d„Zd„ Zd„ Zd)d„Zd'd„Zed„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d „ Z!d!„ Z"d"„ Z#d#„ Z$d$„ Z%d%„ Z&d'd&„Z'd
S )*r   zj
    Implements the interface of a DeviceArray/DeviceRecord, but mostly just
    wraps a NumPy array.
    Tr   c                 ó"   — || _         || _        d S r    )r$   Ústream©r   ÚaryrN   s      r   r   zFakeCUDAArray.__init__e   s   € ØˆŒ	ØˆŒˆˆr   c                 ó   — | j         j        S r    ©r$   Únbytesr5   s    r   Ú
alloc_sizezFakeCUDAArray.alloc_sizei   s   € àŒyÔÐr   c                 ó   — | j         j        S r    rR   r5   s    r   rS   zFakeCUDAArray.nbytesm   s   € ð ŒyÔÐr   c                 ó€   — 	 t          | j        |¦  «        }|S # t          $ r}d|z  }t          |¦  «        |‚d }~ww xY w)Nz#Wrapped array has no attribute '%s')r&   r$   ÚAttributeError)r   r'   ÚattrÚeÚmsgs        r   r(   zFakeCUDAArray.__getattr__r   sV   € ð	-Ý˜4œ9 hÑ/Ô/ˆDØˆKøÝð 	-ð 	-ð 	-Ø7¸(ÑBˆCÝ  Ñ%Ô%¨1Ð,øøøøð	-øøøs   ‚ ™
=£8¸=c                 ó,   — t          | j        |¦  «        S r    ©r   r$   )r   rN   s     r   ÚbindzFakeCUDAArray.bindz   s   € Ý˜TœY¨Ñ/Ô/Ð/r   c                 ó*   — |                       ¦   «         S r    )Ú	transposer5   s    r   ÚTzFakeCUDAArray.T}   s   € à�~Š~ÑÔÐr   Nc                 óR   — t          t          j        | j        |¬¦  «        ¦  «        S )N)Úaxes)r   Únpr_   r$   )r   rb   s     r   r_   zFakeCUDAArray.transpose�   s!   € Ý�Rœ\¨$¬)¸$Ð?Ñ?Ô?Ñ@Ô@Ð@r   c                 ó´   — | j                              |¦  «        }t          |¦  «        t          j        t          j        fvr|S t          || j        ¬¦  «        S )N©rN   )r$   r   Útyperc   ÚndarrayÚvoidr   rN   )r   r0   Úrets      r   r   zFakeCUDAArray.__getitem__„   sK   € ØŒi×#Ò# CÑ(Ô(ˆÝ�‰9Œ9�RœZ­¬Ð1Ð1Ð1ØˆJå  ¨T¬[Ð9Ñ9Ô9Ð9r   c                 ó8   — | j                              ||¦  «        S r    )r$   r+   r2   s      r   r+   zFakeCUDAArray.__setitem__‹   s   € ØŒy×$Ò$ S¨#Ñ.Ô.Ð.r   c                 ó’   — |€t          j        | j        ¦  «        }nt          | |¦  «         t          j        || j        ¦  «         |S r    )rc   Ú
empty_liker$   Úcheck_array_compatibilityÚcopytorO   s      r   Úcopy_to_hostzFakeCUDAArray.copy_to_hostŽ   sC   € Øˆ;Ý”- ¤	Ñ*Ô*ˆCˆCå% d¨CÑ0Ô0Ð0Ý
Œ	�#�t”yÑ!Ô!Ð!Øˆ
r   c                 ól  — t          | ¦  «         t          | ¦  «        t          |¦  «        }}t          |t          ¦  «        r t          |¦  «         t	          ||¦  «         n7t          j        ||j        d         rdnddd¬¦  «        }t	          ||¦  «         t          j        |j	        |¦  «         dS )a  
        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ÚFTF)ÚorderÚsubokÚcopyN)
Úsentry_contiguousÚ
array_corer   r   rm   rc   ÚarrayÚflagsrn   r$   )r   rP   rN   Ú	self_coreÚary_cores        r   Úcopy_to_devicezFakeCUDAArray.copy_to_device–   sº   € õ 	˜$ÑÔÐÝ(¨Ñ.Ô.µ
¸3±´�8ˆ	Ý�c�=Ñ)Ô)ð 		;Ý˜cÑ"Ô"Ð"Ý% i°Ñ:Ô:Ð:Ð:å”xØØ&œ_¨^Ô<ÐE�c�cÀ#ØØð	ñ ô ˆHõ
 & i°Ñ:Ô:Ð:Ý
Œ	�)”. (Ñ+Ô+Ð+Ð+Ð+r   c                 ó4   — t          | j        j        ¦  «        S r    )r   r$   Úshaper5   s    r   r   zFakeCUDAArray.shape¬   s   € å˜œœÑ)Ô)Ð)r   c                 ó@   — t           | j        j        |i |¤Ž¦  «        S r    )r   r$   Úravel©r   rH   rI   s      r   r�   zFakeCUDAArray.ravel°   s#   € Ý˜_˜TœYœ_¨dÐ=°fÐ=Ð=Ñ>Ô>Ð>r   c                 ó@   — t           | j        j        |i |¤Ž¦  «        S r    )r   r$   Úreshaper‚   s      r   r„   zFakeCUDAArray.reshape³   s%   € ÝÐ.˜TœYÔ.°Ð?¸Ð?Ð?Ñ@Ô@Ð@r   c                 ó@   — t           | j        j        |i |¤Ž¦  «        S r    )r   r$   Úviewr‚   s      r   r†   zFakeCUDAArray.view¶   s#   € Ý˜^˜TœYœ^¨TÐ<°VÐ<Ð<Ñ=Ô=Ð=r   c                 ó$   — | j         j        j        S r    )r$   rz   Úc_contiguousr5   s    r   Úis_c_contiguouszFakeCUDAArray.is_c_contiguous¹   ó   € ØŒyŒÔ+Ð+r   c                 ó$   — | j         j        j        S r    )r$   rz   Úf_contiguousr5   s    r   Úis_f_contiguouszFakeCUDAArray.is_f_contiguous¼   rŠ   r   c                 ó*   — t          | j        ¦  «        S r    )Ústrr$   r5   s    r   Ú__str__zFakeCUDAArray.__str__¿   ó   € Ý�4”9‰~Œ~Ðr   c                 ó*   — t          | j        ¦  «        S r    )Úreprr$   r5   s    r   Ú__repr__zFakeCUDAArray.__repr__Â   s   € Ý�D”I‰ŒÐr   c                 ó*   — t          | j        ¦  «        S r    )r4   r$   r5   s    r   r6   zFakeCUDAArray.__len__Å   r‘   r   c                 ó2   — t          | j        |k    ¦  «        S r    r\   ©r   Úothers     r   Ú__eq__zFakeCUDAArray.__eq__Ê   ó   € Ý˜TœY¨%Ò/Ñ0Ô0Ð0r   c                 ó2   — t          | j        |k    ¦  «        S r    r\   r—   s     r   Ú__ne__zFakeCUDAArray.__ne__Í   rš   r   c                 ó2   — t          | j        |k     ¦  «        S r    r\   r—   s     r   Ú__lt__zFakeCUDAArray.__lt__Ð   ó   € Ý˜TœY¨Ò.Ñ/Ô/Ð/r   c                 ó2   — t          | j        |k    ¦  «        S r    r\   r—   s     r   Ú__le__zFakeCUDAArray.__le__Ó   rš   r   c                 ó2   — t          | j        |k    ¦  «        S r    r\   r—   s     r   Ú__gt__zFakeCUDAArray.__gt__Ö   rŸ   r   c                 ó2   — t          | j        |k    ¦  «        S r    r\   r—   s     r   Ú__ge__zFakeCUDAArray.__ge__Ù   rš   r   c                 ó0   — t          | j        |z   ¦  «        S r    r\   r—   s     r   Ú__add__zFakeCUDAArray.__add__Ü   ó   € Ý˜TœY¨Ñ.Ñ/Ô/Ð/r   c                 ó0   — t          | j        |z
  ¦  «        S r    r\   r—   s     r   Ú__sub__zFakeCUDAArray.__sub__ß   r¨   r   c                 ó0   — t          | j        |z  ¦  «        S r    r\   r—   s     r   Ú__mul__zFakeCUDAArray.__mul__â   r¨   r   c                 ó0   — t          | j        |z  ¦  «        S r    r\   r—   s     r   Ú__floordiv__zFakeCUDAArray.__floordiv__å   ó   € Ý˜TœY¨%Ñ/Ñ0Ô0Ð0r   c                 ó0   — t          | j        |z  ¦  «        S r    r\   r—   s     r   Ú__truediv__zFakeCUDAArray.__truediv__è   r¨   r   c                 ó0   — t          | j        |z  ¦  «        S r    r\   r—   s     r   Ú__mod__zFakeCUDAArray.__mod__ë   r¨   r   c                 ó0   — t          | j        |z  ¦  «        S r    r\   r—   s     r   Ú__pow__zFakeCUDAArray.__pow__î   r¯   r   c           
      ó‚   — d„ t          j        | j        t          |t	          | ¦  «        |¦  «        ¦  «        D ¦   «         S )Nc                 ó,   — g | ]}t          |¦  «        ‘ŒS r>   )r   )r?   rC   s     r   ú
<listcomp>z'FakeCUDAArray.split.<locals>.<listcomp>ò   s0   € ð 
ð 
ð 
àõ ˜!ÑÔð
ð 
ð 
r   )rc   Úsplitr$   Úranger4   )r   ÚsectionrN   s      r   r¹   zFakeCUDAArray.splitñ   sC   € ð
ð 
å”X˜dœi­¨w½¸D¹	¼	À7Ñ)KÔ)KÑLÔLð
ñ 
ô 
ð 	
r   ©r   r    )Nr   )(r   r   r   r   Ú__cuda_ndarray__r   ÚpropertyrT   rS   r(   r]   r`   r_   r   r+   ro   r}   r   r�   r„   r†   r‰   r�   r�   r”   r6   r™   rœ   rž   r¡   r£   r¥   r§   rª   r¬   r®   r±   r³   rµ   r¹   r>   r   r   r   r   ]   sy  € € € € € ðð ð
 Ððð ð ð ð ð ð  ñ „Xð ð ð ð  ñ „Xð ð-ð -ð -ð0ð 0ð 0ð 0ð ð ð  ñ „Xð ðAð Að Að Að:ð :ð :ð/ð /ð /ðð ð ð ð,ð ,ð ,ð ,ð, ð*ð *ñ „Xð*ð?ð ?ð ?ðAð Að Að>ð >ð >ð,ð ,ð ,ð,ð ,ð ,ðð ð ðð ð ðð ð ð
1ð 1ð 1ð1ð 1ð 1ð0ð 0ð 0ð1ð 1ð 1ð0ð 0ð 0ð1ð 1ð 1ð0ð 0ð 0ð0ð 0ð 0ð0ð 0ð 0ð1ð 1ð 1ð0ð 0ð 0ð0ð 0ð 0ð1ð 1ð 1ð
ð 
ð 
ð 
ð 
ð 
r   r   c                 ó¸   — | j         r| j        s| S g }| j         D ],}|                     |dk    rdnt          d¦  «        ¦  «         Œ-| t	          |¦  «                 S )aG  
    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ÚslicerE   )rP   Ú
core_indexÚstrides      r   rx   rx   ø   sn   € ð Œ;ð ˜cœhð Øˆ
Ø€JØ”+ð =ð =ˆØ×Ò˜v¨š{˜{˜!˜!µ°d±´Ñ<Ô<Ð<Ð<Ø�u�ZÑ Ô Ô!Ð!r   c                 óÆ   — | j         j        }t          t          | j        ¦  «        t          | j        ¦  «        ¦  «        D ]\  }}|dk    r|dk    r||k    r dS ||z  }Œ dS )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À   )rP   rÁ   r   rÅ   s       r   Úis_contiguousrÌ   
  so   € ð Œ9Ô€DÝ�X c¤iÑ0Ô0µ(¸3¼;Ñ2GÔ2GÑHÔHð ð ‰ˆˆvØ�1Š9ˆ9˜ 1š˜Ø�vŠ~ˆ~Ø�u�uØ�E‰MˆDøØˆ4r   c                 ó„   — t          | ¦  «        }|j        d         s!|j        d         st          t          ¦  «        ‚d S d S )Nrq   ÚF_CONTIGUOUS)rx   rz   Ú
ValueErrorÚerrmsg_contiguous_buffer)rP   Úcores     r   rw   rw     sM   € Ý�c‰?Œ?€DØŒ:�nÔ%ð 3¨d¬j¸Ô.Hð 3ÝÕ1Ñ2Ô2Ð2ð3ð 3ð 3ð 3r   c                 óp  — |                       ¦   «         |                      ¦   «         }}| j        |j        k    rt          d| j        ›d|j        ›�¦  «        ‚|j        |j        k    rt	          d| j        ›d|j        ›�¦  «        ‚|j        |j        k    rt	          d| j        ›d|j        ›�¦  «        ‚d S )Nzincompatible dtype: z vs. zincompatible shape: zincompatible strides: )ÚsqueezerÈ   Ú	TypeErrorr   rÏ   rÀ   )Úary1Úary2Úary1sqÚary2sqs       r   rm   rm      sÈ   € Ø—\’\‘^”^ T§\¢\¡^¤^ˆF€FØ„z�T”ZÒÐÝˆiØœ˜˜ T¤Z Zð1ñ 2ô 2ð 	2à„|�v”|Ò#Ð#ÝˆjØœ*˜*˜* d¤j jð2ñ 3ô 3ð 	3à„~˜œÒ'Ð'ÝˆjØœ,˜,˜,¨¬¨ð6ñ 7ô 7ð 	7ð (Ð'r   Tc           	      óÔ  — t          j        | dd¬¦  «        } t          | ¦  «         |€¨| j        j        dv rt           j        n| j        }t          t          j        t          j        t          | ¦  «        ¦  «         
                    |¦  «        | j        | j        | j        ¬¦  «         
                    t          | ¦  «        ¬¦  «        ¦  «        S |                     | |¬¦  «         d S )NFT©rv   ru   ÚMm)ÚbufferrÈ   r   rÀ   )rf   re   )rc   ry   rw   rÈ   ÚcharÚint64r   rg   rv   rx   r†   r   rÀ   rf   r}   )rP   rN   rv   ÚtoÚbuffer_dtypes        r   Ú	to_devicerá   -  sÔ   € Ý
Œ(�3˜U¨$Ð
/Ñ
/Ô
/€CÝ�cÑÔÐØ	€zØ#&¤9¤>°TÐ#9Ð#9•r”x�x¸s¼yˆÝÝŒJÝ”w�z¨#™œÑ/Ô/×4Ò4°\ÑBÔBØ”iØ”iØœð	ñ ô ÷
 Šd�˜S™	œ	ˆdÑ"Ô"ñ
ô 
ð 	
ð 	×Ò˜# fÐÑ-Ô-Ð-Ð-Ð-r   c              #   ó   K  — d V — d S r    r>   )Úargs    r   Úpinnedrä   >  s   è è € à	€E€E€E€E€Er   c                  óV   — dD ]}||v r|                      |¦  «         Œt          | i |¤ŽS )N)ÚportableÚwc)ÚpopÚdevice_array)rH   rI   Ú
unused_args      r   Úmapped_arrayrë   C  sB   € Ø(ð #ð #ˆ
Ø˜ÐÐØ�JŠJ�zÑ"Ô"Ð"øÝ˜Ð( Ð(Ð(Ð(r   rr   c                 ó2   — t          j        | |||¬¦  «        S ©N)r   rÀ   rÈ   rt   ©rc   rg   ©r   rÈ   rÀ   rt   s       r   Úpinned_arrayrð   J  ó   € ÝŒ:˜E¨7¸%ÀuÐMÑMÔMÐMr   c                 ó2   — t          j        | |||¬¦  «        S rí   rî   rï   s       r   Úmanaged_arrayró   N  rñ   r   c                  óx   — d|v r|                      d¦  «        nd}t          t          j        | i |¤Ž|¬¦  «        S )NrN   r   re   )rè   r   rc   rg   )rH   rI   rN   s      r   ré   ré   R  sD   € Ø%-°Ð%7Ð%7ˆV�ZŠZ˜Ñ!Ô!Ð!¸Q€FÝ�œ TÐ4¨VÐ4Ð4¸VÐDÑDÔDÐDr   c                 óZ  — | j         d         s| j         d         s| j        dk    rdS d„ t          | j        ¦  «        D ¦   «         }|                     d„ ¬¦  «         dgt          | j        ¦  «        z  }| j        j        }|D ]\  }}|||<   || j        |         z  }Œt          |¦  «        S )	z[
    Given an array, compute strides for a new contiguous array of the same
    shape.
    rq   rÎ   rÇ   Nc                 ó   — g | ]}|‘ŒS r>   r>   )r?   Úxs     r   r¸   z2_contiguous_strides_like_array.<locals>.<listcomp>h  s   € Ð6Ð6Ð6˜�1Ð6Ð6Ð6r   c                 ó   — | d         S )NrÇ   r>   )r÷   s    r   ú<lambda>z0_contiguous_strides_like_array.<locals>.<lambda>i  s
   €  ! A¤$€ r   )Úkeyr   )
rz   ÚndimÚ	enumeraterÀ   Úsortr4   rÈ   rÉ   r   rE   )rP   Ú
stridepermrÀ   rÅ   Úi_permÚ_s         r   Ú_contiguous_strides_like_arrayr  W  sÂ   € ð „y�Ô ð  C¤I¨nÔ$=ð ÀÄÈQÂÀØˆtð 7Ð6�i¨¬Ñ4Ô4Ð6Ñ6Ô6€JØ‡O‚O˜˜€OÑ'Ô'Ð'ð ˆc•C˜œÑ$Ô$Ñ$€GØŒYÔ€FØð $ð $‰	ˆ�Ø ˆ�‰Ø�#”)˜FÔ#Ñ#ˆˆÝ�‰>Œ>Ðr   c                 ó>   — | j         d         r| j         d         sdS dS )NrÎ   rq   rs   rr   )rz   )rP   s    r   Ú_order_like_arrayr  t  s)   € Ø
„y�Ô ð ¨¬°>Ô)Bð Øˆsàˆsr   c                 óx   — t          | ¦  «        }t          | ¦  «        }t          | j        | j        ||¬¦  «        S ©Nrï   )r  r  ré   r   rÈ   )rP   rN   rÀ   rt   s       r   Údevice_array_liker  {  ó@   € Ý,¨SÑ1Ô1€GÝ˜cÑ"Ô"€EÝ˜cœi¨s¬yÀ'Ø#ð%ñ %ô %ð %r   c                 óx   — t          | ¦  «        }t          | ¦  «        }t          | j        | j        ||¬¦  «        S r  )r  r  rð   r   rÈ   )rP   rÀ   rt   s      r   Úpinned_array_liker	  ‚  r  r   c                 ó¼   — t          | t          ¦  «        r| dfS t          | t          j        ¦  «        st          j        | dd¬¦  «        } t          | ||¦  «        dfS )NFTrÚ   )r   r   rc   rh   ry   rá   )rP   rN   rv   s      r   Úauto_devicer  ‰  sj   € Ý�#•}Ñ%Ô%ð Ø�EˆzÐå�c�2œ7Ñ#Ô#ð ÝŒhØØØðñ ô ˆõ �S˜& $Ñ'Ô'¨Ð-Ð-r   c                 ó$   — t          | dd¦  «        S )z$Check if an object is a CUDA ndarrayr½   F)r&   r9   s    r   Úis_cuda_ndarrayr  •  s   € å�3Ð*¨EÑ2Ô2Ð2r   c                 óÂ   ‡ — t          ‰ ¦  «         ˆ fd„} |dt          ¦  «          |dt          ¦  «          |dt          j        ¦  «          |dt          ¦  «         dS )z,Verify the CUDA ndarray interface for an objc                 óª   •— t          ‰| ¦  «        st          | ¦  «        ‚t          t          ‰| ¦  «        |¦  «        st          | ›d|›�¦  «        ‚d S )Nz must be of type )ÚhasattrrW   r   r&   )rX   Útypr:   s     €r   Úrequires_attrz4verify_cuda_ndarray_interface.<locals>.requires_attrž  se   ø€ Ý�s˜DÑ!Ô!ð 	'Ý  Ñ&Ô&Ð&Ý�' # tÑ,Ô,¨cÑ2Ô2ð 	HÝ ¸D¸D¸DÀ#À#Ð!FÑGÔGÐGð	Hð 	Hr   r   rÀ   rÈ   rÁ   N)Úrequire_cuda_ndarrayrE   rc   rÈ   r   )r:   r  s   ` r   Úverify_cuda_ndarray_interfacer  š  s�   ø€ å˜ÑÔÐðHð Hð Hð Hð Hð €M�'�5Ñ!Ô!Ð!Ø€M�)�UÑ#Ô#Ð#Ø€M�'�2œ8Ñ$Ô$Ð$Ø€M�&�#ÑÔÐÐÐr   c                 óB   — t          | ¦  «        st          d¦  «        ‚dS )z9Raises ValueError is is_cuda_ndarray(obj) evaluates Falsezrequire an cuda ndarray objectN)r  rÏ   r9   s    r   r  r  ª  s+   € å˜3ÑÔð ;ÝÐ9Ñ:Ô:Ð:ð;ð ;r   )r   TNr¼   )r   T) r   Ú
contextlibr   Únumpyrc   ÚDeviceRecordÚfrom_record_likerÐ   rE   r   Úobjectr   r   rx   rÌ   rw   rm   rá   rä   rë   Úfloat_rð   ró   ré   r  r  r  r	  r  r  r  r  r>   r   r   ú<module>r     s*  ððð ð &Ð %Ð %Ð %Ð %Ð %à Ð Ð Ð ð €ØÐ ð3Ð ð
5ð 
5ð 
5ð 
5ð 
5�ñ 
5ô 
5ð 
5ð9%ð 9%ð 9%ð 9%ð 9% ñ 9%ô 9%ð 9%ðxX
ð X
ð X
ð X
ð X
�Fñ X
ô X
ð X
ðv"ð "ð "ð$ð ð ð 3ð 3ð 3ð
7ð 
7ð 
7ð.ð .ð .ð .ð" ð
ð 
ñ „ð
ð)ð )ð )ð !œi°¸Sð Nð Nð Nð Nð  "œy°$¸cð Nð Nð Nð NðEð Eð Eð
ð ð ð:ð ð ð%ð %ð %ð %ð%ð %ð %ð	.ð 	.ð 	.ð 	.ð3ð 3ð 3ð
ð ð ð ;ð ;ð ;ð ;ð ;r   