U
    X«¿eÚ‡  ã                (   @   s  d dl Z d dlZd dlZd dlmZ ejdejdZ	de	 Z
ejdejdZe  ¡ dd„ ƒZe jdd	d
d„ ƒZe jdd	dd„ ƒZe  ¡ efdd„ƒZe jdd	efdd„ƒZe  ¡ dd„ ƒZe  ¡ dd„ ƒZe  ¡ dd„ ƒZe  ¡ dd„ ƒZe  ¡ d‡dd„ƒZe  ¡ dˆdd„ƒZe  ¡ dd„ ƒZe  ¡ d d!„ ƒZe  ¡ edfd"d#„ƒZe  ¡ edfd$d%„ƒZe  ¡ e	fd&d'„ƒZe  ¡ e	fd(d)„ƒZe  ¡ d*d+„ ƒZe  ¡ d,d-„ ƒZ e  ¡ d.d/„ ƒZ!e  ¡ d0d1„ ƒZ"e  ¡ d2d3„ ƒZ#e  ¡ d4d5„ ƒZ$e  ¡ d6d7„ ƒZ%e  ¡ d8d9„ ƒZ&e  ¡ d:d;„ ƒZ'e  ¡ d<d=„ ƒZ(e  ¡ d>d?„ ƒZ)e  ¡ d@dA„ ƒZ*e  ¡ dBdC„ ƒZ+e  ¡ dDdE„ ƒZ,e  ¡ dFdG„ ƒZ-e  ¡ dHdI„ ƒZ.e  ¡ dJdK„ ƒZ/e jdd	dLdM„ ƒZ0e  ¡ dNdO„ ƒZ1e  ¡ dPdQ„ ƒZ2e  ¡ dRdS„ ƒZ3e  ¡ dTdU„ ƒZ4e  ¡ dVdW„ ƒZ5e  ¡ dXdY„ ƒZ6e  ¡ dZd[„ ƒZ7e jdd	d‰d]d^„ƒZ8e jdd	dŠd_d`„ƒZ9e  ¡ dadb„ ƒZ:e jdd	e	e
dcfddde„ƒZ;e jdd	dfdg„ ƒZ<e jdd	dhdi„ ƒZ=e jdd	djdk„ ƒZ>e jdd	dldm„ ƒZ?dndo„ Z@e  ¡ dpdq„ ƒZAe  ¡ i gfdrds„ƒZBe  ¡ d‹dtdu„ƒZCe  ¡ dŒdvdw„ƒZDe  ¡ ddydz„ƒZEeeeeeeeeeeeeeeeee e/e1e2e,e"e7e8ee$e&e%e'e(e)e+e*e.eAeCeBeDeEd{œ'ZFeeeeeeeeeeeeeeee!e0e:e3e-e#e9e<e=e>ed|œZGd}ZHdQd[d^de2e7e8efZIe jdd~de2fdd€„ƒZJe jdddde2d‚fdƒd„„ƒZKdŽd…d†„ZLdS )é    N)Úpairwise_distancesé   ©Zdtypeç      ð?c                 C   s   | dk rdS dS d S )Nr   éÿÿÿÿé   © )Úar   r   ú-lib/python3.8/site-packages/umap/distances.pyÚsign   s    r   T©Z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Úir   r   r
   Ú	euclidean   s    r   c                 C   sR   d}t | jd ƒD ]}|| | ||  d 7 }qt |¡}| | d|  }||fS )zŸStandard euclidean distance and its gradient.

    ..math::
        D(x, y) = \sqrt{\sum_i (x_i - y_i)^2}
        \frac{dD(x, y)}{dx} = (x_i - y_i)/D(x,y)
    r   r   r   çíµ ÷Æ°>r   )r   r   r   r   ÚdÚgradr   r   r
   Úeuclidean_grad#   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_euclidean3   s    "r   c                 C   s^   d}t | jd ƒD ]$}|| | ||  d ||  7 }qt |¡}| | d||   }||fS )z·Euclidean distance standardised against a vector of standard
    deviations per coordinate with gradient.

    ..math::
        D(x, y) = \sqrt{\sum_i \frac{(x_i - y_i)**2}{v_i}}
    r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r
   Ústandardised_euclidean_gradB   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
   Ú	manhattanR   s    r"   c                 C   s`   d}t  | j¡}t| jd ƒD ]8}|t  | | ||  ¡7 }t  | | ||  ¡||< q||fS )ziManhattan, taxicab, or l1 distance with gradient.

    ..math::
        D(x, y) = \sum_i |x_i - y_i|
    r   r   ©r   Úzerosr   r   r!   r   )r   r   r   r   r   r   r   r
   Úmanhattan_grad`   s    r%   c                 C   s8   d}t | jd ƒD ] }t|t | | ||  ¡ƒ}q|S )zYChebyshev or l-infinity distance.

    ..math::
        D(x, y) = \max_i |x_i - y_i|
    r   r   )r   r   Úmaxr   r!   r   r   r   r
   Ú	chebyshevo   s    r'   c                 C   sp   d}d}t | jd ƒD ]*}t | | ||  ¡}||kr|}|}qt | j¡}t | | ||  ¡||< ||fS )zgChebyshev or l-infinity distance with gradient.

    ..math::
        D(x, y) = \max_i |x_i - y_i|
    r   r   )r   r   r   r!   r$   r   )r   r   r   Zmax_ir   Úvr   r   r   r
   Úchebyshev_grad}   s    r)   c                 C   sB   d}t | jd ƒD ]"}|t | | ||  ¡| 7 }q|d|  S )ag  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   r   Úpr   r   r   r   r
   Ú	minkowski‘   s     r+   c                 C   sº   d}t | jd ƒD ]"}|t | | ||  ¡| 7 }qtj| jd tjd}t | jd ƒD ]N}tt | | ||  ¡|d ƒt| | ||  ƒ t|d|d  ƒ ||< qZ|d|  |fS )au  Minkowski distance with gradient.

    ..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   ©r   r   r   r!   ÚemptyÚfloat32Úpowr   )r   r   r*   r   r   r   r   r   r
   Úminkowski_grad¤   s     ÿþÿr0   c                 C   sT   t  | |  ¡}t  || ¡}t  t  | | d¡¡}t  dd|d| d|     ¡S )zÔPoincare distance.

    ..math::
        \delta (u, v) = 2 \frac{ \lVert  u - v \rVert ^2 }{ ( 1 - \lVert  u \rVert ^2 ) ( 1 - \lVert  v \rVert ^2 ) }
        D(x, y) = \operatorname{arcosh} (1+\delta (u,v))
    r   r   )r   ÚsumZpowerÚarccosh)Úur(   Z	sq_u_normZ	sq_v_normZsq_distr   r   r
   Úpoincare¿   s    r4   c                 C   sÞ   t  dt  | d ¡ ¡}t  dt  |d ¡ ¡}|| }t| jd ƒD ]}|| | ||  8 }qF|dkrld}dt  |d ¡t  |d ¡  }t  | jd ¡}t| jd ƒD ]$}|| | | | ||   ||< qªt  |¡|fS )Nr   r   r   gÜ1¯  ð?r   )r   r   r1   r   r   r$   r2   )r   r   ÚsÚtÚBr   Z
grad_coeffr   r   r   r
   Úhyperboloid_gradÍ   s     "r8   c                 C   sJ   d}t | jd ƒD ]*}||| t | | ||  ¡|  7 }q|d|  S )aP  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 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d ƒD ]*}||| t | | ||  ¡|  7 }qtj| jd tjd}t | jd ƒD ]V}|| tt | | ||  ¡|d ƒ t| | ||  ƒ t|d|d  ƒ ||< qb|d|  |fS )a^  A weighted version of Minkowski distance with gradient.

    ..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 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,   )r   r   r9   r*   r   r   r   r   r   r
   Úweighted_minkowski_gradö   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   r-   r   r.   r   r   )r   r   Úvinvr   Údiffr   ÚtmpÚjr   r   r
   Úmahalanobis  s    r@   c                 C   sà   d}t j| jd t jd}t| jd ƒD ]}| | ||  ||< q(t  | j¡}t| jd ƒD ]d}d}t| jd ƒD ]<}||||f ||  7 }||  |||f ||  7  < qr||||  7 }q\t  |¡}	|d|	  }
|	|
fS )Nr   r   r   r   )r   r-   r   r.   r   r$   r   )r   r   r<   r   r=   r   Zgrad_tmpr>   r?   Údistr   r   r   r
   Úmahalanobis_grad#  s    "
rB   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
   Úhamming8  s
    
rE   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
   ÚcanberraB  s     rH   c                 C   s¸   d}t  | j¡}t| jd ƒD ]}t  | | ¡t  || ¡ }|dkr|t  | | ||  ¡| 7 }t  | | ||  ¡| t  | | ||  ¡t  | | ¡ |d   ||< q||fS )Nr   r   r   r#   )r   r   r   r   r   rG   r   r   r
   Úcanberra_gradM  s    *ÿÿrI   c                 C   sl   d}d}t | jd ƒD ]8}|t | | ||  ¡7 }|t | | ||  ¡7 }q|dkrdt|ƒ| S dS d S rF   )r   r   r   r!   rD   )r   r   Ú	numeratorrG   r   r   r   r
   Úbray_curtis]  s    rK   c                 C   s”   d}d}t | jd ƒD ]8}|t | | ||  ¡7 }|t | | ||  ¡7 }q|dkr|t|ƒ| }t | | ¡| | }nd}t | j¡}||fS rF   )r   r   r   r!   rD   r   r$   )r   r   rJ   rG   r   rA   r   r   r   r
   Úbray_curtis_gradk  s    rL   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 rF   rC   )r   r   Znum_non_zeroZ	num_equalr   Úx_trueÚy_truer   r   r
   Újaccard}  s    rO   c                 C   sN   d}t | jd ƒD ](}| | dk}|| dk}|||k7 }qt|ƒ| jd  S rF   rC   ©r   r   Únum_not_equalr   rM   rN   r   r   r
   Úmatching  s    rR   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   ç       @©r   r   ©r   r   Únum_true_truerQ   r   rM   rN   r   r   r
   Údice˜  s    rX   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 rF   rC   rV   r   r   r
   Ú	kulsinski¨  s    ÿrY   c                 C   sR   d}t | jd ƒD ](}| | dk}|| dk}|||k7 }qd| | jd |  S rS   rU   rP   r   r   r
   Úrogers_tanimotoº  s    rZ   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 rF   )r   r   r   r1   rD   )r   r   rW   r   rM   rN   r   r   r
   Ú
russellraoÅ  s    $r[   c                 C   sR   d}t | jd ƒD ](}| | dk}|| dk}|||k7 }qd| | jd |  S rS   rU   rP   r   r   r
   Úsokal_michenerÓ  s    r\   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   ç      à?rU   rV   r   r   r
   Úsokal_sneathÞ  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   ú0haversine is only defined for 2 dimensional datar]   r   rT   )r   Ú
ValueErrorr   Úsinr   ÚcosÚarcsin)r   r   Úsin_latÚsin_longr   r   r   r
   Ú	haversineî  s    2rf   c              	   C   s”  | j d dkrtdƒ‚t d| d |d   ¡}t d| d |d   ¡}t d| d |d   ¡}t d| d |d   ¡}t | d tjd  ¡t |d tjd  ¡ |d  }||d  }dt t tt	t
|ƒdƒdƒ¡¡ }t t
|d ƒ¡t t
|ƒ¡ }	t || t | d tjd  ¡t |d tjd  ¡ |d   t | d tjd  ¡t |d tjd  ¡ | | g¡|	d  }
||
fS )Nr   r   r_   r]   r   rT   r   )r   r`   r   ra   rb   Úpirc   r   Úminr&   r!   Úarray)r   r   rd   Zcos_latre   Zcos_longZa_0Za_1r   Zdenomr   r   r   r
   Úhaversine_gradø  s>    8$ ÿþÿÿþýøÿðÿrj   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 rS   rU   )	r   r   rW   Znum_true_falseZnum_false_truer   rM   rN   Znum_false_falser   r   r
   Úyule   s    
