B
    T\bG                 @   s  d dl mZ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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mZmZ dd ZG dd deZdd Zdd Ze Z e j!Z!e j"Z"e j#Z#e j$Z$e%e dre j&Z&e j'Z'e j(Z(e j)Z)e j*Z*e j+Z+e j,Z,e j-Z-e j.Z.e j/Z/e j0Z0e j1Z1e j2Z2e j3Z3e j4Z4e j5Z5e j6Z6e j7Z7e j8Z8e j9Z9e j:Z:e:Z;e j<Z<e j=Z=e j>Z>e j?Z?e j@Z@e jAZAe jBZBe jCZCe jDZDe jEZEe jFZFe jGZGe jHZHdS )    )absolute_importdivisionprint_function)product)Integral)getitemN   )normalize_chunksArrayslices_from_chunksasarraybroadcast_shapesbroadcast_to   )tokenize)HighLevelGraph)ignoringrandom_state_dataskip_doctestc                s    fdd}|S )z- Copy docstring from one function to another c                s    j d k	rt j | _ | S )N)__doc__r   )Zfunc2)func 0lib/python3.7/site-packages/dask/array/random.py_   s    
zdoc_wraps.<locals>._r   )r   r   r   )r   r   	doc_wraps   s    r   c            	   @   s  e Zd ZdZdYddZdZddZdd Zeej	j
jd[d
dZeej	j
jd\ddZeej	j
jd]ddZee eej	j
jd^ddZW dQ R X eej	j
jd_ddZeej	j
jd`ddZeej	j
jdaddZeej	j
jdbddZeej	j
jdcddZeej	j
jdddd Zeej	j
jded!d"Zeej	j
jdfd#d$Zeej	j
jdgd%d&Zeej	j
jdhd'd(Zeej	j
jdid)d*Zeej	j
jdjd+d,Zeej	j
jdkd-d.Zeej	j
jdld/d0Zeej	j
jdmd1d2Zeej	j
j dnd3d4Z eej	j
j!dod5d6Z!eej	j
j"dpd7d8Z"eej	j
j#dqd9d:Z#eej	j
j$drd;d<Z$eej	j
j%dsd=d>Z%e%Z	eej	j
j&dtd?d@Z&eej	j
j'dudAdBZ'eej	j
j(dvdCdDZ(eej	j
j)dwdEdFZ)eej	j
j*dxdGdHZ*eej	j
j+dydIdJZ+eej	j
j,dzdKdLZ,eej	j
j-d{dMdNZ-eej	j
j.d|dOdPZ.eej	j
j/d}dQdRZ/eej	j
j0d~dSdTZ0eej	j
j1ddUdVZ1eej	j
j2ddWdXZ2d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 S )N)nprandomr   _numpy_state_RandomState)selfseedr   r   r   r   __init__9   s    zRandomState.__init__c             C   s   | j | d S )N)r   r!   )r    r!   r   r   r   r!   =   s    zRandomState.seedc       %   
   O   s(  | dd}| dd}| dd}|dk	r@t|ttfs@|f}dd |D }|d	d | D  t|}|dk	r||g7 }t| }t|||d
t	j
d}t|}	dd }
i }g }i }g }g }xt|D ]\}}t|t	jtfrn|
|||}t|tr"|| ||j |j||< n,t|t	jrNdt|}|||< |||< ||tdd |jD   q|| qW i }x| D ]\}}t|t	jtfr(|
|||}t|tr|| ||j |j||< n,t|t	jr
dt|}|||< |||< |tdd |jD  ||< n|||< qW d|d< tt	j |}|||j}tt| }tt|| j}t|||||}d||}t|gfdd |D dggt|   }tdd |D  }g }xt|||	|D ]\}}}} g }!xlt|D ]`\}}||kr|!| n@t|trJ|| |!|| f|   n|!t|| |f q W i }"xf| D ]Z\}#}|#|kr||"|#< n<t|tr|| ||# f|  |"|#< nt||# |f|"|#< qrW |t | j!||||!|"f qW |"t#t|| t$j%|||d}$t|$||| |dS )z Wrap numpy random function to produce dask.array random function

        extra_chunks should be a chunks tuple to append to the end of chunks
        sizeNchunksautoextra_chunksr   c             S   s"   h | ]}t |ttjfr|jqS r   )
isinstancer
   r   ndarrayshape).0arr   r   r   	<setcomp>L   s    z$RandomState._wrap.<locals>.<setcomp>c             S   s"   h | ]}t |ttjfr|jqS r   )r'   r
   r   r(   r)   )r*   r+   r   r   r   r,   N   s    dtype)r-   c             S   s<   t | trt| ||S t | tjr8tt| |S d S )N)r'   r
   r   rechunkr   r(   Zascontiguousarray)r+   r)   r$   r   r   r   _broadcast_anyZ   s    
