
    vh              	         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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=m>Z> d dl?m@Z@ d d lAmBZBmCZC eBeDcZDZEeCeFcZFZGe0j                  ZHeZIeJeKd!f   ZLej                  ej                  ej                  ej                  d"ZQ eRe.d#      rH e.j                         j                         D ]&  \  ZUZVeVD ]  \  ZWZXZY ej                  eWeXeUeY$        (  G d% d&e      Z[i Z\d'e]d(<   dd)Z^dd*Z_ G d+ d,ej                        Z` e7e`g d- e6D        d.d/d0d1d2d3d4d5d67       d8 Zad9 Zbej                  j                  e`eaeb       dd:Zed; Zfd< Zg G d= d>      Zh G d? d@ej                        ZjdA ej                  e`<   dB e*j                  e`<   ddCZmeme)j                  e`<   dD Zo e(j                  e`eo       dE ZqdF ZrdG ZsddHZt ej                  dI      Zv e&j                  ev        e'j                  ev       evj                  dJ        Zzevj                  dK        Z|dL Z}dM Z~ e(j                  eve~       ddNZ ej                  dO      Z e&j                  e        e'j                  e       ej                  dP        Zej                  dQ        ZdR ZdS Z e(j                  ee       dT Z ej                  dU      Z e&j                  e        e'j                  e       ej                  dV        Zej                  dW        ZdX ZdY Z e(j                  ee       dZ Z ej                  d[      Z e&j                  e        e'j                  e       ej                  d\        Zej                  d]        Zd^ Zd_ Z e(j                  ee       d` Z ej                  da      Z e&j                  e       ej                  db        Zej                  dc        Zdd Zde Z e(j                  ee       ee'j2                  e<   df Z ej                  dg      Z e&j                  e        e'j                  e       ej                  dh        Zej                  di        Zdj Z e(j                  ee       ddkZddlZ ee!dmn      ddo       Zdp Zdq Z eej                        Zdr Zds Zdt ZdduZ e(jR                   e(jT                   eedvw      dmx            Z e(jT                   eedmw      dmx      Zdy Z ej                  dz      Zdme_        ej                   eej`                  e             ej                  e        e'j                  e        e(j                  ee        e(j                  eed{|        e(j                  e eed}~      d|        e(j                  e eed~      d|       d Z ej                  d      Zdme_        ej                   eej`                  e             ej                  d        Z	 	 	 	 	 	 	 	 	 	 ddZd Z e(j                  ee        ee!dmn      d        ZddZ ee!d      dd       Z ee!ddm      dd       Z ee!ddm      dd       ZddZe!d        ZddZddZ ee!ddm      dd       Z e[deeeedzd      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                   eje\dz         e̐j                  j                          eʐj                   eje\d         e̐j                  j                          eʐj                   eje\d         e̐j                  j                         y# e$ r Y yw xY w)    )annotations)CallableIteratorSequence)partialreduceN)Any
