
    Vpf+              	         d dl mZ d dlmZmZmZ d dlmZmZ d dl	Z	d dl
Zd dlmZmZ d dlZd dlZd dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dl m!Z!m"Z" d dl#m$Z$ d dl%m&Z& d dl%m'Z' d dl%m(Z( d dl%m)Z) d dl%m*Z* d dl+mZ, d dl-m.Z. d dl-m/Z0 d dl-m1Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z: d dl;m<Z<m=Z=m>Z>m?Z? d d l@mAZA d d!lBmCZCmDZD eCeEcZEZFeDeGcZGZHe0jI        ZIeZJeKeLd"f         ZMejN        ejO        ejP        ejQ        d#ZR G d$ d%e          ZSi ZTdd'ZUdd*ZV G d+ d,ejA                  ZW e9eWg d- e8D             d.d/d0d1d2d3d4d5d67            ejX        d8          ejY        eW<   d9 ZZd: Z[ej\        ]                    eWeZe[           dd>Z^d? Z_d@ Z` G dA dB          Za G dC dDejb                  ZcdE ejd        eW<   dF e*jd        eW<   dG e*je        eW<   ddJZfefe)jg        eW<   dK Zh e(ji        eWeh           dL ZjdM ZkdN ZlddPZm ejn        dQ          Zo e&jp        eo            e'jq        eo           eojr        dR             Zseojt        dS             ZudT ZvdU Zw e(jx        eoew           ddXZy ejn        dY          Zz e&jp        ez            e'jq        ez           ezjr        dZ             Z{ezjt        d[             Z|d\ Z}d] Z~ e(jx        eze~           d^ Z ejn        d_          Z e&jp        e            e'j        e           ejr        d`             Zejt        da             Zdb Zdc Z e(jx        ee           dd Z ejn        de          Z e&jp        e            e'jq        e           ejr        df             Zejt        dg             Zdh Zdi Z e(jx        ee           dj Z ejn        dk          Z e&jp        e           ejr        dl             Zejt        dm             Zdn Zdo Z e(jx        ee           ee'j        e<   dp Z ejn        dq          Z e&jp        e            e'jq        e           ejr        dr             Zejt        ds             Zdt Z e(jx        ee           ddwZddxZ ee!dyz          dd{            Zd| Zd} Z eejP                  Zd~ Zd Zd ZddZ e(j         eed          dy          Z e(j         eedy          dy          Zd Z ejn        d          Zdye_        et                     eej        e                     er                    e            e'j        e            e(jx        ee            e(jx        eed            e(jx        e eee.j                  d            e(jx        e eee.j                  d           d Z ejn        d          Zdye_        et                     eej        e                     ejr        d             ZddZd Z e(jx        ee            ee!dyz          d             ZddZ ee!d          dd            Z ee!ddy          dd            Z ee!ddy          dd            ZddZe!d             ZddZddZ ee!ddy          dd            Z eSdeeeedd          Z eUe           ddZddZddZddZ eSdeeeedd          Z eUe           ddZddZ eSdeeeedd          Z eUe¦           dS )    )annotations)CallableIteratorSequence)partialreduceN)Any
NamedTuple)lax)numpy)	tree_util)api_util)api)config)core)dispatch)dtypes)pretty_printer)source_info_util)typing)jitvmap)float0)ad)batching)mlir)pxla)xla)gpu_prng)
xla_client)version)ir)hlo)_array_operators_set_array_base_attributes_IndexUpdateHelper)NamedShardingPmapShardingphysical_shardinglogical_sharding)Array)safe_mapsafe_zip.          @   c                  x    e Zd ZU dZded<   ded<   ded<   ded<   ded<   d	Zd
ed<   dZd
ed<   ddZddZd Z	dS )PRNGImplav  Specifies PRNG key shape and operations.

  A PRNG implementation is determined by a key type ``K`` and a
  collection of functions that operate on such keys. The key type
  ``K`` is an array type with element type uint32 and shape specified
  by ``key_shape``. The type signature of each operations is::

    seed :: int[] -> K
    fold_in :: K -> int[] -> K
    split[shape] :: K -> K[*shape]
    random_bits[shape, bit_width] :: K -> uint<bit_width>[*shape]

  A PRNG implementation is adapted to an array-like object of keys
  ``K`` by the ``PRNGKeyArray`` class, which should be created via the
  ``random_seed`` function.
  Shape	key_shaper   seedsplitrandom_bitsfold_inz	<unnamed>strname?tagreturnintc                *    t          | j                  S N)hashr>   selfs    M/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/jax/_src/prng.py__hash__zPRNGImpl.__hash__`   s    >>    c                    | j         S rB   )r>   rD   s    rF   __str__zPRNGImpl.__str__c   s	    8OrH   c                   | j         j        }t          j        | d| j         d| j         d          t          j        dt          j        t          j                    t          j	        t          j                    d | 
                                                                D                       z                       z   S )Nz [z] {z}:   c                F    g | ]\  }}t          j        | d |           S )z = )pptext).0kvs      rF   
<listcomp>z#PRNGImpl.pprint.<locals>.<listcomp>i   s=     > > >(,1bgllqll##> > >rH   )	__class____name__rN   rO   r>   r<   nestgroupbrkjoin_asdictitems)rE   tys     rF   pprintzPRNGImpl.pprintf   s    		 BGr99TX9949999::GArx272688 > >040D0D0F0F> > > , , !     rH   Nr?   r@   r?   r;   )
rU   
__module____qualname____doc____annotations__r<   r>   rG   rJ   r]    rH   rF   r4   r4   G   s            ...///$#....          rH   r4   implc                t    | j         t          v rt          d| j          d|            | t          | j         <   d S )NzPRNG with name z already registered: )r<   prngs
ValueErrorre   s    rF   register_prngrj   p   sB    	Y%
MtyMMtMM
N
NN%	rH   key_datatyping.Arrayc                   t          | j                  }t          fddD                       st          d           j        dk     rt          dj                   j        | d          | j        k    r"t          d| j         dj         d|           j        t          j        t          fvrt          d	j                   d S )
Nc              3  8   K   | ]}t          |          V  d S rB   )hasattr)rP   attrrk   s     rF   	<genexpr>z'_check_prng_key_data.<locals>.<genexpr>z   s-      LLWXt$$LLLLLLrH   )ndimshapedtypezhJAX encountered invalid PRNG key data: expected key_data to have ndim, shape, and dtype attributes. Got    zMJAX encountered invalid PRNG key data: expected key_data.ndim >= 1; got ndim=zKJAX encountered invalid PRNG key data: expected key_data.shape to end with z; got shape=z
 for impl=zSJAX encountered invalid PRNG key data: expected key_data.dtype = uint32; got dtype=)
lenr6   all	TypeErrorrr   rs   rt   npuint32r   )re   rk   rr   s    ` rF   _check_prng_key_datar{   x   sD   	T^		$	LLLL1KLLL	L	L R
 QFNQ Q R R R]Q
 D4<MD D E E E^TEFFt~--
 Y $Y Y<DNY YQUY Y Z Z Z^BIv...
 2!)2 2 3 3 3 /.rH   c                     e Zd ZU dZded<   ded<   ded<   dZd	ed