z)RandomState._wrap.<locals>._broadcast_anyzarray-{}c             s   s   | ]
}d V  qdS )r   Nr   )r*   r   r   r   r   	<genexpr>r   s    z$RandomState._wrap.<locals>.<genexpr>c             s   s   | ]
}d V  qdS )r   Nr   )r*   r   r   r   r   r0      s    )r   z{0}-{1}c             S   s   g | ]}t t|qS r   )rangelen)r*   bdr   r   r   
<listcomp>   s    z%RandomState._wrap.<locals>.<listcomp>r   c             S   s   g | ]}t t|qS r   )r1   r2   )r*   r3   r   r   r   r4      s    )dependencies)&popr'   tuplelistunionvaluesr   r	   getr   float64r   	enumerater(   r
   appendZdasknameformatr   r)   itemsgetattrr   r   r-   r   r   r2   r   zipr   _apply_randomr   updatedictr   from_collections)%r    funcnameargskwargsr#   r$   r&   Zargs_shapesZshapesZslicesr/   dskZdskslookupZ
small_argsr5   ir+   Zresr?   Zsmall_kwargskeyr   r-   sizesZseedstokenkeysZblocksZvalsr!   ZslcblockargZkwrgkgraphr   r   r   _wrap@   s    

 
 




 zRandomState._wrapr%   c             C   s   | j d||||dS )Nbeta)r#   r$   )rV   )r    abr#   r$   r   r   r   rW      s    zRandomState.betac             C   s   | j d||||dS )Nbinomial)r#   r$   )rV   )r    npr#   r$   r   r   r   rZ      s    zRandomState.binomialc             C   s   | j d|||dS )N	chisquare)r#   r$   )rV   )r    dfr#   r$   r   r   r   r]      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nFt 	 j
  j} jdkrxt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r6d}nt |ttfsL|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 )Nr   r   )r#   r\   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 size)r-   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 )N)r1   r2   )r*   r3   r   r   r   r0      s    z%RandomState.choice.<locals>.<genexpr>c                s$   i | ]\}}}t | |f|qS r   )_choice)r*   rT   stater#   )rX   r\   replacer   r   
<dictcomp>   s   z&RandomState.choice.<locals>.<dictcomp>)r5   )r'   r   r   Zarrayr   choicer-   
ValueErrorr   r.   r)   ndimr2   r>   Z__dask_keys__r
   Zisclosesumr7   r8   r	   r<   NotImplementedErrorr   r   r   r   rC   r   rG   )r    rX   r#   ra   r\   r$   r5   Zdummy_pr-   Zlen_aZerr_msgrO   
state_datar?   rQ   rK   rU   r   )rX   r\   ra   r   rc      sX    











