
    Wh?              	         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l1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z= d dl>m?Z? d d l@mAZAmBZB eAeCcZCZDeBeEcZEZFe0jG        ZGeZHeIeJd!f         ZKejL        ejM        ejN        ejO        d"ZP G d# d$e          ZQi ZRdd&ZSdd)ZT G d* d+ej?                  ZU e7eUg d, e6D             d-d.d/d0d1d2d3d4d56            ejV        d7          ejW        eU<   d8 ZXd9 ZYejZ        [                    eUeXeY           dd=Z\d> Z]d? Z^ G d@ dA          Z_ G dB dCej`                  ZadD ejb        eU<   dE ejc        eU<   dF e*jd        eU<   ddIZeeee)jf        eU<   dJ Zg e(jh        eUeg           dK ZidL ZjdM ZkddOZl ejm        dP          Zn e&jo        en            e'jp        en           enjq        dQ             Zrenjs        dR             ZtdS ZudT Zv e(jw        enev           ddWZx ejm        dX          Zy e&jo        ey            e'jp        ey           eyjq        dY             Zzeyjs        dZ             Z{d[ Z|d\ Z} e(jw        eye}           d] Z~ ejm        d^          Z e&jo        e            e'j        e           ejq        d_             Zejs        d`             Zda Zdb Z e(jw        ee           dc Z ejm        dd          Z e&jo        e            e'jp        e           ejq        de             Zejs        df             Zdg Zdh Z e(jw        ee           di Z ejm        dj          Z e&jo        e           ejq        dk             Zejs        dl             Zdm Zdn Z e(jw        ee           ee'j        e<   do Z ejm        dp          Z e&jo        e            e'jp        e           ejq        dq             Zejs        dr             Zds Z e(jw        ee           ddvZddwZ ee!dxy          ddz            Zd{ Zd| Z eejN                  Zd} Zd~ Zd ZddZ e(j         e(j         eed          dx                    Z e(j         eedx          dx          Zd Z ejm        d          Zdxe_        es                     eej        e                     eq                    e            e'j        e            e(jw        ee            e(jw        eed            e(jw        e eee.j                  d            e(jw        e eee.j                  d           d Z ejm        d          Zdxe_        es                     eej        e                     ejq        d             ZddZd Z e(jw        ee            ee!dxy          d             ZddZ ee!d          dd            Z ee!ddx          dd            Z ee!ddx          dd            ZddZe!d             ZddZddZ ee!ddx          dd            Z eQdeeeedd          Z eSe           ddZddZddZddZ eQdeeeedd          Z eSe           ddZddZ eQdeeeedd          Z eSe¦           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)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    S/var/www/html/movieo_spanner_bot/venv/lib/python3.11/site-packages/jax/_src/prng.py__hash__zPRNGImpl.__hash___   s    >>    c                    | j         S rA   )r=   rC   s    rE   __str__zPRNGImpl.__str__b   s	    8OrG   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      rE   
