
    uki              	         U 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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/Z/ d dl.m0Z0 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?m@Z@ d d"lAmBZB d d#lCmDZDmEZE eDeFcZFZGeEeHcZHZIe2j                  ZJeZKeLeMd$f   ZN ej                  d%       ej                  d&       ej                  d'       ej                  d(      d)ZPd*eQd+<    eRe0d,      rH e0j                         j                         D ]&  \  ZUZVeVD ]  \  ZWZXZY ej                  eWeXeUeY-        (  G d. d/e      Z[i Z\d0eQd1<   dd2Z]dd3Z^ G d4 d5eB      Z_ e9e_g d6 e8D        d7d8d9d:d;d<d=d>d?@       dA Z`dB Zaej                  j                  e_e`ea       ddCZddD ZedE Zf G dF dG      Zg G dH dIej                        ZidJ ej                  e_<   dK ej                  e_<   ddLZlele'j                  e_<   dM Zn e&j                  e_en       dN ZpdO ZqdP ZrddQZs ej                  dR      Zu e$j                  eu        e%j                  eu       euj                  dS        Zyeuj                  dT        Z{dU Z|dV Z} e&j                  eue}       ddWZ ej                  dX      Z e$j                  e        e%j                  e       ej                  dY        Zej                  dZ        Zd[ Zd\ Z e&j                  ee       d] Z ej                  d^      Z e$j                  e        e%j                  e       ej                  d_        Zej                  d`        Zda Zdb Z e&j                  ee       dc Z ej                  dd      Z e$j                  e        e%j                  e       ej                  de        Zej                  df        Zdg Zdh Z e&j                  ee       di Z ej                  dj      Z e$j                  e       ej                  dk        Zej                  dl        Zdm Zdn Z e&j                  ee       ee%j0                  e<   do Z ej                  dp      Z e$j                  e        e%j                  e       ej                  dq        Zej                  dr        Zds Z e&j                  ee       ddtZdduZ edvw      ddx       Zdy Zdz Z eejF                        Zd{ Zd| Zd} Zdd~Z e&jR                   eed      dv      Z e&jR                   eedv      dv      Zd Z ej                  d      Zdve_        ej                   eej^                  e             ej                  e        e%j                  e        e&j                  eedw        e&j                  eed        e&j                  e eed      dd        e&j                  e eed      dd       d Z ej                  d      Zdve_        ej                   eej^                  e             ej                  d        Z	 	 	 	 	 	 	 	 	 	 ddZd Z e&j                  ee        edvw      d        ZddZ ed      dd       Z eddv      dd       Z eddv      dd       ZddZed        ZddZddZ eddv      dd       Z e[deeeedd      Z e]e       ddZddZddZ	 	 ddZ e[deeeedd      Z e]eī       ddZddZ e[deeeedd      Z e]eǫ       	 d dlmZ d dlmZ  eɐj                   eie\d         eːj                  j                          eɐj                   eie\d         eːj                  j                          eɐj                   eie\d         eːj                  j                         y# e$ r Y yw xY w)    )annotations)CallableIteratorSequence)partialreduceN)Any
NamedTuple)api)config)core)dispatch)dtypes)ffi)literals)numpy)pretty_printer)source_info_util)	tree_util)typing)jitvmap)float0)ad)batching)mlir)pxla)control_flow)lax)slicing)jaxlib_extension_version)gpu_prng)
xla_client)ir)hlo)_array_operators_set_array_base_attributes_IndexUpdateHelper)NamedShardingPmapShardingSingleDeviceShardingphysical_shardinglogical_sharding)Array)safe_mapsafe_zip.uint8uint16uint32uint64          @   zdict[int, np.dtype]UINT_DTYPESregistrations)platformapi_versionc                  v    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	y)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?tagc                ,    t        | j                        S N)hashrI   selfs    H/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/_src/prng.py__hash__zPRNGImpl.__hash__j   s    >    c                    | j                   S rK   )rI   rM   s    rO   __str__zPRNGImpl.__str__m   s    88OrQ   c                   | j                   j                  }t        j                  | d| j                   d| j
                   d      t        j                  dt        j                  t        j                         t        j                  t        j                         | j                         j                         D cg c]  \  }}t        j                  | d|       ! c}}      z               z   S c c}}w )Nz [z] {z}:   z = )	__class____name__pptextrI   rG   nestgroupbrkjoin_asdictitems)rN   tykvs       rO   pprintzPRNGImpl.pprintp   s    		 	 BGGrd"TXXJd499+S9:GGArxx2772668040D0D0F>(,1bgg3qcl#> , !   >s   =$C5Nreturnintre   rF   )
rW   
__module____qualname____doc____annotations__rG   rI   rP   rS   rc    rQ   rO   r?   r?   Q   sG      .	/$#s.rQ   r?   zdict[str, PRNGImpl]prngsc                    | j                   t        v rt        d| j                    d|        | t        | j                   <   y )NzPRNG with name z already registered: )rG   rm   
ValueErrorimpls    rO   register_prngrr   z   s9    	YY%
tyyk1FtfM
NN%		rQ   c                   t        | j                        }t        fddD              st        d       j                  dk  rt        dj                         j
                  | d  | j                  k7  r(t        d| j                   dj
                   d|       j                  t        j                  t        fvrt        d	j                         y )
