a
    `i                     @   s  d dl mZmZmZ d dlZd dlmZmZm	Z	m
Z
 d dlmZ d dlmZmZ d dlZd dlmZ d dlmZ zd dlmZmZ W n ey   d	\ZZY n0 zd dlZW n ey   dZY n0 d
dlmZm Z m!Z! G dd deZ"G dd de"Z#G dd de"Z$G dd de$Z%G dd de%Z&G dd de&Z'G dd de$Z(G dd deZ)G dd de)Z*G dd de*Z+G d d! d!e)Z,G d"d# d#e*Z-G d$d% d%e)Z.G d&d' d'e)Z/G d(d) d)e/Z0G d*d+ d+e/Z1G d,d- d-e/Z2G d.d/ d/e/Z3G d0d1 d1e/Z4G d2d3 d3e,Z5G d4d5 d5e)Z6G d6d7 d7e)Z7G d8d9 d9e)Z8G d:d; d;e)Z9G d<d= d=e)Z:G d>d? d?e)Z;G d@dA dAeZ<e=e>dBdC e? @ D ddg ZAdS )D    )absolute_importdivisionprint_functionN)dshape	isnumericRecordOption)	coretypes)concatuniqueisnull)cuda)cuda_atomic_nanmincuda_atomic_nanmax)NN   )Exprngjitnansum_missingc                   @   s$   e Zd ZdZdd Zedd ZdS )
Preprocessz#Base clase for preprocessing steps.c                 C   s
   || _ d S Ncolumnselfr    r   4lib/python3.9/site-packages/datashader/reductions.py__init__   s    zPreprocess.__init__c                 C   s   | j fS r   r   r   r   r   r   inputs   s    zPreprocess.inputsN)__name__
__module____qualname____doc__r   propertyr   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdd ZdS )extractz=Extract a column from a dataframe as a numpy array of values.c                 C   sv   t rNt|t jrNdd l}|| j jjdkr2tj}nd}|	|| j j
|dS t|tjrf|| j jS || j jS d S )Nr   fZfillna)cudf
isinstance	DataFramecupyr   dtypekindnpnanZarrayto_gpu_arrayxrZDatasetdatavalues)r   dfr+   nullvalr   r   r   apply&   s    zextract.applyN)r    r!   r"   r#   r6   r   r   r   r   r%   $   s   r%   c                   @   s4   e Zd ZdZedd Zdd Zdd Zdd	 Zd
S )CategoryPreprocessz*Base class for categorizing preprocessors.c                 C   s   | j S z"Returns name of categorized columnr   r   r   r   r   
cat_column6   s    zCategoryPreprocess.cat_columnc                 C   s   t ddS )z7Returns list of categories corresponding to input shapezcategories not implementedNNotImplementedErrorr   input_dshaper   r   r   
categories;   s    zCategoryPreprocess.categoriesc                 C   s   t ddS )zValidates input shapezvalidate not implementedNr:   r   	in_dshaper   r   r   validate?   s    zCategoryPreprocess.validatec                 C   s   t ddS )z3Applies preprocessor to DataFrame and returns arrayzapply not implementedNr:   r   r4   r   r   r   r6   C   s    zCategoryPreprocess.applyN)	r    r!   r"   r#   r$   r9   r>   rA   r6   r   r   r   r   r7   4   s   
r7   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	category_codesz:Extract just the category codes from a categorical column.c                 C   s   |j | j jS r   )measurer   r>   r<   r   r   r   r>   I   s    zcategory_codes.categoriesc                 C   s4   | j |jvrtdt|j| j  tjs0tdd S )Nspecified column not foundzinput must be categorical)r   dict
ValueErrorr)   rD   ctZCategoricalr?   r   r   r   rA   L   s    zcategory_codes.validatec                 C   s6   t r"t|t jr"|| j jj S || j jjjS d S r   )r(   r)   r*   r   catZcodesr0   r3   rB   r   r   r   r6   R   s    zcategory_codes.applyN)r    r!   r"   r#   r>   rA   r6   r   r   r   r   rC   G   s   rC   c                	       sn   e Zd ZdZejejejejej	ej
ejejejh	Zd fdd	Z fddZdd Zd	d
 Zdd Z  ZS )category_moduloz
    A variation on category_codes that assigns categories using an integer column, modulo a base.
    Category is computed as (column_value - offset)%modulo.
    r   c                    s   t  | || _|| _d S r   )superr   offsetmodulo)r   r   rM   rL   	__class__r   r   r   a   s    zcategory_modulo.__init__c                    s   t   | j| jf S r   )rK   _hashable_inputsrL   rM   r   rN   r   r   rP   f   s    z category_modulo._hashable_inputsc                 C   s   t t| jS r   )listrangerM   r?   r   r   r   r>   i   s    zcategory_modulo.categoriesc                 C   s2   | j |jvrtd|j| j  | jvr.tdd S )NrE   zinput must be an integer column)r   rF   rG   rD   IntegerTypesr?   r   r   r   rA   l   s    zcategory_modulo.validatec                 C   s8   || j  | j | j }tr.t|tjr.| S |jS d S r   )r   rL   rM   r(   r)   r*   r0   r3   )r   r4   resultr   r   r   r6   r   s    zcategory_modulo.apply)r   )r    r!   r"   r#   rH   bool_Zuint8Zuint16uint32Zuint64Zint8Zint16Zint32Zint64rS   r   rP   r>   rA   r6   __classcell__r   r   rN   r   rJ   X   s   (rJ   c                       s>   e Zd ZdZd fdd	Z fddZdd Zd	d
 Z  ZS )category_binninga  
    A variation on category_codes that assigns categories by binning a continuous-valued column.
    The number of categories returned is always nbins+1.
    The last category (nbin) is for NaNs in the data column, as well as for values under/over the binned
    interval (when include_under or include_over is False).

    Parameters
    ----------
    column:   column to use
    lower:    lower bound of first bin
    upper:    upper bound of last bin
    nbins:     number of bins
    include_under: if True, values below bin 0 are assigned to category 0
    include_over:  if True, values above the last bin (nbins-1) are assigned to category nbin-1
    Tc                    sT   t  ||d  || _|| t| | _|| _|r8dn|| _|rJ|d n|| _d S )Nr   r   )rK   r   bin0floatbinsizenbins	bin_underbin_over)r   r   lowerupperr\   Zinclude_underZinclude_overrN   r   r   r      s    zcategory_binning.__init__c                    s   t   | j| j| j| jf S r   )rK   rP   rY   r[   r]   r^   r   rN   r   r   rP      s    z!category_binning._hashable_inputsc                 C   s   | j |jvrtdd S )NrE   )r   rF   rG   r?   r   r   r   rA      s    zcategory_binning.validatec                 C   sr   t rt|t jrtdnT|| j j}|| j | j t	}| j
||dk < | j||| jk< | j|t|< |S d S )Nz'this feature is not implemented in cudar   )r(   r)   r*   r;   r   r3   rY   r[   Zastypeintr]   r^   r\   r.   Zisnan)r   r4   valueindexr   r   r   r6      s    
zcategory_binning.apply)TT)	r    r!   r"   r#   r   rP   rA   r6   rW   r   r   rN   r   rX   y   s
   rX   c                       sP   e Zd ZdZ fddZedd Zedd Zdd	 Zd
d Z	dd Z
  ZS )category_valueszVExtract a category and a value column from a dataframe as (2,N) numpy array of values.c                    s   t  | || _d S r   )rK   r   categorizer)r   re   Zvalue_columnrN   r   r   r      s    zcategory_values.__init__c                 C   s   | j j| jfS r   re   r   r   r   r   r   r      s    zcategory_values.inputsc                 C   s   | j jS r8   rf   r   r   r   r   r9      s    zcategory_values.cat_columnc                 C   s   | j jS r   )re   r>   r<   r   r   r   r>      s    zcategory_values.categoriesc                 C   s   | j |S r   )re   rA   r?   r   r   r   rA      s    zcategory_values.validatec                 C   s   | j |}trvt|tjrvdd l}|| j jjdkr>t	j
}nd}||}||| j j|d}|j||fddS || j j}t	j||fddS d S )Nr   r&   r'   axis)re   r6   r(   r)   r*   r+   r   r,   r-   r.   r/   Zasarrayr0   stackr3   )r   r4   ar+   r5   br   r   r   r6      s    
zcategory_values.apply)r    r!   r"   r#   r   r$   r   r9   r>   rA   r6   rW   r   r   rN   r   rd      s   

rd   c                   @   sl   e Zd ZdZdddZdd Zdd Zed	d
 ZdddZ	dddZ
dd ZdddZdd Zdd ZdS )	Reductionz"Base class for per-bin reductions.Nc                 C   s
   || _ d S r   r   r   r   r   r   r      s    zReduction.__init__c                 C   s0   | j |jvrtdt|j| j  s,tdd S )NrE   zinput must be numeric)r   rF   rG   r   rD   r?   r   r   r   rA      s    zReduction.validatec                 C   s   | j S r   )_dshaper?   r   r   r   
out_dshape   s    zReduction.out_dshapec                 C   s   t | jfS r   r%   r   r   r   r   r   r      s    zReduction.inputsFc                 C   s   | fS r   r   r   r   r   r   r   _build_bases   s    zReduction._build_basesc                 C   s   dS Nr   r   rq   r   r   r   _build_temps   s    zReduction._build_tempsc                 C   s   | j S r   )_creater   r   r   r   r   _build_create   s    zReduction._build_createc                 C   s6   |r| j d u r| jS | jS n| j d u r,| jS | jS d S r   )r   _append_no_field_cuda_append_cuda_append_no_field_appendr   r   Zschemar   r   r   r   _build_append   s    

zReduction._build_appendc                 C   s   | j S r   )_combinerv   r   r   r   _build_combine   s    zReduction._build_combinec                 C   s   | j S r   )	_finalizerv   r   r   r   _build_finalize   s    zReduction._build_finalize)N)F)F)F)r    r!   r"   r#   r   rA   ro   r$   r   rr   rt   rw   r}   r   r   r   r   r   r   rm      s   




rm   c                   @   s<   e Zd ZdZdddZedd Zdd Zedd
dZ	dS )OptionalFieldReductionzOBase class for things like ``count`` or ``any`` for which the field is optionalNc                 C   s
   || _ d S r   r   r   r   r   r   r      s    zOptionalFieldReduction.__init__c                 C   s   | j d urt| j fS dS rs   )r   r%   r   r   r   r   r      s    zOptionalFieldReduction.inputsc                 C   s   d S r   r   r?   r   r   r   rA     s    zOptionalFieldReduction.validateFc                 K   s   t j| d fi |S Nr   r1   	DataArraybasesr   kwargsr   r   r   r     s    z OptionalFieldReduction._finalize)N)F)
r    r!   r"   r#   r   r$   r   rA   staticmethodr   r   r   r   r   r      s   

r   c                   @   s   e Zd ZdZeejZee	dd Z
ee	dd Zeejdddd	 Zeejddd
d Zedd Zedd ZdS )countzCount elements in each bin, returning the result as a uint32.

    Parameters
    ----------
    column : str, optional
        If provided, only counts elements in ``column`` that are not ``NaN``.
        Otherwise, counts every element.
    c                 C   s   ||| f  d7  < d S Nr   r   xyaggr   r   r   rz     s    zcount._append_no_fieldc                 C   s    t |s||| f  d7  < d S r   r   r   r   r   fieldr   r   r   r{     s    zcount._appendT)Zdevicec                 C   s   t j||| fd d S r   )nb_cudaatomicaddr   r   r   r   rx   #  s    zcount._append_no_field_cudac                 C   s    t |stj||| fd d S r   r   r   r   r   r   r   r   r   ry   (  s    zcount._append_cudac                 C   s   |j | ddS )Nu4r,   ZzerosshapeZarray_moduler   r   r   ru   .  s    zcount._createc                 C   s   | j dddS )Nr   r   ri   r,   sumZaggsr   r   r   r~   2  s    zcount._combineN)r    r!   r"   r#   r   rH   rV   rn   r   r   rz   r{   r   Zjitrx   ry   ru   r~   r   r   r   r   r   
  s$   



r   c                   @   s   e Zd ZdZe fddZdd ZdddZed	d
 Z	edd Z
dd Zdd Zedd Zdd ZdddZd ddZdd Zdd ZdS )!byay  Apply the provided reduction separately per category.
    Parameters
    ----------
    cats: str or CategoryPreprocess instance
        Name of column to aggregate over, or a categorizer object that returns categories.
        Resulting aggregate has an outer dimension axis along the categories present.
    reduction : Reduction
        Per-category reduction function.
    c                 C   s~   t |tr|| _nt |tr(t|| _ntd| jj| _| jjt|dd f| _|| _	| j
d urrt| j| j
| _n| j| _d S )NzEfirst argument must be a column name or a CategoryPreprocess instancer   )r)   r7   re   strrC   	TypeErrorr   getattrcolumns	reduction
val_columnrd   
preprocess)r   r9   r   r   r   r   r   A  s    



zby.__init__c                 C   s    t t| |  | j | jfS r   )hashtyperP   re   r   r   r   r   r   __hash__R  s    zby.__hash__Fc                    s   t  fdd j|D S )Nc                 3   s   | ]}t  j|V  qd S r   r   re   ).0tmpr   r   r   	<genexpr>V      z"by._build_temps.<locals>.<genexpr>)tupler   rt   rq   r   r   r   rt   U  s    zby._build_tempsc                 C   s
   | j d S r   r   r   r   r   r   r9   X  s    zby.cat_columnc                 C   s
   | j d S r   r   r   r   r   r   r   \  s    zby.val_columnc                 C   s   | j | | j| d S r   )r   rA   r   r?   r   r   r   rA   `  s    zby.validatec                    s2   | j |}| j| tt fdd|D S )Nc                    s   g | ]}| fqS r   r   )r   cZ	red_shaper   r   