<   d;dZd Zd Ze	d             Z
e	d             Ze	d             Ze	d             Ze	d             Ze	d             Z e	 ej        d                    Z e	 ej        d                    Z e	 ej        d                    Z e	 ej        d                    Z e	 ej        d                    Z e	 ej        d                    Z e	 ej        d                    Z e	 ej        d                    Z e	 ej        d                    Z e	 ej        d                    Zd<d#Ze	d=d%            Ze	d=d&            Ze	d'             Zd( Z d) Z!d>d+Z"d, Z#d- Z$d. Z%dZ&d/Z'e	d?d1            Z(e	d@d2            Z)d@d3Z*d@d4Z+d@d5Z,d@d6Z-d@d7Z.d@d8Z/d@d9Z0d@d:Z1dS )APRNGKeyArraya>  An array of PRNG keys backed by an RNG implementation.

  This class lifts the definition of a PRNG, provided in the form of a
  ``PRNGImpl``, into an array-like pytree class. Instances of this
  class behave like an array whose base elements are keys, hiding the
  fact that keys are typically arrays (of ``uint32`` dtype) themselves.

  PRNGKeyArrays are also restricted relative to JAX arrays in that
  they do not expose arithmetic operations. They instead expose
  wrapper methods around the PRNG implementation functions (``split``,
  ``random_bits``, ``fold_in``).
  r4   _implrl   _base_arrayzbool | np.ndarray	_consumedNz"None | source_info_util.SourceInfo_source_infork   r	   c                    t          |t          j                  rJ t          ||           || _        || _        d| _        d S NF)
isinstancer   Tracerr{   r~   r   r   )rE   re   rk   s      rF   __init__zPRNGKeyArray.__init__   sD    (DK00000x(((DJDDNNNrH   c                8    | j                                         }| S rB   )r   block_until_readyrE   _s     rF   r   zPRNGKeyArray.block_until_ready   s    **,,AKrH   c                8    | j                                         }d S rB   )r   copy_to_host_asyncr   s     rF   r   zPRNGKeyArray.copy_to_host_async   s    ++--AAArH   c                6    t          | j        | j                  S rB   )keys_shaped_arrayr~   rs   rD   s    rF   avalzPRNGKeyArray.aval   s    TZ444rH   c                @    t          | j        | j        j                  S rB   )base_arr_shape_to_keys_shaper~   r   rs   rD   s    rF   rs   zPRNGKeyArray.shape   s    '
D4D4JKKKrH   c                4    t          j        | j                  S rB   )mathprodrs   rD   s    rF   sizezPRNGKeyArray.size   s    9TZ   rH   c                *    t          | j                  S rB   )rv   rs   rD   s    rF   rr   zPRNGKeyArray.ndim   s    tz??rH   c                *    t          | j                  S rB   )KeyTyr~   rD   s    rF   rt   zPRNGKeyArray.dtype   s    rH   c                    | j         j        S rB   )rt   itemsizerD   s    rF   r   zPRNGKeyArray.itemsize   s    :rH   z_base_array._devicez_base_array._committedz_base_array.devicez_base_array.devicesz _base_array.is_fully_addressablez_base_array.is_fully_replicatedz_base_array.deletez_base_array.is_deletedz#_base_array.on_device_size_in_bytesz!_base_array.unsafe_buffer_pointerindexr@   r?   c                \    t          | j        | j                            |                    S rB   )r}   r~   r   addressable_data)rE   r   s     rF   r   zPRNGKeyArray.addressable_data   s%    
D$4$E$Ee$L$LMMMrH   list[Shard]c                4      fd j         j        D             S )Nc                    g | ]E} t          |          |j        |j        |j        t	          j        |j                             FS )deviceshardingglobal_shapedatatype_device	_sharding_global_shaper}   r~   _datarP   srE   s     rF   rS   z3PRNGKeyArray.addressable_shards.<locals>.<listcomp>   b         	Q9[dj!'22		
 	
 	
  rH   )r   addressable_shardsrD   s   `rF   r   zPRNGKeyArray.addressable_shards   s6        !4   rH   c                4      fd j         j        D             S )Nc                    g | ]E} t          |          |j        |j        |j        t	          j        |j                             FS r   r   r   s     rF   rS   z.PRNGKeyArray.global_shards.<locals>.<listcomp>   r   rH   )r   global_shardsrD   s   `rF   r   zPRNGKeyArray.global_shards   s6        !/   rH   c                @    t          | j        | j        j                  S rB   )r*   r   r   r   rD   s    rF   r   zPRNGKeyArray.sharding   s    DIt'7'@AAArH   c                T    t          | j        j                  }| j        j        |k    S rB   )rv   r~   r6   r   rr   )rE   	base_ndims     rF   
_is_scalarzPRNGKeyArray._is_scalar   s%    DJ())I I--rH   c                p    |                                  rt          d          t          | j                  S )Nzlen() of unsized object)r   rx   rv   r   rD   s    rF   __len__zPRNGKeyArray.__len__   s4     1/000t   rH   Iterator[PRNGKeyArray]c                                                       rt          d           fdt           j                  D             S )Nziteration over a 0-d key arrayc              3  B   K   | ]}t          j        |          V  d S rB   )r}   r~   )rP   rQ   rE   s     rF   rq   z(PRNGKeyArray.__iter__.<locals>.<genexpr>  s/      HHALQ''HHHHHHrH   )r   rx   iterr   rD   s   `rF   __iter__zPRNGKeyArray.__iter__   sL     86777 IHHHd6F1G1GHHHHrH   c                @    d| j          d| j        j         d| j         S )NzArray(z, dtype=z) overlaying:
)rs   rt   r<   r   rD   s    rF   __repr__zPRNGKeyArray.__repr__  s:    "TZ " " " "" " #rH   c                   t          j        d          t          j        t          | j                            z   }t          j        d          | j                                        z   }t          t          j        t          j        d          t          j        dt          j                    |z   t          j                    z   |z             z                       S )Nzshape = zimpl = zPRNGKeyArray:rL   )	rN   rO   r;   rs   r~   r]   rW   rV   rX   )rE   pp_keyspp_impls      rF   r]   zPRNGKeyArray.pprint  s    gj!!BGC
OO$<$<<Ggi  4:#4#4#6#66GrxgogaG#bfhh.899:; ; < < <rH   c                    |                      | j        | j                                                  }| j        |_        |S rB   )rT   r~   r   copyr   )rE   outs     rF   r   zPRNGKeyArray.copy  s4    
..T%5%:%:%<%<
=
=CNCMJrH   d   r&   c                    J rB   rd   rD   s    rF   atzPRNGKeyArray.at  s    7C|rH   c                    J rB   rd   rD   s    rF   TzPRNGKeyArray.T  s    1=rH   c                    J rB   rd   r   s     rF   __getitem__zPRNGKeyArray.__getitem__      rH   c                    J rB   rd   rE   r   __s      rF   flattenzPRNGKeyArray.flatten  r   rH   c                    J rB   rd   r   s      rF   ravelzPRNGKeyArray.ravel  r   rH   c                    J rB   rd   r   s      rF   reshapezPRNGKeyArray.reshape  r   rH   c                    J rB   rd   r   s      rF   squeezezPRNGKeyArray.squeeze   r   rH   c                    J rB   rd   r   s      rF   swapaxeszPRNGKeyArray.swapaxes!  r   rH   c                    J rB   rd   r   s      rF   takezPRNGKeyArray.take"  r   rH   c                    J rB   rd   r   s      rF   	transposezPRNGKeyArray.transpose#  r   rH   )rk   r	   )r   r@   r?   r}   )r?   r   )r?   r   )r?   r&   )r?   r}   )2rU   r`   ra   rb   rc   r   r   r   r   propertyr   rs   r   rr   rt   r   op
attrgetterr   
_committedr   devicesis_fully_addressableis_fully_replicateddelete
is_deletedon_device_size_in_bytesunsafe_buffer_pointerr   r   r   r   r   r   r   r   r]   r   rG   __array_priority__r   r   r   r   r   r   r   r   r   r   rd   rH   rF   r}   r}      s          ///59,9999     . . . 5 5 85 L L 8L ! ! 8!   8   8   8 H]R]#899::'x&>??@@*8MBM"67788&H]R]#899::'!-"-0R"S"STT /P!Q!QRR8MBM"67788&x&>??@@*$H]R]3X%Y%YZZ"(=2=1T#U#UVVN N N N 	 	 	 8	 	 	 	 8	 B B 8B. . .! ! !
I I I I# # #< < <  
 ( CCC 8C=== 8===================================rH   r}   c              #  "   K   | ]
}d | d V  dS )r   Nrd   )rP   r   s     rF   rq   rq   &  s*      --bk2kkk------rH   r   r   r   r   r   r   r   r   r   )includer   c                     | j         f| j        fS rB   )r   r~   xs    rF   prngkeyarray_flattenr   ,  s    
-	17	""rH   c                *    |\  }t          | |          S rB   r}   )re   children
base_arrays      rF   prngkeyarray_unflattenr   /  s    +*	dJ	'	''rH   r7   int | typing.ArrayLiker?   c                $    t          ||           S Nri   )random_seed)re   r7   s     rF   seed_with_implr   8  s    	T	%	%	%%rH   c                F    t          j        |t          |                     S rB   )r   ShapedArrayr   )re   rs   s     rF   r   r   <  s    		%t	-	--rH   c                @    t          | j                  }|d |          S rB   )rv   r6   )re   base_arr_shaper   s      rF   r   r   ?  s"    $.!!)	)	$$rH   c                  4   e Zd Zed             Zedd            Zedd            Zed             Zed             Zed	             Z	ed
             Z