Nc              3  6   K   | ]  }t        |        y wrK   )hasattr).0attrkey_datas     rO   	<genexpr>z'_check_prng_key_data.<locals>.<genexpr>   s     LWXt$Ls   )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=)
lenrA   all	TypeErrorrz   r{   r|   npr3   r   )rq   rx   rz   s    ` rO   _check_prng_key_datar      s    	T^^	$	L1KL	L
 FFNZQ R R]]Q
 44<MM?D E E^^TEFt~~-
   $/|HNN;K;QUPWY Z Z^^BIIv..
 !!) 02 3 3 /rQ   c                     e Zd ZU dZded<   ded<   ded<   dZd	ed
<   d7dZd8dZd Zd Z	e
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d9d Ze
d:d!       Ze
d:d"       Z e
d#        Z!e
d$        Z"d% Z#d& Z$d;d'Z%d( Z&d) Z'd* Z(dZ)d+Z*d<d=d,Z+e
d>d-       Z,e
d?d.       Z-d?d/Z.d?d0Z/d?d1Z0d?d2Z1d?d3Z2d?d4Z3d?d5Z4d?d6Z5y)@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``).
  r?   _implr.   _base_arrayzbool | np.ndarray	_consumedNz"None | source_info_util.SourceInfo_source_infoc                   t        |t        j                        rJ t        ||       || _        d| _        t        |t        j                  t        j                  f      rat        j                  |      }t        j                         }t        j                  |t        |      t        j                  |      g|gd      }|| _        y )NF)	committed)
isinstancer   Tracerr   r   r   r   ndarrayr   TypedNdArrayget_avalr   get_default_devicebatched_device_putr+   asarrayr   )rN   rq   rx   avaldevices        rO   __init__zPRNGKeyArray.__init__   s    (DKK000x(DJDN(RZZ)>)>?@]]8$d&&(f((
$V,rzz(/C.Dvhh  DrQ   c                N    | j                   j                  |j                          y rK   )r   _replace_with)rN   values     rO   r   zPRNGKeyArray._replace_with   s    ""5#4#45rQ   c                :    | j                   j                         }| S rK   )r   block_until_readyrN   _s     rO   r   zPRNGKeyArray.block_until_ready   s    **,AKrQ   c                8    | j                   j                         }y rK   )r   copy_to_host_asyncr   s     rO   r   zPRNGKeyArray.copy_to_host_async   s    ++-ArQ   c                    | j                   j                  j                  }t        | j                  | j
                  | j                  |      S rK   )r   r   vmakeys_shaped_arrayr   r{   sharding)rN   r   s     rO   r   zPRNGKeyArray.aval   s6    





#
#CTZZT]]CHHrQ   c                V    t        | j                  | j                  j                        S rK   )base_arr_shape_to_keys_shaper   r   r{   rM   s    rO   r{   zPRNGKeyArray.shape   s    '

D4D4D4J4JKKrQ   c                @    t        j                  | j                        S rK   )mathprodr{   rM   s    rO   sizezPRNGKeyArray.size   s    99TZZ  rQ   c                ,    t        | j                        S rK   )r~   r{   rM   s    rO   rz   zPRNGKeyArray.ndim   s    tzz?rQ   c                ,    t        | j                        S rK   )KeyTyr   rM   s    rO   r|   zPRNGKeyArray.dtype   s    rQ   c                4    | j                   | j                  z  S rK   )itemsizer   rM   s    rO   nbyteszPRNGKeyArray.nbytes   s    ==499$$rQ   c                .    | j                   j                  S rK   )r|   r   rM   s    rO   r   zPRNGKeyArray.itemsize   s    ::rQ   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_pointerc                `    t        | j                  | j                  j                  |            S rK   )r   r   r   addressable_data)rN   indexs     rO   r   zPRNGKeyArray.addressable_data   s$    

D$4$4$E$Ee$LMMrQ   c                    | j                   j                  D cg c]S  } t        |      |j                  |j                  |j
                  t        | j                  |j                              U c}S c c}w N)r   r   global_shapedata)	r   addressable_shardstype_device	_sharding_global_shaper   r   _datarN   ss     rO   r   zPRNGKeyArray.addressable_shards   sd     !!44  	Q99[[djj!''2		
     AA4c                    | j                   j                  D cg c]S  } t        |      |j                  |j                  |j
                  t        | j                  |j                              U c}S c c}w r   )	r   global_shardsr   r   r   r   r   r   r   r   s     rO   r   zPRNGKeyArray.global_shards   sd     !!//  	Q99[[djj!''2		
  r   c                l    t        | j                  | j                  | j                  j                        S rK   )r-   r{   r|   r   r   rM   s    rO   r   zPRNGKeyArray.sharding  s%    DJJ

D4D4D4M4MNNrQ   c                .    | j                   j                  S rK   )r   r   rM   s    rO   r   zPRNGKeyArray.committed  s    %%%rQ   c                r    t        | j                  j                        }| j                  j                  |k(  S rK   )r~   r   rA   r   rz   )rN   	base_ndims     rO   
_is_scalarzPRNGKeyArray._is_scalar	  s-    DJJ(()I  I--rQ   c                b    | j                         rt        d      t        | j                        S )Nzlen() of unsized object)r   r   r~   r   rM   s    rO   __len__zPRNGKeyArray.__len__  s)    /00t  rQ   c                v      j                         rt        d       fdt         j                        D        S )Nziteration over a 0-d key arrayc              3  J   K   | ]  }t        j                  |        y wrK   )r   r   )rv   ra   rN   s     rO   ry   z(PRNGKeyArray.__iter__.<locals>.<genexpr>  s     HALQ'Hs    #)r   r   iterr   rM   s   `rO   __iter__zPRNGKeyArray.__iter__  s2    677 Id6F6F1GHHrQ   c                h    d| j                    d| j                  j                   d| j                   S )NzArray(z, dtype=z) overlaying:
)r{   r|   rG   r   rM   s    rO   __repr__zPRNGKeyArray.__repr__   s4    TZZL(9 " #rQ   c                   t        j                  d      t        j                  t        | j                              z   }t        j                  d      | j                  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:rU   )	rX   rY   rF   r{   r   rc   r[   rZ   r\   )rN   pp_keyspp_impls      rO   rc   zPRNGKeyArray.pprint$  s    ggj!BGGC

O$<<Gggi 4::#4#4#66GrxxggoggaG#bffh.89:; < <rQ   c                    | j                  | j                  | j                  j                               }| j                  |_        |S rK   )rV   r   r   copyr   )rN   outs     rO   r   zPRNGKeyArray.copy+  s5    
..T%5%5%:%:%<
=CNNCMJrQ   d   c                    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.)r   )rN   r|   r   s      rO   	__array__zPRNGKeyArray.__array__3  s    
 & ' 'rQ   c                    J rK   rl   rM   s    rO   atzPRNGKeyArray.at9  s    7CerQ   c                    J rK   rl   rM   s    rO   TzPRNGKeyArray.T;  s    1=rQ   c                    J rK   rl   r   s     rO   __getitem__zPRNGKeyArray.__getitem__=      rQ   c                    J rK   rl   rN   r   __s      rO   flattenzPRNGKeyArray.flatten>  r   rQ   c                    J rK   rl   r   s      rO   ravelzPRNGKeyArray.ravel?  r   rQ   c                    J rK   rl   r   s      rO   reshapezPRNGKeyArray.reshape@  r   rQ   c                    J rK   rl   r   s      rO   squeezezPRNGKeyArray.squeezeA  r   rQ   c                    J rK   rl   r   s      rO   swapaxeszPRNGKeyArray.swapaxesB  r   rQ   c                    J rK   rl   r   s      rO   takezPRNGKeyArray.takeC  r   rQ   c                    J rK   rl   r   s      rO   	transposezPRNGKeyArray.transposeD  r   rQ   )rx   r	   )r   r   )r   rf   re   r   )re   zlist[Shard])re   zIterator[PRNGKeyArray])NN)r|   znp.dtype | Noner   zbool | Nonere   z