<listcomp>g  r   z!by.out_dshape.<locals>.<listcomp>)re   r>   r   ro   r   r   )r   r=   catsr   r   r   ro   d  s    zby.out_dshapec                 C   s   | j fS r   )r   r   r   r   r   r   i  s    z	by.inputsc                    s   t jj  fddS )Nc                    s   j |  f |S r   )r   rw   r   Zn_catsro   r   r   r   <lambda>o  s   
z"by._build_create.<locals>.<lambda>)lenrD   fields)r   ro   r   r   r   rw   m  s    zby._build_createc                    s>    j |}t|dkr(|d  u r(|S t fdd|D S )Nr   r   c                 3   s   | ]}t  j|V  qd S r   r   )r   baser   r   r   r   v  r   z"by._build_bases.<locals>.<genexpr>)r   rr   r   r   )r   r   r   r   r   r   rr   r  s    zby._build_basesc                 C   s   | j |||S r   )r   r}   r|   r   r   r   r}   x  s    zby._build_appendc                 C   s   | j jS r   )r   r~   rv   r   r   r   r   {  s    zby._build_combinec                    s$   t j| d fdd	}|S )NFc                    s:   |d  j g7  <  |d j < jj| fd|i|S )NZdimsZcoordsr   )r9   r   r   r   r   r   r   r   finalize  s    z$by._build_finalize.<locals>.finalize)F)rQ   re   r>   )r   r   r   r   r   r   r   ~  s    zby._build_finalizeN)F)F)F)r    r!   r"   r#   r   r   r   rt   r$   r9   r   rA   ro   r   rw   rr   r}   r   r   r   r   r   r   r   7  s"   	