<listcomp>z#PRNGImpl.pprint.<locals>.<listcomp>h   s=     > > >(,1bgllqll##> > >rG   )	__class____name__rM   rN   r=   r;   nestgroupbrkjoin_asdictitems)rD   tys     rE   pprintzPRNGImpl.pprinte   s    		 BGr99TX9949999::GArx272688 > >040D0D0F0F> > > , , !     rG   Nr>   r?   r>   r:   )
rT   
__module____qualname____doc____annotations__r;   r=   rF   rI   r\    rG   rE   r3   r3   F   s            ...///$#....          rG   r3   implc                t    | j         t          v rt          d| j          d|            | t          | j         <   d S )NzPRNG with name z already registered: )r;   prngs
ValueErrorrd   s    rE   register_prngri   o   sB    	Y%
MtyMMtMM
N
NN%	rG   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 rA   )hasattr)rO   attrrj   s     rE   	<genexpr>z'_check_prng_key_data.<locals>.<genexpr>y   s-      LLWXt$$LLLLLLrG   )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=)
lenr5   all	TypeErrorrq   rr   rs   npuint32r   )rd   rj   rq   s    ` rE   _check_prng_key_datarz   w   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 /.rG   c                     e Zd ZU dZded<   ded<   ded<   dZd	ed
<   dBd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dCd#Ze	dDd%            Ze	dDd&            Ze	d'             Ze	d(             Z d) Z!d* Z"dEd,Z#d- Z$d. Z%d/ Z&dZ'd0Z(dFdGd6Z)e	dHd8            Z*e	dId9            Z+dId:Z,dId;Z-dId<Z.dId=Z/dId>Z0dId?Z1dId@Z2dIdAZ3dS )J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``).
  r3   _implrk   _base_arrayzbool | np.ndarray	_consumedNz"None | source_info_util.SourceInfo_source_inforj   r	   c                    t          |t          j                  rJ t          ||           || _        || _        d| _        d S )NF)
isinstancer   Tracerrz   r}   r~   r   )rD   rd   rj   s      rE   __init__zPRNGKeyArray.__init__   sD    (DK00000x(((DJDDNNNrG   c                8    | j                                         }| S rA   )r~   block_until_readyrD   _s     rE   r   zPRNGKeyArray.block_until_ready   s    **,,AKrG   c                8    | j                                         }d S rA   )r~   copy_to_host_asyncr   s     rE   r   zPRNGKeyArray.copy_to_host_async   s    ++--AAArG   c                6    t          | j        | j                  S rA   )keys_shaped_arrayr}   rr   rC   s    rE   avalzPRNGKeyArray.aval   s    TZ444rG   c                @    t          | j        | j        j                  S rA   )base_arr_shape_to_keys_shaper}   r~   rr   rC   s    rE   rr   zPRNGKeyArray.shape   s    '
D4D4JKKKrG   c                4    t          j        | j                  S rA   )mathprodrr   rC   s    rE   sizezPRNGKeyArray.size   s    9TZ   rG   c                *    t          | j                  S rA   )ru   rr   rC   s    rE   rq   zPRNGKeyArray.ndim   s    tz??rG   c                *    t          | j                  S rA   )KeyTyr}   rC   s    rE   rs   zPRNGKeyArray.dtype   s    rG   c                    | j         j        S rA   )rs   itemsizerC   s    rE   r   zPRNGKeyArray.itemsize   s    :rG   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 rA   )r|   r}   r~   addressable_data)rD   r   s     rE   r   zPRNGKeyArray.addressable_data   s%    
D$4$E$Ee$L$LMMMrG   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rO   srD   s     rE   rR   z3PRNGKeyArray.addressable_shards.<locals>.<listcomp>   b         	Q9[dj!'22		
 	
 	
  rG   )r~   addressable_shardsrC   s   `rE   r   zPRNGKeyArray.addressable_shards   s6        !4   rG   c                4      fd j         j        D             S )Nc                    g | ]E} t          |          |j        |j        |j        t	          j        |j                             FS r   r   r   s     rE   rR   z.PRNGKeyArray.global_shards.<locals>.<listcomp>   r   rG   )r~   global_shardsrC   s   `rE   r   zPRNGKeyArray.global_shards   s6        !/   rG   c                @    t          | j        | j        j                  S rA   )r)   r   r~   r   rC   s    rE   r   zPRNGKeyArray.sharding   s    DIt'7'@AAArG   c                    | j         j        S rA   )r~   	committedrC   s    rE   r   zPRNGKeyArray.committed   s    %%rG   c                T    t          | j        j                  }| j        j        |k    S rA   )ru   r}   r5   r~   rq   )rD   	base_ndims     rE   
_is_scalarzPRNGKeyArray._is_scalar   s%    DJ())I I--rG   c                p    |                                  rt          d          t          | j                  S )Nzlen() of unsized object)r   rw   ru   r~   rC   s    rE   __len__zPRNGKeyArray.__len__   s4     1/000t   rG   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 rA   )r|   r}   )rO   rP   rD   s     rE   rp   z(PRNGKeyArray.__iter__.<locals>.<genexpr>  s/      HHALQ''HHHHHHrG   )r   rw   iterr~   rC   s   `rE   __iter__zPRNGKeyArray.__iter__   sL     86777 IHHHd6F1G1GHHHHrG   c                @    d| j          d| j        j         d| j         S )NzArray(z, dtype=z) overlaying:
)rr   rs   r;   r~   rC   s    rE   __repr__zPRNGKeyArray.__repr__  s:    "TZ " " " "" " #rG   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:rK   )	rM   rN   r:   rr   r}   r\   rV   rU   rW   )rD   pp_keyspp_impls      rE   r\   zPRNGKeyArray.pprint  s    gj!!BGC
OO$<$<<Ggi  4:#4#4#6#66GrxgogaG#bfhh.899:; ; < < <rG   c                    |                      | j        | j                                                  }| j        |_        |S rA   )rS   r}   r~   copyr   )rD   outs     rE   r   zPRNGKeyArray.copy  s4    
..T%5%:%:%<%<
=
=CNCMJrG   d   rs   np.dtype | Noner   bool | None
np.ndarrayc                     t          d          )NzJAX array with PRNGKey dtype cannot be converted to a NumPy array. Use jax.random.key_data(arr) if you wish to extract the underlying integer array.)rw   )rD   rs   r   s      rE   	__array__zPRNGKeyArray.__array__  s    
 & ' ' 'rG   r%   c                    J rA   rc   rC   s    rE   atzPRNGKeyArray.at   s    7CerG   c                    J rA   rc   rC   s    rE   TzPRNGKeyArray.T"  s    1=rG   c                    J rA   rc   r   s     rE   __getitem__zPRNGKeyArray.__getitem__$      rG   c                    J rA   rc   rD   r   __s      rE   flattenzPRNGKeyArray.flatten%  r   rG   c                    J rA   rc   r   s      rE   ravelzPRNGKeyArray.ravel&  r   rG   c                    J rA   rc   r   s      rE   reshapezPRNGKeyArray.reshape'  r   rG   c                    J rA   rc   r   s      rE   squeezezPRNGKeyArray.squeeze(  r   rG   c                    J rA   rc   r   s      rE   swapaxeszPRNGKeyArray.swapaxes)  r   rG   c                    J rA   rc   r   s      rE   takezPRNGKeyArray.take*  r   rG   c                    J rA   rc   r   s      rE   	transposezPRNGKeyArray.transpose+  r   rG   )rj   r	   )r   r?   r>   r|   )r>   r   )r>   r   )NN)rs   r   r   r   r>   r   )r>   r%   )r>   r|   )4rT   r_   r`   ra   rb   r   r   r   r   propertyr   rr   r   rq   rs   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\   r   rF   __array_priority__r   r   r   r   r   r   r   r   r   r   r   rc   rG   rE   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 & & 8&. . .! ! !
I I I I# # #< < <  
 (' ' ' ' ' CCC 8C=== 8===================================rG   r|   c              #  "   K   | ]
}d | d V  dS )r   Nrc   )rO   r   s     rE   rp   rp   .  s*      --bk2kkk------rG   r   r   r   r   r   r   r   r   r   )includer   c                     | j         f| j        fS rA   )r~   r}   xs    rE   prngkeyarray_flattenr   4  s    
-	17	""rG   c                *    |\  }t          | |          S rA   r|   )rd   children
base_arrays      rE   prngkeyarray_unflattenr   7  s    +*	dJ	'	''rG   r6   int | typing.ArrayLiker>   c                $    t          ||           S Nrh   )random_seed)rd   r6   s     rE   seed_with_implr   @  s    	T	%	%	%%rG   c                F    t          j        |t          |                     S rA   )r   ShapedArrayr   )rd   rr   s     rE   r   r   D  s    		%t	-	--rG   c                @    t          | j                  }|d |          S rA   )ru   r5   )rd   base_arr_shaper   s      rE   r   r   G  s"    $.!!)	)	$$rG   c                     e Zd ZU dZded<   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dS )
KeyTyRulesFboolallow_conversionc                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 )Nrs   ry   rs   rh   )r}   r5   rn   jnp
issubdtypers   r   prng_keybroadcast_torandom_unwrapr   fullrx   random_wrap)rr   
fill_valuers   physical_shaperj   s        rE   r  zKeyTyRules.fullO  s    5u5u{455Nz7## Pz7G(Y(Y P!-
";";^LLhh.*BHX<N<NOOOh xek2222rG   r>   core.ShapedArrayc                d    t          j        | j        j        t	          j        d                    S Nry   )r   r   r}   r5   r	  rs   r  s    rE   physical_element_avalz KeyTyRules.physical_element_avalZ  s$    EK139X3F3FGGGrG   r*   c                    | j         S rA   r~   )vals    rE   physical_constzKeyTyRules.physical_const^  s
    ?rG   c                    fd}|S )Nc                    t          j        |j        |j                  |_        t          j        j        |          S rA   )r   r   rr   rs   r   r|   r}   )r   bufr   s     rE   handlerz*KeyTyRules.result_handler.<locals>.handlerd  s0    !#)SY77ch$**C000rG   rc   )sticky_devicer   r  s    ` rE   result_handlerzKeyTyRules.result_handlerb  s#    1 1 1 1 1 NrG   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 rc   rc   )rO   indstrailing_indss     rE   rR   z;KeyTyRules.local_sharded_result_handler.<locals>.<listcomp>w  s'    @@@+d+]++@@@rG   c                J    t          j        j         |                     S rA   r|   rs   r}   bufsr   phys_handlers    rE   r  z8KeyTyRules.local_sharded_result_handler.<locals>.handler}  "    $**LL,>,>???rG   )r   physical_avalrs   r}   r5   r   local_result_handlersr   r   r'   r&   r(   sliceru   )r   r   indices	phys_avalr5   phys_handler_makerphys_shardingphys_indicesr  r(  r#  s   `        @@rE   local_sharded_result_handlerz'KeyTyRules.local_sharded_result_handleri  s    "4((I
 *I3D4DE (\=9:: V'h77mmUU8UUUUUU 4[[MC	NN2M@@@@@@@L &%iMML@ @ @ @ @ @ NrG   c                     t          j                   }t          j        t           j                 }t           |          } ||||           fd}|S )Nc                J    t          j        j         |                     S rA   r%  r&  s    rE   r  z9KeyTyRules.global_sharded_result_handler.<locals>.handler  r)  rG   )r   r*  r   global_result_handlersr   r(   )r   out_shardingr   r.  r/  r0  r  r(  s   `      @rE   global_sharded_result_handlerz(KeyTyRules.global_sharded_result_handler  sq    "4((I4T5EF%dL99M%%i	JJL@ @ @ @ @ @NrG   c                    t          j        |           }t          j        t           j                 }d |D             }t          | |          } ||||          } ||          }	t          | j        j        |	          S )Nc                ,    g | ]}t          |          S rc   )r  )rO   arrs     rE   rR   z1KeyTyRules.make_sharded_array.<locals>.<listcomp>  s     888#=%%888rG   )	r   r*  r   r5  r   r(   r|   rs   r}   )
r   r   arraysr   r.  r/  phys_arraysr0  r(  phys_results
             rE   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6rG   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  rs   r}   )valsr   r   r   r*  physical_buffersr0  physical_results           rE   device_put_shardedzKeyTyRules.device_put_sharded  so    &t,,M )->>%dH55M-m].>WO OOTZ-=>>>>rG   c                <   t          j        |          }t          t          j        |                    dk    sJ t          |           }t          ||          }t          j        |||gt          |          z  |          }t          ||j
        j                  S )Nrt   rh   )r   r*  ru   r   aval_to_xla_shapesr  r(   r   rA  r  rs   r}   )r  r   r   r   r*  physical_bufr0  rE  s           rE   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-=>>>>rG   c                    t           j        S rA   )r   r   r   s    rE   tangent_dtypezKeyTyRules.tangent_dtype  s
    =rG   c                @    t          j        dt          j                  S )Nrc   )rx   zerosr   r   rL  s    rE   zerozKeyTyRules.zero  s    8B&&&rG   N)r>   r  )r>   r*   )rT   r_   r`   r  rb   staticmethodr  r  r  r  r2  r7  r>  rF  rJ  rM  rP  rc   rG   rE   r  r  L  s]             3 3 <3 H H H <H    <   <   <0   < 7 7 <7 ? ? <? ? ? <?   < ' ' <' ' 'rG   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   r3   r}   c                    || _         d S rA   )r}   )rD   rd   s     rE   r   zKeyTy.__init__  s    DJJJrG   r>   r:   c                "    d| j         j         dS )Nzkey<>)r}   r=   rC   s    rE   r;   z
KeyTy.name  s    #$*.####rG   r?   c                r    t          j        | j        j                  t	          j        d          j        z  S r  )r   r   r}   r5   rx   rs   r   rC   s    rE   r   zKeyTy.itemsize  s)    9TZ)**RXh-?-?-HHHrG   c                    | j         S rA   )r;   rC   s    rE   r   zKeyTy.__repr__  s
    9rG   c                N    t          |          t          u o| j        |j        k    S rA   )r   r   r}   )rD   others     rE   __eq__zKeyTy.__eq__  s!    ;;%=DJ%+$==rG   c                8    t          | j        | j        f          S rA   )rB   rS   r}   rC   s    rE   rF   zKeyTy.__hash__  s    ,---rG   Nr^   r]   )rT   r_   r`   rb   r  _rulesr   r  r   r   r   r;   r   r   rZ  rF   rc   rG   rE   r   r     s         ///&	$   $ $ $ 8$ I I I 8I   > > >. . . . . .rG   r   c                    | j         S rA   r   r   s    rE   <lambda>r_    s    AF rG   c                    | j         S rA   r^  r   s    rE   r_  r_    s     rG   c                    | S rA   rc   r   s    rE   r_  r_    s    ! rG   xsSequence[PRNGKeyArray]c                |    d | D             }d t          | |          D             }t          j        ||||          S )Nc                    g | ]	}|j         
