a
    tDf                     @  s  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 dZ$dTddZ%G dd dZ&dd Z'dUddZ(dd Z)dd Z*dd Z+dd Z,d d! Z-d"d# Z.dd$d%d&d'd(Z/i Z0d)e1d*< e Z2d+d, Z3e3d-Z4e3d.Z5e3d/Z6e3d0Z7e3d1Z8e3d2Z9e3d3Z:e3d4Z;e3d5Z<e3d6Z=e3d7Z>e3d8Z?e3d9Z@e3d:ZAe3d;ZBe3d<ZCe3d=ZDe3d>ZEe3d?ZFe3d@ZGe3dAZHe3dBZIe3dCZJe3dDZKe3dEZLe3dEZMe3dFZNe3dGZOe3dHZPe3dIZQe3dJZRe3dKZSe3dLZTe3dMZUe3dNZVe3dOZWe3dPZXe3dQZYe3dRZZe3dSZ[dS )V    )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                   @  s(  e Zd ZdZdd Zdd Zedd Zedd	 Ze	e
jjd
dd`ddZe	e
jjd
ddaddZe	e
jjd
ddbddZe	e
jjd
ddcddZe	e
jjd
dddddZe	e
jjd
ddeddZe	e
jjd
ddfddZe	e
jjd
ddgdd Ze	e
jjd
ddhd"d#Ze	e
jjd
ddid$d%Ze	e
jjd
ddde
jd&dfd'd(Ze	e
jjd
ddjd)d*Ze	e
jjd
ddkd+d,Ze	e
jjd
ddld-d.Ze	e
jjd
ddmd/d0Ze	e
jjd
ddnd1d2Ze	e
jjd
ddod4d5Ze	e
jjd
ddpd6d7Ze	e
jjd
ddqd8d9Z e	e
jjd
ddrd:d;Z!e	e
jjd
ddsd<d=Z"e	e
jjd
ddtd>d?Z#e	e
jjd
dd@dA Z$e	e
jjd
ddudBdCZ%e	e
jjd
ddvdDdEZ&e	e
jjd
dde
j'ddfdFdGZe	e
jjd
ddwdHdIZ(e	e
jjd
ddxdJdKZ)e	e
jjd
ddydLdMZ*e	e
jjd
ddzdNdOZ+e	e
jjd
dd{dPdQZ,e	e
jjd
dd|dRdSZ-e	e
jjd
dd}dTdUZ.e	e
jjd
dd~dVdWZ/e	e
jjd
dddXdYZ0e	e
jjd
dddZd[Z1e	e
jjd
ddd\d]Z2e	e
jjd
ddd^d_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                 C  s
   || _ d S N)_bit_generator)selfbit_generator r   ^/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/dask/array/random.py__init__^   s    zGenerator.__init__c                 C  s"   | j j}|d| jj j d 7 }|S )N())	__class____name__r   )r   _strr   r   r   __str__a   s    zGenerator.__str__c                 C  s   t | jdd S N.r   )r   r   splitr   r   r   r   _backend_namef   s    zGenerator._backend_namec                 C  s   t | jS r   )	importlibimport_moduler(   r'   r   r   r   _backendl   s    zGenerator._backend   Z
skipblocksNautoc                 K  s   t | d||f||d|S Nbetasizechunks
_wrap_funcr   abr2   r3   kwargsr   r   r   r0   r   s    zGenerator.betac                 K  s   t | d||f||d|S Nbinomialr1   r4   r   npr2   r3   r9   r   r   r   r;   v   s    zGenerator.binomialc                 K  s   t | d|f||d|S N	chisquarer1   r4   r   dfr2   r3   r9   r   r   r   r@   z   s    zGenerator.chisquareTr   c              
     s   t |  ||\ }}}}	tt| }
t| jt|
}dt|||  }t|ggdd |D R  } fddt|||
D }tj	|||	d}t
||||dS )Nda.random.choice-%sc                 s  s   | ]}t t|V  qd S r   rangelen.0Zbdr   r   r   	<genexpr>       z#Generator.choice.<locals>.<genexpr>c                   s(   i | ] \}}}|t | |fqS r   )_choice_rng)rH   kbitgenr2   r7   axisr>   replaceshuffler   r   
<dictcomp>   s   z$Generator.choice.<locals>.<dictcomp>dependenciesmeta)_choice_validate_paramslistr   _spawn_bitgensr   rF   r   zipr   from_collectionsr	   )r   r7   r2   rP   r>   rO   rQ   r3   rV   rT   sizesbitgensnamekeysdskgraphr   rN   r   choice~   s*    
zGenerator.choice      ?c                 K  s   t | d|f||d|S Nexponentialr1   r4   r   scaler2   r3   r9   r   r   r   re      s    zGenerator.exponentialc                 K  s   t | d||f||d|S Nfr1   r4   r   dfnumdfdenr2   r3   r9   r   r   r   ri      s    zGenerator.fc                 K  s   t | d||f||d|S Ngammar1   r4   r   shaperg   r2   r3   r9   r   r   r   rn      s    zGenerator.gammac                 K  s   t | d|f||d|S N	geometricr1   r4   r   r>   r2   r3   r9   r   r   r   rr      s    zGenerator.geometric        c                 K  s   t | d||f||d|S Ngumbelr1   r4   r   locrg   r2   r3   r9   r   r   r   rv      s    zGenerator.gumbelc                 K  s   t | d|||f||d|S Nhypergeometricr1   r4   r   ZngoodZnbadnsampler2   r3   r9   r   r   r   rz      s    zGenerator.hypergeometricFc                 K  s    t | d|f|||||d|S )Nintegers)highr2   dtypeendpointr3   r4   )r   lowr~   r2   r   r   r3   r9   r   r   r   r}      s    	zGenerator.integersc                 K  s   t | d||f||d|S Nlaplacer1   r4   rw   r   r   r   r      s    zGenerator.laplacec                 K  s   t | d||f||d|S Nlogisticr1   r4   rw   r   r   r   r      s    zGenerator.logisticc                 K  s   t | d||f||d|S N	lognormalr1   r4   r   meansigmar2   r3   r9   r   r   r   r      s    zGenerator.lognormalc                 K  s   t | d|f||d|S N	logseriesr1   r4   rs   r   r   r   r      s    zGenerator.logseriesc                 K  s&   t | d||f||t|ffd|S Nmultinomialr2   r3   extra_chunksr5   rF   r   r=   Zpvalsr2   r3   r9   r   r   r   r      s    
zGenerator.multinomial	marginalsc                 K  s   t | d||f|||d|S )Nmultivariate_hypergeometric)r2   methodr3   r4   )r   colorsr|   r2   r   r3   r9   r   r   r   r     s    z%Generator.multivariate_hypergeometricc                 K  s   t | d||f||d|S Nnegative_binomialr1   r4   r<   r   r   r   r     s    zGenerator.negative_binomialc                 K  s   t | d||f||d|S Nnoncentral_chisquarer1   r4   r   rB   noncr2   r3   r9   r   r   r   r     s    zGenerator.noncentral_chisquarec                 K  s   t | d|||f||d|S Nnoncentral_fr1   r4   r   rk   rl   r   r2   r3   r9   r   r   r   r     s    
zGenerator.noncentral_fc                 K  s   t | d||f||d|S Nnormalr1   r4   rw   r   r   r   r   %  s    zGenerator.normalc                 K  s   t | d|f||d|S Nparetor1   r4   r   r7   r2   r3   r9   r   r   r   r   +  s    zGenerator.paretoc                 C  s\   ddl m} | jdkrtdt|tjr6t|d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()`.r.   r3   )dask.array.slicingr   r(   NotImplementedError
isinstancenumbersNumberr   r+   rF   _shuffler   r   xr   indexr   r   r   permutation/  s    
zGenerator.permutationc                 K  s   t | d|f||d|S Npoissonr1   r4   r   Zlamr2   r3   r9   r   r   r   r   B  s    zGenerator.poissonc                 K  s   t | d|f||d|S Npowerr1   r4   r   r   r   r   r   F  s    zGenerator.powerc                 K  s   t | df||||d|S )Nrandom)r2   r   outr3   r4   )r   r2   r   r   r3   r9   r   r   r   r   J  s    zGenerator.randomc                 K  s   t | d|f||d|S Nrayleighr1   r4   rf   r   r   r   r   P  s    zGenerator.rayleighc                 K  s   t | df||d|S Nstandard_cauchyr1   r4   r   r2   r3   r9   r   r   r   r   T  s    zGenerator.standard_cauchyc                 K  s   t | df||d|S Nstandard_exponentialr1   r4   r   r   r   r   r   X  s    zGenerator.standard_exponentialc                 K  s   t | d|f||d|S Nstandard_gammar1   r4   r   rp   r2   r3   r9   r   r   r   r   ^  s    zGenerator.standard_gammac                 K  s   t | df||d|S Nstandard_normalr1   r4   r   r   r   r   r   d  s    zGenerator.standard_normalc                 K  s   t | d|f||d|S N
standard_tr1   r4   rA   r   r   r   r   h  s    zGenerator.standard_tc                 K  s   t | d|||f||d|S N
triangularr1   r4   r   leftmoderightr2   r3   r9   r   r   r   r   l  s    
zGenerator.triangularc                 K  s   t | d||f||d|S Nuniformr1   r4   r   r   r~   r2   r3   r9   r   r   r   r   r  s    zGenerator.uniformc                 K  s   t | d||f||d|S Nvonmisesr1   r4   r   mukappar2   r3   r9   r   r   r   r   x  s    zGenerator.vonmisesc                 K  s   t | d||f||d|S Nwaldr1   r4   r   r   rg   r2   r3   r9   r   r   r   r   ~  s    zGenerator.waldc                 K  s   t | d|f||d|S Nweibullr1   r4   r   r   r   r   r     s    zGenerator.weibullc                 K  s   t | d|f||d|S Nzipfr1   r4   r   r   r   r   r     s    zGenerator.zipf)Nr.   )Nr.   )Nr.   )NTNr   Tr.   )rc   Nr.   )Nr.   )rc   Nr.   )Nr.   )rt   rc   Nr.   )Nr.   )rt   rc   Nr.   )rt   rc   Nr.   )rt   rc   Nr.   )Nr.   )Nr.   )Nr   r.   )Nr.   )Nr.   )Nr.   )rt   rc   Nr.   )Nr.   )rc   Nr.   )Nr.   )rc   Nr.   )Nr.   )Nr.   )Nr.   )Nr.   )Nr.   )Nr.   )rt   rc   Nr.   )Nr.   )Nr.   )Nr.   )Nr.   )4r!   
__module____qualname____doc__r   r#   propertyr(   r+   r   npr   r   r0   r;   r@   rb   re   ri   rn   rr   rv   rz   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   @

      $ 
