U
    ,d                     @   s  d Z ddlZddlZddlZddlZddlmZ ddlm	Z	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 dd	lmZ dd
lmZ ddlmZ ejdkZedZej Z e!dZ"e!dZ#dd Z$e% Z&dZ'e(e"e'Z)e*e"e+e"e'e"e&e"gZ,e-e,Z.dd Z/dd Z0dd Z1dd Z2dd Z3dd Z4dd  Z5d!d" Z6d#d$ Z7d%d& Z8d'd( Z9d)d* Z:d+d, Z;ed-ej<d.d/ Z=ed0ej<d1d/ Z=d2d3 Z>ed4d5d6 Z?ed7ed8ed9ed:d;d6 Z?ed<ej@ej@ed=ej@ej@d>d? ZAed@edAedAej@edAej@ej@dBdC ZBdDdE ZCdFdG ZDedHejEdIdJ ZFdKdL ZGedMejEdNdO ZHedMejEejEdPdQ ZIedMejEejEejEdRdS ZJedTejEejEdUdV ZKedWejEdXdY ZLedWejEejEdZdQ ZIed[ej@ej@d\d] ZMed^ej@ej@d_d] ZMd`d] ZMedaej@ej@dbdc ZNedaej@ej@ej@ddde ZOedfej@ej@ej@dgde ZOdhdi ZPedjej@ej@dkdl ZQedmej@ednej@ednej@ej@dodl ZQdpdq ZRedrej@ej@dsdt ZSeduej@ej@dvdt ZSdwdx ZTedyej@dzd{ ZUed|ej@d}d~ ZVeded|dd~ ZVededej@edej@ej@dd ZWedej@ej@dd ZXdd ZYedej@dd ZZedej@dd Z[edej@ej@dd Z\edej@dd Z]edej@ej@dd Z^edej@ej@dd Z^dd Z_edejEej@dd Z`edej@dd Zaedej@ej@dd Zbedej@dd Zcedej@ej@dd ZdedejEejEejEdd Zeededej@edej@ej@dd Zfededej@edej@ej@dd Zgedej@dd Zhedejiej@dd Zjededej@dd Zkedej@dd Zlededej@dd ZmedÃddń Znedej@ddȄ Zoedej@ej@dd˄ Zpedej@dd΄ ZqddЄ Zre	ejsdd҄ Zte	ejjsdd҄ Zte	ejjuddՄ ZvdD ],\ZwZxeewfejyfex  ewfdd؄Zzqe	ejj{ddڄ Z{e	ejj|dd܄ Z|e	ejj}ddd߄Z}e	ejj~dddZ~e	ejjdddZe	ejjdddZdS )z6
Implement the random and np.random module functions.
    N)ir)overloadregister_jitable)Registryimpl_ret_untrackedimpl_ret_new_ref)	signature)
_helperlib)typesutilscgutils)arrayobj)glue_lowering)NumbaTypeError)      Z
randomimpl    @   c                 C   s   t t| S N)r   Constantint32_t)x r   </tmp/pip-unpacked-wheel-eu7e0c37/numba/cpython/randomimpl.py	const_int!   s    r   ip  c                 C   sT   |dkst d| }ttd}t|j||}|jd |jd |	|dS )z
    Get a pointer to the given thread-local random state
    (depending on *name*: "py" or "np").
    If the state isn't initialized, it is lazily initialized with
    system entropy.
    )pynpinternalznumba_get_%s_random_stater   ZreadnoneZnounwind)
AssertionErrorr   FunctionTypernd_state_ptr_tr   get_or_insert_functionmodule
attributesaddcall)contextbuildername	func_namefntyfnr   r   r   get_state_ptr8   s    r,   c                 C   s   t | |dS )z@
    Get a pointer to the thread-local Python random state.
    r   r,   r&   r'   r   r   r   get_py_state_ptrI   s    r/   c                 C   s   t | |dS )z?
    Get a pointer to the thread-local Numpy random state.
    r   r-   r.   r   r   r   get_np_state_ptrO   s    r0   c                 C   s   t | |dS )zB
    Get a pointer to the thread-local internal random state.
    r   r-   r.   r   r   r   get_internal_state_ptrU   s    r1   c                 C   s   t | |ddS Nr   r   gep_inboundsr'   	state_ptrr   r   r   get_index_ptr\   s    r7   c                 C   s   t | |ddS Nr      r3   r5   r   r   r   get_array_ptr_   s    r:   c                 C   s   t | |ddS )Nr      r3   r5   r   r   r   get_has_gauss_ptrb   s    r<   c                 C   s   t | |ddS )Nr   r   r3   r5   r   r   r   get_gauss_ptre   s    r=   c                 C   s8   t t  tf}t| jj|d}|jd 	d |S )z<
    Get the internal function to shuffle the MT taste.
    Znumba_rnd_shuffler   Z	nocapture)
r   r   VoidTyper    r   r!   functionr"   argsZadd_attribute)r'   r*   r+   r   r   r   get_rnd_shuffleh   s    rA   c           	   
   C   s"  t ||}||}|d|t}t||, t|}|||f |t	d| W 5 Q R X ||}t
