B
     \                 @   s  d Z ddlZddlZddlmZmZ ddlm  mZ	 ddl
mZmZmZmZ ddlmZmZmZ ddlmZ ed	 ZZeeejZejfd Zd
d Zdd Zdd Zdd Zdd ZdxddZ dyddZ!dd Z"dd Z#dd Z$e$dd dd!dd!ddd!dd!dgZ%e$dd"dd!dd!ddd!dd!dgZ&e$ddd#d$d%d&d'd(d)d*d+d,gZ'e$ddd-d.d/d0d1d2d3d4d5d6gZ(eej)eejd7d8 Z*eej+ejd9d: Z,eej-ejd;d< Z.ee/ejd=d> Z0d?d@ Z1eej2fe eej3fe dAdB Z4eej5fe eej6fe dCdD Z7dEdF Z8eej9ejej:eej;ejej:eej9ejej<eej;ejej<dGdH Z=eej9ej:ejeej;ej:ejeej9ej<ejeej;ej<ejdIdJ Z>eej?ejej:eej@ejej:eejAejej:eejBejej:eej?ejej<eej@ejej<eejAejej<eejBejej<dKdL ZCeseejDejej:eC eejEejej:eC eejDejej<eC eejEejej<eC eej?fe eej@fe dMdN ZFeseejDfe eF eejEfe eF ejGdOkrXeejAfe dPdQ ZHesPeejEfe eH dRdS ZIdTdU ZJdVdW ZKeJe	jLejMZNeJe	jOejPZQeKe	jRZSeKe	jTZUeKe	jVZWeKe	jXZYxTejZeNfej[eQfej\eSfej]eUfej^eWfej_eYfgD ]\Z`Zaee`fe ea qW dXdY ZbdZd[ Zcd\d] Zdd^d_ Zed`da ZfefdbZgefdcZheej2ej)ejeej3ej)ejddde Zieej2ejej)eej3ejej)dfdg Zjeej5ej)ejeej6ej)ejdhdi Zkeej5ej)ej)djdk Zldldm Zmeme	jLZneme	jOZoeme	jRZpeme	jTZqeme	jVZreme	jXZsx\ejZenfej[eofej\epfej]eqfej^erfej_esfgD ]$\ZtZaeetfej)gd  ea qRW dndo Zudpdq Zvdrds Zwdtdu Zxdvdw ZydS )zz4
Implementation of operations on numpy timedelta64.
    N)TypeConstant)
npdatetimetypescgutilsnumpy_support   )lower_builtinlower_constantimpl_ret_untracked   )IS_PY3@   c             C   s   |  |tt|S )z2
    Multiply *val* by the constant *factor*.
    )mulr   intTIMEDELTA64)buildervalfactor r   7lib/python3.7/site-packages/numba/targets/npdatetime.pyscale_by_constant   s    r   c             C   s   |  |tt|S )z0
    Divide *val* by the constant *factor*.
    )sdivr   r   r   )r   r   r   r   r   r   unscale_by_constant   s    r   c             C   s   |  |tt|S )z(
    Add constant *const* to *val*.
    )addr   r   r   )r   r   Zconstr   r   r   add_constant%   s    r   c             C   s8   t |j|j}|dkr,td|j|jf t|||S )zk
    Scale the timedelta64 *val* from *srcty* to *destty*
    (both numba.types.NPTimedelta instances)
    Nz(cannot convert timedelta64 from %r to %r)r   get_timedelta_conversion_factorunitNotImplementedErrorr   )contextr   r   ZsrctyZdesttyr   r   r   r   scale_timedelta,   s    r    c             C   sd   t |j|j}|dk	r(t||||fS t |j|j}|dk	rP|t|||fS td||f dS )ze
    Scale either *left* or *right* to the other's unit, in order to have
    homogeneous units.
    Nzcannot normalize %r and %r)r   r   r   r   RuntimeError)r   r   leftrightZlefttyZrighttyr   r   r   r   normalize_timedeltas:   s    r$   retc             C   s    t j| t|d}| t| |S )zM
    Allocate a NaT-initialized datetime64 (or timedelta64) result slot.
    )name)r   alloca_oncer   storeNAT)r   r&   r%   r   r   r   alloc_timedelta_resultK   s    r*   c             C   s   t j| td|d}|S )z8
    Allocate an uninitialized boolean result slot.
    r   )r&   )r   r'   r   r   )r   r&   r%   r   r   r   alloc_boolean_resultT   s    r+   c             C   s   |  tj|tS )z?
    Return a predicate which is true if *val* is not NaT.
    )icmplcICMP_NEr)   )r   r   r   r   r   
