
    Cd                       U d dl mZ d dlZd dlZd dl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Zd dlmZ d dlmZmZmZmZ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!m"Z"m#Z#  G d d          Z$dIdZ% G d d          Z&d Z'dJdZ(d Z)d Z*d Z+d Z,d Z-d Z.dddddZ/	 i Z0de1d <    e            Z2d! Z3	  e3d"          Z4 e3d#          Z5 e3d$          Z6 e3d%          Z7 e3d&          Z8 e3d'          Z9 e3d(          Z: e3d)          Z; e3d*          Z< e3d+          Z= e3d,          Z> e3d-          Z? e3d.          Z@ e3d/          ZA e3d0          ZB e3d1          ZC e3d2          ZD e3d3          ZE e3d4          ZF e3d5          ZG e3d6          ZH e3d7          ZI e3d8          ZJ e3d9          ZK e3d:          ZL e3d:          ZM e3d;          ZN e3d<          ZO e3d=          ZP e3d>          ZQ e3d?          ZR e3d@          ZS e3dA          ZT e3dB          ZU e3dC          ZV e3dD          ZW e3dE          ZX e3dF          ZY e3dG          ZZ e3dH          Z[dS )K    )annotationsN)chainproduct)Integral)getitem)Lock)array_creation_dispatch)Arrayasarraybroadcast_shapesbroadcast_tonormalize_chunksslices_from_chunks)arange)asarray_safe)tokenize)HighLevelGraph)derived_fromrandom_state_datatypenamec                  H
   e Zd ZdZd Zd Zed             Zed             Z e	e
j        j        d          d6d
            Z e	e
j        j        d          d6d            Z e	e
j        j        d          d6d            Z e	e
j        j        d          	 	 	 	 	 	 d7d            Z e	e
j        j        d          d8d            Z e	e
j        j        d          d6d            Z e	e
j        j        d          d8d            Z e	e
j        j        d          d6d            Z e	e
j        j        d          d9d            Z e	e
j        j        d          d6d            Z e	e
j        j        d          dde
j        dd	fd            Z e	e
j        j        d          d9d            Z e	e
j        j        d          d9d            Z e	e
j        j        d          d9d            Z e	e
j        j        d          d6d            Z e	e
j        j        d          d6d            Z e	e
j        j        d          	 d:d             Z e	e
j        j        d          d6d!            Z e	e
j        j        d          d6d"            Z  e	e
j        j        d          d6d#            Z! e	e
j        j        d          d9d$            Z" e	e
j        j        d          d6d%            Z# e	e
j        j        d          d&             Z$ e	e
j        j        d          d8d'            Z% e	e
j        j        d          d6d(            Z& e	e
j        j        d          de
j'        dd	fd)            Z e	e
j        j        d          d8d*            Z( e	e
j        j        d          d6d+            Z) e	e
j        j        d          d6d,            Z* e	e
j        j        d          d6d-            Z+ e	e
j        j        d          d6d.            Z, e	e
j        j        d          d6d/            Z- e	e
j        j        d          d6d0            Z. e	e
j        j        d          d9d1            Z/ e	e
j        j        d          d6d2            Z0 e	e
j        j        d          d6d3            Z1 e	e
j        j        d          d6d4            Z2 e	e
j        j        d          d6d5            Z3dS );	Generatora
  
    Container for the BitGenerators.

    ``Generator`` exposes a number of methods for generating random
    numbers drawn from a variety of probability distributions and serves
    as a replacement for ``RandomState``. The main difference between the
    two is that ``Generator`` relies on an additional ``BitGenerator`` to
    manage state and generate the random bits, which are then transformed
    into random values from useful distributions. The default ``BitGenerator``
    used by ``Generator`` is ``PCG64``. The ``BitGenerator`` can be changed
    by passing an instantiated ``BitGenerator`` to ``Generator``.

    The function :func:`dask.array.random.default_rng` is the recommended way
    to instantiate a ``Generator``.

    .. warning::

       No Compatibility Guarantee.

       ``Generator`` does not provide a version compatibility guarantee. In
       particular, as better algorithms evolve the bit stream may change.

    Parameters
    ----------
    bit_generator : BitGenerator
        BitGenerator to use as the core generator.

    Notes
    -----
    In addition to the distribution-specific arguments, each ``Generator``
    method takes a keyword argument `size` that defaults to ``None``. If
    `size` is ``None``, then a single value is generated and returned. If
    `size` is an integer, then a 1-D array filled with generated values is
    returned. If `size` is a tuple, then an array with that shape is
    filled and returned.

    The Python stdlib module `random` contains pseudo-random number generator
    with a number of methods that are similar to the ones available in
    ``Generator``. It uses Mersenne Twister, and this bit generator can
    be accessed using ``MT19937``. ``Generator``, besides being
    Dask-aware, has the advantage that it provides a much larger number
    of probability distributions to choose from.

    All ``Generator`` methods are identical to ``np.random.Generator`` except
    that they also take a `chunks=` keyword argument.

    ``Generator`` does not guarantee parity in the generated numbers
    with any third party library. In particular, numbers generated by
    `Dask` and `NumPy` will differ even if they use the same seed.

    Examples
    --------
    >>> from numpy.random import PCG64
    >>> from dask.array.random import Generator
    >>> rng = Generator(PCG64())
    >>> rng.standard_normal().compute() # doctest: +SKIP
    array(0.44595957)  # random

    See Also
    --------
    default_rng : Recommended constructor for `Generator`.
    np.random.Generator
    c                    || _         d S N)_bit_generator)selfbit_generators     1lib/python3.11/site-packages/dask/array/random.py__init__zGenerator.__init__^   s    +    c                R    | j         j        }|d| j        j         j        z   dz   z  }|S )N())	__class____name__r   )r   _strs     r   __str__zGenerator.__str__a   s.    ~&d)3<<sBBr    c                \    t          | j                                      d          d         S N.r   )r   r   splitr   s    r   _backend_namezGenerator._backend_namef   s(     +,,22377::r    c                4    t          j        | j                  S r   )	importlibimport_moduler-   r,   s    r   _backendzGenerator._backendl   s     &t'9:::r       
