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	 ddl
mZ ddlZddlmZ ddlm  mZ ddlmZ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  ddlm!Z" ddl#m$Z$m%Z%m&Z&m'Z' ddl(m)Z) ddl*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0 ddlm1Z1 ddl2m3Z3m4Z4 dd Z5e5 Z6e1dd Z7e1dd Z8e$ej9ej:e$dej:dd Z;edd Z<e$ej9ej:ej=e$ej9ej:ej>e$dej:ej=e$dej:ej>dd  Z?e$ej@ej:e$d!ej:d"d# ZAe$ejBej:e$d$ej:d%d& ZCe$ejDej:e$d'ej:d(d) ZEe$ejFej:e$d*ej:d+d, ZGe$ejHej:e$d-ej:d.d/ ZIe$ejJej:e$d0ej:d1d2 ZKd3d4 ZLe$ejMej:e$d5ej:d6d7 ZNe$ejOej:e$d8ej:d9d: ZPe$ejQej:e$d;ej:d<d= ZRe$ejSej:e$d>ej:d?d@ ZTeejUeej:dAdBdC ZVeejWeej:dDdEdF ZXdGdH ZYedIdJ ZZedKdL Z[edMdN Z\dOdP Z]ee]eZdQdRZ^ee]e[dQdRZ_ee]eZdSdRZ`ee]e[dSdRZaeejbdTdU ZceejddVdW Zee"dXkr2eejfdYdZ Zgeejhd[d\ Zieejjd]d^ Zkeejld_d` Zme"dakr`eejndbdc Zoe"ddkreejpdedf Zqeejrdgdh Zsedidj Ztdkdl Zueeue[ZveeueZZwedmdn Zxeejydodp Zzedqdr Z{dsdt Z|ee|eZZ}ee|e{Z~dudv Zeee}Zeee~Zedwdx Zedydz Zeejd{d| Zed}d~ Zedd ZedTddZdd Ze"dakreejdd Ze"dkreejdd Ze"dkreejdd Zedd Zedd Zeejdd Zedd ZeejdUddZedd ZedVddZeejdWddZedXddZeejdYddZdd Zeedd Zdd Ze"ddkreejdZddZdd Zeedd Zdd Zeedd Zeejd[ddZedd Zedd Zeejd\ddZeejdd ZdZedd Zedd Zedd ZeddĄ ZeddƄ Ze"dakreejddȄ Zeddʄ Zedd̄ Zdd΄ ZeeddЄ Zedd҄ ZeddԄ Zddք Zdd؄ Zeddڄ ZeddԄ Zedd݄ Zdd߄ Zedd Zedd Ze"dakrjeejŃd]ddZeejǃd^ddZedd Zedd Zedd Zedd Zedd ZeddԄ Zdd Zeeσdd Zeejуd_ddZdd Zdd Ze$ejejփdd Ze$ejej؃dd Ze$ejejكd d Ze$ejejej؃e$ejejej؃dd Ze$ejejej؃dd Ze$ejej:ejej:dd Ze$ejej:dd	 Ze$ejejd
d Ze$ejeje$ejejejdd Ze$ejej:e$ejej:ejdd Ze$ejej:e$dej:e$ejej:dd Zdd Zedd Zedd Zedd Zdd ZeeedZeeedZeeedZe$ejejejejdd Zeejd d! Zeejd"d# Zeejd`d$d%Zd&d' Zeejdad(d)Zd*d+ ZeZZed,dԄ ZeeeZeeeZ eejdbd.d/Zeejdcd0d1ZeZeejddd3d4Zd5Zed6eZ	d7Z
e"ddkr:d8e
 Z
ed9e
Zd:Ze"ddkrjed8 Zed;eZeej	d<d= Zd>d? Zeejee
 eejee d@dA ZdBdC ZdDdE ZG dFdG dGe	ZeedHdI ZeejdJdK ZeejdLdM ZdNdO ZeejdedPdQZeejdRdS ZdS (f  z5
Implementation of math operations on Array objects.
    )print_functionabsolute_importdivisionN)
namedtuple)IntEnum)partial)ir)ConstantType)typescgutilstypinggenerated_jit)overloadoverload_methodregister_jitable)as_dtype)version)lower_builtinimpl_ret_borrowedimpl_ret_new_refimpl_ret_untracked)	signature   )
make_array	load_item
store_item_empty_nd_impl)ensure_blas)	intrinsic)RequireLiteralValueTypingErrorc               C   s$   y
t   W n tk
r   dS X dS )NFT)r   ImportError r#   r#   6lib/python3.7/site-packages/numba/targets/arraymath.py_check_blas   s
    
r%   c                s<   t |d  ttj |} fdd}||fS )a  
    This routine converts shape list where the axis dimension has already
    been popped to a tuple for indexing of the same size.  The original shape
    tuple is also required because it contains a length field at compile time
    whereas the shape list does not.
    r   c          	      st   |  }t|}|\}}dd }xJt D ]>}	| tj|	}
| ||ttj||
g}||||	}q.W |S )Nc             S   s   | | S )Nr#   )air#   r#   r$   array_indexerB   s    zB_create_tuple_result_shape.<locals>.codegen.<locals>.array_indexer)	get_value_typer   get_null_valuerangeget_constantr   intpcompile_internalinsert_value)cgctxbuilderr   argslltuptytupZin_shape_r(   r'   Zdataidxdata)nd
shape_listtuptyr#   r$   codegen:   s    


z+_create_tuple_result_shape.<locals>.codegen)lenr   UniTupler-   )tyctxr8   shape_tuplefunction_sigr:   r#   )r7   r8   r9   r$   _create_tuple_result_shape)   s
    
r@   c       	         s   t |tjstd|j t| kr.d  }| d }tjg| tjg tjg|  }t||||} fdd}||fS )aH  
    Generates a tuple that can be used to index a specific slice from an
    array for sum with axis.  shape_tuple is the size of the dimensions of
    the input array.  'value' is the value to put in the indexing tuple
    in the axis dimension and 'axis' is that dimension.  For this to work,
    axis has to be a const.
    z axis argument must be a constantr   r   c                s   |  }t|}|\}}}dd }| ||t g }	x td D ]}
|||	|
}qFW ||| }x$t d D ]}
|||	|
}qzW |S )Nc               S   s
   t d d S )N)slicer#   r#   r#   r$   create_full_slice   s    z<_gen_index_tuple.<locals>.codegen.<locals>.create_full_slicer   r   )r)   r   r*   r.   r   slice2_typer+   r/   )r0   r1   r   r2   r3   r4   r5   Z	value_argrB   Z
slice_datar'   )
axis_valuer7   r9   r#   r$   r:   v   s    


z!_gen_index_tuple.<locals>.codegen)	
isinstancer   Literalr    literal_valuer;   rC   r-   Tuple)	r=   r>   valueaxisZbeforeZafterZ
types_listr?   r:   r#   )rD   r7   r9   r$   _gen_index_tupleQ   s    	
rK   z	array.sumc                sB   | d  fdd}| j||||t|j dd}t| ||j |S )Nr   c                s(    }xt | D ]}|| 7 }qW |S )N)npnditeritem)arrcv)zeror#   r$   array_sum_impl   s    z!array_sum.<locals>.array_sum_impl)rP   )locals)return_typer.   dictr   )contextr1   sigr2   rS   resr#   )rR   r$   	array_sum   s
    
rZ   c             C   s   | S )Nr#   )rO   rQ   r#   r#   r$   _array_sum_axis_nop   s    r[   c       
         s   |j }t|d|dt|dddkr.tjnt|j\}}dd t|tjr|j	  dk rh|j
    dk sz |j
krtd| j }| | }|d |f}|j||gd}d fd	d
}| ||||}	t| ||j |	S )aJ  
    The third parameter to gen_index_tuple that generates the indexing
    tuples has to be a const so we can't just pass "axis" through since
    that isn't const.  We can check for specific values and have
    different instances that do take consts.  Supporting axis summation
    only up to the fourth dimension for now.
    dtyper   ndimNFz'axis' entry is out of bounds)r2   Tc                s8  | j }s"|dk s|dkr"td||kr2tdt| j}|| }|| t|| j}t|t}xt	|D ]}rt
| j| }|| | 7 }qv|dkrt
| j|d}	|| |	 7 }qv|dkrt
| j|d}
|| |
 7 }qv|dkrt
| j|d}|| | 7 }qv|dkrvt
| j|d}|| | 7 }qvW |dS )Nr      zHNumba does not support sum with axis parameter outside the range 0 to 3.zaxis is out of bounds for arrayr      )r]   
ValueErrorlistshapepopr@   rL   fulltyper+   rK   )rO   rJ   r]   ZashapeZaxis_lenZashape_without_axisresultZ
axis_indexZindex_tuple_genericZindex_tuple1Zindex_tuple2Zindex_tuple3Zindex_tuple4)const_axis_valis_axis_constoprR   r#   r$   array_sum_impl_axis   s:    


