U
    ¿|eâ'  ã                   @   s  d dl 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mZmZ edd„ ƒZedd	„ ƒZed
d„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZed d!„ ƒZed"d#„ ƒZdS )$é    N)Úuint64Úuint32Úuint16Úuint8)Úregister_jitable)Ú
UINT32_MAXÚ
UINT64_MAXÚ
UINT16_MAXÚ	UINT8_MAX)Únext_uint32Únext_uint64c                 C   sT   t | ƒ}||d? O }||d? O }||d? O }||d? O }||d? O }||d? O }|S )Né   é   é   é   é   é    )r   )ÚmaxÚmask© r   ú[/var/www/website-v5/atlas_env/lib/python3.8/site-packages/numba/np/random/random_methods.pyÚgen_mask   s    r   c                 C   sF   |dkr|||fS |s$t | ƒ}d}n|dL }|d8 }|d@ dk||fS )Nr   é   r   )r   )ÚbitgenÚoffÚrngÚbcntÚbufr   r   r   Úbuffered_bounded_bool   s    
r   c                 C   s0   |st | ƒ}d}n|dL }|d8 }t|ƒ||fS )Né   r   r   )r   r   ©r   r   r   r   r   r   Úbuffered_uint8(   s    r!   c                 C   s0   |st | ƒ}d}n|dL }|d8 }t|ƒ||fS )Nr   r   )r   r   r    r   r   r   Úbuffered_uint164   s    r"   c           	      C   s˜   t |ƒt dƒ }|dkst‚t| ||ƒ\}}}t|| ƒ}|d@ }||k rŠt tƒ| | }||k rŠt| ||ƒ\}}}t|| ƒ}|d@ }qZ|d? ||fS )a?  
    Generates a random unsigned 8 bit integer bounded
    within a given interval using Lemire's rejection.

    The buffer acts as storage for a 32 bit integer
    drawn from the associated BitGenerator so that
    multiple integers of smaller bitsize can be generated
    from a single draw of the BitGenerator.
    r   éÿ   r   )r   ÚAssertionErrorr!   r   r
   ©	r   r   r   r   Úrng_exclÚnÚmÚleftoverÚ	thresholdr   r   r   Úbuffered_bounded_lemire_uint8B   s    
r+   c           	      C   s˜   t |ƒt dƒ }|dkst‚t| ||ƒ\}}}t|| ƒ}|d@ }||k rŠt tƒ| | }||k rŠt| ||ƒ\}}}t|| ƒ}|d@ }qZ|d? ||fS )a@  
    Generates a random unsigned 16 bit integer bounded
    within a given interval using Lemire's rejection.

    The buffer acts as storage for a 32 bit integer
    drawn from the associated BitGenerator so that
    multiple integers of smaller bitsize can be generated
    from a single draw of the BitGenerator.
    r   éÿÿ  r   )r   r$   r"   r   r	   r%   r   r   r   Úbuffered_bounded_lemire_uint16f   s    
r-   c                 C   sz   t |ƒt dƒ }|dkst‚tt| ƒƒt|ƒ }|d@ }||k rrt| | }||k rrtt| ƒƒt|ƒ }|d@ }qL|d? S )zr
    Generates a random unsigned 32 bit integer bounded
    within a given interval using Lemire's rejection.
    r   ì   ÿÿ r   )r   r$   r   r   r   )r   r   r&   r(   r)   r*   r   r   r   Úbuffered_bounded_lemire_uint32Š   s    
