U
    Cvf,q                  M   @  s  d dl mZ d dlZd dlZd dlmZ d dlZd dlZ	d dl
Z
d dlmZ d dlZd dlmZmZ d dlmZmZ d dlmZmZmZ e
jjZe
jZe
jjZe
dZedZedZd	d
 Z dd Z!dd Z"dd Z#dddZ$G dd dZ%e
j&dddddddddeded d!d"g	d#d$ Z'e
jj&d%e%d&d'fe%d(d'fe%d)e(d*d+fe%d,d d-d.d+fe%d/d0d1id2d3d+fe%d4d+fe%d5d+fe%d6d+fe%d7d'fe%d8d0d9d'fe%d:e)d1d;d<d+fe%d=d+fe%d>d+fe%d?d'fe%d@d+fe%dAd+fe%dBd+fe%dCdDdEd+fe%dFdGdHidId+fe%dJd+fe%dKd+fe%dLd0dMd1dNidId+fe%dOe#dPdMdHd'fe%dQe#dPdMdHd'fe%dRe#dPdMdHd'fee%dSd+edTd!edUgd"ee%dVd+edWd!edUgd"ee%dXd+edYd!d"ee%dZe#dPdMdHe#dPdMdHgd[d+ed d!d"ee%d\d+ed]d!d"ee%d^d+ed_d!d"ee%d`d+edad!d"e%dbd d+fee%dcddd'eded!d"ee%dfd'edgd!d"ee%dhd'ee%did'ee%dje#dPdMdHdkd+edld!d"ee%dmdnd0ddidMdod+edpd!d"e%dqd'fee%drdsdtd+edud!d"ee%dvd0d9d'edwd!d"ee%dxd2d0dyd+ed d!d"ee%dzd0d1d{d|d+edpd!d"ee%d}d1d<d+edld!d"ee%d~d'edd!d"e%d2d'fee%dd'edd!d"ee%dd'ed d!d"e%de#dPdMdHdskdd+fg2e*ddd Z+e
j&d%e%dd+fee%dd'ed d!d"ee%dd'ed d!d"ee%ddsd+edd!d"gdd Z,G dd dZ-e
j&dddddddddddddddddddddgdd Z.e
jj&d%e%d&d'fe%d(d'fe%dddid+fe%de$d0dPij/d- d<d+fe%d)e(d+fe%d,d d-d.d+fe%d4d+fe%d5d+fe%d6d+fe%d7d'fe%dd0d+fe%dd0d+fe%ddd1id1dd+fe%d8d0d'fe%dd0d'fe%dRe$dMdMdHd'fe%dd0d+fe%d:e)d de)d1d;dHd+fe%d=d+fe%d>d+fe%d?d'fe%dd+fe%dd0d-d1dgid+fe%ddd+fe%dd+fe%dd+dd+fe%dd0d+fe%dBd+fe%dd d-d1gd<d+fe%d}d+fe%dd0d'dd+fe%dFd0dgdd+fe%dKd+fe%dOe#dPdMdHd'fe%dQe#dPdMdHd'fee%dSd+edWd!edUgd"ee%dVd+edTd!edUgd"ee%dXd+edYd!d"ee%dd0d9d'edd!d"e%de$dPdMdHd+fee%d\d'ed]d!d"ee%d^d+ed_d!d"ee%d`d+edad!d"ee%dd0d'edd!d"ee%de$dPdMdHd+edd!d"ee%dd0d'ed d!d"ee%dd0d'ed d!d"e%dbd d+fee%dd0e0dPds idd+ed d!d"ee%de$dPdMdHe0dPds e0dMds dHdd+edd!d"ee%dd0d+ed d!d"ee%dd-d1dgd'edd!d"ee%dcddd'eded!d"ee%dhd'ee%did'ee%dfd'edgd!d"e%d@d+fe%dd2d-dȍd+fe%dqd'fee%drdsdtd'edud!d"ee%dvd0d'edwd!d"ee%dxd2d0dyd'ed d!d"ee%de$dPdMdHe0dPds e0dMds dHdd+edd!d"e%dAd1d+dʍd+fee%dd d-d1gd1dgdHd+edd!d"ee%d~d'edd!d"e%d2d'fee%dd'edd!d"ee%de$dPdMdHdskd'edd!d"gEe*ddd̈́ Z1e
j&d%e%dd+fee%dd-d1dgd'edd!d"gddτ Z2G ddф dуZ3G ddӄ dӃZ4e
jjeedԃk dd!eddׄ Z5eddل Z6eddۄ Z7dS )    )annotationsN)dedent)Version)	DataArrayVariable)
array_typemod_version)assert_equalassert_identicalrequires_dasksparsec                 C  s6   t | tstt |tsttj|  |  d S N)
isinstancesparse_array_typeAssertionErrornpZtestingr	   todense)ab r   </tmp/pip-unpacked-wheel-h316xyqg/xarray/tests/test_sparse.pyassert_sparse_equal   s    r   c                 C  s   t t| | S r   )r   arangemathprodreshapeshaper   r   r   make_ndarray    s    r   c                 C  s   t j| dddS )Ng?r   )densityrandom_state)r   randomr   r   r   r   make_sparray$   s    r"   c                 C  s"   t t|  tt|  dS )Nr   )xrr   tuplekeysr"   values)dim_lengthsr   r   r   
make_xrvar(   s    
 r(   testc                 C  sB   |d krdd |   D }tjtt|  dt| ||dS )Nc                 S  s   i | ]\}}|t |qS r   )r   r   ).0dnr   r   r   
