U
    Åmœd	~  ã                %   @   s,  d dl mZ d dlZd dlZd dlZd dlmZmZ d dl	m
Z
mZmZ e ejd¡ e ej¡jZe ej¡jZejdd�d~d
d„ƒZejdd�dd„ ƒZejdd�dd„ ƒZejdd�dd„ ƒZejdej ejjejjdddd�ejjejjdddd�¡gejejdœd�dd„ ƒZejej ej ejjdd¡ej ejjdd¡f¡ejjejjdddd�ejjejjdddd�ejjejjdddd�ejjejjdddd�ƒgdejjddd… ejjddd… ejjejjejjejjejjdœdd�dd„ ƒZ ejdd�dd„ ƒZ!ejej ej "ejj¡ej "ejj¡f¡ejjejjdddd�ejjejjdddd�ejjejjdddd�ejjejjdddd�ƒgdejjejjejjejjejjdœdd�d d!„ ƒZ#ejej ejjejjdddd�ejjejjdddd�ejjejjdddd�ejjejjdddd�¡gdejjejjejjejjejjejjd"œdd�d#d$„ ƒZ$e ¡ d%d&„ ƒZ%ejdd'�d(d)„ ƒZ&ejd*ej ejjejjdddd�ejjejjdddd�ejjejjdddd�ejjejjdddd�¡gdejjddd… ejjejjejj'ejjd+œd,�d-d.„ ƒZ(e ¡ d/d0„ ƒZ)e ¡ d1d2„ ƒZ*e ¡ dd4d5„ƒZ+e ¡ d6d7„ ƒZ,e ¡ d8d9„ ƒZ-ejd*ej ejjejjdddd�ejjejjdddd�ejjejjdddd�ejjejjdddd�¡gdd'�d:d;„ ƒZ.e ¡ d<d=„ ƒZ/ejd*ej ejjejjdddd�ejjejjdddd�ejjejjdddd�ejjejjdddd�¡gdejj'ejj'd>œd,�d?d@„ ƒZ0ej1dd'�dAdB„ ƒZ2e ¡ dCdD„ ƒZ3e ¡ dEdF„ ƒZ4e ¡ dGdH„ ƒZ5e ¡ dIdJ„ ƒZ6e ¡ dKdL„ ƒZ7e ¡ dMdN„ ƒZ8e ¡ dOdP„ ƒZ9e ¡ dQdR„ ƒZ:ejdejjejjejjejj'ejjdSœd,�dTdU„ ƒZ;ej1dddV�dWdX„ ƒZ<e ¡ dYdZ„ ƒZ=ejdd[ejjid,�d\d]„ ƒZ>e ¡ d^d_„ ƒZ?e ¡ d`da„ ƒZ@ejdejjejjejjejj'ejjdbœd,�dcdd„ ƒZAej1dddV�dedf„ ƒZBe ¡ dgdh„ ƒZCdidj„ ZDe ¡ eCfdkdl„ƒZEe ¡ d€dmdn„ƒZFe ¡ dodp„ ƒZGe ¡ dqdr„ ƒZHejddsdt�d�dvdw„ƒZIejddsdt�d‚dxdy„ƒZJe&e&e(e)e)e)e*e*e*e*e+e-e.e,e/e4e3e5e6e7e8e9e:e?eEeEeFeFeFeFe@eGeGeHeHeHdzœ$ZKd{ZLe(ejMd|œe(ejMd|œe;e<d|œe>e<d|œeAeBd|œe0e2d|œd}œZNdS )ƒé    )Úprint_functionN)ÚnormÚtau_rand)ÚkantorovichÚjensen_shannon_divergenceÚsymmetric_kl_divergenceÚCT)Úcacheçñhãˆµøä>ç:Œ0âŽyE>c                 C   s$   t  | | ¡}|||t  |¡  kS ©N)ÚnpÚabs)ÚaÚbZrtolÚatolÚdiff© r   úK/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/pynndescent/sparse.pyÚisclose   s    r   c                 C   s@   t  | ¡}t  t jdt jd�|dd … |d d… kf¡}|| S )Né   ©Zdtypeéÿÿÿÿ)r   ÚsortÚconcatenateÚonesZbool_)ZarrÚauxÚflagr   r   r   Ú
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_intersect2   s    r$   zi4(i4[:],i4[:])r   )Úreadonly)Úi1Úi2)Úlocalsc           	      C   sî   | j d dks|j d dkr dS d}d}| j d d }|j d d }| | }|| }d}||kr¢|d7 }||k rê|d7 }| | }nqê||k rê|d7 }|| }qèqêqX||k rÄ||k rÄ|d7 }| | }qX||k rê||k rê|d7 }|| }qXqêqX|S ©Nr   r   ©r    )	r!   r"   r&   r'   Zlimit1Zlimit2Új1Új2Úresultr   r   r   Úfast_intersection_size:   s6    