zRandomState.choice      ?c             C   s   | j d|||dS )Nexponential)r#   r$   )rV   )r    scaler#   r$   r   r   r   rj     s    zRandomState.exponentialc             C   s   | j d||||dS )Nf)r#   r$   )rV   )r    dfnumdfdenr#   r$   r   r   r   rl     s    zRandomState.fc             C   s   | j d||||dS )Ngamma)r#   r$   )rV   )r    r)   rk   r#   r$   r   r   r   ro     s    zRandomState.gammac             C   s   | j d|||dS )N	geometric)r#   r$   )rV   )r    r\   r#   r$   r   r   r   rp     s    zRandomState.geometric        c             C   s   | j d||||dS )Ngumbel)r#   r$   )rV   )r    locrk   r#   r$   r   r   r   rr     s    zRandomState.gumbelc             C   s   | j d|||||dS )Nhypergeometric)r#   r$   )rV   )r    ZngoodZnbadZnsampler#   r$   r   r   r   rt     s    zRandomState.hypergeometricc             C   s   | j d||||dS )Nlaplace)r#   r$   )rV   )r    rs   rk   r#   r$   r   r   r   ru     s    zRandomState.laplacec             C   s   | j d||||dS )Nlogistic)r#   r$   )rV   )r    rs   rk   r#   r$   r   r   r   rv      s    zRandomState.logisticc             C   s   | j d||||dS )N	lognormal)r#   r$   )rV   )r    meanZsigmar#   r$   r   r   r   rw   $  s    zRandomState.lognormalc             C   s   | j d|||dS )N	logseries)r#   r$   )rV   )r    r\   r#   r$   r   r   r   ry   (  s    zRandomState.logseriesc             C   s   | j d||||t|ffdS )Nmultinomial)r#   r$   r&   )rV   r2   )r    r[   Zpvalsr#   r$   r   r   r   rz   ,  s    zRandomState.multinomialc             C   s   | j d||||dS )Nnegative_binomial)r#   r$   )rV   )r    r[   r\   r#   r$   r   r   r   r{   1  s    zRandomState.negative_binomialc             C   s   | j d||||dS )Nnoncentral_chisquare)r#   r$   )rV   )r    r^   noncr#   r$   r   r   r   r|   5  s    z RandomState.noncentral_chisquarec             C   s   | j d|||||dS )Nnoncentral_f)r#   r$   )rV   )r    rm   rn   r}   r#   r$   r   r   r   r~   9  s    zRandomState.noncentral_fc             C   s   | j d||||dS )Nnormal)r#   r$   )rV   )r    rs   rk   r#   r$   r   r   r   r   =  s    zRandomState.normalc             C   s   | j d|||dS )Npareto)r#   r$   )rV   )r    rX   r#   r$   r   r   r   r   A  s    zRandomState.paretoc             C   s   | j d|||dS )Npoisson)r#   r$   )rV   )r    Zlamr#   r$   r   r   r   r   E  s    zRandomState.poissonc             C   s   | j d|||dS )Npower)r#   r$   )rV   )r    rX   r#   r$   r   r   r   r   I  s    zRandomState.powerc             C   s   | j d||||dS )Nrandint)r#   r$   )rV   )r    lowhighr#   r$   r   r   r   r   M  s    zRandomState.randintc             C   s   | j d||||dS )Nrandom_integers)r#   r$   )rV   )r    r   r   r#   r$   r   r   r   r   Q  s    zRandomState.random_integersc             C   s   | j d||dS )Nrandom_sample)r#   r$   )rV   )r    r#   r$   r   r   r   r   U  s    zRandomState.random_samplec             C   s   | j d|||dS )Nrayleigh)r#   r$   )rV   )r    rk   r#   r$   r   r   r   r   [  s    zRandomState.rayleighc             C   s   | j d||dS )Nstandard_cauchy)r#   r$   )rV   )r    r#   r$   r   r   r   r   _  s    zRandomState.standard_cauchyc             C   s   | j d||dS )Nstandard_exponential)r#   r$   )rV   )r    r#   r$   r   r   r   r   c  s    z RandomState.standard_exponentialc             C   s   | j d|||dS )Nstandard_gamma)r#   r$   )rV   )r    r)   r#   r$   r   r   r   r   g  s    zRandomState.standard_gammac             C   s   | j d||dS )Nstandard_normal)r#   r$   )rV   )r    r#   r$   r   r   r   r   k  s    zRandomState.standard_normalc             C   s   | j d|||dS )N
standard_t)r#   r$   )rV   )r    r^   r#   r$   r   r   r   r   o  s    zRandomState.standard_tc             C   s   | j d||dS )Ntomaxint)r#   r$   )rV   )r    r#   r$   r   r   r   r   s  s    zRandomState.tomaxintc             C   s   | j d|||||dS )N
triangular)r#   r$   )rV   )r    leftmoderightr#   r$   r   r   r   r   w  s    zRandomState.triangularc             C   s   | j d||||dS )Nuniform)r#   r$   )rV   )r    r   r   r#   r$   r   r   r   r   {  s    zRandomState.uniformc             C   s   | j d||||dS )Nvonmises)r#   r$   )rV   )r    ZmuZkappar#   r$   r   r   r   r     s    zRandomState.vonmisesc             C   s   | j d||||dS )Nwald)r#   r$   )rV   )r    rx   rk   r#   r$   r   r   r   r     s    zRandomState.waldc             C   s   | j d|||dS )Nweibull)r#   r$   )rV   )r    rX   r#   r$   r   r   r   r     s    zRandomState.weibullc             C   s   | j d|||dS )Nzipf)r#   r$   )rV   )r    rX   r#   r$   r   r   r   r     s    zRandomState.zipf)NN)N)Nr%   )Nr%   )Nr%   )NTNr%   )ri   Nr%   )Nr%   )ri   Nr%   )Nr%   )rq   ri   Nr%   )Nr%   )rq   ri   Nr%   )rq   ri   Nr%   )rq   ri   Nr%   )Nr%   )Nr%   )Nr%   )Nr%   )Nr%   )rq   ri   Nr%   )Nr%   )ri   Nr%   )Nr%   )NNr%   )NNr%   )Nr%   )ri   Nr%   )Nr%   )Nr%   )Nr%   )Nr%   )Nr%   )Nr%   )Nr%   )rq   ri   Nr%   )Nr%   )Nr%   )Nr%   )Nr%   )3__name__
__module____qualname__r   r"   r!   rV   r   r   r   r   rW   rZ   r]   r   AttributeErrorrc   rj   rl   ro   rp   rr   rt   ru   rv   rw   ry   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      s   

s
Br   c             C   s   t j| }|j||||dS )N)r#   ra   r\   )r   r   r   rc   )rh   rX   r#   ra   r\   r`   r   r   r   r_     s    r_   c             C   s4   | dkrt jj} | |}t||}||d|i|S )z"Apply RandomState method with seedNr#   )r   r   r   rB   )r   rH   rh   r#   rI   rJ   r`   r   r   r   r   rD     s
    
rD   rc   )IZ
__future__r   r   r   	itertoolsr   Znumbersr   operatorr   Znumpyr   Zcorer	   r
   r   r   r   r   baser   Zhighlevelgraphr   Zutilsr   r   r   r   objectr   r_   rD   Z_stater!   rW   rZ   r]   hasattrrc   rj   rl   ro   rp   rr   rt   ru   rv   rw   ry   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   <module>   sn    	  y	