NamedTuple)lax)numpy)	tree_util)api)config)core)dispatch)dtypes)ffi)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SingleDeviceShardingphysical_shardinglogical_sharding)Array)safe_mapsafe_zip.          @   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)hashrA   selfs    H/opt/face_recognition/venv/lib/python3.12/site-packages/jax/_src/prng.py__hash__zPRNGImpl.__hash__g   s    >    c                    | j                   S rC   )rA   rE   s    rG   __str__zPRNGImpl.__str__j   s    88OrI   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textrA   r?   nestgroupbrkjoin_asdictitems)rF   tykvs       rG   pprintzPRNGImpl.pprintm   s    		 	 BGGrd"TXXJd499+S9:GGArxx2772668040D0D0F>(,1bgg3qcl#> , !   >s   =$C5Nreturnintr]   r>   )
rO   
__module____qualname____doc____annotations__r?   rA   rH   rK   r[    rI   rG   r7   r7   N   sG      .	/$#s.rI   r7   zdict[str, PRNGImpl]prngsc                    | j                   t        v rt        d| j                    d|        | t        | j                   <   y )NzPRNG with name z already registered: )r?   re   
ValueErrorimpls    rG   register_prngrj   w   s9    	YY%
tyyk1FtfM
NN%		rI   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rC   )hasattr).0attrkey_datas     rG   	<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=)
lenr9   all	TypeErrorrr   rs   rt   npuint32r   )ri   rp   rr   s    ` rG   _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 /rI   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``).
  r7   _implz	jax.Array_base_arrayzbool | np.ndarray	_consumedNz"None | source_info_util.SourceInfo_source_infoc                N   t        |t        j                        rJ t        ||       || _        d| _        t        |t        j                        rNt        j                  |      }t        j                         }t        j                  |t        |      |g|gd      }|| _        y )NF)	committed)
isinstancer   Tracerr{   r~   r   ry   ndarrayget_avalr   get_default_devicebatched_device_putr(   r   )rF   ri   rp   avaldevices        rG   __init__zPRNGKeyArray.__init__   s    (DKK000x(DJDN(BJJ']]8$d&&(f((/CF/K*2fXPhDrI   c                N    | j                   j                  |j                          y rC   )r   _replace_with)rF   values     rG   r   zPRNGKeyArray._replace_with   s    ""5#4#45rI   c                :    | j                   j                         }| S rC   )r   block_until_readyrF   _s     rG   r   zPRNGKeyArray.block_until_ready   s    **,AKrI   c                8    | j                   j                         }y rC   )r   copy_to_host_asyncr   s     rG   r   zPRNGKeyArray.copy_to_host_async   s    ++-ArI   c                    | j                   j                  j                  }t        | j                  | j
                  | j                  |      S rC   )r   r   vmakeys_shaped_arrayr~   rs   sharding)rF   r   s     rG   r   zPRNGKeyArray.aval   s6    





#
#CTZZT]]CHHrI   c                V    t        | j                  | j                  j                        S rC   )base_arr_shape_to_keys_shaper~   r   rs   rE   s    rG   rs   zPRNGKeyArray.shape   s    '

D4D4D4J4JKKrI   c                @    t        j                  | j                        S rC   )mathprodrs   rE   s    rG   sizezPRNGKeyArray.size   s    99TZZ  rI   c                ,    t        | j                        S rC   )rv   rs   rE   s    rG   rr   zPRNGKeyArray.ndim   s    tzz?rI   c                ,    t        | j                        S rC   )KeyTyr~   rE   s    rG   rt   zPRNGKeyArray.dtype   s    rI   c                4    | j                   | j                  z  S rC   )itemsizer   rE   s    rG   nbyteszPRNGKeyArray.nbytes   s    ==499$$rI   c                .    | j                   j                  S rC   )rt   r   rE   s    rG   r   zPRNGKeyArray.itemsize   s    ::rI   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 rC   )r}   r~   r   addressable_data)rF   indexs     rG   r   zPRNGKeyArray.addressable_data   s$    

D$4$4$E$Ee$LMMrI   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rF   ss     rG   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     rG   r   zPRNGKeyArray.global_shards   sd     !!//  	Q99[[djj!''2		
  r   c                l    t        | j                  | j                  | j                  j                        S rC   )r*   rs   rt   r   r   rE   s    rG   r   zPRNGKeyArray.sharding   s%    DJJ

D4D4D4M4MNNrI   c                .    | j                   j                  S rC   )r   r   rE   s    rG   r   zPRNGKeyArray.committed  s    %%%rI   c                r    t        | j                  j                        }| j                  j                  |k(  S rC   )rv   r~   r9   r   rr   )rF   	base_ndims     rG   
_is_scalarzPRNGKeyArray._is_scalar  s-    DJJ(()I  I--rI   c                b    | j                         rt        d      t        | j                        S )Nzlen() of unsized object)r   rx   rv   r   rE   s    rG   __len__zPRNGKeyArray.__len__	  s)    /00t  rI   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rC   )r}   r~   )rn   rY   rF   s     rG   rq   z(PRNGKeyArray.__iter__.<locals>.<genexpr>  s     HALQ'Hs    #)r   rx   iterr   rE   s   `rG   __iter__zPRNGKeyArray.__iter__  s2    677 Id6F6F1GHHrI   c                h    d| j                    d| j                  j                   d| j                   S )NzArray(z, dtype=z) overlaying:
)rs   rt   r?   r   rE   s    rG   __repr__zPRNGKeyArray.__repr__  s4    TZZL(9 " #rI   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:rM   )	rP   rQ   r>   rs   r~   r[   rS   rR   rT   )rF   pp_keyspp_impls      rG   r[   zPRNGKeyArray.pprint   s    ggj!BGGC

O$<<Gggi 4::#4#4#66GrxxggoggaG#bffh.89:; < <rI   c                    | j                  | j                  | j                  j                               }| j                  |_        |S rC   )rN   r~   r   copyr   )rF   outs     rG   r   zPRNGKeyArray.copy'  s5    
..T%5%5%:%:%<
=CNNCMJrI   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.)rx   )rF   rt   r   s      rG   	__array__zPRNGKeyArray.__array__/  s    
 & ' 'rI   c                    J rC   rd   rE   s    rG   atzPRNGKeyArray.at5  s    7CerI   c                    J rC   rd   rE   s    rG   TzPRNGKeyArray.T7  s    1=rI   c                    J rC   rd   r   s     rG   __getitem__zPRNGKeyArray.__getitem__9      rI   c                    J rC   rd   rF   r   __s      rG   flattenzPRNGKeyArray.flatten:  r   rI   c                    J rC   rd   r   s      rG   ravelzPRNGKeyArray.ravel;  r   rI   c                    J rC   rd   r   s      rG   reshapezPRNGKeyArray.reshape<  r   rI   c                    J rC   rd   r   s      rG   squeezezPRNGKeyArray.squeeze=  r   rI   c                    J rC   rd   r   s      rG   swapaxeszPRNGKeyArray.swapaxes>  r   rI   c                    J rC   rd   r   s      rG   takezPRNGKeyArray.take?  r   rI   c                    J rC   rd   r   s      rG   	transposezPRNGKeyArray.transpose@  r   rI   )rp   r	   )r   r}   )r   r^   r]   r}   )r]   zlist[Shard])r]   zIterator[PRNGKeyArray])NN)rt   znp.dtype | Noner   zbool | Noner]   z