ÿrk   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
   Úcosine6  s    ro   c                 C   sÚ   d}d}d}t | jd ƒD ]8}|| | ||  7 }|| | d 7 }||| d 7 }q|dkrv|dkrvd}t | j¡}n\|dks†|dkr˜d}t | j¡}n:| | ||   t |d | ¡ }d|t || ¡  }||fS )Nr   r   r   r   é   ©r   r   r   r$   r   )r   r   r   rm   rn   r   rA   r   r   r   r
   Úcosine_gradH  s     $rr   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 rl   r   )
r   r   Úmu_xÚmu_yrm   rn   Údot_productr   Ú	shifted_xÚ	shifted_yr   r   r
   Úcorrelation_  s*    rx   c                 C   sš   d}d}d}t | jd ƒD ]6}|t | | ||  ¡7 }|| | 7 }||| 7 }q|dkrf|dkrfdS |dksv|dkrzdS t d|t || ¡  ¡S d S )Nr   r   r   r   r   )r   r   r   Ú	l1_norm_xÚ	l1_norm_yr   r   r   r
   Ú	hellinger}  s    r{   c                 C   s
  d}d}d}t  | jd ¡}t| jd ƒD ]B}t  | | ||  ¡||< ||| 7 }|| | 7 }||| 7 }q*|dkr|dkrd}t  | j¡}nr|dks |dkr²d}t  | j¡}nPt  || ¡}	t  d||	  ¡}d| }
