B
    T\(                 @   s  d dl mZmZmZ d dlmZ d dlmZmZ d dl	Z
d dlmZ ddlmZmZmZmZmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZmZ dd Zed#ddZd$ddZG dd deZ ee
j!dd Z!G dd deZ"e"e
j#Z#e"e
j$Z$e"e
j%Z%e"e
j&Z&e"e
j'Z'e"e
j(Z(e"e
j)Z)e"e
j*Z*e"e
j+Z+e"e
j,Z,ye"e
j-Z-W n e.k
rr   Y nX e"e
j/Z/e"e
j0Z0e"e
j1 Z2Z1e"e
j3Z3e"e
j4Z4e"e
j5Z5e"e
j6Z6e"e
j7Z7e"e
j8Z8e"e
j9Z9e"e
j:Z:e"e
j;Z;e"e
j<Z<e"e
j=Z=e"e
j>Z>e"e
j?Z?e"e
j@Z@e"e
jAZAe"e
jBZBe"e
jCZCe"e
jDZDe"e
jEZEe"e
jFZFe"e
jGZGe"e
jHZHe"e
jIZIe"e
jJZJe"e
jKZKe"e
jLZLe"e
jMZMe"e
jNZNe"e
jOZOe"e
jPZPe"e
jQZQe"e
jRZRe"e
jSZSe"e
jTZTe"e
jUZUe"e
jVZVe"e
jWZWe"e
jXZXe"e
jYZYe"e
jZZZe"e
j[Z[e"e
j\Z\e"e
j]Z]e"e
j^Z^e"e
j_Z_e_Z`e"e
jaZae"e
jbZbe"e
jcZce"e
jdZde"e
jeZee"e
jfZfe"e
jgZge"e
jhZhe"e
jiZie"e
jjZje"e
jkZke"e
jlZle"e
jmZme"e
jnZne"e
joZoe"e
jpZpe"e
jqZqe"e
jrZree
jsZsee
jtddZtee
juddZuee
jvddZvee
jwddZwee
jxddZxee
jyddZyee
jzddZzee
j{ddZ{ee
j|ddZ|ee
j}ddZ}ee
j~dd%ddZ~ee
jddd  Zee
jdd!d" ZdS )&    )absolute_importdivisionprint_function)getitem)partialwrapsN)curry   )Arrayelemwise	blockwiseapply_infer_dtypeasarray   )is_dask_collectionnormalize_function)core)HighLevelGraph)skip_doctestfuncnamec             O   s   | | |f||S )N)__array_wrap__)numpy_ufuncxargskwargs r   /lib/python3.7/site-packages/dask/array/ufunc.pyr      s    r   c             C   s   t |j| _| S )N)r   __doc__)targetsourcer   r   r   copy_docstring   s    r    Fc                s&    fdd}j |_ tj|_|S )z( Wrap up numpy function into dask.array c                 s\   dd | D }t |dkrN r6|d jtf| |S |d jf| |S n
| |S d S )Nc             S   s   g | ]}t |d r|qS )	_elemwise)hasattr).0argr   r   r   
<listcomp>   s    z2wrap_elemwise.<locals>.wrapped.<locals>.<listcomp>r   )lenr!   r   )r   r   dsk)
array_wrapr   r   r   wrapped   s    
zwrap_elemwise.<locals>.wrapped)__name__r   r   )r   r(   r)   r   )r(   r   r   wrap_elemwise   s    r+   c               @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )da_frompyfuncz"A serializable `frompyfunc` objectc             C   s<   t |||| _|| _|| _|| _t|| _d| j | _d S )Nzfrompyfunc-%s)	np
frompyfunc_ufunc_funcninnoutr   _namer*   )selffuncr1   r2   r   r   r   __init__0   s    
zda_frompyfunc.__init__c             C   s   d| j | j| jf S )Nzda.frompyfunc<%s, %d, %d>)r3   r1   r2   )r4   r   r   r   __repr__8   s    zda_frompyfunc.__repr__c             C   s   t | j| j| jfS )N)r   r0   r1   r2   )r4   r   r   r   __dask_tokenize__;   s    zda_frompyfunc.__dask_tokenize__c             C   s   t | j| j| jffS )N)r,   r0   r1   r2   )r4   r   r   r   
__reduce__>   s    zda_frompyfunc.__reduce__c             O   s   | j ||S )N)r/   )r4   r   r   r   r   r   __call__A   s    zda_frompyfunc.__call__c             C   s0   | dst| j|S tdt| j|f d S )N_z%r object has no attribute %r)
startswithgetattrr/   AttributeErrortyper*   )r4   ar   r   r   __getattr__D   s    
zda_frompyfunc.__getattr__c             C   s4   t tt| }|| j |t| j t|S )N)setdirr?   update__dict__r/   list)r4   or   r   r   __dir__J   s    zda_frompyfunc.__dir__N)r*   
__module____qualname__r   r6   r7   r8   r9   r:   rA   rH   r   r   r   r   r,   .   s   r,   c             C   s    |dkrt dtt| ||S )Nr	   z$frompyfunc with more than one output)NotImplementedErrorufuncr,   )r5   r1   r2   r   r   r   r.   Q   s    r.   c               @   s\   e Zd ZdddddddhZdd	 Zd
d Zdd Zdd Zdd Ze	e
jjddd ZdS )rL   r1   nargsr2   ZntypesZidentityZ	signaturetypesc             C   s>   t |tjtfs"tdt|j || _|j| _t| | d S )Nz:must be an instance of `ufunc` or `da_frompyfunc`, got `%s)	
isinstancer-   rL   r,   	TypeErrorr?   r*   r/   r    )r4   rL   r   r   r   r6   \   s    zufunc.__init__c             C   s0   || j krt| j|S tdt| j|f d S )Nz%r object has no attribute %r)_forward_attrsr=   r/   r>   r?   r*   )r4   keyr   r   r   rA   d   s    
zufunc.__getattr__c             C   s   t | jtt| | jS )N)rF   rQ   unionrC   r?   rE   )r4   r   r   r   rH   j   s    zufunc.__dir__c             C   s
   t | jS )N)reprr/   )r4   r   r   r   r7   m   s    zufunc.__repr__c             O   sp   dd |D }t |dkr`x4|D ],}|j| jf||}t|ttkr |S q W td| j n| j||S d S )Nc             S   s   g | ]}t |d r|qS )r!   )r"   )r#   r$   r   r   r   r%   q   s    z"ufunc.__call__.<locals>.<listcomp>r   z.Parameters of such types are not supported by )r&   r!   r/   r?   NotImplementedrP   r*   )r4   r   r   Zdsksr'   resultr   r   r   r:   p   s    
zufunc.__call__)r   c             K   s  | j dkrtdd|kr"tdt|}t|}|sL|sL| jj||f|S |rZt|trh|rpt|tsptdt|}t|}|j	|j	 }t
t|}|d |j	 }||j	d  }	t| jj||g|ddd}
d	|krt| jj|d	d
}n| jj}t||||||	f|
| jd d|S )Nr   z1outer product only supported for binary functionsoutz`out` kwarg not supportedzGDask objects besides `dask.array.Array` are not supported at this time.zufunc.outerF)Zsuggest_dtypedtype)rX   z.outer)rX   token)r1   
ValueErrorr   r/   outerrO   r
   rK   r   ndimtupleranger   r   popr   r*   )r4   ABr   Z	A_is_daskZ	B_is_daskr\   Zout_indsZA_indsZB_indsrX   r5   r   r   r   r[   |   s<    

zufunc.outerN)r*   rI   rJ   rQ   r6   rA   rH   r7   r:   r    r-   rL   r[   r   r   r   r   rL   X   s   
rL   T)r(   )r   c             C   s2   t |}t| dr$| ttj| |S tj| |dS )Nr!   )deg)boolr"   r!   r   r-   angle)r   rb   r   r   r   rd     s    
rd   c                s   t tj| td}d|j  d|j  fddt| D }fddt| D }tjd| j	d}t|\}}|j	}|j	}t
j ||gd}	t|	 |j|d	}
t
j||gd}	t|	|j|d	}|
|fS )
N)rX   z	mantissa-z	exponent-c                s&   i | ]}t |d f f|dd  qS )r   r	   N)r   )r#   rR   )leftr   r   
<dictcomp>'  s   zfrexp.<locals>.<dictcomp>c                s&   i | ]}t |d f f|d d  qS )r	   N)r   )r#   rR   )rightr   r   rf   )  s   )r	   )dependencies)chunksrX   )r   r-   frexpobjectnamer   flatten__dask_keys__emptyrX   r   from_collectionsr
   ri   )r   tmpldskrdskr@   lrldtrdtgraphLRr   )re   rg   r   rj   !  s     



rj   c                s   t tj| td}d|j  d|j  fddt| D }fddt| D }tjd| j	d}t|\}}|j	}|j	}t
j ||gd}	t|	 |j|d	}
t
j||gd}	t|	|j|d	}|
|fS )
N)rX   zmodf1-zmodf2-c                s&   i | ]}t |d f f|dd  qS )r   r	   N)r   )r#   rR   )re   r   r   rf   >  s   zmodf.<locals>.<dictcomp>c                s&   i | ]}t |d f f|d d  qS )r	   N)r   )r#   rR   )rg   r   r   rf   @  s   )r	   )rh   )ri   rX   )r   r-   modfrk   rl   r   rm   rn   ro   rX   r   rp   r
   ri   )r   rq   rr   rs   r@   rt   ru   rv   rw   rx   ry   rz   r   )re   rg   r   r{   8  s     



r{   )N)F)r   )Z
__future__r   r   r   operatorr   	functoolsr   r   Znumpyr-   Ztoolzr   r   r
   r   r   r   r   baser   r    Zhighlevelgraphr   Zutilsr   r   r   r    r+   rk   r,   r.   rL   addsubtractZmultiplyZdivideZ	logaddexpZ
logaddexp2Ztrue_divideZfloor_dividenegativeZpowerZfloat_powerr>   Z	remaindermod	conjugateZconjZexpZexp2logZlog2Zlog10Zlog1pZexpm1ZsqrtZsquareZcbrtZ
reciprocalZsinZcosZtanZarcsinZarccosZarctanZarctan2ZhypotZsinhZcoshZtanhZarcsinhZarccoshZarctanhZdeg2radZrad2degZgreaterZgreater_equalZlessZ
less_equalZ	not_equalZequalZlogical_andZ
logical_orZlogical_xorZlogical_notZmaximumZminimumZfmaxZfminZbitwise_andZ
bitwise_orZbitwise_xorZbitwise_notinvertZisfiniteZisinfZisnanZsignbitZcopysignZ	nextafterZspacingZldexpZfmodZfloorZceilZtruncZdegreesZradiansZrintZfabsZsignZabsoluteZclipZisrealZ	iscomplexZisneginfZisposinfrealimagZfixZi0ZsincZ
nan_to_numrd   rj   r{   r   r   r   r   <module>   s   
#R












































