<dictcomp>0   s      z make_xrarray.<locals>.<dictcomp>r   )dimscoordsname)itemsr#   r   r"   r$   r&   r%   )r'   r/   r0   r   r   r   make_xrarray.   s    
r2   c                   @  s$   e Zd Zdd Zdd Zdd ZdS )doc                 O  s   || _ || _|| _d S r   methargskwargs)selfr5   r6   r7   r   r   r   __init__:   s    zdo.__init__c                 C  s:   | j  }d| j kr&tt|d |d< t|| j| j|S )Nfunc)r7   copygetattrr   r5   r6   )r8   objr7   r   r   r   __call__?   s    

zdo.__call__c                 C  s   d| j  d| j d| j dS )Nzobj.z(*z, **)r4   r8   r   r   r   __repr__H   s    zdo.__repr__N)__name__
__module____qualname__r9   r>   rA   r   r   r   r   r3   9   s   	r3   propchunksdatar.   dtypeencodingimagnbytesndimr&   Coercion to densereason)Zmarksc                 C  s   t ddd}t||  d S N
      xy)r(   r<   )rE   varr   r   r   test_variable_propertyL   s    rW   zfunc,sparse_outputallFanyZastyperH   TZclip   )minmaxcoarsenrT      sum)Zwindowsr:   ZcomputeZconjr;   countZget_axis_numdimZisel   rT   ZisnullloadmeanZnotnullZrollroundZset_dims)rT   rU   zr.   stackZflatrS   )Z