np.ndarray)r]   r%   )r]   r}   )6rO   r`   ra   rb   rc   r   r   r   r   r   propertyr   rs   r   rr   rt   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   r[   r   rH   __array_priority__r   r   r   r   r   r   r   r   r   r   r   rd   rI   rG   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= =========rI   r}   c              #  (   K   | ]
  }d | d   yw)r   Nrd   )rn   r   s     rG   rq   rq   C  s     -b2$bk-s   r   r   r   r   r   r   r   r   r   )includec                4    | j                   f| j                  fS rC   )r   r~   xs    rG   prngkeyarray_flattenr   H  s    
--	177	""rI   c                "    |\  }t        | |      S rC   r}   )ri   children
base_arrays      rG   prngkeyarray_unflattenr   K  s    +*	dJ	''rI   c                    t        ||       S Nrh   )random_seed)ri   r:   s     rG   seed_with_implr   T  s    	T	%%rI   c                p    t        j                  |t        |       |      }t        j                  ||      S )Nr   )r   ShapedArrayr   update_aval_with_sharding)ri   rs   r   r   r   s        rG   r   r   X  s-    			%t#	6$		'	'h	77rI   c                8    t        | j                        }|d |  S rC   )rv   r9   )ri   base_arr_shaper   s      rG   r   r   \  s    $..!)	)	$$rI   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 )Nrt   rz   rt   rh   )r~   r9   rm   jnp
issubdtypert   r   prng_keybroadcast_torandom_unwrapr   fullry   random_wrap)rs   
fill_valuert   physical_shaperp   s        rG   r  zKeyTyRules.fulld  s    5u5u{{445Nz7#z7G7G(Y!!-
";^Lh.*BHHX<NOh xekk22rI   c                |    t        j                  | j                  j                  t	        j
                  d            S Nrz   )r   r  r~   r9   r  rt   r  s    rG   physical_element_avalz KeyTyRules.physical_element_avalo  s(    EKK11399X3FGGrI   c                    | j                   S rC   r   )vals    rG   physical_constzKeyTyRules.physical_consts  s    ??rI   c                    fd}|S )Nc                    t        j                  |j                  |j                        |_        t        j                  j                  |      S rC   )r   r  rs   rt   r   r}   r~   )r   bufr   s     rG   handlerz*KeyTyRules.result_handler.<locals>.handlery  s6    !!#))SYY7ch$****C00rI   rd   )sticky_devicer   r   s    ` rG   result_handlerzKeyTyRules.result_handlerw  s    1 NrI   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 || }	} ||||	       fd}
|
S c c}w )Nzimpossible sharding z  in local sharded result handlerc                P    t        j                  j                   |             S rC   r}   rt   r~   bufsr   phys_handlers    rG   r   z8KeyTyRules.local_sharded_result_handler.<locals>.handler      $****L,>??rI   )r   physical_avalrt   r~   r9   r   local_result_handlersr  r   r'   r&   r)   slicerv   )r   r   indices	phys_avalr9   phys_handler_makerphys_shardingtrailing_indsindsphys_indicesr   r(  s   `          @rG   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@ N As   #Cc                     t        j                         }t        j                  t         j                     }t         |      } ||||       fd}|S )Nc                P    t        j                  j                   |             S rC   r%  r&  s    rG   r   z9KeyTyRules.global_sharded_result_handler.<locals>.handler  r)  rI   )r   r*  r   global_result_handlersr  r)   )r   out_shardingr   r.  r/  r0  r   r(  s   `      @rG   global_sharded_result_handlerz(KeyTyRules.global_sharded_result_handler  sO    ""4(I44T5E5EF%dL9M%i	JL@NrI   c                $   t        j                  |       }t        j                  t         j                     }|D cg c]  }t        |       }}t        | |      } ||||      }	 |	|      }
t        | j                  j                  |
      S c c}w rC   )
r   r*  r   r7  r  r  r)   r}   rt   r~   )r   r   arraysr   r.  r/  arrphys_arraysr0  r(  phys_results              rG   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  rt   r~   )valsr   r   r   physical_buffersphysical_results         rG   rB  zKeyTyRules.device_put_sharded  sC     ))->,,-=tG}MOTZZ-=-=>>rI   c                    t        j                  |      }t        |       }t        ||      }t	        j
                  |||gt        |      z  |      }t        ||j                  j                        S r   )
r   r*  r  r)   r   r   rv   r  rt   r~   )r  r   r   r   r*  physical_bufr0  rF  s           rG   device_put_replicatedz KeyTyRules.device_put_replicated  sd    &&t,M %L%dH5M--}|ns7|&CWNOTZZ-=-=>>rI   c                "    t         j                  S rC   )r   r   r   s    rG   tangent_dtypezKeyTyRules.tangent_dtype  s    ==rI   c                J    t        j                  dt        j                        S )Nrd   )ry   zerosr   r   rK  s    rG   zerozKeyTyRules.zero  s    88B&&rI   N)r]   zcore.ShapedArray)r]   r+   )rO   r`   ra   r
  rc   staticmethodr  r  r  r"  r4  r9  r?  rB  rI  rL  rO  rd   rI   rG   r  r  a  s     D 3 3 H H      0   7 7 ? ?
 ? ?   ' 'rI   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   r7   r~   c                    || _         y rC   )r~   )rF   ri   s     rG   r   zKeyTy.__init__  s	    DJrI   c                6    d| j                   j                   dS )Nzkey<>)r~   rA   rE   s    rG   r?   z