||}|t||d|}||t	d}||| ||||t	d}|||||t	dt	d}|||||t	dt	d}||||t	d	}|S )
zB
    Get the next int32 generated by the PRNG at *state_ptr*.
    >=r   r9         l   VX:    l     _    )r7   loadicmp_unsignedN_constr   if_unlikelyrA   r%   storer   r:   r4   r$   xorlshrand_shl)	r&   r'   r6   ZidxptridxZneed_reshuffler+   Z	array_ptryr   r   r   get_next_int32s   s*    



rR   c                 C   st   | t| ||td}| t| ||td}||t}||t}|||||t	tdt	tdS )zC
    Get the next double generated by the PRNG at *state_ptr*.
          g      Ag      @C)
rM   rR   r   ZuitofpdoubleZfdivfaddfmulr   r   )r&   r'   r6   abr   r   r   get_next_double   s    
rZ   c                    s  t |jd fdd}t t td} d|} |\}}	|" ||}
  	|
t| W 5 Q R X |	r r| 
|}t }
s| 
|}  	|
t  	|tt td} || W 5 Q R X W 5 Q R X  |S )z2
    Get the next integer with width *nbits*.
    r   c                    sl     | }t }rR t|jd} | ||j} ||S  | ||jS d S r2   )	subrR   not_r   r   typerM   zextrN   )nbitsshiftrQ   maskr'   Zc32r&   is_numpyr6   r   r   get_shifted_int   s    z%get_next_int.<locals>.get_shifted_intr   <=)r   r   r]   r   Zalloca_once_valueint64_trH   if_elserK   r^   r[   rR   r$   rO   rG   )r&   r'   r6   r_   rc   rd   retZis_32bZifsmallZiflargelowhightotalr   rb   r   get_next_int   s(    
 rl   c                    sX   |j }| | t|t fdd|t|d D  }t|ft|d   }||fS )z
    Assuming a homogeneous signature (same type for result and all arguments),
    fill in the *defaults* if missing from the arguments.
    c                 3   s   | ]}t  |V  qd S r   )r   r   ).0dlltyr   r   	<genexpr>   s     z!_fill_defaults.<locals>.<genexpr>Nr9   )return_typeget_data_typetuplelenr   )r&   r'   sigr@   defaultstyr   ro   r   _fill_defaults   s
    
*ry   zrandom.seedc              	   C   s(   t | |||t| |d}t| ||j|S Nr   
_seed_implr,   r   rr   r&   r'   rv   r@   resr   r   r   	seed_impl   s
     r   znp.random.seedc              	   C   s(   t | |||t| |d}t| ||j|S Nr   r{   r}   r   r   r   r      s
     c                 C   sJ   |\}t t  ttf}t|jj|d}|	|||f | 
tjd S )NZnumba_rnd_init)r   r   r>   r    r   r   r!   r?   r"   r%   Zget_constantr
   none)r&   r'   rv   r@   r6   Z
seed_valuer*   r+   r   r   r   r|      s    r|   zrandom.randomc                 C   s(   t | |d}t| ||}t| ||j|S rz   r,   rZ   r   rr   r&   r'   rv   r@   r6   r~   r   r   r   random_impl   s    r   np.random.randomnp.random.random_samplenp.random.samplenp.random.ranfc                 C   s(   t | |d}t| ||}t| ||j|S r   r   r   r   r   r   r      s    zrandom.gausszrandom.normalvariatec                 C   s    t | |||d}t| ||j|S rz   )_gauss_implr   rr   r}   r   r   r   
gauss_impl   s    r   np.random.standard_normalnp.random.normalc                 C   s4   t | |||d\}}t| |||d}t| ||j|S )N              ?r   )ry   r   r   rr   r}   r   r   r   np_gauss_impl   s    r   c                    s    fdd}|S )Nc                     sh   d   d } d   d }| |  ||  }|dk r |dkr q@q t dt | | }||  || fS )zG
        Compute a pair of numbers on the normal distribution.
               @r   r          )mathsqrtlog)x1Zx2Zr2f_randomr   r   compute_gauss_pair  s    z,_gauss_pair_impl.<locals>.compute_gauss_pairr   )r   r   r   r   r   _gauss_pair_impl  s    r   c                 C   s>  |j }| |}t| ||}tjtjjd| }tj||dd}	t||}
