U
    XeGA                     @   sl  d dl mZ d dlZd dlZd dlZd dlmZ eej	d e
 dd Ze
 dd Ze
 d	d
 Ze
 dd Ze
 dd Ze
 dd Ze
 dHddZe
 dd Ze
 dd Ze
 dd Ze
 dd Ze
 dIddZe
 d d! Ze
 d"d# Ze
 d$d% Ze
 d&d' Ze
 d(d) Ze
 d*d+ Ze
 d,d- Ze
 d.d/ Ze
 d0d1 Ze
 d2d3 Z e
 d4d5 Z!e
 d6d7 Z"e
 d8d9 Z#e
 d:d; Z$e
 d<d= Z%e
 d>d? Z&e
 d@dA Z'e
 dBdC Z(eeeeeeeeeee(eeeeeeeee e!e"e$e#dDZ)dEZ*e#dFe(dGiZ+dS )J    )print_functionN)normCc                 C   s@   t | }t t jdt jd|dd  |d d kf}|| S )N   Zdtype)npsortconcatenateZonesZbool_)Zarrauxflag r   *lib/python3.8/site-packages/umap/sparse.py
arr_unique   s    
.r   c                 C   s:   | j d dkr|S |j d dkr$| S tt| |fS d S Nr   )shaper   r   r
   )ar1ar2r   r   r   	arr_union   s
    r   c                 C   s:   t | |f}|  |d d |dd  |d d k S )Nr   r   )r   r
   r	   )r   r   r   r   r   r   arr_intersect%   s    r   c                 C   s  t | |}tj|jd tjd}d}d}d}|| jd k r||jd k r| | }	|| }
|	|
kr|| ||  }|dkr|	||< |||< |d7 }|d7 }|d7 }q,|	|
k r|| }|dkr|	||< |||< |d7 }|d7 }q,|| }|dkr
|
||< |||< |d7 }|d7 }q,|| jd k r^|| }|dkrR| | ||< |||< |d7 }|d7 }q||jd k r|| }|dkr|| ||< |||< |d7 }|d7 }q^|d | }|d | }||fS Nr   r   r   )r   r   zerosr   float32ind1data1ind2data2Z
result_indZresult_datai1i2Znnzj1j2valr   r   r   
sparse_sum,   s\    
 





r#   c                 C   s   t | ||| S )N)r#   )r   r   r   r   r   r   r   sparse_diffi   s    r$   c                 C   s   t | |}tj|jd tjd}d}d}d}|| jd k r||jd k r| | }	|| }
|	|
kr|| ||  }|dkr|	||< |||< |d7 }|d7 }|d7 }q,|	|
k r|d7 }q,|d7 }q,|d | }|d | }||fS r   )r   r   r   r   r   r   r   r   r   
sparse_muln   s,    



r%   F      ?c                 C   s>  t | d d}|	r4tt d|  d dd}ntt | d dd}t|jd D ]}|| }|| }|}t| | | |d  D ]}|| |kr|| }q|}t|| ||d  D ]*}|| |kr|	rd||  }q|| }q||ks||krZ|
dk r|t||
d|
   ||< qZt|d|
 |
 | ||< qZd S )N       @:0yE>      ?g-C6?r   r   r&   )maxminranger   pow)indptr1indices1r   indptr2indices2r   
result_row
result_col
result_valZright_complementZ
mix_weightleft_min	right_minidxijleft_valk	right_valr   r   r   general_sset_intersection   s@      


 
r=   c	                 C   s   t | d d}	t | d d}
t|jd D ]}|| }|| }|	}t| | | |d  D ]}|| |kr`|| }q`|
}t|| ||d  D ]}|| |kr|| }q|| ||  ||< q2d S )Nr'   r(   r   r   )r*   r+   r,   r   )r.   r/   r   r0   r1   r   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r   r   r   general_sset_union   s    

r>   c                 C   sD   t | |||\}}d}t|jd D ]}||| d 7 }q$t|S )N        r      )r$   r,   r   r   sqrtr   r   r   r   aux_indsaux_dataresultr8   r   r   r   sparse_euclidean   s
    rF   c                 C   s@   t | |||\}}d}t|jd D ]}|t|| 7 }q$|S Nr?   r   r$   r,   r   r   absrB   r   r   r   sparse_manhattan   s
    rJ   c                 C   sB   t | |||\}}d}t|jd D ]}t|t|| }q$|S rG   )r$   r,   r   r*   r   rI   rB   r   r   r   sparse_chebyshev   s
    rK   r'   c           	      C   sL   t | |||\}}d}t|jd D ]}|t|| | 7 }q$|d|  S Nr?   r   r)   rH   )	r   r   r   r   prC   rD   rE   r8   r   r   r   sparse_minkowski  s
    rN   c                 C   s$   t | |||d jd }t|| S r   )r$   r   float)r   r   r   r   
n_featuresnum_not_equalr   r   r   sparse_hamming  s    rR   c                 C   sf   t |}t |}t| |||\}}d| }t| |||\}}	t |	}	t||	||\}
}t |S )Nr)   )r   rI   r#   r$   r%   sum)r   r   r   r   Z	abs_data1Z	abs_data2
denom_inds
denom_data
numer_inds
numer_dataZval_indsZval_datar   r   r   sparse_canberra  s    


rX   c           
      C   sv   t | |||\}}t|}|jd dkr.dS t|}|dkrDdS t| |||\}}t|}t|}	t|	| S Nr   r?   )r#   r   rI   r   rS   r$   rO   )
r   r   r   r   rT   rU   denominatorrV   rW   	numeratorr   r   r   sparse_bray_curtis!  s    



