o
    8ήc                     @   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ewgejyfex R  ewfdd؄Zzqe	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)      
randomimpl    @   c                 C   s   t t| S N)r   Constantint32_t)x r   ?/tmp/pip-target-vg8gfxp4/lib/python/numba/cpython/randomimpl.py	const_int!      r   ip  c                 C   sT   |dv sJ 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   readnonenounwind)	r   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      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      r3   c                 C   r0   )z?
    Get a pointer to the thread-local Numpy random state.
    r   r1   r2   r   r   r   get_np_state_ptrO   r4   r5   c                 C   r0   )zB
    Get a pointer to the thread-local internal random state.
    r   r1   r2   r   r   r   get_internal_state_ptrU   r4   r6   c                 C   s   t | |ddS Nr   r   gep_inboundsr*   	state_ptrr   r   r   get_index_ptr\      r<   c                 C      t | |ddS Nr      r8   r:   r   r   r   get_array_ptr_   r=   rA   c                 C   r>   )Nr      r8   r:   r   r   r   get_has_gauss_ptrb   r=   rC   c                 C   r>   )Nr   r   r8   r:   r   r   r   get_gauss_ptre   r=   rD   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.
    numba_rnd_shuffler   	nocapture)
r   r"   VoidTyper#   r   r$   functionr%   argsadd_attribute)r*   r-   r.   r   r   r   get_rnd_shuffleh   s   rK   c           	   
   C   s6  t ||}||}|d|t}t|| t|}|||f |t	d| W d   n1 s5w   Y  ||}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   Nr@         l   VX:    l     _    )r<   loadicmp_unsignedN_constr   if_unlikelyrK   r(   storer   rA   r9   r'   xorlshrand_shl)	r)   r*   r;   idxptridxneed_reshuffler.   	array_ptryr   r   r   get_next_int32s   s,   



r_   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)
rW   r_   r   uitofpdoublefdivfaddfmulr   r   )r)   r*   r;   abr   r   r   get_next_double   s   
ri   c                    sL  t |jd fdd}t t td} d|} |r\}}	| ||}
  	|
t| W d   n1 sEw   Y  |	> rW| 
|}t }
sg| 
|}  	|
t  	|tt td} || W d   n1 sw   Y  W d   n1 sw   Y   |S )z2
    Get the next integer with width *nbits*.
    r   c                    sh     | }t }r) t|jd} | ||j} ||S  | ||jS r7   )	subr_   not_r   r   typerW   zextrX   )nbitsshiftr^   maskr*   c32r)   is_numpyr;   r   r   get_shifted_int   s   z%get_next_int.<locals>.get_shifted_intr   <=N)r   r   rl   r   alloca_once_valueint64_trR   if_elserU   rm   rj   r_   r'   rY   rQ   )r)   r*   r;   rn   rs   rt   retis_32bifsmalliflargelowhightotalr   rq   r   get_next_int   s0   

r   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>Nr@   )return_typeget_data_typetuplelenr   )r)   r*   sigrI   defaultstyr   r   r   _fill_defaults   s
   
*r   zrandom.seedc              	   C   (   t | |||t| |d}t| ||j|S Nr   
_seed_implr/   r   r   r)   r*   r   rI   resr   r   r   	seed_impl      r   znp.random.seedc              	   C   r   Nr   r   r   r   r   r   r      r   c                 C   sJ   |\}t t  ttf}t|jj|d}|	|||f | 
tjd S )Nnumba_rnd_init)r   r"   rG   r#   r   r   r$   rH   r%   r(   get_constantr
   none)r)   r*   r   rI   r;   
seed_valuer-   r.   r   r   r   r      s   r   zrandom.randomc                 C   (   t | |d}t| ||}t| ||j|S r   r/   ri   r   r   r)   r*   r   rI   r;   r   r   r   r   random_impl   s   r   np.random.randomnp.random.random_samplenp.random.samplenp.random.ranfc                 C   r   r   r   r   r   r   r   r      s   zrandom.gausszrandom.normalvariatec                 C       t | |||d}t| ||j|S r   )_gauss_implr   r   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   )r   r   r   r   r   r   r   r   np_gauss_impl   s   r   c                    s    fdd}|S )Nc                     sj   	 d   d } d   d }| |  ||  }|dk r |dkr nqt dt | | }||  || fS )zG
        Compute a pair of numbers on the normal distribution.
        T       @r   r          )mathsqrtlog)x1x2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   sz  |j }| |}t| ||}tjtjjd| }tj||dd}	t||}