t||}t	||
|}||\}}|( ||
|
|	 |td| W 5 Q R X |` | |t|tt|dd}t||d\}}|||
 |||	 |td| W 5 Q R X W 5 Q R X |\}}|||||
|	S )N)r   r   resultr(   r   r;   r   r9   )rr   rs   r,   randomr   r   alloca_oncer=   r<   Zis_truerG   rg   rK   r   compile_internalr   r   r
   UniTupleZunpack_tuplerV   rW   )r&   r'   rv   r@   staterx   rp   r6   r   rh   Z	gauss_ptrZhas_gauss_ptrZ	has_gaussZthenZ	otherwisepairfirstsecondmusigmar   r   r   r     s<    


$r   zrandom.getrandbitsc           
   	   C   s   |\}| d|td}| d|td}t|||| d}| j|t|f W 5 Q R X t| |d}t	| |||d}	t
| ||j|	S )NrB   A   ==r   z getrandbits() limited to 64 bitsr   F)rH   r   r   rJ   or_	call_convreturn_user_excOverflowErrorr,   rl   r   rr   )
r&   r'   rv   r@   r_   	too_largeZ	too_smallmsgr6   r~   r   r   r   getrandbits_impl:  s    r   c              
      sT  t  |jtd}td}tj dd}  |||   	d||8  
 
 |||}	 |	| | W 5 Q R X   	d||8   
 |||}	 |	| | W 5 Q R X  |t  	d| d}
j t|
f W 5 Q R X ttjjg}t jj|d	 }d
krt |n}  ||tjgt ttjtj dd fdd}d
kr4  	d|<\}}|  | W 5 Q R X | |  W 5 Q R X W 5 Q R X n|   
|  |S )Nr   r9   nr   <>re   zempty range for randrange()zllvm.ctlz.%sr   rc                     s~     d}   d} |   |  t dk} |} d|} || |  |  | d S )Nwhilez	while.endr   rB   )append_basic_blockbranchposition_at_endrl   truncicmp_signedZcbranchrK   )Zbbwhilebbendr   r   r'   r&   r   r_   Zrptrr   r6   rx   r   r   get_numr  s    




z _randrange_impl.<locals>.get_numr   )r,   r]   r   r   r   r   rK   r[   if_thenr   r$   rG   ZsdivrJ   r   r   
ValueErrorr   Ztrue_bitr!   r?   r"   r   r%   r   widthrg   mul)r&   r'   startstopstepr   ZzeroZoneZnptrwr   r*   r+   Znm1r   Zis_oneZ
is_not_oner   r   r   _randrange_implG  sF    


r   zrandom.randrangec                 C   sD   |\}t |jd}t |jd}t| ||||d}t| ||j|S )Nr   r9   r   r   r   r]   r   r   rr   r&   r'   rv   r@   r   r   r   r~   r   r   r   randrange_impl_1  s
    r   c                 C   s8   |\}}t |jd}t| ||||d}t| ||j|S Nr9   r   r   r&   r'   rv   r@   r   r   r   r~   r   r   r   randrange_impl_2  s    r   c                 C   s,   |\}}}t | ||||d}t| ||j|S rz   )r   r   rr   r   r   r   r   randrange_impl_3  s    
r   zrandom.randintc                 C   sD   |\}}t |jd}|||}t| ||||d}t| ||j|S r   )r   r   r]   r$   r   r   rr   r   r   r   r   randint_impl_1  s
    r   np.random.randintc                 C   sD   |\}t |jd}t |jd}t| ||||d}t| ||j|S )Nr   r9   r   r   r   r   r   r   randint_impl_2  s
    r   c                 C   s8   |\}}t |jd}t| ||||d}t| ||j|S )Nr9   r   r   r   r   r   r   r     s    zrandom.uniformc                 C   s    t | |||d}t| ||j|S rz   uniform_implr   rr   r}   r   r   r   r     s    r   np.random.uniformc                 C   s    t | |||d}t| ||j|S r   r   r}   r   r   r   r     s    c           
      C   s@   t | ||}|\}}|||}t| ||}	|||||	S r   )r,   ZfsubrZ   rV   rW   )
r&   r'   rv   r@   r   r6   rX   rY   r   r   r   r   r   r     s
    zrandom.triangularc                 C   s^   |j }|\}}t| |d}t| ||}dd }	| ||	t|fd  |||f}
t| ||j |
S )Nr   c                 S   s<   | }d}||kr"d| }|| }}||| t ||   S )N      ?r   r   r   )randvalri   rj   ucr   r   r   triangular_impl_2  s    
z,triangular_impl_2.<locals>.triangular_impl_2   )rr   r,   rZ   r   r   r   )r&   r'   rv   r@   flttyri   rj   r6   r   r   r~   r   r   r   r     s    r   c                 C   s.   |\}}}t | |||||d}t| ||j|S rz   _triangular_impl_3r   rr   )r&   r'   rv   r@   ri   rj   moder~   r   r   r   triangular_impl_3  s    
r   np.random.triangularc                 C   s.   |\}}}t | |||||d}t| ||j|S r   r   )r&   r'   rv   r@   ri   r   rj   r~   r   r   r   r     s    
c              	   C   sH   |j }t| ||}t| ||}	dd }
| ||
t|fd  |	|||fS )Nc                 S   s\   ||kr|S | }|| ||  }||krBd| }d| }|| }}||| t ||   S Nr   r   )r   ri   rj   r   r   r   r   r   r   r     s    
z-_triangular_impl_3.<locals>.triangular_impl_3rS   )rr   r,   rZ   r   r   )r&   r'   rv   ri   rj   r   r   r   r6   r   r   r   r   r   r     s    
r   zrandom.gammavariatec                 C   s"   t | |||tj}t| ||j|S r   )_gammavariate_implr   r   rr   r}   r   r   r   gammavariate_impl  s    r   np.random.standard_gammanp.random.gammac                 C   s8   t | |||d\}}t| |||tjj}t| ||j|S )Nr   )ry   r   r   r   r   rr   r}   r   r   r   r     s    c                    s^   t jt jt jt jdt j }d dd  fdd}| ||||S )Nr   g      @r         @c                    s  | dks|dkrt d| dkrЈd|  d }|   }| | } }d|  k rZdk s^q@ q@d  }|d|  | }| | }|| | }	|||  | }
|
 d|	  dks|
|	kr@|| S q@n| dkrtrd   | S  }|dkr
 }q| | S n }|   }|| }|dkrL|d|   }n|| |   } }|dkr||| d  krqn|| krqq|| S dS )	z1Gamma distribution.  Taken from CPython.
        r   z*gammavariate: alpha and beta must be > 0.0r   r   gHz>gP?r   N)r   	POST_PY38)alphabetaainvbbbcccu1u2vr   zr   r   rY   pLOG4SG_MAGICCONST_e_exp_logr   _sqrtr   r   r     sH    
 



z-_gammavariate_impl.<locals>.gammavariate_impl)r   expr   r   epir   )r&   r'   rv   r@   r   TWOPIr   r   r   r   r     s    
= r   zrandom.betavariatec                 C   s"   t | |||tj}t| ||j|S r   )_betavariate_implr   gammavariater   rr   r}   r   r   r   betavariate_implY  s    
r   np.random.betac                 C   s$   t | |||tjj}t| ||j|S r   )r   r   r   gammar   rr   r}   r   r   r   r   _  s    
c                    s    fdd}|  ||||S )Nc                    s,    | d}|dkrdS || |d  S dS )z0Beta distribution.  Taken from CPython.
        r   r   Nr   )r   r   rQ   r  r   r   r   h  s    
z+_betavariate_impl.<locals>.betavariate_impl)r   )r&   r'   rv   r@   r  r   r   r  r   r   f  s
     r   zrandom.expovariatec                    s:   t j tj  fdd}| ||||}t| ||j|S )Nc                    s    d   |  S )z7Exponential distribution.  Taken from CPython.
        r   r   )lambdr   r   r   r   expovariate_impl|  s    z*expovariate_impl.<locals>.expovariate_implr   r   r   r   r   rr   )r&   r'   rv   r@   r  r~   r   r  r   r  w  s    
 r  np.random.exponentialc                    s<   t jjtj  fdd}| ||||}t| ||j|S )Nc                    s    d   |  S r   r   )scaler  r   r   exponential_impl  s    *exponential_impl.<locals>.exponential_implr   r   r   r   r   r   rr   r&   r'   rv   r@   r	  r~   r   r  r   r	    s     r	  np.random.standard_exponentialc                    s<   t jjtj  fdd}| ||||}t| ||j|S )Nc                      s    d   S r   r   r   r  r   r   r	    s    r
  r  r  r   r  r   r	    s     np.random.lognormalc                 C   s8   t | |||d\}}t| |||tjj}t| ||j|S )Nr   )ry   _lognormvariate_implr   r   normalr   rr   r}   r   r   r   np_lognormal_impl  s
    
r  zrandom.lognormvariatec                 C   s"   t | |||tj}t| ||j|S r   )r  r   gaussr   rr   r}   r   r   r   lognormvariate_impl  s    r  c                    s$   t j  fdd}| ||||S )Nc                    s    | |S r   r   )r   r   r   _gaussr   r   r    s    z1_lognormvariate_impl.<locals>.lognormvariate_impl)r   r   r   )r&   r'   rv   r@   r  r  r   r  r   r    s     r  zrandom.paretovariatec                    s2   t j   fdd}| ||||}t| ||j|S )Nc                    s   d   }d|d|    S )z)Pareto distribution.  Taken from CPython.r   r   r   r   r   r   r   paretovariate_impl  s    
z.paretovariate_impl.<locals>.paretovariate_impl)r   r   r   rr   )r&   r'   rv   r@   r  r~   r   r   r   r    s     r  np.random.paretoc                    s4   t jj  fdd}| ||||}t| ||j|S )Nc                    s   d   }d|d|    d S )Nr   r9   r   r  r   r   r   pareto_impl  s    
z pareto_impl.<locals>.pareto_impl)r   r   r   r   rr   )r&   r'   rv   r@   r  r~   r   r   r   r    s    r  zrandom.weibullvariatec                    s:   t j tj  fdd}| ||||}t| ||j|S )Nc                    s    d  }|  | d|   S )z*Weibull distribution.  Taken from CPython.r   r   )r   r   r   r  r   r   weibullvariate_impl  s    
z0weibullvariate_impl.<locals>.weibullvariate_implr  )r&   r'   rv   r@   r  r~   r   r  r   r    s     r  np.random.weibullc                    s<   t jjtj  fdd}| ||||}t| ||j|S )Nc                    s   d  } | d|   S r   r   )r   r   r  r   r   weibull_impl  s    
z"weibull_impl.<locals>.weibull_implr  )r&   r'   rv   r@   r  r~   r   r  r   r    s
    r  zrandom.vonmisesvariatec                 C   s"   t | |||tj}t| ||j|S r   )_vonmisesvariate_implr   r   rr   r}   r   r   r   vonmisesvariate_impl  s    r  np.random.vonmisesc                 C   s$   t | |||tjj}t| ||j|S r   )r  r   r   r   rr   r}   r   r   r   r    s    c                    sN   t jt jt jt jt jd   fdd}| ||||S )Nr   c                    s   |dkr   S d| }|d||   } }| }|||  } }|d||  k sz|d| | kr.qzq.d| }|| d||   }	 }
|
dkr| |	   }n| |	   }|S )zCircular data distribution.  Taken from CPython.
        Note the algorithm in Python 2.6 and Numpy is different:
        http://bugs.python.org/issue17141
        gư>r   r   r   )r   kappasr   r   r   rn   r   qr   u3thetar   _acos_cosr   _pir   r   r   r   r    s"    
$z3_vonmisesvariate_impl.<locals>.vonmisesvariate_impl)r   r   r   cosacosr   r   )r&   r'   rv   r@   r   r  r   r%  r   r    s    ( r  np.random.binomialc                    s:   |j }tjj  fdd}| ||||}t| ||j |S )Nc                    sJ  | dk rt dd|  kr$dks.n t d|dkr:dS |dkrF| S |dk}|rZd| }d| }d}||  }|dkr|d	K }| d	L } ||  }| dksntqn| | }t| |d
t|| d   }d}d}	|dkrFd}
  }|}|
|kr||kr|	|r| |
 n|
7 }	|d8 }q||8 }|
d7 }
| |
 d | | |
|  }qq|	S )z
        Binomial distribution.  Numpy's variant of the BINV algorithm
        is used.
        (Numpy uses BTPE for n*p >= 30, though)
        r   zbinomial(): n <= 0r   r   zbinomial(): p outside of [0, 1]r   r9   gx0 r;         $@F)r   r   minr   r   )r   r   Zflippedr"  Znitersqnr   boundfinishedrk   XUZpxr   r   r   binomial_impl8  sH     

 z$binomial_impl.<locals>.binomial_impl)rr   r   r   r   r   )r&   r'   rv   r@   inttyr3  r~   r   r   r   r3  3  s
    2r3  np.random.chisquarec                 C   s(   dd }|  ||||}t| ||j|S )Nc                 S   s   dt j| d  S Nr   )r   r   standard_gamma)dfr   r   r   chisquare_implq  s    z&chisquare_impl.<locals>.chisquare_implr   r   rr   )r&   r'   rv   r@   r9  r~   r   r   r   r9  n  s    r9  np.random.fc                 C   s(   dd }|  ||||}t| ||j|S )Nc                 S   s    t j| | t j||   S r   )r   r   	chisquare)numZdenomr   r   r   f_impl{  s    zf_impl.<locals>.f_implr:  )r&   r'   rv   r@   r>  r~   r   r   r   r>  x  s    r>  np.random.geometricc                    s<   t jj |j fdd}| ||||}t| ||j|S )Nc                    s   | dks| dkrt dd|  }| dkrdd}|  }}  }||kr`||9 }||7 }|d7 }q>|S ttd   t| S d S )Nr   r   z geometric(): p outside of (0, 1]gUUUUUU?r9   )r   r   ceilr   )r   r"  r1  sumprodr2  r   r4  r   r   geometric_impl  s    