r\   c                 C   s@   t | |jd }t| |jd }|dkr,dS t|| | S d S rY   )r   r   r   rO   )r   r   r   r   num_non_zeroZ	num_equalr   r   r   sparse_jaccard6  s
    r^   c                 C   s4   t | |jd }t| |jd }|| }t|| S r   r   r   r   rO   r   r   r   r   rP   num_true_truer]   rQ   r   r   r   sparse_matchingA  s    rb   c                 C   sH   t | |jd }t| |jd }|| }|dkr4dS |d| |  S d S )Nr   r?   r'   r   r   r   r   r   r   r   ra   r]   rQ   r   r   r   sparse_diceJ  s    re   c                 C   sP   t | |jd }t| |jd }|| }|dkr4dS t|| | ||  S d S rY   r_   r`   r   r   r   sparse_kulsinskiV  s    rf   c                 C   s8   t | |jd }t| |jd }|| }d| ||  S Nr   r'   rc   r`   r   r   r   sparse_rogers_tanimotod  s    rh   c                 C   sr   | j d |j d kr&t| |kr&dS t| |j d }|t|dkkr^|t|dkkr^dS t|| | S d S rY   )r   r   allr   rS   rO   )r   r   r   r   rP   ra   r   r   r   sparse_russellraom  s    "$rj   c                 C   s8   t | |jd }t| |jd }|| }d| ||  S rg   rc   r`   r   r   r   sparse_sokal_michenerz  s    rk   c                 C   sH   t | |jd }t| |jd }|| }|dkr4dS |d| |  S d S )Nr   r?   r&   rc   rd   r   r   r   sparse_sokal_sneath  s    rl   c           
      C   s   t | |||\}}d}t|}t|}t|jd D ]}	|||	 7 }q4|dkrZ|dkrZdS |dksj|dkrndS d|||   S d S rL   )r%   r   r,   r   )
r   r   r   r   rC   rD   rE   norm1norm2r8   r   r   r   sparse_cosine  s    ro   c                 C   s   t | |||\}}d}t|}t|}t|| }	t|jd D ]}
|t||
 7 }qF|dkrr|dkrrdS |dks|dkrdS ||	krdS td||	  S d S rL   )r%   r   rS   rA   r,   r   )r   r   r   r   rC   rD   rE   rm   rn   Zsqrt_norm_prodr8   r   r   r   sparse_hellinger  s    

rp   c                 C   sb  d}d}d}| j d dkr,|j d dkr,dS | j d dksH|j d dkrLdS t|j d D ]}||| 7 }qZt|j d D ]}||| 7 }qz|| }|| }tj|j d tjd}	tj|j d tjd}
t|j d D ]}|| | |	|< qt|j d D ]}|| | |
|< qtt|	d || j d  |d   }tt|
d ||j d  |d   }t| |	||
\}}t|}t|j d D ]}||| 7 }qt| j d D ]$}| | |kr||	| | 8 }qt|j d D ]$}|| |kr||
| | 8 }qt	| |}||| ||j d   7 }|dkr@|dkr@dS |dkrNdS d|||   S d S )Nr?   r   r)   r   r@   )
r   r,   r   emptyr   rA   r   r%   setr   )r   r   r   r   rP   Zmu_xZmu_yZdot_productr8   Zshifted_data1Zshifted_data2rm   rn   Zdot_prod_indsZdot_prod_dataZcommon_indicesZall_indicesr   r   r   sparse_correlation  sT      

rs   c                 C   sB   | dkrdS | t |  |  dt dt j |    d| d   S )Nr   r   r&   r'   r)   g      (@r   logZpixr   r   r   approx_log_Gamma  s    4rx   c                 C   s|   t | |}t| |}|dk r\t| }tdt|D ] }|t|t||  7 }q6|S t| t| t| |  S d S )N   r   )r+   r*   r   ru   r,   intrx   )rw   yabvaluer8   r   r   r   log_beta  s    

r   c                 C   s6   t dd|  d  dt dt j |    d|   S )Nr'   g       r&   g      ?rt   rv   r   r   r   log_single_beta  s    4r   c                 C   sR  t |}t |}|dkr(|dkr(dS |dks8|dkr<dS d}d}d}|| jd k r||jd k r| | }	|| }
|	|
kr|| ||  dkr|t|| || 7 }|d7 }|d7 }qH|	|
k r|d7 }qH|d7 }qHd}|D ]}|t|7 }qd}|D ]}|t|7 }qt d| |t|| |t|   d| |t|| |t|    S )Nr   r?   g    חAr   r)   )r   rS   r   r   r   rA   )r   r   r   r   Zn1Zn2Zlog_br   r   r    r!   Zself_denom1Zd1Zself_denom2Zd2r   r   r   sparse_ll_dirichlet  s>    




  r   )Z	euclideanZ	manhattanl1ZtaxicabZ	chebyshevZlinfZlinftyZ	linfinityZ	minkowskiZcanberrall_dirichletZ
braycurtishammingZjaccardZdicematching	kulsinskirogerstanimoto
russellraosokalmichenerZsokalsneathZcosinecorrelation	hellinger)r   r   r   r   r   r   r   r   r   )Fr&   )r'   ),Z
__future__r   ZlocaleZnumbaZnumpyr   Z
umap.utilsr   	setlocale
LC_NUMERICZnjitr   r   r   r#   r$   r%   r=   r>   rF   rJ   rK   rN   rR   rX   r\   r^   rb   re   rf   rh   rj   rk   rl   ro   rp   rs   rx   r   r   r   Zsparse_named_distancesZsparse_need_n_featuresZSPARSE_SPECIAL_METRICSr   r   r   r   <module>   s   



<

!  6
!

















<




,  