t||}t	||
|}||l\}}| ||
|
|	 |td| W d    n1 sYw   Y  |5 | |t|tt|dd}t||d\}}|||
 |||	 |td| W d    n1 sw   Y  W d    n1 sw   Y  |\}}|||||
|	S )N)r   r   resultr+   r   rB   r   r@   )r   r   r/   randomr   r   alloca_oncerD   rC   is_truerQ   rx   rU   r   compile_internalr   r   r
   UniTupleunpack_tuplere   rf   )r)   r*   r   rI   stater   r   r;   r   ry   	gauss_ptrhas_gauss_ptr	has_gaussthen	otherwisepairfirstsecondmusigmar   r   r   r     sD   


r   zrandom.getrandbitsc           
      C   s   |\}| d|td}| d|td}t|||| d}| j|t|f W d    n1 s5w   Y  t| |d}t	| |||d}	t
| ||j|	S )NrL   A   ==r   z getrandbits() limited to 64 bitsr   F)rR   r   r   rT   or_	call_convreturn_user_excOverflowErrorr/   r   r   r   )
r)   r*   r   rI   rn   	too_large	too_smallmsgr;   r   r   r   r   getrandbits_impl:  s   r   c              	      s  t  |jtd}td}tj dd}  |||   	d||!  
 
 |||}	 |	| | W d    n1 sUw   Y    	d||!   
 |||}	 |	| | W d    n1 sw   Y   |t  	d| d}
j t|
f W d    n1 sw   Y  ttjjg}t jj|d	 }d
kr׈ |n}  ||tjgt ttjtj dd fdd}d
krX  	d|9\}}|  | W d    n	1 s,w   Y  | |  W d    n	1 sBw   Y  W d    n	1 sRw   Y  n|   
|  |S )Nr   r@   nr   <>ru   zempty range for randrange()zllvm.ctlz.%sr   rc                     s~     d}   d} |   |  t dk} |} d|} || |  |  | d S )Nwhilez	while.endr   rL   )append_basic_blockbranchposition_at_endr   truncicmp_signedcbranchrU   )bbwhilebbendr   r   r*   r)   r   rn   rptrr   r;   r   r   r   get_numr  s   




z _randrange_impl.<locals>.get_numr   )r/   rl   r   r   r   r   rU   rj   if_thenr   r'   rQ   sdivrT   r   r   
ValueErrorr"   true_bitr$   rH   r%   r   r(   r   widthrx   mul)r)   r*   startstopstepr   zeroonenptrwr   r-   r.   nm1r   is_one
is_not_oner   r   r   _randrange_implG  sV   


r   zrandom.randrangec                 C   D   |\}t |jd}t |jd}t| ||||d}t| ||j|S )Nr   r@   r   r   r   rl   r   r   r   r)   r*   r   rI   r   r   r   r   r   r   r   randrange_impl_1  
   r   c                 C   8   |\}}t |jd}t| ||||d}t| ||j|S Nr@   r   r   r)   r*   r   rI   r   r   r   r   r   r   r   randrange_impl_2     r   c                 C   s,   |\}}}t | ||||d}t| ||j|S r   )r   r   r   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   rl   r'   r   r   r   r   r   r   r   randint_impl_1  s
   r  np.random.randintc                 C   r   )Nr   r@   r   r   r   r   r   r   randint_impl_2  r   r  c                 C   r   )Nr@   r   r   r   r   r   r   r     r   zrandom.uniformc                 C   r   r   uniform_implr   r   r   r   r   r   r       r  np.random.uniformc                 C   r   r   r  r   r   r   r   r    r  c           
      C   s@   t | ||}|\}}|||}t| ||}	|||||	S r   )r/   fsubri   re   rf   )
