B
     \                @   s  d Z ddlmZmZmZ ddlZddlmZ ddl	m
Z
mZmZmZmZ ddl	mZmZmZ d	Zd
ZdZdddZejfddZdd Zdd Zdd Zdd Zdd ZeZdd Zdd Zdd Z d d! Z!d"d# Z"d$d% Z#d&d' Z$d(d) Z%d*d+ Z&d,d- Z'd.d/ Z(d0d1 Z)d2d3 Z*d4d5 Z+d6d7 Z,d8d9 Z-d:d; Z.d<d= Z/d>d? Z0d@dA Z1dBdC Z2dDdE Z3dFdG Z4dHdI Z5dJdK Z6dLdM Z7dNdO Z8dPdQ Z9dRdS Z:dTdU Z;dVdW Z<dXdY Z=dZd[ Z>d\d] Z?d^d_ Z@d`da ZAdbdc ZBddde ZCdfdg ZDdhdi ZEdjdk ZFdldm ZGdndo ZHdpdq ZIdrds ZJdtdu ZKdvdw ZLdxdy ZMdzd{ ZNd|d} ZOd~d ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zldd Zmdd Zndd Zodd Zpdd ZqddÄ Zrddń ZsddǄ ZtddɄ Zudd˄ Zvdd̈́ Zwddτ Zxddф Zyddӄ ZzddՄ Z{ddׄ Z|ddل Z}ddۄ Z~dd݄ Zdd߄ Zdd Zdd Zdd Zdd Zdd ZdS )zCodegen for functions used as kernels in NumPy functions

Typically, the kernels of several ufuncs that can't map directly to
Python builtins
    )print_functionabsolute_importdivisionN)core   )cgutilstypingtypesloweringerrors   )	cmathimplmathimplnumbersg+eG?g&{?g9B.?c                s   t ||kstt | j|ks"t| jd  |dkr8 }t fdd| jD rZ| j|ksddl}| jjj	}d
|| }dst|dS )zchecks that the following are true:
    - args and sig.args have arg_count elements
    - all input types are homogeneous
    - return type is 'return_type' if provided, otherwise it must be
      homogeneous with the input types.
    r   Nc             3   s   | ]}| kV  qd S )N ).0arg)tyr   5lib/python3.7/site-packages/numba/targets/npyfuncs.py	<genexpr>%   s    z/_check_arity_and_homogeneity.<locals>.<genexpr>z"{0} called with invalid types: {1}F)lenAssertionErrorargsallreturn_typeinspectZcurrentframef_backf_codeco_nameformat)sigr   Zarityr   r   fnamemsgr   )r   r   _check_arity_and_homogeneity   s    
"r#   c                sx    j }}tj||gt|j }tj|||d}	 fddt	||jD }
 
|	|
} |tj|jS )N)namec                s    g | ]\}}  ||qS r   )cast)r   r   Zargty)buildercontextr   r   r   
<listcomp>5   s   z0_call_func_by_name_with_cast.<locals>.<listcomp>)moduleget_argument_typelcTypefunctionr   r   r   insert_pure_functionzipcallr%   r	   float64r   )r'   r&   r    r   	func_namer   modltyfntyfnZ	cast_argsresultr   )r&   r'   r   r   _call_func_by_name_with_cast,   s    
r8   c          
      sD  |j d }y|| }W n< tk
rR } zd|t|}	t|	W d d }~X Y nX  j}
|tjkr	 |} fdd|D }|
 g| }|gt|j  }fdd|D }tjtj |}|
j||d} ||  |d }nPfdd|j D }|j}tj||}tj|
||d} ||j |}|S )Nr   z!No {0} function for real type {1}c                s   g | ]}t  |qS r   )r   Zalloca_once_value)r   r   )r&   r   r   r(   U   s   z/_dispatch_func_by_name_type.<locals>.<listcomp>c                s   g | ]}  | qS r   )Zget_value_typeZ
as_pointer)r   r   )r'   r   r   r(   ]   s   )r$   c                s   g | ]}  |qS r   )r*   )r   Zaty)r'   r   r   r(   e   s    )r   KeyErrorr   strr   ZLoweringErrorr)   r	   complex_domainmake_complexZ_getpointerlistr+   r,   r-   ZvoidZget_or_insert_functionr0   loadr*   r   r   r.   Zcall_external_function)r'   r&   r    r   tableZ	user_namer   r2   er"   r3   outZptrargs	call_argsZcall_argtysZcall_argltysr5   r6   ZretvalZargtypesZrestyper   )r&   r'   r   _dispatch_func_by_name_type<   s2    	



rC   c          
      s  |\}}|j  t fdd|D s,tdtj d}tj d}tj d|j jd > }|tj||}	|tj||}
