U
    Cvft                     @  s  d dl mZ d dlmZmZ d dlmZ d dlZd dl	Z
d dlZd dlZd dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZ d dlmZ zd dlZW n ek
r   Y nX d	d
dddZdd Z ej!"dddgej!"dddgej!"dej#d ddej#dddgddd	dddd Z$ej!"ddd!gddd"d#d$Z%ej!"d%d&d'gd(dd)d*d+Z&ej!"dej#d,ddej#d-d.dgd	ddd/d0Z'edd1d2d3Z(edd1d4d5Z)ej!"ddgej!"dej#d ddej#dddgdd	dd6d7d8Z*ej!"ddgej!"dej#d,ddej#d-d.dgdd	dd6d9d:Z+ej!"d%d'd&gd(dd)d;d<Z,ej!"d%d'd&gd(dd)d=d>Z-edd1d?d@Z.edd1dAdBZ/edd1dCdDZ0edd1dEdFZ1ej!"dej#d dGdej#d,dHdgd	dddIdJZ2edd1dKdLZ3eej!"dMe
j4dNd,dOddPd,gfe5e6dQe6dRgdSdTgfdQdRgdSdTgfdQdRdUgdSdTej7gfdQgdSfej#dQdSej!j8dVgdd1dWdXZ9edd1dYdZZ:eedd1d[d\Z;eedd1d]d^Z<eedd1d_d`Z=eedd1dadbZ>edd1dcddZ?eedd1dedfZ@edd1dgdhZAeedd1didjZBeej!"ddkdgddd"dldmZCeeej!"dddkd!dndodgej!"d.d'd&gej!"dpdqdr eDdd-D dd(ddsdtduZEeeej!"dddkgej!Fdvddd"dwdxZGedd1dydzZHeej!"d{d|e5d}d~gd'fde5d dSddPgeIddfd&fgd(ddddZJedd1ddZKdS )    )annotations)combinationspermutations)castN)_parse_array_of_cftime_strings)InterpOptions)assert_allcloseassert_equalassert_identicalhas_dask	has_scipyrequires_cftimerequires_daskrequires_scipy)create_test_dataintzxr.DataArray)casereturnc                 C  sT  | dkrft ddd}t ddd}tjt |d d t jf t | ddg||d|d fd	d
S | dkrtdddiS | dkrtddddS | dkr,t ddd}t ddd}t ddd}tjt |d d t jt jf t |d d t jf  | dddg||d|d f|dd
S | dkrHtdddiS t	dd S )Nr      d   皙?   xy   r   r   x2dimscoords      r   r   皙?
   zr   r   r   r%         zcase must be 1-4)
nplinspacexr	DataArraysinnewaxiscosget_example_datachunk
ValueError)r   r   r   r%    r3   </tmp/pip-unpacked-wheel-h316xyqg/xarray/tests/test_interp.pyr0      s0     
6
r0   c                  C  s>   t std td} t| jddgd| dddgi d S )Nscipy is not installed.r         ?g?r   r   )r   pytestskipr0   r	   interpdar3   r3   r4   test_keywargsA   s    
r=   methodlinearZcubicdimr   r   r   Zno_chunk)idr   Zchunk_yr   strNone)r>   r@   r   r   c                   s   t std ts$|dkr$td t| tddd} j|id} fdd	}d
kr| d d
| d |fd}n d
 | d d}tj	| |d
dg|d}t
|| d S )Nr5   r   )dask is not installed in the environment.        ?P   r>   r   c                   s*   t jj  | j| dtjd|S NF)axisbounds_error
fill_valuekindscipyinterpolateinterp1ddataget_axis_numr)   nanobjnew_xr<   r@   r>   r3   r4   funcZ   s    z!test_interpolate_1d.<locals>.funcr   r   r   r   r   )r   r8   r9   r   r0   r)   r*   r:   r+   r,   r   )r>   r@   r   xdestactualrZ   r   expectedr3   rY   r4   test_interpolate_1dI   s    


 r^   Zzero)r>   r   c                   s   t std td dtddd} j|id} fdd	}| d
 d| d |fd}tj| |dd
