U
    Åmœd`  ã                3   @   sÌ  d dl Zd dlZd dlmZmZmZmZmZm	Z	m
Z
mZ ejdejd�Zejdejd�Zejdejd�Ze ej¡jZe ej¡j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dejjejjejjejjdœd�dd„ ƒZejdd�efdd„ƒZ ejdd�dd„ ƒZ!ejdd�dd„ ƒZ"ejdd�dodd„ƒZ#ejdd�edfdd„ƒZ$ejdd�ef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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dejjejjejjejj*ejj*ejjejj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d�d/d0„ ƒZ0ejdd�d1d2„ ƒZ1ejdd�d3d4„ ƒZ2ejdd�d5d6„ ƒZ3ejdd�d7d8„ ƒZ4ejdd�d9d:„ ƒZ5ejdd�d;d<„ ƒZ6ejdd�d=d>„ ƒZ7e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dejjejjejjejjejjd?œd�d@dA„ ƒZ8ejd
dejjejjejjdBœd�dCdD„ ƒZ9e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dejjejjejjdBœd�dEdF„ ƒZ:ej,dd�dGdH„ ƒZ;ejdd�dIdJ„ ƒZ<ejdd�dKdL„ ƒZ=ej,dd�dMdN„ ƒZ>ejdd�dOdP„ ƒ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dejjejjejjejjejjdQœd�dRdS„ ƒ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dejjejjejjejjejjdQœd�dTdU„ ƒZAej,dd�dVdW„ ƒZBe ¡ dpdYdZ„ƒZCejdd�d[d\„ ƒZDejdd]�ed^fd_d`„ƒZEejdd�edafdbdc„ƒZFe ¡ ddde„ ƒZGe ¡ dqdfdg„ƒZHe ¡ drdhdi„ƒZIe ¡ djdk„ ƒZJeeee!e!e!e"e"e"e"e#e e e$e$e%e'e7e9e?e5e(eDe<e=e@eEeEeHeHeHeHeIeIeFeGeGeJeJeJe&e)e/e.e0e1e2e4e3e6dlœ2ZKeejLdmœeejLdmœe8e;dmœe:e;dmœe8e>dmœeAeBdmœe+e-dmœdnœZMdS )sé    N)Úallocate_graph_structuresÚinitialize_graph_structuresÚinitialize_supplyÚinitialize_costÚnetwork_simplex_coreÚ
total_costÚProblemStatusÚsinkhorn_transport_plané   ©Údtype)r
   r
   T)Úfastmathc                 C   s:   d}t | jd ƒD ]}|| | ||  d 7 }qt |¡S )z_Standard euclidean distance.

    .. math::
        D(x, y) = \\sqrt{\sum_i (x_i - y_i)^2}
    ç        r   r
   ©ÚrangeÚshapeÚnpÚsqrt©ÚxÚyÚresultÚi© r   úN/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/pynndescent/distances.pyÚ	euclidean   s    r   zf4(f4[::1],f4[::1])é   ÚC)Úreadonly)r   ÚdiffÚdimr   )r   Úlocalsc                 C   s<   d}| j d }t|ƒD ] }| | ||  }||| 7 }q|S )zVSquared euclidean distance.

    .. math::
        D(x, y) = \sum_i (x_i - y_i)^2
    r   r   ©r   r   )r   r   r   r    r   r   r   r   r   Úsquared_euclidean'   s    