np.ndarray)re   r(   )re   r   )6rW   rh   ri   rj   rk   r   r   r   r   r   propertyr   r{   r   rz   r|   r   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   rc   r   rP   __array_priority__r   r   r   r   r   r   r   r   r   r   r   rl   rQ   rO   r   r      sj    
/59,29 6. I I L L ! !     % %   ]R]]#89:'&>?@*MBMM"678&]R]]#89:'!-"--0R"ST /P!QRMBMM"678&&>?@*$]R]]3X%YZ"=2==1T#UVN 	 	 	 	 O O & &.!
I#<
 (' C C= =========rQ   r   c              #  (   K   | ]
  }d | d   yw)r   Nrl   )rv   r   s     rO   ry   ry   G  s     -b2$bk-s   r   r   r   r   r   r   r   r   r   )includec                4    | j                   f| j                  fS rK   )r   r   xs    rO   prngkeyarray_flattenr   L  s    
--	177	""rQ   c                "    |\  }t        | |      S rK   r   )rq   children
base_arrays      rO   prngkeyarray_unflattenr  O  s    +*	dJ	''rQ   c                    t        ||       S Nrp   )random_seed)rq   rB   s     rO   seed_with_implr	  X  s    	T	%%rQ   c                p    t        j                  |t        |             }t        j                  |||      S )N)r   )r   ShapedArrayr   update_aval_with_sharding)rq   r{   r   r   r   s        rO   r   r   \  s-    			%t	-$		'	'hC	@@rQ   c                8    t        | j                        }|d |  S rK   )r~   rA   )rq   base_arr_shaper   s      rO   r   r   `  s    $..!)	)	$$rQ   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y)
KeyTyRulesFboolallow_conversionc                p   g | |j                   j                  }t        |d      rNt        j                  |j
                  t        j                        r t        j                  t        |      |      }n+t        j                  ||t        j
                  d            }t        ||j                         S )Nr|   r3   r|   rp   )r   rA   ru   r   
issubdtyper|   prng_keyjnpbroadcast_torandom_unwrapr   fullr   random_wrap)r{   
fill_valuer|   physical_shaperx   s        rO   r  zKeyTyRules.fullh  s    5u5u{{445Nz7#(9(9*:J:JFOO(\!!-
";^Lh.*BHHX<NOh xekk22rQ   c                |    t        j                  | j                  j                  t	        j
                  d            S Nr3   )r   r  r   rA   r   r|   r  s    rO   physical_element_avalz KeyTyRules.physical_element_avals  s(    EKK11288H3EFFrQ   c                    | j                   S rK   r   )vals    rO   physical_constzKeyTyRules.physical_constw  s    ??rQ   c                    fd}|S )Nc                    t        j                  |j                  |j                        |_        t        j                  j                  |      S rK   )r   r  r{   r|   r   r   r   )r   bufr   s     rO   handlerz*KeyTyRules.result_handler.<locals>.handler}  s6    !!#))SYY7ch$****C00rQ   rl   )sticky_devicer   r(  s    ` rO   result_handlerzKeyTyRules.result_handler{  s    1 NrQ   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  }|D cg c]	  }g || }	} ||||	      t        dk\  r fd}
j                  |
      S  fd}
|
S c c}w )Nzimpossible sharding z  in local sharded result handler  c                D    t        j                  j                  |       S rK   r   r|   r   )arrr   s    rO   r(  z8KeyTyRules.local_sharded_result_handler.<locals>.handler  s    DJJ,,c22rQ   c                P    t        j                  j                   |             S rK   r.  bufsr   phys_handlers    rO   r(  z8KeyTyRules.local_sharded_result_handler.<locals>.handler      DJJ,,l4.@AArQ   )r   physical_avalr|   r   rA   r   local_result_handlersr  r   r*   r)   r,   slicer~   r!   wrap)r   r   indices	phys_avalrA   phys_handler_makerphys_shardingtrailing_indsindsphys_indicesr(  r3  s   `          @rO   local_sharded_result_handlerz'KeyTyRules.local_sharded_result_handler  s    ""4(I

  **I33D4D4DE (\=9:'h7mU*8*4TUUU 4[MC	N2M8?@+d+]+@L@ &iML  3&3 w''B n As   #C$c                     t        j                         }t        j                  t         j                     }t         |      } ||||      t        dk\  r fd}j                  |      S  fd}|S )Nr,  c                D    t        j                  j                  |       S rK   r.  )r2  r   s    rO   r(  z9KeyTyRules.global_sharded_result_handler.<locals>.handler  s    DJJ,,d33rQ   c                P    t        j                  j                   |             S rK   r.  r1  s    rO   r(  z9KeyTyRules.global_sharded_result_handler.<locals>.handler  r4  rQ   )r   r5  r   global_result_handlersr  r,   r!   r8  )r   out_shardingr   r:  r;  r<  r(  r3  s   `      @rO   global_sharded_result_handlerz(KeyTyRules.global_sharded_result_handler  sm    ""4(I44T5E5EF%dL9M%i	JL3&4w''BnrQ   c                $   t        j                  |       }t        j                  t         j                     }|D cg c]  }t        |       }}t        | |      } ||||      }	 |	|      }
t        | j                  j                  |
      S c c}w rK   )
r   r5  r   rD  r  r  r,   r   r|   r   )r   r   arraysr   r:  r;  r/  phys_arraysr<  r3  phys_results              rO   make_sharded_arrayzKeyTyRules.make_sharded_array  s    ""4(I44T5E5EF178#=%8K8%dH5M%i	JL{+K

((+66 9s   Bc                    t        j                  t        |       }t        j                  |t        |            }t        ||j                  j                        S r  )	r   tree_mapr  r   device_put_shardedlistr  r|   r   )valsr   r   r   physical_buffersphysical_results         rO   rN  zKeyTyRules.device_put_sharded  sC     ))->,,-=tG}MOTZZ-=-=>>rQ   c                    t        j                  |      }t        |       }t        ||      }t	        j
                  |||gt        |      z  |      }t        ||j                  j                        S r  )