ed             Zed             Zed             Zed             Zedd            Zedd            ZdS )
KeyTyRulesc                P   g | |j         j        R }t          |d          rGt          j        |j        t          j                  r#t          j        t          |          |          }n)t          j        ||t          j        d                    }t          ||j                   S )Nrt   rz   rt   ri   )r~   r6   ro   jnp
issubdtypert   r   prng_keybroadcast_torandom_unwrapr   fullry   random_wrap)rs   
fill_valuert   physical_shaperk   s        rF   r  zKeyTyRules.fullF  s    5u5u{455Nz7## Pz7G(Y(Y P!-
";";^LLhh.*BHX<N<NOOOh xek2222rH   r?   core.ShapedArrayc                d    t          j        | j        j        t	          j        d                    S Nrz   )r   r   r~   r6   r  rt   r  s    rF   physical_element_avalz KeyTyRules.physical_element_avalQ  s$    EK139X3F3FGGGrH   r+   c                    | j         S rB   r   )vals    rF   physical_constzKeyTyRules.physical_constU  s
    ?rH   c                    fd}|S )Nc                    t          j        |j        |j                  |_        t          j        j        |          S rB   )r   r   rs   rt   r   r}   r~   )r   bufr   s     rF   handlerz*KeyTyRules.result_handler.<locals>.handler[  s0    !#)SY77ch$**C000rH   rd   )sticky_devicer   r  s    ` rF   result_handlerzKeyTyRules.result_handlerY  s#    1 1 1 1 1 NrH   c                   	
 t          j                   } j        j        j        }t
          j        t           j                 }t          |t          t          f          rt           |          }nJ d| d            t          d           gt          |          z  

fd|D             } ||||          	 	fd}|S )NFzimpossible sharding z  in local sharded result handlerc                    g | ]	}g |R 
S rd   rd   )rP   indstrailing_indss     rF   rS   z;KeyTyRules.local_sharded_result_handler.<locals>.<listcomp>n  s'    @@@+d+]++@@@rH   c                J    t          j        j         |                     S rB   r}   rt   r~   bufsr   phys_handlers    rF   r  z8KeyTyRules.local_sharded_result_handler.<locals>.handlert  "    $**LL,>,>???rH   )r   physical_avalrt   r~   r6   r   local_result_handlersr   r   r(   r'   r)   slicerv   )r   r   indices	phys_avalr6   phys_handler_makerphys_shardingphys_indicesr  r!  r  s   `        @@rF   local_sharded_result_handlerz'KeyTyRules.local_sharded_result_handler`  s    "4((I
 *I3D4DE (\=9:: V'h77mmUU8UUUUUU 4[[MC	NN2M@@@@@@@L &%iMML@ @ @ @ @ @ NrH   c                     t          j                   }t          j        t           j                 }t           |          } ||||           fd}|S )Nc                J    t          j        j         |                     S rB   r  r  s    rF   r  z9KeyTyRules.global_sharded_result_handler.<locals>.handler  r"  rH   )r   r#  r   global_result_handlersr   r)   )r   out_sharding	committedr'  r(  r)  r  r!  s   `      @rF   global_sharded_result_handlerz(KeyTyRules.global_sharded_result_handlery  sq    "4((I4T5EF%dL99M%%i	JJL@ @ @ @ @ @NrH   c                    t          j        |           }t          j        t           j                 }d |D             }t          | |          } ||||          } ||          }	t          | j        j        |	          S )Nc                ,    g | ]}t          |          S rd   )r  )rP   arrs     rF   rS   z1KeyTyRules.make_sharded_array.<locals>.<listcomp>  s     888#=%%888rH   )	r   r#  r   r.  r   r)   r}   rt   r~   )
r   r   arraysr0  r'  r(  phys_arraysr)  r!  phys_results
             rF   make_sharded_arrayzKeyTyRules.make_sharded_array  s}    "4((I4T5EF88888K%dH55M%%i	JJL,{++K
(+666rH   c                    t          j        |          }t          j        t          |           }t          ||          }t          j        |||t          |                    }t          ||j
        j                  S r   )r   r#  r   tree_mapr  r)   r   batched_device_putlistr  rt   r~   )valsr   r   r   r#  physical_buffersr)  physical_results           rF   device_put_shardedzKeyTyRules.device_put_sharded  so    &t,,M )->>%dH55M-m].>WO OOTZ-=>>>>rH   c                <   t          j        |          }t          t          j        |                    dk    sJ t          |           }t          ||          }t          j        |||gt          |          z  |          }t          ||j
        j                  S )Nru   ri   )r   r#  rv   r   aval_to_xla_shapesr  r)   r   r;  r  rt   r~   )r  r   r   r   r#  physical_bufr)  r?  s           rF   device_put_replicatedz KeyTyRules.device_put_replicated  s    &t,,Ms%m4455:::: %%L%dH55M-}|ns7||&CWN NOTZ-=>>>>rH   c                    t           j        S rB   )r   r   r   s    rF   tangent_dtypezKeyTyRules.tangent_dtype  s
    =rH   c                @    t          j        dt          j                  S )Nrd   )ry   zerosr   r   rF  s    rF   zerozKeyTyRules.zero  s    8B&&&rH   boolc                    dS r   rd   )	key_dtypeother_dtypes     rF   convert_fromzKeyTyRules.convert_from      5rH   c                    dS r   rd   )rN  rM  s     rF   
convert_tozKeyTyRules.convert_to  rP  rH   N)r?   r  )r?   r+   )r?   rK  )rU   r`   ra   staticmethodr  r  r  r  r+  r1  r8  r@  rD  rG  rJ  rO  rR  rd   rH   rF   r   r   D  s       3 3 <3 H H H <H    <   <   <0   < 7 7 <7 ? ? <? ? ? <?   < ' ' <'    <    <  rH   r   c                  x    e Zd ZU ded<   eZej        Zd Z	e
dd            Ze
dd            Zdd	Zd
 ZddZdS )r   r4   r~   c                    || _         d S rB   )r~   )rE   re   s     rF   r   zKeyTy.__init__  s    DJJJrH   r?   r;   c                "    d| j         j         dS )Nzkey<>)r~   r>   rD   s    rF   r<   z