r#   c                 C   sB   d}t | jd ƒD ]$}|| | ||  d ||  7 }qt |¡S )zªEuclidean distance standardised against a vector of standard
    deviations per coordinate.

    .. math::
        D(x, y) = \sqrt{\sum_i \frac{(x_i - y_i)**2}{v_i}}
    r   r   r
   r   )r   r   Úsigmar   r   r   r   r   Ústandardised_euclideanF   s    "r%   c                 C   s6   d}t | jd ƒD ]}|t | | ||  ¡7 }q|S )z\Manhattan, taxicab, or l1 distance.

    .. math::
        D(x, y) = \sum_i |x_i - y_i|
    r   r   ©r   r   r   Úabsr   r   r   r   Ú	manhattanU   s    r(   c                 C   s8   d}t | jd ƒD ] }t|t | | ||  ¡ƒ}q|S )zZChebyshev or l-infinity distance.

    .. math::
        D(x, y) = \max_i |x_i - y_i|
    r   r   )r   r   Úmaxr   r'   r   r   r   r   Ú	chebyshevc   s    r*   c                 C   sB   d}t | jd ƒD ]"}|t | | ||  ¡| 7 }q|d|  S )ah  Minkowski distance.

    .. math::
        D(x, y) = \left(\sum_i |x_i - y_i|^p\right)^{\frac{1}{p}}

    This is a general distance. For p=1 it is equivalent to
    manhattan distance, for p=2 it is Euclidean distance, and
    for p=infinity it is Chebyshev distance. In general it is better
    to use the more specialised functions for those distances.
    r   r   ç      ð?r&   )r   r   Úpr   r   r   r   r   Ú	minkowskiq   s     r-   c                 C   sJ   d}t | jd ƒD ]*}||| t | | ||  ¡|  7 }q|d|  S )aW  A weighted version of Minkowski distance.

    .. math::
        D(x, y) = \left(\sum_i w_i |x_i - y_i|^p\right)^{\frac{1}{p}}

    If weights w_i are inverse standard deviations of graph_data in each dimension
    then this represented a standardised Minkowski distance (and is
    equivalent to standardised Euclidean distance for p=1).
    r   r   r+   r&   )r   r   Úwr,   r   r   r   r   r   Úweighted_minkowski„   s    (r/   c                 C   s    d}t j| jd t jd�}t| jd ƒD ]}| | ||  ||< q(t| jd ƒD ]D}d}t| jd ƒD ]}||||f ||  7 }qf||||  7 }qPt  |¡S )Nr   r   r   )r   Úemptyr   Úfloat32r   r   )r   r   Zvinvr   r   r   ÚtmpÚjr   r   r   Úmahalanobis–   s    r4   c                 C   sB   d}t | jd ƒD ]}| | || kr|d7 }qt|ƒ| jd  S ©Nr   r   r+   ©r   r   Úfloatr   r   r   r   Úhamming¨   s
    
r8   c                 C   s^   d}t | jd ƒD ]F}t | | ¡t || ¡ }|dkr|t | | ||  ¡| 7 }q|S ©Nr   r   r&   )r   r   r   r   Údenominatorr   r   r   Úcanberra²   s     r;   c                 C   sl   d}d}t | jd ƒD ]8}|t | | ||  ¡7 }|t | | ||  ¡7 }q|dkrdt|ƒ| S dS d S r9   )r   r   r   r'   r7   )r   r   Ú	numeratorr:   r   r   r   r   Úbray_curtis½   s    r=   c                 C   sl   d}d}t | jd ƒD ]4}| | dk}|| dk}||p:|7 }||oF|7 }q|dkrXdS t|| ƒ| S d S r9   r6   )r   r   Únum_non_zeroÚ	num_equalr   Úx_trueÚy_truer   r   r   ÚjaccardË   s    rB   )r   r>   r?   r@   rA   r    r   c                 C   sp   d}d}| j d }t|ƒD ]4}| | dk}|| dk}||p>|7 }||oJ|7 }q|dkr\dS t || ¡ S d S r9   )r   r   r   Úlog2)r   r   r>   r?   r    r   r@   rA   r   r   r   Úalternative_jaccardÛ   s    
rD   c                 C   s   dt d|  ƒ S ©Nr+   ç       @©Úpow)Úvr   r   r   Úcorrect_alternative_jaccardþ   s    rJ   c                 C   sN   d}t | jd ƒD ](}| | dk}|| dk}|||k7 }qt|ƒ| jd  S r9   r6   ©r   r   Únum_not_equalr   r@   rA   r   r   r   Úmatching  s    rM   c                 C   sl   d}d}t | jd ƒD ]4}| | dk}|| dk}||o:|7 }|||k7 }q|dkrXdS |d| |  S d S ©Nr   r   rF   ©r   r   ©r   r   Únum_true_truerL   r   r@   rA   r   r   r   Údice  s    rR   c                 C   s€   d}d}t | jd ƒD ]4}| | dk}|| dk}||o:|7 }|||k7 }q|dkrXdS t|| | jd  ƒ|| jd   S d S r9   r6   rP   r   r   r   Ú	kulsinski  s    ÿrS   c                 C   sR   d}t | jd ƒD ](}| | dk}|| dk}|||k7 }qd| | jd |  S rN   rO   rK   r   r   r   Úrogers_tanimoto0  s    rT   c                 C   s„   d}t | jd ƒD ](}| | dk}|| dk}||o6|7 }q|t | dk¡krd|t |dk¡krddS t| jd | ƒ| jd  S d S r9   )r   r   r   Úsumr7   )r   r   rQ   r   r@   rA   r   r   r   Ú
russellrao;  s    $rV   c                 C   sR   d}t | jd ƒD ](}| | dk}|| dk}|||k7 }qd| | jd |  S rN   rO   rK   r   r   r   Úsokal_michenerI  s    rW   c                 C   sl   d}d}t | jd ƒD ]4}| | dk}|| dk}||o:|7 }|||k7 }q|dkrXdS |d| |  S d S ©Nr   r   ç      à?rO   rP   r   r   r   Úsokal_sneathT  s    rZ   c                 C   sŠ   | j d dkrtdƒ‚t d| d |d   ¡}t d| d |d   ¡}t |d t | d ¡t |d ¡ |d   ¡}dt |¡ S )Nr   r
   z6haversine is only defined for 2 dimensional graph_datarY   r   rF   )r   Ú
