U
    /eKO                     @   s  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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mZ G dd dZdd Zdd Zi Zdd Z e dZ!e dZ"e dZ#e dZ$e%e dre 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.e d Z/e d!Z0e d"Z1e d#Z2e d$Z3e d%Z4e d&Z5e d'Z6e d(Z7e d)Z8e d*Z9e d+Z:e d,Z;e;Z<e d-Z=e d.Z>e d/Z?e d0Z@e d1ZAe d2ZBe d3ZCe d4ZDe d5ZEe d6ZFe d7ZGe d8ZHe d9ZIdS ):    N)chainproduct)Integral)getitem)array_creation_dispatch)Arrayasarraybroadcast_shapesbroadcast_tonormalize_chunksslices_from_chunks)arange)tokenize)HighLevelGraph)derived_fromrandom_state_datac                	   @   sD  e Zd ZdZd`ddZdaddZdddd	d
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  eej	j
dddeddZW 5 Q R X 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-d.Zeej	j
dddqd/d0Zeej	j
dddrd1d2Zeej	j
dddsd3d4Zeej	j
dddtd5d6Z eej	j
dddud7d8Z!eej	j
ddd9d: Z"eej	j
dddvd;d<Z#eej	j
dddwd=d>Z$eej	j
dddxd@dAZ%eej	j
dddydBdCZ&eej	j
dddzdDdEZ'e'Z	eej	j
ddd{dFdG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ddPdQZ-eej	j
ddddRdSZ.eej	j
ddddTdUZ/eej	j
ddddVdWZ0eej	j
ddddXdYZ1eej	j
ddddZd[Z2eej	j
dddd\d]Z3eej	j
dddd^d_Z4dS )RandomStatea8  
    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
        ``randomgen.RandomState``, ``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 kr tj| _n|| _d S N)nprandomr   _numpy_stater   _RandomState)selfseedr    r   5/tmp/pip-unpacked-wheel-dbjnr7gq/dask/array/random.py__init__9   s    
zRandomState.__init__c                 C   s   | j | d S r   )r   r   )r   r   r   r   r   r   @   s    zRandomState.seedautor   sizechunksextra_chunksc          "   
   O   s  |dk	rt |ttfs|f}tdd t|| D }|dk	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|| j}t|||||}| d| }t|gfdd |D dggt|   }tdd |D  }g }t||||D ]\}}}}g }t|D ]V\}}||kr|| n6t |tr||| f|  n|t|| |f qzi }| D ]P\}}||kr|||< n2t |tr|| f| ||< nt|| |f||< q|t| j|||||f qbt| j||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   )
isinstancer   r   ndarrayshape).0arr   r   r   	<setcomp>N   s   z$RandomState._wrap.<locals>.<setcomp>dtyper(   c                 S   s<   t | trt| ||S t | tjr8tt| |S d S r   )r"   r   r
   rechunkr   r#   Zascontiguousarray)r&   r$   r    r   r   r   _broadcast_any_   s    
z)RandomState._wrap.<locals>._broadcast_anyzarray-c                 s   s   | ]
}d V  qdS r   Nr   r%   _r   r   r   	<genexpr>u   s     z$RandomState._wrap.<locals>.<genexpr>c                 s   s   | ]
}d V  qdS r,   r   r-   r   r   r   r/      s     -c                 S   s   g | ]}t t|qS r   rangelenr%   Zbdr   r   r   
<listcomp>   s     z%RandomState._wrap.<locals>.<listcomp>r   c                 S   s   g | ]}t t|qS r   r1   r4   r   r   r   r5      s     )r   dependencies)meta)r"   tuplelistr   valuesappendr	   r   getr   float64r   	enumerater#   r   namer   r$   itemsr   r   r3   r   zipr   _apply_randomr   updatedictr   from_collections)"r   funcnamer   r    r!   argskwargsZshapesZslicesr+   dsklookupZ
small_argsr7   ir&   resr@   Zsmall_kwargskeysizesZseedstokenkeysblocksvalsr   ZslcblockargZkwrgkr8   graphr   r   r   _wrapC   s    


 




	zRandomState._wrap   )Z
skipblocksc                 K   s   | j d||f||d|S )Nbetar   r    rX   )r   abr   r    rI   r   r   r   rZ      s    zRandomState.betac                 K   s   | j d||f||d|S )Nbinomialr[   r\   r   npr   r    rI   r   r   r   r_      s    zRandomState.binomialc                 K   s   | j d|f||d|S )N	chisquarer[   r\   r   dfr   r    rI   r   r   r   rc      s    zRandomState.chisquareTc                    s  g }t  trPd k	r"tdgn}tjjdd|dj} }	 dk rtdnJt   	 j
  j} jdkr|tdt }	|    d  d k	r*t tsttj ddddstd	tn	j