r   c                 C  sB   t | drt| S t| tr | S t | dr4t| jS tt| 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
    Zcapsuler   )hasattrr   r   r   r   Zdefault_bit_generator)seedr   r   r   default_rng  s    R



r   c                   @  sR  e Zd ZdZd^ddZedd Zd_ddZee	j
jd	d
d`ddZee	j
jd	d
daddZee	j
jd	d
dbddZee* ee	j
jd	d
dcddZW d   n1 s0    Y  ee	j
jd	d
ddddZee	j
jd	d
deddZee	j
jd	d
dfddZee	j
jd	d
dgddZee	j
jd	d
dhdd Zee	j
jd	d
did!d"Zee	j
jd	d
djd#d$Zee	j
jd	d
dkd%d&Zee	j
jd	d
dld'd(Zee	j
jd	d
dmd)d*Zee	j
jd	d
dnd+d,Zee	j
jd	d
dod-d.Zee	j
jd	d
dpd/d0Zee	j
jd	d
dqd1d2Z ee	j
jd	d
drd3d4Z!ee	j
jd	d
dsd5d6Z"ee	j
jd	d
d7d8 Z#ee	j
jd	d
dtd9d:Z$ee	j
jd	d
dud;d<Z%ee	j
jd	d
dvd>d?Z&ee	j
jd	d
dwd@dAZ'ee	j
jd	d
dxdBdCZ(e(Z
ee	j
jd	d
dydDdEZ)ee	j
jd	d
dzdFdGZ*ee	j
jd	d
d{dHdIZ+ee	j
jd	d
d|dJdKZ,ee	j
jd	d
d}dLdMZ-ee	j
jd	d
d~dNdOZ.ee	j
jd	d
ddPdQZ/ee	j
jd	d
ddRdSZ0ee	j
jd	d
ddTdUZ1ee	j
jd	d
ddVdWZ2ee	j
jd	d
ddXdYZ3ee	j
jd	d
ddZd[Z4ee	j
jd	d
dd\d]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                 C  s&   t j|| _|d u rtjn|| _d S r   )r   r   r   _numpy_stater   _RandomState)r   r   r   r   r   r   r   
  s    zRandomState.__init__c                 C  s   t | jdd }t|S r$   )r   r   r&   r)   r*   )r   r(   r   r   r   r+     s    zRandomState._backendc                 C  s   | j | d S r   )r   r   )r   r   r   r   r   r     s    zRandomState.seedr,   r-   r.   c                 K  s   t | d||f||d|S r/   r4   r6   r   r   r   r0     s    zRandomState.betac                 K  s   t | d||f||d|S r:   r4   r<   r   r   r   r;     s    zRandomState.binomialc                 K  s   t | d|f||d|S r?   r4   rA   r   r   r   r@   "  s    zRandomState.chisquareTc                   s   t |  |d|\ }}}}}tt| }	tt|	| j}
dt|
||  }t|ggdd |D R  } fddt||
|	D }tj	|||d}t
||||dS )	Nr   rC   c                 s  s   | ]}t t|V  qd S r   rD   rG   r   r   r   rI   ;  rJ   z%RandomState.choice.<locals>.<genexpr>c              	     s$   i | ]\}}}|t | |fqS r   )
_choice_rs)rH   rL   stater2   r7   r>   rP   r   r   rR   <  s   z&RandomState.choice.<locals>.<dictcomp>rS   rU   )rW   rX   r   r   rF   r   r   rZ   r   r[   r	   )r   r7   r2   rP   r>   r3   rO   rV   rT   r\   
state_datar^   r_   r`   ra   r   r   r   rb   (  s.    
zRandomState.choicerc   c                 K  s   t | d|f||d|S rd   r4   rf   r   r   r   re   F  s    zRandomState.exponentialc                 K  s   t | d||f||d|S rh   r4   rj   r   r   r   ri   L  s    zRandomState.fc                 K  s   t | d||f||d|S rm   r4   ro   r   r   r   rn   P  s    zRandomState.gammac                 K  s   t | d|f||d|S rq   r4   rs   r   r   r   rr   V  s    zRandomState.geometricrt   c                 K  s   t | d||f||d|S ru   r4   rw   r   r   r   rv   Z  s    zRandomState.gumbelc                 K  s   t | d|||f||d|S ry   r4   r{   r   r   r   rz   `  s    zRandomState.hypergeometricc                 K  s   t | d||f||d|S r   r4   rw   r   r   r   r   m  s    zRandomState.laplacec                 K  s   t | d||f||d|S r   r4   rw   r   r   r   r   s  s    zRandomState.logisticc                 K  s   t | d||f||d|S r   r4   r   r   r   r   r   y  s    zRandomState.lognormalc                 K  s   t | d|f||d|S r   r4   rs   r   r   r   r     s    zRandomState.logseriesc                 K  s&   t | d||f||t|ffd|S r   r   r   r   r   r   r     s    
zRandomState.multinomialc                 K  s   t | d||f||d|S r   r4   r<   r   r   r   r     s    zRandomState.negative_binomialc                 K  s   t | d||f||d|S r   r4   r   r   r   r   r     s    z RandomState.noncentral_chisquarec                 K  s   t | d|||f||d|S r   r4   r   r   r   r   r     s    
zRandomState.noncentral_fc                 K  s   t | d||f||d|S r   r4   rw   r   r   r   r     s    zRandomState.normalc                 K  s   t | d|f||d|S r   r4   r   r   r   r   r     s    zRandomState.paretoc                 C  sH   ddl m} t|tjr$t|dd}tt|}| j	| |||S )Nr   r   r.   r   )
r   r   r   r   r   r   r   rF   r   rQ   r   r   r   r   r     s    zRandomState.permutationc                 K  s   t | d|f||d|S r   r4   r   r   r   r   r     s    zRandomState.poissonc                 K  s   t | d|f||d|S r   r4   r   r   r   r   r     s    zRandomState.powerlc                 K  s   t | d||f|||d|S )Nrandint)r2   r3   r   r4   )r   r   r~   r2   r3   r   r9   r   r   r   r     s    zRandomState.randintc                 K  s   t | d||f||d|S )Nrandom_integersr1   r4   r   r   r   r   r     s    zRandomState.random_integersc                 K  s   t | df||d|S )Nrandom_sampler1   r4   r   r   r   r   r     s    zRandomState.random_samplec                 K  s   t | d|f||d|S r   r4   rf   r   r   r   r     s    zRandomState.rayleighc                 K  s   t | df||d|S r   r4   r   r   r   r   r     s    zRandomState.standard_cauchyc                 K  s   t | df||d|S r   r4   r   r   r   r   r     s    z RandomState.standard_exponentialc                 K  s   t | d|f||d|S r   r4   r   r   r   r   r     s    zRandomState.standard_gammac                 K  s   t | df||d|S r   r4   r   r   r   r   r     s    zRandomState.standard_normalc                 K  s   t | d|f||d|S r   r4   rA   r   r   r   r     s    zRandomState.standard_tc                 K  s   t | df||d|S )Ntomaxintr1   r4   r   r   r   r   r     s    zRandomState.tomaxintc                 K  s   t | d|||f||d|S r   r4   r   r   r   r   r     s    
zRandomState.triangularc                 K  s   t | d||f||d|S r   r4   r   r   r   r   r     s    zRandomState.uniformc                 K  s   t | d||f||d|S r   r4   r   r   r   r   r     s    zRandomState.vonmisesc                 K  s   t | d||f||d|S r   r4   r   r   r   r   r     s    zRandomState.waldc                 K  s   t | d|f||d|S r   r4   r   r   r   r   r     s    zRandomState.weibullc                 K  s   t | d|f||d|S r   r4   r   r   r   r   r     s    zRandomState.zipf)NN)N)Nr.   )Nr.   )Nr.   )NTNr.   )rc   Nr.   )Nr.   )rc   Nr.   )Nr.   )rt   rc   Nr.   )Nr.   )rt   rc   Nr.   )rt   rc   Nr.   )rt   rc   Nr.   )Nr.   )Nr.   )Nr.   )Nr.   )Nr.   )rt   rc   Nr.   )Nr.   )rc   Nr.   )Nr.   )NNr.   r   )NNr.   )Nr.   )rc   Nr.   )Nr.   )Nr.   )Nr.   )Nr.   )Nr.   )Nr.   )Nr.   )rt   rc   Nr.   )Nr.   )Nr.   )Nr.   )Nr.   )6r!   r   r   r   r   r   r+   r   r   r   r   r   r0   r;   r@   
contextlibsuppressAttributeErrorrb   re   ri   rn   rr   rv   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   


*

r   c                 C  s(   t | dd }t|}|j| S r$   )r   r&   r)   r*   r   r   )rM   backend_nameZbackend_libr   r   r   _rng_from_bitgen  s    
r   c                 C  s,   | j }t|  } || _ t| }|j||dS )N)rO   )r   typer   rQ   )r   r   rO   r   r   r   r   r   r     s
    
r   c                   s"    j |} fdd|D }|S )Nc                   s   g | ]}t  |qS r   )r   )rH   r   rM   r   r   
<listcomp>"  rJ   z"_spawn_bitgens.<locals>.<listcomp>)	_seed_seqspawn)rM   Z	n_bitgensZseedsr]   r   r   r   rY      s    rY   c                 C  s:   t |tjjr| |}t|} t| |}||d|i|S )z$Apply random module method with seedr2   )r   r   r   ZSeedSequencer   getattr)rngfuncnamerM   r2   argsr9   funcr   r   r   _apply_random_func&  s
    
r  c                 C  s2   | du rt j} | |}t||}||d|i|S )z"Apply RandomState method with seedNr2   )r   r   r   )r   r   r   r2   r   r9   r   r  r   r   r   _apply_random/  s
    
r  c                 C  s   t | }|j||||||dS )N)r2   rP   r>   rO   rQ   )r   rb   )r   r7   r2   rP   r>   rO   rQ   r   r   r   r   rK   8  s    rK   c                 C  s   t | }|j||||dS )N)r2   rP   r>   )r   r   rb   )r   r7   r2   rP   r>   r   r   r   r   r   =  s    
r   c                 C  s  g }t |trt | trD| jdkr*td| jj jddd d}nFt | t	r|d urd| j
dgn|}	| jj	 jdd|	d}ntd|}
|dk rtdnJt|}||j}|j}|jdkrtd	t|}
|| | d }|d urt |ts6t||d
}tj| dddds,tdt|}n||j}|jdkrVtdt||
krltd|| | d }|d u rd}nt |ttfs|f}|dkrtdt||tjd}|st|d dkrd}t|||||||||fS )Nr   z3`choice` not supported for cupy-backed `Generator`.r,   r   )r2   r>   zUnknown generator classr   za must be greater than 0za must be one dimensional)likegHz>)ZrtolZ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 dimensionalr   z]replace=False is not currently supported for dask.array.choice with multi-chunk output arrays)r   r   r   r(   r   r+   r   r   rb   r   array
ValueErrorr
   rechunkrp   Z_metandimrF   appendZ__dask_keys__r	   r   r   isclosesumtuplerX   r   r   )r   r7   r2   rP   r>   rO   r3   rT   rV   Zdummy_pZlen_aerr_msgr   r   r   rW   B  s`    











rW   r.   r   r   c          %   
   O  s<  |durt |ttfs|f}tdd t|| D }|durJ|| t| }t|||dt	j