g|d}t	|| d S )Nr5   r   r   rF   rG   rH   rI   c                   s*   t jj  | j| dtjd|S rJ   rO   rV   rY   r3   r4   rZ   y   s    z)test_interpolate_1d_methods.<locals>.funcr   r   r   r   )
r   r8   r9   r0   r)   r*   r:   r+   r,   r   )r>   r[   r\   rZ   r   r]   r3   rY   r4   test_interpolate_1d_methodsm   s    

r_   use_daskFTbool)r`   r   c                   s  t std ts | r td  fdd}td | rF ddi tjt	dd	d
dtj
d
dtj
d
fdd} j|dd}tj| d|ddg|d |d  d d|jfd| d d|fdd}t||jdddd tjt	dd	d
ddddgtj
dtj
ddtj
dfdd} j|dd}tj| d|dddg|d |d |d  d d|jfd| d d|fdd}t||jddddd d S )Nr5   rE   c                   sp    fddt jD }|jd d d D ]}| | q*tjj  j dtj	d|
|S )Nc                   s"   g | ]\}}|  kr|qS r3   )rT   ).0isr@   rW   r3   r4   
<listcomp>   s      z<test_interpolate_vectorize.<locals>.func.<locals>.<listcomp>FrK   rL   rM   )	enumerateshapeinsertrT   rP   rQ   rR   rS   r)   rU   reshape)rW   r@   rX   rj   rd   r;   re   r4   rZ      s    z(test_interpolate_vectorize.<locals>.funcr   r   r(   r   rG   r   r%   )r%   z2r   r?   r   r>   r   rm   r   )r%   rm   r   r   r   T)Ztranspose_coords   w)r%   rp   rm   )r%   rp   )r%   rp   rm   r   r   r   )r   r8   r9   r   r0   r1   r+   r,   r)   r*   randomrandnr:   valuesr   	transposerl   rS   )r`   rZ   r[   r\   r]   r3   r;   r4   test_interpolate_vectorize   s\    






ru   r    r'   chunkedc           	   	   C  s  t std ts$| dkr$td t| }tddd}tddd	}|j||d
d}|j|d
d}|j|d
d}t|	ddd|	ddd t
jtddddd}t
jtddddd}|j||d
d}tjj|d |d f|	dddjd
dtjdtj||gdd}t
j|ddg|d |d|jf|d j|ddd}t|	dd| |j||d
d}t|	dd| d S )Nr5   r'   rE   r         ?   rF   r#   r$   r?   r   r   r>   rn   r   r>   r   r   r%   r   Fr>   rL   rM   rg   rK   r   r7   )r%   r   r   r   r   r   r   r>   )r   r8   r9   r   r0   r)   r*   r:   r   rt   r+   r,   rP   rQ   RegularGridInterpolatorrs   rU   stack)	r   r<   ZxdestnpZydestnpr\   r]   r[   ydestexpected_datar3   r3   r4   test_interpolate_nd   sF    


r   )r   c               	   C  s"  ddg} dddg}t jtdddd| |dd}dg}||d	}t jdddggd
|d}|j|d}t jdddggd
|d}t j|d| t	
t2 dg|d	}t jdggd
|d}|j|d W 5 Q R X t	
t6 dddg|d	}t jdggd
|d}|j|d W 5 Q R X dS )<Interpolate nd array with an nd indexer sharing coordinates.r   r   r   ro   r    )ar   r   r$   r"   r   r   r         ?r'   r(   r      N)r+   r,   r)   arangerl   r:   testingr   	drop_varsr8   raisesr2   )r   r   r<   r   ciaoutr]   r3   r3   r4   test_interpolate_nd_nd  s*    
  
