U
    Cvfr                     @  s  d dl m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mZmZ d dlmZmZ d dlmZmZ d dlmZ d dlmZmZmZ eejZG d	d
 d
ZG dd dZG dd dZG dd dZddddZ e	j!"dejej#ej$gddddZ%dd Z&dd Z'dd Z(dd Z)ddd d!Z*ddd"d#Z+ddd$d%Z,G d&d' d'Z-d(d) Z.e	j!"d*d+d,ge	j!"d-e/d.d/d.e/dd/d0e/d/d.d/e/d/d.d1gddd2d3Z0e	j!"d4d5d6ge	j!"d7d8d9d:d;d<d=d>d?d@g	e	j!"dAej1j2ej1j3ej1j4ej1j5gdddBdCZ6dddDdEZ7dddFdGZ8dddHdIZ9dddJdKZ:dddLdMZ;dddNdOZ<dddPdQZ=dddRdSZ>e	j!"dTe?dUe?dUfe@d d/d/ge@d d d gfe@d/d.d/ge@d.d.d.gfe@d/d/d0ge@d0d0d0gfe@d/ge@d gfe@d d/d.d/d/ge@d d d.d.d.gfe@d d/d/d/d.ge@d d d d d.gfgdddVdWZAdddXdYZBdS )Z    )annotationsN)Any)	DataArrayDatasetVariable)indexingnputils)PandasIndexPandasMultiIndex)T_Xarray)IndexerMaker
ReturnItemassert_array_equalc                   @  sZ   e Zd Zdd ZddddZddddZddd	d
ZddddZddddZdS )TestIndexersc                 C  s   |  }d||< |S )Nr   )copy)selfxi r   >/tmp/pip-unpacked-wheel-h316xyqg/xarray/tests/test_indexing.pyset_to_zero   s    zTestIndexers.set_to_zeroNonereturnc                 C  s   t jddddd}t d}t }|d d  |d |dd d df |d	 |d dddf |ddd d f || |||f |d||f |d
 f
D ]>}t||j}t|| ||  t| 	||| 	|| qt
jtdd t|d d W 5 Q R X d S )N
                  .r   ).r   ).r               ztoo many indicesmatchr    r!   r"   r!   )nprandomrandnaranger   r   Zexpanded_indexerndimr   r   pytestraises
IndexError)r   r   yarrr   jr   r   r   test_expanded_indexer   s&    


z"TestIndexers.test_expanded_indexerc              
   C  s   t jddd}t|ddddgtdd	d
gddddgttddd}|jdd}|j}t	|j
d| f |d  t	|j
d| f |d  d S )Nr"      r#   value	replicatersampleexpr   r    r!   abcd)r5   r7   r6   )namedimscoords)r5   r6   )sample)r!      r   )r   r   r    )r'   r(   r)   r   dictlistrangestackr?   r   locmaxmin)r   datadaZda2sr   r   r   test_stacked_multiindex_min_max/   s     
 
z,TestIndexers.test_stacked_multiindex_min_maxc              	   C  sl  t jjddgddggdd}ttd|ddgdd	d
}dddgf|jd< t|dddddi }|D ]f\}}|d kr|ddikst	qh|
|jd r|dddkst	qh|
|jd rh|ddiksht	qht|dkst	tjtdd t|ddii  W 5 Q R X tjtdd t|ddii  W 5 Q R X tjtdd t|ddiddi W 5 Q R X d S )Nr8   r9   r    r!   onetwonames)r#   r!   r!   r   r/   )r   r/   zr>   r=   r/   g       @g      @y2r   )rR   rM   rN   r/   rR   r   r"   z"no index found for coordinate 'y2'r$   z*'w' is not a valid dimension or coordinatewzcannot supply.*methodZnearest)pd
MultiIndexfrom_productr   r'   zerosr>   r   Zgroup_indexers_by_indexAssertionErrorequalsZxindexeslenr,   r-   KeyError
ValueError)r   mindexrH   Zgrouped_indexersidxindexersr   r   r   test_group_indexers_by_index>   s:         z)TestIndexers.test_group_indexers_by_indexc              
   C  sr  dd }ddddddd	}t d