S rc   r  rO   r   s     rE   rR   z/key_array_shard_arg_handler.<locals>.<listcomp>  s    	$	$	$A!-	$	$	$rG   c                >    g | ]\  }}t          |j        |          S rc   )r(   r   )rO   r   r   s      rE   rR   z/key_array_shard_arg_handler.<locals>.<listcomp>  s8     ; ; ;#8 &afh77 ; ; ;rG   )zipr   
shard_args)rb  	shardingslayoutscopy_semanticsarrsphys_shardingss         rE   key_array_shard_arg_handlerro    sU    	$	$	$	$	$$; ;'*2y'9'9; ; ;. 
.$	G	GGrG   c                d    | j         } t          j        t          |                    |          S rA   )r~   r   get_constant_handlerr   )r   r:  s     rE   key_array_constant_handlerrr    s*    	#	-	"499	-	-c	2	22rG   c                R    t          |           D ]}t          j        |          }|S rA   )ranger   r   )nfr   s      rE   iterated_vmap_unaryrw    s+    88  aAA	
(rG   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      rE   squeeze_vmap_fz$squeeze_vmap.<locals>.squeeze_vmap_f  sb     
+aa
 
 
 add
+aa
 
 
 ad038Ata000A666rG   rc   )rv  r  r  s   `` rE   squeeze_vmapr    s*    7 7 7 7 7 7 