r   c                   @   sZ   e Zd ZdZeejZee	dd Z
e
Zee	dd ZeZedd Zedd	 Zd
S )anyzWhether any elements in ``column`` map to each bin.

    Parameters
    ----------
    column : str, optional
        If provided, only elements in ``column`` that are ``NaN`` are skipped.
    c                 C   s   d||| f< d S NTr   r   r   r   r   rz     s    zany._append_no_fieldc                 C   s   t |sd||| f< d S r   r   r   r   r   r   r{     s    zany._appendc                 C   s   |j | ddS )Nboolr   r   r   r   r   r   ru     s    zany._createc                 C   s   | j dddS )Nr   r   r   r   r   r   r   r   r~     s    zany._combineN)r    r!   r"   r#   r   rH   rU   rn   r   r   rz   rx   r{   ry   ru   r~   r   r   r   r   r     s   

r   c                   @   sp   e Zd ZdZeeejZe	dddZ
edd Ze	dd Ze	ed	d
 Ze	edd Ze	dd ZdS )	_upsamplez+"Special internal class used for upsamplingFc                 K   s   t j| d fi |S r   r   r   r   r   r   r     s    z_upsample._finalizec                 C   s   t | jfS r   rp   r   r   r   r   r     s    z_upsample.inputsc                 C   s   |j | ddS Nf8r   )emptyr   r   r   r   ru     s    z_upsample._createc                 C   s   d S r   r   r   r   r   r   r{     s    z_upsample._appendc                 C   s   d S r   r   r   r   r   r   ry     s    z_upsample._append_cudac                 C   s   t j| ddS Nr   rh   r.   Znanmaxr   r   r   r   r~     s    z_upsample._combineN)F)r    r!   r"   r#   r   r   rH   float64rn   r   r   r$   r   ru   r   r{   ry   r~   r   r   r   r   r     s    