KeyTy.name  s    $**..!##rI   c                    t        j                  | j                  j                        t	        j
                  d      j                  z  S r  )r   r   r~   r9   ry   rt   r   rE   s    rG   r   zKeyTy.itemsize  s/    99TZZ))*RXXh-?-H-HHHrI   c                    | j                   S rC   )r?   rE   s    rG   r   zKeyTy.__repr__  s    99rI   c                Z    t        |      t        u xr | j                  |j                  k(  S rC   )r   r   r~   )rF   others     rG   __eq__zKeyTy.__eq__  s#    ;%=DJJ%++$==rI   c                D    t        | j                  | j                  f      S rC   )rD   rN   r~   rE   s    rG   rH   zKeyTy.__hash__  s    ,--rI   Nr_   r\   )rO   r`   ra   rc   r  _rulesr   r  r   r   r   r?   r   r   rY  rH   rd   rI   rG   r   r     sS    	/&	$ $ $ I I>.rI   r   c                    | j                   S rC   )r   r   s    rG   <lambda>r]    s
    AFF rI   c                    | S rC   rd   r   s    rG   r]  r]    s    ! rI   c                    | D cg c]  }|j                    }}t        | |      D cg c]  \  }}t        |j                  |       }}}t	        j
                  ||||      S c c}w c c}}w rC   )r   zipr)   r   r   
shard_args)xs	shardingslayoutscopy_semanticsr   arrsr   phys_shardingss           rG   key_array_shard_arg_handlerrh    sm    !#	$A!--	$$	$'*2y'9;#8 &affh7 ;. ; 
.$	GG	 
%;s
   A$ A)c                b    | j                   } t        j                  t        |            |      S rC   )r   r   get_constant_handlerr   )r   r<  s     rG   key_array_constant_handlerrk    s'    	#	-	"	"49	-c	22rI   c                P    t        |       D ]  }t        j                  |      } |S rC   )ranger   r   )nfr   s      rG   iterated_vmap_unaryrp    s'    8 aA	
(rI   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axesro  lefts      rG   squeeze_vmap_fz$squeeze_vmap.<locals>.squeeze_vmap_f  sL    
++aa
 ad
++aa
 ad0388Ata0A66rI   rd   )ro  r{  r|  s   `` rG   squeeze_vmapr}    s    7 
rI   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 rC   rd   )ry  ro  r   s    rG   r]  z>iterated_vmap_binary_bcast.<locals>.<lambda>.<locals>.<lambda>      qAw rI   rp  )r   ry  ro  ndim2s   ` rG   r]  z,iterated_vmap_binary_bcast.<locals>.<lambda>      G-e5FGJ rI   c                2     t        fd      |       S )Nc                     |       S rC   rd   )r   ro  ry  s    rG   r]  z>iterated_vmap_binary_bcast.<locals>.<lambda>.<locals>.<lambda>  r  rI   r  )r   ry  ro  ndim1s    `rG   r]  z,iterated_vmap_binary_bcast.<locals>.<lambda>  r  rI   )rx  ru   )rv   reversedr`  r   r   r}  )shape1shape2ro  sz1sz2r  r  s     `  @@rG   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$ 
(rI   c                :   t        | t              r)t        j                  t	        j
                  |             }nt        j                  |       }t        j                  j                  r|t        j                  j                  z  }t        j                  ||      S r   )r   r^   r  asarrayry   int64r   random_seed_offsetr   random_seed_pbind)seedsri   	seeds_arrs      rG   r   r   "  sm     sBHHUO,IE"I$$**000I			ID		11rI   r   c               Z    t        || j                  | j                  | j                        S rC   )r   rs   r   r   )
seeds_avalri   s     rG   random_seed_abstract_evalr  2  s(    	4!1!1:3F3F%>>
+ +rI   c               4    t        | |      }t        ||      S r   )random_seed_impl_baser}   )r  ri   base_arrs      rG   random_seed_implr  7  s    "5t4(	dH	%%rI   c               d    t        t        j                  |       |j                        } ||       S rC   )rp  ry   rr   r:   )r  ri   r:   s      rG   r  r  <  s$    	RWWU^TYY	7$	erI   c          	        | j                   \  }t        |j                  |j                        }t	        j
                  |d      }t	        j                  | ||t        t        j                  | j                              S )NFmultiple_results)	avals_out)avals_inrp  rr   r:   r   	lower_fundelegate_loweringmapr   r*  r  )ctxr  ri   r   r:   seed_lowerings         rG   random_seed_loweringr  @  s_    
,,%$	TYY			2$..>-				=%D&&6
8 8rI   c                0    t         j                  | |      S Nrs   )random_split_pr  )keysrs   s     rG   random_splitr  K  s    			T		//rI   r  c                   g | j                   j                  d gt        |      z  }t        | j                  j
                  g | j                  || j                   j                  |      | j                        S )N)spec)	r   r  rv   r   rt   r~   rs   updater   )	keys_avalrs   new_specs      rG   random_split_abstract_evalr  R  ss     >y!!&&=$#e*)<=(	9??002LIOO2Le2L$--44(4CY]]
