U
    ×½|e`  ã                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   úR/var/www/website-v5/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   Úvinvr   r   r   ÚtmpÚjr   r   r   Úmahalanobis–   s    r5   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
    
r9   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 r:   )r   r   r   r'   r8   )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 r:   r7   )r   r   Únum_non_zeroÚ	num_equalr   Úx_trueÚy_truer   r   r   ÚjaccardË   s    rC   )r   r?   r@   rA   rB   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 r:   )r   r   r   Úlog2)r   r   r?   r@   r    r   rA   rB   r   r   r   Úalternative_jaccardÛ   s    
rE   c                 C   s   dt d|  ƒ S ©Nr+   ç       @©Úpow)Úvr   r   r   Úcorrect_alternative_jaccardþ   s    rK   c                 C   sN   d}t | jd ƒD ](}| | dk}|| dk}|||k7 }qt|ƒ| jd  S r:   r7   ©r   r   Únum_not_equalr   rA   rB   r   r   r   Úmatching  s    rN   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   rG   ©r   r   ©r   r   Únum_true_truerM   r   rA   rB   r   r   r   Údice  s    rS   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 r:   r7   rQ   r   r   r   Ú	kulsinski  s    ÿrT   c                 C   sR   d}t | jd ƒD ](}| | dk}|| dk}|||k7 }qd| | jd |  S rO   rP   rL   r   r   r   Úrogers_tanimoto0  s    rU   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 r:   )r   r   r   Úsumr8   )r   r   rR   r   rA   rB   r   r   r   Ú
russellrao;  s    $rW   c                 C   sR   d}t | jd ƒD ](}| | dk}|| dk}|||k7 }qd| | jd |  S rO   rP   rL   r   r   r   Úsokal_michenerI  s    rX   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   ç      à?rP   rQ   r   r   r   Úsokal_sneathT  s    r[   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_datarZ   r   rG   )r   Ú
ValueErrorr   Úsinr   ÚcosÚarcsin)r   r   Úsin_latÚsin_longr   r   r   r   Ú	haversined  s    2rb   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 rO   rP   )	r   r   rR   Únum_true_falseÚnum_false_truer   rA   rB   Únum_false_falser   r   r   Úyulen  s    
ÿrf   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    rj   )r   rh   ri   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 r:   )r   r   ÚFLOAT32_MAXr   r   rD   ©r   r   r   rh   ri   r    r   r   r   r   Úalternative_cosine–  s     
rm   )r   r    r   c                 C   sH   d}| j d }t|ƒD ]}|| | ||  7 }q|dkr<dS d| S d S r6   r"   ©r   r   r   r    r   r   r   r   Údot¼  s    

ro   c                 C   sL   d}| j d }t|ƒD ]}|| | ||  7 }q|dkr<tS t |¡ S d S r:   )r   r   rk   r   rD   rn   r   r   r   Úalternative_dotÑ  s    
rp   c                 C   s   dt d|  ƒ S rF   rH   ©Údr   r   r   Úcorrect_alternative_cosineì  s    rs   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
   rG   )r   r   r   r   r'   ÚarccosÚradiansr]   )r   r   Zd_euc_squaredZd_cosrh   ri   r    r   r   Zmagnitude_differenceÚthetaZsectorZtriangler   r   r   Útsssñ  s&    


rx   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 r6   )r   r   rk   r   r   ru   Úpirl   r   r   r   Útrue_angular  s     
rz   c                 C   s   dt  td|  ƒ¡t j  S rF   )r   ru   rI   ry   rq   r   r   r   Útrue_angular_from_alt_cosine!  s    r{   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 rg   r   )
r   r   Úmu_xÚmu_yrh   ri   Údot_productr   Ú	shifted_xÚ	shifted_yr   r   r   Úcorrelation&  s*    r�   )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   r‚   rƒ   r    r   r   r   r   Ú	hellingerD  s    
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~tS |dkrŠtS t || ¡| }t |¡S d S r:   )r   r   r   r   rk   rD   r„   r   r   r   Úalternative_hellingerh  s     
r†   c                 C   s   t  dtd|  ƒ ¡S rF   )r   r   rI   rq   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 )NÚordinalÚ	mergesort)ÚkindÚ	quicksortr   r   éÿÿÿÿÚdenser   r)   ÚminrZ   )r   ÚravelÚasarrayÚargsortr0   ÚsizeÚintpÚarangeÚastypeÚfloat64ÚonesÚbool_ÚcumsumÚnonzeroÚconcatenateÚarrayÚlenr   )	ÚaÚmethodÚarrÚsorterÚinvÚobsrŽ   r›   Úcountr   r   r   Úrankdata”  s*     

r¦   c                 C   s   t | ƒ}t |ƒ}t||ƒS )N)r¦   r�   )r   r   Zx_rankZy_rankr   r   r   Ú	spearmanr¸  s    r§   )Ú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—   rV   r   r   r   Zsupplyr   Úcostr   r\   r   r   Ú
INFEASIBLEÚ	UNBOUNDEDr   Úflow)r   r   r©   Úmax_iterÚrow_maskÚcol_maskrŸ   ÚbÚa_sumÚb_sumÚsub_costZnode_arc_dataZspanning_treeÚgraphÚ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—   rV   r	   r   r   )r   r   r©   r·   r®   r¯   rŸ   r°   r±   r²   r³   Ztransport_planZdim_iZdim_jr   r   r4   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 rY   ©r   r   ÚFLOAT32_EPSr   Úlog)
r   r   r   r‚   rƒ   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   Ú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 r:   r¹   )	r   r   r   r‚   rƒ   r    r   r¼   r½   r   r   r   Úsymmetric_kl_divergenced  s     
(ÿrÉ   )2r   Úl2Úsqeuclideanr(   ÚtaxicabÚl1r*   Ú	linfinityÚlinftyÚlinfr-   Ú
seuclideanr%   Ú
wminkowskir/   r5   r<   rj   ro   r�   rb   Ú
braycurtisr§   rx   rz   r…   r¶   ÚwassersteinrÄ   zwasserstein-1dzkantorovich-1dZkantorovich_1drÈ   Zcircular_wassersteinr¸   zjensen-shannonÚjensen_shannonzsymmetric-klÚsymmetric_klÚsymmetric_kullback_lieblerr9   rC   rS   rN   rT   ÚrogerstanimotorW   ÚsokalsneathÚsokalmichenerrf   )ÚdistÚ
correction)r   rÊ   rj   ro   rz   r…   rC   )r
   )rˆ   )r   )r   )NÚnumpyr   ÚnumbaZpynndescent.optimal_transportr   r   r   r   r   r   r   r	   Úeyer1   Ú_mock_identityr˜   Ú
_mock_onesÚzerosr—   Z_dummy_costÚfinfoÚepsrº   r)   rk   Únjitr   ÚtypesÚArrayr”   Úuint16r#   r%   r(   r*   r-   r/   r5   r9   r<   r>   rC   Úuint8rE   Ú	vectorizerK   rN   rS   rT   rU   rW   rX   r[   rb   rf   rj   rm   ro   rp   rs   rx   rz   r{   r�   r…   r†   r‡   r¦   r§   r¶   r¸   r¿   rÄ   rÈ   rÉ   Únamed_distancesr   Úfast_distance_alternativesr   r   r   r   Ú<module>   sì  (

þþü÷










	



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














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