dimensionsZto_base_variableZ	transposeunstackrR   )x1x2Zbroadcast_equalsrQ   equalsZ	identicalZargmaxz$Missing implementation for np.argminz!ignore:Behaviour of argmin/argmaxZargminz$Missing implementation for np.argmaxZargsortz''COO' object has no attribute 'argsort'concat)	variables	conjugatez)'COO' object has no attribute 'conjugate'Zcumprodz(Missing implementation for np.nancumprodZcumsumz'Missing implementation for np.nancumsumfillnaitem)r[   r[   z$'COO' object has no attribute 'item'Zmedianz'Missing implementation for np.nanmedianr]   r\   Zno_conflicts)otherzmixed sparse-dense operationpadZconstant)modeZ
pad_widthsZ
fill_valuez!Missing implementation for np.padr   Zquantile      ?)qz+Missing implementation for np.nanpercentileZrankz2Only implemented for NumPy arrays (via bottleneck)reduce)r:   rc   Zrolling_windowZx_win)rc   ZwindowZ
window_dimshiftZstdz$Missing implementation for np.nanstdrV   z$Missing implementation for np.nanvarZto_dictwhere)cond)idsc                 C  s   t ddd}t|j|j }| |}| |}t|tjr^t|jtjr^|j	|j d}|rt|jtjstt
tj|j |jddst
ntj||ddst
d S )NrQ   rR   rS   )rG   TZ	equal_nan)r(   r#   r   r.   rG   r   r   r   SparseArrayr;   r   r   allcloser:   sparse_outputvar_sZvar_dret_sret_dr   r   r   test_variable_method_   s     r   ZsqueezeZto_indexZto_index_variableZsearchsortedz,'COO' object has no attribute 'searchsorted'c                 C  st   t ddi}t|j|j }| |}| |}|r`t|jtjsFt	t
|j |jspt	nt
||spt	d S )NrT   rQ   )r(   r#   r   r.   rG   r   r   r   r   r   r   r   r   r   r   r   test_1d_variable_method   s    r   c                   @  sp   e Zd Zejdddd Zdd Zdd Zej	d	d
d Z
ej	d	dd Zdd Zdd Zdd ZdS )TestSparseVariableTZautousec                 C  s&   t jdddd| _td| j| _d S )Nrd      r   rx   r    r   rS   )r   r!   rG   r#   r   rV   r@   r   r   r   setUp  s    zTestSparseVariable.setUpc                 C  s   | j j| jjkstd S r   )rV   rK   rG   r   r@   r   r   r   test_nbytes  s    zTestSparseVariable.test_nbytesc                 C  sH   t | jj | j  t t| jjt| j t | j j| j  d S r   )r   rV   rG   absrh   r@   r   r   r   test_unary_op  s    z TestSparseVariable.test_unary_opzignore::FutureWarningc                 C  s    t t| jt| jj d S r   )r   r   sinrG   rV   r@   r   r   r   test_univariate_ufunc  s    z(TestSparseVariable.test_univariate_ufuncc                 C  sD   t t| jdt| jdj t t| jdtd| jj d S Nr   )r   r   maximumrG   rV   r@   r   r   r   test_bivariate_ufunc"  s     z'TestSparseVariable.test_bivariate_ufuncc                 C  s   t d}|t| jkstd S )Nzq            <xarray.Variable (x: 4, y: 6)>
            <COO: shape=(4, 6), dtype=float64, nnz=12, fill_value=0.0>)r   reprrV   r   )r8   expectedr   r   r   	test_repr'  s    zTestSparseVariable.test_reprc                 C  s(   | j }tt|}t|j|j d S r   )rV   pickleloadsdumpsr   rG   )r8   Zv1Zv2r   r   r   test_pickle/  s    zTestSparseVariable.test_picklec                 C  sh   t ddt jdg}tj|}td|}t |dj	
 t dksNtt | dksdtd S )Nr   r[      rT   r_   rd   )r   arraynanr   COO
from_numpyr   rX   rs   rG   r   r   r   ra   )r8   r   sr   r   r   r   test_missing_values4  s
    
$z&TestSparseVariable.test_missing_valuesN)rB   rC   rD   pytestfixturer   r   r   markfilterwarningsr   r   r   r   r   r   r   r   r   r     s   





r   attrsr/   Zindexeslocr0   Zplotrealr   sizeZsizesstrvariablec                 C  s   t ddd}t||  d S rP   )r2   r<   )rE   arrr   r   r   test_dataarray_property<  s    r   Zassign_attrsfoobarZassign_coordsZdiffZ	drop_varsZexpand_dimsri   axisZ	get_indexZ	integrater   ZpersistreindexrenameZreorder_levelsZreset_coords)ZdropZreset_indexselZsortby)Z	ascendingrU   ri   Zbfillz"Missing implementation for np.flipZcombine_firstZdifferentiatez&Missing implementation for np.gradientdotz$Missing implementation for np.einsumZdropnaZffillZinterpr/   Zinterp_likez.Indexing COO with more than one iterable indexZinterpolate_naisinz"Missing implementation for np.isinpipe)r:   r   Zreindex_like)rT   Zroll_coordsz4Conversion of dense to sparse when using sparse maskc                 C  s   t dddtdtddd}tj|j |j|jd}| |}| |}|rt	|jt
jsdttj|j |jddstntj||ddstd S )NrQ   rR   rS   r   r/   r.   Tr   r2   r   r   r#   r   rG   r   r/   r.   r   r   r   r   r   r:   r   Zarr_sZarr_dr   r   r   r   r   test_dataarray_methodZ  s     6 r   c                 C  s   t ddidtdid}tj|j |j|jd}| |}| |}|rxt	|jt
jsZttj|j |jddstntj||ddstd S )NrT   rQ   r   r   Tr   r   r   r   r   r   test_datarray_1d_method  s    r   c                   @  s\  e Zd Zejdddd Zdd Zdd Zejj	d	d
dd Z
dd Zdd Zdd Zdd Zdd Zedd Zdd Zdd Zdd Zejj	dd
d d! Zejj	d"d
d#d$ Zejj	d%d
d&d' Zejj	d(d
d)d* Zejj	d(d
d+d, Zejj	d(d
d-d. Zejj	d/d
d0d1 Zejj	d2d3 Zejj	d4d5 Zejj	d6d7 Zd8S )9TestSparseDataArrayAndDatasetTr   c                 C  s^   t jdddd| _tj| jdtdiddd	| _| j | _tj| jdtdiddd	| _	d S )
Nr   r   rx   r   rT   rd   rS   r   )r/   r.   r0   )
r   r!   sp_arr#   r   rangesp_xrr   Zds_ards_xrr@   r   r   r   r   6  s     
   
  z#TestSparseDataArrayAndDataset.setUpc                 C  s    | j }t||dd d S )NrT   )r   r	   