T TrI   c                   t        | j                  | j                  | j                  |      }t	        | j                  |      S r  )random_split_impl_baser~   r   rr   r}   )r  rs   r  s      rG   random_split_implr  Z  s4    #
jj$""DIIU<(	djj(	++rI   c               6     t        | fd      } ||      S )Nc                (    j                  |       S rC   r;   rY   ri   rs   s    rG   r]  z(random_split_impl_base.<locals>.<lambda>a      4::a3G rI   r  )ri   r  	keys_ndimrs   r;   s   `  ` rG   r  r  `  s    
i)G
H%	xrI   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 rC   r  r  s    rG   r]  z'random_split_lowering.<locals>.<lambda>g  r  rI   Fr  r  r  )r  rt   r~   rp  rr   r   r  r  r   r*  r  r  )r  r  rs   r   r;   split_loweringri   s     `   @rG   random_split_loweringr  d  s}    
,,%$			$
dii)G
H%>>%%@.				>4""4()D&&6
8 8rI   c                    t        j                  |      }t        j                  | |      \  } }t        j                  | |      S rC   )r  r  r   standard_insert_pvaryrandom_fold_in_pr  )r  msgss     rG   random_fold_inr  q  s9    	T	$))$5*$			tT	**rI   r  c                    t        j                  d| |      }t        j                  d| |      }t        j                  d| |      }t        j
                  || j                  ||      S )Nr  )r   r   )lax_internalbroadcasting_shape_rulebroadcasting_sharding_ruler   standard_vma_ruler  rt   )r  	msgs_avalrs   r   r   s        rG   random_fold_in_abstract_evalr  z  s`    

.
.	9.%44	9.(/IF#			%8	MMrI   c                    t        | j                  | j                  || j                        }t	        | j                  |      S rC   )random_fold_in_impl_baser~   r   rs   r}   )r  r  r  s      rG   random_fold_in_implr    s4    %
jj$""D$**6(	djj(	++rI   c                h    t        |t        j                  |      | j                        } |||      S rC   )r  ry   rs   r=   )ri   r  r  
keys_shaper=   s        rG   r  r    s,    &"((4.$,,0'	4	  rI   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  rt   r~   r  rs   r=   r   r  r  r   r*  r  r  )r  r  r  r  r  ri   r=   fold_in_lowerings           rG   random_fold_in_loweringr    s    )Y			$&ooy6'^^GeD				T4""9-y9D&&6
8 8rI   c                2    t         j                  | ||      S N)	bit_widthrs   )random_bits_pr  r  r  rs   s      rG   r<   r<     s    			DIU		CCrI   r<   c                   g | j                   |}t        j                  d|       }t        j                  ||| j
                        S )Nuintr  )rs   r   rt   r   r  r   )r  r  rs   	out_shape	out_dtypes        rG   random_bits_abstract_evalr    sC    (	(%()llT)-.)			)YIMM	BBrI   c               ^    t        | j                  | j                  | j                  ||      S r  )random_bits_impl_baser~   r   rr   r  s      rG   random_bits_implr    s*    	tzz4+;+;TYY)2%
A ArI   c               :     t        | fd      } ||      S )Nc                *    j                  |       S rC   r<   rY   r  ri   rs   s    rG   r]  z'random_bits_impl_base.<locals>.<lambda>      4++Ay%@ rI   r  )ri   r  r  r  rs   bitss   `  `` rG   r  r    s    	@
B$	hrI   c               L  	 | j                   \  }|j                  j                  	t        |j                  	fd      }t        j                  |d      }| j                  t        j                  |      g      } |||      }| j                  |j                         |S )Nc                *    j                  |       S rC   r  r  s    rG   r]  z&random_bits_lowering.<locals>.<lambda>  r  rI   Fr  r  )r  rt   r~   rp  rr   r   r  replacer   r*  set_tokens_out
tokens_out)
r  r  r  rs   r   r  bits_loweringctx_newr   ri   s
     ``     @rG   random_bits_loweringr    s    
,,%$			$	
ii@
B$..>-KK$"4"4T":!;K<'gt$#W''(	*rI   c               H    t        ||        t        j                  | |      S r   )r{   random_wrap_pr  r  ri   s     rG   r  r    s"    tX&			H4		00rI   r  c                   t        || j                        }t        |t        |      | j                        }t        |||| j                        S rC   )r   rs   r*   r   r   r   r   )base_arr_avalri   rs   r   s       rG   random_wrap_abstract_evalr    sC    
&t]-@-@
A%eU4[-2H2HI(	4-2C2C	DDrI   c                   t        ||       S rC   r   r  s     rG   random_wrap_implr    s    	dH	%%rI   c                   |gS rC   rd   )r  r  ri   s      rG   random_wrap_loweringr    s
    
rI   c               ^    | \  }|\  }t        j                  ||d      }t        ||      dfS )Nru   rh   r   )r   bdim_at_frontr  )batched_args
batch_dimsri   r   ds        rG   random_wrap_batch_ruler    s6    "!"!Q1%!	QT	"A	%%rI   c                    t        j                  | j                  t        j                        st        d| j                        t        j                  |       S )Nz6random_unwrap takes key array operand, got keys.dtype=)r  r  rt   r   r  rx   random_unwrap_pr  r  s    rG   r  r    s@    	