skipblocksNautoc                (    t          | d||f||d|S Nbetasizechunks
_wrap_funcr   abr:   r;   kwargss         r   r8   zGenerator.betar   %    $1Q4QQ&QQQr    c                (    t          | d||f||d|S Nbinomialr9   r<   r   npr:   r;   rA   s         r   rE   zGenerator.binomialv   %    $
AqUtFUUfUUUr    c                &    t          | d|f||d|S N	chisquarer9   r<   r   dfr:   r;   rA   s        r   rL   zGenerator.chisquarez   #    $RTd6TTVTTTr    Tr   c                   t          | ||          \  }}}}	t          t          |           }
t          | j        t          |
                    }dt          |||          z  }t          |ggd |D             R  }fdt          |||
          D             }t          j	        |||	          }t          ||||          S )Nda.random.choice-%sc              3  N   K   | ] }t          t          |                    V  !d S r   rangelen.0bds     r   	<genexpr>z#Generator.choice.<locals>.<genexpr>   s.       A ABs2ww A A A A A Ar    c                8    i | ]\  }}}|t           ||fS  )_choice_rng)	rW   kbitgenr:   r?   axisrH   replaceshuffles	       r   
<dictcomp>z$Generator.choice.<locals>.<dictcomp>   sB     
 
 
64 VQgq$H
 
 
r    dependenciesmeta)_choice_validate_paramslistr   _spawn_bitgensr   rU   r   zipr   from_collectionsr
   )r   r?   r:   r`   rH   r_   ra   r;   rf   rd   sizesbitgensnamekeysdskgraphs    ` ````         r   choicezGenerator.choice~   s0   ( $D!T7AtVLL		
 Wf%&& !4c%jjAA$xT61gq$(
 (
 
 vB A A& A A ABBB
 
 
 
 
 
 
 
#&tWe#<#<
 
 

 /cUUUUD&t4444r          ?c                &    t          | d|f||d|S Nexponentialr9   r<   r   scaler:   r;   rA   s        r   rv   zGenerator.exponential   2    -
-1&
 
DJ
 
 	
r    c                (    t          | d||f||d|S Nfr9   r<   r   dfnumdfdenr:   r;   rA   s         r   r|   zGenerator.f   %    $UEVVVVvVVVr    c                (    t          | d||f||d|S Ngammar9   r<   r   shaperx   r:   r;   rA   s         r   r   zGenerator.gamma   4    '5%
.26
 
EK
 
 	
r    c                &    t          | d|f||d|S N	geometricr9   r<   r   rH   r:   r;   rA   s        r   r   zGenerator.geometric   #    $QST&SSFSSSr            c                (    t          | d||f||d|S Ngumbelr9   r<   r   locrx   r:   r;   rA   s         r   r   zGenerator.gumbel   4    (C
-1&
 
DJ
 
 	
r    c                *    t          | d|||f||d|S Nhypergeometricr9   r<   r   ngoodnbadnsampler:   r;   rA   s          r   r   zGenerator.hypergeometric   ?    	
 	
 	
 	
 	
 		
r    Fc           	     ,    t          | d|f|||||d|S )Nintegers)highr:   dtypeendpointr;   r<   )r   lowr   r:   r   r   r;   rA   s           r   r   zGenerator.integers   sD     

 

 

 

 

 
	
r    c                (    t          | d||f||d|S Nlaplacer9   r<   r   s         r   r   zGenerator.laplace   4    )S%
.26
 
EK
 
 	
r    c                (    t          | d||f||d|S Nlogisticr9   r<   r   s         r   r   zGenerator.logistic   4    *c5
/3F
 
FL
 
 	
r    c                (    t          | d||f||d|S N	lognormalr9   r<   r   meansigmar:   r;   rA   s         r   r   zGenerator.lognormal   4    +tU
15f
 
HN
 
 	
r    c                &    t          | d|f||d|S N	logseriesr9   r<   r   s        r   r   zGenerator.logseries   r   r    c                H    t          | d||f||t          |          ffd|S Nmultinomialr:   r;   extra_chunksr=   rU   r   rG   pvalsr:   r;   rA   s         r   r   zGenerator.multinomial   J    		

 u::-)	
 	
 	
 	
 		
r    	marginalsc                *    t          | d||f|||d|S )Nmultivariate_hypergeometric)r:   methodr;   r<   )r   colorsr   r:   r   r;   rA   s          r   r   z%Generator.multivariate_hypergeometric  sA     )		

 	
 	
 	
 	
 		
r    c                (    t          | d||f||d|S Nnegative_binomialr9   r<   rF   s         r   r   zGenerator.negative_binomial  5    %q!
26v
 
IO
 
 	
r    c                (    t          | d||f||d|S Nnoncentral_chisquarer9   r<   r   rN   noncr:   r;   rA   s         r   r   zGenerator.noncentral_chisquare  5    ("d
9=f
 
PV
 
 	
r    c                *    t          | d|||f||d|S Nnoncentral_fr9   r<   r   r~   r   r   r:   r;   rA   s          r   r   zGenerator.noncentral_f  6    .%
;?
 
RX
 
 	
r    c                (    t          | d||f||d|S Nnormalr9   r<   r   s         r   r   zGenerator.normal%  r   r    c                &    t          | d|f||d|S Nparetor9   r<   r   r?   r:   r;   rA   s        r   r   zGenerator.pareto+  #    $!P$vPPPPPr    c                (   ddl m} | j        dk    rt          d          t	          |t
          j                  rt          |d          }| j                            t          |                    }t          | j        |            |||          S )Nr   shuffle_slicecupyz`Generator.permutation` not supported for cupy-backed Generator objects. Use the 'numpy' array backend to call `dask.array.random.default_rng`, or pass in  `numpy.random.PCG64()`.r5   r;   )dask.array.slicingr   r-   NotImplementedError