rG   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 rA   rc   )r  rv  r   s    rE   r_  z>iterated_vmap_binary_bcast.<locals>.<lambda>.<locals>.<lambda>      qqAww rG   rw  )r   r  rv  ndim2s   ` rE   r_  z,iterated_vmap_binary_bcast.<locals>.<lambda>  +    G-e5F5F5F5F5FGGJJ rG   c                @     t          fd          |           S )Nc                     |           S rA   rc   )r   rv  r  s    rE   r_  z>iterated_vmap_binary_bcast.<locals>.<lambda>.<locals>.<lambda>  r  rG   r  )r   r  rv  ndim1s    `rE   r_  z,iterated_vmap_binary_bcast.<locals>.<lambda>  r  rG   )r  rt   )ru   reversedrh  r   r   r  )shape1shape2rv  sz1sz2r  r  s     `  @@rE   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	
(rG   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	  asarrayrx   int64r   random_seed_offsetvaluerandom_seed_pbind)r  rd   	seeds_arrs      rE   r   r     su     s #BHUOO,,IIE""I$ 1*00I			ID		1	11rG   r   c               ,    t          || j                  S rA   )r   rr   )
seeds_avalrd   s     rE   random_seed_abstract_evalr  #  s    	4!1	2	22rG   c               D    t          | |          }t          ||          S r   )random_seed_impl_baser|   )r  rd   base_arrs      rE   random_seed_implr  '  s$    "5t444(	dH	%	%%rG   c               f    t          t          j        |           |j                  } ||           S rA   )rw  rx   rq   r6   )r  rd   r6   s      rE   r  r  ,  s)    	RWU^^TY	7	7$	erG   c          	         | j         \  }t          |j        |j                  }t	          j        |d          }t	          j        | ||t          t          j	        | j
                            S )NFmultiple_results)	avals_out)avals_inrw  rq   r6   r   	lower_fundelegate_loweringmapr   r*  r  )ctxr  rd   r   r6   seed_lowerings         rE   random_seed_loweringr  0  se    
,%$	TY		2	2$.>>>-			=%D&66
8 
8 
8 8rG   rr   r4   c                :    t                               | |          S Nrr   )random_split_pr  )keysrr   s     rE   random_splitr  ;  s    			T		/	//rG   r  c               J    t          | j        j        g | j        |R           S rA   )r   rs   r}   rr   )	keys_avalrr   s     rE   random_split_abstract_evalr  B  s'    	9?02LIO2Le2L2L	M	MMrG   c               p    t          | j        | j        | j        |          }t	          | j        |          S r  )random_split_impl_baser}   r~   rq   r|   )r  rr   r  s      rE   random_split_implr  F  s8    #
j$"DIU< < <(	dj(	+	++rG   c               D     t          | fd          } ||          S )Nc                0                         |           S rA   r7   rP   rd   rr   s    rE   r_  z(random_split_impl_base.<locals>.<lambda>M      4::a3G3G rG   r  )rd   r  	keys_ndimrr   r7   s   `  ` rE   r  r  L  s.    
i)G)G)G)G)G
H
H%	xrG   c          
         | j         \  }|j        j        t          |j        fd          }t          j        |d          }t          j        | ||t          j	        |          gt          t          j	        | j                            S )Nc                0                         |           S rA   r  r  s    rE   r_  z'random_split_lowering.<locals>.<lambda>S  r  rG   Fr  r  r  )r  rs   r}   rw  rq   r   r  r  r   r*  r  r  )r  r  rr   r   r7   split_loweringrd   s     `   @rE   random_split_loweringr  P  s    