to_datasetto_arrayr8   rT   r   r   r   test_to_dataset_roundtripA  s    z7TestSparseDataArrayAndDataset.test_to_dataset_roundtripc                 C  s   t jtjtddgdddddgid}t jtjtddgdddddgid}t j||d	d
\}}t|j	tj
s~tt|j	tj
stt|jd j	dddgkstt|jd j	dddgkstd S )Nrd   rT   r   r   cr+   r.   r/   einnerjoinr#   r   r   r   r   r   r   alignr   rG   r   r   rX   r/   r8   a1Zb1a2Zb2r   r   r   
test_alignE  s     z(TestSparseDataArrayAndDataset.test_alignzJCOO objects currently do not accept more than one iterable index at a timerN   c              	   C  s"  t j| jddgt| jjd t| jjd dd}t j| jddgtd| jjd d td| jjd d dd}t j||dd\}}t|jd td| jjd kst	t|jd td| jjd kst	t|jd |jd kst	t|jd |jd kst	d S )	NrT   rU   r   r[   rS   r   r   r   )
r#   r   r   r   r   r   r   rX   r/   r   )r8   A1A2ZB1ZB2r   r   r   test_align_2dV  s&    		((z+TestSparseDataArrayAndDataset.test_align_2dc                 C  s   t jtjtddgdddddgid}t jtjtddgdddddgid}t j||d	d
\}}t|j	tj
s~tt|j	tj
stt|jd j	dddddgkstt|jd j	dddddgkstd S )Nrd   rT   r   r   r   r+   r   r   outerr   r   r   r   r   r   test_align_outers  s    $z.TestSparseDataArrayAndDataset.test_align_outerc                 C  s   t jd| jid}t jd| jid}t jd| jid}t j|||gdd}t|d jtj| j| j| jgdd t j| j| j| jgdd}t|jtj| j| j| jgdd d S )	Nr+   	data_varsrT   rb   r   r   rU   r[   )	r#   Datasetr   rp   r   rG   r   Zconcatenater   )r8   ds1ds2Zds3outr   r   r   test_concat  s     z)TestSparseDataArrayAndDataset.test_concatc                 C  s   t dddd}|jdd}tjjtdtdgddgd	}tj|j	
d
ddg|dddgd}t|| | }t|| d S )Nr_   r   rd   )wrT   rU   rS   r   rT   rU   )names)r_   r   r[   )r   ri   r   ri   rj   )r2   rk   pdZ
MultiIndexZfrom_productr   r   r#   r   rG   r   r	   rl   r
   )r8   r   Zstackedri   r   Zroundtrippedr   r   r   
test_stack  s    $
  
z(TestSparseDataArrayAndDataset.test_stackc                 C  sV   t jtjtddgddtjtjdddfid}td}|t	|ksRt
d S )Nrd   rT   rU   i8rZ   r   z            <xarray.DataArray (x: 4)>
            <COO: shape=(4,), dtype=float64, nnz=4, fill_value=0.0>
            Coordinates:
                y        (x) int64 <COO: nnz=3, fill_value=0>
            Dimensions without coordinates: x)r#   r   r   r   r   r   onesr   r   r   r   )r8   r   r   r   r   r   test_dataarray_repr  s    z1TestSparseDataArrayAndDataset.test_dataarray_reprc              
   C  sZ   t jddtjtdfiddtjtjdddfid}td}|t	|ksVt