isinstancenumbersNumberr   r1   rU   _shuffler   r   xr   indexs       r   permutationzGenerator.permutation/  s    444444''%+   a(( 	)q(((A$$SVV,,$e,,,}Q&&&r    c                &    t          | d|f||d|S Npoissonr9   r<   r   lamr:   r;   rA   s        r   r   zGenerator.poissonB  #    $	3ST&SSFSSSr    c                &    t          | d|f||d|S Npowerr9   r<   r   s        r   r   zGenerator.powerF  #    $OfOOOOOr    c                (    t          | df||||d|S )Nrandom)r:   r   outr;   r<   )r   r:   r   r   r;   rA   s         r   r   zGenerator.randomJ  s4    (
!%UF
 
NT
 
 	
r    c                &    t          | d|f||d|S Nrayleighr9   r<   rw   s        r   r   zGenerator.rayleighP  #    $
EVVVVvVVVr    c                $    t          | df||d|S Nstandard_cauchyr9   r<   r   r:   r;   rA   s       r   r   zGenerator.standard_cauchyT  "    $ 1VVVVvVVVr    c                $    t          | df||d|S Nstandard_exponentialr9   r<   r   s       r   r   zGenerator.standard_exponentialX  1    (
/3F
 
FL
 
 	
r    c                &    t          | d|f||d|S Nstandard_gammar9   r<   r   r   r:   r;   rA   s        r   r  zGenerator.standard_gamma^  3    "E
04V
 
GM
 
 	
r    c                $    t          | df||d|S Nstandard_normalr9   r<   r   s       r   r  zGenerator.standard_normald  r   r    c                &    t          | d|f||d|S N
standard_tr9   r<   rM   s        r   r  zGenerator.standard_th  #    $bUtFUUfUUUr    c                *    t          | d|||f||d|S N
triangularr9   r<   r   leftmoderightr:   r;   rA   s          r   r  zGenerator.triangularl  6    ,dE
8<V
 
OU
 
 	
r    c                (    t          | d||f||d|S Nuniformr9   r<   r   r   r   r:   r;   rA   s         r   r  zGenerator.uniformr  4    )S$
-1&
 
DJ
 
 	
r    c                (    t          | d||f||d|S Nvonmisesr9   r<   r   mukappar:   r;   rA   s         r   r  zGenerator.vonmisesx  4    *b%
.26
 
EK
 
 	
r    c                (    t          | d||f||d|S Nwaldr9   r<   r   r   rx   r:   r;   rA   s         r   r#  zGenerator.wald~  &    $eX$vXXQWXXXr    c                &    t          | d|f||d|S Nweibullr9   r<   r   s        r   r(  zGenerator.weibull  #    $	1Q4QQ&QQQr    c                &    t          | d|f||d|S Nzipfr9   r<   r   s        r   r,  zGenerator.zipf  #    $NVNNvNNNr    Nr5   )NTNr   Tr5   rs   Nr5   r   rs   Nr5   )Nr   r5   )4r%   
__module____qualname____doc__r   r'   propertyr-   r1   r   npr   r   r8   rE   rL   rr   rv   r|   r   r   r   r   int64r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   float64r   r   r   r  r  r  r  r  r  r#  r(  r,  r[   r    r   r   r      s       > >@, , ,  
 ; ; X;
 ; ; X;
 \")%!444R R R 54R \")%!444V V V 54V \")%!444U U U 54U \")%!444 
"5 "5 "5 54"5H \")%!444
 
 
 54

 \")%!444W W W 54W \")%!444
 
 
 54

 \")%!444T T T 54T \")%!444
 
 
 54

 \")%!444

 

 

 54

 \")%!444 h
 
 
 54
, \")%!444
 
 
 54

 \")%!444
 
 
 54

 \")%!444
 
 
 54

 \")%!444T T T 54T \")%!444

 

 

 54

 \")%!444EK
 
 
 54
 \")%!444
 
 
 54

 \")%!444
 
 
 54

 \")%!444
 
 
 54

 \")%!444
 
 
 54

 \")%!444Q Q Q 54Q \")%!444' ' 54'$ \")%!444T T T 54T \")%!444P P P 54P \")%!444bjd6 
 
 
 54

 \")%!444W W W 54W \")%!444W W W 54W \")%!444
 
 
 54

 \")%!444
 
 
 54

 \")%!444W W W 54W \")%!444V V V 54V \")%!444
 
 
 54

 \")%!444
 
 
 54

 \")%!444
 
 
 54

 \")%!444Y Y Y 54Y \")%!444R R R 54R \")%!444O O O 54O O Or    r   c                    t          | d          rt          |           S t          | t                    r| S t          | d          rt          | j                  S t          t	          j        |                     S )af
  
    Construct a new Generator with the default BitGenerator (PCG64).

    Parameters
    ----------
    seed : {None, int, array_like[ints], SeedSequence, BitGenerator, Generator}, optional
        A seed to initialize the `BitGenerator`. If None, then fresh,
        unpredictable entropy will be pulled from the OS. If an ``int`` or
        ``array_like[ints]`` is passed, then it will be passed to
        `SeedSequence` to derive the initial `BitGenerator` state. One may
        also pass in a `SeedSequence` instance.
        Additionally, when passed a `BitGenerator`, it will be wrapped by
        `Generator`. If passed a `Generator`, it will be returned unaltered.

    Returns
    -------
    Generator
        The initialized generator object.

    Notes
    -----
    If ``seed`` is not a `BitGenerator` or a `Generator`, a new
    `BitGenerator` is instantiated. This function does not manage a default
    global instance.

    Examples
    --------
    ``default_rng`` is the recommended constructor for the random number
    class ``Generator``. Here are several ways we can construct a random
    number generator using ``default_rng`` and the ``Generator`` class.

    Here we use ``default_rng`` to generate a random float:

    >>> import dask.array as da
    >>> rng = da.random.default_rng(12345)
    >>> print(rng)
    Generator(PCG64)
    >>> rfloat = rng.random().compute()
    >>> rfloat
    array(0.86999885)
    >>> type(rfloat)
    <class 'numpy.ndarray'>

    Here we use ``default_rng`` to generate 3 random integers between 0
    (inclusive) and 10 (exclusive):

    >>> import dask.array as da
    >>> rng = da.random.default_rng(12345)
    >>> rints = rng.integers(low=0, high=10, size=3).compute()
    >>> rints
    array([2, 8, 7])
    >>> type(rints[0])
    <class 'numpy.int64'>

    Here we specify a seed so that we have reproducible results:

    >>> import dask.array as da
    >>> rng = da.random.default_rng(seed=42)
    >>> print(rng)
    Generator(PCG64)
    >>> arr1 = rng.random((3, 3)).compute()
    >>> arr1
    array([[0.91674416, 0.91098667, 0.8765925 ],
           [0.30931841, 0.95465607, 0.17509458],
           [0.99662814, 0.75203348, 0.15038118]])

    If we exit and restart our Python interpreter, we'll see that we
    generate the same random numbers again:

    >>> import dask.array as da
    >>> rng = da.random.default_rng(seed=42)
    >>> arr2 = rng.random((3, 3)).compute()
    >>> arr2
    array([[0.91674416, 0.91098667, 0.8765925 ],
           [0.30931841, 0.95465607, 0.17509458],
           [0.99662814, 0.75203348, 0.15038118]])

    See Also
    --------
    np.random.default_rng
    capsuler   )hasattrr   r   r   r	   default_bit_generator)seeds    r   default_rngr=    sw    d tY -	D)	$	$ -		'	' -+,,,,B4HHIIIr    c                  
   e Zd ZdZd4dZed             Zd5dZ ee	j
        j        d          d6d	            Z ee	j
        j        d          d6d
            Z ee	j
        j        d          d6d            Z ej        e          5   ee	j
        j        d          d7d            Zddd           n# 1 swxY w Y    ee	j
        j        d          d8d            Z ee	j
        j        d          d6d            Z ee	j
        j        d          d8d            Z ee	j
        j        d          d6d            Z ee	j
        j        d          d9d            Z ee	j
        j        d          d6d            Z ee	j
        j        d          d9d            Z ee	j
        j        d          d9d            Z ee	j
        j        d          d9d            Z ee	j
        j        d          d6d            Z ee	j
        j        d          d6d            Z ee	j
        j        d          d6d            Z ee	j
        j        d          d6d            Z ee	j
        j        d          d6d            Z  ee	j
        j        d          d9d            Z! ee	j
        j        d          d6d            Z" ee	j
        j        d          d              Z# ee	j
        j        d          d8d!            Z$ ee	j
        j        d          d6d"            Z% ee	j
        j        d          d:d$            Z& ee	j
        j        d          d;d%            Z' ee	j
        j        d          d6d&            Z(e(Z
 ee	j
        j        d          d8d'            Z) ee	j
        j        d          d6d(            Z* ee	j
        j        d          d6d)            Z+ ee	j
        j        d          d6d*            Z, ee	j
        j        d          d6d+            Z- ee	j
        j        d          d6d,            Z. ee	j
        j        d          d6d-            Z/ ee	j
        j        d          d6d.            Z0 ee	j
        j        d          d9d/            Z1 ee	j
        j        d          d6d0            Z2 ee	j
        j        d          d6d1            Z3 ee	j
        j        d          d6d2            Z4 ee	j
        j        d          d6d3            Z5dS )<RandomStatea  
    Mersenne Twister pseudo-random number generator

    This object contains state to deterministically generate pseudo-random
    numbers from a variety of probability distributions.  It is identical to
    ``np.random.RandomState`` except that all functions also take a ``chunks=``
    keyword argument.

    Parameters
    ----------
    seed: Number
        Object to pass to RandomState to serve as deterministic seed
    RandomState: Callable[seed] -> RandomState
        A callable that, when provided with a ``seed`` keyword provides an
        object that operates identically to ``np.random.RandomState`` (the
        default).  This might also be a function that returns a
        ``mkl_random``, or ``cupy.random.RandomState`` object.

    Examples
    --------
    >>> import dask.array as da
    >>> state = da.random.RandomState(1234)  # a seed
    >>> x = state.normal(10, 0.1, size=3, chunks=(2,))
    >>> x.compute()
    array([10.01867852, 10.04812289,  9.89649746])

    See Also
    --------
    np.random.RandomState
    Nc                x    t           j                            |          | _        |t          j        n|| _        d S r   )r5  r   r?  _numpy_stater	   _RandomState)r   r<  r?  s      r   r   zRandomState.__init__
  s9    I11$773>3F#//K 	r    c                    t          | j                                      d          d         }t          j        |          S r)   )r   rB  r+   r/   r0   )r   r-   s     r   r1   zRandomState._backend  s8     !!23399#>>qA&}555r    c                :    | j                             |           d S r   )rA  r<  )r   r<  s     r   r<  zRandomState.seed  s    t$$$$$r    r2   r3   r5   c                (    t          | d||f||d|S r7   r<   r>   s         r   r8   zRandomState.beta  rB   r    c                (    t          | d||f||d|S rD   r<   rF   s         r   rE   zRandomState.binomial  rI   r    c                &    t          | d|f||d|S rK   r<   rM   s        r   rL   zRandomState.chisquare"  rO   r    Tc           	        t          | |d|          \  }}}}}t          t          |           }	t          t	          |	          | j                  }
dt          |
||          z  }t          |ggd |D             R  }fdt          ||
|	          D             }t          j	        |||          }t          ||||          S )Nr   rQ   c              3  N   K   | ] }t          t          |                    V  !d S r   rS   rV   s     r   rY   z%RandomState.choice.<locals>.<genexpr>;  s.      $E$EU3r77^^$E$E$E$E$E$Er    c           	     4    i | ]\  }}}|t           ||fS r[   )
_choice_rs)rW   r]   stater:   r?   rH   r`   s       r   rb   z&RandomState.choice.<locals>.<dictcomp><  s>       "Aud Jq$;  r    rc   re   )rg   rh   r   r   rU   rA  r   rj   r   rk   r
   )r   r?   r:   r`   rH   r;   r_   rf   rd   rl   