r)   r*   r   rI   r   r;   rg   rh   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   )randvalr}   r~   ucr   r   r   triangular_impl_2  s   
z,triangular_impl_2.<locals>.triangular_impl_2   )r   r/   ri   r   r   r   )r)   r*   r   rI   flttyr}   r~   r;   r  r  r   r   r   r   r    s   r  c                 C   s.   |\}}}t | |||||d}t| ||j|S r   _triangular_impl_3r   r   )r)   r*   r   rI   r}   r~   moder   r   r   r   triangular_impl_3  s   
r  np.random.triangularc                 C   s.   |\}}}t | |||||d}t| ||j|S r   r  )r)   r*   r   rI   r}   r  r~   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r!d| }d| }||}}||| t ||   S Nr   r  )r  r}   r~   r  r  r  r   r   r   r    s   
z-_triangular_impl_3.<locals>.triangular_impl_3r`   )r   r/   ri   r   r   )r)   r*   r   r}   r~   r  r   r  r;   r  r  r   r   r   r    s   
r  zrandom.gammavariatec                 C   "   t | |||tj}t| ||j|S r   )_gammavariate_implr   r   r   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  )r   r  r   r   r   r   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rhd|  d }|   }| | }	  }d|  k r.dk s0n q d  }|d|  | }| | }|| | }	|||  | }
|
 d|	  dksc|
|	krg|| S q!| dkrtrxd   | S  }|dkr }|dks| | S 	  }|   }|| }|dkr|d|   }n	|| |   } }|dkr||| d  kr	 || S n|| kr	 || S q)	z1Gamma distribution.  Taken from CPython.
        r   z*gammavariate: alpha and beta must be > 0.0r   r   r@   gHz>gP?r  )r   	POST_PY38)alphabetaainvbbbcccu1u2vr   zr   r  rh   pLOG4SG_MAGICCONST_e_exp_logr   _sqrtr   r   r    sV   
 z-_gammavariate_impl.<locals>.gammavariate_impl)r   expr   r   epir   )r)   r*   r   rI   r   TWOPIr  r   r)  r   r    s   
=r  zrandom.betavariatec                 C   "   t | |||tj}t| ||j|S r   )_betavariate_implr   gammavariater   r   r   r   r   r   betavariate_implY  s   
r7  np.random.betac                 C   s$   t | |||tjj}t| ||j|S r   )r5  r   r   gammar   r   r   r   r   r   r7  _  s   
c                    s    fdd}|  ||||S )Nc                    s(    | d}|dkrdS || |d  S )z0Beta distribution.  Taken from CPython.
        r   r   r   )r  r   r^   r9  r   r   r7  h  s   
z+_betavariate_impl.<locals>.betavariate_impl)r   )r)   r*   r   rI   r9  r7  r   r:  r   r5  f  s   r5  zrandom.expovariatec                    :   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   r   )r)   r*   r   rI   r>  r   r   r=  r   r>  w  s   
r>  np.random.exponentialc                    <   t jjtj  fdd}| ||||}t| ||j|S )Nc                    s    d   |  S r  r   )scaler=  r   r   exponential_impl     *exponential_impl.<locals>.exponential_implr   r   r   r   r   r   r   r)   r*   r   rI   rC  r   r   r=  r   rC    s   rC  np.random.standard_exponentialc                    rA  )Nc                      s    d   S r  r   r   r=  r   r   rC    r=   rE  rF  rG  r   r=  r   rC    s   np.random.lognormalc                 C   s8   t | |||d\}}t| |||tjj}t| ||j|S )Nr   )r   _lognormvariate_implr   r   normalr   r   r   r   r   r   np_lognormal_impl  s
   
rL  zrandom.lognormvariatec                 C   r4  r   )rJ  r   gaussr   r   r   r   r   r   lognormvariate_impl     rN  c                    s$   t j  fdd}| ||||S )Nc                    s    | |S r   r   )r   r   r-  _gaussr   r   rN    s   z1_lognormvariate_impl.<locals>.lognormvariate_impl)r   r0  r   )r)   r*   r   rI   rQ  rN  r   rP  r   rJ    s
   rJ  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   r   )r)   r*   r   rI   rS  r   r   r   r   rS    s   rS  np.random.paretoc                    s4   t jj  fdd}| ||||}t| ||j|S )Nc                    s   d   }d|d|    d S )Nr   r@   r   rR  r   r   r   pareto_impl  s   
z pareto_impl.<locals>.pareto_impl)r   r   r   r   r   )r)   r*   r   rI   rU  r   r   r   r   rU    s   rU  zrandom.weibullvariatec                    r;  )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*   r   rI   rV  r   r   r=  r   rV    s   rV  np.random.weibullc                    rA  )Nc                    s   d  } | d|   S r  r   )r   r  r=  r   r   weibull_impl  s   
z"weibull_impl.<locals>.weibull_implrF  )r)   r*   r   rI   rX  r   r   r=  r   rX    s
   rX  zrandom.vonmisesvariatec                 C   r  r   )_vonmisesvariate_implr   r   r   r   r   r   r   vonmisesvariate_impl  rO  rZ  np.random.vonmisesc                 C   s$   t | |||tjj}t| ||j|S r   )rY  r   r   r   r   r   r   r   r   rZ    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 s<|d| | kr=nqd| }|| d||   }	 }
|
dkr]| |	   }|S | |	   }|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'  r   r%  qr   u3thetar3  _acos_cosr-  _pir   r/  r   r   rZ    s(   
$	z3_vonmisesvariate_impl.<locals>.vonmisesvariate_impl)r   r0  r   cosacosr2  r   )r)   r*   r   rI   r   rZ  r   ra  r   rY    s   (rY  np.random.binomialc                    s:   |j }tjj  fdd}| ||||}t| ||j |S )Nc                    s\  | dk rt dd|  krdkst d t d|dkr dS |dkr&| S |dk}|r0d| }d| }d}||  }|dkrT|d	K }| d	L } ||  }| dksPJ |dks>| | }t| |d
t|| d   }d}d}	|dkrd}
  }|}|
|kr||kr|	|r| |
 n|
7 }	|d8 }n||8 }|
d7 }
| |
 d | | |
|  }|
|ks{|dksp|	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
  r@   gx0 rB         $@F)r   minr   r   )r   r(  flippedr^  nitersqnr   boundfinishedr   XUpxr   r   r   binomial_impl8  sR    z$binomial_impl.<locals>.binomial_impl)r   r   r   r   r   )r)   r*   r   rI   inttyrr  r   r   r   r   rr  3  s
   2rr  np.random.chisquarec                 C   (   dd }|  ||||}t| ||j|S )Nc                 S   s   dt j| d  S Nr   )r   r   standard_gamma)dfr   r   r   chisquare_implq  rD  z&chisquare_impl.<locals>.chisquare_implr   r   r   )r)   r*   r   rI   ry  r   r   r   r   ry  n  s   ry  np.random.fc                 C   ru  )Nc                 S   s    t j| | t j||   S r   )r   r   	chisquare)numdenomr   r   r   f_impl{  s   zf_impl.<locals>.f_implrz  )r)   r*   r   rI   r  r   r   r   r   r  x  s   r  np.random.geometricc                    <   t jj |j fdd}| ||||}t| ||j|S )Nc                    s   | dks| dkrt dd|  }| dkr5d}|  }}  }||kr3||9 }||7 }|d7 }||ks#|S ttd   t| S )Nr   r   z geometric(): p outside of (0, 1]gUUUUUU?r@   )r   r   ceilr   )r(  r^  ro  sumprodrp  r   rs  r   r   geometric_impl  s    z&geometric_impl.<locals>.geometric_implr   r   r   r   r   )r)   r*   r   rI   r  r   r   r  r   r    s
   r  np.random.gumbelc                    rA  )Nc                    s    d  }| |  |   S r  r   locrB  rp  r=  r   r   gumbel_impl  s   
z gumbel_impl.<locals>.gumbel_implrF  )r)   r*   r   rI   r  r   r   r=  r   r    s
   r  np.random.hypergeometricc                    rA  )Nc                    s   ||  | }t t|| }|}|}|dkr2|dkr2|  |||   8 }|d8 }|dkr2|dkst|| }| |kr@|| S |S )z'Numpy's algorithm for hypergeometric().r   r   r@   )floatri  int)ngoodnbadnsamplesd1d2YKZ_floorr   r   r   hypergeometric_impl  s   z0hypergeometric_impl.<locals>.hypergeometric_impl)r   r   r   floorr   r   r   )r)   r*   r   rI   r  r   r   r  r   r    s
   r  np.random.laplacec                    P   t jjtj  fdd}t| |||d\}}| ||||}t| ||j|S )Nc                    s:    }|dk r| | ||   S | | d| |   S )Nr
  r   r   r  r=  r   r   laplace_impl  s   z"laplace_impl.<locals>.laplace_implr   r   r   r   r   r   r   r   r   )r)   r*   r   rI   r  r   r   r=  r   r    s   r  np.random.logisticc                    r  )Nc                    s    }| | |d|    S r  r   r  r=  r   r   logistic_impl  s   z$logistic_impl.<locals>.logistic_implr   r  )r)   r*   r   rI   r  r   r   r=  r   r    s   r  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rdS  }d ||  }||| kr9d||  S ||kr?dS dS )z"Numpy's algorithm for logseries().r   r   z logseries(): p outside of (0, 1]r@   rB   r   )r(  r   Vrp  r^  r-  r.  r   rs  r   r   logseries_impl  s   z&logseries_impl.<locals>.logseries_impl)r   r   r   r   r   r0  r   r   )r)   r*   r   rI   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]r  )r   r(  r  _gamma_poissonr   r   negative_binomial_impl
  s   z6negative_binomial_impl.<locals>.negative_binomial_impl)r   r   r9  poissonr   r   r   )r)   r*   r   rI   r  r   r   r  r   r    s
   r  np.random.poissonc                    sj  t | |}tj|tdd}|d}|d}t|dkrd|\}|d|tt	d}	|
|	, tttt	f}
t|jj|
d}||||f}||| || W d    n1 s_w   Y  || || tjjtj  fd	d
}t|dkrt|jtj}tt	df}| ||||}||| || || ||}t| ||j|S )Nry   r   bbcontr   r@   rL   rh  numba_poisson_ptrsc                    sT   | dk rt d| dkrdS  |  }d}d}	  }||9 }||kr%|S |d7 }q)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   r@   r  )lamenlamro  r  rp  r-  r   r   r   poisson_impl2  s   
z"poisson_impl.<locals>.poisson_implr   r   )r5   r   r   rw   r   r   fcmp_orderedr   r   rc   r   r"   r#   r$   rH   r%   r(   rU   r   r   r   r   r   r0  r   r   r
   float64r   rQ   r   )r)   r*   r   rI   r;   retptrr  r   r  big_lamr-   r.   ry   r  r   r   r  r   r    s<   








r  np.random.powerc                 C   ru  )Nc                 S   s2   | dkrt dtdttj   d|  S )Nr   zpower(): a <= 0r@   r   )r   r   powr0  r   r   standard_exponentialrg   r   r   r   
power_implW  s
   zpower_impl.<locals>.power_implrz  )r)   r*   r   rI   r  r   r   r   r   r  T     r  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   r   r   r   r   )r)   r*   r   rI   r  r   r   r   r   r  a  s
   r  np.random.standard_cauchyc                    s4   t jj  fdd}| ||||}t| ||j|S )Nc                      s        S r   r   r   rQ  r   r   cauchy_implt  r   z cauchy_impl.<locals>.cauchy_impl)r   r   standard_normalr   r   r   )r)   r*   r   rI   r  r   r   r  r   r  p  s   r  np.random.standard_tc                 C   ru  )Nc                 S   s:   t j }t j| d }t| d | t| }|S rv  )r   r   r  rw  r   r   )rx  NGro  r   r   r   standard_t_impl~  s   
z(standard_t_impl.<locals>.standard_t_implrz  )r)   r*   r   rI   r  r   r   r   r   r  {  r  r  np.random.waldc                 C   ru  )Nc                 S   s   | dkrt d|dkrt d| d|  }tj }| | | }| ||td| | ||     }tj }|| | |  krC|S | |  | S )Nr   zwald(): mean <= 0zwald(): scale <= 0r   r  )r   r   r   r  r   r   )meanrB  mu_2lr  ro  rp  r   r   r   	wald_impl  s   
&
zwald_impl.<locals>.wald_implrz  )r)   r*   r   rI   r  r   r   r   r   r    s   r  np.random.zipfc                    r  )Nc                    s   | dkrt d| d }d| }	 d   }  }t|d|  }dd|  | }|dkrB|| |d  |d  || krB|S q)Nr   zzipf(): a <= 1r   r@   g      )r   r   r  )rg   am1rh   rp  r  ro  Tr  r   r   	zipf_impl  s   
(zzipf_impl.<locals>.zipf_implr  )r)   r*   r   rI   r  r   r   r  r   r    s
   r  c                    s^   t | tjs
td|dkrtjj n|dkrtj | jdkr' fdd}|S  fdd}|S )Nz1The argument to shuffle() should be a buffer typer   r   r@   c                    sT   | j d d }|dkr( |d }| | | | | |< | |< |d8 }|dksd S d S r?   )shapearrijrandr   r   impl  s   zdo_shuffle_impl.<locals>.implc                    s`   | j d d }|dkr. |d }t| | t| | | |< | |< |d8 }|dksd S d S r?   )r  r   copyr  r  r   r   r    s   &)	
isinstancer
   Buffer	TypeErrorr   r   randint	randrangendim)r  rngr  r   r  r   do_shuffle_impl  s   

