U
    9%e                     @   s2  U d dl mZ ddlmZ dZejed< dZejed< dZ	ejed	< d
Z
ejed< dZeefejdddZeefejdddZeefejdddZeefejdddZedd ZeefejdddZeefejdddZedd ZeefejdddZeefejdd d!Zd"S )#   )jit   )corel   yn< PHILOX_KEY_Al   .v PHILOX_KEY_Bl   S$ PHILOX_ROUND_Al   W= PHILOX_ROUND_B
   )n_roundsc                 C   sv   t |D ]^}t}t}	| | }
}t |	||A |A } t ||
|A |A }|	| }||
 }|t }|t }q
| |||fS )zV
    Run `n_rounds` rounds of Philox for state (c0, c1, c2, c3) and key (k0, k1).
    )tlZstatic_ranger   r   Zumulhir   r   )c0c1c2c3Zk0Zk1r
   _ABZ_c0Z_c2 r   U/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/triton/language/random.pyphilox_impl   s    

r   c                 C   s   |  tj} | d? d@  tj}| d@  tj}|j tjdd}|j tjdd}|j tjdd}|j tjdd}t|||||||S )N    l    TZbitcast)tor   Zuint64uint32r   )seedr   r   r   r   r
   Zseed_hiZseed_lor   r   r   philox$   s    r   c                 C   s   t | ||\}}}}|S )ar  
    Given a :code:`seed` scalar and an :code:`offset` block, returns a single
    block of random :code:`int32`.

    If you need multiple streams of random numbers,
    using `randint4x` is likely to be faster than calling `randint` 4 times.

    :param seed: The seed for generating random numbers.
    :param offsets: The offsets to generate random numbers for.
    )	randint4x)r   offsetr
   retr   r   r   r   randint0   s    r   c                 C   s   |d }t | |||||S )aU  
    Given a :code:`seed` scalar and an :code:`offset` block, returns four
    blocks of random :code:`int32`.

    This is the maximally efficient entry point
    to Triton's Philox pseudo-random number generator.

    :param seed: The seed for generating random numbers.
    :param offsets: The offsets to generate random numbers for.
        )r   )r   r   r
   Z_0r   r   r   r   @   s    r   c                 C   s4   | j tjdd} d}t| dk |  d | } | | S )zq
    Numerically stable function to convert a random uint32 into a random float uniformly sampled in [0, 1).
    Tr   g=r    r   )r   r   Zint32where)xscaler   r   r   uint32_to_uniform_float]   s    r$   c                 C   s$   |j tjdd}t| ||}t|S )z
    Given a :code:`seed` scalar and an :code:`offset` block,
    returns a block of random :code:`float32` in :math:`U(0, 1)`.

    :param seed: The seed for generating random numbers.
    :param offsets: The offsets to generate random numbers for.
    Tr   )r   r   r   r   r$   )r   r   r
   sourcer   r   r   randi   s    	r&   c                 C   sP   |j tjdd}t| ||\}}}}t|}t|}t|}	t|}
|||	|
fS )a  
    Given a :code:`seed` scalar and an :code:`offsets` block,
    returns a 4 blocks of random :code:`float32` in :math:`U(0, 1)`.

    :param seed: The seed for generating random numbers.
    :param offsets: The offsets to generate random numbers for.
    Tr   )r   r   r   r   r$   )r   offsetsr
   i1i2Zi3i4u1u2u3u4r   r   r   rand4xw   s    	r/   c                 C   sD   t d| } d| }t dt |  }|t | |t | fS )zBox-Muller transformgHz>g-DT!@g       )r   maximumsqrtlogcossin)r+   r,   thrr   r   r   pair_uniform_to_normal   s    r7   c           	      C   s6   t | ||\}}}}t|}t|}t||\}}|S )a  
    Given a :code:`seed` scalar and an :code:`offset` block,
    returns a block of random :code:`float32` in :math:`\mathcal{N}(0, 1)`.

    :param seed: The seed for generating random numbers.
    :param offsets: The offsets to generate random numbers for.
    )r   r$   r7   )	r   r   r
   r(   r)   r   r+   r,   n1r   r   r   randn   s
    	r9   c                 C   s<   t | ||\}}}}t||\}}t||\}	}
|||	|
fS )a  
    Given a :code:`seed` scalar and an :code:`offset` block,
    returns a 4 blocks of random :code:`float32` in :math:`\mathcal{N}(0, 1)`.

    :param seed: The seed for generating random numbers.
    :param offsets: The offsets to generate random numbers for.
    )r/   r7   )r   r   r
   r+   r,   r-   r.   r8   Zn2Zn3Zn4r   r   r   randn4x   s    	r:   N)Zruntime.jitr    r   r   r   Z	constexpr__annotations__r   r   r   ZN_ROUNDS_DEFAULTr   r   r   r   r$   r&   r/   r7   r9   r:   r   r   r   r   <module>   s6    