|| d|	d   }||| |	  |
 }||fS )Nr   r   r   r   r   rp   )r   r-   r   r   r   r$   )r   r   r   ry   rz   Z	grad_termr   rA   r   Z
dist_denomZ
grad_denomZgrad_numer_constr   r   r
   Úhellinger_grad  s*    r|   c                 C   sB   | dkrdS | t  | ¡ |  dt  dt j |  ¡  d| d   S )Nr   r   r]   rT   r   g      (@©r   Úlogrg   ©r   r   r   r
   Úapprox_log_Gamma¯  s    r€   c                 C   s|   t | |ƒ}t| |ƒ}|dk r\t |¡ }tdt|ƒƒD ] }|t |¡t || ¡ 7 }q6|S t| ƒt|ƒ t| | ƒ S d S )Né   r   )rh   r&   r   r~   r   Úintr€   )r   r   r	   ÚbÚvaluer   r   r   r
   Úlog_beta»  s    

r…   c                 C   s6   t  d¡d|  d  dt  dt j |  ¡  d|   S )NrT   g       Àr]   g      À?r}   r   r   r   r
   Úlog_single_betaÈ  s    r†   c                 C   s  t  | ¡}t  |¡}d}d}d}t| jd ƒD ]ˆ}| | ||  dkr~|t| | || ƒ7 }|t| | ƒ7 }|t|| ƒ7 }q.| | dkrš|t| | ƒ7 }|| dkr.|t|| ƒ7 }q.t  d| |t||ƒ |t|ƒ   d| |t||ƒ |t|ƒ    ¡S )zÑThe symmetric relative log likelihood of rolling data2 vs data1
    in n trials on a die that rolled data1 in sum(data1) trials.

    ..math::
        D(data1, data2) = DirichletMultinomail(data2 | data1)
    r   r   gÍÌÌÌÌÌì?r   )r   r1   r   r   r…   r†   r   )Zdata1Zdata2Zn1Zn2Zlog_bZself_denom1Zself_denom2r   r   r   r
   Úll_dirichletÕ  s&    	

  ÿÿr‡   ç•dyáý¥=c           	      C   sì   | j d }d}d}d}d}t|ƒD ]<}| |  |7  < || | 7 }||  |7  < ||| 7 }q"t|ƒD ]$}| |  |  < ||  |  < qht|ƒD ]H}|| | t | | ||  ¡ 7 }||| t || | |  ¡ 7 }q–|| d S )z¯
    symmetrized KL divergence between two probability distributions

    ..math::
        D(x, y) = \frac{D_{KL}\left(x \Vert y\right) + D_{KL}\left(y \Vert x\right)}{2}
    r   r   r   ©r   r   r   r~   )	r   r   ÚzÚnÚx_sumÚy_sumÚkl1Úkl2r   r   r   r
   Úsymmetric_klø  s"    