|tj||}|	|
|}|
|	|}|j|dd\}}| |j}W d Q R X | |j}|||}|||}|tj||}|tj||}|||}|tj||}|	||}||||}|||}W d Q R X W d Q R X | }||| ||| |S )	Nc             3   s   | ]}|j  kV  qd S )N)type)r   i)lltyper   r   r   ~   s    z#np_int_sdiv_impl.<locals>.<genexpr>zmust have homogeneous typesr   r   F)likely)rD   r   r   r+   ConstantintwidthicmpICMP_EQand_or_if_elsebasic_blockZsdivsremICMP_SGTxorICMP_NEselectaddphiadd_incoming)r'   r&   r    r   numdenZERO	MINUS_ONEZMIN_INTZden_is_zeroZden_is_minus_oneZnum_is_min_intZcould_cause_sigfpeZ
force_zerothen	otherwisebb_thenbb_otherwisedivr3   num_gt_zeroden_gt_zeronot_same_signmod_not_zeroneeds_fixing	fix_valueZresult_otherwiser7   r   )rF   r   np_int_sdiv_implz   s:     
ri   c          	   C   s   t ||d |\}}|jd }|j}| |d}|tj||}	|j}
t	||	z |j}|
||}|tj||}|tj||}|||}|tj||}|||}||||}|||}W d Q R X ||}|||
 ||| |S )Nr   r   )r#   r   rD   get_constantrL   r+   rU   rQ   r   if_unlikelyrR   rS   rT   rN   rV   rW   rX   rY   )r'   r&   r    r   rZ   r[   r   r4   r\   den_not_zerobb_no_ifbb_ifr3   rc   rd   re   rf   rg   rh   Z	final_modr7   r   r   r   np_int_srem_impl   s*    

ro   c          
      s   |\}}|j  t fdd|D s,tdtj d}|tj||}|j|ddB\}}	| |j	}
W d Q R X |	 |
||}|j	}W d Q R X W d Q R X | }|||
 ||| |S )Nc             3   s   | ]}|j  kV  qd S )N)rD   )r   rE   )rF   r   r   r      s    z#np_int_udiv_impl.<locals>.<genexpr>zmust have homogeneous typesr   F)rH   )rD   r   r   r+   rI   rJ   rL   rM   rP   rQ   ZudivrX   rY   )r'   r&   r    r   rZ   r[   r\   Zdiv_by_zeror^   r_   r`   rb   ra   r7   r   )rF   r   np_int_udiv_impl   s    
rp   c          	   C   s   t ||d |\}}|jd }|j}| |d}|tj||}	|j}
t	||	 |j}|
||}W d Q R X ||}|||
 ||| |S )Nr   r   )r#   r   rD   rj   rL   r+   rU   rQ   r   rk   rR   rX   rY   )r'   r&   r    r   rZ   r[   r   r4   r\   rl   rm   rn   r3   r7   r   r   r   np_int_urem_impl   s    

rq   c             C   s   t ||d |j| S )Nr   )r#   fdiv)r'   r&   r    r   r   r   r   np_real_div_impl   s    rs   c             C   s   t ||d |\}}|jd }| |d}|||}|tj||}	|tj||}
|tj||}||	|	|
|}|
|||}|||S )Nr   r   g        )r#   r   rj   fremfcmpr+   ZFCMP_ONEFCMP_OLTrN   rT   rV   fadd)r'   r&   r    r   in1in2r   r\   resZres_ne_zeroZden_lt_zeroZres_lt_zerorg   rh   r   r   r   np_real_mod_impl   s    
r{   c             C   s   t ||d |j| S )Nr   )r#   rt   )r'   r&   r    r   r   r   r   np_real_fmod_impl  s    r|   c             C   s:   t j|jd}|||}|t j||}||||S )Ng        )r+   rI   realrD   fsubru   rv   rV   )r'   r&   r   r\   Zarg_negatedZarg_is_negativer   r   r   _fabs  s    r   c                sp   fdd|D \}}|j }|j}|j }|j}	|jtfdd||||	gD s^td j}
tj d}tj d}t	 |}t	 |	} 
tj||} |\}}|  
tj||} 
t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 W d Q R X |
 S )Nc                s"   g | ]}j  jd  |dqS )r   )value)r<   r   )r   r   )r&   r'   r    r   r   r(     s   z'np_complex_div_impl.<locals>.<listcomp>c                s   g | ]}|j  kqS r   )rD   )r   rE   )ftyper   r   r(   "  s    zmismatched typesg        g      ?)r}   imagrD   r   r   make_helperr   r+   rI   r   ru   FCMP_OGErP   FCMP_OEQrN   rr   fmulrw   r~   	_getvalue)r'   r&   r    r   rx   ry   in1rin1iin2rin2irA   r\   ONEin2r_absin2i_absin2r_abs_ge_in2i_absr^   r_   Zin2r_is_zeroZin2i_is_zeroZin2_is_zeroZinn_thenZinn_otherwiserattmp1tmp2Zscltmp3tmp4tmp5Ztmp6r   )r&   r'   r   r    r   np_complex_div_impl  s\    &,"r   c             C   s.   t ||d tjdtjdi}t| ||||dS )Nr   Znpy_logaddexpfZnpy_logaddexpZ	logaddexp)r#   r	   float32r1   rC   )r'   r&   r    r   dispatch_tabler   r   r   np_real_logaddexp_impl_  s
    

r   c             C   s.   t ||d tjdtjdi}t| ||||dS )Nr   Znpy_logaddexp2fZnpy_logaddexp2Z
logaddexp2)r#   r	   r   r1   rC   )r'   r&   r    r   r   r   r   r   np_real_logaddexp2_implm  s
    

r   c                sf   |\}}|j  t fdd|D s,td|j\}}| |||tj}| |||tj}|||S )Nc             3   s   | ]}|j  kV  qd S )N)rD   )r   rE   )rF   r   r   r     s    z&np_int_truediv_impl.<locals>.<genexpr>zmust have homogeneous types)rD   r   r   r   r%   r	   r1   rr   )r'   r&   r    r   rZ   r[   ZnumtyZdentyr   )rF   r   np_int_truediv_impl|  s    
r   c             C   s.   t | |||}t|j|j}t| |||fS )N)rs   r   	signaturer   np_real_floor_impl)r'   r&   r    r   rz   sr   r   r   np_real_floor_div_impl  s    r   c          
      s  j d j}t||} fdd|D \}}|j}|j}	|j}