state_datarn   ro   rp   rq   s    ` ``          r   rr   zRandomState.choice(  s)    (aw1fMM	 &)**E*3u::t7HIIJ(8D&!Wa, , D D6F$E$Ef$E$E$EFFFD     &)$
E&B&B  C
 #3c  E f48888r    rs   c                &    t          | d|f||d|S ru   r<   rw   s        r   rv   zRandomState.exponentialF  ry   r    c                (    t          | d||f||d|S r{   r<   r}   s         r   r|   zRandomState.fL  r   r    c                (    t          | d||f||d|S r   r<   r   s         r   r   zRandomState.gammaP  r   r    c                &    t          | d|f||d|S r   r<   r   s        r   r   zRandomState.geometricV  r   r    r   c                (    t          | d||f||d|S r   r<   r   s         r   r   zRandomState.gumbelZ  r   r    c                *    t          | d|||f||d|S r   r<   r   s          r   r   zRandomState.hypergeometric`  r   r    c                (    t          | d||f||d|S r   r<   r   s         r   r   zRandomState.laplacem  r   r    c                (    t          | d||f||d|S r   r<   r   s         r   r   zRandomState.logistics  r   r    c                (    t          | d||f||d|S r   r<   r   s         r   r   zRandomState.lognormaly  r   r    c                &    t          | d|f||d|S r   r<   r   s        r   r   zRandomState.logseries  r   r    c                H    t          | d||f||t          |          ffd|S r   r   r   s         r   r   zRandomState.multinomial  r   r    c                (    t          | d||f||d|S r   r<   rF   s         r   r   zRandomState.negative_binomial  r   r    c                (    t          | d||f||d|S r   r<   r   s         r   r   z RandomState.noncentral_chisquare  r   r    c                *    t          | d|||f||d|S r   r<   r   s          r   r   zRandomState.noncentral_f  r   r    c                (    t          | d||f||d|S r   r<   r   s         r   r   zRandomState.normal  r   r    c                &    t          | d|f||d|S r   r<   r   s        r   r   zRandomState.pareto  r   r    c                    ddl m} t          |t          j                  rt          |d          }t          j        t          |                    }| j        	                    |            |||          S )Nr   r   r5   r   )
r   r   r   r   r   r   r5  rU   rA  ra   r   s       r   r   zRandomState.permutation  sx    444444a(( 	)q(((A	#a&&!!!!%(((}Q&&&r    c                &    t          | d|f||d|S r   r<   r   s        r   r   zRandomState.poisson  r   r    c                &    t          | d|f||d|S r   r<   r   s        r   r   zRandomState.power  r   r    lc                *    t          | d||f|||d|S )Nrandint)r:   r;   r   r<   )r   r   r   r:   r;   r   rA   s          r   rc  zRandomState.randint  s6    )S$
-1&
 
QW
 
 	
r    c                (    t          | d||f||d|S )Nrandom_integersr9   r<   r  s         r   re  zRandomState.random_integers  s5    #S$
59&
 
LR
 
 	
r    c                $    t          | df||d|S )Nrandom_sampler9   r<   r   s       r   rg  zRandomState.random_sample  s!    $Td6TTVTTTr    c                &    t          | d|f||d|S r   r<   rw   s        r   r   zRandomState.rayleigh  r   r    c                $    t          | df||d|S r   r<   r   s       r   r   zRandomState.standard_cauchy  r   r    c                $    t          | df||d|S r   r<   r   s       r   r   z RandomState.standard_exponential  r   r    c                &    t          | d|f||d|S r  r<   r  s        r   r  zRandomState.standard_gamma  r  r    c                $    t          | df||d|S r  r<   r   s       r   r  zRandomState.standard_normal  r   r    c                &    t          | d|f||d|S r
  r<   rM   s        r   r  zRandomState.standard_t  r  r    c                $    t          | df||d|S )Ntomaxintr9   r<   r   s       r   ro  zRandomState.tomaxint  s!    $
OfOOOOOr    c                *    t          | d|||f||d|S r  r<   r  s          r   r  zRandomState.triangular  r  r    c                (    t          | d||f||d|S r  r<   r  s         r   r  zRandomState.uniform  r  r    c                (    t          | d||f||d|S r  r<   r  s         r   r  zRandomState.vonmises  r   r    c                (    t          | d||f||d|S r"  r<   r$  s         r   r#  zRandomState.wald  r%  r    c                &    t          | d|f||d|S r'  r<   r   s        r   r(  zRandomState.weibull  r)  r    c                &    t          | d|f||d|S r+  r<   r   s        r   r,  zRandomState.zipf  r-  r    )NNr   r.  )NTNr5   r/  r0  )NNr5   ra  )NNr5   )6r%   r1  r2  r3  r   r4  r1   r<  r   r5  r   r?  r8   rE   rL   
contextlibsuppressAttributeErrorrr   rv   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rc  re  rg  r   r   r   r  r  r  ro  r  r  r  r#  r(  r,  r[   r    r   r?  r?    s'	        >
 
 
 
 6 6 X6% % % % \")'A666R R R 76R \")'A666V V V 76V \")'A666U U U 76U 
	^	,	, 9 9	bi+	:	:	:	9 	9 	9 
;	:	99 9 9 9 9 9 9 9 9 9 9 9 9 9 9@ \")'A666
 
 
 76

 \")'A666W W W 76W \")'A666
 
 
 76

 \")'A666T T T 76T \")'A666
 
 
 76

 \")'A666

 

 

 76

 \")'A666
 
 
 76

 \")'A666
 
 
 76

 \")'A666
 
 
 76

 \")'A666T T T 76T \")'A666

 

 

 76

 \")'A666
 
 
 76

 \")'A666
 
 
 76

 \")'A666
 
 
 76

 \")'A666
 
 
 76

 \")'A666Q Q Q 76Q \")'A666' ' 76' \")'A666T T T 76T \")'A666P P P 76P \")'A666
 
 
 76

 \")'A666
 
 
 76

 \")'A666U U U 76U F\")'A666W W W 76W \")'A666W W W 76W \")'A666
 
 
 76

 \")'A666
 
 
 76

 \")'A666W W W 76W \")'A666V V V 76V \")'A666P P P 76P \")'A666
 
 
 76

 \")'A666
 
 
 76

 \")'A666
 
 
 76

 \")'A666Y Y Y 76Y \")'A666R R R 76R \")'A666O O O 76O O Os   "B;;B?B?r?  c                    t          |                               d          d         }t          j        |          }|j                            |           S r)   )r   r+   r/   r0   r   r=  )r^   backend_namebackend_libs      r   _rng_from_bitgenr|    sK     F##))#..q1L),77K))&111r    c                    | j         } t          |                       } || _         t          |           }|                    ||          S )N)r_   )rL  typer|  ra   )r   r   r_   rM  rL  s        r   r   r     sJ    $J'D''))M$M]++E===&&&r    c                X      j                             |          } fd|D             }|S )Nc                @    g | ]} t                    |          S r[   )r~  )rW   r<  r^   s     r   
<listcomp>z"_spawn_bitgens.<locals>.<listcomp>"  s)    444d|tF||D!!444r    )	_seed_seqspawn)r^   	n_bitgensseedsrm   s   `   r   ri   ri      s7    ""9--E4444e444GNr    c                    t          |t          j        j                  r | |          }t	          |          } t          | |          } ||d|i|S )z$Apply random module method with seedr:   )r   r5  r   SeedSequencer|  getattr)rngfuncnamer^   r:   argsrA   funcs          r   _apply_random_funcr  &  s\    &")011 V
6
"
"C3!!D4+D+F+++r    c                h    | t           j        }  | |          }t          ||          } ||d|i|S )z"Apply RandomState method with seedNr:   )r	   r?  r  )r?  r  rM  r:   r  rA   rL  r  s           r   _apply_randomr  /  sH    -9K
##E5(##D4+D+F+++r    c                V    t          |           }|                    ||||||          S )N)r:   r`   rH   r_   ra   )r|  rr   )rM  r?   r:   r`   rH   r_   ra   rL  s           r   r\   r\   8  s-    Z((E<<gw<WWWr    c                \    t          j        |           }|                    ||||          S )N)r:   r`   rH   )r	   r?  rr   )rM  r?   r:   r`   rH   rL  s         r   rK  rK  =  s,    #/
;;E<<g<;;;r    c                *   g }t          |t                    rt          | t                    rO| j        dk    rt	          d          | j        j                                                            ddd           }nxt          | t                    rT|| j        
                    dg          n|}	| j        j        	                                                    dd|	          }nt          d          |}
|dk     rt          d          nt          |          }|                    |j                  }|j        }|j        dk    rt          d	          t#          |          }
|                    |           |                                d         }|t          |t(                    sZt+          ||
          }t-          j        |                                ddd          st          d          t          |          }n|                    |j                  }|j        dk    rt          d          t#          |          |
k    rt          d          |                    |           |                                d         }|d}nt          |t2          t4          f          s|f}|dk    rt          d          t7          ||t,          j                  }|s*t#          |d                   dk    rd}t	          |          ||||||||fS )Nr   z3`choice` not supported for cupy-backed `Generator`.r2   r[   )r:   rH   zUnknown generator classr   za must be greater than 0za must be one dimensional)likegHz>)rtolatolzprobabilities do not sum to 1zp must be one dimensionalza and p must have the same sizez(axis must be 0 since a is one dimensinalr   z]replace=False is not currently supported for dask.array.choice with multi-chunk output arrays)r   r   r   r-   r   r1   r   r=  rr   r?  array
ValueErrorr   rechunkr   _metandimrU   append__dask_keys__r
   r   r5  isclosesumtuplerh   r   r7  )rL  r?   r:   r`   rH   r_   r;   rd   rf   dummy_plen_aerr_msgs               r   rg   rg   B  s   L!X !eY'' 	8"f,,)I   >(4466==abD=QQDD{++ 	8 45=en**A3///aG>(4466==abG=TTDD6777q557888  AJJIIagw6Q;;8999AAOOa  	}!U## 	# QQ'''A:aeeggqt!<<< B !@AAA