z+array_sum_axis.<locals>.array_sum_impl_axis)rU   getattrrL   taker[   r2   rE   r   rF   rG   r]   r`   Ztyping_contextZresolve_value_typer,   replacer.   r   )
rW   r1   rX   r2   rettyZty_arrayZty_axisZaxis_valrj   rY   r#   )rg   rh   ri   rR   r$   array_sum_axis   s,    

3ro   z
array.prodc             C   s4   dd }| j ||||t|jdd}t| ||j|S )Nc             S   s(   d}xt | D ]}|| 9 }qW |S )Nr   )rL   rM   rN   )rO   rP   rQ   r#   r#   r$   array_prod_impl  s    z#array_prod.<locals>.array_prod_impl)rP   )rT   )r.   rV   rU   r   )rW   r1   rX   r2   rp   rY   r#   r#   r$   
array_prod  s    rq   zarray.cumsumc                sP   |j j}t| |d fdd}| j||||t|dd}t| ||j |S )Nr   c                s>   t | j }}x&t| jD ]\}}||7 }|||< qW |S )N)rL   emptysize	enumerateflat)rO   outrP   idxrQ   )r\   rR   r#   r$   array_cumsum_impl$  s    z'array_cumsum.<locals>.array_cumsum_impl)rP   )rT   )rU   r\   r   r.   rV   r   )rW   r1   rX   r2   scalar_dtyperx   rY   r#   )r\   rR   r$   array_cumsum  s    rz   zarray.cumprodc                sF   |j j}t|  fdd}| j||||t|dd}t| ||j |S )Nc                s>   t | j }d}x&t| jD ]\}}||9 }|||< qW |S )Nr   )rL   rr   rs   rt   ru   )rO   rv   rP   rw   rQ   )r\   r#   r$   array_cumprod_impl6  s    z)array_cumprod.<locals>.array_cumprod_impl)rP   )rT   )rU   r\   r   r.   rV   r   )rW   r1   rX   r2   ry   r{   rY   r#   )r\   r$   array_cumprod0  s    r|   z
array.meanc                sB   | d  fdd}| j||||t|j dd}t| ||j |S )Nr   c                s.    }xt | D ]}|| 7 }qW || j S )N)rL   rM   rN   rs   )rO   rP   rQ   )rR   r#   r$   array_mean_implG  s    z#array_mean.<locals>.array_mean_impl)rP   )rT   )rU   r.   rV   r   )rW   r1   rX   r2   r}   rY   r#   )rR   r$   
array_meanB  s
    
r~   z	array.varc             C   s(   dd }|  ||||}t| ||j|S )Nc             S   sN   |   }d}x6t| D ](}| | }|t|t| 7 }qW || j S )Nr   )meanrL   rM   rN   realconjrs   )rO   mssdrQ   valr#   r#   r$   array_var_implV  s    z!array_var.<locals>.array_var_impl)r.   r   rU   )rW   r1   rX   r2   r   rY   r#   r#   r$   	array_varS  s    r   z	array.stdc             C   s(   dd }|  ||||}t| ||j|S )Nc             S   s   |   d S )Ng      ?)var)arryr#   r#   r$   array_std_implh  s    z!array_std.<locals>.array_std_impl)r.   r   rU   )rW   r1   rX   r2   r   rY   r#   r#   r$   	array_stde  s    r   c             C   s   d | }|S )Nz@zero-size array to reduction operation {0} which has no identity)format)Zfn_namemsgr#   r#   r$   zero_dim_msgn  s    r   z	array.minc                s   |j d j}td t|tjtjfr>|d fdd}n&t|tjrX fdd}n fdd}| ||||}t	| ||j
|S )Nr   ZminimumNaTc                sr   | j dkrt }t| }x"|D ]}| }|kr&|}P q&W x(|D ] }| }|krJ||k rJ|}qJW |S )Nr   )rs   r`   rL   rM   rN   )r   	min_valueitviewrQ   )MSGnatr#   r$   array_min_impl  s    



z!array_min.<locals>.array_min_implc                sr   | j dkrt t| }t|d}xB|D ]:}| }|j|jk rN|}q0|j|jkr0|j|jk r0|}q0W |S )Nr   )	rs   r`   rL   rM   nextrl   rN   r   imag)r   r   r   r   rQ   )r   r#   r$   r     s    


c                sP   | j dkrt t| }t|d}x |D ]}| }||k r0|}q0W |S )Nr   )rs   r`   rL   rM   r   rl   rN   )r   r   r   r   rQ   )r   r#   r$   r     s    


)r2   r\   r   rE   r   
NPDatetimeNPTimedeltaComplexr.   r   rU   )rW   r1   rX   r2   tyr   rY   r#   )r   r   r$   	array_mint  s    r   z	array.maxc                sZ   |j d j}td t|tjr. fdd}n fdd}| ||||}t| ||j|S )Nr   Zmaximumc                sr   | j dkrt t| }t|d}xB|D ]:}| }|j|jkrN|}q0|j|jkr0|j|jkr0|}q0W |S )Nr   )	rs   r`   rL   rM   r   rl   rN   r   r   )r   r   	max_valuer   rQ   )r   r#   r$   array_max_impl  s    


z!array_max.<locals>.array_max_implc                sP   | j dkrt t| }t|d}x |D ]}| }||kr0|}q0W |S )Nr   )rs   r`   rL   rM   r   rl   rN   )r   r   r   r   rQ   )r   r#   r$   r     s    


)	r2   r\   r   rE   r   r   r.   r   rU   )rW   r1   rX   r2   r   r   rY   r#   )r   r$   	array_max  s    r   zarray.argminc                sd   |j d j}tdkr<t|tjtjfr<|d  fdd}ndd }| ||||}t| ||j	|S )Nr   )r   
   r   c                s   | j dkrtd }d}| j}d}x.|D ]&}| krH|}|}|d7 }P |d7 }q*W x,|D ]$}| krv||k rv|}|}|d7 }qZW |S )Nr   z*attempt to get argmin of an empty sequencer   )rs   r`   ru   )r   r   min_idxr   rw   rQ   )r   r#   r$   array_argmin_impl  s&    


z'array_argmin.<locals>.array_argmin_implc             S   s\   | j dkrtdx| jD ]}|}d}P qW d}x&| jD ]}||k rL|}|}|d7 }q8W |S )Nr   z*attempt to get argmin of an empty sequencer   )rs   r`   ru   )r   rQ   r   r   rw   r#   r#   r$   r      s    
)
r2   r\   numpy_versionrE   r   r   r   r.   r   rU   )rW   r1   rX   r2   r   r   rY   r#   )r   r$   array_argmin  s    r   zarray.argmaxc             C   s(   dd }|  ||||}t| ||j|S )Nc             S   s\   | j dkrtdx| jD ]}|}d}P qW d}x&| jD ]}||krL|}|}|d7 }q8W |S )Nr   z*attempt to get argmax of an empty sequencer   )rs   r`   ru   )r   rQ   r   Zmax_idxrw   r#   r#   r$   array_argmax_impl  s    
z'array_argmax.<locals>.array_argmax_impl)r.   r   rU   )rW   r1   rX   r2   r   rY   r#   r#   r$   array_argmax  s    r   allc             C   s   dd }|S )Nc             S   s$   xt | D ]}| sdS qW dS )NFT)rL   rM   rN   )r&   rQ   r#   r#   r$   flat_all,  s    znp_all.<locals>.flat_allr#   )r&   r   r#   r#   r$   np_all)  s    r   anyc             C   s   dd }|S )Nc             S   s$   xt | D ]}| rdS qW dS )NTF)rL   rM   rN   )r&   rQ   r#   r#   r$   flat_any7  s    znp_any.<locals>.flat_anyr#   )r&   r   r#   r#   r$   np_any4  s    r   c             C   s,   t | tjtjfrtjS tdd }|S dS )z$
    A generic isnan() function
    c             S   s   dS )NFr#   )xr#   r#   r$   _trivial_isnanG  s    z!get_isnan.<locals>._trivial_isnanN)rE   r   Floatr   rL   isnanr   )r\   r   r#   r#   r$   	get_isnan@  s    r   c             C   s   | |k S )Nr#   )r&   br#   r#   r$   	less_thanL  s    r   c             C   s   | |kS )Nr#   )r&   r   r#   r#   r$   greater_thanP  s    r   c             C   s   | j dkrtdd S )Nr   z3zero-size array to reduction operation not possible)rs   r`   )r&   r#   r#   r$   check_arrayT  s    
r   c                s"   |r fdd}n fdd}|S )Nc                s   t | }t| t |}t|d}xd|D ]\}| }t |jrZt |jsZ|}q0 |j|jrn|}q0|j|jkr0 |j	|j	r0|}q0W |S )Nr   )
rL   asarrayr   rM   r   rl   rN   r   r   r   )r&   rO   r   
return_valr   rQ   )comparison_opr#   r$   impl\  s    


z!nan_min_max_factory.<locals>.implc                s\   t | }t| t |}t|d}x,|D ]$}| }t |s0 ||s0|}q0W |S )Nr   )rL   r   r   rM   r   rl   rN   r   )r&   rO   r   r   r   rQ   )r   r#   r$   r   m  s    




r#   )r   is_complex_dtyper   r#   )r   r$   nan_min_max_factoryY  s    r   F)r   Tc             C   s"   t | }t|tjrtS tS d S )N)determine_dtyperL   
issubdtypecomplexfloatingcomplex_nanminreal_nanmin)r&   dtr#   r#   r$   	np_nanmin  s    r   c             C   s"   t | }t|tjrtS tS d S )N)r   rL   r   r   complex_nanmaxreal_nanmax)r&   r   r#   r#   r$   	np_nanmax  s    r   )r      c                s*   t | tjsd S t| j  fdd}|S )Nc                sL   d}d}x6t | D ](}| } |s|| 7 }|d7 }qW t ||S )Ng        r   r   )rL   rM   rN   divide)r&   rP   countr   rQ   )r   r#   r$   nanmean_impl  s    z np_nanmean.<locals>.nanmean_impl)rE   r   Arrayr   r\   )r&   r   r#   )r   r$   
np_nanmean  s
    
r   c                s*   t | tjsd S t| j  fdd}|S )Nc                sn   t | }d}d}xNt | D ]@}| } |s| | }|t |t | 7 }|d7 }qW t ||S )Ng        r   r   )rL   nanmeanrM   rN   r   r   r   )r&   r   r   r   r   rQ   r   )r   r#   r$   nanvar_impl  s    
znp_nanvar.<locals>.nanvar_impl)rE   r   r   r   r\   )r&   r   r#   )r   r$   	np_nanvar  s
    
r   c             C   s   t | tjsd S dd }|S )Nc             S   s   t | d S )Ng      ?)rL   nanvar)r&   r#   r#   r$   nanstd_impl  s    znp_nanstd.<locals>.nanstd_impl)rE   r   r   )r&   r   r#   r#   r$   	np_nanstd  s    r   c                sP   t | tjsd S t | jtjr&tj}n| j}|dt| j  fdd}|S )Nr   c                s4   }x*t | D ]}| } |s||7 }qW |S )N)rL   rM   rN   )r&   rP   r   rQ   )r   rR   r#   r$   nansum_impl  s    znp_nansum.<locals>.nansum_impl)rE   r   r   r\   Integerr-   r   )r&   rn   r   r#   )r   rR   r$   	np_nansum  s    
r   )r   r   c                sP   t | tjsd S t | jtjr&tj}n| j}|dt| j  fdd}|S )Nr   c                s4   }x*t | D ]}| } |s||9 }qW |S )N)rL   rM   rN   )r&   rP   r   rQ   )r   oner#   r$   nanprod_impl  s    z np_nanprod.<locals>.nanprod_impl)rE   r   r   r\   r   r-   r   )r&   rn   r   r#   )r   r   r$   
np_nanprod  s    
r   )r      c                sZ   t | tjsd S t | jtjtjfr,dd S | jt d fdd}|S d S )Nc             S   s
   t | S )N)rL   cumprod)r&   r#   r#   r$   <lambda>  s    znp_nancumprod.<locals>.<lambda>r   c                sH   t | j}}x0t| jD ]"\}} | r8||9 }|||< qW |S )N)rL   rr   rs   rt   ru   )r&   rv   rP   rw   rQ   )is_nanr   rn   r#   r$   nancumprod_impl  s    