r   c                   @   s8   e Zd ZdZeeejZe	dd Z
e	dddZdS )	FloatingReductionzBBase classes for reductions that always have floating-point dtype.c                 C   s   |j | tjddS r   )fullr.   r/   r   r   r   r   ru     s    zFloatingReduction._createFc                 K   s   t j| d fi |S r   r   r   r   r   r   r     s    zFloatingReduction._finalizeN)F)r    r!   r"   r#   r   r   rH   r   rn   r   ru   r   r   r   r   r   r     s   
r   c                   @   sH   e Zd ZdZedd Zeedd Zeedd Zedd	 Z	d
S )	_sum_zerozSum of all elements in ``column``.

    Parameters
    ----------
    column : str
        Name of the column to aggregate over. Column data type must be numeric.
        ``NaN`` values in the column are skipped.
    c                 C   s   |j | ddS r   r   r   r   r   r   ru     s    z_sum_zero._createc                 C   s    t |s||| f  |7  < d S r   r   r   r   r   r   r{     s    z_sum_zero._appendc                 C   s    t |stj||| f| d S r   r   r   r   r   r   ry     s    z_sum_zero._append_cudac                 C   s   | j dddS )Nr   r   r   r   r   r   r   r   r~     s    z_sum_zero._combineN)
r    r!   r"   r#   r   ru   r   r{   ry   r~   r   r   r   r   r     s   	
r   c                   @   sR   e Zd ZdZeeejZdddZ	e
dddZe
edd Ze
d	d
 ZdS )r   a  Sum of all elements in ``column``.

    Elements of resulting aggregate are nan if they are not updated.

    Parameters
    ----------
    column : str
        Name of the column to aggregate over. Column data type must be numeric.
        ``NaN`` values in the column are skipped.
    Fc                 C   s"   |rt | jt| jfS | fS d S r   )r   r   r   rq   r   r   r   rr     s    zsum._build_basesc                 K   sH   |r.| \}}t ||t j}tj|fi |S tj| d fi |S d S r   )r.   wherer/   r1   r   )r   r   r   sumsZanysr   r   r   r   r   
  s
    zsum._finalizec                 C   s>   t |s:t ||| f r&|||| f< n||| f  |7  < d S r   r   r   r   r   r   r{     s    zsum._appendc                 C   s   t | ddS r   )r   r   r   r   r   r~     s    zsum._combineN)F)F)r    r!   r"   r#   r   r   rH   r   rn   rr   r   r   r   r{   r~   r   r   r   r   r     s   