"$r   c                 C   s  | j d }d}d}d}d}t|ƒD ]<}| |  |7  < || | 7 }||  |7  < ||| 7 }q"t|ƒD ]$}| |  |  < ||  |  < qht|ƒD ]H}|| | t | | ||  ¡ 7 }||| t || | |  ¡ 7 }q–|| d }	t ||  ¡| |  d d }
|	|
fS )z5
    symmetrized KL divergence and its gradient

    r   r   r   r   r‰   )r   r   rŠ   r‹   rŒ   r   rŽ   r   r   rA   r   r   r   r
   Úsymmetric_kl_grad  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}
t | j¡}nL|dkrèd}
t | j¡}n2d|t || ¡  }
| | | || |  |
 }|
|fS rl   rq   )r   r   rs   rt   rm   rn   ru   r   rv   rw   rA   r   r   r   r
   Úcorrelation_grad7  s2    r’   é@   c                 C   s   | |   ¡   tj¡}||  ¡   tj¡}tj|jtjd}tj|jtjd}t|ƒD ]V}	|| }
||
dk |
|
dk  ||
dk< |j| }
||
dk |
|
dk  ||
dk< qTt |¡| t |¡ }d}t|jd ƒD ]D}t|jd ƒD ]0}|||f dkrè||||f |||f  7 }qèqÖ|S )Nr   r   r   r   )	r1   Úastyper   r.   Úonesr   r   ÚTZdiag)r   r   ÚMZcostÚmaxiterr*   Úqr3   r(   r‹   r6   rg   r   r   r?   r   r   r
   Úsinkhorn_distanceZ  s      
" rš   c                 C   sÖ   | d |d  }| d |d  }t  | d ¡t  |d ¡ }t  | d ¡}|d |d  d|  t  |¡ t  dt j ¡ }t  dt j¡}|| |d< || |d< |d| |d |d  d|d     |d< ||fS )Nr   r   r   rp   r   )r   r!   r   r~   rg   r-   r.   )r   r   Úmu_1Úmu_2r   Z
sign_sigmarA   r   r   r   r
   Úspherical_gaussian_energy_gradt  s    2,r   c                 C   sÄ  | d |d  }| d |d  }t  | d ¡t  |d ¡ }d}t  | d ¡t  |d ¡ }|| }t  | d ¡}t  | d ¡}	|dkr°|d |d  t jddddgt jdfS d| }