d
dddgfi}tjjddgddgddggdd}ttdd
|fg}||dtd
di ||t	dtd
di ||t
g dtd
di ||dtd
di |ddddddddgttddgdt
ddt
dddd
gddgd
di}||d| |tddd ttjjddgddggd dd
dt
ddig dgi }||d| |ddddddddgttjjddgddggd dd
dt
ddig dgi }||d!| ||dd"gtd
dd#gi ||tddtd
tddd i ||tdd$td
tdd%d i ||ddddtd
di |ddddddddgttddgdt
ddt
dddd
gddgd
di}||ddd| |ddddddddgttddgdt
ddt
ddd&d
gddgd
di}||ddd&| |ddddddddgttjjddgddggd dd
dt
ddig dgi }||ddi| d S )'Nc           
        sP   d| i}   } fdd|D }i }	|	| |	| tj|||	|||dS )Nr   c                   s   i | ]
}| qS r   r   .0kx_indexr   r   
<dictcomp>f   s      zSTestIndexers.test_map_index_queries.<locals>.create_sel_results.<locals>.<dictcomp>)dim_indexersindexes	variablesdrop_coordsdrop_indexesrename_dims)Zcreate_variablesupdater   IndexSelResult)
Z	x_indexerrh   Z
other_varsrm   rn   ro   rj   Z
index_varsrk   rl   r   rg   r   create_sel_results\   s    

z?TestIndexers.test_map_index_queries.<locals>.create_sel_resultsr   r   zindexing.IndexSelResultr   )rH   r   expectedr   c                 S  s   t | d|i}|j |j ks(tt|jd |jd  |j |j ksVt|jD ]}|j| |j| s\tq\|j |j kst|jD ]}t|j| |j|  qt	|j
t	|j
kstt	|jt	|jkst|j|jkstd S )Nr   )r   Zmap_index_queriesrj   keysr[   r   rk   r\   rl   setrm   rn   ro   )rH   r   rs   resultsrf   r   r   r   test_indexert   s    