KeyTy.name  s    #$*.####rH   r@   c                r    t          j        | j        j                  t	          j        d          j        z  S r  )r   r   r~   r6   ry   rt   r   rD   s    rF   r   zKeyTy.itemsize  s)    9TZ)**RXh-?-?-HHHrH   c                    | j         S rB   )r<   rD   s    rF   r   zKeyTy.__repr__  s
    9rH   c                N    t          |          t          u o| j        |j        k    S rB   )r   r   r~   )rE   others     rF   __eq__zKeyTy.__eq__  s!    ;;%=DJ%+$==rH   c                8    t          | j        | j        f          S rB   )rC   rT   r~   rD   s    rF   rG   zKeyTy.__hash__  s    ,---rH   Nr_   r^   )rU   r`   ra   rc   r   _rulesr   r  r   r   r   r<   r   r   r\  rG   rd   rH   rF   r   r     s         ///&	$   $ $ $ 8$ I I I 8I   > > >. . . . . .rH   r   c                    | j         S rB   r   r   s    rF   <lambda>ra    s    AF rH   c                    | j         S rB   r`  r   s    rF   ra  ra    s    16 rH   c                    | S rB   rd   r   s    rF   ra  ra    s    ! rH   xsSequence[PRNGKeyArray]c                x    d | D             }d t          | |          D             }t          j        ||          S )Nc                    g | ]	}|j         
S rd   r  rP   r   s     rF   rS   z/key_array_shard_arg_handler.<locals>.<listcomp>  s    	$	$	$A!-	$	$	$rH   c                >    g | ]\  }}t          |j        |          S rd   )r)   r   )rP   r   r   s      rF   rS   z/key_array_shard_arg_handler.<locals>.<listcomp>  s8     ; ; ;#8 &afh77 ; ; ;rH   )zipr   
shard_args)rd  	shardingsarrsphys_shardingss       rF   key_array_shard_arg_handlerro    sO    	$	$	$	$	$$; ;'*2y'9'9; ; ;.		.	..rH   c                d    | j         } t          j        t          |                    |          S rB   )r   r   get_constant_handlerr   )r   r4  s     rF   key_array_constant_handlerrr    s*    	#	-	"499	-	-c	2	22rH   c                R    t          |           D ]}t          j        |          }|S rB   )ranger   r   )nfr   s      rF   iterated_vmap_unaryrw    s+    88  aAA	
(rH   c                      fd}|S )Nc                    rt          j        | d          } d}nt          j        |d          }d} t          j        |d          | |          S )Nr   axisNr   r   N)in_axesout_axes)r  r   r   r   )r   yaxesrv  lefts      rF   squeeze_vmap_fz$squeeze_vmap.<locals>.squeeze_vmap_f  sb     
+aa
 
 
 add
+aa
 
 
 ad038Ata000A666rH   rd   )rv  r  r  s   `` rF   squeeze_vmapr    s*    7 7 7 7 7 7 
rH   c                   t          |           t          |          ccxk    rdk    rn nS dfv rdk    rfdS fdS t          |           t          |          k    sJ t          t          | |                    D ]N\  }}||k    rt          j        d          "|dk    s|dk    sJ ||f            t          |dk              OS )Nr   c                @      t           fd          |          S )Nc                     |           S rB   rd   )r  rv  r   s    rF   ra  z>iterated_vmap_binary_bcast.<locals>.<lambda>.<locals>.<lambda>      qqAww rH   rw  )r   r  rv  ndim2s   ` rF   ra  z,iterated_vmap_binary_bcast.<locals>.<lambda>  +    G-e5F5F5F5F5FGGJJ rH   c                @     t          fd          |           S )Nc                     |           S rB   rd   )r   rv  r  s    rF   ra  z>iterated_vmap_binary_bcast.<locals>.<lambda>.<locals>.<lambda>  r  rH   r  )r   r  rv  ndim1s    `rF   ra  z,iterated_vmap_binary_bcast.<locals>.<lambda>  r  rH   )r  ru   )rv   reversedrj  r   r   r  )shape1shape2rv  sz1sz2r  r  s     `  @@rF   iterated_vmap_binary_bcastr    s   Vc&kk,%
eqH5%.zzJJJJJJJJJJJJ	VF	#	#	#	#3vv..// $ $hc3
czz
(1q
!
!
!aaAXXC:
q#(
#
#aa	
(rH   seedsc                $   t          | t                    r't          j        t	          j        |                     }nt          j        |           }t          j        j        r|t          j        j        z  }t          
                    ||          S r   )r   r@   r  asarrayry   int64r   random_seed_offsetvaluerandom_seed_pbind)r  re   	seeds_arrs      rF   r   r     su     s #BHUOO,,IIE""I$ 1*00I			ID		1	11rH   r   c               ,    t          || j                  S rB   )r   rs   )
seeds_avalre   s     rF   random_seed_abstract_evalr     s    	4!1	2	22rH   c               D    t          | |          }t          ||          S r   )random_seed_impl_baser}   )r  re   base_arrs      rF   random_seed_implr  $  s$    "5t444(	dH	%	%%rH   c               f    t          t          j        |           |j                  } ||           S rB   )rw  ry   rr   r7   )r  re   r7   s      rF   r  r  )  s)    	RWU^^TY	7	7$	erH   c          	         | j         \  }t          |j        |j                  }t	          j        |d          }t	          j        | ||t          t          j	        | j
                            S )NFmultiple_results)	avals_out)avals_inrw  rr   r7   r   	lower_fundelegate_loweringmapr   r#  r  )ctxr  re   r   r7   seed_lowerings         rF   random_seed_loweringr  -  se    
,%$	TY		2	2$.>>>-			=%D&66
8 
8 
8 8rH   rs   r5   c                :    t                               | |          S Nrs   )random_split_pr  )keysrs   s     rF   random_splitr  8  s    			T		/	//rH   r  c               J    t          | j        j        g | j        |R           S rB   )r   rt   r~   rs   )	keys_avalrs   s     rF   random_split_abstract_evalr  ?  s'    	9?02LIO2Le2L2L	M	MMrH   c               p    t          | j        | j        | j        |          }t	          | j        |          S r  )random_split_impl_baser~   r   rr   r}   )r  rs   r  s      rF   random_split_implr  C  s8    #
j$"DIU< < <(	dj(	+	++rH   c               D     t          | fd          } ||          S )Nc                0                         |           S rB   r8   rQ   re   rs   s    rF   ra  z(random_split_impl_base.<locals>.<lambda>J      4::a3G3G rH   r  )re   r  	keys_ndimrs   r8   s   `  ` rF   r  r  I  s.    
i)G)G)G)G)G
H
H%	xrH   c          
         | j         \  }|j        j        t          |j        fd          }t          j        |d          }t          j        | ||t          j	        |          gt          t          j	        | j                            S )Nc                0                         |           S rB   r  r  s    rF   ra  z'random_split_lowering.<locals>.<lambda>P  r  rH   Fr  r  r  )r  rt   r~   rw  rr   r   r  r  r   r#  r  r  )r  r  rs   r   r8   split_loweringre   s     `   @rF   random_split_loweringr  M  s    
,%$		$
di)G)G)G)G)G
H
H%>%%@@@.			>4"4(()D&66
8 
8 
8 8rH   c                \    t                               | t          j        |                    S rB   )random_fold_in_pr  r  r  )r  msgss     rF   random_fold_inr  Z  s"    			tS[%6%6	7	77rH   r  c                b    t          j        d| |          }t          j        || j                  S )Nr  )lax_internalbroadcasting_shape_ruler   r   rt   )r  	msgs_avalrs   s      rF   random_fold_in_abstract_evalr  a  s0    

