a
    `                     @   sZ  d dl mZ d dlmZ d dlmZmZ zd dlmZ W n   edZY n0 d dl	Z	d dl
Zd dl	mZ z"d dlZejeju rdd	 e_W n   dZY n0 d
d Zdd Zee	jedkrejdddd Zejdddd ZnFee	jedkr(ejdddd Zejdddd Znedejdd ZdddZejdd ZdS )     )division)LooseVersion)ceilisnan)nanr   N)cudac                  G   s   t jdd | D  S )Nc                 S   s"   g | ]}t |tjr|jn|qS  )
isinstancecupyZndarraydtype).0argr   r   Hlib/python3.9/site-packages/datashader/transfer_functions/_cuda_utils.py
<listcomp>   s   z<lambda>.<locals>.<listcomp>)npresult_type)argsr   r   r   <lambda>   s   r   c                    sb   t | tr| f} t j}tt|d dt|     ft|  }t fdd| D }||fS )aP  
    Compute the blocks-per-grid and threads-per-block parameters for use when
    invoking cuda kernels

    Parameters
    ----------
    shape: int or tuple of ints
        The shape of the input array that the kernel will parallelize over

    Returns
    -------
    tuple
        Tuple of (blocks_per_grid, threads_per_block)
    g       @g      ?c                 3   s   | ]}t t|  V  qd S N)intr   )r   dZthreads_per_blockr   r   	<genexpr>6       zcuda_args.<locals>.<genexpr>)r	   r   r   Zget_current_deviceZMAX_THREADS_PER_BLOCKr   lentuple)shapeZmax_threadsZtpbZbpgr   r   r   	cuda_args   s    

r   c                 C   s   t t| j | ||| dS )a  
    Clip the elements of an input array between lower and upper bounds,
    skipping over elements that are masked out.

    Parameters
    ----------
    data: cupy.ndarray
        Numeric ndarray that will be clipped in-place
    mask: cupy.ndarray
        Boolean ndarray where True values indicate elements that should be
        skipped
    lower: int or float
        Lower bound to clip to
    upper: int or float
        Upper bound to clip to

    Returns
    -------
    None
        data array is modified in-place
    N)masked_clip_2d_kernelr   r   )datamasklowerupperr   r   r   masked_clip_2d<   s    r#   z0.51.0T)Zdevicec                 C   s   t j| ||S r   )r   atomicZnanminZaryidxvalr   r   r   cuda_atomic_nanminX   s    r(   c                 C   s   t j| ||S r   )r   r$   Znanmaxr%   r   r   r   cuda_atomic_nanmax[   s    r)   z0.49.1c                 C   s   t j| ||S r   )r   r$   minr%   r   r   r   r(   _   s    c                 C   s   t j| ||S r   )r   r$   maxr%   r   r   r   r)   b   s    z0Datashader's CUDA support requires numba!=0.50.0c                 C   sh   t d\}}| j\}}|dkrd||k rd|dkrd||k rd|||f sdt| ||f| t| ||f| d S )N   r   )r   gridr   r)   r(   )r   r    r!   r"   ijZmaxiZmaxjr   r   r   r   i   s
    
,r   c                 C   s   t j| jt jd}t| jdks$J |du r4|d }t|}|du rL|d }t|}tt| j | t j|t j|t j||| |S )z
    cupy implementation of np.interp.  This function can be removed when an
    official cupy.interp function is added to the cupy library.
    )r   r,   Nr   )	r
   Zzerosr   Zfloat64r   floatinterp2d_kernelr   Zastype)xxpfpleftrightoutput_yr   r   r   interpu   s    $r9   c                 C   s,  t d\}}|| jd k r(|| jd k r(| ||f }t|rPt|||f< n||d k rj||||f< n||d kr||||f< nt|d }	d}
d|
|	 d  }|| |k r|}
q||d  |kr|d }	qqq||d  }|| }||d  }|| }|| ||  }||||   }||||f< d S )Nr,   r      r0   )r   r-   r   r   r   r   )r3   r4   r5   r6   r7   r8   r.   r/   ZxvalZupper_iZlower_iZstop_iZx0Zx1Zy0Zy1ZslopeZy_interpr   r   r   r2      s0     
r2   )NN)Z
__future__r   Zdistutils.versionr   Zmathr   r   r   r1   ZnumbaZnumpyr   r   r
   r   r   r#   __version__Zjitr(   r)   ImportErrorr   r9   r2   r   r   r   r   <module>   sB   