ValueErrorr   Úsinr   ÚcosZarcsin)r   r   Zsin_latZsin_longr   r   r   r   Ú	haversined  s    2r^   c           	      C   sª   d}d}d}t | jd ƒD ]D}| | dk}|| dk}||o>|7 }||oL| 7 }|| oZ|7 }q| jd | | | }|dks†|dkrŠdS d| | || ||   S d S rN   rO   )	r   r   rQ   Znum_true_falseZnum_false_truer   r@   rA   Znum_false_falser   r   r   Úyulen  s    
ÿr_   c                 C   s–   d}d}d}t | jd ƒD ]8}|| | ||  7 }|| | d 7 }||| d 7 }q|dkrh|dkrhdS |dksx|dkr|dS d|t || ¡  S d S ©Nr   r   r
   r+   r   )r   r   r   Únorm_xÚnorm_yr   r   r   r   Úcosine„  s    rc   )r   ra   rb   r    r   c                 C   s´   d}d}d}| j d }t|ƒD ]@}|| | ||  7 }|| | | |  7 }||| ||  7 }q|dkrt|dkrtdS |dks„|dkrˆtS |dkr”tS t || ¡| }t |¡S d S r9   )r   r   ÚFLOAT32_MAXr   r   rC   ©r   r   r   ra   rb   r    r   r   r   r   Úalternative_cosine–  s     
rf   )r   r    r   c                 C   sH   d}| j d }t|ƒD ]}|| | ||  7 }q|dkr<dS d| S d S r5   r"   ©r   r   r   r    r   r   r   r   Údot¼  s    

rh   c                 C   sL   d}| j d }t|ƒD ]}|| | ||  7 }q|dkr<tS t |¡ S d S r9   )r   r   rd   r   rC   rg   r   r   r   Úalternative_dotÑ  s    
ri   c                 C   s   dt d|  ƒ S rE   rG   ©Údr   r   r   Úcorrect_alternative_cosineì  s    rl   c                 C   sö   d}d}d}d}| j d }t|ƒD ]\}| | ||  }||| 7 }|| | ||  7 }|| | | |  7 }||| ||  7 }q"t |¡}t |¡}t || ¡}	|||  }t |¡t d¡ }
t |¡|	 d |
 }|| t |
¡ d }|| S )Nr   r   é
   r
   rF   )r   r   r   r   r'   ÚarccosÚradiansr\   )r   r   Zd_euc_squaredZd_cosra   rb   r    r   r   Zmagnitude_differenceÚthetaZsectorÚtriangler   r   r   Útsssñ  s&    