z&np_nancumprod.<locals>.nancumprod_impl)rE   r   r   r\   Booleanr   r   )r&   r   r#   )r   r   rn   r$   np_nancumprod  s    	r   c                sZ   t | tjsd S t | jtjtjfr,dd S | jt d fdd}|S d S )Nc             S   s
   t | S )N)rL   cumsum)r&   r#   r#   r$   r     s    znp_nancumsum.<locals>.<lambda>r   c                sH   t | j}}x0t| jD ]"\}} | r8||7 }|||< qW |S )N)rL   rr   rs   rt   ru   )r&   rv   rP   rw   rQ   )r   rn   rR   r#   r$   nancumsum_impl  s    
z$np_nancumsum.<locals>.nancumsum_impl)rE   r   r   r\   r   r   r   )r&   r   r#   )r   rn   rR   r$   np_nancumsum  s    	r   c             C   s&   t | }t|dkrtdn|S d S )Nr   z&zero-size array reduction not possible)_asarrayr;   r`   )r&   rO   r#   r#   r$   prepare_ptp_input*  s    
r   c                s    fdd}|S )Nc                s*   t | tjr fdd}n fdd}|S )Nc                s4    |j | j r|S |j | j kr0 |j| jr0|S | S )N)r   r   )current_valr   )ri   r#   r$   r   :  s    zN_compute_current_val_impl_gen.<locals>._compute_current_val_impl.<locals>.implc                s    || r|S | S )Nr#   )r   r   )ri   r#   r$   r   B  s    )rE   r   r   )r   r   r   )ri   r#   r$   _compute_current_val_impl3  s    z@_compute_current_val_impl_gen.<locals>._compute_current_val_implr#   )ri   r   r#   )ri   r$   _compute_current_val_impl_gen2  s    r   c                sH   d t | tjr fdd}n&t | tjr8 fdd}n fdd}|S )Nr   c                sH   t | jr<t | jr,dt jt jd  fS dt jd fS nd fS d S )NTy              ?y                F)rL   r   r   r   nan)r   )UNUSEDr#   r$   r   N  s
    z_early_return.<locals>.implc                s    t | rdt jfS d fS d S )NTF)rL   r   r   )r   )r   r#   r$   r   W  s    

c                s   d fS )NFr#   )r   )r   r#   r$   r   ]  s    )rE   r   r   r   )r   r   r#   )r   r$   _early_returnJ  s    r   c             C   s,   t | dr t| jtjr tddd }|S )Nr\   z+Boolean dtype is unsupported (as per NumPy)c       	      S   sj   t | }|j}|d }|d }xBt|jD ]4}|| }t|\}}|rJ|S t||}t||}q*W || S )Nr   )r   ru   r+   rs   r   _compute_a_max_compute_a_min)	r&   rO   Za_flatZa_mina_maxr'   r   Ztake_branchZretvalr#   r#   r$   np_ptp_impli  s    
znp_ptp.<locals>.np_ptp_impl)hasattrrE   r\   r   r   r!   )r&   r   r#   r#   r$   np_ptpa  s
    
r   c             C   s(   t | rdS t |rdS | |k S d S )NFT)rL   r   )r&   r   r#   r#   r$   nan_aware_less_than  s
    

r   c                s    fdd}|S )Nc                sd  || d? } | | | | r8| | | |  | |< | |<  | | | | rd| | | |  | |< | |<  | | | | r| | | |  | |< | |< | | }| | | |  | |< | |< |}|d }xx"||k r | | |r|d7 }qW x&||kr
 || | r
|d8 }qW ||krP | | | |  | |< | |< |d7 }|d8 }qW | | | |  | |< | |< |S )Nr   r#   )AlowhighmidZpivotr'   j)	pivotimplr#   r$   
_partition  s.    
z&_partition_factory.<locals>._partitionr#   )r   r   r#   )r   r$   _partition_factory  s    !r   c                s    fdd}|S )Nc                sT    | ||}x>||krJ||k r4|d } | ||}q|d } | ||}qW | | S )zJ
        Select the k'th smallest element in array[low:high + 1].
        r   r#   )r   kr   r   r'   )partitionimplr#   r$   _select  s    
z _select_factory.<locals>._selectr#   )r   r   r#   )r   r$   _select_factory  s    r   c             C   s   xz||kst t| ||}||k r,|d }q||d krB|d }q||krdt| |d |d | P qt| |||d  P qW | | | |d  fS )z
    Select the k'th and k+1'th smallest elements in array[low:high + 1].

    This is significantly faster than doing two independent selections
    for k and k+1.
    r   )AssertionErrorr   r   )r   r   r   r   r'   r#   r#   r$   _select_two  s    

r   c             C   sT   d}|d }|d? }|d@ dkrBt | |d ||\}}|| d S t| |||S dS )zt
    The main logic of the median() call.  *temp_arry* must be disposable,
    as this function will mutate it.
    r   r   r_   N)r   r   )	temp_arrynr   r   Zhalfr&   r   r#   r#   r$   _median_inner  s    r   c             C   s   t | tjsd S dd }|S )Nc             S   s   |   }|jd }t||S )Nr   )flattenrb   r   )r&   r   r   r#   r#   r$   median_impl  s    
znp_median.<locals>.median_impl)rE   r   r   )r&   r  r#   r#   r$   	np_median  s    r  c             C   s  t | }|dkr.tjt || d tjd}ntjt |tjd}xrtt |D ]`}|| }|dkrt| }tt|  rt| rtj	}n|dkrNt
| }tt|  rt| tjk}t| tj k}|||  }	|	dkrtj	}|dkr|dkrtj	}|dkr(tj	}|	dkr|dkr|dkrtj	}n^d|d t|d  }
t|
}|
| }t| t|d d|d d\}}|d|  ||  }|||< qRW |S )Nr   r   )r\   d   r_   g      Y@)r   r   r   )r;   rL   rd   float64rr   r+   maxr   isfiniter   minsuminftrue_dividemathfloorr   int)r&   qr   rv   r'   
percentiler   Znum_pos_infZnum_neg_infZ
num_finiteZrankfr   lowerupperr#   r#   r$   _collect_percentiles_inner  sD    








 r  c             C   sT   |r | |  } t | dkr.dS nt|r.dS t | dkrL| d }t|S dS d S )Nr   Fr   T)r;   rL   r   r  )r&   nan_maskskip_nanr   r#   r#   r$   _can_collect_percentiles*  s    


r  c             C   s~   t t |s,t |dk s,t |dkr4td|  }t |}t|||rh||  }t||}nt t|t j	}|S )Nr   r  z(Percentiles must be in the range [0,100])
rL   r   r   r`   r  r  r  rd   r;   r   )r&   r  r  r   r  rv   r#   r#   r$   _collect_percentiles:  s    ,

r  c                sh    fdd} fdd} fdd}t |tjtjtjfr>|S t |tjtjfrT|S t |tjrd|S d S )Nc                s   t |g}t| | dd S )N)r  r   )rL   arrayr  )r&   r  percentiles)r  r#   r$   np_percentile_q_scalar_implK  s    z8_np_percentile_impl.<locals>.np_percentile_q_scalar_implc                s   t |}t| | dS )N)r  )rL   r  r  )r&   r  r  )r  r#   r$   np_percentile_q_sequence_implO  s    
z:_np_percentile_impl.<locals>.np_percentile_q_sequence_implc                s   t | | dS )N)r  )r  )r&   r  )r  r#   r$   np_percentile_q_array_implS  s    z7_np_percentile_impl.<locals>.np_percentile_q_array_impl)rE   r   r   r   r   rH   Sequencer   )r&   r  r  r  r  r  r#   )r  r$   _np_percentile_implJ  s    r  c             C   s   t | |ddS )NF)r  )r  )r&   r  r#   r#   r$   np_percentile`  s    r   )r      c             C   s   t | |ddS )NT)r  )r  )r&   r  r#   r#   r$   np_nanpercentileh  s    r"  )r   	   c                s*   t | tjsd S t| j  fdd}|S )Nc                s`   t | j| j}d}x2t | D ]$}| } |s |||< |d7 }q W |dkrVt jS t||S )Nr   r   )rL   rr   rs   r\   rM   rN   r   r   )r&   r   r   r   rQ   )r   r#   r$   nanmedian_implv  s    z$np_nanmedian.<locals>.nanmedian_impl)rE   r   r   r   r\   )r&   r$  r#   )r   r$   np_nanmedianp  s
    
r%  c       	      C   st   t | }t | jd d }xP|D ]H}| |  }d}t|d }x|D ]}t|||| |}qJW |||< q$W |S )Nr   r   )rL   
empty_likendindexrb   copyr;   _select_w_nan)	r&   	kth_arrayrv   rw   sr   r   r   kthr#   r#   r$   np_partition_impl_inner  s    