r   r5  r  r,   r   r   r~   r  r|   r   )r#  r   r   r   r5  physical_bufr<  rR  s           rO   device_put_replicatedz KeyTyRules.device_put_replicated  sd    &&t,M %L%dH5M--}|ns7|&CWNOTZZ-=-=>>rQ   c                "    t         j                  S rK   )r   r   r   s    rO   tangent_dtypezKeyTyRules.tangent_dtype  s    ==rQ   c                J    t        j                  dt        j                        S )Nrl   )r   zerosr   r   rW  s    rO   zerozKeyTyRules.zero  s    88B&&rQ   N)re   zcore.ShapedArray)re   r.   )rW   rh   ri   r  rk   staticmethodr  r   r$  r*  r@  rF  rK  rN  rU  rX  r[  rl   rQ   rO   r  r  e  s     D 3 3 G G      <   7 7 ? ?
 ? ?   ' 'rQ   r  c                  t    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y	)r   r?   r   c                    || _         y rK   )r   )rN   rq   s     rO   r   zKeyTy.__init__  s	    DJrQ   c                6    d| j                   j                   dS )Nzkey<>)r   rI   rM   s    rO   rG   z
KeyTy.name  s    $**..!##rQ   c                    t        j                  | j                  j                        t	        j
                  d      j                  z  S r  )r   r   r   rA   r   r|   r   rM   s    rO   r   zKeyTy.itemsize  s/    99TZZ))*RXXh-?-H-HHHrQ   c                    | j                   S rK   )rG   rM   s    rO   r   zKeyTy.__repr__  s    99rQ   c                Z    t        |      t        u xr | j                  |j                  k(  S rK   )r   r   r   )rN   others     rO   __eq__zKeyTy.__eq__  s#    ;%=DJJ%++$==rQ   c                D    t        | j                  | j                  f      S rK   )rL   rV   r   rM   s    rO   rP   zKeyTy.__hash__  s    ,--rQ   Nrg   rd   )rW   rh   ri   rk   r  _rulesr   r  r   r   r   rG   r   r   re  rP   rl   rQ   rO   r   r     sS    	/&	$ $ $ I I>.rQ   r   c                    | j                   S rK   )r   r   s    rO   <lambda>ri    s
    AFF rQ   c                    | S rK   rl   r   s    rO   ri  ri    s    Q rQ   c                    | D cg c]  }|j                    }}t        | |      D cg c]  \  }}t        |j                  |       }}}t	        j
                  ||||      S c c}w c c}}w rK   )r   zipr,   r   r   
shard_args)xs	shardingslayoutscopy_semanticsr   arrsr   phys_shardingss           rO   key_array_shard_arg_handlerrt    sm    !#	$A!--	$$	$'*2y'9;#8 &affh7 ;. ; 
.$	GG	 
%;s
   A$ A)c                d    | j                   } t        j                  t        |            ||      S rK   )r   r   get_constant_handlerr   )r   r   r/  s      rO   key_array_constant_handlerrw    s)    	#	-	"	"49	-c4	88rQ   c                P    t        |       D ]  }t        j                  |      } |S rK   )ranger   r   )nfr   s      rO   iterated_vmap_unaryr|  	  s'    8 aA	
(rQ   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axesr{  lefts      rO   squeeze_vmap_fz$squeeze_vmap.<locals>.squeeze_vmap_f  sL    
++aa
 ad
++aa
 ad0388Ata0A66rQ   rl   )r{  r  r  s   `` rO   squeeze_vmapr    s    7 
rQ   c                n   t        |       t        |      ccxk(  rdk(  rS  dfv rdk(  rfdS fdS t        |       t        |      k(  sJ t        t        | |            D ]D  \  }}||k(  rt        j                  d      #|dk(  s|dk(  s	J ||f       t        |dk(        F S )Nr   c                2      t         fd      |      S )Nc                     |       S rK   rl   )r  r{  r   s    rO   ri  z>iterated_vmap_binary_bcast.<locals>.<lambda>.<locals>.<lambda>$      qAw rQ   r|  )r   r  r{  ndim2s   ` rO   ri  z,iterated_vmap_binary_bcast.<locals>.<lambda>$      G-e5FGJ rQ   c                2     t        fd      |       S )Nc                     |       S rK   rl   )r   r{  r  s    rO   ri  z>iterated_vmap_binary_bcast.<locals>.<lambda>.<locals>.<lambda>&  r  rQ   r  )r   r  r{  ndim1s    `rO   ri  z,iterated_vmap_binary_bcast.<locals>.<lambda>&  r  rQ   )r  r}   )r~   reversedrl  r   r   r  )shape1shape2r{  sz1sz2r  r  s     `  @@rO   iterated_vmap_binary_bcastr    s    Vc&k,%
eqH 5%.zJJJJ	VF	##	#3vv./ $hc3
cz
((1q
!aAX-C:-!
q#(
#a$ 
(rQ   c                :   t        | t              r)t        j                  t	        j
                  |             }nt        j                  |       }t        j                  j                  r|t        j                  j                  z  }t        j                  ||      S r  )r   rf   r  r   r   int64r   random_seed_offsetr   random_seed_pbind)seedsrq   	seeds_arrs      rO   r  r  1  sm     sBHHUO,IE"I$$**000I			ID		11rQ   r  c               Z    t        || j                  | j                  | j                        S rK   )r   r{   r   r   )
seeds_avalrq   s     rO   random_seed_abstract_evalr  A  s(    	4!1!1:3F3F%>>
+ +rQ   c               4    t        | |      }t        ||      S r  )random_seed_impl_baser   )r  rq   base_arrs      rO   random_seed_implr  F  s    "5t4(	dH	%%rQ   c               d    t        t        j                  |       |j                        } ||       S rK   )r|  r   rz   rB   )r  rq   rB   s      rO   r  r  K  s$    	RWWU^TYY	7$	erQ   c          	        | j                   \  }t        |j                  |j                        }t	        j
                  |d      }t	        j                  | ||t        t        j                  | j                              S )NFmultiple_results)	avals_out)avals_inr|  rz   rB   r   	lower_fundelegate_loweringmapr   r5  r  )ctxr  rq   r   rB   seed_lowerings         rO   random_seed_loweringr  O  s_    