d S )	Nr   rT   rd   rU   r   rZ   r   r/   a              <xarray.Dataset>
            Dimensions:  (x: 4)
            Coordinates:
                y        (x) int64 <COO: nnz=3, fill_value=0>
            Dimensions without coordinates: x
            Data variables:
                a        (x) float64 <COO: nnz=4, fill_value=0.0>)r#   r   r   r   r   r   r   r   r   r   r   r8   dsr   r   r   r   test_dataset_repr  s    
z/TestSparseDataArrayAndDataset.test_dataset_reprc                 C  sB   t jddtjtdfid }td}|t	|ks>t
d S )Nr   rT   rd   r   z            <xarray.Dataset>
            Dimensions:  (x: 4)
            Dimensions without coordinates: x
            Data variables:
                a        (x) float64 dask.array<chunksize=(4,), meta=sparse.COO>)r#   r   r   r   r   r   r   chunkr   r   r   r   r   r   r   test_sparse_dask_dataset_repr  s    
z;TestSparseDataArrayAndDataset.test_sparse_dask_dataset_reprc              
   C  sT   t jtjtddgddtjtdfid}t	t
|}t|| d S )Nrd   rT   rU   r   )r#   r   r   r   r   r   r   r   r   r   r   r
   r8   r   r   r   r   r   test_dataarray_pickle  s    z3TestSparseDataArrayAndDataset.test_dataarray_picklec              	   C  sX   t jddtjtdfiddtjtdfid}t	t
|}t|| d S )Nr   rT   rd   rU   r   )r#   r   r   r   r   r   r   r   r   r   r   r
   )r8   r   r   r   r   r   test_dataset_pickle  s    z1TestSparseDataArrayAndDataset.test_dataset_picklec                 C  s^   | j }| j}|jddd }|jddd }t|jtjsBtt	