r.  c             C   s   t |tj}|jdkr"tdtt|| jd krDtdt	|}x:t
|D ],\}}|dk r~|| jd  ||< qZ|||< qZW t|S )a  
    Returns a sorted, unique array of kth values which serve
    as indexers for partitioning the input array, a.

    If the absolute value of any of the provided values
    is greater than a.shape[-1] an exception is raised since
    we are partitioning along the last axis (per Numpy default
    behaviour).

    Values less than 0 are transformed to equivalent positive
    index values.
    r   zkth must be scalar or 1-Dr&  zkth out of boundsr   )r   astyperL   Zint64r]   r`   r   absrb   r'  ndenumerateunique)r&   r-  r+  rv   indexr   r#   r#   r$   
valid_kths  s    

r4  c             C   sn   t | tjtjtjfstdt | tjr<| jdkr<tdt|d|}t |tjtj	fsbtddd }|S )Nz(The first argument must be an array-liker   z3The first argument must be at least 1-D (found 0-D)r\   zPartition index must be integerc             S   s2   t | }|jdkr| S t||}t||S d S )Nr   )r   rs   r)  r4  r.  )r&   r-  Za_tmpr+  r#   r#   r$   np_partition_impl  s
    

z'np_partition.<locals>.np_partition_impl)
rE   r   r   r  rH   	TypeErrorr]   rk   r   r   )r&   r-  Zkthdtr5  r#   r#   r$   np_partition  s    r7  c             C   sz   t d| t d|f}tj|tjd}xPt|d D ]@}tt d|| d |d }d||d |f< d|||d f< q2W |S )Nr   )r\   r   )r  rL   rr   r  r+   r  )NMr   rb   rv   r'   Zm_maxr#   r#   r$   	_tri_impl  s    r:  c             C   s&   t |ttjfstdddd}|S )Nzk must be an integerr   c             S   s   |d kr| }t | ||S )N)r:  )r8  r9  r   r#   r#   r$   tri_impl  s    znp_tri.<locals>.tri_impl)Nr   )rE   r  r   r   r6  )r8  r9  r   r;  r#   r#   r$   np_tri  s    
r<  c             C   sH   | j dkstt| }tj||f| jd}xt|D ]}| ||< q4W |S )zq
    Takes a 1d array and tiles it to form a square matrix
    - i.e. a facsimile of np.tile(m, (len(m), 1))
    r   )r\   )r]   r   r;   rL   rr   r\   r+   )r   Zlen_mrv   r'   r#   r#   r$   _make_square  s    r=  c             C   s>   t j| jd | jd |dt j}t || t j| | jdS )Nr&  )r9  r   )r\   )rL   trirb   r/  uintwhere
zeros_liker\   )r   r   maskr#   r#   r$   np_tril_impl_2d  s    $rD  c             C   sP   t |ttjfstdd	dd}d
dd}| jdkr:|S | jdkrHtS |S d S )Nzk must be an integerr   c             S   s   t | }t||S )N)r=  rD  )r   r   m_2dr#   r#   r$   np_tril_impl_1d  s    z my_tril.<locals>.np_tril_impl_1dc             S   sz   t j| jd | jd |dt j}t | jd d }t | }t j|| jd}x"|D ]}t 	|| | |||< qXW |S )Nr>  r&  )r9  r   )r\   )
rL   r?  rb   r/  r@  r(  r'  rB  r\   rA  )r   r   rC  rw   zzero_optselr#   r#   r$   np_tril_impl_multi  s    $

z#my_tril.<locals>.np_tril_impl_multir   r_   )r   )r   )rE   r  r   r   r6  r]   rD  )r   r   rF  rJ  r#   r#   r$   my_tril  s    

	

rK  c             C   sB   t j| jd | jd |d dt j}t |t j| | jd| S )Nr>  r&  r   )r9  r   )r\   )rL   r?  rb   r/  r@  rA  rB  r\   )r   r   rC  r#   r#   r$   np_triu_impl_2d!  s    (rL  c             C   sP   t |ttjfstdd	dd}d
dd}| jdkr:|S | jdkrHtS |S d S )Nzk must be an integerr   c             S   s   t | }t||S )N)r=  rL  )r   r   rE  r#   r#   r$   np_triu_impl_1d-  s    z my_triu.<locals>.np_triu_impl_1dc             S   s~   t j| jd | jd |d dt j}t | jd d }t | }t j|| jd}x"|D ]}t 	||| | ||< q\W |S )Nr>  r&  r   )r9  r   )r\   )
rL   r?  rb   r/  r@  r(  r'  rB  r\   rA  )r   r   rC  rw   rG  rH  rI  r#   r#   r$   np_triu_impl_multi1  s    (

z#my_triu.<locals>.np_triu_impl_multir   r_   )r   )r   )rE   r  r   r   r6  r]   rL  )r   r   rM  rN  r#   r#   r$   my_triu&  s    

	

rO  c             C   s   d S )Nr#   )rO   r#   r#   r$   _prepare_arrayA  s    rP  c             C   s"   | d t jfkrdd S dd S d S )Nc             S   s
   t dS )Nr#   )rL   r  )rO   r#   r#   r$   r   G  s    z%_prepare_array_impl.<locals>.<lambda>c             S   s   t |  S )N)r   Zravel)rO   r#   r#   r$   r   I  s    )r   none)rO   r#   r#   r$   _prepare_array_implD  s    rR  c             C   s   | }xzt |tjtjfr t|S t|dd }|d k	rD| dkrDtjS t|dd }|d kr`tdt |tj	rt|j
}qt|S qW d S )N__len__r   r\   ztype has no dtype attr)rE   r   Numberr   r   rk   rL   r  r6  r  r\   )Zinobjobjlr   r#   r#   r$   _dtype_of_compoundK  s    rW  c             C   s   t | tjr"t | jtjr"tdtdkrt| }d }t|sFt|}d }t|sZt|}|d k	rzt	
||szd}t||d k	rt	
||sd}t|ddd}|S )Nz+Boolean dtype is unsupported (as per NumPy))r      z3dtype of to_begin must be compatible with input aryz1dtype of to_end must be compatible with input aryc       
      S   s   t |}t | }t |}|j}t|dkrtjt|t| t| d |d}t|}t|t| d }	||d |< t||||	< |||	d < n:tjt|t| |d}t|}||d |< |||d < |S )Nr   r   )r\   )rP  r\   r;   rL   rr   diff)
aryto_endto_beginstartr   end	out_dtyperv   Z	start_idxZmid_idxr#   r#   r$   np_ediff1d_implz  s     &z#np_ediff1d.<locals>.np_ediff1d_impl)NN)rE   r   r   r\   r   r6  r   rW  _is_nonelikerL   Zcan_cast)rZ  r[  r\  Zary_dtZto_begin_dtZ	to_end_dtr   r`  r#   r#   r$   
np_ediff1d]  s&    
rb  c             C   s   d S )Nr#   )rO   r#   r#   r$   _select_element  s    rc  c             C   s0   t | dd dk}|r dd }|S dd }|S d S )Nr]   r   c             S   s$   t jd| jd}| |d d < |d S )N)r   )r\   r   )rL   r  r\   )rO   r   r#   r#   r$   r     s    z"_select_element_impl.<locals>.implc             S   s   | S )Nr#   )rO   r#   r#   r$   r     s    )rk   )rO   Zzerodr   r#   r#   r$   _select_element_impl  s    rd  c             C   s   d S )Nr#   )dxr   r#   r#   r$   _get_d  s    rf  c             C   s   t | rdd }ndd }|S )Nc             S   s
   t |S )N)rL   r   )r   re  r#   r#   r$   r     s    zget_d_impl.<locals>.implc             S   s   t t | S )N)rL   rY  r   )r   re  r#   r#   r$   r     s    )ra  )r   re  r   r#   r#   r$   
get_d_impl  s    
rg        ?c             C   sH   t | tjtjfrtdnt | tjr:| jdkr:tdddd}|S )Nzy cannot be a scalarr   zy cannot be 0D      ?c             S   sX   t | }t||}|dtdd f |dtd df  d }t || d}t|}|S )N.r   r&  g       @)rL   r   rf  rA   r	  rc  )yr   re  ZyarrdZy_averetZ	processedr#   r#   r$   r     s    

(znp_trapz.<locals>.impl)Nri  )rE   r   rT  r   r!   r   r]   )rj  r   re  r   r#   r#   r$   np_trapz  s    

rm  c             C   s   |j \}}|t| kst||ks&t|rxt|D ]F}|dkrRd|dd|f< q4t| |dd|d f |dd|f< q4W n`x^t|d ddD ]J}||d krd|dd|f< qt| |dd|d f |dd|f< qW dS )a*  
    Generate an N-column Vandermonde matrix from a supplied 1-dimensional
    array, x. Store results in an output matrix, out, which is assumed to
    be of the required dtype.

    Values are accumulated using np.multiply to match the floating point
    precision behaviour of numpy.vander.
    r   r   Nr&  )rb   r;   r   r+   rL   Zmultiply)r   r8  
increasingrv   r   r   r'   r#   r#   r$   
_np_vander  s    

.ro  c             C   s&   | j dkrtd|dk r"tdd S )Nr   z.x must be a one-dimensional array or sequence.r   z#Negative dimensions are not allowed)r]   r`   )r   r8  r#   r#   r$   _check_vander_params  s    
rp  c                sz   |d t jfkr"t|t js"tdd fdd	}ddd}t| t jr`t| j}t	|t
 |S t| t jt jfrv|S d S )	Nz,Second argument N must be None or an integerFc                sF   |d krt | }t| | tjt | t|f d}t| ||| |S )N)r\   )r;   rp  rL   rr   r  ro  )r   r8  rn  rv   )r\   r#   r$   np_vander_impl  s    
z!np_vander.<locals>.np_vander_implc             S   sR   |d krt | }t| }t|| tjt | t|f|jd}t|||| |S )N)r\   )r;   rL   r  rp  rr   r  r\   ro  )r   r8  rn  Zx_arrrv   r#   r#   r$   np_vander_seq_impl  s    

z%np_vander.<locals>.np_vander_seq_impl)NF)NF)r   rQ  rE   r   r!   r   r   r\   rL   promote_typesr  rH   r  )r   r8  rn  rq  rr  x_dtr#   )r\   r$   	np_vander  s    

ru  c             C   sD   t |tjtjfstddd }t | tjtjfr<dd S |S d S )Nzshift must be an integerc             S   sV   t | }t j|j|jd}|j}x.t|jD ] }|| |j }|| |j|< q.W |S )N)r\   )rL   r   rr   rb   r\   ru   r+   rs   )r&   shiftrO   rv   Zarr_flatr'   rw   r#   r#   r$   np_roll_impl  s    
znp_roll.<locals>.np_roll_implc             S   s
   t | S )N)rL   r   )r&   rv  r#   r#   r$   r   $  s    znp_roll.<locals>.<lambda>)rE   r   r   r   r!   rT  )r&   rv  rw  r#   r#   r$   np_roll  s    rx  r   c             C   sz  d}|}| ||d  kr|S | |d k r,dS |dkrbd}x ||k rX| || krX|d7 }q:W |d S ||d krv|d }|dk rd}| || k r| ||d  k r|d }|t kr| ||t   kr|t  }n|d S nb| ||d  k r|S | ||d  k r |d S |d }||t  d k r4| ||t   k r4|t  }x<||k rp||| d?  }| || krh|d }n|}q6W |d S )Nr   r   r&     r^   r_   )LIKELY_IN_CACHE_SIZE)keyrO   lengthZguessZiminZimaxr'   Zimidr#   r#   r$   binary_search_with_guess-  sH    



r}  c             C   s  t | }t |}t |}t|dkr2tdt|t|krJtd|jdkrjt j|j|d |dS t j|j|d}|j}t|}	|d }
||	d  }|	dkr|d }|d }xLt|D ]@}|j	| }||k r|
|j	|< q||kr||j	|< q||j	|< qW nd}|	|kr*t j|	d |d}nt jd|d}|jrxvt|	d D ]f}d||d  ||   }||d  j
|| j
 | }||d  j|| j | }|d|  ||< qNW xXt|D ]J}|j	| }t |r|}d}|d|  |j	|< qt|||	|}|d	kr"|
|j	|< n||	kr8||j	|< n||	d krV|| |j	|< n|jrh|| }n\d||d  ||   }||d  j
|| j
 | }||d  j|| j | }|d|  }|j
|||   || j
 }|j|||   || j }|d|  |j	|< qW |S )
Nr   zarray of sample points is emptyz#fp and xp are not of the same size.r   )
fill_valuer\   )r\   y              ?g        r&  )rL   r   r;   r`   rs   rd   rb   rr   r+   ru   r   r   r   r}  )r   xpfpr\   dzre  dydreslenxlenxplvalrvalxp_valfp_valr'   x_valr   slopesinv_dxr   r   sloper#   r#   r$   np_interp_impl_complex_fp_innerq  st    










	r  c             C   s8  t | }t |}t |}t|dkr2tdt|t|krJtd|jdkrjt j|j|d |dS t j|j|d}|j}t|}	|d }
