o
    -ѹgf                     @   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 edD ej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!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
dd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- Z0ejd	d
d.d/ Z1ejd	d
d0d1 Z2ejd	d
d2d3 Z3ejd	d
d4d5 Z4ejd	d
d6d7 Z5ejd	d
d8d9 Z6ejd	d
d:d; Z7ejd	d
d<d= Z8ejd	d
d>d? Z9ejd	d
d@dA 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!dBddCdD Z;ejdd	ejjejj ejj!dEddFdG 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!dEddHdI Z=ej/d	d
dJdK Z>ejd	d
dLdM Z?ejd	d
dNdO Z@ej/d	d
dPdQ ZAejd	d
dRdS ZBe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!dTddUdV ZCe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!dTddWdX ZDej/d	d
dYdZ ZEe dd\d]ZFejd	d
d^d_ ZGejd	d`edafdbdcZHejd	d
eddfdedfZIe dgdh ZJe ddidjZKe ddkdlZLe dmdn ZMejdoe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!dpddqdr ZNejdoe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!dsddtdu ZOi dedvedwe"de$dxe$dye$de%dze%d{e%d|e%de&d}e#de#d~e'de'd e(d$e*i dAe:dGe<dSeBd=e8de+d_eGdMe?dOe@dVeCdceHdeHdjeKdeKdeKdeKdleLdeLi dfeIdeJdeJdeMdeMdeMd"e)d(e,d1e2d/e1d3e3de4d7e5de7de6d?e9dreNdueOiZPe"ejQde"ejQde;e>de=e>de;eAdeDeEde.e0ddZRdS )    N)allocate_graph_structuresinitialize_graph_structuresinitialize_supplyinitialize_costnetwork_simplex_core
total_costProblemStatussinkhorn_transport_plan   dtype)r
   r
   c                 C   s   g | ]	}t |d qS )1)bincount).0i r   Y/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/pynndescent/distances.py
<listcomp>   s    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
   Nrangeshapenpsqrtxyresultr   r   r   r   	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   N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
   Nr   )r   r   sigmar    r   r   r   r   standardised_euclideanK   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   Nr   r   r   absr   r   r   r   	manhattanZ   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   N)r   r   maxr   r-   r   r   r   r   	chebyshevh   s   r0   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         ?Nr,   )r   r   pr    r   r   r   r   	minkowskiv   s    r3   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   r1   Nr,   )r   r   wr2   r    r   r   r   r   weighted_minkowski   s   (r5   c                 C   s   d}t j| jd t jd}t| jd D ]}| | ||  ||< qt| jd D ]"}d}t| jd D ]}||||f ||  7 }q3||||  7 }q(t |S )Nr   r   r   )r   emptyr   float32r   r   )r   r   Zvinvr    r%   r   tmpjr   r   r   mahalanobis   s   
r:   c                 C   sB   d}t | jd D ]}| | || kr|d7 }q	t|| jd  S Nr   r   r1   r   r   floatr   r   r   r   hamming   s   r>   c                 C   s^   d}t | jd D ]#}t| | t||  }|dkr,|t| | ||  | 7 }q	|S Nr   r   r,   )r   r   r    r   denominatorr   r   r   canberra   s   rA   c                 C   sh   d}d}t | jd D ]}|t| | ||  7 }|t| | ||  7 }q|dkr2t|| S dS r?   )r   r   r   r-   r=   )r   r   	numeratorr@   r   r   r   r   bray_curtis   s   rC   c                 C   sh   d}d}t | jd D ]}| | dk}|| dk}||p|7 }||o#|7 }q|dkr,dS t|| | S r?   r<   )r   r   num_non_zero	num_equalr   x_truey_truer   r   r   jaccard      rH   )r    rD   rE   rF   rG   r&   r   c                 C   sl   d}d}| j d }t|D ]}| | dk}|| dk}||p|7 }||o%|7 }q|dkr.dS t||  S r?   )r   r   r   log2)r   r   rD   rE   r&   r   rF   rG   r   r   r   alternative_jaccard   s   
rK   c                 C      dt d|   S Nr1          @pow)vr   r   r   correct_alternative_jaccard     rR   c                 C   sN   d}t | jd D ]}| | dk}|| dk}|||k7 }q	t|| jd  S r?   r<   r   r   num_not_equalr   rF   rG   r   r   r   matching  s   rV   c                 C   h   d}d}t | jd D ]}| | dk}|| dk}||o|7 }|||k7 }q|dkr,dS |d| |  S Nr   r   rN   r   r   r   r   num_true_truerU   r   rF   rG   r   r   r   dice  rI   r\   c                 C   s|   d}d}t | jd D ]}| | dk}|| dk}||o|7 }|||k7 }q|dkr,dS t|| | jd  || jd   S r?   r<   rZ   r   r   r   	kulsinski#  s   r]   c                 C   R   d}t | jd D ]}| | dk}|| dk}|||k7 }q	d| | jd |  S rX   rY   rT   r   r   r   rogers_tanimoto5     r_   c                 C   s   d}t | jd D ]}| | dk}|| dk}||o|7 }q	|t| dkkr2|t|dkkr2dS t| jd | | jd  S r?   )r   r   r   sumr=   )r   r   r[   r   rF   rG   r   r   r   
russellrao@  s   $rb   c                 C   r^   rX   rY   rT   r   r   r   sokal_michenerN  r`   rc   c                 C   rW   Nr   r         ?rY   rZ   r   r   r   sokal_sneathY  rI   rf   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_datare   r"   rN   )r   
ValueErrorr   sinr   cosZarcsin)r   r   Zsin_latZsin_longr    r   r   r   	haversinei  s   2rj   c           	      C   s   d}d}d}t | jd D ]"}| | dk}|| dk}||o|7 }||o&| 7 }|| o-|7 }q| jd | | | }|dksC|dkrEdS d| | || ||   S rX   rY   )	r   r   r[   Znum_true_falseZnum_false_truer   rF   rG   Znum_false_falser   r   r   yules  s   
rk   c                 C   s   d}d}d}t | jd D ]}|| | ||  7 }|| | d 7 }||| d 7 }q|dkr4|dkr4dS |dks<|dkr>dS d|t||   S Nr   r   r
   r1   r   )r   r   r    norm_xnorm_yr   r   r   r   cosine  s   ro   )r    rm   rn   r&   r   c                 C   s   d}d}d}| j d }t|D ] }|| | ||  7 }|| | | |  7 }||| ||  7 }q|dkr:|dkr:dS |dksB|dkrDtS |dkrJtS t|| | }t|S r?   )r   r   FLOAT32_MAXr   r   rJ   r   r   r    rm   rn   r&   r   r   r   r   alternative_cosine  s    