is_not_nat\   s    r/   c             C   sJ   t |dkstt| |d }x&|dd D ]}| |t| |}q,W |S )zH
    Return a predicate which is true if all of *vals* are not NaT.
    r   r   N)lenAssertionErrorr/   and_)r   valsZpredr   r   r   r   are_not_natc   s
    r4   c             C   s   dd | D }t t|S )Nc             S   s   g | ]}t t|qS r   )r   r   r   ).0vr   r   r   
<listcomp>o   s    z'make_constant_array.<locals>.<listcomp>)r   Zarrayr   )r3   Zconstsr   r   r   make_constant_arrayn   s    r8               ;   Z   x               i  i0  iN  <   [   y               i  i1  iO  c             C   s   t |tjS )N)
DATETIME64ZastypenpZint64)r   r   ZtyZpyvalr   r   r   datetime_constant}   s    rM   c             C   s   |d }t | ||j|S )Nr   )r   return_type)r   r   sigargsresr   r   r   timedelta_pos_impl   s    rR   c             C   s   | |d }t| ||j|S )Nr   )negr   rN   )r   r   rO   rP   rQ   r   r   r   timedelta_neg_impl   s    rT   c       	   
   C   s   |\}t |}|t||H\}}| |||| W d Q R X | ||| W d Q R X W d Q R X ||}t| ||j|S )N)	r*   if_elser   Zis_scalar_negr(   rS   loadr   rN   )	r   r   rO   rP   r   r%   then	otherwiserQ   r   r   r   timedelta_abs_impl   s     
rY   c             C   s   |\}t |}ttd}||tj||\}}| |ttd| W dQ R X |t ||tj	||R\}	}
|	 |ttd| W dQ R X |
 |ttd| W dQ R X W dQ R X W dQ R X W dQ R X |
|}t| ||j|S )z
    np.sign(timedelta64)
    r   r   N)r*   r   r   r   rU   r,   r-   ICMP_SGTr(   ICMP_EQrV   r   rN   )r   r   rO   rP   r   r%   zeroZgt_zeroZle_zeroZeq_zeroZlt_zerorQ   r   r   r   timedelta_sign_impl   s     <
r^   c       
   	   C   s   |\}}|j \}}t|}t|t|||g> t| ||||j}t| ||||j}||||| W d Q R X |	|}	t
| ||j|	S )N)rP   r*   r   	if_likelyr4   r    rN   r(   r   rV   r   )
r   r   rO   rP   vavbtatbr%   rQ   r   r   r   timedelta_add_impl   s    

rd   c       
   	   C   s   |\}}|j \}}t|}t|t|||g> t| ||||j}t| ||||j}||||| W d Q R X |	|}	t