,%$		$
di)G)G)G)G)G
H
H%>%%@@@.			>4"4(()D&66
8 
8 
8 8rG   c                \    t                               | t          j        |                    S rA   )random_fold_in_pr  r	  r  )r  msgss     rE   random_fold_inr  ]  s"    			tS[%6%6	7	77rG   r  c                b    t          j        d| |          }t          j        || j                  S )Nr  )lax_internalbroadcasting_shape_ruler   r   rs   )r  	msgs_avalrr   s      rE   random_fold_in_abstract_evalr  d  s0    

.	9. .%		%	1	11rG   c                n    t          | j        | j        || j                  }t	          | j        |          S rA   )random_fold_in_impl_baser}   r~   rr   r|   )r  r  r  s      rE   random_fold_in_implr  j  s3    %
j$"D$*6 6(	dj(	+	++rG   c                j    t          |t          j        |          | j                  } |||          S rA   )r  rx   rr   r9   )rd   r  r  
keys_shaper9   s        rE   r  r  p  s4    &"(4..$,0 0'	4	 	  rG   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  rs   r}   r  rr   r9   r   r  r  r   r*  r  r  )r  r  r  r  r  rd   r9   fold_in_lowerings           rE   random_fold_in_loweringr  u  s    )Y		$&oy6 6'^GeDDD			T4"9--y9D&66
8 
8 
8 8rG   c                <    t                               | ||          S N)	bit_widthrr   )random_bits_pr  r  r  rr   s      rE   r8   r8     s    			DIU		C	CCrG   r8   c               r    g | j         |R }t          j        d|           }t          j        ||          S )Nuint)rr   r   rs   r   r   )r  r  rr   	out_shape	out_dtypes        rE   random_bits_abstract_evalr    sA    (	(%(()l-)--..)		)Y	/	//rG   c               H    t          | j        | j        | j        ||          S r  )random_bits_impl_baser}   r~   rq   r  s      rE   random_bits_implr    s/    	tz4+;TY)2%
A 
A 
A ArG   c               H     t          | fd          } ||          S )Nc                2                         |           S rA   r8   rP   r  rd   rr   s    rE   r_  z'random_bits_impl_base.<locals>.<lambda>      4++Ay%@@ rG   r  )rd   r  r  r  rr   bitss   `  `` rE   r  r    s9    	@@@@@@
B 
B$	hrG   c               4  	 | j         \  }|j        j        	t          |j        	fd          }t          j        |d          }|                     t          j	        |          g          } |||          }| 
                    |j                   |S )Nc                2                         |           S rA   r  r  s    rE   r_  z&random_bits_lowering.<locals>.<lambda>  r  rG   Fr  )r  )r  rs   r}   rw  rq   r   r  replacer   r*  set_tokens_out
tokens_out)
r  r  r  rr   r   r  bits_loweringctx_newr   rd   s
     ``     @rE   random_bits_loweringr    s    