r   c                       sT   e Zd ZdZedd ZdddZd fdd	Zeed	d
 Z	edd Z
  ZS )m2a`  Sum of square differences from the mean of all elements in ``column``.

    Intermediate value for computing ``var`` and ``std``, not intended to be
    used on its own.

    Parameters
    ----------
    column : str
        Name of the column to aggregate over. Column data type must be numeric.
        ``NaN`` values in the column are skipped.
    c                 C   s   |j | dddS )Ng        r   r   )r   r   r   r   r   ru   0  s    z
m2._createFc                 C   s   t | jt| jfS r   r   r   r   rq   r   r   r   rt   4  s    zm2._build_tempsc                    s    |rt dtt| |||S )NzIThe 'std' and 'var' reduction operations are not yet supported on the GPU)rG   rK   r   r}   r|   rN   r   r   r}   7  s    zm2._build_appendc                 C   sX   t |sT|dkrTt|| }t|| |d  }||| f  || ||  7  < d S )Nr   r   )r   r.   r   )r   r   r   r   r   r   Zu1ur   r   r   r{   =  s
    z
m2._appendc                 C   sn   t jdddL t j|dd|jdd }t j| ||| | d   ddW  d    S 1 s`0    Y  d S )NignoreZdivideZinvalidr   rh      )r.   errstateZnansumr   )ZMsr   nsZmur   r   r   r~   H  s    zm2._combine)F)F)r    r!   r"   r#   r   ru   rt   r}   r   r{   r~   rW   r   r   rN   r   r   #  s   

	r   c                   @   s<   e Zd ZdZeedd Zeedd Zedd ZdS )	minzMinimum value of all elements in ``column``.

    Parameters
    ----------
    column : str
        Name of the column to aggregate over. Column data type must be numeric.
        ``NaN`` values in the column are skipped.
    c                 C   s>   t ||| f r|||| f< n||| f |kr:|||| f< d S r   r   r   r   r   r   r{   X  s    zmin._appendc                 C   s   t ||| f| d S r   )r   r   r   r   r   ry   `  s    zmin._append_cudac                 C   s   t j| ddS r   )r.   Znanminr   r   r   r   r~   e  s    zmin._combineN	r    r!   r"   r#   r   r   r{   ry   r~   r   r   r   r   r   O  s   r   c                   @   s<   e Zd ZdZeedd Zeedd Zedd ZdS )	maxzMaximum value of all elements in ``column``.

    Parameters
    ----------
    column : str
        Name of the column to aggregate over. Column data type must be numeric.
        ``NaN`` values in the column are skipped.
    c                 C   s>   t ||| f r|||| f< n||| f |k r:|||| f< d S r   r   r   r   r   r   r{   s  s    zmax._appendc                 C   s   t ||| f| d S r   )r   r   r   r   r   ry   {  s    zmax._append_cudac                 C   s   t j| ddS r   r   r   r   r   r   r~     s    zmax._combineNr   r   r   r   r   r   j  s   r   c                       s    e Zd ZdZ fddZ  ZS )	count_cata]  Count of all elements in ``column``, grouped by category.
    Alias for `by(...,count())`, for backwards compatibility.

    Parameters
    ----------
    column : str
        Name of the column to aggregate over. Column data type must be
        categorical. Resulting aggregate has a outer dimension axis along the
        categories present.
    c                    s   t t| |t  d S r   )rK   r   r   r   r   rN   r   r   r     s    zcount_cat.__init__)r    r!   r"   r#   r   rW   r   r   rN   r   r     s   
r   c                   @   s6   e Zd ZdZeeejZdddZ	e
d	ddZdS )
meanzMean of all elements in ``column``.

    Parameters
    ----------
    column : str
        Name of the column to aggregate over. Column data type must be numeric.
        ``NaN`` values in the column are skipped.
    Fc                 C   s   t | jt| jfS r   r   rq   r   r   r   rr     s    zmean._build_basesc                 K   s`   | \}}t jddd( t |dk|| t j}W d    n1 sD0    Y  tj|fi |S Nr   r   r   r.   r   r   r/   r1   r   )r   r   r   r   countsr   r   r   r   r     s    6zmean._finalizeN)F)Fr    r!   r"   r#   r   r   rH   r   rn   rr   r   r   r   r   r   r   r     s
   