| ||j|	S )N)rP   r*   r   r_   r4   r    rN   r(   subrV   r   )
r   r   rO   rP   r`   ra   rb   rc   r%   rQ   r   r   r   timedelta_sub_impl   s    

rf   c       	   	   C   s   t |}t|t||b t|tjrP|||j}|	||}t
| ||}n|||}t| ||||}||| W d Q R X ||S )N)r*   r   r_   r/   
isinstancer   FloatsitofptypeZfmul_cast_to_timedeltar   r    r(   rV   )	r   r   td_argtd_type
number_argnumber_typerN   r%   r   r   r   r   _timedelta_times_number   s    rp   c             C   s:   t | ||d |jd |d |jd |j}t| ||j|S )Nr   r   )rp   rP   rN   r   )r   r   rO   rP   rQ   r   r   r   timedelta_times_number   s    rq   c             C   s:   t | ||d |jd |d |jd |j}t| ||j|S )Nr   r   )rp   rP   rN   r   )r   r   rO   rP   rQ   r   r   r   number_times_timedelta   s    rr   c          	   C   s   |\}}|j d }t|}|t|||t||}t||j t|t	j
r||||j}	||	|}	t| ||	}	n|||}	t| ||	|j d |j}	||	| W d Q R X ||}
t| ||j|
S )Nr   r   )rP   r*   r2   r/   not_r   Zis_scalar_zero_or_nanr_   rg   r   rh   ri   rj   fdivrk   r   r    rN   r(   rV   r   )r   r   rO   rP   rl   rn   ro   r%   okr   rQ   r   r   r   timedelta_over_number   s     	

rv   c          	   C   s   |\}}|j \}}t|||g}| |j}	tj||	dd}
|t|	t	d|
 t
||H t| |||||\}}|||	}|||	}|||||
 W d Q R X ||
}t| ||j|S )Nr%   )r&   nan)rP   r4   get_value_typerN   r   r'   r(   r   realfloatr_   r$   ri   rt   rV   r   )r   r   rO   rP   r`   ra   rb   rc   not_nanll_ret_typer%   rQ   r   r   r   timedelta_over_timedelta!  s    

r}   )r      c             C   s  |\}}|j \}}| |j}t|||g}	tj||dd}
t|d}t|d}|||
 t	||	@ t
| |||||\}}||d||}t	|| |d||}|||d||}||\}}| ||r\}}|* |||}|||}|||
 W d Q R X |* |||}|||}|||
 W d Q R X W d Q R X W d Q R X | |||}|||
 W d Q R X W d Q R X W d Q R X W d Q R X ||
}t| ||j|S )Nr%   )r&   r   r   z==<)rP   rx   rN   r4   r   r'   r   r   r(   r_   r$   rs   icmp_signedor_rU   re   r   r   rV   r   )r   r   rO   rP   r`   ra   rb   rc   r|   r{   r%   r]   Zonedenom_okZvanegrS   rW   rX   ZnegthenZnegotherwisetopdivrQ   r   r   r   timedelta_floor_div_timedelta=  s<    
*4
r   c             C   s`  |\}}|j \}}t|||g}| |j}	t|}
|t|
 t|	d}t	
|| t| |||||\}}||d||}t	
|| |d||}|d||}|||}|||||d||}||J\}}| |||
 W d Q R X | |||||
 W d Q R X W d Q R X W d Q R X W d Q R X ||
}t| ||j|S )Nr   z==>)rP   r4   rx   rN   r*   r(   r)   r   r   r   r_   r$   rs   r   sremr   r2   rU   r   rV   r   )r   r   rO   rP   r`   ra   rb   rc   r{   r|   r%   r]   r   ZvaposZvbposZremZcondrW   rX   rQ   r   r   r   timedelta_mod_timedeltad  s.    
<
r   c                s    fdd}|S )Nc          
      s  |\}}|j \}}t|}|t|||g\}	}
|	X yt| |||||\}}W n  tk
rt   | | Y nX ||||| W d Q R X |
P tj	dk r||||| n(t
jkr|tj| n|tj| W d Q R X W d Q R X ||}t| ||j|S )N)r   r~   )rP   r+   rU   r4   r$   r!   r(   r,   r   versionr-   r.   r   true_bit	false_bitrV   r   rN   )r   r   rO   rP   r`   ra   rb   rc   r%   rW   rX   norm_anorm_brQ   )default_valuell_opr   r   impl  s&    
 

"
z/_create_timedelta_comparison_impl.<locals>.implr   )r   r   r   r   )r   r   r   !_create_timedelta_comparison_impl  s    r   c                s    fdd}|S )Nc          
      s   |\}}|j \}}t|}|t|||g\}	}
|	2 t| |||||\}}|| ||| W d Q R X |
6 tjdk r|| ||| n|t	j
| W d Q R X W d Q R X ||}t| ||j|S )N)r   r~   )rP   r+   rU   r4   r$   r(   r,   r   r   r   r   rV   r   rN   )r   r   rO   rP   r`   ra   rb   rc   r%   rW   rX   r   r   rQ   )r   r   r   r     s    
 