,,%$	TYY			2$..>-				=%D&&6
8 8rQ   c                0    t         j                  | |      S Nr{   )random_split_pr  )keysr{   s     rO   random_splitr  Z  s    			T		//rQ   r  c               j   | j                   j                  j                  rt        j                         }nDg | j                   j
                  d gt        |      z  }| j                   j                  |      }t        | j                  j                  g | j                  ||| j                        S )Nspec)r   meshemptyr   get_cur_mesh_shardingr  r~   updater   r|   r   r{   r   )	keys_avalr{   rE  new_specs       rO   random_split_abstract_evalr  a  s     ""--/L?##((?D6CJ+>?H%%,,(,;L	9??002LIOO2Le2L'
8 8rQ   c                   t        | j                  | j                  | j                  |      }t	        | j                  |      S r  )random_split_impl_baser   r   rz   r   )r  r{   r  s      rO   random_split_implr  m  s4    #
jj$""DIIU<(	djj(	++rQ   c               6     t        | fd      } ||      S )Nc                (    j                  |       S rK   rC   ra   rq   r{   s    rO   ri  z(random_split_impl_base.<locals>.<lambda>t      4::a3G rQ   r  )rq   r  	keys_ndimr{   rC   s   `  ` rO   r  r  s  s    
i)G
H%	xrQ   c          
     P   | j                   \  }|j                  j                  t        |j                  fd      }t        j                  |d      }t        j                  | ||t        j                  |      gt        t        j                  | j                              S )Nc                (    j                  |       S rK   r  r  s    rO   ri  z'random_split_lowering.<locals>.<lambda>z  r  rQ   Fr  r  r  )r  r|   r   r|  rz   r   r  r  r   r5  r  r  )r  r  r{   r   rC   split_loweringrq   s     `   @rO   random_split_loweringr  w  s}    
,,%$			$
dii)G
H%>>%%@.				>4""4()D&&6
8 8rQ   c                    t        j                  |      }t        j                  | |      \  } }t        j                  | |      S rK   )r  r   r   standard_insert_pvaryrandom_fold_in_pr  )r  msgss     rO   random_fold_inr    s9    	T	$))$5*$			tT	**rQ   r  c                    t        j                  d| |      }t        j                  d| |      }t        j                  d| |      }t        j
                  || j                  ||      S )Nr  r   r   )r   broadcasting_shape_rulebroadcasting_sharding_ruler   standard_vma_ruler  r|   )r  	msgs_avalr{   r   r   s        rO   random_fold_in_abstract_evalr    s`    

%
%	9.%++	9.(/IF#			%8	MMrQ   c                    t        | j                  | j                  || j                        }t	        | j                  |      S rK   )random_fold_in_impl_baser   r   r{   r   )r  r  r  s      rO   random_fold_in_implr    s4    %
jj$""D$**6(	djj(	++rQ   c                h    t        |t        j                  |      | j                        } |||      S rK   )r  r   r{   rE   )rq   r  r  
keys_shaperE   s        rO   r  r    s,    &"((4.$,,0'	4	  rQ   c                t   | j                   \  }}|j                  j                  }t        |j                  |j                  |j
                        }t        j                  |d      }t        j                  | |||t        j                  |      |gt        t        j                  | j                              S )NFr  r  )r  r|   r   r  r{   rE   r   r  r  r   r5  r  r  )r  r  r  r  r  rq   rE   fold_in_lowerings           rO   random_fold_in_loweringr    s    )Y			$&ooy6'^^GeD				T4""9-y9D&&6
8 8rQ   c                2    t         j                  | ||      S N)	bit_widthr{   )random_bits_pr  r  r  r{   s      rO   rD   rD     s    			DIU		CCrQ   rD   c                  g | j                   |}t        j                  d|       }| j                  j                  j
                  rt        j                         }nDg | j                  j                  d gt        |      z  }| j                  j                  |      }t        j                  |||| j                        S )Nuintr  r  )r{   r   r|   r   r  r  r   r  r  r~   r  r  r   )r  r  r{   	out_shape	out_dtyperE  r  s          rO   random_bits_abstract_evalr    s    (	(%()llT)-.)""--/L?##((?D6CJ+>?H%%,,(,;L			)Y'mm
- -rQ   c               ^    t        | j                  | j                  | j                  ||      S r  )random_bits_impl_baser   r   rz   r  s      rO   random_bits_implr    s*    	tzz4+;+;TYY)2%
A ArQ   c               :     t        | fd      } ||      S )Nc                *    j                  |       S rK   rD   ra   r  rq   r{   s    rO   ri  z'random_bits_impl_base.<locals>.<lambda>      4++Ay%@ rQ   r  )rq   r  r  r  r{   bitss   `  `` rO   r  r    s    	@
B$	hrQ   c               L  	 | j                   \  }|j                  j                  	t        |j                  	fd      }t        j                  |d      }| j                  t        j                  |      g      } |||      }| j                  |j                         |S )Nc                *    j                  |       S rK   r  r  s    rO   ri  z&random_bits_lowering.<locals>.<lambda>  r  rQ   Fr  r  )r  r|   r   r|  rz   r   r  replacer   r5  set_tokens_out
tokens_out)
r  r  r  r{   r   r  bits_loweringctx_newr   rq   s
     ``     @rO   random_bits_loweringr    s    
,,%$			$	
ii@
B$..>-KK$"4"4T":!;K<'gt$#W''(	*rQ   c               H    t        ||        t        j                  | |      S r  )r   random_wrap_pr  r  rq   s     rO   r  r    s"    tX&			H4		00rQ   r  c                   t        || j                        }t        |t        |      | j                        }t        |||| j                        S rK   )r   r{   r-   r   r   r   r   )base_arr_avalrq   r{   r   s       rO   random_wrap_abstract_evalr    sC    
&t]-@-@
A%eU4[-2H2HI(	4-2C2C	DDrQ   c                   t        ||       S rK   r  r  s     rO   random_wrap_implr	    s    	dH	%%rQ   c                   |gS rK   rl   )r  r  rq   s      rO   random_wrap_loweringr     s
    
rQ   c               ^    | \  }|\  }t        j                  ||d      }t        ||      dfS )Nr}   rp   r   )r   bdim_at_frontr  )batched_args
batch_dimsrq   r   ds        rO   random_wrap_batch_ruler    s6    "!"!Q1%!	QT	"A	%%rQ   c                    t        j                  | j                  t         j                        st	        d| j                        t
        j                  |       S )Nz6random_unwrap takes key array operand, got keys.dtype=)r   r  r|   r  r   random_unwrap_pr  r  s    rO   r  r    sB    			4::v	7