.	9. .%		%	1	11rH   c                n    t          | j        | j        || j                  }t	          | j        |          S rB   )random_fold_in_impl_baser~   r   rs   r}   )r  r  r  s      rF   random_fold_in_implr  g  s3    %
j$"D$*6 6(	dj(	+	++rH   c                j    t          |t          j        |          | j                  } |||          S rB   )r  ry   rs   r:   )re   r  r  
keys_shaper:   s        rF   r  r  m  s4    &"(4..$,0 0'	4	 	  rH   c                0   | j         \  }}|j        j        }t          |j        |j        |j                  }t          j        |d          }t          j        | |||t          j
        |          |gt          t          j
        | j                            S )NFr  r  )r  rt   r~   r  rs   r:   r   r  r  r   r#  r  r  )r  r  r  r  r  re   r:   fold_in_lowerings           rF   random_fold_in_loweringr  r  s    )Y		$&oy6 6'^GeDDD			T4"9--y9D&66
8 
8 
8 8rH   c                <    t                               | ||          S N)	bit_widthrs   )random_bits_pr  r  r  rs   s      rF   r9   r9     s    			DIU		C	CCrH   r9   c               r    g | j         |R }t          j        d|           }t          j        ||          S )Nuint)rs   r   rt   r   r   )r  r  rs   	out_shape	out_dtypes        rF   random_bits_abstract_evalr    sA    (	(%(()l-)--..)		)Y	/	//rH   c               H    t          | j        | j        | j        ||          S r  )random_bits_impl_baser~   r   rr   r  s      rF   random_bits_implr    s/    	tz4+;TY)2%
A 
A 
A ArH   c               H     t          | fd          } ||          S )Nc                2                         |           S rB   r9   rQ   r  re   rs   s    rF   ra  z'random_bits_impl_base.<locals>.<lambda>      4++Ay%@@ rH   r  )re   r  r  r  rs   bitss   `  `` rF   r  r    s9    	@@@@@@
B 
B$	hrH   c               4  	 | j         \  }|j        j        	t          |j        	fd          }t          j        |d          }|                     t          j	        |          g          } |||          }| 
                    |j                   |S )Nc                2                         |           S rB   r  r  s    rF   ra  z&random_bits_lowering.<locals>.<lambda>  r  rH   Fr  )r  )r  rt   r~   rw  rr   r   r  replacer   r#  set_tokens_out
tokens_out)
r  r  r  rs   r   r  bits_loweringctx_newr   re   s
     ``     @rF   random_bits_loweringr    s    
,%$		$	
i@@@@@@
B 
B$.>>>-KK$"4T":":!;K<<'gt$$#W'(((	*rH   c               Z    t          ||            t                              | |          S r   )r{   random_wrap_pr  r  re   s     rF   r  r    s+    tX&&&			H4		0	00rH   r  c               L    t          || j                  }t          ||          S rB   )r   rs   r   )base_arr_avalre   rs   s      rF   random_wrap_abstract_evalr    s$    
&t]-@
A
A%	4	'	''rH   c               "    t          ||           S rB   r   r  s     rF   random_wrap_implr    s    	dH	%	%%rH   c                   |gS rB   rd   )r  r  re   s      rF   random_wrap_loweringr    s
    
rH   c               d    | \  }|\  }t          j        ||d          }t          ||          dfS )Nru   ri   r   )r   bdim_at_frontr  )batched_args
batch_dimsre   r   ds        rF   random_wrap_batch_ruler    s<    "!"!Q1%%!	QT	"	"	"A	%%rH   c                    t          j        | j        t          j                  st          d| j                  t                              |           S )Nz6random_unwrap takes key array operand, got keys.dtype=)r  r  rt   r   r  rx   random_unwrap_pr  r  s    rF   r  r    sH    	
FO	4	4 Q
O$*OO
P
PP			d	#	##rH   r  c                *    t          j        |           S rB   )r   r#  )r  s    rF   random_unwrap_abstract_evalr    s    		I	&	&&rH   c                    | j         S rB   r  r  s    rF   random_unwrap_implr
    s    		rH   c                    |gS rB   rd   )r  r  s     rF   random_unwrap_loweringr    s	    
-rH   keyrK  c                f    	 | j         dk    o| j        t          j        k    S # t          $ r Y dS w xY w)NrL   F)rs   rt   ry   rz   AttributeError)r  s    rF   _is_threefry_prng_keyr    sD    97bi!77	   55s   " 
00c                     t          |           S )a  Create a single raw threefry PRNG key from an integer seed.

  Args:
    seed: a 64- or 32-bit integer used as the value of the key.

  Returns:
    The PRNG key contents, modeled as an array of shape (2,) and dtype
    uint32. The key is constructed from a 64-bit seed by effectively
    bit-casting to a pair of uint32 values (or from a 32-bit seed by
    first padding out with zeros).
  )_threefry_seed)r7   s    rF   threefry_seedr    s     
		rH   T)inlinec           	        | j         rt          d| d          t          j        | j        t          j                  st          d|           d } |t          j        | t          j	        | d                              }t          j        d          5   |t          j        | t          j        d                              }d d d            n# 1 swxY w Y   t          j        ||gd          S )	Nz$PRNG key seed must be a scalar; got .z&PRNG key seed must be an integer; got c                h    t          j        t          j        | t          j                  dg          S r|  )r   expand_dimsconvert_element_typery   rz   )rQ   s    rF   ra  z _threefry_seed.<locals>.<lambda>  s#    coc&>q")&L&LqcRR rH   r1   standardl    r   )rs   rx   ry   r  rt   integerr   shift_right_logicalr  _constr   numpy_dtype_promotionr  bitwise_andrz   concatenate)r7   convertk1k2s       rF   r  r    s4   	Z F
D4DDD
E
EE	tz2:	.	. G
ETEE
F
FFRR'w	dL$7b$A$ABBD D"#J// ? ? 
ry'<'<==	>	>B? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
"b1	%	%%s   1CCCc                     t          j         t          j                  st	          d          t          j        t          j                   j                    fd}|S )Nz)_rotate_left only accepts integer dtypes.c                   t          j        |          k    rt          j        |          }t          j        |           k    rt          j        |           } t          j        | |          t          j        | |z
            z  S rB   )r   rt   r  
shift_leftr  )r   r  rt   nbitss     rF   _rotate_leftz'_make_rotate_left.<locals>._rotate_left  su    
y||u

"1e
,
,a
y||u

"1e
,
,a>!Q#"9!UQY"G"GGGrH   )r  r  ry   r  rx   arrayiinfor  )rt   r)  r(  s   ` @rF   _make_rotate_leftr,    st    	rz	*	* A
?
@
@@
(39U##(%
0
0%H H H H H H 
rH   c                    t          d | D                       r"t          d                    |                     t          d | D                       r@t	          j        |  }t          j        |t          j	        t          j
                            }n0t          j        t          j	        t          j
                            }|fdz  S )Nc              3  @   K   | ]}|j         t          j        k    V  d S rB   )rt   r  rz   )rP   as     rF   rq   z._threefry2x32_abstract_eval.<locals>.<genexpr>&  s+      --1CJ	------rH   z7Arguments to threefry2x32 must have uint32 type, got {}c              3  J   K   | ]}t          |t          j                  V  d S rB   )r   r   r   )rP   args     rF   rq   z._threefry2x32_abstract_eval.<locals>.<genexpr>)  s/      ;;sC)	*	*;;;;;;rH   rL   )anyrx   formatrw   r  r  r   r   r  rt   rz   UnshapedArray)argsrs   r   s      rF   _threefry2x32_abstract_evalr6  %  s    ------- #