|j}|jtfdd||	|
|gD svtdt	j
d} j}||_t |
}t |} t	j||} |\}}|`  ||
} |	|} ||} ||} |
|} ||}t ||f|_W d Q R X |`  |
|} ||} |
|} |	|} ||} ||}t ||f|_W d Q R X W d Q R X | S )Nr   c                s"   g | ]}j  jd  |dqS )r   )r   )r<   r   )r   r   )r&   r'   r    r   r   r(     s   z-np_complex_floor_div_impl.<locals>.<listcomp>c                s   g | ]}|j  kqS r   )rD   )r   rE   )r   r   r   r(     s    zmismatched typesg        )r   underlying_floatr   r   r}   r   rD   r   r   r+   rI   r   r   r   ru   r   rP   rr   r   rw   r   r   )r'   r&   r    r   Z
float_kindZ	floor_sigrx   ry   r   r   r   r   r\   rA   r   r   r   r^   r_   r   r   r   r   r   r   r   )r&   r'   r   r    r   np_complex_floor_div_impl  sD    &&r   c             C   s   t ||d t| |||S )Nr   )r#   r   Zcomplex_power_impl)r'   r&   r    r   r   r   r   np_complex_power_impl  s    r   c             C   s   t ||d |d }|jd }|j}| |d}| |d}| |d}	| |td}
| ||}||_||_tj	t
jf|gd  }|| g}t| |||}t| |||}t| |||}||||}|||	|
}|||||_| S )Nr   r   g        g      ?g      nanr   )r#   r   r   rj   floatr<   r}   r   r   r   r	   booleanr   np_complex_ge_implnp_complex_eq_implnp_complex_lt_implrV   )r'   r&   r    r   opr   float_tyr\   r   r]   ZNANr7   Zcmp_sigZcmp_argsarg1_ge_arg2Zarg1_eq_arg2Zarg1_lt_arg2Zreal_when_geZreal_when_nger   r   r   np_complex_sign_impl  s(    
r   c             C   s   t ||d t|d|S )Nr   z	llvm.rint)r#   r   call_fp_intrinsic)r'   r&   r    r   r   r   r   np_real_rint_impl  s    r   c       	      C   s|   t ||d |jd }|j}| j|||d d}| ||}tj|gd  }t| |||jg|_t| |||jg|_|	 S )Nr   r   )r   r   )
r#   r   r   r<   r   r   r   r}   r   r   )	r'   r&   r    r   r   r   rx   rA   	inner_sigr   r   r   np_complex_rint_impl  s    
r   c             C   s   t ||d t| |||S )Nr   )r#   r   exp_impl)r'   r&   r    r   r   r   r   np_real_exp_impl  s    r   c             C   s   t ||d t| |||S )Nr   )r#   r   r   )r'   r&   r    r   r   r   r   np_complex_exp_impl  s    r   c             C   s.   t ||d tjdtjdi}t| ||||dS )Nr   Z	npy_exp2fZnpy_exp2Zexp2)r#   r	   r   r1   rC   )r'   r&   r    r   r   r   r   r   np_real_exp2_impl  s
    

r   c       	      C   s|   t ||d |jd }|j}| j|||d d}| ||}| |t}|||j|_|||j|_t	| |||
 gS )Nr   r   )r   )r#   r   r   r<   rj   
_NPY_LOGE2r   r}   r   r   r   )	r'   r&   r    r   r   r   rx   tmpZloge2r   r   r   np_complex_exp2_impl$  s    
r   c             C   s   t ||d t| |||S )Nr   )r#   r   log_impl)r'   r&   r    r   r   r   r   np_real_log_impl3  s    r   c             C   s   t ||d t| |||S )Nr   )r#   r   r   )r'   r&   r    r   r   r   r   np_complex_log_impl8  s    r   c             C   s.   t ||d tjdtjdi}t| ||||dS )Nr   Z	npy_log2fZnpy_log2Zlog2)r#   r	   r   r1   rC   )r'   r&   r    r   r   r   r   r   np_real_log2_impl?  s
    

r   c             C   sn   t ||d |jd }|j}t| |||}| j|||d}| |t}|||j|_|||j	|_	|
 S )Nr   r   )r   )r#   r   r   r   r<   rj   
_NPY_LOG2Er   r}   r   r   )r'   r&   r    r   r   r   r   Zlog2er   r   r   np_complex_log2_implJ  s    
r   c             C   s   t ||d t| |||S )Nr   )r#   r   Z
log10_impl)r'   r&   r    r   r   r   r   np_real_log10_implZ  s    r   c             C   sn   t ||d |jd }|j}t| |||}| j|||d}| |t}|||j|_|||j	|_	|
 S )Nr   r   )r   )r#   r   r   r   r<   rj   _NPY_LOG10Er   r}   r   r   )r'   r&   r    r   r   r   r   Zlog10er   r   r   np_complex_log10_impl_  s    
r   c             C   s   t ||d t| |||S )Nr   )r#   r   Z
expm1_impl)r'   r&   r    r   r   r   r   np_real_expm1_implo  s    r   c             C   s   t ||d |jd }|j}tj|gd  }| |d}| j|||d d}t| |||jg}	| ||}
t	| |||j
g}t| |||j
g}||	|}||	||
_
||||
_|
 S )Nr   r   r   g      )r   )r#   r   r   r   r   rj   r<   r   r}   np_real_cos_implr   np_real_sin_implr   rw   r   )r'   r&   r    r   r   r   float_unary_sigr]   rx   arA   Zcos_imagZsin_imagr   r   r   r   np_complex_expm1_impls  s    