z&geometric_impl.<locals>.geometric_implr   r   rr   r   r   )r&   r'   rv   r@   rD  r~   r   rC  r   rD    s
    rD  np.random.gumbelc                    s<   t jjtj  fdd}| ||||}t| ||j|S )Nc                    s    d  }| |  |   S r   r   locr  r2  r  r   r   gumbel_impl  s    
z gumbel_impl.<locals>.gumbel_implr  )r&   r'   rv   r@   rI  r~   r   r  r   rI    s
    rI  np.random.hypergeometricc                    s<   t jjtj  fdd}| ||||}t| ||j|S )Nc                    sz   ||  | }t t|| }|}|}|dkrV|dkrV|  |||   8 }|d8 }q"t|| }| |krr|| S |S dS )z'Numpy's algorithm for hypergeometric().r   r   r9   N)floatr-  int)ZngoodZnbadZnsamplesd1Zd2YKZZ_floorr   r   r   hypergeometric_impl  s    
z0hypergeometric_impl.<locals>.hypergeometric_impl)r   r   r   floorr   r   rr   )r&   r'   rv   r@   rR  r~   r   rQ  r   rR    s
    rR  np.random.laplacec                    sP   t jjtj  fdd}t| |||d\}}| ||||}t| ||j|S )Nc                    s>    }|dk r"| | ||   S | | d| |   S d S )Nr   r   r   rG  r  r   r   laplace_impl  s    z"laplace_impl.<locals>.laplace_implr   r   r   r   r   ry   r   r   rr   )r&   r'   rv   r@   rU  r~   r   r  r   rU    s    rU  np.random.logisticc                    sP   t jjtj  fdd}t| |||d\}}| ||||}t| ||j|S )Nc                    s    }| | |d|    S r   r   rG  r  r   r   logistic_impl  s    z$logistic_impl.<locals>.logistic_implr   rV  )r&   r'   rv   r@   rX  r~   r   r  r   rX    s    rX  np.random.logseriesc                    sL   |j tjjtjtj  fdd}| ||||}t| ||j |S )Nc                    s   | dks| dkrt dd|  } }|| kr6dS  }d ||  }||| krpd||  S ||kr|dS dS q$dS )z"Numpy's algorithm for logseries().r   r   z logseries(): p outside of (0, 1]r9   r;   Nr   )r   r   Vr2  r"  r   r   r   r4  r   r   logseries_impl  s    z&logseries_impl.<locals>.logseries_impl)rr   r   r   r   r   r   r   r   )r&   r'   rv   r@   r]  r~   r   r\  r   r]    s    r]  np.random.negative_binomialc                    s>   t jj t jj fdd}| ||||}t| ||j|S )Nc                    sB   | dkrt d|dk s |dkr(t d | d| | }|S )Nr   znegative_binomial(): n <= 0r   r   z(negative_binomial(): p outside of [0, 1]rZ  )r   r   rN  Z_gammaZ_poissonr   r   negative_binomial_impl
  s    z6negative_binomial_impl.<locals>.negative_binomial_impl)r   r   r  poissonr   r   rr   )r&   r'   rv   r@   r`  r~   r   r_  r   r`    s
    r`  np.random.poissonc              	      sX  t | |}tj|tdd}|d}|d}t|dkr|\}|d|tt	d}	|
|	N tttt	f}
t|jj|
d}||||f}||| || W 5 Q R X || || tjjtj  fd	d
}t|dkrt|jtj}tt	df}| ||||}||| || || ||}t| ||j|S )Nrh   r   bbcontr   r9   rB   r,  Znumba_poisson_ptrsc                    sV   | dk rt d| dkrdS  |  }d}d} }||9 }||krH|S |d7 }q.dS )a+  Numpy's algorithm for poisson() on small *lam*.

        This method is invoked only if the parameter lambda of the
        distribution is small ( < 10 ). The algorithm used is described
        in "Knuth, D. 1969. 'Seminumerical Algorithms. The Art of
        Computer Programming' vol 2.
        r   zpoisson(): lambda < 0r   r   r9   NrZ  )lamZenlamr1  rB  r2  r   r   r   r   poisson_impl2  s    
z"poisson_impl.<locals>.poisson_implr   r   )r0   r   r   rf   r   ru   Zfcmp_orderedr   r   rU   r   r   r    r!   r?   r"   r%   rK   r   r   r   r   r   r   r   rr   r
   Zfloat64r   rG   r   )r&   r'   rv   r@   r6   Zretptrrc  r   rd  Zbig_lamr*   r+   rh   rf  r~   r   re  r   rf    s:    







rf  np.random.powerc                 C   s(   dd }|  ||||}t| ||j|S )Nc                 S   s2   | dkrt dtdttj   d|  S )Nr   zpower(): a <= 0r9   r   )r   r   powr   r   r   Zstandard_exponentialrX   r   r   r   
power_implW  s
    zpower_impl.<locals>.power_implr:  )r&   r'   rv   r@   rj  r~   r   r   r   rj  T  s    rj  np.random.rayleighc                    sH   t jj  fdd}t| |||d\}}| ||||}t| ||j|S )Nc                    s.   | dkrt d| tdtd     S )Nr   zrayleigh(): mode <= 0r   r   )r   r   r   r   )r   r   r   r   rayleigh_implf  s    z$rayleigh_impl.<locals>.rayleigh_impl)r   )r   r   ry   r   r   rr   )r&   r'   rv   r@   rl  r~   r   r   r   rl  a  s
    rl  np.random.standard_cauchyc                    s4   t jj  fdd}| ||||}t| ||j|S )Nc                      s        S r   r   r   r  r   r   cauchy_implt  s    z cauchy_impl.<locals>.cauchy_impl)r   r   standard_normalr   r   rr   )r&   r'   rv   r@   ro  r~   r   rn  r   ro  p  s    ro  np.random.standard_tc                 C   s(   dd }|  ||||}t| ||j|S )Nc                 S   s:   t j }t j| d }t| d | t| }|S r6  )r   r   rp  r7  r   r   )r8  NGr1  r   r   r   standard_t_impl~  s    
z(standard_t_impl.<locals>.standard_t_implr:  )r&   r'   rv   r@   rt  r~   r   r   r   rt  {  s    rt  np.random.waldc                 C   s(   dd }|  ||||}t| ||j|S )Nc                 S   s   | dkrt d|dkr t d| d|  }tj }| | | }| ||td| | ||     }tj }|| | |  kr|S | |  | S d S )Nr   zwald(): mean <= 0zwald(): scale <= 0r   r   )r   r   r   rp  r   r   )Zmeanr  Zmu_2lrN  r1  r2  r   r   r   	wald_impl  s    
&
zwald_impl.<locals>.wald_implr:  )r&   r'   rv   r@   rv  r~   r   r   r   rv    s    rv  np.random.zipfc                    s<   t jj |j fdd}| ||||}t| ||j|S )Nc                    s   | dkrt d| d }d| }d   }  }t|d|  }dd|  | }|dkr || |d  |d  || kr |S q d S )Nr   zzipf(): a <= 1r   g      r9   )r   r   rS  )rX   Zam1rY   r2  r[  r1  TrC  r   r   	zipf_impl  s    
(zzipf_impl.<locals>.zipf_implrE  )r&   r'   rv   r@   ry  r~   r   rC  r   ry    s
    ry  c                    s\   t | tjstd|dkr&tjj n|dkr4tj | jdkrL fdd}n fdd}|S )Nz1The argument to shuffle() should be a buffer typer   r   r9   c                    sJ   | j d d }|dkrF |d }| | | |  | |< | |< |d8 }qd S r8   )shapearrijrandr   r   impl  s
    zdo_shuffle_impl.<locals>.implc                    sV   | j d d }|dkrR |d }t| | t| |  | |< | |< |d8 }qd S r8   )rz  r   copyr{  r  r   r   r    s
    &)	
isinstancer
   ZBuffer	TypeErrorr   r   randint	randrangendim)r|  rngr  r   r  r   do_shuffle_impl  s    

r  c                 C   s
   t | dS rz   r  r|  r   r   r   shuffle_impl  s    r  c                 C   s
   t | dS r   r  r  r   r   r   r    s    c                 C   s4   t | tjrdd }nt | tjr,dd }nd }|S )Nc                 S   s   t | }t j| |S r   )r   aranger   shuffle)r   rQ   r   r   r   permutation_impl  s    
z*permutation_impl.<locals>.permutation_implc                 S   s   |   }tj| |S r   )r  r   r   r  )r   Zarr_copyr   r   r   r    s    )r  r
   IntegerArray)r   r  r   r   r   r    s    

r  )#)r   r   )r+  r   )r5  r;   )r  r;   )r;  r   )r   r   )r?  r;   )rF  r   )rJ  r   )rT  r   )rW  r   )r  r   )rY  r;   )r^  r   )r   r   )r  r;   )rb  r;   )rg  r;   )r   r9   )r   r9   )r   r9   )r   r9   )r   r   )rk  r;   )rm  r9   )r  r9   )r   r;   )r   r9   )rq  r;   )r   r   )r   r   )r  r   )ru  r   )r  r;   )rw  r;   c              	   C   s  |j }|j}t|f|jd d  }|d d }t| ||jd |d }	t| |||	}
|d^ }}|ddgksztt	t
j|}| j|}|| j|ji }| ||}t||
j4}|||}t||
j|j}t| |||| W 5 Q R X t| ||j |
 S )N.r   r   )rr   dtyper   r@   r   Z_parse_shapeZ_empty_nd_implsplitr   getattrr   r   Ztyping_contextZresolve_value_typeZget_call_typeZget_functionr   Z	for_rangeZnitemsZgepdataindexZ
store_itemr   Z	_getvalue)r&   r'   rv   r@   
typing_keyZarrtyr  Z
scalar_sigZscalar_argsZshapesr|  modfnameZnp_funcr*   Zresolved_sigZscalar_implZloopvalptrr   r   r   
random_arr  s(     
r  c                  G   s"   t | dkrdd }ndd }|S )Nr   c                  W   s
   t j S r   r   r   sizer   r   r   	rand_impl4  s    zrand.<locals>.rand_implc                  W   s   t j| S r   r  r  r   r   r   r  9  s    ru   )r  r  r   r   r   r  0  s    
r  c                  G   s"   t | dkrdd }ndd }|S )Nr   c                  W   s
   t j S r   r   r   rp  r  r   r   r   
randn_implB  s    zrandn.<locals>.randn_implc                  W   s   t j| S r   r  r  r   r   r   r  G  s    r  )r  r  r   r   r   randn>  s    
r  Tc                    s   t | tjrF| jdkst| j tdd tdd }tdd nFt | tjr~tj	 tdd td	d }td
d nt
d| f |d tjfkrdfdd	}nd fdd	}|S )Nr9   c                 S   s   t | S r   r  ri  r   r   r   get_source_sizeX  s    zchoice.<locals>.get_source_sizec                 S   s   |   S r   )r  ri  r   r   r   copy_source\  s    zchoice.<locals>.copy_sourcec                 S   s   | | S r   r   rX   Za_ir   r   r   getitem`  s    zchoice.<locals>.getitemc                 S   s   | S r   r   ri  r   r   r   r  h  s    c                 S   s
   t | S r   )r   r  ri  r   r   r   r  l  s    c                 S   s   |S r   r   r  r   r   r   r  p  s    z@np.random.choice() first argument should be int or array, got %sTc                    s     | }t jd|}| |S )zs
            choice() implementation returning a single sample
            (note *replace* is ignored)
            r   )r   r   r  )rX   r  replacer   r}  )r  r  r   r   choice_imply  s    zchoice.<locals>.choice_implc           	         s   | }|rPt | }|j}tt|D ] }t jd|}| |||< q*|S t | }|j|krntdt j	| }|j}tt|D ]}|| ||< q|S dS )zO
            choice() implementation returning an array of samples
            r   z@Cannot take a larger sample than population when 'replace=False'N)