M$**O
PP			d	##rQ   r  c                ,    t        j                  |       S rK   )r   r5  )r  s    rO   random_unwrap_abstract_evalr    s    			I	&&rQ   c                    | j                   S rK   r"  r  s    rO   random_unwrap_implr    s    			rQ   c                    |gS rK   rl   )r  r  s     rO   random_unwrap_loweringr    s	    
-rQ   c                ~    	 | j                   dk(  xr | j                  t        j                  k(  S # t        $ r Y yw xY w)NrU   F)r{   r|   r   r3   AttributeError)keys    rO   _is_threefry_prng_keyr  '  s:    997bii!77	 s   -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)rB   s    rO   threefry_seedr"  .  s     
	rQ   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        t        j                  |gd      S # 1 sw Y   !xY w)	Nz$PRNG key seed must be a scalar; got .z&PRNG key seed must be an integer; got c                t    t        j                  t        j                  | t        j                        dg      S r  )r   expand_dimsconvert_element_typer   r3   )ra   s    rO   ri  z _threefry_seed.<locals>.<lambda>B  s$    cooc&>&>q"))&LqcR rQ   r8   standardl    r   )r{   r   r   r  r|   integerr   shift_right_logical_constr   numpy_dtype_promotionr  bitwise_andr3   concatenate)rB   convertk1k2s       rO   r!  r!  <  s    	ZZ
:4(!D
EE	tzz2::	.
<THE
FFR'	dCJJtR$89;"##J/ ? 
ryy'<=	>B? 
"b1	%%	? ?s    0C00C9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                  |      k7  rt        j                  |      }t        j                  |       k7  rt        j                  |       } t        j                  | |      t        j                  | |z
        z  S rK   )r   r|   r(  
shift_leftr+  )r   r  r|   nbitss     rO   _rotate_leftz'_make_rotate_left.<locals>._rotate_leftQ  sn    
yy|u

"
"1e
,a
yy|u

"
"1e
,a>>!Q#"9"9!UQY"GGGrQ   )r   r  r   r*  r   arrayiinfor  )r|   r7  r6  s   ` @rO   _make_rotate_leftr:  L  sP    			5"**	-
?
@@
((6<<&++U
3%H 
rQ   c                    t        d | D              rt        dj                  |             t        d | D              r<t	        j
                  |  }t        j                  |t        j                  d            }nt        d|        |fdz  S )Nc              3  V   K   | ]!  }|j                   t        j                  k7   # y wrK   )r|   r   r3   )rv   as     rO   ry   z._threefry2x32_abstract_eval.<locals>.<genexpr>]  s     ,!BII	,s   ')z7Arguments to threefry2x32 must have uint32 type, got {}c              3  P   K   | ]  }t        |t        j                           y wrK   )r   r   r  )rv   args     rO   ry   z._threefry2x32_abstract_eval.<locals>.<genexpr>`  s     ;sC))	*;s   $&r3   z2Arguments to threefry2x32 must all be arrays, got rU   )
anyr   formatr   r   r  r   r  r   r|   )argsr{   r   s      rO   _threefry2x32_abstract_evalrC  \  s    ,t,,
MVD\# #;d;;''.EE288H#56D
HO
PP
1rQ   c                l    | d d  } | d   | d   z   | d<   t        | d   |      | d<   | d   | d   z  | d<   | S )Nr   r}   )rotate_left)rb   rots     rO   apply_roundrG  k  sN    d!	
1!!A$	QqT3	!A$	
1!!A$	
(rQ   c                    | dd  | d d z   S )Nr}   rl   )rn  s    rO   rotate_listrI  s  s    	AB"Ra&rQ   c                    |\  }}}|d   D ]  }t        ||      } |d   |d   z   |d   |d   z   t        j                  | dz   t        j                        z   g}|t        |      t        |      fS )Nr   r}   r  )rG  r  r   r   r3   rI  )istater   ks	rotationsrnew_xs          rO   rolled_loop_steprQ  w  s}    !RQ< aAqAQ4"Q%<11AE(KK
L%	BY!7	77rQ   c           	     r   ||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<   |r7t        j                  ddt
        |t        |      |f      \  }}}t        |      S |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  )      r7      ir   r}      rU         )	r   r8  r3   lax_control_flow	fori_looprQ  rI  rG  tuple)
key1key2x1x2use_rolled_loopsr   rN  rM  r   rO  s
             rO   _threefry2x32_loweringrf    ss    
2h!xxryy9xx(		:<)dD4K"))J"778"	
11!A$	
11!A$((	1KOY ?GAq!< 
q/3 q\ 
a
aQ4"Q%<AaDQ4"Q%<"))A,&AaDq\ 
a
aQ4"Q%<AaDQ4"Q%<"))A,&AaDq\ 
a
aQ4"Q%<AaDQ4"Q%<"))A,&AaDq\ 
a
aQ4"Q%<AaDQ4"Q%<"))A,&AaDq\ 
a
aQ4"Q%<AaDQ4"Q%<"))A,&AaD	q/rQ   F)re  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} j                  fdz        }t        j                  | d      } || |||       |||       |||	       |||
            S )Nr   c                v    t        j                  | t        t        |j                        z
              S )Nbroadcast_dimensions)r   broadcast_in_dimry  r~   r{   )r   r   aval_outr  ranks     rO   
_broadcastz3_threefry2x32_gpu_lowering_rule.<locals>._broadcast  s6      a6;D3tzz?<RTX6Y[ [rQ   r]  r  _threefry2x32_ffi)r   threefry_gpu_kernel_loweringr   _threefry2x32_lowering_ruler  r  r~   r{   r   full_like_avalr  r   ffi_lowering)r  r1  r2  rc  rd  target_name_prefix
aval_out_2k1_avalk2_avalx1_avalx2_avalrZ  rn  sub_ctxrulerl  rm  s   `              @@rO   _threefry2x32_gpu_lowering_ruler|    s    		,	,	2	2&sBB;;(J	Z		'*||$'7GW	X^^	$(..Q1E5>[ KK(qK1'				-.
0$	gz"g.
2w0GW%z"g'>
@ @rQ   threefry2x32cpu)r<   cu)rt  cuda)r<   r#  hiprocmc                    t        |       dk(  r-t        j                  dt        j                  d            fdz  S t
        j                  |       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   rl   r3   rU   r  )r~   r  rZ  r   r|   iota_2x32_shape_pr  r  s    rO   iota_2x32_shaper    sF    ^ 	Z1_IIb"((8,-/!33			e		,,rQ   r  c                \    t        j                  | t        j                  d            fdz  S )Nr3   rU   )r   r  r   r|   r  s    rO   iota_2x32_shape_abstract_evalr     s&    


5"((8"4
5	7!	;;rQ   c                    g t        j                  |dd  d d d         d d d   d}t        | t        ||      D cg c]  \  }} |||       c}}      S c c}}w )Nr}   )r   cumprodr   rl  )addmulr{   iotasstridesrK  r   s          rO   bcast_iotas_to_reshaped_iotar  $  s`    
 B2::eABi"o6tt<AqA'	Cw,?@DAqc!Qi@	AA@s   Ac                    j                   \  }}t        j                  |t        j                  d            dd}d	 fd}t        |      dkD  sJ t        t        |            D cg c]  }t        j                   |       }}t        ||||      }t        j                  t        j                  dt        j                  d                  }	t        j                   |	g       }	t        j                  j                  ||	      }
t        j                  j                  t        j                   |      |      }t        j                  j                  t        j                   |      |
      }||fS c c}w )