r   c                   @   s6   e Zd ZdZeeejZdddZ	e
d	ddZdS )
varzVariance of all elements in ``column``.

    Parameters
    ----------
    column : str
        Name of the column to aggregate over. Column data type must be numeric.
        ``NaN`` values in the column are skipped.
    Fc                 C   s   t | jt| jt| jfS r   r   r   r   r   rq   r   r   r   rr     s    zvar._build_basesc                 K   sb   | \}}}t jddd( t |dk|| t j}W d    n1 sF0    Y  tj|fi |S r   r   r   r   r   r   r   Zm2sr   r   r   r   r     s    
6zvar._finalizeN)F)Fr   r   r   r   r   r     s
   
r   c                   @   s6   e Zd ZdZeeejZdddZ	e
d	ddZdS )
stdzStandard Deviation of all elements in ``column``.

    Parameters
    ----------
    column : str
        Name of the column to aggregate over. Column data type must be numeric.
        ``NaN`` values in the column are skipped.
    Fc                 C   s   t | jt| jt| jfS r   r   rq   r   r   r   rr     s    zstd._build_basesc                 K   sh   | \}}}t jddd. t |dkt || t j}W d    n1 sL0    Y  tj|fi |S r   )r.   r   r   Zsqrtr/   r1   r   r   r   r   r   r     s    