r   c                  C  s   dddg} ddg}| |d}t jdtddd	}t j|d
< tj|d|d}tjdddgdddddgid}|j|d}tjdt jdgddt jggd|d}tj	|
d| d| }t||d}	|	j|d}
t|d| d}tj	|

d| dS )z9Interpolate an array with an nd indexer and `NaN` values.r   r   r   r$      r"   ro   Zdtyper    )r   r   r   r   r   r'   r   rw   g       @)r<   dbN)r)   r   floatrl   rU   r+   r,   r:   r   r   r   Dataset)r   r   r   r   r   r<   r   r]   r   dsZout2Zexpected_dsr3   r3   r4   test_interpolate_nd_with_nan&  s&    


   r   )r>   r   r   c                   s   t std ts$|dkr$td t| d} j|| d} fdd}| d | d	 |d
}tj| |dg|d}t|| d S )Nr5   rD   rE   皙?rn   c                   s(   t jj d | j| ddtjd|S )Nr   Frh   rO   rV   r;   r3   r4   rZ   Q  s    z%test_interpolate_scalar.<locals>.funcr   r   r   r   )	r   r8   r9   r   r0   r:   r+   r,   r   )r>   r   r[   r\   rZ   r   r]   r3   r;   r4   test_interpolate_scalar@  s    

	r   c           	      C  s   t std ts$|dkr$td t|}d}d}|j||| d}tjj|d |d f|	ddd	j
d
dtjdtj||gdd}|||d j|d|d	 d}tj|d d	g|d}t|| d S )Nr5   )r'   rE   r   g?ry   r   r   r%   r?   Fr|   rg   r}   r   r7   r&   r   r   )r   r8   r9   r   r0   r:   rP   rQ   r   rt   rs   r)   rU   r   r+   r,   r   )	r>   r   r<   r[   r   r\   r   r   r]   r3   r3   r4   test_interpolate_nd_scalar_  s(    

r   c                 C  sn   t std tjddtjdgddtdid}tsJ| rJtd |	 }|j
d	d
gd}| dksjtd S )Nr5   r   r   r   r   r'   r   rE   r6   r   r7   )r   r8   r9   r+   r,   r)   rU   ranger   r1   r:   countAssertionError)r`   r<   r\   r3   r3   r4   	test_nans}  s    
"
r   c              
   C  sz  t std tjddtjdgddtdid}tsJ| rJtd |	 }d	D ],}t
t |jd
dg|d W 5 Q R X qN| rtd}ntd}|jdddgddid}t|j rt|jdddgd}t|j stt
t |jddgdd W 5 Q R X t
t |jddgdd W 5 Q R X tjdddgdddddgid}t
t |jdd W 5 Q R X d S )Nr5   r   r   r   r   r'   r   rE   )ZakimaZspliner6   r   rn   r    rg   rM   rF   )r   kwargsr7   Zboorz   r   br   )r   r8   r9   r+   r,   r)   rU   r   r   r1   r   r2   r:   r0   isnanrs   anyr   	TypeError)r`   r<   r>   resultr3   r3   r4   test_errors  s.    
"

 r   c                  C  s   t dtdddgfdtjdddgtdfdtjddd	gtdfd
} tjdddgtd}tj| t |dd}tjdd |  D t |ddg dd}|j	|dd}t
|| d S )Ntimer   g      ?r   TFr   startend)r   r   r   r         ?r   r   c                 S  s&   i | ]\}\}}|||d dg fqS )r   rg   r3   )rb   kr@   Zarrr3   r3   r4   
<dictcomp>  s    
  ztest_dtype.<locals>.<dictcomp>rg   r?   )r   r>   )dictr)   arrayra   rB   r   r+   r   itemsr:   r
   )	data_varsr   r]   r\   r3   r3   r4   
test_dtype  s    r   c               	   C  s$  t jd} t jd}t dddd }tjt | d d t jt jf t |d d t jf  | ddd	g| |d| d
 f|dd}t ddd}t ddd}|d}t	|j