Nr4   c                B    t         j                  j                  | |      S rK   )r   r%   r  )r   r  s     rO   _addz&iota_2x32_shape_lowering.<locals>._add0  s    88<<1rQ   c           
         t        j                  |       r=t        j                  t	        j
                  | t	        j                  d                  }nst        j                  | f      \  }t        j                  t        j                  j                  g t        j                  t	        j                  d                  |      }t        j                  |g       }t        j                  j                  ||      S )Nr4   ri  )r   is_constant_dimr   ir_constantr   r8  r|   eval_dynamic_shaper%   r0  r$   RankedTensorTypegetdtype_to_ir_typerk  multiply)r   r  x_constx_shapex_bcastaval_u64r  s        rO   _mulz&iota_2x32_shape_lowering.<locals>._mul3  s    A  !RXXh-?!@Ag((qd3hg



!
!##BHHX$679:ACg ##C(9;=G88Wa((rQ   r   )	dimensionr8   ri  )r   ir.Valuer  r  re   r  )r   zcore.DimSizer  r  re   r  )r  r   r  r   r|   r~   ry  r   iotar  r  r8  rk  r%   r+  r0  aval_to_ir_type)r  r{   rl  r   r  r  r  r  countsshiftcounts_shifted	counts_lo	counts_hir  s   `            @rO   iota_2x32_shape_loweringr  ,  s1   +(AeRXXh%78() 
Ua "#e*-/ 99S(i8 /% /'dE5A&


288B(:;
<%


UH579%88//>.hht33H=vF)hht33H=~N)	I	/s   ,E:c           
        | \  }}t        j                  |      t        j                  |      cxk(  r,t        j                  |      cxk(  rt        j                  k(  sBn d}t	        |j                  |||fD cg c]  }t        j                  |       c}            |j                         }|j                  d   dz  }t        j                  |      rk|rIt        t        j                  t        j                  |t        j                  dg      g      d            }nt        t        j                  |d            }nnt        j                  |t        j                  dg      g      }|j                  d   dz  }	t        j                  |d|	f      t        j                  ||	f|	f      g}|d   j                  |d   j                  k(  s#J |d   j                  |d   j                  f       t         j#                  |||d   |d         }t        j                  |      }
|
j                  t        j                  k(  sJ t        j                  |      r6t        j$                  |r|
dd |j                        S |
|j                        S t        j                  |
d|j                  d   f      }t        j$                  ||j                        S c c}w )rS  z/threefry_2x32 requires uint32 arguments, got {}r   rU   )r   r}   Nr  )r   r|   r   r3   r   rA  r   r{   r   r  rO  r  rC   r/  lax_slicingdynamic_slicethreefry2x32_pr  r   )keypaircountra  rb  msgr   
flat_countodd_sizeflat_count_paddedflat_count_padded_half_sizer   out_no_paddings               rO   threefry_2x32r  O  sI    *$	4CIIdO	Lsyy/?	L299	L
;C
CJJtT56IJ		!JK
LL{{}*a 1$(	(#
syy*biin)EFJ
Ka
syyQ'
(a RYYs^(DE"3"9"9!"<"A 14!< >@ 1!< >!< >@	A 
1qtzz	!;AaDJJ!

#;;	!$adAaD1!#	bii			(#;;8s3BxekkBBekkBB ..sD:;K;KA;N:PQN	^U[[	11=  Ks   9Kc                `    t        t        t        j                  |            }t	        | |      S rK   )r`  
unsafe_mapr   concrete_dim_or_error_threefry_splitr  r{   s     rO   threefry_splitr  ~  s&    

455u=
>%	e	$$rQ   r}   )static_argnumsc                f    t         j                  j                  rt        | |      S t	        | |      S rK   )r   threefry_partitionabler   _threefry_split_foldlike_threefry_split_originalr  s     rO   r  r    s+    ""((#C//#C//rQ   )r  r#  c                    t        j                  |      }t        j                  t        j
                  |dz        }t        j                  t        | |      g |d      S )NrU   )r   r   r   r  r   r3   r   r  )r  r{   numr  s       rO   r  r    sH    		%#88BIIsQw'&	]3/5!	==rQ   c                    | \  }}t        |      \  }}t        j                  ||||      \  }}t        j                  ||g|j
                        S )Nr  )r  r  r  r  stackrz   )r  r{   r1  r2  counts1counts2bits1bits2s           rO   r  r    sM    &"b$U+'7$$RWg>,%	E5>

	33rQ   c                `    |j                   rJ t        | t        j                  |d            S )Nr3   r  )r{   _threefry_fold_inr  r   r  r   s     rO   threefry_fold_inr    s&    ZZ	3D A	BBrQ   c                ,    t        | t        |            S rK   )r  r"  r  s     rO   r  r    s    	sM$/	00rQ   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.r5   ,requires 8-, 16-, 32- or 64-bit field width.)r  r   r   r  r   #_threefry_random_bits_partitionable_threefry_random_bits_original)r  r  r{   s      rO   threefry_random_bitsr    sW    	s	#
@
AAo%
B
CC""((.sIuEE)#y%@@rQ   c                   t        d |D              r#t        j                  |      dkD  rt        d      | \  }}t	        |      \  }}t
        j                  ||||      \  }}t        |   }	|dk(  rZt        j                  ||	      }
t        j                  ||	      }t        j                  |
t        j                  d|	            |z  S |dk(  r||z  S t        j                  ||z  |	      S )Nc              3  F   K   | ]  }t        j                  |        y wrK   )r   r  )rv   r  s     rO   ry   z6_threefry_random_bits_partitionable.<locals>.<genexpr>  s     0Q		a	 0s   !l            z+random bits array of size exceeding 2 ** 64r9   r8   r  )r   r   r   NotImplementedErrorr  r  r  r:   r   r(  r5  r  r   )r  r  r{   r1  r2  r  r  r  r  r|   bits_hibits_los               rO   r  r    s    0%00TYYu5E5O
K
LL&"b$U+'7$$RWg>,%
i
 %"_&&ue4G&&ue4G>>'3;;r#?@7JJB5=##EEM599rQ   )r}   rU   c                2   t        j                  |      }t        ||z  d      \  }}|dkD  r|dz  }t        j                  |      r;t        |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                  |j!                         |gd      }t"        |   }|dk(  rlt%        j&                  |d      D cg c]  }t        j(                  ||       }}t        j*                  |d   t%        j,                  d|	            |d   z  }n|d
v rt        j.                  t%        j,                  t        j                  |      j                  d	      t        j0                  t        j2                  |d      t        j4                  t        j                  |      t        j6                  t        j                  d|z  dfd                        }t        j8                  ||dz  |z  fd      }t        j(                  ||      d | }t        j8                  ||      S c c}w )Nr8   r   r}   r  r  )r  r9   rU   r  )r6   r7   r3   r  )r}   r   )r   r   divmodr   r  r   r9  r   r3   maxr  r   r  r  r   r/  r   r:   r  rC   r(  r5  r   r.  r+  	broadcastr  broadcasted_iotar   )r  r  r{   r   	max_countrO  nblocksremr  r  subkeyslast_keyblockslastr|   r   s                   rO   r  r    s`   	5	$ 	D("-,)QUNI	)$)V\\"))%<%@%@ALGSiSG	chhryy#67D#!~.DSb	48XG3T-3GSXXbiiQWQ]Q]^`^g^gQhQlQl=mnF388BIIs#;<D??FLLND115D
i
 %"_8;		$8JK1C$$Q.KDK>>$q'3;;r#?@47JDG??	kk"((5/%%X6	dD!
))I