d}t|}dd }	i }
i }g }g }t|D ]\}}t |t	jtfr$|	|||}t |tr|| |j||< n,t |t	jrdt| }|||< ||
|< ||td	d
 |jD   q|| qi }| D ]\}}t |t	jtfr|	|||}t |tr|| |j||< n,t |t	jrdt| }|||< ||
|< |tdd
 |jD  ||< n|||< q<tt| }t | tr(t| jt|}t|}dd |D }t}t| j}n8t | trXtt|| j}t|}t}| j}ntdt|||||}| d| }t|ggdd |D dggt|  R  }tdd |D  }g }t ||||D ]\}}}}g } t|D ]n\}}||vr| | nNt |tr(| || f|  n,t |t	jrL| t!|| |f ntdqi }!| D ]h\}"}|"|vr||!|"< nJt |tr||" f| |!|"< n*t |t	jrt!||" |f|!|"< ntdqd||||||| |!f q||||dt| ||}#|
"t#t || t$j%||
|d}$t|$||| |#d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                 S  s"   h | ]}t |ttjfr|jqS r   )r   r	   r   ndarrayrp   )rH   arr   r   r   	<setcomp>  s   z_wrap_func.<locals>.<setcomp>r   r  c                 S  sD   t | trt| ||S t | tjr8tt| |S tdd S )Nz!Unknown object type for broadcast)r   r	   r   r  r   r  Zascontiguousarray	TypeError)r  rp   r3   r   r   r   _broadcast_any  s
    