AA		!'""A6Q;;8999q66U??>???AOOa |udm,, wqyyCDDDfd"*===F +s6!9~~)) 	
 "'***dGQfdL@@r    r5   r[   r   c          
        |t          |t          t          f          s|f}t          d t          ||                                          D                       }||                    |           t          | }t          |||                    dt          j
                            }t          |          }d }	i }
i }g }g }t          |          D ]\  }}t          |t          j        t          f          r |	|||          }t          |t                    r |                    |           |j        ||<   n6t          |t          j                  rdt!          |           }|||<   ||
|<   |                    |t          d |j        D                                           |                    |           i }|                                D ]\  }}t          |t          j        t          f          r |	|||          }t          |t                    r |                    |           |j        ||<   n6t          |t          j                  rdt!          |           }|||<   ||
|<   |t          d |j        D                                ||<   |||<   t          t'          |           }t          | t(                    rYt+          | j        t/          |                    }t!          |          }d	 |D             }t0          }t3          | j                  }ndt          | t4                    r@t7          t/          |          | j                  }t!          |          }t:          }| j        }nt?          d
          t!          |||||          }| d| }t'          |ggd |D             dggt/          |          z  z   R  }t'          d |D              }g }tA          ||||          D ]]\  }}}}g } t          |          D ]\  }}||vr|                     |           t          |t                    r |                     ||         f|z              Tt          |t          j                  r$|                     tB          ||         |f           t?          d          i }!|                                D ]p\  }"}|"|vr||!|"<   t          |t                    r||"         f|z   |!|"<   4t          |t          j                  rtB          ||"         |f|!|"<   bt?          d          |                    |||||| |!f           _ ||||dt/          |          z  ||          }#|