t  |¡|d  |
| |  t  |¡|d   }|| t  t  |¡¡ d t  dt j ¡ }t jd	t jd}d| | |
|  d|  |d< d| | |
|  d|  |d< ||||  ||d    d|d   |d< |	|||  ||d    d|d   |d< ||fS )
Nr   r   r   r   rp   r   r   rT   é   )r   r!   r   ri   r.   r~   rg   r-   )r   r   r›   rœ   Úsigma_11Úsigma_12Úsigma_22ZdetZsign_s1Zsign_s2Z
cross_termZm_distrA   r   r   r   r
   Údiagonal_gaussian_energy_grad†  s0    (
ÿþÿ,  ,,r¢   c              
   C   s0  | d |d  }| d |d  }t  | d ¡| d< t  |d ¡|d< t  | d ¡| d< t  |d ¡|d< t  t  | d ¡¡| d< t  t  |d ¡¡|d< |d t  |d ¡d  |d t  |d ¡d   }|d |d  t  |d ¡ t  |d ¡ }|d t  |d ¡d  |d t  |d ¡d   }| d t  | d ¡d  | d t  | d ¡d   | }| d | d  t  | d ¡ t  | d ¡ | }| d t  | d ¡d  | d t  | d ¡d   | }	t  ||	 |d  ¡}
|	|d  d| | |  ||d   }|
dk r>|d |d  t jdddddgt jd	fS ||
 t  |
¡ t  dt j ¡ }t  	d
t j¡}d|	 | d| |  |
 |d< d| | d| |  |
 |d< ||t  | d ¡d  |t  | d ¡ t  | d ¡   |d< |d  ||t  | d ¡d  |t  | d ¡ t  | d ¡   7  < |d  |