<zstd._finalizeN)F)Fr   r   r   r   r   r     s
   
r   c                   @   sN   e Zd ZdZeeejZe	dd Z
e	dd Ze	dd Ze	dd	 Zd
S )firsta  First value encountered in ``column``.

    Useful for categorical data where an actual value must always be returned,
    not an average or other numerical calculation.

    Currently only supported for rasters, externally to this class.

    Parameters
    ----------
    column : str
        Name of the column to aggregate over. If the data type is floating point,
        ``NaN`` values in the column are skipped.
    c                 C   s   t dd S Nz/first is currently implemented only for rastersr:   r   r   r   r   r{     s    zfirst._appendc                 C   s   t dd S r   r:   r   r   r   r   ru     s    zfirst._createc                 C   s   t dd S r   r:   r   r   r   r   r~     s    zfirst._combinec                 K   s   t dd S r   r:   r   r   r   r   r   r     s    zfirst._finalizeNr    r!   r"   r#   r   r   rH   r   rn   r   r{   ru   r~   r   r   r   r   r   r     s   


r   c                   @   sN   e Zd ZdZeeejZe	dd Z
e	dd Ze	dd Ze	dd	 Zd
S )lasta  Last value encountered in ``column``.

    Useful for categorical data where an actual value must always be returned,
    not an average or other numerical calculation.

    Currently only supported for rasters, externally to this class.

    Parameters
    ----------
    column : str
        Name of the column to aggregate over. If the data type is floating point,
        ``NaN`` values in the column are skipped.
    c                 C   s   t dd S Nz.last is currently implemented only for rastersr:   r   r   r   r   r{     s    zlast._appendc                 C   s   t dd S r   r:   r   r   r   r   ru     s    zlast._createc                 C   s   t dd S r   r:   r   r   r   r   r~     s    zlast._combinec                 K   s   t dd S r   r:   r   r   r   r   r     s    zlast._finalizeNr   r   r   r   r   r     s   


r   c                   @   sN   e Zd ZdZeeejZe	dd Z
e	dd Ze	dd Ze	dd	 Zd
S )modeat  Mode (most common value) of all the values encountered in ``column``.

    Useful for categorical data where an actual value must always be returned,
    not an average or other numerical calculation.

    Currently only supported for rasters, externally to this class.
    Implementing it for other glyph types would be difficult due to potentially
    unbounded data storage requirements to store indefinite point or line
    data per pixel.

    Parameters
    ----------
    column : str
        Name of the column to aggregate over. If the data type is floating point,
        ``NaN`` values in the column are skipped.
    c                 C   s   t dd S Nz.mode is currently implemented only for rastersr:   r   r   r   r   r{   -  s    zmode._appendc                 C   s   t dd S r   r:   r   r   r   r   ru   1  s    zmode._createc                 C   s   t dd S r   r:   r   r   r   r   r~   5  s    zmode._combinec                 K   s   t dd S r   r:   r   r   r   r   r   9  s    zmode._finalizeNr   r   r   r   r   r     s   


r   c                   @   s<   e Zd ZdZdd Zdd Zdd Zdd	 Zed
d Z	dS )summaryav  A collection of named reductions.

    Computes all aggregates simultaneously, output is stored as a
    ``xarray.Dataset``.

    Examples
    --------
    A reduction for computing the mean of column "a", and the sum of column "b"
    for each bin, all in a single pass.

    >>> import datashader as ds
    >>> red = ds.summary(mean_a=ds.mean('a'), sum_b=ds.sum('b'))
    c                 K   s$   t t|  \}}|| _|| _d S r   )zipsorteditemskeysr3   )r   r   ksZvsr   r   r   r   M  s    zsummary.__init__c                 C   s   t t| t| jt| jfS r   )r   r   r   r   r3   r   r   r   r   r   R  s    zsummary.__hash__c                 C   s   | j D ]}|| qd S r   )r3   rA   )r   r=   vr   r   r   rA   U  s    