jdkrtd
t|	krtd|  d |d kr:d}nt |ttfsP|f}t||tjd}st|d dkrd}
t|
tt| }tt|| j}dt|||  }t|gfdd |D  } fddt|||D }tj|||d}t||||dS )NrY   r   )r   rb   r   za must be greater than 0za must be one dimensionalgHz>)ZrtolZatolzprobabilities do not sum to 1zp must be one dimensionalza and p must have the same sizer)   z]replace=False is not currently supported for dask.array.choice with multi-chunk output arrayszda.random.choice-%sc                 s   s   | ]}t t|V  qd S r   r1   r4   r   r   r   r/     s     z%RandomState.choice.<locals>.<genexpr>c              	      s$   i | ]\}}}|t | |fqS r   )_choice)r%   rV   stater   r]   rb   replacer   r   
<dictcomp>  s    z&RandomState.choice.<locals>.<dictcomp>r6   )r"   r   r   arrayr   choicer(   
ValueErrorr   r*   r$   ndimr3   r<   Z__dask_keys__r   isclosesumr9   r:   r   r>   NotImplementedErrorr   r   r   r   rB   r   rF   )r   r]   r   ri   rb   r    r7   Zdummy_pr(   Zlen_aerr_msgrO   
state_datar@   rQ   rJ   rW   r   rh   r   rl      sr    










     
  zRandomState.choice      ?c                 K   s   | j d|f||d|S )Nexponentialr[   r\   r   scaler   r    rI   r   r   r   ru     s    zRandomState.exponentialc                 K   s   | j d||f||d|S )Nfr[   r\   )r   dfnumdfdenr   r    rI   r   r   r   rx     s    zRandomState.fc                 K   s   | j d||f||d|S )Ngammar[   r\   )r   r$   rw   r   r    rI   r   r   r   r{     s    zRandomState.gammac                 K   s   | j d|f||d|S )N	geometricr[   r\   r   rb   r   r    rI   r   r   r   r|     s    zRandomState.geometric        c                 K   s   | j d||f||d|S )Ngumbelr[   r\   r   locrw   r   r    rI   r   r   r   r   !  s    zRandomState.gumbelc                 K   s   | j d|||f||d|S )Nhypergeometricr[   r\   )r   ZngoodZnbadZnsampler   r    rI   r   r   r   r   %  s        zRandomState.hypergeometricc                 K   s   | j d||f||d|S )Nlaplacer[   r\   r   r   r   r   r   +  s    zRandomState.laplacec                 K   s   | j d||f||d|S )Nlogisticr[   r\   r   r   r   r   r   /  s    zRandomState.logisticc                 K   s   | j d||f||d|S )N	lognormalr[   r\   )r   meansigmar   r    rI   r   r   r   r   3  s    zRandomState.lognormalc                 K   s   | j d|f||d|S )N	logseriesr[   r\   r}   r   r   r   r   7  s    zRandomState.logseriesc                 K   s   | j d||||t|ffdS )Nmultinomialr   )rX   r3   )r   ra   Zpvalsr   r    rI   r   r   r   r   ;  s    