MVD\\# # #;;d;;;;; 50$7EE39SZ#8#899DDci
3344D
1rH   c                    | d d          } | d         | d         z   | d<   t          | d         |          | d<   | d         | d         z  | d<   | S )Nr   ru   )rotate_left)rR   rots     rF   apply_roundr:  4  sU    d!	
1!!A$	QqT3		!A$	
1!!A$	
(rH   c                ,    | dd          | d d         z   S )Nru   rd   )rd  s    rF   rotate_listr<  <  s    	ABB"RaR&rH   c                   |\  }}}|d         D ]}t          ||          }|d         |d         z   |d         |d         z   t          j        | dz   t          j                  z   g}|t          |          t          |          fS )Nr   ru   r  )r:  r  r  ry   rz   r<  )istater   ks	rotationsrnew_xs          rF   rolled_loop_steprD  @  s    !RQ<  aAqAAQ4"Q%<11AE(K(K(KK
L%	BY!7!7	77rH   c           	        ||g}t          j        g dt           j                  t          j        g dt           j                  g}| || |z  t          j        d          z  g}|d         |d         z   |d<   |d         |d         z   |d<   |r2t          j        ddt
          |t          |          |f          \  }}}n|d         D ]}	t          ||	          }|d         |d         z   |d<   |d         |d         z   t          j        d          z   |d<   |d         D ]}	t          ||	          }|d         |d         z   |d<   |d         |d         z   t          j        d          z   |d<   |d         D ]}	t          ||	          }|d         |d         z   |d<   |d         |d         z   t          j        d	          z   |d<   |d         D ]}	t          ||	          }|d         |d         z   |d<   |d         |d         z   t          j        d
          z   |d<   |d         D ]}	t          ||	          }|d         |d         z   |d<   |d         |d         z   t          j        d          z   |d<   t          |          S )Apply the Threefry 2x32 hash.

  Args:
    keypair: a pair of 32bit unsigned integers used for the key.
    count: an array of dtype uint32 used for the counts.

  Returns:
    An array of dtype uint32 with the same shape as `count`.
  )            r  )      r0      ir   ru      rL         )	ry   r*  rz   r   	fori_looprD  r<  r:  tuple)
key1key2x1x2use_rolled_loopsr   rA  r@  r   rB  s
             rF   _threefry2x32_loweringrX  H  s    
2h!xry999x(((	:::<)dD4K")J"7"778"	
11!A$	
11!A$ 'mAq"2QB4STTGAq!! q\  
a

aaQ4"Q%<AaDQ4"Q%<")A,,&AaDq\  
a

aaQ4"Q%<AaDQ4"Q%<")A,,&AaDq\  
a

aaQ4"Q%<AaDQ4"Q%<")A,,&AaDq\  
a

aaQ4"Q%<AaDQ4"Q%<")A,,&AaDq\  
a

aaQ4"Q%<AaDQ4"Q%<")A,,&AaD	q/rH   F)rW  r  c                   t           j        j        st          ||||          S d}j        \  }|k    sJ j        \  }}	}
}t          j                  dj        v rt          j	        d          }||gS fd}t          t          j        j        d          }t          j        |          st          j        |g          }t          j                            t$          j                            dt$          j                            d                    |          }t          j        j                  }nt/          |          }d }t0          dk    r; |  |||           |||	          f |||
           |||          f|||          S  |  |||           |||	          f |||
           |||          f||          S )NTr   c                z    t          j        | t          t          |j                  z
                      S )Nbroadcast_dimensions)r   broadcast_in_dimrt  rv   rs   )r   r   aval_outr  ranks     rF   
_broadcastz3_threefry2x32_gpu_lowering_rule.<locals>._broadcast  sB     a6;D3tz??<RTX6Y6Y[ [ [ [rH   ru   ru   r2   )r   rP     )r   threefry_gpu_kernel_loweringr  _threefry2x32_lowering_ruler  r  rv   rs   r   full_like_avalr   r   mulr   is_constant_dimeval_dynamic_shape_as_tensorr#   r"  r"   RankedTensorTypegetIntegerTypeget_signlessr@   jaxlib_version)lowering_funcr  r#  r$  rU  rV  forward_compatibility_mode
aval_out_2k1_avalk2_avalx1_avalx2_avalrI  r`  out_lenlengthoutput_shaper^  r_  s    `               @@rF   _threefry2x32_gpu_lowering_rulerx    s*   		,	2 <&sBB;;;  $(J	Z				'*|$'7GW	X^		$(.Q11E5>[ [ [ [ [ [ [ 268>1--'		g	&	& .sWI>>FX
bn&A&A"&E&EFF F 4S(.IILL\\FLz!!=	B	 	 **R"9"9:	B	 	 **R"9"9:F"	$ $ $ =ZG$$jjW&=&=>ZG$$jjW&=&=>  rH   threefry2x32cpu)platformcudarocmc                    t          |           dk    r+t          j        dt          j        d                    fdz  S t
                              |           S )aZ  Reshaped ``uint64`` iota, as two parallel ``uint32`` arrays.

  Setting aside representation, this function essentially computes the
  equivalent of::

    jax.lax.iota(dtype=np.uint64, size=math.prod(shape)).reshape(shape)

  However:

  * It returns two parallel ``uint32`` arrays instead of one
    ``uint64`` array. This renders it invariant under either setting of
    the system-wide ``jax_enable_x64`` configuration flag.

  * It lowers in a way such that the compiler's automatic SPMD
    partitioner recognizes its partitionability.

  For example::

    >>> import numpy as np
    >>> from jax import lax
    >>> from jax._src import prng

    >>> prng.iota_2x32_shape((3, 4))
    [Array([[0, 0, 0, 0],
            [0, 0, 0, 0],
            [0, 0, 0, 0]], dtype=uint32),
     Array([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]], dtype=uint32)]

    >>> def reshaped_iota(shape):
    ...   return lax.iota(size=math.prod(shape), dtype=np.uint32).reshape(shape)
    ...
    >>> reshaped_iota((3, 4))
    Array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]], dtype=uint32)

  Args:
    shape: the output shape

  Returns:
    A pair of ``uint32`` arrays ``(counts_hi, counts_lo)``, both of
    shape ``shape``, representing the higher-order and lower-order 32
    bits of the 64 bit unsigned iota.
  r   rd   rz   rL   r  )rv   r  rI  ry   rt   iota_2x32_shape_pr  r  s    rF   iota_2x32_shaper    sO    ^ 	ZZ1__Ib"(8,,--/!33			e		,	,,rH   r  c                X    t          j        | t          j        d                    fdz  S )Nrz   rL   )r   r   ry   rt   r  s    rF   iota_2x32_shape_abstract_evalr    s'    

5"(8"4"4
5
5	7!	;;rH   add(Callable[[ir.Value, ir.Value], ir.Value]rf  ,Callable[[core.DimSize, ir.Value], ir.Value]
core.ShapeiotasSequence[ir.Value]ir.Valuec                    g t          j        |dd          d d d                   d d d         dR }t          | fdt          ||          D                       S )Nru   c                .    g | ]\  }} ||          S rd   rd   )rP   r>  r   rf  s      rF   rS   z0bcast_iotas_to_reshaped_iota.<locals>.<listcomp>  s'    @@@DAqcc!Qii@@@rH   )ry   cumprodr   rj  )r  rf  rs   r  stridess    `   rF   bcast_iotas_to_reshaped_iotar    sn    
 B2:eABBi"o66ttt<AqAA'	@@@@Cw,?,?@@@	A	AArH   c                    j         \  }}t          j        |t          j        d                    dd}d fd}t          |          d	k    sJ  fd