r   c             C   s   t ||d t| |||S )Nr   )r#   r   Z
log1p_impl)r'   r&   r    r   r   r   r   np_real_log1p_impl  s    r   c             C   s   t ||d |jd }|j}tj|gd  }tj|gd  }| |d}| j|||d d}	| ||}
||	j|}t	| ||||	j
g}t| |||	j
|g|
_
t| |||g|
_|
 S )Nr   r   r      g      ?)r   )r#   r   r   r   r   rj   r<   rw   r}   np_real_hypot_implr   np_real_atan2_implr   r   )r'   r&   r    r   r   r   r   Zfloat_binary_sigr   rx   rA   Zreal_plus_onelr   r   r   np_complex_log1p_impl  s    
r   c             C   s   t ||d t| |||S )Nr   )r#   r   	sqrt_impl)r'   r&   r    r   r   r   r   np_real_sqrt_impl  s    r   c             C   s   t ||d t| |||S )Nr   )r#   r   r   )r'   r&   r    r   r   r   r   np_complex_sqrt_impl  s    r   c             C   s    t ||d ||d |d S )Nr   r   )r#   mul)r'   r&   r    r   r   r   r   np_int_square_impl  s    r   c             C   s    t ||d ||d |d S )Nr   r   )r#   r   )r'   r&   r    r   r   r   r   np_real_square_impl  s    r   c             C   s:   t ||d tj|jgd  }t| |||d |d gS )Nr   r   r   )r#   r   r   r   r   complex_mul_impl)r'   r&   r    r   
binary_sigr   r   r   np_complex_square_impl  s    
r   c       	      C   sd   t ||d |j}tj|gd  }| ||d |tj}| tjd}|||}| ||tj|S )Nr   r   r   )	r#   r   r   r   r%   r	   r1   rj   rr   )	r'   r&   r    r   r   r   Zin_as_floatr   Zresult_as_floatr   r   r   np_int_reciprocal_impl  s    r   c             C   s*   t ||d | |jd}|||d S )Nr   g      ?r   )r#   rj   r   rr   )r'   r&   r    r   r   r   r   r   np_real_reciprocal_impl  s    r   c          
   C   sf  t ||d |jd }|j}| |d}| |d}| j|||d d}| ||}	|j}
|j}t| ||
}t| ||}|t	j
||}||\}}|V |||
}|||}||
|}|||}|||}||	_||||	_W d Q R X |R ||
|}||
|}|||}|||}||||	_||||	_W d Q R X W d Q R X |	 S )Nr   r   g        g      ?)r   )r#   r   r   rj   r<   r}   r   r   ru   r+   FCMP_OLErP   rr   r   rw   r~   r   )r'   r&   r    r   r   r   r\   r   rx   rA   r   r   Zin1r_absZin1i_absZin1i_abs_le_in1r_absr^   r_   rZtmp0dinv_dZminus_rr   r   r   np_complex_reciprocal_impl  s:    
"r   c             C   s   t ||d t| |||S )Nr   )r#   r   sin_impl)r'   r&   r    r   r   r   r   r     s    r   c             C   s   t ||d t| |||S )Nr   )r#   r   r   )r'   r&   r    r   r   r   r   np_complex_sin_impl  s    r   c             C   s   t ||d t| |||S )Nr   )r#   r   cos_impl)r'   r&   r    r   r   r   r   r     s    r   c             C   s   t ||d t| |||S )Nr   )r#   r   r   )r'   r&   r    r   r   r   r   np_complex_cos_impl  s    r   c             C   s   t ||d t| |||S )Nr   )r#   r   Ztan_impl)r'   r&   r    r   r   r   r   np_real_tan_impl   s    r   c             C   sn  t ||d |jd }|j}tj|gd  }| |d}| |||d }| ||}	|j}
|j}t	| |||
g}t
| |||
g}t| |||g}t| |||g}|||}|||}|||}|||}|||}|||}|||}|||}|||}|||}|||}|||}|||}|||}||||	_||||	_|	 S )Nr   r   r   g      ?)r#   r   r   r   r   rj   r<   r}   r   r   r   np_real_sinh_implnp_real_cosh_implr   rw   rr   r~   r   )r'   r&   r    r   r   r   r   r   xrA   xrxisrZcrZshiZchirsis_rcicsqr_rcsqr_icr   r   rs_rcis_icis_rcrs_icnumrnumir   r   r   np_complex_tan_impl%  s<    
r   c             C   s   t ||d t| |||S )Nr   )r#   r   Z	asin_impl)r'   r&   r    r   r   r   r   np_real_asin_implN  s    r   c          	   C   s   |t jksttj|gd  }| j|||d}| |jd}xht|D ]\}	| |j|	}
t	
| |||| g}|| ||||j|
|_||j|
|_qFW | S )a  this is used to implement approximations using series that are
    quite common in NumPy's source code to improve precision when the
    magnitude of the arguments is small. In funcs.inc.src this is
    implemented by repeated use of the macro "SERIES_HORNER_TERM
    r   )r   g      ?)r	   r;   r   r   r   r<   rj   r   reversedr   r   r   	_setvaluerw   r   r}   r   )r'   r&   r   initialr   Zcoefsr   Zaccumr   ZcoefZconstantr   r   r   r   _complex_expand_seriesS  s    