ryy2?A*>
B	
	D ;;ty2~:=vFD##D%0$7D	T5	!!! Ls   0Lr  fry)rA   rB   rC   rD   rE   rG   rI   c                b    | j                   rJ t        |       }t        j                  ||g      S rK   )r{   r"  r  r/  )rB   halfkeys     rO   	_rbg_seedr    s,    ZZ$'	'7+	,,rQ   c           	         t         j                  j                  rt        }nt        }| j                  dd      }  t        |dt        |            ||      j
                  g |d S )NrU   r  r]  )r   r  r   r  r  r   r   r~   )r  r{   r  halfkeyss       rO   
_rbg_splitr    sq    ""((.O.O[[A(
G 
.y#e*
..6
??Fw


 rQ   c                    |j                   rJ  t        t        dd      | j                  dd      |      j                  d      S )Nr  r   rU   r]  )r{   r   r  r   r  s     rO   _rbg_fold_inr    s>    ZZ	.A	.s{{1a/@$	G	O	OPQ	RRrQ   c                    | j                   dk(  s-| j                  t        j                  d      k(  rt        d      |dvrt        d      t	        j
                  | |t        |         \  }}|S )Nr]  r3   z&_rbg_random_bits got invalid prng key.r5   r  r  )r{   r|   r   r   r   rng_bit_generatorr:   )r  r  r{   r   r  s        rO   _rbg_random_bitsr    sd    	d	syyBHHX,>>
<
==o%
B
CC!!#uK	4JK'!T	+rQ   r  rbgc                    t        j                  |      }t        j                  | d|z  dfd      \  }} t	        j
                  |d d d      j                  g |d S )N
   r]  r3   r  )start_indexlimit_indexstride)r   r   r   r  r  slice_in_dimr   )r  r{   r  r   r  s        rO   _unsafe_rbg_splitr  &  so    		%#!!#S!}HE'!T
C	!	!
$r
;;B7
NDI
NKL
N NrQ   c                v    |j                   rJ t        j                  t        |      dd      \  }}| |d   z  S )N)r  r]  r3   r  r  )r{   r   r  r  )r  r   r   rD   s       rO   _unsafe_rbg_fold_inr  -  s9    ZZ((4'R.![	{2	rQ   
unsafe_rbgurbg)serialization)serialization_generated)rq   r?   )rx   typing.Array)rq   r?   rB   int | typing.ArrayLikere   r   )rn  zSequence[PRNGKeyArray])r  r  rq   r?   re   r   )r{   r@   )r  r  re   r  )rB   r  re   r  )T)
r  z(Callable[[ir.Value, ir.Value], ir.Value]r  z,Callable[[core.DimSize, ir.Value], ir.Value]r{   z
core.Shaper  zSequence[ir.Value]re   r  )r  r  r{   r@   re   r  )re   r  )r  r  r   r  re   r  )r  r  )r  r  r  rf   r{   zSequence[int]re   r  )
__future__r   collections.abcr   r   r   	functoolsr   r   r   operatorr   r   r	   r
   r   r   jax._srcr   r   r   r   r   r   r   r  r   rX   r   r   jax._src.apir   r   jax._src.dtypesr   jax._src.interpretersr   r   r   r   jax._src.laxr   r^  r   r    r  jax._src.libr!   r"   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,   r-   jax._src.typingr.   jax._src.utilr/   r0   r  r  rl  
unsafe_zipDeviceShardr`  rf   r@   r|   r:   rk   ru   r;   r_   r<   targetsrG   r   r=   register_ffi_targetr?   rm   rr   r   r   r   r  dispatch_registryregister_noder	  r   r   r  ExtendedDTyper   pytype_aval_mappingscanonicalize_value_handlersrt  shard_arg_handlersrw  register_constant_handlerr|  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  rD   r  r  r  r  r  r  r  r  r	  r  r  primitive_batchersr  r  r  r  r  r  r"  r!  r:  rC  r3   rE  rG  rI  rQ  rf  r  rq  _threefry2x32_cpu_lowering_ruler|  r  r  apply_primitiver  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_impljax._src.exportr  r   ser_flatbufregister_dtype_kindDTypekey_frykey_rbgkey_unsafe_rbgImportErrorrl   rQ   rO   <module>r5     s

   # 8 8 %   "   %      ! ) %   " " $ * & & 9  / 1 ! )   *F F  " ,CZCZ	c3h rxx	$   8_%1811399; h$+  e[c
k$z $N   3 r>5 r>h < 25-,-2525
2525'25 25 25 "25 $/25 1425 6#( 
   ) )&(>@
&A%
o' o'd.F   .4 +;  , '3> " "< 0H )D   %9   |-G H
	&
2 }- }    } %  + !+ & &8   }&: ;0  / ~    ~ &!!	8 "	8 , ,
8   ~'< =+
 "4>>"23       ) *##N $N , ,
!
	8   ')@ AD }- }    } %  
- !
- A A
	   }&: ;.1 }- }   E !E
 & &&   }&: ;-C  M *$
 !$..1      '""' #'     (> ? D& & 	  		*82l -dnn"U;  #1$.."T:# 
@,  /"&     8 8.I J     !< =    (   /?   3eE   +E	
   +F	1-f #DNN#45 %)  "   78#;#;=NO P$$< %<B	1B	5B B 	B #+	B@   (*B C D+2 +2\% D0 0 D&> '>
 D&4 '4C 1 1
A:$ F4((" )("V 	
$	    !-
S& 	
 	 m N
  	
 	  " #D+D $-##E.!"K$5$5$=$=?#-##E%L;,,446#-##E, +"3"3"B"BD   s   a> >bb