,%$		$	
i@@@@@@
B 
B$.>>>-KK$"4T":":!;K<<'gt$$#W'(((	*rG   c               Z    t          ||            t                              | |          S r   )rz   random_wrap_pr  r  rd   s     rE   r  r    s+    tX&&&			H4		0	00rG   r  c               L    t          || j                  }t          ||          S rA   )r   rr   r   )base_arr_avalrd   rr   s      rE   random_wrap_abstract_evalr    s$    
&t]-@
A
A%	4	'	''rG   c               "    t          ||           S rA   r   r  s     rE   random_wrap_implr    s    	dH	%	%%rG   c                   |gS rA   rc   )r  r  rd   s      rE   random_wrap_loweringr    s
    
rG   c               d    | \  }|\  }t          j        ||d          }t          ||          dfS )Nrt   rh   r   )r   bdim_at_frontr  )batched_args
batch_dimsrd   r   ds        rE   random_wrap_batch_ruler    s<    "!"!Q1%%!	QT	"	"	"A	%%rG   c                    t          j        | j        t          j                  st          d| j                  t                              |           S )Nz6random_unwrap takes key array operand, got keys.dtype=)r	  r
  rs   r   r  rw   random_unwrap_pr  r  s    rE   r  r    sH    	
FO	4	4 Q
O$*OO
P
PP			d	#	##rG   r  c                *    t          j        |           S rA   )r   r*  )r  s    rE   random_unwrap_abstract_evalr    s    		I	&	&&rG   c                    | j         S rA   r  r  s    rE   random_unwrap_implr
    s    		rG   c                    |gS rA   rc   )r  r  s     rE   random_unwrap_loweringr    s	    
-rG   keyr  c                f    	 | j         dk    o| j        t          j        k    S # t          $ r Y dS w xY w)NrK   F)rr   rs   rx   ry   AttributeError)r  s    rE   _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)r6   s    rE   threefry_seedr    s     
		rG   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_typerx   ry   )rP   s    rE   r_  z _threefry_seed.<locals>.<lambda>  s#    coc&>q")&L&LqcRR rG   r0   standardl    r   )rr   rw   rx   r
  rs   integerr   shift_right_logicalr  _constr   numpy_dtype_promotionr	  bitwise_andry   concatenate)r6   convertk1k2s       rE   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 rA   )r   rs   r  
shift_leftr  )r   r  rs   nbitss     rE   _rotate_leftz'_make_rotate_left.<locals>._rotate_left  su    
y||u

"1e
,
,a
y||u

"1e
,
,a>!Q#"9!UQY"G"GGGrG   )r	  r
  rx   r  rw   arrayiinfor  )rs   r)  r(  s   ` @rE   _make_rotate_leftr,    st    	rz	*	* A
?
@
@@
(39U##(%
0
0%H H H H H H 
rG   c                 Z   t          d | D                       r"t          d                    |                     t          d | D                       r@t	          j        |  }t          j        |t          j	        t          j
                            }nt          d|            |fdz  S )Nc              3  @   K   | ]}|j         t          j        k    V  d S rA   )rs   r	  ry   )rO   as     rE   rp   z._threefry2x32_abstract_eval.<locals>.<genexpr>)  s+      --1CJ	------rG   z7Arguments to threefry2x32 must have uint32 type, got {}c              3  J   K   | ]}t          |t          j                  V  d S rA   )r   r   r   )rO   args     rE   rp   z._threefry2x32_abstract_eval.<locals>.<genexpr>,  s/      ;;sC)	*	*;;;;;;rG   z2Arguments to threefry2x32 must all be arrays, got rK   )anyrw   formatrv   r  r  r   r   r	  rs   ry   )argsrr   r   s      rE   _threefry2x32_abstract_evalr5  (  s    ------- #
MVD\\# # #;;d;;;;; Q0$7EE39SZ#8#899DD
OOO
P
PP
1rG   c                    | d d          } | d         | d         z   | d<   t          | d         |          | d<   | d         | d         z  | d<   | S )Nr   rt   )rotate_left)rQ   rots     rE   apply_roundr9  7  sU    d!	
1!!A$	QqT3		!A$	
1!!A$	
(rG   c                ,    | dd          | d d         z   S )Nrt   rc   )rb  s    rE   rotate_listr;  ?  s    	ABB"RaR&rG   c                   |\  }}}|d         D ]}t          ||          }|d         |d         z   |d         |d         z   t          j        | dz   t          j                  z   g}|t          |          t          |          fS )Nr   rt   r  )r9  r	  r  rx   ry   r;  )istater   ks	rotationsrnew_xs          rE   rolled_loop_steprC  C  s    !RQ<  aAqAAQ4"Q%<11AE(K(K(KK
L%	BY!7!7	77rG   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  )      r/      ir   rt      rK         )	rx   r*  ry   r   	fori_looprC  r;  r9  tuple)
key1key2x1x2use_rolled_loopsr   r@  r?  r   rA  s
             rE   _threefry2x32_loweringrW  K  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/rG   F)rV  r  c                    t           j        j        st          ||||          S 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 } |  |||           |||          f |||	           |||
          f||d          S )Nr   c                z    t          j        | t          t          |j                  z
                      S )Nbroadcast_dimensions)r   broadcast_in_dimrt  ru   rr   )r   r   aval_outr  ranks     rE   
_broadcastz3_threefry2x32_gpu_lowering_rule.<locals>._broadcast  sB     a6;D3tz??<RTX6Y6Y[ [ [ [rG   rt   rt   r1   F)r   threefry_gpu_kernel_loweringr  _threefry2x32_lowering_ruler  r  ru   rr   r   full_like_avalr   r   mulr   is_constant_dimeval_dynamic_shape_as_tensorr"   r"  r!   RankedTensorTypegetIntegerTypeget_signlessr?   )lowering_funcr  r#  r$  rT  rU  
aval_out_2k1_avalk2_avalx1_avalx2_avalrO  r_  out_lenlengthoutput_shaper]  r^  s    `              @@rE   _threefry2x32_gpu_lowering_rulert    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"g

2w 7 78z"g

2w 7 78&	
 
 rG   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   rc   ry   rK   r  )ru   r	  rO  rx   rs   iota_2x32_shape_pr  r  s    rE   iota_2x32_shaper|    sO    ^ 	ZZ1__Ib"(8,,--/!33			e		,	,,rG   r|  c                X    t          j        | t          j        d                    fdz  S )Nry   rK   )r   r   rx   rs   r  s    rE   iota_2x32_shape_abstract_evalr~    s'    