r   c             C   s  t ||d |jd }|j}| |d}| j|||d d}| ||}t| ||j}	t| ||j}
|t	j
|	|}|t	j
|
|}|||}tj|gd  }||Z\}}| | ||d}| ||d}| ||d}t| |||}t| ||||g}t| |||g}t| ||||d g}t| ||||g}t| |||g}t| ||||g}|t| ||||g W d Q R X |p tjd	d
gtjd	d
dgi}t| |||}| ||d}t| |||||| }|t| |||d |g W d Q R X W d Q R X | S )Nr   r   gMbP?)r   r   y              ?y      ?        y                gUUUUUU?g?g00?)r#   r   r   rj   r<   r   r}   r   ru   r+   FCMP_OGTrO   r   r   rP   get_constant_genericr   r   complex_sub_implr   r   complex_add_implr   r   r	   	complex64
complex128r   r   )r'   r&   r    r   r   r   epsilonr   rA   abs_rabs_iabs_r_gt_epsilonabs_i_gt_epsilonany_gt_epsilonZcomplex_binary_sigr^   r_   Ir   r\   xxZone_minus_xxZsqrt_one_minus_xxZixlog_arglogZilog	coef_dictr   r   r   r   np_complex_asin_implh  s\    





$r  c             C   s   t ||d t| |||S )Nr   )r#   r   Z	acos_impl)r'   r&   r    r   r   r   r   np_real_acos_impl  s    r  c             C   s   t ||d t| |||S )Nr   )r#   r   Z	atan_impl)r'   r&   r    r   r   r   r   np_real_atan_impl  s    r  c             C   s  t ||d |jd }|j}| |d}| j|||d d}| ||}t| ||j}	t| ||j}
|t	j
|	|}|t	j
|
|}|||}tj|gd  }|| \}}| | ||d}| ||d}t| ||||d g}t| ||||d g}t| ||||g}t| |||g}t| ||||g}|| W d Q R X |p tjdd	gtjdd	d
gi}t| |||}| ||d}t| |||||| }|t| |||d |g W d Q R X W d Q R X | S )Nr   r   gMbP?)r   r   y              ?y              ?gUUUUUUտg333333gm۶my      ?        )r#   r   r   rj   r<   r   r}   r   ru   r+   r   rO   r   r   rP   r   r   r   r   r   r   r   r   r	   r   r   r   r   r   )r'   r&   r    r   r   r   r   r   rA   r  r  r  r  r  r   r^   r_   r  ZI2r[   rZ   rb   r	  rz   r
  r  r   r   r   r   r   np_complex_atan_impl  sJ    






$r  c             C   s   t ||d t| |||S )Nr   )r#   r   Zatan2_float_impl)r'   r&   r    r   r   r   r   r     s    r   c             C   s   t ||d t| |||S )Nr   )r#   r   Zhypot_float_impl)r'   r&   r    r   r   r   r   r     s    r   c             C   s   t ||d t| |||S )Nr   )r#   r   Z	sinh_impl)r'   r&   r    r   r   r   r   r     s    r   c             C   s   t ||d |jd }|j}tj|gd  }| |||d }| ||}|j}	|j}
t| |||
g}t	| |||	g}t
| |||
g}t| |||	g}||||_||||_| S )Nr   r   r   )r#   r   r   r   r   r<   r}   r   r   r   r   r   r   r   )r'   r&   r    r   r   ftyfsig1r   rA   r   r   sxishxrcxichxrr   r   r   np_complex_sinh_impl  s    
r  c             C   s   t ||d t| |||S )Nr   )r#   r   Z	cosh_impl)r'   r&   r    r   r   r   r   r      s    r   c             C   s   t ||d |jd }|j}tj|gd  }| |||d }| ||}|j}	|j}
t| |||
g}t	| |||	g}t
| |||
g}t| |||	g}||||_||||_| S )Nr   r   r   )r#   r   r   r   r   r<   r}   r   r   r   r   r   r   r   )r'   r&   r    r   r   r  r  r   rA   r   r   r  r  r  r  r   r   r   np_complex_cosh_impl%  s    
r  c             C   s   t ||d t| |||S )Nr   )r#   r   Z	tanh_impl)r'   r&   r    r   r   r   r   np_real_tanh_impl@  s    r  c             C   sn  t ||d |jd }|j}tj|gd  }| |d}| |||d }| ||}	|j}
|j}t	| |||g}t
| |||g}t| |||
g}t| |||
g}|||}|||}|||}|||}|||}|||}|||}|||}|||}|||}|||}|||}|||}|||}||||	_||||	_|	 S )Nr   r   r   g      ?)r#   r   r   r   r   rj   r<   r}   r   r   r   r   r   r   rw   rr   r~   r   )r'   r&   r    r   r   r  r  r   r   rA   r   r   ZsiZciZshrZchr_r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   np_complex_tanh_implE  s<    
r  c             C   s   t ||d t| |||S )Nr   )r#   r   Z
asinh_impl)r'   r&   r    r   r   r   r   np_real_asinh_impln  s    r  c             C   s  t ||d |jd }|j}| |d}| j|||d d}| ||}t| ||j}	t| ||j}
|t	j
|	|}|t	j
|
|}|||}tj|gd  }||\}}|x | ||d}t| |||}t| ||||g}t| |||g}t| ||||d g}t| |||g}|| W d Q R X |p tjddgtjddd	gi}t| |||}| ||d}t| |||||| }|t| |||d |g W d Q R X W d Q R X | S )
Nr   r   gMbP?)r   r   y      ?        gUUUUUUſgܿg00)r#   r   r   rj   r<   r   r}   r   ru   r+   r   rO   r   r   rP   r   r   r   r   r   r   r   r	   r   r   r   r   r   )r'   r&   r    r   r   r   r   r   rA   r  r  r  r  r  r   r^   r_   r   r  Zone_plus_xxZsqrt_resr  rz   r
  r   r   r   r   np_complex_asinh_impls  sF    