"                    tG          tA          ||                               tI          j%        ||
|          }$t          |$|||z   |#          S )zWrap numpy random function to produce dask.array random function
    extra_chunks should be a chunks tuple to append to the end of chunks
    Nc                ^    h | ]*}t          |t          t          j        f          #|j        +S r[   )r   r
   r5  ndarrayr   )rW   ars     r   	<setcomp>z_wrap_func.<locals>.<setcomp>  sA     	
 	
 	
"ubj122	
H	
 	
 	
r    r   r  c                   t          | t                    r#t          | |                              |          S t          | t          j                  r't	          j        t	          j        | |                    S t          d          )Nz!Unknown object type for broadcast)r   r
   r   r  r5  r  ascontiguousarray	TypeError)r  r   r;   s      r   _broadcast_anyz"_wrap_func.<locals>._broadcast_any  st    b%   	AE**226:::BJ'' 	A'E(B(BCCC?@@@r    zarray-c              3     K   | ]}d V  dS r   Nr[   rW   _s     r   rY   z_wrap_func.<locals>.<genexpr>  s"      &;&;Qq&;&;&;&;&;&;r    c              3     K   | ]}d V  dS r  r[   r  s     r   rY   z_wrap_func.<locals>.<genexpr>  s"      (=(=q(=(=(=(=(=(=r    c                    g | ]	}|j         
S r[   )r  )rW   _bitgens     r   r  z_wrap_func.<locals>.<listcomp>  s    <<<7$<<<r    z:Unknown object type: Not a Generator and Not a RandomState-c                F    g | ]}t          t          |                    S r[   rS   rV   s     r   r  z_wrap_func.<locals>.<listcomp>  s$    333b5R>>333r    r   c                F    g | ]}t          t          |                    S r[   rS   rV   s     r   r  z_wrap_func.<locals>.<listcomp>  s$    777"uSWW~~777r    zUnknown object type in argszUnknown object type in kwargsr   rc   re   )&r   r  rh   r   valuesr  r   r   getr5  r7  r   	enumerater  r
   rn   r   r   itemsr   r   ri   r   rU   r  r~  r?  r   rA  r  rB  r  rj   r   updatedictr   rk   )%r  r  r:   r;   r   r  rA   shapesslicesr  rp   lookup