"
z-_create_timedelta_ordering_impl.<locals>.implr   )r   r   r   )r   r   _create_timedelta_ordering_impl  s    r   c          
   C   s|   |  |ttd}t| | |ttd}t| | |ttd}t| | |ttd}| || 	||S )z_
    Return a predicate indicating whether *year_val* (offset by 1970) is a
    leap year.
    i     d   i  )
r   r   r   rK   r   Zis_nullr2   Zis_not_nullr   r   )r   year_valZactual_yearZmultiple_of_4Znot_multiple_of_100Zmultiple_of_400r   r   r   is_leap_year  s    r   c          
   C   s0  t | t}t| |d}| t | |\}}|r t| |d}| |t| |d}t| |d}| 	|t| |d}t| |d}	| |t| |	d}| 
|| W dQ R X |f t| |d	}
| |t| |
d}t| |
d
}| 	|t| |d}| |t| |d}| 
|| W dQ R X W dQ R X | |S )zg
    Given a year *year_val* (offset to 1970), return the number of days
    since the 1970 epoch.
    im  r      D   r   i,  i  Ni)r   r'   r   r   rU   Z
is_neg_intr   r   r   re   r(   rV   )r   r   r%   daysZif_negZif_posZ	from_1968Zp_daysZ	from_1900Z	from_1600Z	from_1972Zn_daysZ	from_2000r   r   r   year_to_days  s4     r   c             C   sV  t j| }t j| }|dk s$|dkr,||fS |dkrD|}t| |}nt| dt}t| dt}	t| t}
t	| |d\}}| 
t| |v\}}|, | tj| |d|dd}| ||
 W d Q R X |, | tj| |	d|dd}| ||
 W d Q R X W d Q R X t| |}| || |
}|dkrJt	| |d\}}|d	fS |d
fS d S )Nr   r   leap_year_months_accnormal_year_months_acc   T)Zinbounds   WD)r   ZDATETIME_UNITSr   r   Zglobal_constantr   r   r'   r   Zdivmod_by_constantrU   r   rV   Zgepr(   r   )r   dt_valsrc_unit	dest_unitZdest_unit_codeZsrc_unit_coder   Zdays_valZ
leap_arrayZnormal_arrayr   ZyearZmonthrW   rX   ZaddendZweeks_r   r   r   reduce_datetime_for_unit  s8    

 

r   c             C   sB   t | |||\}}t||}|dkr6td||f t| ||S )zC
    Convert datetime *dt_val* from *src_unit* to *dest_unit*.
    Nz'cannot convert datetime64 from %r to %r)r   r   r   r   r   )r   r   r   r   dt_unitZ	dt_factorr   r   r   convert_datetime_for_arithI  s    r   c                s    fdd}|S )Nc       
   	      sv   t |}t|t|||gH t||||}t||}t|||}t| ||}	|	|	| W d Q R X |
|S )N)r*   r   r_   r4   r   r   r   r   getattrr(   rV   )
r   r   dt_argr   rl   Ztd_unitret_unitr%   Z	td_factorret_val)
ll_op_namer   r   r   Z  s    z'_datetime_timedelta_arith.<locals>.implr   )r   r   r   )r   r   _datetime_timedelta_arithY  s    r   r   re   c       	      C   s>   |\}}|j \}}t| |||j||j|jj}t| ||j|S )N)rP   _datetime_plus_timedeltar   rN   r   )	r   r   rO   rP   r   rl   dt_typerm   rQ   r   r   r   datetime_plus_timedeltao  s    

r   c       	      C   s>   |\}}|j \}}t| |||j||j|jj}t| ||j|S )N)rP   r   r   rN   r   )	r   r   rO   rP   rl   r   rm   r   rQ   r   r   r   timedelta_plus_datetime{  s    

r   c       	      C   s>   |\}}|j \}}t| |||j||j|jj}t| ||j|S )N)rP   _datetime_minus_timedeltar   rN   r   )	r   r   rO   rP   r   rl   r   rm   rQ   r   r   r   datetime_minus_timedelta  s    