rr   )r    r&   r   c                 C   sD   d}| j d }t|D ]}|| | ||  7 }q|dkrdS d| S r;   r(   r   r   r    r&   r   r   r   r   dot  s   

rt   c                 C   sH   d}| j d }t|D ]}|| | ||  7 }q|dkrtS t| S r?   )r   r   rp   r   rJ   rs   r   r   r   alternative_dot  s   
ru   c                 C   rL   rM   rO   dr   r   r   correct_alternative_cosine  rS   rx   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
   rN   )r   r   r   r   r-   arccosradiansrh   )r   r   Zd_euc_squaredZd_cosrm   rn   r&   r   r%   Zmagnitude_differencethetaZsectorZtriangler   r   r   tsss  s&   


r}   c                 C   s   d}d}d}| j d }t|D ] }|| | ||  7 }|| | | |  7 }||| ||  7 }q|dkr:|dkr:dS |dksB|dkrDtS |dkrJtS |t||  }dt|tj  S r;   )r   r   rp   r   r   rz   pirq   r   r   r   true_angular  s    
r   c                 C   s   dt td|  t j  S rM   )r   rz   rP   r~   rv   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 }q5|dkr`|dkr`dS |dkrfdS d|t||   S rl   r   )
r   r   Zmu_xZmu_yrm   rn   Zdot_productr   Z	shifted_xZ	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 ]}|t| | ||  7 }|| | 7 }||| 7 }q|dkr5|dkr5dS |dks=|dkr?dS td|t||   S )Nr   r   r1   r"   )r   r   r   r   r   r   r    r   r   r&   r   r   r   r   	hellingerI  s   
r   c                 C   s   d}d}d}| j d }t|D ]}|t| | ||  7 }|| | 7 }||| 7 }q|dkr5|dkr5dS |dks=|dkr?tS |dkrEtS t|| | }t|S r?   )r   r   r   r   rp   rJ   r   r   r   r   alternative_hellingerm  s    