r/   c                 C   sâ   t |ƒt dƒ }|dkst‚t| ƒ}t |ƒt |ƒ }||k rjt| | }||k rjt| ƒ}t |ƒt |ƒ }qH|t dƒ@ }|d? }|t dƒ@ }|d? }	|| }
|| |
d?  }|t dƒ@ }|d? }|||	 7 }||	 | |d?  }|S )zr
    Generates a random unsigned 64 bit integer bounded
    within a given interval using Lemire's rejection.
    r   ì   ÿÿÿÿ r.   r   )r   r$   r   r   )r   r   r&   Úxr)   r*   Úx0Úx1Z	rng_excl0Z	rng_excl1Úw0ÚtÚw1Úw2Úm1r   r   r   Úbounded_lemire_uint64¥   s(    r9   c                 C   sÖ   t j||d�}|dkr0t  |¡D ]}|||< q n¢|dkr†|dkrbt  |¡D ]}|t| ƒ ||< qJqÒt  |¡D ]}|t| |ƒ ||< qlnL|dkr°t  |¡D ]}|t| ƒ ||< q˜n"t  |¡D ]}|t| |ƒ ||< qº|S )z_
    Returns a new array of given size with 64 bit integers
    bounded by given interval.
    ©Údtyper   r.   r0   )ÚnpÚemptyÚndindexr   r/   r   r9   ©r   Úlowr   Úsizer;   ÚoutÚir   r   r   Úrandom_bounded_uint64_fillÈ   s     rD   c                 C   s€   t j||d�}|dkr0t  |¡D ]}|||< q nL|dkrZt  |¡D ]}|t| ƒ ||< qBn"t  |¡D ]}|t| |ƒ ||< qd|S )z_
    Returns a new array of given size with 32 bit integers
    bounded by given interval.
    r:   r   r.   )r<   r=   r>   r   r/   r?   r   r   r   Úrandom_bounded_uint32_fillä   s    rE   c           
      C   s¤   d}d}t j||d�}|dkr8t  |¡D ]}|||< q(nh|dkrpt  |¡D ]"}t| ||ƒ\}	}}||	 ||< qJn0t  |¡D ]$}t| |||ƒ\}	}}||	 ||< qz|S )z_
    Returns a new array of given size with 16 bit integers
    bounded by given interval.
    r   r:   r,   )r<   r=   r>   r"   r-   ©
r   r@   r   rA   r;   r   r   rB   rC   Úvalr   r   r   Úrandom_bounded_uint16_fillø   s$     ÿÿrH   c           
      C   s¤   d}d}t j||d�}|dkr8t  |¡D ]}|||< q(nh|dkrpt  |¡D ]"}t| ||ƒ\}	}}||	 ||< qJn0t  |¡D ]$}t| |||ƒ\}	}}||	 ||< qz|S )z^
    Returns a new array of given size with 8 bit integers
    bounded by given interval.
    r   r:   r#   )r<   r=   r>   r!   r+   rF   r   r   r   Úrandom_bounded_uint8_fill  s$     ÿÿrI   c           
      C   sL   d}d}t j||d�}t  |¡D ]&}t| ||||ƒ\}	}}||	 ||< q |S )z@
    Returns a new array of given size with boolean values.
    r   r:   )r<   r=   r>   r   rF   r   r   r   Úrandom_bounded_bool_fill/  s    rJ   c                 C   sŽ   | |k rt dƒ‚|dkrjt|ƒ}|s0|tdƒ8 }t|ƒ}| dkrHt| ƒ} ||krXt dƒ‚| |krŠt dƒ‚n ||krzt dƒ‚| |krŠt dƒ‚dS )zS
    Check that low and high are within the bounds
    for the given datatype.
    zlow is out of boundsr   r   zhigh is out of boundsz*low is greater than high in given intervalN)Ú
ValueErrorr   )r@   ÚhighÚendpointÚlower_boundÚupper_boundr   r   r   Ú_randint_arg_check=  s"    
rP   c                 C   s~   |dkrdS t |ƒ}t t|ƒƒ}|dkrTt t| ƒƒ|@ }||krvt t| ƒƒ|@ }q8n"t| ƒ|@ }||krvt| ƒ|@ }q`t |ƒS )Nr   r.   )r   r   r   r   )r   Úmax_valr   Úvaluer   r   r   Úrandom_interval\  s    rS   ) Únumpyr<   Únumbar   r   r   r   Únumba.core.extendingr   Únumba.np.random._constantsr   r   r	   r
   Únumba.np.random.generator_corer   r   r   r   r!   r"   r+   r-   r/   r9   rD   rE   rH   rI   rJ   rP   rS   r   r   r   r   Ú<module>   sD   




#
#

"





