U
    Õ½|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  A¡ dpdq„ ƒZBe  A¡ i gfdrds„ƒZCe  ¡ d‹dtdu„ƒZDe  A¡ dŒdvdw„ƒZEe  ¡ d�dydz„ƒZFe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.eBeDeCeEeFd{œ'ZGeeeeeeeeeeeeeeee!e0e:e3e-e#e9e<e=e>ed|œZHd}ZIdQd[d^de2e7e8efZJe jdd~�de2fdd€„ƒZKe jddd��de2d‚fdƒd„„ƒZLdŽd…d†„ZMdS )�é    N)Úpairwise_distancesé   ©Údtypeç      ð?c                 C   s   | dk rdS dS d S )Nr   éÿÿÿÿé   © )Úar	   r	   úK/var/www/website-v5/atlas_env/lib/python3.8/site-packages/umap/distances.pyÚsign   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   ©Ú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   Ú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     ÿþÿr3   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   ÚsumÚpowerÚarccosh)Úur+   Z	sq_u_normZ	sq_v_normZsq_distr	   r	   r   Úpoincare¿   s    r8   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   r4   r   r   r&   r6   )r   r   ÚsÚtÚBr   Z
grad_coeffr   r	   r	   r   Úhyperboloid_gradÍ   s     "r<   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   r=   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   r0   r   r1   r   r   )r   r   Úvinvr   Údiffr   ÚtmpÚjr	   r	   r   Úmahalanobis  s    rD   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   r0   r   r1   r   r&   r   )r   r   r@   r   rA   r   Zgrad_tmprB   rC   Údistr   r	   r	   r   Úmahalanobis_grad#  s    "
rF   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
    
rI   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     rL   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   rK   r	   r	   r   Úcanberra_gradM  s    *ÿÿrM   c                 C   sl   d}d}t | jd ƒD ]8}|t | | ||  ¡7 }|t | | ||  ¡7 }q|dkrdt|ƒ| S dS d S rJ   )r   r   r   r#   rH   )r   r   Ú	numeratorrK   r   r	   r	   r   Úbray_curtis]  s    rO   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 rJ   )r   r   r   r#   rH   r   r&   )r   r   rN   rK   r   rE   r   r	   r	   r   Úbray_curtis_gradk  s    rP   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 rJ   rG   )r   r   Znum_non_zeroZ	num_equalr   Úx_trueÚy_truer	   r	   r   Újaccard}  s    rS   c                 C   sN   d}t | jd ƒD ](}| | dk}|| dk}|||k7 }qt|ƒ| jd  S rJ   rG   ©r   r   Únum_not_equalr   rQ   rR   r	   r	   r   Úmatching�  s    rV   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_truerU   r   rQ   rR   r	   r	   r   Údice˜  s    r\   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 rJ   rG   rZ   r	   r	   r   Ú	kulsinski¨  s    ÿr]   c                 C   sR   d}t | jd ƒD ](}| | dk}|| dk}|||k7 }qd| | jd |  S rW   rY   rT   r	   r	   r   Úrogers_tanimotoº  s    r^   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 rJ   )r   r   r   r4   rH   )r   r   r[   r   rQ   rR   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 rW   rY   rT   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   ç      à?rY   rZ   r	   r	   r   Úsokal_sneathÞ  s    rb   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 datara   r   rX   )r   Ú
ValueErrorr   Úsinr   ÚcosÚarcsin)r   r   Úsin_latÚsin_longr   r	   r	   r   Ú	haversineî  s    2rj   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   rc   ra   r   rX   r   )r   rd   r   re   rf   Úpirg   r   Úminr(   r#   Úarray)r   r   rh   Zcos_latri   Zcos_longZa_0Za_1r   Údenomr   r	   r	   r   Úhaversine_gradø  s>    8$ ÿþÿÿþýøÿðÿro   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 rW   rY   )	r   r   r[   Znum_true_falseZnum_false_truer   rQ   rR   Znum_false_falser	   r	   r   Úyule   s    
ÿrp   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    rt   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   rr   rs   r   rE   r   r	   r	   r   Úcosine_gradH  s     $rw   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 rq   r   )
r   r   Úmu_xÚmu_yrr   rs   Údot_productr   Ú	shifted_xÚ	shifted_yr	   r	   r   Úcorrelation_  s*    r}   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r�d}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   ru   )r   r0   r   r   r   r&   )r   r   r   r~   r   Z	grad_termr   rE   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   ra   rX   r   g      (@©r   Úlogrk   ©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   )rl   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 )NrX   g       Àra   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   r4   r   r   rŠ   r‹   r   )Údata1Údata2Ún1Ún2Ú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   rE   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 rq   rv   )r   r   rx   ry   rr   rs   rz   r   r{   r|   rE   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   )	r4   Úastyper   r1   Úonesr   r   ÚTÚdiag)r   r   ÚMÚcostÚmaxiterr-   Úqr7   r+   r•   r:   rk   r   r   rC   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   ru   r   )r   r#   r   rƒ   rk   r0   r1   )r   r   Úmu_1Úmu_2r   Z
sign_sigmarE   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   ru   r   r   rX   é   )r   r#   r   rm   r1   rƒ   rk   r0   )r   r   r§   r¨   Úsigma_11Úsigma_12Úsigma_22ÚdetZsign_s1Zsign_s2Z
cross_termZm_distrE   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   ru   é   g3§¨Õ#öI9r   r   r   r†   g:Œ0âŽyE>)
r   r#   rg   re   rf   rm   r1   rƒ   rk   r&   )r   r   r§   r¨   r
   rˆ   Úcr«   r¬   r­   Z	det_sigmaZx_inv_sigma_y_numeratorrE   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   ru   )r   r   rm   r1   r#   rƒ   rk   r0   )r   r   r§   r¨   r   Z