|d|j
|dd |ddg}t	|j
||d|j
||dd tt |j
ddd
gdd W 5 Q R X d S )Nr   r   r   r#   r$   g      @r   r   r%   r   r&   r   r   r   r   r7   T)r   assume_sortedr"   )r   r   r   )r)   rq   rr   r*   r+   r,   r/   r.   Zsortbyr   r:   r8   r   r2   )r   r   r%   r<   x_newy_newZ	da_sortedr3   r3   r4   test_sorted  s&    6
r   c                  C  s   t jtdddddgdddddgid	} |  }td|d< t| jd
ddgd|jd
ddgd t| jd
ddgdgd|jd
ddgdgd d S )N   r    r'   r   r   r   r   r   r   r   r#   333333?r7   r6   r"   )r+   r,   r)   r   rl   copyr	   r:   )r<   Z
da_w_coordr3   r3   r4   test_dimension_wo_coords  s      &r   c                  C  s  t  } d| jd< d| d jd< tjdddgd	d
}| j|d}t|d | d j|d |d | d sntd|d d d df< d|d d d df< d|d d d df< |d | d rt|d | d rt|d | d rt|jd dkst|d jd dkstd S )Nvarfoovar2var1buzg)\(?gzG?gףp=
?r%   r{   dim2var3rw   r   )r   attrsr+   r,   r:   r   equalsr   )r   Znew_dim2interpolatedr3   r3   r4   test_dataset  s    
r   Z2DZ3Dc                 C  s  t std t| }tjdddgdd}|j|dj|j|dd	jksLt	tjdddgd
d}|j||dj}|j||ddj}||kst	|j||dj}|j||ddj}||kst	tjdddgdd}|j|dj|j|dd	jkst	|j|dj|j|ddjkst	tjdddgdd}|j||dj}|j||ddj}||ksZt	tjdgdgdggddgd}|j|dj|j|dd	jkst	|j|dj|j|ddjkst	| dkrtjdgdgdggddgd}tjdgdgdggddgd}|j||dj}|j||ddj}||ks6t	|j||dj}|j||ddj}||ksft	|jd|dj}|jd|ddj}||kst	dS )zAMake sure the resultant dimension order is consistent with .sel()r5   r   r   r   r   r{   r7   nearestrn   r   r"   ry   r   r~   r   )r   rz   r   r    )r   r%   )r   r%   r>   )r%   r   )r%   r   r>   r6   N)
r   r8   r9   r0   r+   r,   r:   r   selr   )r   r<   rX   Znew_yr\   r]   Znew_zr3   r3   r4   test_interpolate_dimorder  sD    
""$$$
r   c                  C  s  t  } d| jd< d| d jd< tjtjddgddd	d
gid}| |}t|d | d j	|d d t|d | d | |d 
| d st|jd dkst|d jd dksttjtjddgddddgid}| |}| |}t|| d S )Nr   r   r   r   r   r    r   r   r   r   r   r   r   Zdim3r   r   r   )r   r   r+   r,   r)   rq   rr   Zinterp_liker   r:   r   r   Zreindex_like)r   otherr   r\   r]   r3   r3   r4   test_interp_like6  s$    
$

  