|j|j sZtd S )Nr_   Ztrim)rT   boundary)r   r   r^   rg   r   rG   r   r   r   r   r   r   r8   r   r   m1m2r   r   r   test_coarsen  s    z*TestSparseDataArrayAndDataset.test_coarsenzNo implementation of np.padc                 C  s^   | j }| j}|jddd }|jddd }t|jtjsBtt	
|j|j sZtd S Nr_   T)rT   center)r   r   Zrollingrg   r   rG   r   r   r   r   r   r   r   r   r   r   test_rolling  s    z*TestSparseDataArrayAndDataset.test_rollingrM   c                 C  s^   | j }| j}|jddd }|jddd }t|jtjsBtt	
|j|j sZtd S r   )r   r   Zrolling_exprg   r   rG   r   r   r   r   r   r   r   r   r   r   test_rolling_exp  s    z.TestSparseDataArrayAndDataset.test_rolling_expzNo implementation of np.einsumc                 C  s2   | j | j d }| j| jd }t|| d S r   )Zxp_xrr   r   r	   r   r   r   r   test_dot   s    z&TestSparseDataArrayAndDataset.test_dotz'Groupby reductions produce dense outputc                 C  sZ   | j }| j}|dd}|dd}t|jtjs>tt	
|j|j sVtd S )NrT   .)r   r   groupbyrg   r   rG   r   r   r   r   r   r   r8   rm   rn   r   r   r   r   r   test_groupby  s    z*TestSparseDataArrayAndDataset.test_groupbyc                 C  sD   | j  }dddddgf|jd< |d  |djdd d S )NrT   r   r   abF)Zskipna)r   r;   r/   r   firstr   r   r   r   test_groupby_first  s    
z0TestSparseDataArrayAndDataset.test_groupby_firstc                 C  sr   | j }| j}|jdddddgdd}|jdddddgdd}t|jtjsVtt	
|j|j sntd S )NrT   r   r      rQ   )Zbins.)r   r   Zgroupby_binsr`   r   rG   r   r   r   r   r   r   r   r   r   r   test_groupby_bins  s    z/TestSparseDataArrayAndDataset.test_groupby_binszResample produces dense outputc                 C  s   t jtjddddtjddtjdddgd	d
}| }t	|j
|_
|jdd }|jdd }t|j
tjsztt|j
|j
 std S )Nr         )numz
1999-12-15r[   )months)Zperiodsfreqtimer   zQS-DEC)r  )r#   r   r   Zlinspacer   Z
date_rangeZ
DateOffsetr;   r   r   rG   Zresamplerg   r   r   r   r   r   )r8   t1t2r   r   r   r   r   test_resample  s    z+TestSparseDataArrayAndDataset.test_resamplec                 C  sv   | j }| j}ddddgiddddddgiddd	gdddgd
fD ]0}|jf |}|jf |}tj||dds@tq@d S )NrT   r_   r   rd   r[   d   e   g      @g      @rS   Tr   )r   r   r   r   r   r   )r8   rm   rn   r7   r   r   r   r   r   test_reindex/  s    z*TestSparseDataArrayAndDataset.test_reindexc                 C  s2   | j }t||dg }t|tjs.td S )Nr   )	r   r#   merger   r   r   r   r   r   )r8   rT   rU   r   r   r   
test_merge<  s    z(TestSparseDataArrayAndDataset.test_mergec                 C  sf   t d}|dk}t|| tj|}|dk}t|| t|}|dk}|| d S )NrQ   r   )r   r   r#   r   r|   r   r   r   )r8   r   r}   r   rT   r   r   r   
test_whereB  s    

z(TestSparseDataArrayAndDataset.test_whereN)rB   rC   rD   r   r   r   r   r   r   xfailr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r   r   r   r   r   5  sL   




		
	
	






r   c                   @  s"   e Zd Zejjdddd ZdS )TestSparseCoordszCoercion of coords to denserN   c              
   C  s8   t jtjtddgdtjddddgid d S )Nrd   rT   r[   r_   r   r   )r#   r   r   r   r   r   r   r@   r   r   r   test_sparse_coordsR  s
    z#TestSparseCoords.test_sparse_coordsN)rB   rC   rD   r   r   r  r  r   r   r   r   r  Q  s   r  z0.13.0z,https://github.com/pydata/xarray/issues/5654c                  C  s   t jtddddg} t| }|d}|jdks:tt	|j
jt jsNtt|| |jdd}|d}|jddikstt|| d S )	Nr   r[   r_   )r_   r_   r   )r0   Zdim_0r  )r   r   r   r   r   r   r   rF   r   r   rG   _metar
   r   )r   r   acr   Zdscr   r   r   
test_chunk[  s    


r  c                    s   dd l  tjtddddg fdd_t}  j	| } j	| } j	| d }||ksnt
||kszt
t| jtjst
| d} j	|} j	|d }||kst
t|jjtjst
d S )Nr   r[   r_   c                     s    j jS r   )baseZnormalize_token__dict__r   daskr   r   r   <lambda>u      z!test_dask_token.<locals>.<lambda>)r  r   r   r   r   r   Z__dask_tokenize__r   r  tokenizer   r   rG   r   r  )r   r  r  t3r  Zt4Zt5r   r  r   test_dask_tokenn  s    
r$  c                  C  sZ   t jtddddg} t| }|d}|jj}t	j
dd |ddjj}t|| d S )Nr   r[   r_   c                 S  s   | S r   r   re   r   r   r   r     r!  z7test_apply_ufunc_check_meta_coherence.<locals>.<lambda>Zparallelized)r  )r   r   r   r   r   r   r   rG   r  r#   Zapply_ufuncr   )r   r   r  Zsparse_metaresultr   r   r   %test_apply_ufunc_check_meta_coherence  s    
r&  )Nr)   )8
__future__r   r   r   textwrapr   Znumpyr   Zpandasr   r   Zpackaging.versionr   Zxarrayr#   r   r   Zxarray.core.pycompatr   r   Zxarray.testsr	   r
   r   r   r   paramr  Zimportorskipr   r   Zsparse_versionr   r   r"   r(   r2   r3   ZparametrizerW   intslicer   r   r   r   r   rT   r   r   r   r   r  r  r$  r&  r   r   r   r   <module>   sP  




















    
     


,


















  
    1  5


  