9  < |d  |t  | d ¡d  |	 8  < |d  |t  | d ¡d  | 8  < |d  |d | t  | d ¡ t  | d ¡ 7  < |d  |
d d   < ||t  | d ¡d  |t  | d ¡ t  | d ¡   |d< |d  ||t  | d ¡d  |t  | d ¡ t  | d ¡   7  < |d  |
9  < |d  |t  | d ¡d  |	 8  < |d  |t  | d ¡d  | 8  < |d  |d | t  | d ¡ t  | d ¡ 8  < |d  |
d d   < | d | d  d| | t  d| d  ¡ |d |d  t  d| d  ¡   |d< |d  |
9  < |d  || d | d   t  d| d  ¡ |	 8  < |d  || d | d   t  d| d  ¡ | 8  < |d  |d | | d | d   t  d| d  ¡ 8  < |d  |
d d   < ||fS )Nr   r   r   rp   é   g3§¨Õ#öI9r   r   r   r   g:Œ0âŽyE>)
r   r!   rc   ra   rb   ri   r.   r~   rg   r$   )r   r   r›   rœ   r	   rƒ   ÚcrŸ   r    r¡   Z	det_sigmaZx_inv_sigma_y_numeratorrA   r   r   r   r
   Úgaussian_energy_grad©  s`    4,4808&ÿ
þ"  >F&&4>F&&4>ÿ66:r¥   c                 C   s  | d |d  }| d |d  }| d |d  }t  |¡}|dkr\dt jdddgt jdfS |d |d  t  |¡ dt  t  |¡¡  t  dt j ¡ }t jdt jd}d| t  |¡ |d< d| t  |¡ |d< ||d |d   |d  dt  |¡   |d< ||fS )	Nr   r   r   g      $@r   g      ð¿r   rp   )r   r   ri   r.   r!   r~   rg   r-   )r   r   r›   rœ   r   Z
sigma_signrA   r   r   r   r
   Úspherical_gaussian_gradò  s&    
ÿþÿ&ÿr¦   c           	      C   sº   |dkr$dt |  ¡ |  ¡  ƒd iS |dkrltj | ¡}tj | ¡}tj | ¡}t|||d}||d dœS |dkr²t	 
dd	„ | D ƒ¡}tj |¡}|d
 }|d }||d dœS i S d S )NÚordinalÚsupport_sizerT   Úcount)Úpoisson_lambda)rª   ÚnormalisationÚstringc                 S   s   g | ]}t |ƒ‘qS r   )Úlen)Ú.0r   r   r   r
   Ú
<listcomp>  s     z'get_discrete_params.<locals>.<listcomp>g      ø?)r«   Úmax_dist)rD   r&   rh   ÚscipyZstatsZtminZtmaxZtmeanÚcount_distancer   ri   )	ÚdataÚmetricZ	min_countZ	max_countZlambda_r«   ZlengthsZ
max_lengthr°   r   r   r
   Úget_discrete_params  s"    þrµ   c                 C   s   | |krdS dS d S )Nr   r   r   )r   r   r   r   r
   Úcategorical_distance'  s    r¶   c                 C   sB   t t|ƒƒ}t|ƒD ](\}}||  || krt |ƒ|   S qdS )Nr   )rD   r­   Ú	enumerate)r   r   Zcat_hierarchyZn_levelsÚlevelZcatsr   r   r
   Ú!hierarchical_categorical_distance/  s
    r¹   c                 C   s   t | | ƒ| S ©N)r!   )r   r   r¨   r   r   r
   Úordinal_distance9  s    r»   c           
      C   sª   t t| |ƒƒ}t t| |ƒƒ}t |¡}|dk r4d}n8|dk r`d}td|ƒD ]}|t |¡7 }qJnt|d ƒ}d}	t||ƒD ]&}|	|| | | 7 }	|t |¡7 }qz|	| S )Nr   r   é
   r   )r‚   rh   r&   r   r~   r   r€   )
r   r   rª   r«   ÚloÚhiZ
log_lambdaZlog_k_factorialÚkr   r   r   r
   r²   >  s    