r   zx_new, expectedz
2000-01-02periodsr   2000-01-01T12:002000-01-02T12:00r6   r   ZNaT)Zmarksc                 C  sf   t jtdddtjdddid}|j| d}t jt|dgdt| did}t	|| d S )N   r   
2000-01-01r   r   r   zdatetime64[ns])
r+   r,   r)   r   pd
date_ranger:   Z
atleast_1dZastyper   )r   r]   r<   r\   Zexpected_dar3   r3   r4   test_datetimeP  s    r   c                  C  sN   t jtdddtjdddid} | jdd}t d}t|d| d S )	Nr   r   r   r   r   r   r   r6   )	r+   r,   r)   r   r   r   r:   r   r   )r<   r\   r]   r3   r3   r4   test_datetime_single_stringr  s    
r   c                  C  sl   t jdddd} t jtd| gdd}t jdddd}|j|d	}t jd
ddg|gdgd}t|| d S )N2000r   Dr   freqr   r   r   2000-01-01T12:00:00r    r   r6   r         @)r+   cftime_ranger,   r)   r   r:   r   )timesr<   	times_newr\   r]   r3   r3   r4   test_cftime  s    r   c               	   C  s`   t jdddd} t jtd| gdd}t jdddd	d
}tt |j|d W 5 Q R X d S )Nr   r   r   r   r   r   r   r    Znoleapr   r   calendarr   	r+   r   r,   r)   r   r8   r   r   r:   )r   r<   r   r3   r3   r4   test_cftime_type_error  s       r   c                  C  s   ddl m}  tjddddd}tjtd|gdd	}d
ddg}|j|d}tt	|| }tjdddg|gdgd	}t
|| d S )Nr   DatetimeProlepticGregorianr   r   r   proleptic_gregorianr   r   r   r   r   z2000-01-03T12:00r   r6   r   r   Zcftimer   r+   r   r,   r)   r   r:   r   r   r   r   r   r<   r   r\   Ztimes_new_arrayr]   r3   r3   r4   test_cftime_list_of_strings  s        
 r   c                  C  sv   ddl m}  tjddddd}tjtd|gdd	}d
}|j|d}tt	|| }tjdd|id}t
|| d S )Nr   r   r   r   r   r   r   r   r   r   r   r6   r   r   r   r3   r3   r4   test_cftime_single_string  s         r   c               	   C  sJ   t jtdddtjdddid} tt | j	dd W 5 Q R X d S )Nr   r   r   r   r   r6   r   )
r+   r,   r)   r   r   r   r8   r   r   r:   r;   r3   r3   r4   #test_datetime_to_non_datetime_error  s    r   c               	   C  sN   t jdddd} t jtd| gdd}tt |jdd W 5 Q R X d S )	Nr   r   r   r   r   r   r6   r   r   r   r<   r3   r3   r4   test_cftime_to_non_cftime_error  s    r   c               	   C  sz   t jtdddddgdddgtjddd	d
dd} t jtddddgdtjdddd
id}| j||j	d d S )N   r    r   r   r   r   r   z
01-01-2001r   r   )r   r   r   2   H)
r+   r,   r)   r   rl   r   r   r*   r:   r   )r   xir3   r3   r4   test_datetime_interp_noerror  s    r   c                  C  s:   t jdddd} t jtddg| gd}|jdgd d S )	NZ0001r    Z500Yr   r   r   z
0002-05-01r   )r+   r   r,   r   r:   r   r3   r3   r4   	test_3641  s    r   r   c                 C  s   t jtdddddgdddgdd	gd
d}t jdddgdgd}t jddgdgd}t ||\}}|jdkszt|j||| d	d
}|j||| d	d
}t
|| d S )Nro   r    r   r   r   r   r   gg333333ӿr"   r   r6   r   r   x1r{   g333333ÿ      пy1ry   )r+   r,   r)   r   rl   	broadcastndimr   r:   r   r   )r>   r<   r   r   Zx_broadcastZy_broadcastr\   r]   r3   r3   r4   test_decompose  s    r   ZslinearZ	quadraticzdata_ndim,interp_ndim,nscalarc                 C  s>   g | ]6}t d |d  D ]"}t d|d  D ]}|||fq(qqS )r   r   )r   )rb   	data_ndiminterp_ndimnscalarr3   r3   r4   rf     s     rf   )r>   rv   r   c                   s.  t ddd}t ddd}t ddd	}tjt |d
d
t jt jf t |d
d
t jf  t | d|fd|fd|fgd ddi}t j	|D ] 
 fdd j	D   jdd t j	D d t j	|D ]<}	t|	|D ]$}
i }|	D ]}||
kr4d j| d  j| d   ||< nd j| d   j| d  }d j| d   j| d  }ttjt ||t j| d ||< |r tj|| |gd||< || d||< q  jf d| i|d|i}  jf d| i|d|i}t||  qq q"q q*qd
S )zkInterpolate nd array with multiple independent indexers

    It should do a series of 1d interpolation
    r   r   r(   r   r'   r   g      r6   rx   Nr   r   r%   rS   r   rM   Zextrapolatec                   s(   i | ] }|kr|t  j| d  qS )r   )lenr   )rb   r@   r<   Z	data_dimsr3   r4   r   /  s       z-test_interpolate_chunk_1d.<locals>.<dictcomp>c                 S  s   i | ]\}}||d  qS rD   r3   )rb   rc   r@   r3   r3   r4   r   3  s      )chunksrg      )rS   r   r>   r   )r)   r*   r+   r,   r-   r.   r/   expr   r   Ziselr1   ri   r   r   r   r   r:   Zcomputer
   )r>   r   r   r   rv   r   r   r%   r   Zinterp_dimsZscalar_dimsdestr@   beforeafterr\   r]   r3   r  r4   test_interpolate_chunk_1d  sL    
&  
r	  z"ignore:Increasing number of chunksc              
   C  s  t ddd}t ddd}t ddd}t ddd}t ddd}tjt |d	d	t jt jt jt jf t |d	d	t jt jt jf  t |d	d	t jt jf  |d	d	t jf  | d
|||||ddd}t ddt j d}t ddd}tjd|d	d	t jf t |  d|fd|fgd}	|	t | }
|	t | }tj|d	d	t jf t | d|fd|fgd}dd	i}|j	d|
|||| d}|
d}|

d}
|
d}|j	d|
|||| d}t|| d	S )r   rg   r   r(   r   rx   r   r     N)r   r   r%   tqZ
dummy_attr)r   r   r%   r  r  label)rS   r   r   r   r   r   rp   thetar   rM   r6   )r  r   r   r%   r   r>   r    )r)   r*   r+   r,   r-   r.   r/   r  pir:   r1   r
   )r>   r   r   r%   r  r  r<   r  rp   rZxdaZydaZzdar   r]   r\   r3   r3   r4   test_interpolate_chunk_advancedU  sJ    "


r  c               	   C  sb   t tdtd dtdfg} tt | jdt	ddd W 5 Q R X | jdd d	S )
z7Ensure exception on bounds error is raised if requestedr   r'   r         @T)rL   r   r   r   N)
r+   r,   r)   r-   r   r8   r   r2   r:   r   r;   r3   r3   r4   test_interp1d_bounds_error  s    r  zx, expect_same_attrs)r   Tr   r(   rd   )unit)expect_same_attrsr   c                 C  s\   t dd}tjt dtd dddtd|fid}|j| djj|k}||ksXtd S )	Nbar)r   r   r(   r   r   )r   r   r7   )	r   r+   r   r)   r   r:   r   r   r   )r   r  Z
base_attrsr   Zhas_same_attrsr3   r3   r4   test_coord_attrs  s    

r  c                  C  sb   t tdtd dtdfg} | jdttjtjd  dd}| jdd}t|| d	S )
z'Ensure complex nans are used by defaulty        333333?r'   r   r  y              ?)rM   r  r   N)	r+   r,   r)   r  r   r:   r   rU   r
   )r<   r]   r\   r3   r3   r4   #test_interp1d_complex_out_of_bounds  s     r  )L
__future__r   	itertoolsr   r   typingr   Znumpyr)   Zpandasr   r8   Zxarrayr+   Zxarray.coding.cftimeindexr   Zxarray.core.typesr   Zxarray.testsr   r	   r
   r   r   r   r   r   Zxarray.tests.test_datasetr   rP   ImportErrorr0   r=   markZparametrizeparamr^   r_   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z
datetime64rU   Zxfailr   r   r   r   r   r   r   r   r   r   r   r   r	  filterwarningsr  r  r   r  r  r3   r3   r3   r4   <module>   s  (
" K 1  %$/
 	?
+ 