||	d  }|	dkr|d }|d }xLt|D ]@}|j	| }||k r|
|j	|< q||kr||j	|< q||j	|< qW n,d}|	|kr*t j|	d |d}nt jd|d}|jrxvt|	d D ]f}d||d  ||   }||d  j
|| j
 | }||d  j|| j | }|d|  ||< qNW xxt|D ]j}|j	| }t |r|}d}|d|  |j	|< qt|||	|}|d	kr$|
|j	|< q||	kr:||j	|< n||	d krX|| |j	|< n|| |krv|| |j	|< n|jr|| }n\d||d  ||   }||d  j
|| j
 | }||d  j|| j | }|d|  }|j
|||   || j
 }|j|||   || j }|d|  |j	|< qW |S )
Nr   zarray of sample points is emptyz#fp and xp are not of the same size.r   )r~  r\   )r\   y              ?g        r&  )rL   r   r;   r`   rs   rd   rb   rr   r+   ru   r   r   r   r}  )r   r  r  r\   r  re  r  r  r  r  r  r  r  r  r'   r  r   r  r  r   r   r  r#   r#   r$   #np_interp_impl_complex_fp_inner_116  sx    










	r  c             C   sB  t | }t |}t |}t|dkr2tdt|t|krJtd|jdkrjt j|j|d |dS t j|j|d}|j}t|}	|d }
||	d  }|	dkr|d }|d }xLt|D ]@}|j	| }||k r|
|j	|< q||kr||j	|< q||j	|< qW n6d}|	|krH|dd  |d d  |dd  |d d   }nt jd|d}xt|D ]}|j	| }t 
|r||j	|< q`t|||	|}|dkr|
|j	|< n||	kr||j	|< nv||	d kr|| |j	|< nX|jr|| }n(||d  ||  ||d  ||   }||||   ||  |j	|< q`W |S )Nr   zarray of sample points is emptyz#fp and xp are not of the same size.r   )r~  r\   )r\   r&  )rL   r   r;   r`   rs   rd   rb   rr   r+   ru   r   r}  )r   r  r  r\   r  re  r  r  r  r  r  r  r  r  r'   r  r   r  r  r#   r#   r$   np_interp_impl_inner2  sZ    






2




($r  c             C   sb  t | }t |}t |}t|dkr2tdt|t|krJtd|jdkrjt j|j|d |dS t j|j|d}|j}t|}	|d }
||	d  }|	dkr|d }|d }xLt|D ]@}|j	| }||k r|
|j	|< q||kr||j	|< q||j	|< qW nVd}|	|krH|dd  |d d  |dd  |d d   }nt jd|d}xt|D ]}|j	| }t 
|r||j	|< qbt|||	|}|dkr|
|j	|< n||	kr||j	|< n||	d kr|| |j	|< nv|| |kr || |j	|< nX|jr|| }n(||d  ||  ||d  ||   }||||   ||  |j	|< qbW |S )Nr   zarray of sample points is emptyz#fp and xp are not of the same size.r   )r~  r\   )r\   r&  )rL   r   r;   r`   rs   rd   rb   rr   r+   ru   r   r}  )r   r  r  r\   r  re  r  r  r  r  r  r  r  r  r'   r  r   r  r  r#   r#   r$   np_interp_impl_inner_116  s^    






2




($r  c       
         s  t |dr|jdkrtdt |dr8|jdkr8tdd}t|}t|tjrZt|tdk rt|}t|tjrt|tdkrt}t	}nt
}t}t|}t|tj t tjr|n| fdd	} fd
d}	t| tjrt| tjrt||	S |S )Nr]   r   zxp must be 1Dzfp must be 1Dz:Cannot cast array data from complex dtype to float64 dtype)r   r   )r   rX  c                s   | || S )Nr#   )r   r  r  )r\   innerr#   r$   np_interp_impl  s    z!np_interp.<locals>.np_interp_implc                s   | || j d S )Nr   )ru   )r   r  r  )r\   r  r#   r$   np_interp_scalar_impl  s    z(np_interp.<locals>.np_interp_scalar_impl)r   r]   r!   r   rL   r   r   r   r  r  r  r  result_typer  rE   r   rT  r   )
r   r  r  Zcomplex_dtype_msgZxp_dtZfp_dtr   Zimpl_complexr  r  r#   )r\   r  r$   	np_interp  s:    r  c             C   sd   | j dkst| j\}}tj|df| jd}x2t|D ]&}t| |d d f | ||df< q6W |S )Nr_   r   )r\   r   )r]   r   rb   rL   rr   r\   r+   r	  )r&   r   r   rv   r'   r#   r#   r$   row_wise_average#  s    
&r  c             C   sb   |d kr|rd}nd}| j d | }t|d}| t| 8 } t| t| j}|td|9 }|S )Nr   r   g        )rb   r  r  rL   dotr   Tr  )XbiasddofZfactrP   r#   r#   r$   np_cov_impl_inner/  s    
r  c               C   s   d S )Nr#   r#   r#   r#   r$   _prepare_cov_input_innerG  s    r  c             C   s$   |d t jfkrdd }ndd }|S )Nc             S   s   t t| }|s|j}|S )N)rL   
atleast_2dr   r  )r   rj  rowvarr\   m_arrr#   r#   r$   r  M  s    z9_prepare_cov_input_impl.<locals>._prepare_cov_input_innerc             S   s   t t| }t t|}|sH|jd dkr4|j}|jd dkrH|j}|j\}}|j\}}	||	krltdt j|| |f|d}
||
d |d d f< ||
| d d d f< |
S )Nr   r   z$m and y have incompatible dimensions)r\   )rL   r  r   rb   r  r`   rr   )r   rj  r  r\   r  Zy_arrZm_rowsZm_colsZy_rowsZy_colsrv   r#   r#   r$   r  U  s    

)r   rQ  )r   rj  r  r\   r  r#   r#   r$   _prepare_cov_input_implJ  s    
r  c             C   s(   | j dkr$| jd dkr$d}t|d S )Nr_   r   r   z2D array containing a single row is unsupported due to ambiguity in type inference. To use numpy.cov in this case simply pass the row as a 1D array, i.e. m[0].)r]   rb   RuntimeError)r   r   r#   r#   r$   _handle_m_dim_changeq  s    r  c             C   s   | S )Nr#   )r   r#   r#   r$   r   y  s    r   c                s   t j}t| tjrt| j}nt| tjtjfr:t| }nt| tj	tj
frt  x4| D ],}t|drz fdd|D  qX | qXW t dkrt jdd  D  }nt dkrt  }|S )Nr   c                s   g | ]}  |qS r#   )add).0rQ   )coltypesr#   r$   
<listcomp>  s    z#determine_dtype.<locals>.<listcomp>r   c             S   s   g | ]}t |qS r#   )r   )r  r   r#   r#   r$   r    s    )rL   r  rE   r   r   r   r\   rT  r   r<   rH   setr   r  r;   rs  rc   )
array_likeZarray_like_dtr   r#   )r  r$   r   {  s     


r   c             C   sn   t | tjr&| jdkrjtd|nDt | tjrjt | jd tjrjt | jd jd tjrjtd|d S )Nr_   z{0} has more than 2 dimensionsr   )rE   r   r   r]   r6  r   r  r{  )r  namer#   r#   r$   check_dimensions  s    
r  c             C   s.   t | std| t|  dkr*tdd S )Nz)Cannot convert non-finite ddof to integerr   zddof must be integral value)rL   r  r`   r  )r  r#   r#   r$   _handle_ddof  s    
r  c             C   s   | S )Nr#   )r   r#   r#   r$   r     s    c             C   s   ||  || t | |||S )N)r  )r   rj  r  r\   r  _DDOF_HANDLER_M_DIM_HANDLERr#   r#   r$   _prepare_cov_input  s    r  c             C   s   |d t jfk}t| t jr(| jdkr(|S t| t jrptdd | j D rL|S t| j dkrpt| j d t jrp|S t| t jt j	fr|S t| t j
rt| jd t j
s|rdS dS )Nr   c             s   s    | ]}t |tjtjfV  qd S )N)rE   r   rT  r   )r  r   r#   r#   r$   	<genexpr>  s    z)scalar_result_expected.<locals>.<genexpr>r   TF)r   rQ  rE   r   r]   Z	BaseTupler   r;   rT  r   r  r{  )Zmandatory_inputZoptional_inputZopt_is_noner#   r#   r$   scalar_result_expected  s     r  c             C   s   t t | dkt | | S )Nr   )rL   rA  ZfabsZsign)r   r#   r#   r$   
_clip_corr  s    r  c             C   s    t | j}t | j}|d|  S )Ny              ?)r  r   r   )r   r   r   r#   r#   r$   _clip_complex  s    

r  c       	         s   t | d t |d |d tjfkr(t n2t|tjtjfr@t nt|tjrRt nt	dt
t| tjrntt| }t|}t||tjd
 fdd	}d fdd		}t| |r|S |S d S )Nr   rj  z)ddof must be a real numerical scalar typeTFc                sb   t | ||| }tt|jdkrRtj|jd |jd ftjdS t|||S d S )Nr   )r~  r\   )	r  r/  rL   r   r  rb   rd   r   r  )r   rj  r  r  r  r  )r  r  r\   r#   r$   np_cov_impl  s    "znp_cov.<locals>.np_cov_implc                sT   t | ||| }tt|jdkr8tj}nt|||jd }t|S )Nr   )	r  r/  rL   r   r  rb   r   r  ru   )r   rj  r  r  r  r  Zvariance)r  r  r\   r#   r$   np_cov_impl_single_variable  s
    z+np_cov.<locals>.np_cov_impl_single_variable)NTFN)NTFN)r  r   rQ  _handle_ddof_noprE   r   r   r   r  r!   _handle_m_dim_nopr   r  r   rL   r  r  r  )	r   rj  r  r  r  Zm_dty_dtr  r  r#   )r  r  r\   r$   np_cov  s(    