r.   )Ú
result_indÚresult_dataÚvalr&   r'   r+   r,   )Úfastmathr(   r	   c                 C   sä  | j d |j d  }tj|tjd�}tj|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 �rv| | }
|| }|dk�rj|
||	< |||	< |	d7 }	|d7 }�q(||j d k �rÄ|| }|| }|dk�r¸|||	< |||	< |	d7 }	|d7 }�qv|d |	… }|d |	… }||fS ©Nr   r   r   )r    r   ÚzerosÚint32Úfloat32)Úind1Údata1Úind2Údata2Zresult_sizer/   r0   r&   r'   Únnzr+   r,   r1   r   r   r   Ú
sparse_sump   sb     





r<   c                 C   s   t | ||| ƒS r   )r<   )r7   r8   r9   r:   r   r   r   Úsparse_diffÉ   s    r=   )r1   r&   r'   r+   r,   c                 C   sÂ   t jj t jj¡}t jj t jj¡}d}d}|| jd k rº||jd k rº| | }|| }	||	krž|| ||  }
|
dkrŒ| |¡ | |
¡ |d7 }|d7 }q,||	k r°|d7 }q,|d7 }q,||fS r)   )	ÚnumbaÚtypedÚListZ
empty_listÚtypesr5   r6   r    Úappend)r7   r8   r9   r:   r/   r0   r&   r'   r+   r,   r1   r   r   r   Ú
sparse_mulÎ   s$    




rC   )r-   r1   r&   r'   r+   r,   c                 C   sÒ   | j d }|j d }d}d}d}| | }	|| }
|	|
krŠ|| ||  }||7 }|d7 }||krd|S | | }	|d7 }||kr€|S || }
q0|	|
k r°|d7 }||kr¦|S | | }	q0|d7 }||krÄ|S || }
q0|S )Nr   ç        r   r*   )r7   r8   r9   r:   Zdim1Zdim2r-   r&   r'   r+   r,   r1   r   r   r   Úsparse_dot_product  s8    




