U
    ÅmœdGA  ã                   @   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   úD/home/sam/Atlas/atlas_env/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¼|	rÞd||  }q¼|| }q¼||ksø||krZ|
dk �r|t||
d|
  ƒ ||< qZt|d|
 |
 ƒ| ||< qZd S )Nç       @ç:Œ0âŽyE>ç      ð?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r†dS ||	kr’d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 ]}|| | |	|< qÖt|j d ƒD ]}|| | |
|< qút t|	ƒd || j d  |d   ¡}t t|
ƒd ||j d  |d   ¡}t| |	||
ƒ\}}t|ƒ}t|j d ƒD ]}||| 7 }�qˆt| j d ƒD ]$}| | |k�rª||	| | 8 }�qªt|j d ƒD ]$}|| |k�rÞ||
| | 8 }�qÞt	| |ƒ}||| ||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   ÚlogÚpi©Úxr   r   r   Úapprox_log_Gammaó  s    4ÿry   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,   Úintry   )rx   Ú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   rw   r   r   r   Úlog_single_beta  s    4ÿr�   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 }qÜd}|D ]}|t|ƒ7 }qöt  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'   ),Ú
__future__r   ÚlocaleZnumbaÚ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   ry   r€   r�   r‚   Zsparse_named_distancesZsparse_need_n_featuresZSPARSE_SPECIAL_METRICSr   r   r   r   Ú<module>   sÄ   



<

!  õ6
!







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


,å  þ