zsummary.validatec                    s$   t t fddt| j| jD S )Nc                    s   g | ]\}}||  fqS r   )ro   )r   kr   r@   r   r   r   Z  r   z&summary.out_dshape.<locals>.<listcomp>)r   r   r   r   r3   r?   r   r   r   ro   Y  s    zsummary.out_dshapec                 C   s   t ttdd | jD S )Nc                 s   s   | ]}|j V  qd S r   )r   )r   r   r   r   r   r   _  r   z!summary.inputs.<locals>.<genexpr>)r   r   r
   r3   r   r   r   r   r   ]  s    zsummary.inputsN)
r    r!   r"   r#   r   r   rA   ro   r$   r   r   r   r   r   r   ?  s   r   c                 C   s@   g | ]8\}}t |trt|ts(|tu r|ttttfvr|qS r   )r)   r   
issubclassrm   r   r   r   r   )r   Z_kZ_vr   r   r   r   c  s
   r   )BZ
__future__r   r   r   Znumpyr.   Z	datashaper   r   r   r   r	   rH   Ztoolzr
   r   Zxarrayr1   Zdatashader.glyphs.glyphr   Znumbar   r   Z)datashader.transfer_functions._cuda_utilsr   r   ImportErrorZcuda_atomic_nanmmaxr(   	ExceptionZutilsr   r   r   r   r%   r7   rC   rJ   rX   rd   rm   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rQ   setlocalsr   __all__r   r   r   r   <module>   s\   

!-&.-Q #-,""%$