zRandomState.multinomialc                 K   s   | j d||f||d|S )Nnegative_binomialr[   r\   r`   r   r   r   r   F  s    zRandomState.negative_binomialc                 K   s   | j d||f||d|S )Nnoncentral_chisquarer[   r\   )r   re   noncr   r    rI   r   r   r   r   J  s       z RandomState.noncentral_chisquarec                 K   s   | j d|||f||d|S )Nnoncentral_fr[   r\   )r   ry   rz   r   r   r    rI   r   r   r   r   P  s        zRandomState.noncentral_fc                 K   s   | j d||f||d|S )Nnormalr[   r\   r   r   r   r   r   V  s    zRandomState.normalc                 K   s   | j d|f||d|S )Nparetor[   r\   r   r]   r   r    rI   r   r   r   r   Z  s    zRandomState.paretoc                 C   sH   ddl m} t|tjr$t|dd}tt|}| j	| |||S )Nr   )shuffle_slicer   )r    )
Zdask.array.slicingr   r"   numbersNumberr   r   r3   r   shuffle)r   xr   indexr   r   r   permutation^  s    zRandomState.permutationc                 K   s   | j d|f||d|S )Npoissonr[   r\   )r   Zlamr   r    rI   r   r   r   r   i  s    zRandomState.poissonc                 K   s   | j d|f||d|S )Npowerr[   r\   r   r   r   r   r   m  s    zRandomState.powerlc                 K   s   | j d||f|||d|S )Nrandint)r   r    r(   r\   )r   lowhighr   r    r(   rI   r   r   r   r   q  s        zRandomState.randintc                 K   s   | j d||f||d|S )Nrandom_integersr[   r\   r   r   r   r   r    rI   r   r   r   r   w  s       zRandomState.random_integersc                 K   s   | j d||d|S )Nrandom_sampler[   )r   r\   r   r   r    rI   r   r   r   r   }  s    zRandomState.random_samplec                 K   s   | j d|f||d|S )Nrayleighr[   r\   rv   r   r   r   r     s    zRandomState.rayleighc                 K   s   | j d||d|S )Nstandard_cauchyr[   )r   r\   r   r   r   r   r     s    zRandomState.standard_cauchyc                 K   s   | j d||d|S )Nstandard_exponentialr[   )r   r\   r   r   r   r   r     s    z RandomState.standard_exponentialc                 K   s   | j d|f||d|S )Nstandard_gammar[   r\   )r   r$   r   r    rI   r   r   r   r     s    zRandomState.standard_gammac                 K   s   | j d||d|S )Nstandard_normalr[   )r   r\   r   r   r   r   r     s    zRandomState.standard_normalc                 K   s   | j d|f||d|S )N
standard_tr[   r\   rd   r   r   r   r     s    zRandomState.standard_tc                 K   s   | j d||d|S )Ntomaxintr[   )r   r\   r   r   r   r   r     s    zRandomState.tomaxintc                 K   s   | j d|||f||d|S )N
triangularr[   r\   )r   leftmoderightr   r    rI   r   r   r   r     s        zRandomState.triangularc                 K   s   | j d||f||d|S )Nuniformr[   r\   r   r   r   r   r     s    zRandomState.uniformc                 K   s   | j d||f||d|S )Nvonmisesr[   r\   )r   mukappar   r    rI   r   r   r   r     s    zRandomState.vonmisesc                 K   s   | j d||f||d|S )Nwaldr[   r\   )r   r   rw   r   r    rI   r   r   r   r     s    zRandomState.waldc                 K   s   | j d|f||d|S )Nweibullr[   r\   r   r   r   r   r     s    zRandomState.weibullc                 K   s   | j d|f||d|S )Nzipfr[   r\   r   r   r   r   r     s    zRandomState.zipf)NN)N)Nr   )Nr   )Nr   )NTNr   )rt   Nr   )Nr   )rt   Nr   )Nr   )r~   rt   Nr   )Nr   )r~   rt   Nr   )r~   rt   Nr   )r~   rt   Nr   )Nr   )Nr   )Nr   )Nr   )Nr   )r~   rt   Nr   )Nr   )rt   Nr   )Nr   )NNr   r   )NNr   )Nr   )rt   Nr   )Nr   )Nr   )Nr   )Nr   )Nr   )Nr   )Nr   )r~   rt   Nr   )Nr   )Nr   )Nr   )Nr   )5__name__
__module____qualname____doc__r   r   rX   r   r   r   r   rZ   r_   rc   
contextlibsuppressAttributeErrorrl   ru   rx   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   r   r   r   r      s    

  uJ


r   c                 C   s   t j| }|j||||dS )N)r   ri   rb   )r   r   r   rl   )rs   r]   r   ri   rb   rg   r   r   r   rf     s    rf   c                 C   s4   | dkrt jj} | |}t||}||d|i|S )z"Apply RandomState method with seedNr   )r   r   r   getattr)r   rG   rs   r   rH   rI   rg   funcr   r   r   rC     s
    
rC   c                    s,    fdd}t t j|_t t j|_|S )Nc                     s,   t j}|tkrt t|< tt|  | |S r   )r   backend_cached_random_statesr   r   )rH   rI   r   attrr   r   wrapper  s    
 z_make_api.<locals>.wrapper)r   r   r   r   )r   r   r   r   r   	_make_api  s    
r   r   rZ   r_   rc   rl   ru   rx   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   )Jr   r   	itertoolsr   r   r   operatorr   Znumpyr   Zdask.array.backendsr   Zdask.array.corer   r   r	   r
   r   r   Zdask.array.creationr   Z	dask.baser   Zdask.highlevelgraphr   Z
dask.utilsr   r   r   rf   rC   r   r   r   rZ   r_   rc   hasattrrl   ru   rx   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   r   r   r   <module>   sx       %	