r  c                 C   
   t | dS r   r  r  r   r   r   shuffle_impl     
r  c                 C   r  r   r  r  r   r   r   r    r  c                 C   s8   t | tjrdd }|S t | tjrdd }|S d }|S )Nc                 S   s   t | }t j| |S r   )r   aranger   shuffle)r   r^   r   r   r   permutation_impl  s   
z*permutation_impl.<locals>.permutation_implc                 S   s   |   }tj| |S r   )r  r   r   r  )r   arr_copyr   r   r   r    s   )r  r
   IntegerArray)r   r  r   r   r   r    s   r  )#)r8  r   )rg  r   )rt  rB   )r@  rB   )r{  r   )r  r   )r  rB   )r  r   )r  r  )r  r   )r  r   )rI  r   )r  rB   )r  r   )r   r   )rT  rB   )r  rB   )r  rB   )r   r@   )r   r@   )r   r@   )r   r@   )r  r   )r  rB   )r  r@   )rH  r@   )r  rB   )r   r@   )r  rB   )r  r  )r  r   )r[  r   )r  r   )rW  rB   )r  rB   c                 C   s"  |j }|j}t|g|jd d R  }|d d }t| ||jd |d }	t| |||	}
|d^ }}|ddgks>J tt	j
|}| j|}|| j|ji }| ||}t||
j}|||}t||
j|j}t| |||| W d    n1 sw   Y  t| ||j |
 S )N.r   r   )r   dtyper   rI   r   _parse_shape_empty_nd_implsplitgetattrr   r   typing_contextresolve_value_typeget_call_typeget_functionr   	for_rangenitemsgepdataindex