sigma_signrE   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_sizerX   Ú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)rH   r(   rl   ÚscipyÚstatsÚtminÚtmaxÚtmeanÚcount_distancer   rm   )	ÚdataÚmetricZ	min_countÚ	max_countÚlambda_r¸   ÚlengthsÚ
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   )rH   rº   Ú	enumerate)r   r   Zcat_hierarchyZn_levelsÚlevelÚ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‡   rl   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   Úarangerž   Úfloat64r&   r   r‡   rl   )r   r   r¸   Úmax_distanceZx_lenZy_lenÚv0Úv1r   rC   Zdeletion_costZinsertion_costZsubstitution_costr	   r	   r   ÚlevenshteinW  s     rÜ   )'r   Úl2r$   ÚtaxicabÚl1r)   Ú	linfinityÚlinftyÚlinfr.   r8   Ú
seuclideanr    Ú
wminkowskir>   rD   rL   rt   r}   r€   rj   Ú
braycurtisr‘   rš   rI   rS   r\   rV   r]   Úrogerstanimotor_   ÚsokalsneathÚsokalmichenerrp   Úcategoricalr´   Úhierarchical_categoricalr¶   r¹   )r   rÝ   r$   rÞ   rß   r)   rà   rá   râ   r.   rã   r    rä   r>   rD   rL   rt   r}   r€   rj   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   rC   r	   r	   r   Úparallel_special_metricÚ  s    rî   )rë   Ú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&   r1   ÚnumbaÚprangerl   r   )rì   rí   rÅ   Ú
chunk_sizeÚXXÚsymmetricalZrow_sizeZcol_sizer   Zn_row_chunksZ	chunk_idxr•   Zchunk_end_nÚm_startÚmZchunk_end_mr   rC   r	   r	   r   Úchunked_parallel_special_metricï  s"    

"rø   c                    sb   t ˆƒrL|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Å   )N)ÚcallableÚtupleÚvaluesrñ   Únjitr   Únamed_distancesrî   )rì   rí   rÅ   Úkwdsrú   Zspecial_metric_funcr	   rù   r   Úpairwise_special_metric  s    
r  )r   )r   )r’   )r’   )r   )r   r   )r   rÖ   )Nr€   N)Nrñ   Únumpyr   Úscipy.statsr¾   Úsklearn.metricsr   ÚeyerØ   Z_mock_identityZ
_mock_costrŸ   Z
_mock_onesrþ   r   r   r   r    r!   r$   r'   r)   r,   r.   r3   r8   r<   r>   r?   rD   rF   rI   rL   rM   rO   rP   rS   rV   r\   r]   r^   r_   r`   rb   rj   ro   rp   rt   rw   r}   r€   r�   r…   rŠ   r‹   r‘   rš   r›   rœ   r¦   r©   r¯   r²   r³   rÊ   ÚjitrË   rÏ   rÑ   rÃ   rÜ   rÿ   Únamed_distances_with_gradientsÚDISCRETE_METRICSZSPECIAL_METRICSrî   rø   r  r	   r	   r	   r   Ú<module>   s”  












	

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








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