r²   é   c                 C   sì   t | ƒt |ƒ }}t|| ƒ|kr2t|| ƒ| S t |d ¡ tj¡}t |d ¡}t|ƒD ]€}|d ||< t|ƒD ]H}	||	d  d }
||	 d }t| | ||	 kƒ}t	|
||ƒ||	d < qv|}t 	|¡|kr^||   S q^|| | S )Nr   )
r­   r!   r   Zaranger”   Úfloat64r$   r   r‚   rh   )r   r   r«   Zmax_distanceZx_lenZy_lenZv0Zv1r   r?   Zdeletion_costZinsertion_costZsubstitution_costr   r   r
   ÚlevenshteinW  s     rÂ   )'r   Úl2r"   ÚtaxicabÚl1r'   Ú	linfinityÚlinftyÚlinfr+   r4   Ú
seuclideanr   Ú
wminkowskir:   r@   rH   ro   rx   r{   rf   Ú
braycurtisr‡   r   rE   rO   rX   rR   rY   Zrogerstanimotor[   ZsokalsneathZsokalmichenerrk   Úcategoricalr§   Úhierarchical_categoricalr©   r¬   )r   rÃ   r"   rÄ   rÅ   r'   rÆ   rÇ   rÈ   r+   rÉ   r   rÊ   r:   r@   rH   ro   rx   r{   rf   rË   r   Zspherical_gaussian_energyZdiagonal_gaussian_energyZgaussian_energyZhyperboloid)rÌ   rÍ   r§   r©   r¬   )Úparallelc                 C   sà   |d kr€t  | jd | jd f¡}t| jd ƒD ]L}t|d | jd ƒD ]2}|| | | | ƒ|||f< |||f |||f< qHq0n\t  | jd |jd f¡}t| jd ƒD ]2}t|jd ƒD ]}|| | || ƒ|||f< qºq¨|S )Nr   r   )r   r$   r   r   )ÚXÚYr´   r   r   r?   r   r   r
   Úparallel_special_metricÚ  s    rÑ   )rÎ   Znogilé   c                 C   sò   |d kr"| d }}| j d  }}n |d }}| j d |j d  }}tj||ftjd}|| d }	t |	¡D ]€}
|
| }t|| |ƒ}|rŽ|nd}t|||ƒD ]L}t|| |ƒ}t||ƒD ].}t||ƒD ]}|| | || ƒ|||f< qÈqºqžql|S )NTr   Fr   r   )r   r   r$   r.   ÚnumbaZprangerh   r   )rÏ   rÐ   r´   Z
chunk_sizeZXXZsymmetricalZrow_sizeZcol_sizer   Zn_row_chunksZ	chunk_idxr‹   Zchunk_end_nZm_startÚmZchunk_end_mr   r?   r   r   r
   Úchunked_parallel_special_metricï  s"    

"rÕ   c                    sd   t ˆƒrN|d k	rt| ¡ ƒ‰ nd‰ tjddd‡ ‡fdd„	ƒ}t| |||dS tˆ }t| ||dS )	Nr   Tr   c                    s   ˆ| |fˆ žŽ S rº   r   )Z_XZ_Y©Zkwd_valsr´   r   r
   Ú_partial_metric  s    z0pairwise_special_metric.<locals>._partial_metric)r´   Úforce_all_finite)r´   )N)ÚcallableÚtupleÚvaluesrÓ   Únjitr   Únamed_distancesrÑ   )rÏ   rÐ   r´   ÚkwdsrØ   r×   Zspecial_metric_funcr   rÖ   r
   Úpairwise_special_metric  s    
rß   )r   )r   )rˆ   )rˆ   )r   )r   r   )r   rÀ   )Nr{   NT)MrÓ   Znumpyr   Zscipy.statsr±   Zsklearn.metricsr   ZeyerÁ   Z_mock_identityZ
_mock_costr•   Z
_mock_onesrÜ   r   r   r   r   r   r"   r%   r'   r)   r+   r0   r4   r8   r:   r;   r@   rB   rE   rH   rI   rK   rL   rO   rR   rX   rY   rZ   r[   r\   r^   rf   rj   rk   ro   rr   rx   r{   r|   r€   r…   r†   r‡   r   r‘   r’   rš   r   r¢   r¥   r¦   rµ   r¶   r¹   r»   r²   rÂ   rÝ   Znamed_distances_with_gradientsZDISCRETE_METRICSZSPECIAL_METRICSrÑ   rÕ   rß   r   r   r   r
   Ú<module>   s”  












	
















	
'










"


"
  ÿ



"

H


	 Ô1â!	ø