$r  c             C   s   t ||d t| |||S )Nr   )r#   r   Z
acosh_impl)r'   r&   r    r   r   r   r   np_real_acosh_impl  s    r  c             C   s   t ||d |jd }tj|gd  }| ||d}|d }t| ||||g}t| ||||g}	t| |||g}
t| |||	g}t	| |||
|g}t| ||||g}t
| |||gS )Nr   r   r   y      ?        )r#   r   r   r   r   r   r   r   r   r   r   )r'   r&   r    r   r   Zcsig2r   r   Z
x_plus_oneZx_minus_oneZsqrt_x_plus_oneZsqrt_x_minus_oneZ	prod_sqrtr  r   r   r   np_complex_acosh_impl  s"    

r  c             C   s   t ||d t| |||S )Nr   )r#   r   Z
atanh_impl)r'   r&   r    r   r   r   r   np_real_atanh_impl  s    r  c             C   s  t ||d |jd }|j}| |d}| j|||d d}| ||}t| ||j}	t| ||j}
|t	j
|	|}|t	j
|
|}|||}tj|gd  }|| \}}| | ||d}| ||d}t| ||||d g}t| ||||d g}t| ||||g}t| |||g}t| ||||g}|| W d Q R X |p tjdd	gtjdd	d
gi}t| |||}| ||d}t| |||||| }|t| |||d |g W d Q R X W d Q R X | S )Nr   r   gMbP?)r   r   y      ?        y      ?        gUUUUUU?g333333?gm۶m?)r#   r   r   rj   r<   r   r}   r   ru   r+   r   rO   r   r   rP   r   r   r   r   r   r   r   r   r	   r   r   r   r   r   )r'   r&   r    r   r   r   r   r   rA   r  r  r  r  r  r   r^   r_   r   ZHALFr[   rZ   rb   r	  rz   r
  r  r   r   r   r   np_complex_atanh_impl  sJ    






$r  c             C   s   t ||d t|d|S )Nr   z
llvm.floor)r#   r   r   )r'   r&   r    r   r   r   r   r     s    r   c             C   s   t ||d t|d|S )Nr   z	llvm.ceil)r#   r   r   )r'   r&   r    r   r   r   r   np_real_ceil_impl  s    r  c             C   s   t ||d t|d|S )Nr   z
llvm.trunc)r#   r   r   )r'   r&   r    r   r   r   r   np_real_trunc_impl  s    r   c             C   s   t ||d t|d|S )Nr   z	llvm.fabs)r#   r   r   )r'   r&   r    r   r   r   r   np_real_fabs_impl&  s    r!  c                s   t ||dtjd |jd  fdd|D \}}|j}|j}|j}|j}	 tj||}
 tj	||	} tj
||} tj||	} |
|} ||} ||S )Nr   )r   r   c                s   g | ]}j  |d qS ))r   )r<   )r   r   )r&   r'   r   r   r   r(   7  s    z&np_complex_ge_impl.<locals>.<listcomp>)r#   r	   r   r   r}   r   ru   r+   r   FCMP_ORDr   r   rN   rO   )r'   r&   r    r   rx   ry   r   r   yryixr_gt_yrno_nan_xi_yixr_eq_yrZxi_ge_yi
first_termsecond_termr   )r&   r'   r   r   r   1  s    
r   c                s   t ||dtjd |jd  fdd|D \}}|j}|j}|j}|j}	 tj||}
 tj	||	} tj
||} tj||	} |
|} ||} ||S )Nr   )r   r   c                s   g | ]}j  |d qS ))r   )r<   )r   r   )r&   r'   r   r   r   r(   L  s    z&np_complex_le_impl.<locals>.<listcomp>)r#   r	   r   r   r}   r   ru   r+   rv   r"  r   r   rN   rO   )r'   r&   r    r   rx   ry   r   r   r#  r$  xr_lt_yrr&  r'  Zxi_le_yir(  r)  r   )r&   r'   r   r   np_complex_le_implF  s    
r+  c                s   t ||dtjd |jd  fdd|D \}}|j}|j}|j}|j}	 tj||}
 tj	||	} tj
||} tj||	} |
|} ||} ||S )Nr   )r   r   c                s   g | ]}j  |d qS ))r   )r<   )r   r   )r&   r'   r   r   r   r(   a  s    z&np_complex_gt_impl.<locals>.<listcomp>)r#   r	   r   r   r}   r   ru   r+   r   r"  r   rN   rO   )r'   r&   r    r   rx   ry   r   r   r#  r$  r%  r&  r'  Zxi_gt_yir(  r)  r   )r&   r'   r   r   np_complex_gt_impl[  s    
r,  c                s   t ||dtjd |jd  fdd|D \}}|j}|j}|j}|j}	 tj||}
 tj	||	} tj