t          t          |                    D             }t          ||||          }t          j	        t          j
        dt          j        d                              }t          j         |g           }t          j                            ||          }	t          j                            t          j        |          |          }
t          j                            t          j        |          |	          }||
fS )Nuint64r   r  r  r?   c                B    t           j                            | |          S rB   )r   r#   r  )r   r  s     rF   _addz&iota_2x32_shape_lowering.<locals>._add  s    8<<1rH   core.DimSizec           
        t          j        |           r:t          j        t	          j        | t	          j        d                              }not          j        | f          \  }t          j	        t          j                            g t          j        t	          j        d                              |          }t          j        |g           }t          j                            ||          S )Nr  r[  )r   rg  r   ir_constantry   r*  rt   eval_dynamic_shaper#   r"  r"   ri  rj  dtype_to_ir_typer]  multiply)r   r  x_constx_shapex_bcastaval_u64r  s        rF   _mulz&iota_2x32_shape_lowering.<locals>._mul  s    A C !RXh-?-?!@!@AAgg(qd33hg


!
!#BHX$6$6779 9:AC Cg #C(9;= = =G8Wa(((rH   r   c                >    g | ]}t          j        |           S ))	dimension)r   iota)rP   r  r  r  s     rF   rS   z,iota_2x32_shape_lowering.<locals>.<listcomp>   s:     / / / 9S(i888 / / /rH   r1   r[  )r   r  r  r  r?   r  )r   r  r  r  r?   r  )r  r   r   ry   rt   rv   rt  r  r   r  r*  r]  r#   r  r"  aval_to_ir_type)r  rs   r^  r   r  r  r  countsshiftcounts_shifted	counts_lo	counts_hir  s   `           @rF   iota_2x32_shape_loweringr  
  sq   +(AeRXh%7%788(   ) ) ) ) ) ) ) 
Ua/ / / / /!#e**--/ / /%'dE5AA&

28B(:(:;;
<
<%

UH579 9 9%8//>>.ht3H==vFF)ht3H==~NN)	I	rH   c           
        | \  }}t          j        |          t          j        |          cxk    r)t          j        |          cxk    rt          j        k    s3n d}t	          |                    d |||fD                                 |j        dz  }t          |t                    sd}t          j
        |          |r\t          t          j        t          j        |                                t          j        dg          g          d                    }n4t          t          j        |                                d                    }t                               |||d         |d                   }t          j        |          }|j        t          j        k    sJ t          j        |r
|dd         n||j                  S )	rF  z/threefry_2x32 requires uint32 arguments, got {}c                6    g | ]}t          j        |          S rd   )r   rt   rh  s     rF   rS   z!threefry_2x32.<locals>.<listcomp>;  s     JJJ	!JJJrH   rL   zjax.random functions have limited support for shape polymorphism. In particular, the product of the known dimensions must be even.r   ru   Nr  )r   rt   ry   rz   rx   r3  r   r   r@   r   InconclusiveDimensionOperationr<  r  r8   r!  r   threefry2x32_pr  r   rs   )keypaircountrS  rT  msgodd_sizer   r   s           rF   threefry_2x32r  -  s    *$	4CIdOO	L	L	L	Lsy/?/?	L	L	L	L29	L	L	L	L
;C
CJJJJtT56IJJJKK
L
LLZ!^(	Hc	"	" 3NC

-c
2
22 *SYsry!~~'FGGKKLLAASYu{{}}a(())A$adAaD11!#	bi					2S"XXsEK	@	@@rH   c                p    t          t          t          j        |                    }t	          | |          S rB   )rR  
unsafe_mapr   concrete_dim_or_error_threefry_splitr  rs   s     rF   threefry_splitr  N  s,    

45u==
>
>%	e	$	$$rH   ra  )static_argnumsc                d    t           j        j        rt          | |          S t	          | |          S rB   )r   threefry_partitionabler  _threefry_split_foldlike_threefry_split_originalr  s     rF   r  r  R  s0    "( 0#C///#C///rH   )r  r  c                    t          j        |          }t          j        t          j        |dz            }t          j        t          | |          g |dR           S )NrL   )r   r   r   r  ry   rz   r   r  )r  rs   numr  s       rF   r  r  Y  sN    	%#8BIsQw''&	]3//5!	=	==rH   c                    | \  }}t          |          \  }}t                              ||||          \  }}t          j        ||g|j                  S )Nrz  )r  r  r  r  stackrr   )r  rs   r#  r$  counts1counts2bits1bits2s           rF   r  r  _  sU    &"b$U++'7$$RWg>>,%	E5>
	3	3	33rH   r   c                X    |j         rJ t          | t          j        |                    S rB   )rs   _threefry_fold_inr  rz   r  r   s     rF   threefry_fold_inr  g  s*    Z	3
4 0 0	1	11rH   c                <    t          | t          |                    S rB   )r  r  r  s     rF   r  r  k  s    	sM$//	0	00rH   c                    t          |           st          d          |dvrt          d          t          j        j        rt          | ||          S t          | ||          S )zCSample uniform random bits of given width and shape using PRNG key.z*threefry_random_bits got invalid prng key.r.   ,requires 8-, 16-, 32- or 64-bit field width.)r  rx   r   r  r  #_threefry_random_bits_partitionable_threefry_random_bits_original)r  r  rs   s      rF   threefry_random_bitsr  p  so    	s	#	# B
@
A
AAo%%
B
C
CC"( A.sIuEEE)#y%@@@rH   c                   t          d |D                       r't          j        |          dk    rt          d          | \  }}t	          |          \  }}t
                              ||||          \  }}t          |         }	|dk    rKt          j	        ||	          }
t          j	        ||	          }t          j
        |
 |	d                    |z  S |dk    r||z  S t          j	        ||z  |	          S )Nc              3  >   K   | ]}t          j        |          V  d S rB   )r   rg  )rP   r  s     rF   rq   z6_threefry_random_bits_partitionable.<locals>.<genexpr>}  s-      00Q	a	 	 000000rH   l            z+random bits array of size exceeding 2 ** 64r2   r1   )rw   r   r   NotImplementedErrorr  r  r  UINT_DTYPESr   r  r'  )r  r  rs   r#  r$  r  r  r  r  rt   bits_hibits_los               rF   r  r  |  s    00%00000 MTYu5E5E5O5O
K
L
LL&"b$U++'7$$RWg>>,%
i
 %"__&ue44G&ue44G>'5599--77B5=#EEM5999rH   )ru   rL   c                   t          j        |          }t          ||z  d          \  }}|dk    r|dz  }t          j        |          r5t          |t          j        t          j                  j	                  \  }}nd|}}|s.t          | t          j        t          j        |                    }nt          | |dz   f          }	|	d d         |	d         }}
 t          t          d          |
t          j        t          j        t          j        t          j                  j	                            }t          |t          j        t          j        |                    }t          j        |                                |gd          }t"          |         |dk    rOfdt          j        |d	          D             }t          j        |d          d                    |d         z  }n|d
v rt          j        t          j        t          j                  j	                  t          j        t          j        |d          t          j        t          j        |          t          j        t          j        d|z  dfd                                        }t          j        ||dz  |z  fd          }t          j        |          d |         }t          j        ||          S )Nr1   r   ru   r  r}  )r~  r2   c                :    g | ]}t          j        |          S rd   )r   r  )rP   r   rt   s     rF   rS   z2_threefry_random_bits_original.<locals>.<listcomp>  s&    KKK1C$Q..KKKrH   rL   )r/   r0   ra  )ru   r   )r   r   divmodr   rg  r  r+  ry   rz   maxr  r   r  r  r   r!  r   r  r8   r'  r   r  	broadcastrf  broadcasted_iotar   r  )r  r  rs   r   	max_countrB  nblocksremr  r  subkeyslast_keyblockslastrt   s                 @rF   r  r    s   	5		$ 	D("--,)QUUNI	)$$  )SYry%9%9%=>>LGSSiSG	 6chry#6677DD#!~..DSbS	48XG3T-333GSXbiQTQZ[][dQeQeQi=j=jkkF38BIs#;#;<<D?FLLNND1155D
i
 %"__KKKK	$8J8JKKKD>$q'5599--Q7DDG?i#$$	dD!!
)I