r   c                 C   s   t dtd|   S rM   )r   r   rP   rv   r   r   r   correct_alternative_hellinger  s   r   averagec           	      C   sD  t t | }|dkr|jdd}n|jdd}t j|jt jd}t |j||< |dkr6|d t j	S || }t 
|jt j}|dd  |d d k|dd < | | }|dkrb|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/   minre   )r   ZravelZasarrayZargsortr6   sizeintpZarangeastypefloat64onesZbool_ZcumsumnonzeroZconcatenatearraylenr   )	amethodZarrZsorterinvZobsr   r   r   r   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   )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rctdt||||}|tjkrstd|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   ra   r   r   r   Zsupplyr   costr   rg   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   r1   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 }qTqN|S )Nr   )r   regularizationr"   r   )r   r   r   ra   r	   r   r   )r   r   r   r   r   r   r   r   r   r   r   Ztransport_planZdim_iZdim_jr    r   r9   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 ]$}|d|| t|| |	|   || t|| |	|     7 }q@|S rd   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 ]}||  ||d  7  < ||  ||d  7  < q*t|||S )Nr   r   r"   )r   r   r3   )r   r   r2   x_sumy_sumr   x_cdfy_cdfr   r   r   wasserstein_1d-  s   r   c                 C   sv  d}d}t | jd D ]}|| | 7 }||| 7 }q| | }|| }t d|jd D ]}||  ||d  7  < ||  ||d  7  < q*t|| | }d}	|dkrut |jd D ]}|	t|| ||  | | 7 }	q[|	d|  S |dkrt |jd D ]}|| ||  | }
|	|
|
 7 }	qt|	S |dkrt |jd D ]}|	t|| ||  | 7 }	q|	S td)Nr   r   r"   r
   r1   z)Invalid p supplied to Kantorvich distance)r   r   r   Zmedianr-   r   rg   )r   r   r2   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 ]"}||| t|| ||   || t|| ||    7 }q:|S r?   r   )	r   r   r    r   r   r&   r   r   r   r   r   r   symmetric_kl_divergencei  s    
(r   zf4(u1[::1],u1[::1]))r    intersectionr&   r   c                 C   s<   d}| j d }t|D ]}| | || A }|t| 7 }q|S r?   )r   r   popcnt)r   r   r    r&   r   r   r   r   r   bit_hamming  s   
r   )r    denomand_or_r&   r   c                 C   sh   d}d}| j d }t|D ]}| | || @ }| | || B }|t| 7 }|t| 7 }qt||  S r?   )r   r   r   r   r   )r   r   r    r   r&   r   r   r   r   r   r   bit_jaccard  s   
r   l2ZsqeuclideanZtaxicabl1Z	linfinityZlinftyZlinfZ
seuclideanZ
wminkowskiZ
braycurtisZwassersteinzwasserstein-1dzkantorovich-1dZkantorovich_1dZcircular_wassersteinzjensen-shannonZjensen_shannonzsymmetric-klZsymmetric_klZsymmetric_kullback_lieblerZrogerstanimotoZsokalsneathZsokalmichener)distZ
correction)r!   r   ro   rt   r   r   rH   )r
   )r   )r"   )SZnumpyr   ZnumbaZpynndescent.optimal_transportr   r   r   r   r   r   r   r	   Zeyer7   Z_mock_identityr   Z
_mock_oneszerosr   Z_dummy_costZfinfoZepsr   r/   rp   r   r   r   Znjitr!   typesArrayr   Zuint16r)   r+   r.   r0   r3   r5   r:   r>   rA   rC   rH   Zuint8rK   Z	vectorizerR   rV   r\   r]   r_   rb   rc   rf   rj   rk   ro   rr   rt   ru   rx   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Znamed_distancesr   Zfast_distance_alternativesr   r   r   r   <module>   s  (













	




























	




	















#


0
)


	
 !"#$%&'()*+,./0123456789
C