z"_wrap_func.<locals>._broadcast_anyzarray-c                 s  s   | ]
}d V  qdS r   Nr   rH   _r   r   r   rI     rJ   z_wrap_func.<locals>.<genexpr>c                 s  s   | ]
}d V  qdS r  r   r  r   r   r   rI     rJ   c                 S  s   g | ]
}|j qS r   )r   )rH   Z_bitgenr   r   r   r     rJ   z_wrap_func.<locals>.<listcomp>z:Unknown object type: Not a Generator and Not a RandomState-c                 S  s   g | ]}t t|qS r   rD   rG   r   r   r   r     rJ   r   c                 S  s   g | ]}t t|qS r   rD   rG   r   r   r   r     rJ   zUnknown object type in argszUnknown object type in kwargs)r   rS   rU   )&r   r  rX   r   valuesr
  r   r   getr   r   r   	enumerater  r	   r^   r   rp   itemsr   r   rY   r   rF   r  r   r   r   r   r  r   r  rZ   r   updatedictr   r[   )%r   r   r2   r3   r   r   r9   ZshapesZslicesr  r`   lookupZ
small_argsrT   ir  resr^   Zsmall_kwargskeyr\   r]   Zbitgen_tokenZfunc_appliergentokenr_   blocksvalsrM   ZslcblockargZkwrgrL   rV   ra   r   r   r   r5     s    



 




	r5   zdict[str, RandomState]_cached_statesc                   s,    fdd}t t j|_t t j|_|S )Nc               	     sl   t j}t> zt| }W n  ty8   t  t|< }Y n0 W d    n1 sN0    Y  t| | i |S r   )r   backend_cached_states_lockr(  KeyErrorr   r   )r   r9   r!  r   attrr   r   wrapper  s    2z_make_api.<locals>.wrapper)r   r   r!   r   )r-  r.  r   r,  r   	_make_api  s    	r/  r   r0   r;   r@   rb   re   ri   rn   rr   rv   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )N)r   )\
__future__r   r   r)   r   	itertoolsr   r   r   operatorr   	threadingr   numpyr   Zdask.array.backendsr   Zdask.array.corer	   r
   r   r   r   r   Zdask.array.creationr   Zdask.array.utilsr   Z	dask.baser   Zdask.highlevelgraphr   Z
dask.utilsr   r   r   r   r   r   r   r   rY   r  r  rK   r   rW   r5   r(  __annotations__r*  r/  r   r0   r;   r@   rb   re   ri   rn   rr   rv   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s      p
_  (
		G 