rr   c                 C   s¾   d}d}d}| j d }t|ƒD ]@}|| | ||  7 }|| | | |  7 }||| ||  7 }q|dkrt|dkrtdS |dks„|dkrˆtS |dkr”tS |t || ¡ }dt |¡tj  S d S r5   )r   r   rd   r   r   rn   Úpire   r   r   r   Útrue_angular  s     
rt   c                 C   s   dt  td|  ƒ¡t j  S rE   )r   rn   rH   rs   rj   r   r   r   Útrue_angular_from_alt_cosine!  s    ru   c           
      C   sæ   d}d}d}d}d}t | jd ƒD ]}|| | 7 }||| 7 }q"|| jd  }|| jd  }t | jd ƒD ]@}| | | }|| | }	||d 7 }||	d 7 }|||	 7 }qj|dkrÀ|dkrÀdS |dkrÌdS d|t || ¡  S d S r`   r   )
r   r   Zmu_xZmu_yra   rb   Zdot_productr   Z	shifted_xZ	shifted_yr   r   r   Úcorrelation&  s*    rv   )r   Ú	l1_norm_xÚ	l1_norm_yr    r   c                 C   sž   d}d}d}| j d }t|ƒD ]6}|t | | ||  ¡7 }|| | 7 }||| 7 }q|dkrj|dkrjdS |dksz|dkr~dS t d|t || ¡  ¡S d S )Nr   r   r+   r   )r   r   r   r   ©r   r   r   rw   rx   r    r   r   r   r   Ú	hellingerD  s    
rz   c                 C   sª   d}d}d}| j d }t|ƒD ]6}|t | | ||  ¡7 }|| | 7 }||| 7 }q|dkrj|dkrjdS |dksz|dkr~tS |dkrŠtS t || ¡| }t |¡S d S r9   )r   r   r   r   rd   rC   ry   r   r   r   Úalternative_hellingerh  s     
r{   c                 C   s   t  dtd|  ƒ ¡S rE   )r   r   rH   rj   r   r   r   Úcorrect_alternative_hellinger�  s    r|   Úaveragec           	      C   sH  t  t  | ¡¡}|dkr&|jdd�}n|jdd�}t j|jt jd�}t  |j¡||< |dkrl|d  t j	¡S || }t  
|jt j¡}|dd … |d d… k|dd …< | ¡ | }|dkrÄ| t j	¡S t  |¡d	 }t  |t  t|ƒg|j¡f¡}|d
k�r
||  t j	¡S |dk�r,||d  d  t j	¡S d|| ||d   d  S )NZordinalZ	mergesort)ÚkindZ	quicksortr   r   éÿÿÿÿÚdenser   r)   ÚminrY   )r   ZravelZasarrayZargsortr0   ÚsizeÚintpZarangeÚastypeÚfloat64ÚonesZbool_ZcumsumÚnonzeroZconcatenateÚarrayÚlenr   )	ÚaÚmethodZarrZsorterÚinvZobsr€   r‡   Úcountr   r   r   Úrankdata”  s*     

rŽ   c                 C   s   t | ƒ}t |ƒ}t||ƒS )N)rŽ   rv   )r   r   Zx_rankZy_rankr   r   r   Ú	spearmanr¸  s    r�   )Znogili † c                 C   s  | dk}|dk}| |   tj¡}||   tj¡}| ¡ }| ¡ }	|| }||	 }||d d …f d d …|f }
t|jd |jd dƒ\}}}t|| ||jƒ t|
||j	ƒ t
|||ƒ}|dkrÆtdƒ‚t||||ƒ}|tjkrètdƒ‚n|tjkrútdƒ‚t|j|j	ƒ}|S )Nr   FzDKantorovich distance inputs must be valid probability distributions.z>Optimal transport problem was INFEASIBLE. Please check inputs.z=Optimal transport problem was UNBOUNDED. Please check inputs.)r„   r   r…   rU   r   r   r   Zsupplyr   Úcostr   r[   r   r   Z
INFEASIBLEZ	UNBOUNDEDr   Zflow)r   r   r�   Zmax_iterÚrow_maskÚcol_maskrŠ   ÚbÚa_sumÚb_sumÚsub_costZnode_arc_dataZspanning_treeÚgraphZinit_statusZsolve_statusr   r   r   r   ÚkantorovichÀ  s@      ÿ
ÿ
ÿ
ÿr˜   r+   c                 C   sÐ   | dk}|dk}| |   tj¡}||   tj¡}| ¡ }| ¡ }	|| }||	 }||d d …f d d …|f }
t| ||
|d�}|jd }|jd }d}t|ƒD ].}t|ƒD ] }||||f |||f  7 }q¨qœ|S )Nr   )r�   Úregularizationr   r   )r„   r   r…   rU   r	   r   r   )r   r   r�   r™   r‘   r’   rŠ   r“   r”   r•   r–   Ztransport_planZdim_iZdim_jr   r   r3   r   r   r   Úsinkhornñ  s,       ÿ

 rš   c           
   
   C   sÎ   d}d}d}| j d }t|ƒD ]}|| | 7 }||| 7 }q|t| 7 }|t| 7 }| t | }|t | }d||  }	t|ƒD ]H}|d|| t || |	|  ¡ || t || |	|  ¡   7 }q€|S rX   ©r   r   ÚFLOAT32_EPSr   Úlog)