z9TestIndexers.test_map_index_queries.<locals>.test_indexerr   r    r!   r"   r8   r9   )rM   rN   threerO      r   )r8   r    rx   TFrz   r   rL   rM   rN   )r8   r    r#   )rN   rz   )r8   )r9   r!   ry      )r9   r       )rM   rz   )r   rW   rX   rY   r   rC   r   rq   r'   int32r   r	   ZIndexslicer
   )r   rr   rw   rH   r`   Zmdatars   r   r   r   test_map_index_queries[   s     
    
z#TestIndexers.test_map_index_queriesc              	   C  sp   t tjddtdtdddd}|ddid}td|d< tjtdd d|j	d	< W 5 Q R X d S )
Nr"   rQ   rS   rR   rx   zDo you want to .copy()r$   i  )r   r   r   )
r   r'   r(   randr*   Zexpand_dimsr,   r-   r_   rE   )r   r0   r   r   r   test_read_only_view   s    z TestIndexers.test_read_only_viewN)	__name__
__module____qualname__r   r2   rK   rc   r   r   r   r   r   r   r      s    r   c                   @  s6   e Zd ZddddZddddZddddZd	S )
TestLazyArrayr   r   c           
      C  s  t  }dD ]}t|}|d d |d d |dd |d d |d d |dd |dd |d d d |dd d |d dd |d d	d |d
d |d d d |ddd |d dd |d d d g}|D ]<}|D ]2}|| | }tj|||d}|| }	t||	 qqq
d S )N)d   c   r"   r#   r!   r    rx   r      r   ry   size)r   r'   r*   r   Zslice_slicer   )
r   r0   r   r   Zslicesr   r1   rs   Z	new_sliceactualr   r   r   test_slice_slice   s4    









zTestLazyArray.test_slice_slicec              
   C  s  t jddd}t|}tdddg|}t|}tdddg|}t }|d d  dd|d d	 dd
dd	gdgt ddk g}|D ]D}|D ]8}	|D ],}
t	|	t j
r|	jjdkrt ddk }	t	|
t j
r|
jjdkrt ddk }
t |||	|
f }|||	|
f |d d |	|
f | |d d d d |
f d d |	f | fD ]~}|j|jks\tt|| t	|jtjszttdd |jjjD rt	|jjtjstnt	|jjtjsFtqFqqqd|d d  df|d d df|d d dgfddgdfdd
dgdd
gfdd	dg|d d fg}|D ]\}}	|| |	 }|| |	 }|j|jksbtt|| |jd
krt j|j|j}t |j}|j| }t|j| | t	|jtjtjfstt	|jtjstt	|jjtjs0tq0d S )Nr      r   r   r1   rf   r   ry   r"   r    r!   r   r9   c                 s  s   | ]}t |ttfV  qd S N)
isinstanceintr   rd   r   r   r   	<genexpr>2  s    z:TestLazyArray.test_lazily_indexed_array.<locals>.<genexpr>r"   r!   rx   r#   )r'   r(   r   r   NumpyIndexingAdapterr   LazilyIndexedArrayr   r*   r   ndarraydtypekindasarrayshaper[   r   _dataallkeytupleBasicIndexerOuterIndexerr+   choicearrayr=   Z	transposeLazilyVectorizedIndexedArray)r   originalr   vlazyv_lazyr0   rb   r   r1   rf   rs   r   Z
expected_borderZ
transposedr   r   r   test_lazily_indexed_array  sj    

6


$

 
	


z'TestLazyArray.test_lazily_indexed_arrayc           	      C  sp  t jddd}t|}tdddg|}t|}tdddg|}t }dd }|d d  d	d
ftdd	d
gfg}|||| tdd	d
gtdd	d
gtd ftd
ddd	fg}|||| td d dd	td dftdddddgtdddd
d	gftddgd	d
gd
dggfg}|||| tdddddgtdddd
d	gftddgd	d
gd
dggfg}|||| d S )Nr   r   r   r   r1   rf   c                 S  sX   |D ]N}|| }| | }|j |j ks(tt|jtjtjfs@tt|| |} |}qd S r   )r   r[   r   r   r   r   r   r   )v_eagerr   rb   indexerr   rs   r   r   r   check_indexingb  s    
zJTestLazyArray.test_vectorized_lazily_indexed_array.<locals>.check_indexingr   r    r"   r!   r#   )	r'   r(   r   r   r   r   r   r   r   )	r   r   r   r   r   r   r0   r   rb   r   r   r   $test_vectorized_lazily_indexed_arrayZ  s,    

" ""z2TestLazyArray.test_vectorized_lazily_indexed_arrayN)r   r   r   r   r   r   r   r   r   r   r      s   Cr   c                   @  s6   e Zd ZddddZddddZddddZd	S )
TestCopyOnWriteArrayr   r   c                 C  sH   t d}t|}d|td d  < t|t d t|t d d S Nr   r   )r'   r*   r   CopyOnWriteArrayBr   rZ   r   r   wrappedr   r   r   test_setitem  s
    

z!TestCopyOnWriteArray.test_setitemc                 C  sx   t d}t|}|td d  }t|tjs4td|td d  < t|t d t|t d t|t d d S )Nr   r   r   )	r'   r*   r   r   r   r   r[   r   rZ   r   r   r   childr   r   r   test_sub_array  s    

z#TestCopyOnWriteArray.test_sub_arrayc                 C  s:   t tddg}t|td  td  dks6td S Nfoobarr   r   )r   r   r'   r   r   r[   r   r   r   r   r   test_index_scalar  s    z&TestCopyOnWriteArray.test_index_scalarN)r   r   r   r   r   r   r   r   r   r   r     s   
r   c                   @  sD   e Zd ZddddZddddZddddZddd	d
ZdS )TestMemoryCachedArrayr   r   c                 C  s@   t td}t |}t|td t|jt js<t	d S )Nr   )
r   r   r'   r*   MemoryCachedArrayr   r   r   r   r[   r   r   r   r   test_wrapper  s    
z"TestMemoryCachedArray.test_wrapperc                 C  sr   t td}t |}|td d  }t|t js:tt|td t|j	t j
s\tt|j	t jsntd S )Nr   r   )r   r   r'   r*   r   r   r   r[   r   r   r   r   r   r   r   r     s    
z$TestMemoryCachedArray.test_sub_arrayc                 C  s8   t d}t|}d|td d  < t|t d d S r   )r'   r*   r   r   r   r   rZ   r   r   r   r   r     s    

z"TestMemoryCachedArray.test_setitemc                 C  s:   t tddg}t|td  td  dks6td S r   )r   r   r'   r   r   r[   r   r   r   r   r     s    z'TestMemoryCachedArray.test_index_scalarN)r   r   r   r   r   r   r   r   r   r   r   r     s   	r   r   r   c               	   C  s\   t t td W 5 Q R X G dd dtj} | d}|jdksHtt|dksXtd S )Nr   c                   @  s   e Zd ZdS )z,test_base_explicit_indexer.<locals>.SubclassN)r   r   r   r   r   r   r   Subclass  s   r   r&   zSubclass((1, 2, 3)))r,   r-   	TypeErrorr   ZExplicitIndexerr   r[   repr)r   r4   r   r   r   test_base_explicit_indexer  s    r   indexer_clsc              	   C  s   t t | d  W 5 Q R X t t | g f W 5 Q R X t t | d W 5 Q R X t t | d W 5 Q R X t t | d W 5 Q R X t t | tdf W 5 Q R X t t | tdgf W 5 Q R X d S )Nr   )r   )g      ?r   )r,   r-   r   r   r'   r   )r   r   r   r   test_invalid_for_all  s    r   c                 C  s:   | dt dfj}tdd |D s*t|dks6td S )Nr    r!   c                 s  s   | ]}t |tV  qd S r   )r   r   )re   r   r   r   r   r     s     z check_integer.<locals>.<genexpr>r    r!   )r'   Zuint64r   r   r[   r   r4   r   r   r   check_integer  s    r   c                 C  sD   | t dd tdfj\}|t dd dks0tt|jts@td S )Nr    r!   )r   r'   int64r   r[   r   stepr   r   r   r   r   check_slice  s    r   c                 C  sB   | t jdt jdfj\}|jt jks*tt j|dddg d S )Nr"   r   r   r    r!   )	r'   r*   r~   r   r   r   r[   testingr   r   r   r   r   check_array1d  s    r   c                 C  sL   t jddgddggt jd}| |fj\}|jt jks:tt j|| d S )Nr    r!   r"   r#   r   )r'   r   r   r   r   r[   r   r   )r   r   r4   r   r   r   check_array2d  s    r   c                	   C  sX   t tj ttj tt ttj W 5 Q R X tt ttj W 5 Q R X d S r   )	r   r   r   r   r,   r-   r   r   r   r   r   r   r   test_basic_indexer  s    

r   c                	   C  sB   t tj ttj ttj tt ttj W 5 Q R X d S r   )	r   r   r   r   r   r,   r-   r   r   r   r   r   r   test_outer_indexer  s
    


r   c                	   C  s   t t ttj W 5 Q R X ttj ttj ttj t jt	dd, tt
jdt
jdt
jdt
jdf W 5 Q R X d S )Nznumbers of dimensionsr$   r    r   r   )r,   r-   r   r   r   VectorizedIndexerr   r   r   r_   r'   r   r   r*   r   r   r   r   test_vectorized_indexer
  s    


r   c                   @  s.   e Zd Zejdddd ZddddZd	S )
Test_vectorized_indexerT)Zautousec                 C  sd   t tjddd| _tdddggtdddgddd	ggtdd
dtdd
dtd g| _d S )Nr   r   r   r   r"   r!   r#   r}   r|   ry   )	r   r   r'   r(   r)   rH   r   r   rb   )r   r   r   r   setup  s    

zTest_vectorized_indexer.setupr   r   c           
      C  s  t j| jddD ]D\}}}t|||f}t|| jj}tj	
| j| | j|  qtjttd fdd}tj	
|jtdg tjttdfd dd}ttdgd }tj	
t|j| tjttdtd fdd}|j\}}	tj	
|tdd d tjf  tj	
|	tdtjd d f  tjttd tdfdd}|j\}}	tj	
|td	tjd d f  tj	
|	tdd d tjf  d S )
Nr"   repeatr   )r   r   )r{   r   r   )r{   r   r   r{   )	itertoolsproductrb   r   r   Z_arrayize_vectorized_indexerrH   r   r'   r   r   r   r   r*   rD   Znewaxis)
r   r   r1   rf   ZvindexZvindex_arrayr   rs   r8   r9   r   r   r    test_arrayize_vectorized_indexer"  s@        
"" 
"z8Test_vectorized_indexer.test_arrayize_vectorized_indexerN)r   r   r   r,   Zfixturer   r   r   r   r   r   r     s   


r   c                   s  |dkr,d t  fdd| D }t|S |dkrPt dd | D }t|S |dkrtjdd	d
dtd d df}t|d t|  S |dkrtjdd	d
dtd d df}t|d t|  S |dkrdd | D }tjd| d | d d |d< tt |S |dkr<dd | D }d	|d< t	t |S |dkrPt	dS |dkr~ddd
g}t	t |d t|  S |dkrdd | D }tddd|d< tddd|d< t	t |d t|  S d S )N
vectorizedr"   r#   c                 3  s    | ]}t jjd | dV  qdS )r   r   Nr'   r(   randintre   rJ   Zindexed_shaper   r   r   G  s     zget_indexers.<locals>.<genexpr>outerc                 s  s"   | ]}t jd ||d V  qdS )r   r!   Nr   r   r   r   r   r   K  s     outer_scalarr   r"   r#   r!   outer_scalar2ry   	outer1vecc                 S  s   g | ]}t d dqS r!   r   r   r   r   r   
<listcomp>W  s     z get_indexers.<locals>.<listcomp>r    basicc                 S  s   g | ]}t d dqS r   r   r   r   r   r   r   \  s     basic1r"   basic2basic3c                 S  s   g | ]}t d qS r   r   r   r   r   r   r   h  s     rx   )
r   r   r   r   r'   r(   r   r   r]   r   )r   moder   r   r   r   get_indexersD  s>    


 





r   r   r   r   slr    rx   r!   ry   c                 C  s<   t | }t|| \}}|| }|| | }t|| d S r   )r'   r*   r   Z_decompose_slicer   )r   r   r   Zslice1Zslice2rs   r   r   r   r   test_decompose_slicen  s
    
r   r   )r   r   r{   )r   r"   indexer_moder   r   r   r   r   r   r   r   r   indexing_supportc           
      C  s   t jj|  }t| |}t|| |\}}t|| }t|| }t|jdkr`t|| }t j	