||} tj||	} |
|} ||} ||S )Nr   )r   r   c                s   g | ]}j  |d qS ))r   )r<   )r   r   )r&   r'   r   r   r   r(   v  s    z&np_complex_lt_impl.<locals>.<listcomp>)r#   r	   r   r   r}   r   ru   r+   rv   r"  r   rN   rO   )r'   r&   r    r   rx   ry   r   r   r#  r$  r*  r&  r'  Zxi_lt_yir(  r)  r   )r&   r'   r   r   r   p  s    
r   c                sz   t ||dtjd |jd  fdd|D \}}|j}|j}|j}|j}	 tj||}
 tj||	} 	|
|S )Nr   )r   r   c                s   g | ]}j  |d qS ))r   )r<   )r   r   )r&   r'   r   r   r   r(     s    z&np_complex_eq_impl.<locals>.<listcomp>)
r#   r	   r   r   r}   r   ru   r+   r   rN   )r'   r&   r    r   rx   ry   r   r   r#  r$  r'  Zxi_eq_yir   )r&   r'   r   r   r     s    
r   c                sz   t ||dtjd |jd  fdd|D \}}|j}|j}|j}|j}	 tj||}
 tj||	} 	|
|S )Nr   )r   r   c                s   g | ]}j  |d qS ))r   )r<   )r   r   )r&   r'   r   r   r   r(     s    z&np_complex_ne_impl.<locals>.<listcomp>)
r#   r	   r   r   r}   r   ru   r+   ZFCMP_UNErO   )r'   r&   r    r   rx   ry   r   r   r#  r$  Zxr_ne_yrZxi_ne_yir   )r&   r'   r   r   np_complex_ne_impl  s    
r-  c             C   s8   | j |||d}t||j}t||j}|||S )N)r   )r<   r   is_truer}   r   rO   )r'   r&   r   valcomplex_valZre_trueZim_truer   r   r   _complex_is_true  s    r1  c             C   s>   t ||dtjd t||d }t||d }|||S )Nr   )r   r   r   )r#   r	   r   r   r.  rN   )r'   r&   r    r   r   br   r   r   np_logical_and_impl  s    r3  c             C   sN   t ||dtjd t| ||jd |d }t| ||jd |d }|||S )Nr   )r   r   r   )r#   r	   r   r1  r   rN   )r'   r&   r    r   r   r2  r   r   r   np_complex_logical_and_impl  s    r4  c             C   s>   t ||dtjd t||d }t||d }|||S )Nr   )r   r   r   )r#   r	   r   r   r.  rO   )r'   r&   r    r   r   r2  r   r   r   np_logical_or_impl  s    r5  c             C   sN   t ||dtjd t| ||jd |d }t| ||jd |d }|||S )Nr   )r   r   r   )r#   r	   r   r1  r   rO   )r'   r&   r    r   r   r2  r   r   r   np_complex_logical_or_impl  s    r6  c             C   s>   t ||dtjd t||d }t||d }|||S )Nr   )r   r   r   )r#   r	   r   r   r.  rT   )r'   r&   r    r   r   r2  r   r   r   np_logical_xor_impl  s    r7  c             C   sN   t ||dtjd t| ||jd |d }t| ||jd |d }|||S )Nr   )r   r   r   )r#   r	   r   r1  r   rT   )r'   r&   r    r   r   r2  r   r   r   np_complex_logical_xor_impl  s    r8  c             C   s"   t ||dtjd t||d S )Nr   )r   r   )r#   r	   r   r   Zis_false)r'   r&   r    r   r   r   r   np_logical_not_impl  s    r9  c             C   s4   t ||dtjd t| ||jd |d }||S )Nr   )r   r   )r#   r	   r   r1  r   not_)r'   r&   r    r   r   r   r   r   np_complex_logical_not_impl  s    r;  c             C   s2   t ||d |\}}|tj||}||||S )Nr   )r#   rL   r+   ZICMP_SGErV   )r'   r&   r    r   arg1arg2Zarg1_sge_arg2r   r   r   np_int_smax_impl  s    r>  c             C   s2   t ||d |\}}|tj||}||||S )Nr   )r#   rL   r+   ZICMP_UGErV   )r'   r&   r    r   r<  r=  Zarg1_uge_arg2r   r   r   np_int_umax_impl  s    r?  c             C   sn   t ||d |\}}|tj||}|tj||}||||}|tj||}	||	||}
||||
S )Nr   )r#   ru   r+   FCMP_UNOrV   r   )r'   r&   r    r   r<  r=  arg1_nanany_nan
nan_resultr   non_nan_resultr   r   r   np_real_maximum_impl   s    rE  c             C   sn   t ||d |\}}|tj||}|tj||}||||}|tj||}	||	||}
||||
S )Nr   )r#   ru   r+   r@  rV   r   )r'   r&   r    r   r<  r=  arg2_nanrB  rC  r   rD  r   r   r   np_real_fmax_impl  s    rG  c             C   s   t ||d |jd }ttj|}tjtjf|gd  }|\}}t| |||g}	t| |||g}
||	|
}||	||}t	| |||}||||}||||S )Nr   r   )
r#   r   r   r   r	   r   np_complex_isnan_implrO   rV   r   )r'   r&   r    r   r   bc_sigbcc_sigr<  r=  rA  rF  rB  rC  r   rD  r   r   r   np_complex_maximum_impl  s    
rK  c             C   s   t ||d |jd }ttj|}tjtjf|gd  }|\}}t| |||g}	t| |||g}
||	|
}||
||}t	| |||}||||}||||S )Nr   r   )
r#   r   r   r   r	   r   rH  rO   rV   r   )r'   r&   r    r   r   rI  rJ  r<  r=  rA  rF  rB  rC  r   rD  r   r   r   np_complex_fmax_impl4  s    
rL  c             C   s2   t ||d |\}}|tj||}||||S )Nr   )r#   rL   r+   ZICMP_SLErV   )r'   r&   r    r   r<  r=  Zarg1_sle_arg2r   r   r   np_int_smin_implI  s    rM  c             C   s2   t ||d |\}}|tj||}||||S )Nr   )r#   rL   r+   ZICMP_ULErV   )r'   r&   r    r   r<  r=  Zarg1_ule_arg2r   r   r   np_int_umin_implP  s    rN  c             C   sn   t ||d |\}}|tj||}|tj||}||||}|tj||}	||	||}
||||
S )Nr   )r#   ru   r+   r@  rV   r   )r'   r&   r    r   r<  r=  rA  rB  rC  arg1_le_arg2rD  r   r   r   np_real_minimum_implW  s    rP  c             C   sn   t ||d |\}}|tj||}|tj||}||||}|tj||}	||	||}
||||
S )Nr   )r#   ru   r+   r@  rV   r   )r'   r&   r    r   r<  r=  rA  rB  rC  rO  rD  r   r   r   np_real_fmin_implf  s    rQ  c             C   s   t ||d |jd }ttj|}tjtjf|gd  }|\}}t| |||g}	t| |||g}
||	|
}||	||}t	| |||}||||}||||S )Nr   r   )
r#   r   r   r   r	   r   rH  rO   rV   r+  )r'   r&   r    r   r   rI  rJ  r<  r=  rA  rF  rB  rC  rO  rD  r   r   r   np_complex_minimum_implu  s    
rR  c             C   s   t ||d |jd }ttj|}tjtjf|gd  }|\}}t| |||g}	t| |||g}
||	|
}||
||}t	| |||}||||}||||S )Nr   r   )
r#   r   r   r   r	   r   rH  rO   rV   r+  )r'   r&   r    r   r   rI  rJ  r<  r=  rA  rF  rB  rC  rO  rD  r   r   r   np_complex_fmin_impl  s    
rS  c             C   s"   t ||dtjd t||d S )Nr   )r   r   )r#   r	   r   r   is_nan)r'   r&   r    r   r   r   r   np_real_isnan_impl  s    rU  c             C   s<   t ||dtjd |\}|j\}| j|||d}t||S )Nr   )r   )r   )r#   r	   r   r   r<   r   rT  )r'   r&   r    r   r   r   r0  r   r   r   rH    s
    rH  c             C   s"   t ||dtjd t||d S )Nr   )r   r   )r#   r	   r   r   	is_finite)r'   r&   r    r   r   r   r   np_real_isfinite_impl  s    rW  c             C   s<   t ||dtjd |\}|j\}| j|||d}t||S )Nr   )r   )r   )r#   r	   r   r   r<   r   rV  )r'   r&   r    r   r   r   r0  r   r   r   np_complex_isfinite_impl  s
    rX  c             C   s"   t ||dtjd t||d S )Nr   )r   r   )r#   r	   r   r   is_inf)r'   r&   r    r   r   r   r   np_real_isinf_impl  s    rZ  c             C   s<   t ||dtjd |\}|j\}| j|||d}t||S )Nr   )r   )r   )r#   r	   r   r   r<   r   rY  )r'   r&   r    r   r   r   r0  r   r   r   np_complex_isinf_impl  s
    r[  c             C   s`   t ||dtjd tjdtjdi}tjtjf|j }t	| ||||d}|
d||d}|S )Nr   )r   Znumba_signbitfZnumba_signbitZsignbitz!=r   )r#   r	   r   r   r1   r   r   intcr   rC   Zicmp_unsignedrD   )r'   r&   r    r   r   r   Zint_resZbool_resr   r   r   np_real_signbit_impl  s    

r]  c             C   s   t ||d t| |||S )Nr   )r#   r   Zcopysign_float_impl)r'   r&   r    r   r   r   r   np_real_copysign_impl  s    r^  c             C   s.   t ||d tjdtjdi}t| ||||dS )Nr   Znpy_nextafterfZnpy_nextafterZ	nextafter)r#   r	   r   r1   rC   )r'   r&   r    r   r   r   r   r   np_real_nextafter_impl  s
    

r_  c             C   s.   t ||d tjdtjdi}t| ||||dS )Nr   Znpy_spacingfZnpy_spacingZspacing)r#   r	   r   r1   rC   )r'   r&   r    r   r   r   r   r   np_real_spacing_impl  s
    

r`  c       	      C   sH   |\}}|j \}}| |||tj}t||tj}t| ||||fS )N)r   r%   r	   r\  r   r   r   Z
ldexp_impl)	r'   r&   r    r   Zx1Zx2Zty1Zty2Zf_fi_sigr   r   r   np_real_ldexp_impl  s
    
ra  )N)__doc__Z
__future__r   r   r   ZmathZllvmlite.llvmpyr   r+    r   r   r	   r
   r   r   r   r   r   r   r   r#   r1   r8   rC   ri   ro   rp   rq   Znp_int_fmod_implrs   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   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   r  r   r  r  r  r  r  r  r  r  r  r   r  r   r!  r   r+  r,  r   r   r-  r1  r3  r4  r5  r6  r7  r8  r9  r;  r>  r?  rE  rG  rK  rL  rM  rN  rP  rQ  rR  rS  rU  rH  rW  rX  rZ  r[  r]  r^  r_  r`  ra  r   r   r   r   <module>   s   
>$M6	 
*)A9)6:				