FOO	4
M$**O
PP			d	##rI   r  c                ,    t        j                  |       S rC   )r   r*  )r  s    rG   random_unwrap_abstract_evalr    s    			I	&&rI   c                    | j                   S rC   r  r  s    rG   random_unwrap_implr	     s    			rI   c                    |gS rC   rd   )r  r  s     rG   random_unwrap_loweringr    s	    
-rI   c                ~    	 | j                   dk(  xr | j                  t        j                  k(  S # t        $ r Y yw xY w)NrM   F)rs   rt   ry   rz   AttributeError)keys    rG   _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)r:   s    rG   threefry_seedr    s     
	rI   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 ru  )r   expand_dimsconvert_element_typery   rz   )rY   s    rG   r]  z _threefry_seed.<locals>.<lambda>(  s$    cooc&>&>q"))&LqcR rI   r1   standardl    r   )rs   rx   ry   r  rt   integerr   shift_right_logicalr  _constr   numpy_dtype_promotionr  bitwise_andrz   concatenate)r:   convertk1k2s       rG   r  r  "  s    	ZZ
:4(!D
EE	tzz2::	.
<THE
FFR'	dL$7$7b$ABD"##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 rC   )r   rt   r  
shift_leftr  )r   r  rt   nbitss     rG   _rotate_leftz'_make_rotate_left.<locals>._rotate_left7  sn    
yy|u

"
"1e
,a
yy|u

"
"1e
,a>>!Q#"9"9!UQY"GGGrI   )r  r  ry   r  rx   arrayiinfor  )rt   r(  r'  s   ` @rG   _make_rotate_leftr+  2  sN    	rzz	*
?
@@
((399U#((%
0%H 
rI   c                 :   t        d | D              rt        dj                  |             t        d | D              rJt	        j
                  |  }t        j                  |t        j                  t        j                              }nt        d|        |fdz  S )Nc              3  V   K   | ]!  }|j                   t        j                  k7   # y wrC   )rt   r  rz   )rn   as     rG   rq   z._threefry2x32_abstract_eval.<locals>.<genexpr>C  s     -1CJJ	-s   ')z7Arguments to threefry2x32 must have uint32 type, got {}c              3  P   K   | ]  }t        |t        j                           y wrC   )r   r   r  )rn   args     rG   rq   z._threefry2x32_abstract_eval.<locals>.<genexpr>F  s     ;sC))	*;s   $&z2Arguments to threefry2x32 must all be arrays, got rM   )anyrx   formatrw   r  r  r   r  r  rt   rz   )argsrs   r   s      rG   _threefry2x32_abstract_evalr4  B  s    ---
MVD\# #;d;;00$7EE399SZZ#89D
HO
PP
1rI   c                l    | d d  } | d   | d   z   | d<   t        | d   |      | d<   | d   | d   z  | d<   | S )Nr   ru   )rotate_left)rZ   rots     rG   apply_roundr8  Q  sN    d!	
1!!A$	QqT3	!A$	
1!!A$	
(rI   c                    | dd  | d d z   S )Nru   rd   )rb  s    rG   rotate_listr:  Y  s    	AB"Ra&rI   c                    |\  }}}|d   D ]  }t        ||      } |d   |d   z   |d   |d   z   t        j                  | dz   t        j                        z   g}|t        |      t        |      fS )Nr   ru   r  )r8  r  r  ry   rz   r:  )istater   ks	rotationsrnew_xs          rG   rolled_loop_steprB  ]  s}    !RQ< aAqAQ4"Q%<11AE(KK
L%	BY!7	77rI   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  )      r0      ir   ru      rM         )	ry   r)  rz   r   	fori_looprB  r:  r8  tuple)
key1key2x1x2use_rolled_loopsr   r?  r>  r   r@  s
             rG   _threefry2x32_loweringrV  e  sn    
2h!xxryy9xx(		:<)dD4K"))J"778"	
11!A$	
11!A$mmAq"2QB4STGAq!8 
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/rI   F)rU  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_dimrm  rv   rs   )r   r   aval_outr  ranks     rG   
_broadcastz3_threefry2x32_gpu_lowering_rule.<locals>._broadcast  s6      a6;D3tzz?<RTX6Y[ [rI   rN  r  _threefry2x32_ffi)r   threefry_gpu_kernel_loweringr   _threefry2x32_lowering_ruler  r  rv   rs   r   full_like_avalr  r   ffi_lowering)r  r"  r#  rS  rT  target_name_prefix
aval_out_2k1_avalk2_avalx1_avalx2_avalrN  r^  sub_ctxruler\  r]  s   `              @@rG   _threefry2x32_gpu_lowering_rulerl    s    		,	,	2	2&sBB;;(J	Z		'*||$'7GW	X^^	$(..Q1E5>[ KK(qK1'				-.
0$	gz"g.
2w0GW%z"g'>
@ @rI   threefry2x32cpu)r4   cu)rd  cuda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   rd   rz   rM   r  )rv   r  rN  ry   rt   iota_2x32_shape_pr  r  s    rG   iota_2x32_shaperu    sF    ^ 	Z1_IIb"((8,-/!33			e		,,rI   ru  c                \    t        j                  | t        j                  d            fdz  S )Nrz   rM   )r   r  ry   rt   r  s    rG   iota_2x32_shape_abstract_evalrw    s&    


5"((8"4
5	7!	;;rI   c                    g t        j                  |dd  d d d         d d d   d}t        | t        ||      D cg c]  \  }} |||       c}}      S c c}}w )Nru   )ry   cumprodr   r`  )addmulrs   iotasstridesr<  r   s          rG   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 )
Nuint64c                B    t         j                  j                  | |      S rC   )r   r"   r{  )r   ry  s     rG   _addz&iota_2x32_shape_lowering.<locals>._add  s    88<<1rI   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 )Nr  rY  )r   is_constant_dimr   ir_constantry   r)  rt   eval_dynamic_shaper"   r!  r!   RankedTensorTypegetdtype_to_ir_typer[  multiply)r   ry  x_constx_shapex_bcastaval_u64r  s        rG   _mulz&iota_2x32_shape_lowering.<locals>._mul  s    A  !RXXh-?!@Ag((qd3hg



!
!##BHHX$679:ACg ##C(9;=G88Wa((rI   r   )	dimensionr1   rY  )r   ir.Valuery  r  r]   r  )r   zcore.DimSizery  r  r]   r  )r  r   r  ry   rt   rv   rm  r   iotar  r  r)  r[  r"   r  r!  aval_to_ir_type)r  rs   r\  r   r  r  r  r}  countsshiftcounts_shifted	counts_lo	counts_hir  s   `            @rG   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 )rD  z/threefry_2x32 requires uint32 arguments, got {}r   rM   )r   ru   Nry  )r   rt   ry   rz   rx   r2  r   rs   r   r  rC  r  r;   r   dynamic_slicethreefry2x32_pr  r   )keypaircountrQ  rR  msgr   
flat_countodd_sizeflat_count_paddedflat_count_padded_half_sizer   out_no_paddings               rG   threefry_2x32r  1  sG    *$	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	)4468	)46468	A 
1qtzz	!;AaDJJ!