r   emptyflatrangeru   r   r  r  r   permutation)	rX   r  r  r   outflr}  r~  Z
permuted_ar  r  r  r   r   r    s     
)NT)NT)r  r
   r  r  r   r  r   r  r   intpr  r   )rX   r  r  r  r  r   r  r   choiceP  s0    




r  c                    s   t j tdd t| tjs,td| f t|tjtjfsLtd|f |d tj	fkrld
 fdd	}nJt|tjrd fdd	}n,t|tj
rd fdd	}ntd	|f |S )Nc                 S   s   |j }|j}t|}td||D ]z}d}| }td|d D ]F}	||	 }
tj||
|  }|||	 < ||8 }|dkrx q||
8 }q:|dkr |||| d < q d S )Nr   r   r9   )r  r  ru   r  r   r   Zbinomial)r   pvalsr  r  szplenr}  Zp_sumZn_experimentsr~  Zp_jZn_jr   r   r   multinomial_inner  s    
z&multinomial.<locals>.multinomial_innerz7np.random.multinomial(): n should be an integer, got %szEnp.random.multinomial(): pvals should be an array or sequence, got %sc                    s    t t| }| || |S )z5
            multinomial(..., size=None)
            r   zerosru   r   r  r  r  r  r  r   r   multinomial_impl  s    z%multinomial.<locals>.multinomial_implc                    s$   t |t|f }| || |S )z4
            multinomial(..., size=int)
            r  r  r  r   r   r    s    c                    s&   t |t|f  }| || |S )z6
            multinomial(..., size=tuple)
            r  r  r  r   r   r    s    zDnp.random.multinomial(): size should be int or tuple or None, got %s)N)N)N)r   r  r   r  r
   r  r  Sequencer  r   Z	BaseTuple)r   r  r  r  r   r  r   multinomial  s*    
	r  c                    s   t dd  t| tjtjfs,td| f |d tjfkrJd	 fdd	}nRt|tjrfd
 fdd	}n6t|tjrt|j	tjrd fdd	}ntd| |S )Nc           
      S   s   t | D ]}|dkrtdqt| }|j}|j}td||D ]j}d}t| D ]2\}}	tj	|	d||| < ||||  
 7 }qNt| D ]\}}	|||   |  < qq>d S )Nr   zdirichlet: alpha must be > 0.0r9   )iterr   ru   r  r  r  	enumerater   r   r  item)