r  c                sb   t | }t |}t||tj}|tjkr0t nt d fdd	}ddd}t| |rZ|S |S d S )NTc                st   t | ||}t |}t |j}xFt|jd D ]4}||d d f  |  < |d d |f  |  < q4W  |S )Nr   )rL   covZdiagZsqrtr   r+   rb   )r   rj  r  rP   rk  Zstddevr'   )clip_fnr#   r$   np_corrcoef_impl
	  s    
z%np_corrcoef.<locals>.np_corrcoef_implc             S   s   t | ||}|| S )N)rL   r  )r   rj  r  rP   r#   r#   r$    np_corrcoef_impl_single_variable	  s    z5np_corrcoef.<locals>.np_corrcoef_impl_single_variable)NT)NT)r   rL   r  r  complexr  r  r  )r   rj  r  rt  r  r\   r  r  r#   )r  r$   np_corrcoef  s    


r  c             C   s   | j dkrD| jd }| jd }d| }|r4|| }q|t|| }nJt| j}tt|dksltddt|d d 	  }|
 }||fS )Nr_   r   r   z/All dimensions of input must be of equal lengthr&  )r]   rb   r  rL   r  r   rY  r`   r   r	  prod)r&   wrapr   r   stepr^  rb   r#   r#   r$   _fill_diagonal_params!	  s    



r  c             C   s2   t | |\}}xtd||D ]}|| j|< qW d S )Nr   )r  r+   ru   )r&   r   r  r^  r  r'   r#   r#   r$   _fill_diagonal_scalar6	  s    r  c             C   sR   t | |\}}d}t|}x2td||D ]"}|| | j|< |d7 }|| }q(W d S )Nr   r   )r  r;   r+   ru   )r&   r   r  r^  r  ZctrZv_lenr'   r#   r#   r$   _fill_diagonal=	  s    r  c             C   sR   t | j}|j}|j}t t | sFt ||k sFt ||krNtdd S )Nz'Unable to safely conform val to a.dtype)rL   iinfor\   r  r  r   r  r`   )r&   r   r  v_minv_maxr#   r#   r$   _check_val_intH	  s
    .r  c             C   sN   t | j}|j}|j}|t | }t ||k sBt ||krJtdd S )Nz'Unable to safely conform val to a.dtype)rL   finfor\   r  r  r  r   r`   )r&   r   r  r  r  Zfinite_valsr#   r#   r$   _check_val_floatR	  s    r  c             C   s   | S )Nr#   )r   rj  r#   r#   r$   r   ^	  s    c             C   s   d S )Nr#   )r   r#   r#   r$   r   `	  s    r   c                sX   t | tjrdd S t | tjtjfr.dd S t | tjtjfrTt|   fddS d S )Nc             S   s   | S )Nr#   )r   r#   r#   r$   r   f	  s    z_asarray_impl.<locals>.<lambda>c             S   s
   t | S )N)rL   r  )r   r#   r#   r$   r   h	  s    c                s   t j| g dS )N)r\   )rL   r  )r   )r   r#   r$   r   k	  s    )rE   r   r   r  rH   rT  r   r   )r   r#   )r   r$   _asarray_implc	  s    r  c                s   | j dkrt| jtjrt nt| jtjr2t nt d fdd	}d	 fdd	}t|tjtjtj	frl|S t|tj
tjtjfr|S nd| j  }t|d S )
Nr   Fc                s&   t | } | | t| || d S )N)r   r  r  )r&   r   r  tmpval)checkerr#   r$   scalar_impl{	  s    
z%np_fill_diagonal.<locals>.scalar_implc                s&   t | } | | t| || d S )N)r   r  r  )r&   r   r  r  )r  r#   r$   non_scalar_impl	  s    
z)np_fill_diagonal.<locals>.non_scalar_implz4The first argument must be at least 2-D (found %s-D))F)F)r]   rE   r\   r   r   r  r   r  
_check_nopr   rH   r  r   r!   )r&   r   r  r  r  r   r#   )r  r$   np_fill_diagonalm	  s    

r  c             C   s   d| j f S )Nzllvm.rint.f%d)Zbitwidth)tpr#   r#   r$   _np_round_intrinsic	  s    r  c             C   s@   |  |}|j}tj||g}|j|t|d}|||fS )N)r  )r)   modulelcr
   ZfunctionZget_or_insert_functionr  Zcall)rW   r1   r  r   Zlltyr  Zfntyfnr#   r#   r$   _np_round_float	  s
    
r  c             C   s(   t | ||jd |d }t| ||j|S )Nr   )r  r2   r   rU   )rW   r1   rX   r2   rY   r#   r#   r$   scalar_round_unary	  s    r  c             C   s   |d }t | ||j|S )Nr   )r   rU   )rW   r1   rX   r2   rY   r#   r#   r$   r  	  s    c             C   s`   |j d j}| ||j d |d }t| |||j|_t| |||j|_| }t| ||j|S )Nr   )	r2   Zunderlying_floatZmake_complexr  r   r   	_getvaluer   rU   )rW   r1   rX   r2   ZflttyrG  rY   r#   r#   r$   scalar_round_unary_complex	  s    r  c             C   s(   dd }|  ||||}t| ||j|S )Nc             S   s   t | st | r| S |dkrr|dkr:d|d  }d}nd| }d}| | | }t |r`| S t|| | S d|  }| | }t|| S d S )Nr      g      $@gMDg      ?)r  Zisinfr   rL   round)r   ndigitsZpow1Zpow2rj  r#   r#   r$   round_ndigits	  s    

z0scalar_round_binary_float.<locals>.round_ndigits)r.   r   rU   )rW   r1   rX   r2   r  rY   r#   r#   r$   scalar_round_binary_float	  s    r  c             C   s(   dd }|  ||||}t| ||j|S )Nc             S   s   t t| j|t| j|S )N)r  rL   r  r   r   )rG  r  r#   r#   r$   r  	  s    z2scalar_round_binary_complex.<locals>.round_ndigits)r.   r   rU   )rW   r1   rX   r2   r  rY   r#   r#   r$   scalar_round_binary_complex	  s    r  c             C   s(   dd }|  ||||}t| ||j|S )Nc             S   s@   | j |j krtdx&t| D ]\}}t||||< q W |S )Nzinvalid output shape)rb   r`   rL   r1  r  )rO   Zdecimalsrv   r3  r   r#   r#   r$   array_round_impl	  s
    z%array_round.<locals>.array_round_impl)r.   r   rU   )rW   r1   rX   r2   r  rY   r#   r#   r$   array_round	  s    r  c             C   s(   dd }|  ||||}t| ||j|S )Nc             S   s4   t | }x$t | D ]\}}t |||< qW |S )N)rL   rB  r1  sinc)rO   rv   r3  r   r#   r#   r$   array_sinc_impl	  s    
z#array_sinc.<locals>.array_sinc_impl)r.   r   rU   )rW   r1   rX   r2   r  rY   r#   r#   r$   
array_sinc	  s    r  c             C   s8   |j }dd }| j||||t|dd}t| ||j |S )Nc             S   s$   | dkrd} | t j9 } t | |  S )Ng        g#B;)rL   piZsin)r   r#   r#   r$   scalar_sinc_impl	  s    
z%scalar_sinc.<locals>.scalar_sinc_impl)rP   )rT   )rU   r.   rV   r   )rW   r1   rX   r2   ry   r  rY   r#   r#   r$   scalar_sinc	  s
    r  c                sn   | dtj   fdd}t|dkrN|tjf }t|j f|jtj	f  }| 
||||}t| ||j |S )N   c                s,   |rt | j| j  S t | j| jS d S )N)rL   Zarctan2r   r   )r   deg)deg_multr#   r$   scalar_angle_impl	  s    z-scalar_angle_kwarg.<locals>.scalar_angle_implr   )rU   rL   r  r;   r   	false_bitr   r2   r   booleanr.   r   )rW   r1   rX   r2   r  rY   r#   )r  r$   scalar_angle_kwarg	  s    r  c                sp   |j d }|jj  fdd}t|dkrP|tjf }t|jf|j tjf  }| 	||||}t
| ||j|S )Nr   c                s:   t j|  d}x&t | D ]\}}t ||||< qW |S )N)r\   )rL   rB  r1  angle)rO   r  rv   r3  r   )	ret_dtyper#   r$   array_angle_impl
  s    z+array_angle_kwarg.<locals>.array_angle_implr   )r2   rU   r\   r;   r   r  r   r   r  r.   r   )rW   r1   rX   r2   argr  rY   r#   )r  r$   array_angle_kwarg

  s    
r  zarray.nonzeroc                sL  |j d }|j}|j|j}|j}t| |d }t |j}	t |j	}
|j
}|j}tjd}tjd}t |}t |	|jh}t ||	|
||}t ||} |j|} |     ||| W d Q R X W d Q R X  |f fddt|D } fdd|D }dd |D }t |}t |	|j}t ||	|
||}t ||} |j|} |r |s|f} |}x@t|D ]4}t || dd|g}t || | qW   ||| W d Q R X W d Q R X  |j|}t |j|S )	Nr   r   c                s   g | ]}t   qS r#   )r   r  )r  r'   )r1   rW   	out_shapeoutarytyr#   r$   r  =
  s   z!array_nonzero.<locals>.<listcomp>c                s   g | ]}t  |qS r#   )r   )r  rv   )r1   rW   r  r#   r$   r  ?
  s    c             S   s   g | ]
}|j qS r#   )r6   )r  rv   r#   r#   r$   r  @
  s    r#   C)r2   rU   r\   r]   r   r   r   Zunpack_tuplerb   stridesr6   layoutr,   r   r-   Zalloca_once_valueZ	loop_nestre   Zget_item_pointer2r   Zis_trueZif_thenZstorer  loadr+   r   Z
make_tupler   )rW   r1   rX   r2   Zarytyrn   r]   ZnoutsrZ  rb   r  r6   r  rR   r   r   indicesZptrr   ZnzZoutsZoutarysZ	out_datasr3  curr'   r4   r#   )r1   rW   r  r  r$   array_nonzero
  sV    
.