rE   c                 C   sÎ  t | |ƒ}tj|jd tjd�}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 }qB|
|k rú|| }|dkrð|| ||	< |	d7 }	|d7 }qB|| }|dk�r || ||	< |	d7 }	|d7 }qB|| jd k �rl|| }|dk�r`|| ||	< |	d7 }	|d7 }�q*||jd k �r®|| }|dk�r¢|| ||	< |	d7 }	|d7 }�ql|d |	… }|d |	… }||fS r3   )r#   r   r4   r    r6   )r7   r8   r9   r:   r/   Zresult_data1Zresult_data2r&   r'   r;   r+   r,   r1   r   r   r   Údense_union>  sV    
 





rF   )r2   c                 C   sD   t | |||ƒ\}}d}t|jd ƒD ]}||| d 7 }q$t |¡S )NrD   r   é   )r=   Úranger    r   Úsqrt©r7   r8   r9   r:   Ú_Úaux_datar-   Úir   r   r   Úsparse_euclideanx  s
    rN   z#f4(i4[::1],f4[::1],i4[::1],f4[::1]))rL   r-   r   ÚdimrM   )r2   r(   c           	      C   sD   t | |||ƒ\}}d}t|ƒ}t|ƒD ]}||| ||  7 }q&|S ©NrD   )r=   ÚlenrH   )	r7   r8   r9   r:   rK   rL   r-   rO   rM   r   r   r   Úsparse_squared_euclidean�  s    rR   c                 C   s@   t | |||ƒ\}}d}t|jd ƒD ]}|t || ¡7 }q$|S ©NrD   r   ©r=   rH   r    r   r   rJ   r   r   r   Úsparse_manhattan�  s
    rU   c                 C   sB   t | |||ƒ\}}d}t|jd ƒD ]}t|t || ¡ƒ}q$|S rS   )r=   rH   r    Úmaxr   r   rJ   r   r   r   Úsparse_chebyshev¦  s
    rW   ç       @c           	      C   sL   t | |||ƒ\}}d}t|jd ƒD ]}|t || ¡| 7 }q$|d|  S )NrD   r   ç      ð?rT   )	r7   r8   r9   r:   ÚprK   rL   r-   rM   r   r   r   Úsparse_minkowski¯  s
    r[   c                 C   s$   t | |||ƒd jd }t|ƒ| S r   )r=   r    Úfloat)r7   r8   r9   r:   Ú
n_featuresÚnum_not_equalr   r   r   Úsparse_hamming¸  s    r_   c                 C   s~   t  |¡}t  |¡}t| |||ƒ\}}d|  t j¡}t| |||ƒ\}}	t  |	¡}	t||	||ƒ\}
}d}|D ]}||7 }ql|S )NrY   rD   )r   r   r<   Zastyper6   r=   rC   )r7   r8   r9   r:   Z	abs_data1Z	abs_data2Z
denom_indsÚ
denom_dataZ
numer_indsÚ
numer_datarK   Zval_datar-   r1   r   r   r   Úsparse_canberra¾  s    



rb   c           	      C   sv   t | |||ƒ\}}t |¡}|jd dkr.dS t |¡}|dkrDdS t| |||ƒ\}}t |¡}t |¡}t|ƒ| S ©Nr   rD   )r<   r   r   r    Úsumr=   r\   )	r7   r8   r9   r:   rK   r`   Údenominatorra   Ú	numeratorr   r   r   Úsparse_bray_curtisÏ  s    



rg   c                 C   sB   t | |ƒ}| jd |jd  | }|dkr.dS t|| ƒ| S d S rc   ©r.   r    r\   ©r7   r8   r9   r:   Ú	num_equalÚnum_non_zeror   r   r   Úsparse_jaccardï  s
    