r   r  Za_valZa_lenr  r  r}  Znormkr   r   r   r   dirichlet_arr  s    
z dirichlet.<locals>.dirichlet_arrzCnp.random.dirichlet(): alpha should be an array or sequence, got %sc                    s   t t| } | | |S r   r   r  ru   r   r  r  r  r   r   dirichlet_impl  s    
z!dirichlet.<locals>.dirichlet_implc                    s    t |t| f} | | |S )z2
            dirichlet(..., size=int)
            r  r  r  r   r   r    s    
c                    s"   t |t| f } | | |S )z4
            dirichlet(..., size=tuple)
            r  r  r  r   r   r  &  s    
zJnp.random.dirichlet(): size should be int or tuple of ints or None, got %s)N)N)N)
r   r  r
   r  r  r   r   r  r   r  )r   r  r  r   r  r   	dirichlet  s(    
	r  c                    s   t dd t dd  |d tjfkr8d	 fdd	}nDt|tjs^t|tjrpt|jtjrpd
 fdd	}ntd| |S )Nc                 S   s$   | dkrt d|dk r t dd S )Nr   zdf <= 0znonc < 0rZ  )r8  noncr   r   r   validate_input<  s    z,noncentral_chisquare.<locals>.validate_inputc                 S   sp   t |rt jS d| k rHt j| d }t j t | }|||  S t j|d }t j| d|  S d S )Nr9   r   r;   )r   isnannanr   r<  rp  r   ra  )r8  r  Zchi2r   r}  r   r   r   noncentral_chisquare_singleC  s    