(r  c                s   t dd |jD }tt|jd jt|jd j |t dksP|t dkr^ fdd}n fd	d}| ||||}t| ||j|S )
z'
    np.where(array, array, array)
    c             s   s   | ]}|j V  qd S )N)r  )r  r&   r#   r#   r$   r  ^
  s    zarray_where.<locals>.<genexpr>r   r_   r  Fc       
         s|   | j }|j |ks|j |kr"tdtj| d}| j}|j}|j}|j}x.t| jD ] }	||	 rh||	 n||	 ||	< qTW |S )Nz%all inputs should have the same shape)r\   )rb   r`   rL   r'  ru   r+   rs   )
condr   rj  rb   rY   ZcfZxfZyfZrfr'   )nptyr#   r$   
where_imple
  s     zarray_where.<locals>.where_implc                sf   | j }|j |ks|j |kr"tdtj| j  d}x.t| D ] \}}|rR|| n|| ||< q>W |S )Nz%all inputs should have the same shape)r\   )rb   r`   rL   rr   r1  )r  r   rj  rb   rY   rw   rP   )r  r#   r$   r  r
  s    )	r  r2   rL   rs  r   r\   r.   r   rU   )rW   r1   rX   r2   Zlayoutsr  rY   r#   )r  r$   array_whereZ
  s    	r  c             C   s,   x&t | D ]\}}|r|n|||< qW |S )N)rL   r1  )r  r   rj  rY   rw   rP   r#   r#   r$   _where_x_y_scalar
  s    r  c             C   s0   x*t | D ]\}}|r|n|| ||< qW |S )N)rL   r1  )r  r   rj  rY   rw   rP   r#   r#   r$   _where_x_scalar
  s    r  c             C   s0   x*t | D ]\}}|r || n|||< qW |S )N)rL   r1  )r  r   rj  rY   rw   rP   r#   r#   r$   _where_y_scalar
  s    r  c                sp   |j \}}}t|}t|}	t||	|jdkrB fdd}
n fdd}
| ||
||}t| ||j|S )Nr   c                s$   t t j| jd} | |||S )N)r\   )rL   Zasfortranarrayrr   rb   )r  r   rj  rY   )r   r  r#   r$   r  
  s    z _where_inner.<locals>.where_implc                s   t j| jd} | |||S )N)r\   )rL   rr   rb   )r  r   rj  rY   )r   r  r#   r$   r  
  s    )r2   r   rL   rs  r  r.   r   rU   )rW   r1   rX   r2   r   r  r   rj  rt  r  r  rY   r#   )r   r  r$   _where_inner
  s    
r  )r   c       
      C   s   |j \}}}t|tjrt|tjrNt|tjr6t}qt|tjtjfrt}n:t|tjtjfrt|tjrrt}nt|tjtjfrt	}|| |||S dd }| 
||||}	t| ||j|	S )Nc             S   s"   | r|n|}t |}||d< |S )zH
        np.where(scalar, scalar, scalar): return a 0-dim array
        r#   )rL   r'  )r  r   rj  ZscalrO   r#   r#   r$   scalar_where_impl
  s    
z$any_where.<locals>.scalar_where_impl)r2   rE   r   r   r  rT  r   array_array_scalar_wherearray_scalar_array_wherearray_scalar_scalar_wherer.   r   rU   )
rW   r1   rX   r2   r  r   rj  r   r	  rY   r#   r#   r$   	any_where
  s     r  c             C   s   dd }|S )Nc             S   s   | j S )N)r   )r&   r#   r#   r$   np_real_impl
  s    znp_real.<locals>.np_real_implr#   )r&   r  r#   r#   r$   np_real
  s    r  c             C   s   dd }|S )Nc             S   s   | j S )N)r   )r&   r#   r#   r$   np_imag_impl
  s    znp_imag.<locals>.np_imag_implr#   )r&   r  r#   r#   r$   np_imag
  s    r  c             C   s(   t | tjr| jdkrd S ddd}|S )Nr   r   c             S   sB  |dkr|   S |dk r td| jd }| jd d t|| df }t|| j}|jdkrd|S | d|f}|d|jd f}t|| j}xt	|jd D ]}x4t	|d D ]$}	|||	d f |||	f  ||	< qW xFt	d|D ]8}
x2t	||
 d D ]}	||	d  ||	  ||	< q W qW |d ||  ||< qW |S )Nr   z"diff(): order must be non-negativer&  r   )
r)  r`   rb   r  rL   rr   r\   rs   Zreshaper+   )r&   r   rs   r  rv   Za2Zout2Zworkmajorr'   Zniterr#   r#   r$   	diff_impl
  s(    

$"znp_diff_impl.<locals>.diff_impl)r   )rE   r   r   r]   )r&   r   r  r#   r#   r$   np_diff_impl
  s    
r  c             C   sD   t |tjr&|jdkr@td| nt |tjs@td| d S )Nr   z${0}(): input should have dimension 1z+{0}(): input should be an array or sequence)rE   r   r   r]   r6  r   r  )	func_nameseqr#   r#   r$   validate_1d_array_like  s    

r  c                s   t d|  t| jtjsd S |d tjfkrTt d| |jtdd tdd  ntjtdd tdd  d
 fdd		}|S )Nbincountc             S   s   t | t |krtdd S )Nz7bincount(): weights and list don't have the same length)r;   r`   )r&   weightsr#   r#   r$   validate_inputs  s    z$np_bincount.<locals>.validate_inputsc             S   s   | |  || 7  < d S )Nr#   )rv   rw   r   r  r#   r#   r$   
count_item!  s    znp_bincount.<locals>.count_itemc             S   s   d S )Nr#   )r&   r  r#   r#   r$   r  (  s    c             S   s   | |  d7  < d S )Nr   r#   )rv   rw   r   r  r#   r#   r$   r  ,  s    c                s   | | t | }|dkr"| d nd}x4td|D ]&}| | dk rJtdt|| | }q2W t|d }x"t|D ]} ||| | | qvW |S )Nr   r&  r   z/bincount(): first argument must be non-negative)r;   r+   r`   r  rL   zeros)r&   r  r   r   r'   rv   )r  r_  r  r#   r$   bincount_impl0  s    
z"np_bincount.<locals>.bincount_impl)N)r  rE   r\   r   r   rQ  r   r-   )r&   r  r  r#   )r  r_  r  r$   np_bincount  s    

r  c                s    fdd}|S )Nc                s   t | }t|rBx*t|ddD ]}t| |d  s |S q W dS d}|}x4||kr~|| d? } | | |rx|d }qL|}qLW |S )Nr   r&  r   )r;   rL   r   r+   )r&   rQ   r   r'   lohir   )funcr#   r$   searchsorted_innerB  s    


z)_searchsorted.<locals>.searchsorted_innerr#   )r!  r"  r#   )r!  r$   _searchsortedA  s    r#  c             C   s   | |kS )Nr#   )r   rj  r#   r#   r$   r   Y  s    leftc                s~   t |d|}|dkrt n|dkr(t ntd| t|tjrPd	 fdd	}n*t|tjrld
 fdd	}nd fdd	}|S )NrG   r$  rightz"Invalid value given for 'side': %sc                sH   t |jt j}x2t ||fD ] \}} | | }|| q W |S )N)rL   rr   rb   r-   rM   rN   itemset)r&   rQ   siderv   r   outviewr3  )	loop_implr#   r$   searchsorted_impli  s
    z'searchsorted.<locals>.searchsorted_implc                s>   t t|t j}x&tt|D ]} | || ||< q W |S )N)rL   rr   r;   r-   r+   )r&   rQ   r'  rv   r'   )r)  r#   r$   r*  r  s    c                s
    | |S )Nr#   )r&   rQ   r'  )r)  r#   r$   r*  z  s    )r$  )r$  )r$  )rk   _searchsorted_left_searchsorted_rightr`   rE   r   r   r  )r&   rQ   r'  Zside_valr*  r#   )r)  r$   searchsorted]  s    r-  c                sl   t dd  t dd t dd t| tjrFd fdd		}|S t| tjrhd fd
