U
    md`                  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.e0e1e2e4e3e6dl2ZKe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 )zEuclidean 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rd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rtS |dkrt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rtS |dkrt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rdS |dkrd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rt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rtdt||||}|tjkrtdn|tjkrt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 }qq|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rt |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