|| tdd |jD st|| |}	t||	 }t j	
|| d S )Nr   c                 s  s   | ]}t |tjV  qd S r   )r   r   integer_typesrd   r   r   r   r     s     z*test_decompose_indexers.<locals>.<genexpr>)r'   r(   r)   r   r   Zdecompose_indexerr   r]   r   r   r   r   Z_combine_indexers)
r   r   r   rH   r   Zbackend_indZnp_indrs   r   Zcombined_indr   r   r   test_decompose_indexersz  s    
r   c                  C  sR   t jdt jd} tt| tj}t j| t 	| t j| |d d   d S Nr   r   )
r'   r*   r   r   !ImplicitToExplicitIndexingAdapterr   r   r   r   r   r   Zimplicitr   r   r   test_implicit_indexing_adapter  s     r   c                  C  s<   t jdt jd} tt| }t|d d  tjs8td S r   )r'   r*   r   r   r   r   r   r[   r   r   r   r   ,test_implicit_indexing_adapter_copy_on_write  s
    r   c               
   C  sd  dd } t jddd}tdddg|}t }|d d  d	d
|d d t d	dddgt d	gt ddk g}tj|ddD ]\}}}t	|t j
r|jjdkrt ddk }t	|t j
r|jjdkrt ddk }||||f\}}	}
t|j|	j }|
rtt|
}t |||
}t| || || |f}t||j}|j| }t j|| q~d S )Nc                 S  s(   t | tjr$| jjdkr$|  d } | S )Nr9   r   )r   r'   r   r   r   nonzero)r   r   r   r   r     s    zQtest_outer_indexer_consistency_with_broadcast_indexes_vectorized.<locals>.nonzeror   r   r   r   r1   rf   r   ry   r"   r    r!   r   r   r9   r#   r{   )r'   r(   r   r   r   r   r*   r   r   r   r   r   r   Z_broadcast_indexes_vectorizedr   ZNumpyVIndexAdapterrH   r   rC   r]   Zmoveaxisr   r   Z_outer_to_numpy_indexerr   r   r   )r   r   r   r0   rb   r   r1   rf   _rs   Z	new_orderexpected_dataZ	old_orderZouter_indexr   Zactual_datar   r   r   @test_outer_indexer_consistency_with_broadcast_indexes_vectorized  s4    


	
r  c               	   C  s   t tdddgf} tdddg}t | d}tj|| t dtdtdddgf} tddddgg }t | d}tj|| d S )	Nr   rx   r!   FTr   r    r   r   r   )r   r   r'   r   create_maskr   r   r   r   rs   r   r   r   r   test_create_mask_outer_indexer  s     r  c               	   C  s   t tdddgtdddgf} tdddg}t | d}tj|| t tdddgtd tdddgf} tdddggd j}t | d}tj|| d S )	Nr   rx   r!   r    FTr   r   r!   )	r   r   r'   r   r  r   r   r   Tr  r   r   r   #test_create_mask_vectorized_indexer  s    &$r  c                  C  sL   t d} t | d}tjd| t d} t | d}tjd| d S )N)rx   r   T)r   F)r   r   r  r'   r   r   )r   r   r   r   r   test_create_mask_basic_indexer  s    