r   c          	   C   s   |\}}|j \}}|j}|j}	|jj}
t|}t|t|||g: t||||
}t|||	|
}|||}|	|| W d Q R X |
|}t| ||j|S )N)rP   r   rN   r*   r   r_   r4   r   re   r(   rV   r   )r   r   rO   rP   r`   ra   rb   rc   unit_aunit_br   r%   r   rQ   r   r   r   datetime_minus_datetime  s    

r   c                s    fdd}|S )Nc          
      s  |\}}|j \}}|j}|j}	t||	}
t|}|t|||g\}}|< t||||
}t|||	|
}| ||}|	|| W d Q R X |D t
jdk r| ||}n tjkrtj}ntj}|	|| W d Q R X W d Q R X ||}t| ||j|S )N)r   r~   )rP   r   r   Zget_best_unitr+   rU   r4   r   r,   r(   r   r   r-   r.   r   r   r   rV   r   rN   )r   r   rO   rP   r`   ra   rb   rc   r   r   r   r%   rW   rX   r   r   r   rQ   )r   r   r   r     s.    


 
z._create_datetime_comparison_impl.<locals>.implr   )r   r   r   )r   r    _create_datetime_comparison_impl  s    r   c       
      C   sf   |\}}t ||}t ||}|tj||}||||}	|||	|}	|||	|}	t| ||j|	S )N)r/   r,   r-   ICMP_SGEselectr   rN   )
r   r   rO   rP   in1in2in1_not_natin2_not_nat
in1_ge_in2rQ   r   r   r   datetime_max_impl  s    

r   c       
      C   sf   |\}}t ||}t ||}|tj||}||||}	|||	|}	|||	|}	t| ||j|	S )N)r/   r,   r-   ICMP_SLEr   r   rN   )
r   r   rO   rP   r   r   r   r   
in1_le_in2rQ   r   r   r   datetime_min_impl  s    

r   c       
      C   sf   |\}}t ||}t ||}|tj||}||||}	|||	|}	|||	|}	t| ||j|	S )N)r/   r,   r-   r   r   r   rN   )
r   r   rO   rP   r   r   r   r   r   rQ   r   r   r   timedelta_max_impl  s    

r   c       
      C   sf   |\}}t ||}t ||}|tj||}||||}	|||	|}	|||	|}	t| ||j|	S )N)r/   r,   r-   r   r   r   rN   )
r   r   rO   rP   r   r   r   r   r   rQ   r   r   r   timedelta_min_impl
  s    

r   c          
   C   s|   | t}|d||}||J\}}| |t| W d Q R X | |||t| W d Q R X W d Q R X ||S )NZuno)Zallocar   Zfcmp_unorderedrU   r(   r)   ZfptosirV   )r   r   r   ZtempZ
val_is_nanrW   Zelsr   r   r   rk     s    

(rk   )r%   )r%   )z__doc__ZnumpyrL   operatorZllvmlite.llvmpy.corer   r   ZllvmpyZcorer-   Znumbar   r   r   r   Zimputilsr	   r
   r   Zutilsr   r   rK   r   r)   ZNPTimedeltaZTIMEDELTA_BINOP_SIGr   r   r   r    r$   r*   r+   r/   r4   r8   Znormal_year_monthsZleap_year_monthsr   r   Z
NPDatetimerM   posrR   rS   rT   absrY   r^   r   iaddrd   re   isubrf   rp   r   ZIntegerimulrh   rq   rr   truedivitruedivfloordiv	ifloordivrv   r   Zidivr}   r   r   r   r   r   r\   r   Ztimedelta_eq_timedelta_implr.   r   Ztimedelta_ne_timedelta_implZICMP_SLTZtimedelta_lt_timedelta_implr   Ztimedelta_le_timedelta_implr[   Ztimedelta_gt_timedelta_implr   Ztimedelta_ge_timedelta_impleqneltlegtgeZop_funcr   r   r   r   r   r   r   r   r   r   r   r   Zdatetime_eq_datetime_implZdatetime_ne_datetime_implZdatetime_lt_datetime_implZdatetime_le_datetime_implZdatetime_gt_datetime_implZdatetime_ge_datetime_implopr   r   r   r   rk   r   r   r   r   <module>   s   
	
  (



#% 




6- 






 