r   r   r   rw   rx   r    r   Úpdf_xÚpdf_yÚmr   r   r   Újensen_shannon_divergence  s"    
:ÿr¡   c                 C   s–   d}d}t | jd ƒD ]}|| | 7 }||| 7 }q| | }|| }t d|jd ƒD ]4}||  ||d  7  < ||  ||d  7  < qTt|||ƒS )Nr   r   r   )r   r   r-   )r   r   r,   Úx_sumÚy_sumr   Úx_cdfÚy_cdfr   r   r   Úwasserstein_1d(  s    r¦   c                 C   s‚  d}d}t | jd ƒD ]}|| | 7 }||| 7 }q| | }|| }t d|jd ƒD ]4}||  ||d  7  < ||  ||d  7  < qTt || | ¡}d}	|dkrêt |jd ƒD ]&}|	t || ||  | ¡| 7 }	q¶|	d|  S |dk�r4t |jd ƒD ]&}|| ||  | }
|	|
|
 7 }	�qt |	¡S |dk�rvt |jd ƒD ]$}|	t || ||  | ¡7 }	�qL|	S tdƒ‚d S )Nr   r   r   r
   r+   z)Invalid p supplied to Kantorvich distance)r   r   r   Zmedianr'   r   r[   )r   r   r,   r¢   r£   r   r¤   r¥   Úmur   Úvalr   r   r   Úcircular_kantorovich:  s4    $


"r©   c           	   	   C   s¾   d}d}d}| j d }t|ƒD ]}|| | 7 }||| 7 }q|t| 7 }|t| 7 }| t | }|t | }t|ƒD ]D}||| t || ||  ¡ || t || ||  ¡  7 }qt|S r9   r›   )	r   r   r   rw   rx   r    r   rž   rŸ   r   r   r   Úsymmetric_kl_divergenced  s     
(ÿrª   )2r   Úl2Zsqeuclideanr(   ZtaxicabÚl1r*   Z	linfinityZlinftyZlinfr-   Z
seuclideanr%   Z
wminkowskir/   r4   r;   rc   rh   rv   r^   Z
braycurtisr�   rr   rt   rz   r˜   Zwassersteinr¦   zwasserstein-1dzkantorovich-1dZkantorovich_1dr©   Zcircular_wassersteinrš   zjensen-shannonZjensen_shannonzsymmetric-klZsymmetric_klZsymmetric_kullback_lieblerr8   rB   rR   rM   rS   ZrogerstanimotorV   ZsokalsneathZsokalmichenerr_   )ÚdistZ
correction)r   r«   rc   rh   rt   rz   rB   )r
   )r}   )r   )r   )NÚnumpyr   ZnumbaZpynndescent.optimal_transportr   r   r   r   r   r   r   r	   Úeyer1   Z_mock_identityr†   Z
_mock_onesZzerosr…   Z_dummy_costZfinfoZepsrœ   r)   rd   Znjitr   ÚtypesZArrayrƒ   Zuint16r#   r%   r(   r*   r-   r/   r4   r8   r;   r=   rB   Zuint8rD   Z	vectorizerJ   rM   rR   rS   rT   rV   rW   rZ   r^   r_   rc   rf   rh   ri   rl   rr   rt   ru   rv   rz   r{   r|   rŽ   r�   r˜   rš   r¡   r¦   r©   rª   Znamed_distancesr   Zfast_distance_alternativesr   r   r   r   Ú<module>   sì  (

þþü÷










	






þþù÷





















	



þþû÷
ýý	
þþý÷










þþû÷
þþû÷


#


0

)
ÉA

þþó