rl   )rk   rj   c                 C   sN   t | |ƒ}| jd |jd  | }|dkr.dS |dkr:tS t || ¡ S d S rc   )r.   r    ÚFLOAT32_MAXr   Úlog2ri   r   r   r   Úsparse_alternative_jaccardú  s    
ro   c                 C   s   dt d|  ƒ S )NrY   rX   )Úpow)Úvr   r   r   Úcorrect_alternative_jaccard  s    rr   c                 C   s6   t | |ƒ}| jd |jd  | }|| }t|ƒ| S r   rh   ©r7   r8   r9   r:   r]   Únum_true_truerk   r^   r   r   r   Úsparse_matching  s    
ru   c                 C   sJ   t | |ƒ}| jd |jd  | }|| }|dkr6dS |d| |  S d S )Nr   rD   rX   ©r.   r    ©r7   r8   r9   r:   rt   rk   r^   r   r   r   Úsparse_dice#  s    
rx   c                 C   sR   t | |ƒ}| jd |jd  | }|| }|dkr6dS t|| | ƒ||  S d S rc   rh   rs   r   r   r   Úsparse_kulsinski/  s    
ÿry   c                 C   s:   t | |ƒ}| jd |jd  | }|| }d| ||  S ©Nr   rX   rv   rs   r   r   r   Úsparse_rogers_tanimoto=  s    
r{   c                 C   sl   | j d |j d kr&t | |k¡r&dS t| |ƒ}|t |dk¡krX|t |dk¡krXdS t|| ƒ| S d S rc   )r    r   Úallr.   rd   r\   )r7   r8   r9   r:   r]   rt   r   r   r   Úsparse_russellraoF  s    "
$r}   c                 C   s:   t | |ƒ}| jd |jd  | }|| }d| ||  S rz   rv   rs   r   r   r   Úsparse_sokal_michenerS  s    
r~   c                 C   sJ   t | |ƒ}| jd |jd  | }|| }|dkr6dS |d| |  S d S )Nr   rD   g      à?rv   rw   r   r   r   Úsparse_sokal_sneath\  s    
r   c           
      C   st   t | |||ƒ\}}d}t|ƒ}t|ƒ}|D ]}	||	7 }q*|dkrL|dkrLdS |dks\|dkr`dS d|||   S d S ©NrD   rY   )rC   r   )
r7   r8   r9   r:   rK   rL   r-   Únorm1Únorm2r1   r   r   r   Úsparse_cosineh  s    
rƒ   )r-   Únorm_xÚnorm_yrO   rM   c                 C   s–   t | |||ƒ\}}d}t|ƒ}t|ƒ}t|ƒ}	t|	ƒD ]}
|||
 7 }q6|dkr\|dkr\dS |dksl|dkrptS |dkr|tS || | }t |¡S d S rP   )rC   r   rQ   rH   rm   r   rn   )r7   r8   r9   r:   rK   rL   r-   r„   r…   rO   rM   r   r   r   Úsparse_alternative_cosinez  s    r†   )r2   r	   c                 C   s2   t dt| ƒdd�s| dk rdS dtd|  ƒ S d S ©NrD   gH¯¼šò×z>)r   rY   rX   )r   r   rp   ©Údr   r   r   Ú!sparse_correct_alternative_cosine˜  s    rŠ   c                 C   s   t | |||ƒ}d| S )NrY   )rE   ©r7   r8   r9   r:   r-   r   r   r   Ú
sparse_dot   s    rŒ   r-   c                 C   s*   t | |||ƒ}|dkrtS t |¡ S d S rP   )rE   rm   r   rn   r‹   r   r   r   Úsparse_alternative_dot§  s    r�   c                 C   sT  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|ƒ}|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�r2|dk�r2dS |dk�r@dS d|||   S d S )NrD   r   rY   r   rG   )
r    rH   r   Úemptyr6   rI   r   rC   Úsetr#   )r7   r8   r9   r:   r]   Zmu_xZmu_yZdot_productrM   Zshifted_data1Zshifted_data2r�   r‚   Zdot_prod_indsZdot_prod_dataZcommon_indicesr1   Zall_indicesr   r   r   Úsparse_correlation·  sT     ÿ ÿ

r�   c                 C   sš   t | |||ƒ\}}d}t |¡}t |¡}t || ¡}	|D ]}
|t |
¡7 }q<|dkrd|dkrddS |dkst|dkrxdS ||	kr„dS t d||	  ¡S d S r€   )rC   r   rd   rI   )r7   r8   r9   r:   Úaux_indsrL   r-   r�   r‚   Zsqrt_norm_prodr1   r   r   r   Úsparse_hellingerô  s    

r’   )r-   Ú	l1_norm_xÚ	l1_norm_yrO   rM   c                 C   s¦   t | |||ƒ\}}d}t |¡}t |¡}t|ƒ}	t|	ƒD ]}
|t ||
 ¡7 }q:|dkrf|dkrfdS |dksv|dkrztS |dkr†tS t || ¡| }t |¡S d S rS   )rC   r   rd   rQ   rH   rI   rm   rn   )r7   r8   r9   r:   r‘   rL   r-   r“   r”   rO   rM   r   r   r   Úsparse_alternative_hellinger	  s    

r•   c                 C   s8   t dt| ƒdd�s| dk rdS t dtd|  ƒ ¡S d S r‡   )r   r   r   rI   rp   rˆ   r   r   r   Ú$sparse_correct_alternative_hellinger)  s    r–   c                 C   s   t  | |k ¡S r   )r   r6   )ÚxÚyr   r   r   Údummy_ground_metric1  s    r™   c                    s   t  ¡ ‡ ‡fdd„ƒ}|S )aš  Generate a "ground_metric" suitable for passing to a ``sparse_kantorovich``
    distance function. This should be a metric that, given indices of the data,
    should produce the ground distance between the corresponding vectors. This
    allows the construction of a cost_matrix or ground_distance_matrix between
    sparse samples on the fly -- without having to compute an all pairs distance.
    This is particularly useful for things like word-mover-distance.

    For example, to create a suitable ground_metric for word-mover distance one
    would use:

    ``wmd_ground_metric = create_ground_metric(word_vectors, cosine)``

    Parameters
    ----------
    ground_vectors: array of shape (n_features, d)
        The set of vectors between which ground_distances are measured. That is,
        there should be a vector for each feature of the space one wishes to compute
        Kantorovich distance over.

    metric: callable (numba jitted)
        The underlying metric used to cpmpute distances between feature vectors.

    Returns
    -------
    ground_metric: callable (numba jitted)
        A ground metric suitable for passing to ``sparse_kantorovich``.
    c                    s   ˆˆ |  ˆ | ƒS r   r   )Zindex1Úindex2©Úground_vectorsÚmetricr   r   Úground_metricS  s    z+create_ground_metric.<locals>.ground_metric)r>   Únjit)rœ   r�   rž   r   r›   r   Úcreate_ground_metric6  s    r    c                 C   sh   t  | jd |jd f¡}t| jd ƒD ]2}t|jd ƒD ]}|| | || ƒ|||f< q:q(t|||ƒS r   )r   rŽ   r    rH   r   )r7   r8   r9   r:   rž   Zcost_matrixrM   Újr   r   r   Úsparse_kantorovichZ  s
    r¢   c                 C   s  d}d}d}d}d}	d}
d}t  |¡}t  |¡}dd„ }|| jd k �rF|	|jd k �rF| | }||	 }||krÄ||||  7 }|
|| | 7 }
|||	 | 7 }||
| |ƒ}|}|d7 }|	d7 }	q8||k �r
||||  7 }|
|| | 7 }
||
| |ƒ}|}|d7 }q8||||  7 }|||	 | 7 }||
| |ƒ}|}|	d7 }	q8|| jd k �rœ| | }||||  7 }|
|| | 7 }
||
| |ƒ}|}|d7 }�qF|	|jd k �rò||	 }||||  7 }|||	 | 7 }||
| |ƒ}|}|	d7 }	�qœt  |d| ¡S )NrD   r   c                 S   s   t  t  | ¡|¡S r   )r   Úpowerr   )r—   rZ   r   r   r   Ú<lambda>q  ó    z'sparse_wasserstein_1d.<locals>.<lambda>r   rY   )r   rd   r    r£   )r7   r8   r9   r:   rZ   r-   Zold_indÚdeltar&   r'   Zcdf1Zcdf2r“   r”   r   r+   r,   r   r   r   Úsparse_wasserstein_1de  s^    

 



r§   c                 C   s   t | |||ƒ\}}t||ƒS r   )rF   r   ©r7   r8   r9   r:   Zdense_data1Zdense_data2r   r   r   Ú sparse_jensen_shannon_divergence¥  s    r©   c                 C   s   t | |||ƒ\}}t||ƒS r   )rF   r   r¨   r   r   r   Úsparse_symmetric_kl_divergence«  s    rª   F)Úparallelr	   rY   c              	   C   sÐ  t  | jd ¡D �]´}| |df g}	||df g}
td| jd ƒD �] }| ||f dk r^ �qfd}tt|	ƒƒD ]Ì}|	| }||| ||f  || ||f d  … }||| ||f  || ||f d  … }||| ||d  … }||| ||d  … }|||||ƒ}|
| tkrn||||f k rnt|ƒ|k rnd} �q<qn|rB|	 | ||f ¡ |
 |||f ¡ qBt| jd ƒD ]P}|t|	ƒk �r¨|	| | ||f< |
| |||f< nd| ||f< tj	|||f< �qtq| |fS )Nr   r   TFr   )
r>   Úpranger    rH   rQ   ÚFLOAT32_EPSr   rB   r   Úinf)ÚindicesZ	distancesÚdata_indicesÚdata_indptrÚ	data_dataÚdistÚ	rng_stateÚprune_probabilityrM   Znew_indicesZnew_distancesr¡   r   ÚkÚcZfrom_indÚ	from_dataZto_indÚto_datar‰   r   r   r   Ú	diversify±  sD     ÿ ÿrº   c	                 C   sž  | j d d }	t |	¡D �]~}
|| |
 | |
d  … }|| |
 | |
d  … }t |¡}tj|j d tjd�}td|j d ƒD ]Ü}|| }t|ƒD ]Æ}|| }|| dkr’|| }|| }||| ||d  … }||| ||d  … }||| ||d  … }||| ||d  … }|||||ƒ}|| tkr’||| k r’t	|ƒ|k r’d||<  q~q’q~t|j d ƒD ],}|| }|| dk�rjd|| |
 | < �qjqd S )Nr   r   r   )
r    r>   r¬   r   Zargsortr   Zint8rH   r­   r   )Zgraph_indptrZgraph_indicesZ
graph_datar±   r°   r²   r³   r´   rµ   Zn_nodesrM   Zcurrent_indicesZcurrent_dataÚorderZretainedÚidxr¡   r¶   ÚlrZ   ÚqZ	from_indsr¸   Zto_indsr¹   r‰   r   r   r   Údiversify_csrè  s6    
r¿   )$Ú	euclideanÚl2ZsqeuclideanZ	manhattanÚl1ZtaxicabZ	chebyshevZlinfZlinftyZ	linfinityZ	minkowskiZcanberraZ
braycurtisÚhammingÚjaccardZdiceÚmatchingÚ	kulsinskiÚrogerstanimotoÚ
russellraoÚsokalmichenerZsokalsneathÚcosineÚcorrelationr   ZwassersteinZwasserstein_1dzwasserstein-1dúkantorovich-1drÌ   Ú	hellingerzjensen-shannonZjensen_shannonzsymmetric-klZsymmetric_klZsymmetric_kullback_liebler)rÃ   rÅ   rÆ   rÇ   rÈ   rÉ   rË   )r³   Z
correction)rÀ   rÁ   rÊ   ÚdotrÍ   rÄ   )r
   r   )rX   )r   )rY   )rY   )OÚ
__future__r   ÚlocaleÚnumpyr   r>   Zpynndescent.utilsr   r   Zpynndescent.distancesr   r   r   Ú	setlocaleÚ
LC_NUMERICZfinfor6   Zepsr­   rV   rm   rŸ   r   r   r#   r$   rA   r5   ZArrayZuint16r.   ÚTupler<   r=   ZListTyperC   rE   rF   rN   ZintprR   rU   rW   r[   r_   rb   rg   rl   ro   Z	vectorizerr   ru   rx   ry   r{   r}   r~   r   rƒ   r†   rŠ   rŒ   r�   r�   r’   r•   r–   r™   r    r¢   r§   r©   rª   rº   r¿   Zsparse_named_distancesZsparse_need_n_featuresrI   Z!sparse_fast_distance_alternativesr   r   r   r   Ú<module>   s.  






þþþø
)þÿ÷ÿù	è
?

þÿ÷þûé
üþ	úí
'
9

üþ	ûõ
	



üþ	ö


üþ	õ










ûý


 ÿý
	
<
ûý


$
?

	 ø6
 ÷8×,

þþþþñ