
    nVh                        d dl mZ ddlmZ ddlmZ dZeefdej                  fd       Zeefdej                  fd       Z	eefdej                  fd	       Z
eefdej                  fd
       Zed        Zeefdej                  fd       Zeefdej                  fd       Zed        Zeefdej                  fd       Zeefdej                  fd       Zy)   )jit   )core)math
   n_roundsc                 @   | j                   t        j                  k(  r	d}d}d}	d}
n9t        j                  | j                   t        j                  k(  d       d}d}d}	d	}
t        j
                  |      D ]  }|	}|
}| |}}t        j                  ||      |z  |z  } t        j                  ||      |z  |z  }t        j                  ||d
      }t        j                  ||d
      }t        j                  ||d
      }t        j                  ||d
      } | |||fS )zV
    Run `n_rounds` rounds of Philox for state (c0, c1, c2, c3) and key (k0, k1).
    l   yn< l   .v l   S$ l   W= z"dtype not supported in philox_impll   |~fq	 l   ;'	:=[ l   lB;: l   W$*	R F)sanitize_overflow)
dtypetluint32static_assertuint64static_ranger   umulhimuladd)c0c1c2c3k0k1r   PHILOX_KEY_APHILOX_KEY_BPHILOX_ROUND_APHILOX_ROUND_B_AB_c0_c2s                   F/home/dcms/DCMS/lib/python3.12/site-packages/triton/language/random.pyphilox_implr$      s   
 
xx299%/%/'1'1
RYY.0TU%7%7'9'9__X& ? rS[[C 2%*[[C 2%*VVAse4VVAse4VVB>VVB>? r2r>    c           	         t        j                  |       } t        j                  | j                  j	                                | j                  t         j                        } t        j                  |      }t        j                  |      }t        j                  |      }t        j                  |      }t        j                  |j                  j                        dk(  rXt         j                  }| dz	  dz  j                  t         j                        }| dz  j                  t         j                        }njt        j                  t        j                  |j                  j                        dk(  d       t         j                  }t        j                  dd|      }| }|j                  |d	      }|j                  |d	      }|j                  |d	      }|j                  |d	      }t        |||||||      S )
N    l    @   z bitwidth not supported in philox)r       )r   Tbitcast)r   	to_tensorr   r   is_inttor   	constexprprimitive_bitwidthr   fullr$   )	seedr   r   r   r   r   	int_dtypeseed_hiseed_los	            r#   philoxr6   -   sw   <<DTZZ&&()77299D	b	B	b	B	b	B	b	B	||BHH//0B6II	BJ*,00;*$((3
bhh&A&ABbHJlmII	''%)4	y$	'B	y$	'B	y$	'B	y$	'Br2r2wBBr%   c                 *    t        | ||      \  }}}}|S )aq  
    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 offset: The offsets to generate random numbers for.
    )	randint4x)r2   offsetr   retr   s        r#   randintr;   F   s     T684LCAqJr%   c                 ,    |dz  }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)   )r6   )r2   r9   r   _0s       r#   r8   r8   V   s"     
!B$BH55r%   c                    t        j                  | j                  t         j                  k(        s0t        j                  | j                  t         j                  k(        r$| j                  t         j                  d      } d}nt        j                  t        j                  | j                  t         j                  k(        xs0 t        j                  | j                  t         j                  k(               | j                  t         j                  d      } d}t        j                  | dk  |  dz
  |       } | |z  S )zo
    Numerically stable function to convert a random uint into a random float uniformly sampled in [0, 1).
    Tr*   g=g   ;r)   r   )
r   r/   r   r   int32r.   r   r   int64where)xscales     r#   uint_to_uniform_floatrD   t   s     
||AGGryy()R\\!''RXX:M-NDD4D( 
agg&:;`r||AGGWYW_W_L_?`aDD4D(&
QQ"Au9r%   c                 2    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.
    )r;   rD   )r2   r9   r   sources       r#   randrG      s     T68,F ((r%   c                     t        | ||      \  }}}}t        |      }t        |      }t        |      }	t        |      }
|||	|
fS )a   
    Given a :code:`seed` scalar and an :code:`offsets` block,
    returns 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.
    )r8   rD   )r2   offsetsr   i1i2i3i4u1u2u3u4s              r#   rand4xrR      sP     tWh7NBB	r	"B	r	"B	r	"B	r	"Br2r>r%   c                     t        j                  d|       } d|z  }t        j                  dt        j                  |       z        }|t        j
                  |      z  |t        j                  |      z  fS )zBox-Muller transformgHz>g-DT!@g       )r   maximumr   sqrtlogcossin)rN   rO   thrs       r#   pair_uniform_to_normalr[      s^     
FB	B	R	B		$"%&Atxx|Q"---r%   c                 t    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.
    )r8   rD   r[   )	r2   r9   r   rJ   rK   r   rN   rO   n1s	            r#   randnr^      sC     T684LBAq	r	"B	r	"B"2r*EBIr%   c                 n    t        | ||      \  }}}}t        ||      \  }}t        ||      \  }	}
|||	|
fS )a	  
    Given a :code:`seed` scalar and an :code:`offset` block,
    returns 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.
    )rR   r[   )r2   r9   r   rN   rO   rP   rQ   r]   n2n3n4s              r#   randn4xrc      sH     D&(3NBB#B+FB#B+FBr2r>r%   N)runtime.jitr    r   r   r   N_ROUNDS_DEFAULTr/   r$   r6   r;   r8   rD   rG   rR   r[   r^   rc    r%   r#   <module>rh      sP       AQ ",,  @ :J C2<< C C0 3C BLL   5E 6bll 6 6:  & 0@ 	) 	) 	) 3C BLL  * . . 1A ",,   3C BLL  r%   