ry2?A*>
B
B	
 	
 	 	D ;ty2~:=vFFD#D%00$7D	T5	!	!!rH   r  fry)r6   r7   r8   r9   r:   r<   r>   c                ^    | j         rJ t          |           }t          j        ||g          S rB   )rs   r  r  r!  )r7   halfkeys     rF   	_rbg_seedr    s2    Z$'	'7+	,	,,rH   c           	         t           j        j        rt          }nt          }|                     dd          }  t          |dt          |                    ||          j        g |dR  S )NrL   r}  rP  )r   r  r  r  r  r   r   rv   )r  rs   r  halfkeyss       rF   
_rbg_splitr    s    "( /.OO.O[[A(
G 
.y#e**
. 
..6
? 
??F


 
 
 rH   c                    |j         rJ  t          t          dd          |                     dd          |                              d          S )Nr}  r   rL   rP  )rs   r   r  r   r  s     rF   _rbg_fold_inr    sL    Z	.A	.	.s{{1a/@/@$	G	G	O	OPQ	R	RRrH   r  r@   Sequence[int]c                    | j         dk    s,| j        t          j        d          k    rt          d          |dvrt          d          t	          j        | |t          |                   \  }}|S )NrP  rz   z&_rbg_random_bits got invalid prng key.r.   r  r  )rs   rt   r  rx   r   rng_bit_generatorr  )r  r  rs   r   r  s        rF   _rbg_random_bitsr    ss    	d		syCIh,?,???
<
=
==o%%
B
C
CC!#uK	4JKKK'!T	+rH   r  rbgc                    t          j        |          }t          j        | d|z  dfd          \  }} t          j        |d d d          j        g |dR  S )N
   rP  rz   r  )start_indexlimit_indexstride)r   r   r   r  slice_in_dimr   )r  rs   r  r   r  s        rF   _unsafe_rbg_splitr    s    	%#!#S!}HEEE'!T
C	
$r
; 
; 
;;B
NDI
NKL
N 
N 
N NrH   c                x    |j         rJ t          j        t          |          dd          \  }}| |d         z  S )N)r  rP  rz   r  r  )rs   r   r  r  )r  r   r   r9   s       rF   _unsafe_rbg_fold_inr    s@    Z(4'RRR.![	{2	rH   
unsafe_rbgurbg)re   r4   )rk   rl   )re   r4   r7   r   r?   r}   )rd  re  )r  r   re   r4   r?   r}   )rs   r5   )r  rl   r?   rK  )r7   rl   r?   rl   )T)
r  r  rf  r  rs   r  r  r  r?   r  )r  rl   rs   r5   r?   rl   )r?   rl   )r  rl   r   rl   r?   rl   )r  rl   )r  rl   r  r@   rs   r  r?   rl   )
__future__r   collections.abcr   r   r   	functoolsr   r   r   operatorr   r   r	   r
   r   ry   jaxr   r  r   jax._srcr   r   r   r   r   r   r   rN   r   tree_util_internaljax._src.apir   r   jax._src.dtypesr   jax._src.interpretersr   r   r   r   r   jax._src.laxr  jax._src.libr   r    xcr!   rm  jax._src.lib.mlirr"   jax._src.lib.mlir.dialectsr#   jax._src.numpy.array_methodsr$   r%   r&   jax._src.sharding_implsr'   r(   r)   r*   jax._src.typingr+   jax._src.utilr,   r-   r  r  rj  
unsafe_zipDeviceShardrR  r@   r5   uint8uint16rz   r  r  r4   rg   rj   r{   r}   r   _shaped_abstractify_handlersr   r   dispatch_registryregister_noder   r   r   r   ExtendedDTyper   pytype_aval_mappingscanonicalize_dtype_handlersro  shard_arg_handlersrr  register_constant_handlerrw  r  r  r   	Primitiver  defjvp_zerodefvectorizeddef_abstract_evalr  def_implr  r  r  register_loweringr  r  r  r  r  r  r  r  defbroadcastingr  r  r  r  r9   r  r  r  r  r  r  r  r  r  r  r  primitive_batchersr  r  r  r
  r  r  r  r  r,  r6  r8  r:  r<  rD  rX  r  rd  _threefry2x32_cpu_lowering_rulerx  r  r  apply_primitivecuda_threefry2x32rocm_threefry2x32r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  threefry_prng_implr  r  r  r  rbg_prng_implr  r  unsafe_rbg_prng_implrd   rH   rF   <module>r+     s*   # " " " " " 8 8 8 8 8 8 8 8 8 8 % % % % % % % %      " " " " " " " "     



                               % % % % % %                   ) ) ) ) ) ) % % % % % % 4 4 4 4 4 4       " " " " " " " " " " " " " " $ $ $ $ $ $ * * * * * * & & & & & & & & & & & & % % % % % % , , , , , , ! ! ! ! ! ! ) ) ) ) ) ) 2 2 2 2 2 2             * * * * * *F F F F F F F F F FF F F F F F F F F F F F ! ! ! ! ! ! , , , , , , , ,CZCZ	c3h ycjcjcjB B
$ $ $ $ $z $ $ $N 	   3 3 3 3 [> [> [> [> [>39 [> [> [>z  < 25--,---2525
2525'25 25 25 "25 $/25 1425 6 6 6 6
 7DbmF6K6K %l 3# # #( ( (  $ 2 2&(>@ @ @
& & & &. . .% % %
o o o o o o o od. . . . .F  . . .4 +;*: , ')9)9  &0;  -/ / / / )D  %3 3 3  |-G H H H
  	 	 	  &
2 
2 
2 
2 }-- }     } % % % 3 3 ! 3 & & &  8 8 8  }&: ; ; ;0 0 0 0  // ~     ~ & & &!N N "!N , , ,
  8 8 8  ~'< = = =8 8 8 "4>"233          ) * * *#2 2 $#2
 , , ,
! ! !
	8 	8 	8  ')@ A A AD D D }-- }     } % % % 0 0 ! 0
 A A A  
	 	 	  }&: ; ; ;.1 1 1 }-- }    ( ( ! ( & & &  & & &  }&: ; ; ;-C M *$ $ $
 !$.11       ' ' '"' ' #"'       (> ? ? ?       	T& & & &   	 	 	  	**    8 8 80 0 0 0f -dnG"U;;;    #1$.G"T:::# # # 
. . .`  //"&     8.II J J J     !< = = =   ( ( (  /1 1 1  3eE E E E  G+X-GHH     G+X-GHH   1- 1- 1-f #DN#455 %)  "   778#;=NOO P P P$< < %$<B B B B  @  (*B C C C 	TA A A@% % % % 	T"""0 0 0 #"0 	T$///> > > 0/>
 	T$///4 4 4 0/42 2 2 2 1 1 1
A 
A 
A 
A: : : :$ 	VD111(" (" (" 21("V X	
$	      ! ! !- - - -
   S S S S    	
 	   m   N N N N   
  x	
 	    " # # # # #rH   