store_itemr   	_getvalue)r)   r*   r   rI   
typing_keyarrtyr  
scalar_sigscalar_argsshapesr  modfnamenp_funcr-   resolved_sigscalar_implloopvalptrr   r   r   
random_arr  s(   
r
  c                  G   $   t | dkrdd }|S dd }|S )Nr   c                  W   s
   t j S r   r   r   sizer   r   r   	rand_impl4     
zrand.<locals>.rand_implc                  W   s   t j| S r   r  r  r   r   r   r  9  r   r   )r  r  r   r   r   r  0  
   r  c                  G   r  )Nr   c                  W   s
   t j S r   r   r   r  r  r   r   r   
randn_implB  r  zrandn.<locals>.randn_implc                  W   s   t j| S r   r  r  r   r   r   r  G  r   r  )r  r  r   r   r   randn>  r  r  Tc                    s   t | tjr#| jdksJ | j tdd tdd }tdd n#t | tjr?tj tdd td	d }td
d nt	d| f |d tj
fv rWdfdd	}|S d fdd	}|S )Nr@   c                 S   s   t | S r   r  r  r   r   r   get_source_sizeX     zchoice.<locals>.get_source_sizec                 S   s   |   S r   )r  r  r   r   r   copy_source\  r  zchoice.<locals>.copy_sourcec                 S   s   | | S r   r   rg   a_ir   r   r   getitem`  r  zchoice.<locals>.getitemc                 S   s   | S r   r   r  r   r   r   r  h     c                 S   s
   t | S r   )r   r  r  r   r   r   r  l  r  c                 S   s   |S r   r   r  r   r   r   r  p  r  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  )rg   r  replacer   r  )r  r  r   r   choice_imply  s   
zchoice.<locals>.choice_implc           	         s   | }|r(t | }|j}tt|D ]}t jd|}| |||< q|S t | }|j|kr7tdt j	| }|j}tt|D ]}|| ||< qF|S )zO
            choice() implementation returning an array of samples
            r   z@Cannot take a larger sample than population when 'replace=False')
r   emptyflatranger   r   r  r  r   permutation)	rg   r  r  r   outflr  r  
permuted_ar  r  r  r   r   r    s    
NT)r  r
   r  r  r  r   r  r   intpr  r   )rg   r  r  r  r  r   r&  r   choiceP  s2   



(r)  c                    s   t j tdd t| tjstd| f t|tjtjfs&td|f |d tj	fv r7d
 fdd	}|S t|tjrGd
 fdd	}|S t|tj
rWd
 fdd	}|S td	|f )Nc                 S   s   |j }|j}t|}td||D ]=}d}| }td|d D ]#}	||	 }
tj||
|  }|||	 < ||8 }|dkr< n||
8 }q|dkrM|||| d < qd S )Nr   r   r@   )r   r  r   r!  r   r   binomial)r   pvalsr#  r$  szplenr  p_sumn_experimentsr  p_j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   zerosr   r   r+  r  r#  r  r2  r   r   multinomial_impl  s   z%multinomial.<locals>.multinomial_implc                    s$   t |t|f }| || |S )z4
            multinomial(..., size=int)
            r3  r5  r6  r   r   r7    s   c                    s&   t |t|f  }| || |S )z6
            multinomial(..., size=tuple)
            r3  r5  r6  r   r   r7    s   zDnp.random.multinomial(): size should be int or tuple or None, got %sr   )r   r(  r   r  r
   r  r  Sequencer  r   	BaseTuple)r   r+  r  r7  r   r6  r   multinomial  s.   
r:  c                    s   t dd  t| tjtjfstd| f |d tjfv r&d	 fdd	}|S t|tjr5d	 fdd	}|S t|tjrKt|j	tjrKd	 fdd	}|S td| )
Nc           
      S   s   t | D ]
}|dkrtdqt| }|j}|j}td||D ]5}d}t| D ]\}}	tj	|	d||| < ||||  
 7 }q't| D ]\}}	|||   |  < qEqd S )Nr   zdirichlet: alpha must be > 0.0r@   )iterr   r   r  r   r!  	enumerater   r   r9  item)
r  r#  a_vala_lenr  r   r  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  r   r  r  r#  rB  r   r   dirichlet_impl  s   
z!dirichlet.<locals>.dirichlet_implc                    s    t |t| f} | | |S )z2
            dirichlet(..., size=int)
            rC  rD  rE  r   r   rF    s   
c                    s"   t |t| f } | | |S )z4
            dirichlet(..., size=tuple)
            rC  rD  rE  r   r   rF  &  s   
zJnp.random.dirichlet(): size should be int or tuple of ints or None, got %sr   )
r   r  r
   r8  r  r   r   r  r   r  )r  r  rF  r   rE  r   	dirichlet  s,   
rG  c                    s   t dd t dd  |d tjfv rd	 fdd	}|S t|tjs0t|tjr:t|jtjr:d	 fdd	}|S td| )
Nc                 S   s$   | dkrt d|dk rt dd S )Nr   zdf <= 0znonc < 0r  )rx  noncr   r   r   validate_input<  s
   z,noncentral_chisquare.<locals>.validate_inputc                 S   sl   t |rt jS d| k r$t j| d }t j t | }|||  S t j|d }t j| d|  S )Nr@   r   rB   )r   isnannanr   r|  r  r   r  )rx  rH  chi2r   r  r   r   r   noncentral_chisquare_singleC  s   
z9noncentral_chisquare.<locals>.noncentral_chisquare_singlec                    s   | |  | |S r   r   )rx  rH  r  rM  rI  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  )rx  rH  r  r#  out_flatr[   rN  r   r   rO  ]  s   

zUnp.random.noncentral_chisquare(): size should be int or tuple of ints or None, got %sr   )r   r
   r   r  r  r   r  r   )rx  rH  r  rO  r   rN  r   noncentral_chisquare9  s&   


rQ  r'  r   )__doc__r   osr   numpyr   llvmliter   numba.core.extendingr   r   numba.core.imputilsr   r   r   numba.core.typingr   numbar	   
numba.corer
   r   r   numba.npr   numba.core.overload_gluer   numba.core.errorsr   	PYVERSIONr  registrylowerIntTyper   rw   r   
DoubleTyperc   r  r   rS   LiteralStructType	ArrayTypernd_state_tPointerTyper#   r/   r3   r5   r6   r<   rA   rC   rD   rK   r_   ri   r   r   uint32r   r   r   Floatr   r   r   r   r  r   r   r   r   r  r  r  r  r  r  r  r  r  r7  r5  r>  rC  rL  rN  rJ  rS  rU  rV  rX  rZ  rY  rr  ry  r  r  r  r  r  r  r  int64r  r  r  r  r  r  r  r  r  r  r  r"  r  r  arityAnyr
  r  r  r)  r:  rG  rQ  r   r   r   r   <module>   s   




)






$

F














K










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


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


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