r	  c               	   C  s   t d} tdtdtdddgf}tddddgg }t|d| jd	d
d}|j	d
ksft
tj|| ttdddgtd tdddgf}tdddggd j}t|d| jddd}t|| jst
tj|| t t t|d| jddd W 5 Q R X d S )Nz
dask.arrayr    r!   r   rx   FTr  )r!   r"   ))r    r    )r!   r    )chunksr  r   )r   )r!   r   )r    )r,   Zimportorskipr   r   r   r'   r   r  emptyr
  r[   r   r   r   r  r   Arrayr-   r_   )rI   r   rs   r   Zindexer_vecr   r   r   test_create_mask_dask  s.    
   $  r  c                	   C  s*   t jtdd tdd W 5 Q R X d S )Nzunexpected key typer$   r   r   )r,   r-   r   r   r  r   r   r   r   test_create_mask_error  s    r  zindices, expectedr   c                 C  s   t | }tj|| d S r   )r   Z_posify_mask_subindexerr'   r   r   )indicesrs   r   r   r   r   test_posify_mask_subindexer  s    
r  c                  C  sp   t dt df} tt j| td}|d }t jdtd}| d |d< t|}|j g|j gksltd S )Nr"   r}   r   r   r   )	r'   r*   r   r   objectr  rH   itemr[   )itemsr0   r   r   rs   r   r   r   test_indexing_1d_object_array.  s    r  )C
__future__r   r   typingr   Znumpyr'   ZpandasrW   r,   Zxarrayr   r   r   Zxarray.corer   r   Zxarray.core.indexesr	   r
   Zxarray.core.typesr   Zxarray.testsr   r   r   r   r   r   r   r   r   r   markZparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   ZIndexingSupportZBASICZOUTERZOUTER_1VECTORZ
VECTORIZEDr   r   r   r  r  r  r	  r  r  r*   r   r  r  r   r   r   r   <module>   s   
 f 	.* *		&
&&