U
    Åmœd‡  ã                (   @   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  ¡ ddydz„ƒ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é   ©Zdtypeç      ð?c                 C   s   | dk rdS dS d S )Nr   éÿÿÿÿé   © )Úar   r   úG/home/sam/Atlas/atlas_env/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   ÚsumÚpowerÚarccosh)Úur(   Z	sq_u_normZ	sq_v_normZsq_distr   r   r
   Úpoincare¿   s    r5   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$   r3   )r   r   ÚsÚtÚBr   Z
grad_coeffr   r   r   r
   Úhyperboloid_gradÍ   s     "r9   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   r-   r   r.   r   r   )r   r   Úvinvr   Údiffr   ÚtmpÚjr   r   r
   Úmahalanobis  s    rA   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    "
rC   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
    
rF   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     rI   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   rH   r   r   r
   Úcanberra_gradM  s    *ÿÿrJ   c                 C   sl   d}d}t | jd ƒD ]8}|t | | ||  ¡7 }|t | | ||  ¡7 }q|dkrdt|ƒ| S dS d S rG   )r   r   r   r!   rE   )r   r   Ú	numeratorrH   r   r   r   r
   Úbray_curtis]  s    rL   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 rG   )r   r   r   r!   rE   r   r$   )r   r   rK   rH   r   rB   r   r   r   r
   Úbray_curtis_gradk  s    rM   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 rG   rD   )r   r   Znum_non_zeroZ	num_equalr   Úx_trueÚy_truer   r   r
   Újaccard}  s    rP   c                 C   sN   d}t | jd ƒD ](}| | dk}|| dk}|||k7 }qt|ƒ| jd  S rG   rD   ©r   r   Únum_not_equalr   rN   rO   r   r   r
   Úmatching  s    rS   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_truerR   r   rN   rO   r   r   r
   Údice˜  s    rY   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 rG   rD   rW   r   r   r
   Ú	kulsinski¨  s    ÿrZ   c                 C   sR   d}t | jd ƒD ](}| | dk}|| dk}|||k7 }qd| | jd |  S rT   rV   rQ   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 rG   )r   r   r   r1   rE   )r   r   rX   r   rN   rO   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 rT   rV   rQ   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   ç      à?rV   rW   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   rU   )r   Ú
ValueErrorr   Úsinr   ÚcosÚarcsin)r   r   Úsin_latÚsin_longr   r   r   r
   Ú	haversineî  s    2rg   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   rU   r   )r   ra   r   rb   rc   Úpird   r   Úminr&   r!   Úarray)r   r   re   Zcos_latrf   Zcos_longZa_0Za_1r   Údenomr   r   r   r
   Úhaversine_gradø  s>    8$ ÿþÿÿþýøÿðÿrl   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 rT   rV   )	r   r   rX   Znum_true_falseZnum_false_truer   rN   rO   Znum_false_falser   r   r
   Úyule   s    
ÿrm   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    rq   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   ro   rp   r   rB   r   r   r   r
   Úcosine_gradH  s     $rt   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 rn   r   )
r   r   Úmu_xÚmu_yro   rp   Údot_productr   Ú	shifted_xÚ	shifted_yr   r   r
   Úcorrelation_  s*    rz   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   rr   )r   r-   r   r   r   r$   )r   r   r   r{   r|   Z	grad_termr   rB   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^   rU   r   g      (@©r   Úlogrh   ©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   )ri   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 )NrU   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   rB   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 rn   rs   )r   r   ru   rv   ro   rp   rw   r   rx   ry   rB   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*   Úqr4   r(   r   r7   rh   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   rr   r   )r   r!   r   r€   rh   r-   r.   )r   r   Úmu_1Úmu_2r   Z
sign_sigmarB   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   rr   r   r   rU   é   )r   r!   r   rj   r.   r€   rh   r-   )r   r   r   rž   Úsigma_11Úsigma_12Úsigma_22ZdetZsign_s1Zsign_s2Z
cross_termZm_distrB   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   rr   é   g3§¨Õ#öI9r   r   r   rƒ   g:Œ0âŽyE>)
r   r!   rd   rb   rc   rj   r.   r€   rh   r$   )r   r   r   rž   r	   r…   Úcr¡   r¢   r£   Z	det_sigmaZx_inv_sigma_y_numeratorrB   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   rr   )r   r   rj   r.   r!   r€   rh   r-   )r   r   r   rž   r   Z
sigma_signrB   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_sizerU   Ú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)rE   r&   ri   ÚscipyÚstatsZtminZtmaxZtmeanÚcount_distancer   rj   )	ÚdataÚmetricZ	min_countÚ	max_countZ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   )rE   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„   ri   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„   ri   )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+   r5   Ú
seuclideanr   Ú
wminkowskir;   rA   rI   rq   rz   r}   rg   Ú
braycurtisr‰   r’   rF   rP   rY   rS   rZ   Zrogerstanimotor\   ZsokalsneathZsokalmichenerrm   Úcategoricalr©   Úhierarchical_categoricalr«   r®   )r   rÉ   r"   rÊ   rË   r'   rÌ   rÍ   rÎ   r+   rÏ   r   rÐ   r;   rA   rI   rq   rz   r}   rg   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prangeri   r   )rÕ   rÖ   r·   Ú
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                    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   Zscipy.statsr³   Zsklearn.metricsr   ÚeyerÇ   Z_mock_identityZ
_mock_costr—   Z
_mock_onesrâ   r   r   r   r   r   r"   r%   r'   r)   r+   r0   r5   r9   r;   r<   rA   rC   rF   rI   rJ   rL   rM   rP   rS   rY   rZ   r[   r\   r]   r_   rg   rl   rm   rq   rt   rz   r}   r~   r‚   r‡   rˆ   r‰   r’   r“   r”   rœ   rŸ   r¤   r§   r¨   r»   Zjitr¼   r¿   rÁ   rµ   rÈ   rã   Znamed_distances_with_gradientsZDISCRETE_METRICSZSPECIAL_METRICSr×   rÜ   rå   r   r   r   r
   Ú<module>   s”  












	

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








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