small_argsrd   ir  resrn   small_kwargskeyrl   rm   bitgen_tokenfunc_appliergentokenro   blocksvalsr^   slcblockargkwrgr]   rf   rq   s%                                        r   r=   r=     sH    
4% ? ?w	
 	
D&--//22	
 	
 	
 F dV$Djj"*--  F
  ''FA A A CFJL4 " "2b2:u-.. 	" .T622C#u%%  ##C(((Hq		C,,  /// q	D	b&;&;"(&;&;&;!;!;<====b!!!!L<<>> # #Rb2:u-.. 	# .T622C#u%%  ##C(((!hsC,,  ///"sD	 "5(=(=BH(=(=(=#=#= >L "L&!""E#y!! V !3SZZ@@((<<G<<<)3%&&	C	%	% V#CJJ0@AA(($TUUU\4v>>E    D	33F333sec,>O>O6OO  D 777778FD$'$G$G L L c5t__ 		C 		CEAr

2b%(( CJJq	|e34444BJ// CJJC89999#$ABBB\\^^ 		E 		EEArQb%(( E%aylU2DGGBJ// E&q	37DGG#$CDDD\3&$TJKKKK<s4yy D JJtCdOO$$%%%+D#LQQQEf|3$????r    zdict[str, RandomState]_cached_statesc                      fd}t          t                     j        |_        t          t                     j        |_        |S )Nc                     t           j        }t          5  	 t          |         }n(# t          $ r t                      xt          |<   }Y nw xY wd d d            n# 1 swxY w Y    t          |          | i |S r   )r	   backend_cached_states_lockr  KeyErrorr?  r  )r  rA   r  rL  attrs       r   wrapperz_make_api.<locals>.wrapper  s    %-  	< 	<<&s+ < < <.9mm;s#eee<	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<
 $wud##T4V444s1   A%A"A
A	A

AA A)r  r?  r%   r3  )r  r  s   ` r   	_make_apir    sL    5 5 5 5 5 {D11:Gk4008GONr    r<  r8   rE   rL   rr   rv   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rg  rc  re  r   r   r   r  r  r  r  r  r  r#  r(  r,  r   r  )\
__future__r   rv  r/   r   	itertoolsr   r   r   operatorr   	threadingr   numpyr5  dask.array.backendsr	   dask.array.corer
   r   r   r   r   r   dask.array.creationr   dask.array.utilsr   	dask.baser   dask.highlevelgraphr   
dask.utilsr   r   r   r   r=  r?  r|  r   ri   r  r  r\   rK  rg   r=   r  __annotations__r  r  r<  r8   rE   rL   rr   rv   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rg  r   rc  re  r   r   r   r  r  r  r  r  r  r#  r(  r,  r[   r    r   <module>r     sA   " " " " " " "          $ $ $ $ $ $ $ $                       7 7 7 7 7 7                ' & & & & & ) ) ) ) ) )       . . . . . . @ @ @ @ @ @ @ @ @ @kO kO kO kO kO kO kO kO\\J \J \J \J~cO cO cO cO cO cO cO cOL	2 2 2' ' ' '  , , ,, , ,X X X
< < <
CA CA CAN  $FB@ B@ B@ B@ B@J *, + + + +dff    yy9Z  Ik""		8		i&&IcNN	'Ik""		8		+,,
)I

9Z  Ik""	Ik""	i&&I122  y!788 y((	8			8		i&&
)I

	'	/**	?	#	#
)I

)-..9Z  )-.. y!788 +,,)-..Y|$$
Y|$$

)I

9Z  y
)I

yr    