5"(8"4"4
5
5	7!	;;rG   add(Callable[[ir.Value, ir.Value], ir.Value]rd  ,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 )Nrt   c                .    g | ]\  }} ||          S rc   rc   )rO   r=  r   rd  s      rE   rR   z0bcast_iotas_to_reshaped_iota.<locals>.<listcomp>  s'    @@@DAqcc!Qii@@@rG   )rx   cumprodr   rh  )r  rd  rr   r  stridess    `   rE   bcast_iotas_to_reshaped_iotar    sn    
 B2:eABBi"o66ttt<AqAA'	@@@@Cw,?,?@@@	A	AArG   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 rA   )r   r"   r  )r   r  s     rE   _addz&iota_2x32_shape_lowering.<locals>._add  s    8<<1rG   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  rZ  )r   re  r   ir_constantrx   r*  rs   eval_dynamic_shaper"   r"  r!   rg  rh  dtype_to_ir_typer\  multiply)r   r  x_constx_shapex_bcastaval_u64r  s        rE   _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(((rG   r   c                >    g | ]}t          j        |           S ))	dimension)r   iota)rO   r  r  r  s     rE   rR   z,iota_2x32_shape_lowering.<locals>.<listcomp>  s:     / / / 9S(i888 / / /rG   r0   rZ  )r   r  r  r  r>   r  )r   r  r  r  r>   r  )r  r   r   rx   rs   ru   rt  r  r   r  r*  r\  r"   r  r"  aval_to_ir_type)r  rr   r]  r   r  r  r  countsshiftcounts_shifted	counts_lo	counts_hir  s   `           @rE   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	rG   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|j         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 )
rE  z/threefry_2x32 requires uint32 arguments, got {}c                6    g | ]}t          j        |          S rc   )r   rs   rf  s     rE   rR   z!threefry_2x32.<locals>.<listcomp>1  s     JJJ	!JJJrG   rK   zujax.random functions have limited support for shape polymorphism when using threefry. In particular, the array size (z) must be even.r   rt   Nr  )r   rs   rx   ry   rw   r3  r   r   r?   r   InconclusiveDimensionOperationrB  r	  r7   r!  r   threefry2x32_pr  r   rr   )keypaircountrR  rS  msgodd_sizer   r   s           rE   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I-2ZI I IC 
-c
2
22 *SYsry!~~'FGGKKLLAASYu{{}}a(())A$adAaD11!#	bi					2S"XXsEK	@	@@rG   c                p    t          t          t          j        |                    }t	          | |          S rA   )rQ  
unsafe_mapr   concrete_dim_or_error_threefry_splitr  rr   s     rE   threefry_splitr  E  s,    

45u==
>
>%	e	$	$$rG   r`  )static_argnumsc                d    t           j        j        rt          | |          S t	          | |          S rA   )r   threefry_partitionabler  _threefry_split_foldlike_threefry_split_originalr  s     rE   r  r  I  s0    "( 0#C///#C///rG   )r  r  c                    t          j        |          }t          j        t          j        |dz            }t          j        t          | |          g |dR           S )NrK   )r   r   r   r  rx   ry   r   r  )r  rr   numr  s       rE   r  r  P  sN    	%#8BIsQw''&	]3//5!	=	==rG   c                    | \  }}t          |          \  }}t                              ||||          \  }}t          j        ||g|j                  S )Nrz  )r|  r  r  r	  stackrq   )r  rr   r#  r$  counts1counts2bits1bits2s           rE   r  r  V  sU    &"b$U++'7$$RWg>>,%	E5>
	3	3	33rG   r   c                X    |j         rJ t          | t          j        |                    S rA   )rr   _threefry_fold_inr	  ry   r  r   s     rE   threefry_fold_inr  ^  s)    Z	3