d		}|S d S )Nc             S   sp   t | }d}d}|dkrl| d }xJtd|D ]<}| | }|oD||k }|oR||k  }|sd|sdtd|}q,W |S )NTr   r   z3bins must be monotonically increasing or decreasing)r;   r+   r`   )binsr   is_increasingZis_decreasingprevr'   r  r#   r#   r$   are_bins_increasing  s    z(np_digitize.<locals>.are_bins_increasingc             S   s   t |}d}|}|rt| rNx*t|ddD ]}t||d  s,|S q,W dS xv||kr|| d? }|| | k rz|d }qP|}qPW nBt| r|S x2||kr|| d? }|| | kr|d }q|}qW |S )Nr   r&  r   )r;   rL   r   r+   )r   r.  r%  r   r  r   r'   r   r#   r#   r$   digitize_scalar  s,    






z$np_digitize.<locals>.digitize_scalarc             S   s   t |}d}|}|r~t| rHx$td|D ]}t|| s*|S q*W |S xv||krz|| d? }|| | k rp|}qJ|d }qJW nBt| rdS x2||kr|| d? }|| | kr|}q|d }qW |S )Nr   r   )r;   rL   r   r+   )r   r.  r%  r   r  r   r'   r   r#   r#   r$   digitize_scalar_decreasing  s,    



z/np_digitize.<locals>.digitize_scalar_decreasingFc                sh    |}t | jt j}xJt | |fD ]8\}}|rF| ||}n| ||}|| q(W |S )N)rL   rr   rb   r-   rM   rN   r&  )r   r.  r%  r/  rv   r   r(  r3  )r1  r2  r3  r#   r$   digitize_impl  s    z"np_digitize.<locals>.digitize_implc                sb    |}t t| t j}xBtt| D ]2}|rF| | ||||< q(| | ||||< q(W |S )N)rL   rr   r;   r-   r+   )r   r.  r%  r/  rv   r'   )r1  r2  r3  r#   r$   r4    s    )F)F)r   rE   r   r   r  )r   r.  r%  r4  r#   )r1  r2  r3  r$   np_digitize  s    &%
r5  r   c                sP   t |ttjfrB|d tjfkr6td d fdd	}qLddd}n
d	dd}|S )
Nr
  r   c                sP    }  }x2t | D ]$}| }||kr.|}||k r|}qW t | |||fS )N)rL   rM   rN   	histogram)r&   r.  r+   bin_minbin_maxr   rQ   )r
  r#   r$   histogram_impl	  s    z$np_histogram.<locals>.histogram_implc             S   s   |dkrt d|\}}||ks(t dt|tj}||kr|||  }xvt| D ]h}| }t|| | }	d|	  kr|k rn n|t|	  d7  < qV||krV||d   d7  < qVW t	|||d }
||
fS )Nr   z0histogram(): `bins` should be a positive integerz;histogram(): max must be larger than min in range parameterr   )
r`   rL   r  r-   rM   rN   r  r  r  Zlinspace)r&   r.  r+   r7  r8  histZ	bin_ratior   rQ   r   Z
bins_arrayr#   r#   r$   r9    s"    c             S   s   t |d }x,t|D ] }|| ||d  kstdqW |d }|| }t|tj}|dkrxt| D ]x}| }	||	  kr|ksql qld}
|d }x6|
|k r|
| d d? }|	|| k r|d }q|}
qW ||
  d7  < qlW ||fS )Nr   z-histogram(): bins must increase monotonicallyr   )r;   _ranger`   rL   r  r-   rM   rN   )r&   r.  r+   Znbinsr'   r7  r8  r:  r   rQ   r  r   r   r#   r#   r$   r9  -  s*    

)r   N)r   N)r   N)rE   r  r   r   rQ  float)r&   r.  r+   r9  r#   )r
  r$   np_histogram  s    
 r=  )Zibetar   machepepsnegepepsnegiexpminexpZxminmaxexpZxmaxZirndZngrdepsilontinyZhuge	precision
resolutionMachAr)r?  rA  rB  r>  r  rD  r  rC  r@  ZnexpZnmantrG  rH  rF  )bitsr  )r  r  r  c                 s.   t  tfddtD   fdd} | S )Nc                s   g | ]}t  |qS r#   )rk   )r  r   )r  r#   r$   r  l  s    zMachAr_impl.<locals>.<listcomp>c                  s   t   S )N)rI  r#   )_mach_ar_datar#   r$   r   m  s    zMachAr_impl.<locals>.impl)rL   rI  tuple_mach_ar_supported)r   r#   )rK  r  r$   MachAr_impli  s    rN  c                s   t  fdd}d S )Nc                s@   t | d| }t|tfddD   fdd}|S )Nr\   c                s   g | ]}t  |qS r#   )rk   )r  r   )r  r#   r$   r  v  s    z6generate_xinfo.<locals>.xinfo_impl.<locals>.<listcomp>c                s     S )Nr#   )r  )	containerr6   r#   r$   r   w  s    z0generate_xinfo.<locals>.xinfo_impl.<locals>.impl)rk   r   rL  )r  Znbtyr   )attrrO  np_func)r6   r  r$   
xinfo_implr  s
    z"generate_xinfo.<locals>.xinfo_impl)r   )rQ  rO  rP  rR  r#   )rP  rO  rQ  r$   generate_xinfoq  s    rS  c                sl   t dd }ts|S tjtjB }| |ko.||k}|s8|S t| }t|}t|| t  fdd}|S d S )Nc             S   s2   d}x(t t| D ]}|| | ||   }qW |S )Nr   )r+   r;   )r&   r   Zaccr'   r#   r#   r$   
_innerprod  s    z#_get_inner_prod.<locals>._innerprodc                s   t |  | S )N)rL   r  r/  )r&   r   )r   r#   r$   	_dot_wrap  s    z"_get_inner_prod.<locals>._dot_wrap)r   
_HAVE_BLASr   Zreal_domaincomplex_domainr   rL   rs  )ZdtaZdtbrT  ZfltyZfloatsa_dtb_dtrU  r#   )r   r$   _get_inner_prod~  s    rZ  c             C   s&   t | tjr"| jdks"td| d S )Nr   z!%s() only supported on 1D arrays )rE   r   r   r]   r!   )r&   r  r#   r#   r$   
_assert_1d  s    
r[  c             C   s   d S )Nr#   )ap1ap2mode	directionr#   r#   r$   _np_correlate_core  s    r`  c               @   s   e Zd ZdZdZdZdZdS )_corr_conv_Modez
    Enumerated modes for correlate/convolve as per:
    https://github.com/numpy/numpy/blob/ac6b1a902b99e340cf7eeeeb7392c91e38db9dd8/numpy/core/numeric.py#L862-L870
    r   r   r_   N)__name__
__module____qualname____doc__VALIDZSAMEFULLr#   r#   r#   r$   ra    s   ra  c                sF   t | j}t |j}t||t| j|jt  fdd}|S )Nc                s  | j ks| jkstdt| }t|}|}|}| j krT|| d }d}d}	n0| jkr||d }	|d }|| d }ntdt|}
|| }|dkrd}d}n|dkr|d }d}ntdx@t|D ]4}| d |d  ||d  d  |
|< || }qW x<t|| d D ](}| |||  ||
|< || }qW x>t|	ddD ].}| | d  |d | |
|< || }qVW |
S )NzInvalid moder   r   r&  zInvalid direction)rf  rg  r`   r;   rL   r  r+   )r\  r]  r^  r_  Zn1Zn2r|  r   Zn_leftZn_rightrl  rw   Zincr'   )Moder   	innerprodr#   r$   r     sD    	

( z%_np_correlate_core_impl.<locals>.impl)r   r\   rL   rs  rZ  ra  )r\  r]  r^  r_  rX  rY  r   r#   )rh  r   ri  r$   _np_correlate_core_impl  s    

4rj  c                s   t | d t |d tdd }tdd }t | jtjkr\|jtjkrR||qz||n|jtjkrr||n|| fdd}|S )Nznp.correlatec             S   s
   t | S )N)rL   r   )r   r#   r#   r$   op_conj  s    z_np_correlate.<locals>.op_conjc             S   s   | S )Nr#   )r   r#   r#   r$   op_nop  s    z_np_correlate.<locals>.op_nopc                sD   t | t |k r(t||  jdS t| | jdS d S )Nr&  r   )r;   r`  rf  )r&   rQ   )rh  a_opb_opr#   r$   r     s    z_np_correlate.<locals>.impl)r[  r   ra  r\   r   rW  )r&   rQ   rk  rl  r   r#   )rh  rm  rn  r$   _np_correlate  s$    

ro  c                s(   t | d t |d t  fdd}|S )Nznp.convolvec                sp   t | }t |}|dkr td|dkr0td||k rRt|| d d d  jdS t| |d d d  jdS d S )Nr   z'a' cannot be emptyz'v' cannot be emptyr&  r   )r;   r`   r`  rg  )r&   rQ   ZlaZlv)rh  r#   r$   r     s    znp_convolve.<locals>.impl)r[  ra  )r&   rQ   r   r#   )rh  r$   np_convolve  s
    

rp  c             C   s   | d kpt | tjS )N)rE   r   ZNoneType)r   r#   r#   r$   ra  *  s    ra  c                s   d }t | tjr<t|s$| j|jkr0ddd}qddd}njt | tjtjfrnt|rbd	dd}qd
dd}n8t | tjtjfrt|r| n|}t	| d fdd	}|S )Nc             S   s   | S )Nr#   )r&   r\   r#   r#   r$   r   2  s    znp_asarray.<locals>.implc             S   s
   |  |S )N)r/  )r&   r\   r#   r#   r$   r   5  s    c             S   s
   t | S )N)rL   r  )r&   r\   r#   r#   r$   r   <  s    c             S   s   t | |S )N)rL   r  )r&   r\   r#   r#   r$   r   ?  s    c                s   t |  S )N)rL   r  )r&   r\   )r   r#   r$   r   D  s    )N)N)N)N)N)
rE   r   r   ra  r\   r  rH   rT  r   r   )r&   r\   r   Zdt_convr#   )r   r$   
np_asarray-  s    rq  c             C   s   dd }|S )Nc                s   t |  t |  jdkr*tdt  jd  rVj jkrVd}t|t jj} fddt|D }t |S )Nr   z"Cannot extract from an empty arrayz+condition shape inconsistent with arr shapec                s   g | ]}| r j | qS r#   )ru   )r  rw   )r&   r  r#   r$   r  \  s    z7np_extract.<locals>.np_extract_impl.<locals>.<listcomp>)	rL   r   r  rs   r`   r   r  r+   r  )	conditionrO   r   Zmax_lenrv   r#   )r&   r  r$   np_extract_implL  s    

 z#np_extract.<locals>.np_extract_implr#   )rr  rO   rs  r#   r#   r$   
np_extractI  s    rt  )F)Nr   )r   )r   )r   )r   )NN)Nrh  )NF)NTFN)NT)F)r   )N)r$  )F)r   N)N(  re  Z
__future__r   r   r   r  collectionsr   enumr   	functoolsr   ZnumpyrL   Zllvmliter   Zllvmlite.llvmpy.coreZllvmpyZcorer  r	   r
   Znumbar   r   r   r   Znumba.extendingr   r   r   Znumba.numpy_supportr   r   r   Znumba.targets.imputilsr   r   r   r   Znumba.typingr   Zarrayobjr   r   r   r   Zlinalgr   r   Znumba.errorsr    r!   r%   rV  r@   rK   r	  r   rZ   r[   r-   ZIntegerLiteralro   r  rq   r   rz   r   r|   r   r~   r   r   Zstdr   r   r  r   r  r   Zargminr   Zargmaxr   r   r   r   r   r   r   r   r   r   r   r   r   r   Znanminr   Znanmaxr   r   r   r   r   Znanstdr   Znansumr   Znanprodr   Z
nancumprodr   Z	nancumsumr   r   r   r   r   r   Zptpr   r   r   r   Z_partition_w_nanr   r   r*  r   r   Zmedianr  r  r  r  r  r  r   Znanpercentiler"  Z	nanmedianr%  r.  r4  	partitionr7  r:  r?  r<  r=  rD  ZtrilrK  rL  ZtriurO  rP  rR  rW  Zediff1drb  rc  rd  rf  rg  Ztrapzrm  ro  rp  Zvanderru  Zrollrx  rz  r}  r  r  r  r  Zinterpr  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  Zcorrcoefr  r  r  r  r  r  r  r   r  Zfill_diagonalr  r  r  r  r   r  r   r   r  r  r  r  r  r  rT  r  r  r   r  r  ZnonzerorA  r  r  r  r  r  r  r  r
  r  ZAnyr  r   r  r   r  rY  r  r  r  r  r#  Z_ltZ_ler+  r,  r-  Zdigitizer5  r+   r;  r6  r=  rM  rI  Z_finfo_supportedr  Z_iinfo_supportedr  rN  rS  rZ  r[  r`  ra  rj  Z	correlatero  Zconvolverp  ra  r   rq  extractrt  r#   r#   r#   r$   <module>   s  (J^?'6
"




$2


!
7
&D_bTW
D'	
5"

	 

  :%"!&
.
!

P



?&