z9noncentral_chisquare.<locals>.noncentral_chisquare_singlec                    s   | |  | |S r   r   )r8  r  r  r  r  r   r   noncentral_chisquare_implU  s    
z7noncentral_chisquare.<locals>.noncentral_chisquare_implc                    s<   | | t |}|j}t|jD ]} | |||< q$|S r   )r   r  r  r  r  )r8  r  r  r  Zout_flatrP   r  r   r   r  ]  s    

zUnp.random.noncentral_chisquare(): size should be int or tuple of ints or None, got %s)N)N)r   r
   r   r  r  r   r  r   )r8  r  r  r  r   r  r   noncentral_chisquare9  s$    


	r  )NT)N)N)N)__doc__r   osr   Znumpyr   Zllvmliter   Znumba.core.extendingr   r   Znumba.core.imputilsr   r   r   Znumba.core.typingr   Znumbar	   Z
numba.corer
   r   r   Znumba.npr   Znumba.core.overload_gluer   Znumba.core.errorsr   Z	PYVERSIONr   registrylowerZIntTyper   rf   r   Z
DoubleTyperU   rr  r   rI   ZLiteralStructTypeZ	ArrayTypeZrnd_state_tZPointerTyper    r,   r/   r0   r1   r7   r:   r<   r=   rA   rR   rZ   rl   ry   Zuint32r   r|   r   ZFloatr   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  r3  r9  r>  rD  rI  rR  rU  rX  r]  Zint64r`  rf  rj  rl  ro  rt  rv  ry  r  r  r  r  r  r  arityAnyr  r  r  r  r  r  r  r   r   r   r   <module>   s  




)





$

F


 








 



K
 





 





 


 
 
4
:

	




 






<














&




V
O
A