4 0 0	1	11rG   c                <    t          | t          |                    S rA   )r  r  r  s     rE   r  r  b  s    	sM$//	0	00rG   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  rw   r   r  r  #_threefry_random_bits_partitionable_threefry_random_bits_original)r  r  rr   s      rE   threefry_random_bitsr  g  so    	s	#	# B
@
A
AAo%%
B
C
CC"( A.sIuEEE)#y%@@@rG   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 rA   )r   re  )rO   r  s     rE   rp   z6_threefry_random_bits_partitionable.<locals>.<genexpr>t  s-      00Q	a	 	 000000rG   l            z+random bits array of size exceeding 2 ** 64r1   r0   )rv   r   r   NotImplementedErrorr|  r  r  UINT_DTYPESr   r  r'  )r  r  rr   r#  r$  r  r  r  r  rs   bits_hibits_los               rE   r  r  s  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9rG   )rt   rK   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 )Nr0   r   rt   r  r}  )r~  r1   c                :    g | ]}t          j        |          S rc   )r   r  )rO   r   rs   s     rE   rR   z2_threefry_random_bits_original.<locals>.<listcomp>  s&    KKK1C$Q..KKKrG   rK   )r.   r/   r`  )rt   r   )r   r   divmodr   re  r	  r+  rx   ry   maxr  r   r  r  r   r!  r   r  r7   r'  r   r  	broadcastrd  broadcasted_iotar   r  )r  r  rr   r   	max_countrA  nblocksremr  r  subkeyslast_keyblockslastrs   s                 @rE   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	!	!!rG   r  fry)r5   r6   r7   r8   r9   r;   r=   c                ^    | j         rJ t          |           }t          j        ||g          S rA   )rr   r  r	  r!  )r6   halfkeys     rE   	_rbg_seedr    s1    Z$'	'7+	,	,,rG   c           	         t           j        j        rt          }nt          }|                     dd          }  t          |dt          |                    ||          j        g |dR  S )NrK   r}  rO  )r   r  r  r  r  r   r   ru   )r  rr   r  halfkeyss       rE   
_rbg_splitr    s    "( /.OO.O[[A(
G 
.y#e**
. 
..6
? 
??F


 
 
 rG   c                    |j         rJ  t          t          dd          |                     dd          |                              d          S )Nr}  r   rK   rO  )rr   r   r  r   r  s     rE   _rbg_fold_inr    sK    Z	.A	.	.s{{1a/@/@$	G	G	O	OPQ	R	RRrG   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rO  ry   z&_rbg_random_bits got invalid prng key.r-   r  r  )rr   rs   r	  rw   r   rng_bit_generatorr  )r  r  rr   r   r  s        rE   _rbg_random_bitsr    ss    	d		syCIh,?,???
<
=
==o%%
B
C
CC!#uK	4JKKK'!T	+rG   r  rbgc                    t          j        |          }t          j        | d|z  dfd          \  }} t          j        |d d d          j        g |dR  S )N
   rO  ry   r  )start_indexlimit_indexstride)r   r   r   r  slice_in_dimr   )r  rr   r  r   r  s        rE   _unsafe_rbg_splitr    s    	%#!#S!}HEEE'!T
C	
$r
; 
; 
;;B
NDI
NKL
N 
N 
N NrG   c                x    |j         rJ t          j        t          |          dd          \  }}| |d         z  S )N)r  rO  ry   r  r  )rr   r   r  r  )r  r   r   r8   s       rE   _unsafe_rbg_fold_inr    s?    Z(4'RRR.![	{2	rG   
unsafe_rbgurbg)rd   r3   )rj   rk   )rd   r3   r6   r   r>   r|   )rb  rc  )r  r   rd   r3   r>   r|   )rr   r4   )r  rk   r>   r  )r6   rk   r>   rk   )T)
r  r  rd  r  rr   r  r  r  r>   r  )r  rk   rr   r4   r>   rk   )r>   rk   )r  rk   r   rk   r>   rk   )r  rk   )r  rk   r  r?   rr   r  r>   rk   )
__future__r   collections.abcr   r   r   	functoolsr   r   r   operatorr   r   r	   r
   r   rx   jaxr   r	  r   jax._srcr   r   r   r   r   r   r   rM   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    xc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  rh  
unsafe_zipDeviceShardrQ  r?   r4   uint8uint16ry   r  r  r3   rf   ri   rz   r|   r   _shaped_abstractify_handlersr   r   dispatch_registryregister_noder   r   r   r  ExtendedDTyper   pytype_aval_mappingsxla_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  r8   r  r  r  r  r  r  r  r  r  r  r  primitive_batchersr  r  r  r
  r  r  r  r  r,  r5  r7  r9  r;  rC  rW  cache_loweringr  rb  _threefry2x32_cpu_lowering_rulert  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_implrc   rG   rE   <module>r)     s-   # " " " " " 8 8 8 8 8 8 8 8 8 8 % % % % % % % %      " " " " " " " "     



                               % % % % % %                   ) ) ) ) ) ) % % % % % % 4 4 4 4 4 4       " " " " " " " " " " " " " " $ $ $ $ $ $ * * * * * * & & & & & & & & & & & & % % % % % % , , , , , , ! ! ! ! ! ! ) ) ) ) ) )             * * * * * *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 d> d> d> d> d>39 d> d> d>L  < 25--,---2525
2525'25 25 25 "25 $/25 1425 6 6 6 6
 7DbmF6K6K %l 3# # #( ( (  $ 2 2&(>@ @ @
& & & &. . .% % %
h' h' h' h' h' h' h' h'V. . . . .F  . . .4 +;*: , '.>.> l +0;  -H H H H )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h 2d1.$.G"U;;;3 3 3    #1$.G"T:::# # # 
  D  //"&     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B% % % % 	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	
 	    " # # # # #rG   