#;;	!$adAaD1!#	bii			(#;;8s3BxekkBBekkBB&&sD:3C3CA3F2HIN	^U[[	11=  Ks   9Kc                `    t        t        t        j                  |            }t	        | |      S rC   )rP  
unsafe_mapr   concrete_dim_or_error_threefry_splitr  rs   s     rG   threefry_splitr  `  s&    

455u=
>%	e	$$rI   ru   )static_argnumsc                f    t         j                  j                  rt        | |      S t	        | |      S rC   )r   threefry_partitionabler   _threefry_split_foldlike_threefry_split_originalr  s     rG   r  r  d  s+    ""((#C//#C//rI   )r  r  c                    t        j                  |      }t        j                  t        j
                  |dz        }t        j                  t        | |      g |d      S )NrM   )r   r   r   r  ry   rz   r   r  )r  rs   numr  s       rG   r  r  k  sH    		%#88BIIsQw'&	]3/5!	==rI   c                    | \  }}t        |      \  }}t        j                  ||||      \  }}t        j                  ||g|j
                        S )Nrs  )ru  r  r  r  stackrr   )r  rs   r"  r#  counts1counts2bits1bits2s           rG   r  r  q  sM    &"b$U+'7$$RWg>,%	E5>

	33rI   c                \    |j                   rJ t        | t        j                  |            S rC   )rs   _threefry_fold_inr  rz   r  r   s     rG   threefry_fold_inr  y  s$    ZZ	3

4 0	11rI   c                ,    t        | t        |            S rC   )r  r  r  s     rG   r  r  }  s    	sM$/	00rI   c                    t        |       st        d      |dvrt        d      t        j                  j                  rt        | ||      S t        | ||      S )zCSample uniform random bits of given width and shape using PRNG key.z*threefry_random_bits got invalid prng key.r.   ,requires 8-, 16-, 32- or 64-bit field width.)r  rx   r   r  r   #_threefry_random_bits_partitionable_threefry_random_bits_original)r  r  rs   s      rG   threefry_random_bitsr    sW    	s	#
@
AAo%
B
CC""((.sIuEE)#y%@@rI   c                   t        d |D              r#t        j                  |      dkD  rt        d      | \  }}t	        |      \  }}t
        j                  ||||      \  }}t        |   }	|dk(  rKt        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rC   )r   r  )rn   r  s     rG   rq   z6_threefry_random_bits_partitionable.<locals>.<genexpr>  s     0Q		a	 0s   !l            z+random bits array of size exceeding 2 ** 64r2   r1   )rw   r   r   NotImplementedErrorru  r  r  UINT_DTYPESr   r  r&  )r  r  rs   r"  r#  r  r  r  r  rt   bits_hibits_los               rG   r  r    s    0%00TYYu5E5O
K
LL&"b$U+'7$$RWg>,%
i
 %"_&&ue4G&&ue4G>>'59-77B5=##EEM599rI   )ru   rM   c                   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(  r]t        j$                  |d      D cg c]  }t        j&                  ||       }}t        j(                  |d    |d            |d   z  }n|d	v rt        j*                  t        j                  t        j                  |      j                        t        j,                  t        j.                  |d
      t        j0                  t        j                  |      t        j2                  t        j                  d|z  dfd                        }t        j4                  ||dz  |z  fd      }t        j&                  ||      d | }t        j4                  ||      S c c}w )Nr1   r   ru   ry  rv  )rw  r2   rM   )r/   r0   r  )ru   r   )r   r   divmodr   r  r  r*  ry   rz   maxr  r   r  r  r   r   r   r  r;   r  r&  r  r  	broadcastr|  broadcasted_iotar   )r  r  rs   r   	max_countr@  nblocksremr  r  subkeyslast_keyblockslastrt   r   s                   rG   r  r    sW   	5	$ 	D("-,)QUNI	)$)SYYryy%9%=%=>LGSiSG	chhryy#67D#!~.DSb	48XG3T-3GSXXbiiQTQZQZ[][d[dQeQiQi=jkF388BIIs#;<D??FLLND115D
i
 %"_8;		$8JK1C$$Q.KDK>>$q'59-Q7DG??ii##$	dD!
))I



ryy2?A*>
B	
	D ;;ty2~:=vFD##D%0$7D	T5	!!! Ls   0Lr  fry)r9   r:   r;   r<   r=   r?   rA   c                b    | j                   rJ t        |       }t        j                  ||g      S rC   )rs   r  r  r   )r:   halfkeys     rG   	_rbg_seedr    s,    ZZ$'	'7+	,,rI   c           	         t         j                  j                  rt        }nt        }| j                  dd      }  t        |dt        |            ||      j
                  g |d S )NrM   rv  rN  )r   r  r   r  r  r   r   rv   )r  rs   r  halfkeyss       rG   
_rbg_splitr    sq    ""((.O.O[[A(
G 
.y#e*
..6
??Fw


 rI   c                    |j                   rJ  t        t        dd      | j                  dd      |      j                  d      S )Nrv  r   rM   rN  )rs   r   r  r   r  s     rG   _rbg_fold_inr    s>    ZZ	.A	.s{{1a/@$	G	O	OPQ	RRrI   c                    | j                   dk(  s-| j                  t        j                  d      k(  rt        d      |dvrt        d      t	        j
                  | |t        |         \  }}|S )NrN  rz   z&_rbg_random_bits got invalid prng key.r.   r  r  )rs   rt   r  rx   r   rng_bit_generatorr  )r  r  rs   r   r  s        rG   _rbg_random_bitsr    sd    	d	syyCIIh,??
<
==o%
B
CC!!#uK	4JK'!T	+rI   r  rbgc                    t        j                  |      }t        j                  | d|z  dfd      \  }} t        j                  |d d d      j
                  g |d S )N
   rN  rz   r  )start_indexlimit_indexstride)r   r   r   r  slice_in_dimr   )r  rs   r  r   r  s        rG   _unsafe_rbg_splitr    so    		%#!!#S!}HE'!T
C		
$r
;;B7
NDI
NKL
N NrI   c                v    |j                   rJ t        j                  t        |      dd      \  }}| |d   z  S )N)r  rN  rz   r  ry  )rs   r   r  r  )r  r   r   r<   s       rG   _unsafe_rbg_fold_inr    s9    ZZ((4'R.![	{2	rI   
unsafe_rbgurbg)serialization)serialization_generated)ri   r7   )rp   typing.Array)ri   r7   r:   int | typing.ArrayLiker]   r}   )rb  zSequence[PRNGKeyArray])r  r  ri   r7   r]   r}   )rs   r8   )r  r  r]   r	  )r:   r  r]   r  )T)
r{  z(Callable[[ir.Value, ir.Value], ir.Value]r|  z,Callable[[core.DimSize, ir.Value], ir.Value]rs   z
core.Shaper}  zSequence[ir.Value]r]   r  )r  r  rs   r8   r]   r  )r]   r  )r  r  r   r  r]   r  )r  r  )r  r  r  r^   rs   zSequence[int]r]   r  )
__future__r   collections.abcr   r   r   	functoolsr   r   r   operatorr   r   r	   r
   r   ry   jaxr   r  r   jax._srcr   r   r   r   r   r   r   rP   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)   r*   jax._src.typingr+   jax._src.utilr,   r-   r  r  r`  
unsafe_zipDeviceShardrP  r^   r8   uint8uint16rz   r  r  rm   r3   rW   r4   targetsr?   r   r5   register_ffi_targetr7   re   rc   rj   r{   r}   r   r   dispatch_registryregister_noder   r   r   r  ExtendedDTyper   pytype_aval_mappingscanonicalize_dtype_handlersrh  shard_arg_handlersrk  register_constant_handlerrp  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  r<   r  r  r  r  r  r  r  r  r  r  r  primitive_batchersr  r  r  r	  r  r  r  r  r+  r4  r6  r8  r:  rB  rV  cache_loweringr  ra  _threefry2x32_cpu_lowering_rulerl  r  r  apply_primitiveru  rt  rw  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ImportErrorrd   rI   rG   <module>r+     s	   # 8 8 %   "  
     %     ) % 4  " " $ * & & % , ! )   *F F  " ,CZCZ	c3h yycjjcjjcjjB 8_%1811399; h$+  e[c
k$z $N   3 q>399 q>f < 25-,-2525
2525'25 25 25 "25 $/25 1425 6#(  $ $ 2 2&(>@
&8%
d' d'N.F   .4 +;  , '0;   -H )D   %3   |-G H
	&
2 }- }    } %  + !+ & &8   }&: ;0  / ~    ~ &!!T "T , ,
8   ~'< =+
 "4>>"23       ) *##N $N , ,
!
	8   ')@ AD }- }    } %  C !C
 A A
	   }&: ;.1 }- }   E !E
 & &&   }&: ;-C  M *$
 !$..1      '""' #'     (> ? 	T& & 	  		*80h 2d11.$.."U;3   #1$.."T:# 
@,  /"&     8 8.I J     !< =    (   /1   3eE   +E   +F1-f #DNN#45 %)  "   78#;#;=NO P$$< %<B	1B	5B B 	B #+	B@   (*B C 	T+2 +2\% 	T"0 #0 	T$/> 0>
 	T$/4 042 1 1
A:$ 	VD1(" 2("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