
    WiՆ                        d dl Z d dlZd dlZd dlmZ  ej                  dej                        Z	de	z
  Z
 ej                  dej                        Z e j                         d        Z e j                  d      d	        Z e j                  d      d
        Z e j                         efd       Z e j                  d      efd       Z e j                         d        Z e j                         d        Z e j                         d        Z e j                         d        Z e j                         dld       Z e j                         dld       Z e j                         d        Z e j                         d        Z e j                         edfd       Z e j                         edfd       Z e j                         e	fd       Z e j                         e	fd       Z e j                         d        Z e j                         d        Z  e j                         d        Z! e j                         d        Z" e j                         d        Z# e j                         d        Z$ e j                         d        Z% e j                         d         Z& e j                         d!        Z' e j                         d"        Z( e j                         d#        Z) e j                         d$        Z* e j                         d%        Z+ e j                         d&        Z, e j                         d'        Z- e j                         d(        Z. e j                         d)        Z/ e j                  d      d*        Z0 e j                         d+        Z1 e j                         d,        Z2 e j                         d-        Z3 e j                         d.        Z4 e j                         d/        Z5 e j                         d0        Z6 e j                         d1        Z7 e j                  d      dmd2       Z8 e j                  d      dmd3       Z9 e j                         d4        Z: e j                  d      e	e
d5fd6       Z; e j                  d      d7        Z< e j                  d      d8        Z= e j                  d      d9        Z> e j                  d      d:        Z?d; Z@ e j                         d<        ZA e j                         i gfd=       ZB e j                         dnd>       ZC e j                         dod?       ZD e j                         dpd@       ZEi dAedBedCedDedEedFedGedHedIedJedKedLedMedNedOedPedQe i dRe/dSe1dTe2dUe,dVe"dWe7dXe8dYedZe$d[e&d\e%d]e'd^e(d_e)d`e+dae*dbe.eAeCeBeDeEdcZFi dAedBedCedDedEedFedGedHedIedJedLedMedNedOedPedQe!dRe0e:e3e-e#e9e<e=e>edd	ZGdeZHdTdWdXdKe2e7e8efZI e j                  df      de2fdg       ZJ e j                  ddh      de2difdj       ZK	 dqdkZLy)r    N)pairwise_distances   dtype      ?c                     | dk  ryy)Nr       )as    Z/home/sietch6/trending-topics-pipeline/venv/lib/python3.12/site-packages/umap/distances.pysignr      s    1u    Tfastmathc                     d}t        | j                  d         D ]  }|| |   ||   z
  dz  z  } t        j                  |      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is       r   	euclideanr      sN     F1771: %1Q4!A$;1$$%776?r   c                     d}t        | j                  d         D ]  }|| |   ||   z
  dz  z  } t        j                  |      }| |z
  d|z   z  }||fS )zStandard 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grads         r   euclidean_gradr#   #   sh     F1771: %1Q4!A$;1$$%
AEdQhDd7Nr   c                     d}t        | j                  d         D ]  }|| |   ||   z
  dz  ||   z  z  } t        j                  |      S )zEuclidean distance standardised against a vector of standard
    deviations per coordinate.

    ..math::
        D(x, y) = \sqrt{\sum_i \frac{(x_i - y_i)**2}{v_i}}
    r   r   r   r   )r   r   sigmar   r   s        r   standardised_euclideanr&   3   sY     F1771: 2AaD1Q4KA%q112 776?r   c                     d}t        | j                  d         D ]  }|| |   ||   z
  dz  ||   z  z  } t        j                  |      }| |z
  d||z  z   z  }||fS )zEuclidean 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"   s          r   standardised_euclidean_gradr(   B   sv     F1771: 01Q4!A$;1$uQx//0
AEdQY&'Dd7Nr   c                     d}t        | j                  d         D ]#  }|t        j                  | |   ||   z
        z  }% |S )z[Manhattan, taxicab, or l1 distance.

    ..math::
        D(x, y) = \sum_i |x_i - y_i|
    r   r   r   r   r   absr   s       r   	manhattanr,   R   sK     F1771: &"&&1!%%& Mr   c                 
   d}t        j                  | j                        }t        | j                  d         D ]D  }|t        j                  | |   ||   z
        z  }t        j
                  | |   ||   z
        ||<   F ||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   s        r   manhattan_gradr0   `   s     F88AGGD1771: '"&&1!%%''!A$1+&Q' 4<r   c           	          d}t        | j                  d         D ]*  }t        |t        j                  | |   ||   z
              }, |S )zYChebyshev or l-infinity distance.

    ..math::
        D(x, y) = \max_i |x_i - y_i|
    r   r   )r   r   maxr   r+   r   s       r   	chebyshevr3   o   sM     F1771: 2VRVVAaD1Q4K012 Mr   c                    d}d}t        | j                  d         D ]*  }t        j                  | |   ||   z
        }||kD  s'|}|}, t        j                  | j                        }t        j
                  | |   ||   z
        ||<   ||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"   s          r   chebyshev_gradr7   }   s     FE1771: FF1Q4!A$;v:FE	
 88AGGD''!E(QuX-.DK4<r   c                     d}t        | j                  d         D ]&  }|t        j                  | |   ||   z
        |z  z  }( |d|z  z  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   s        r   	minkowskir:      sZ     F1771: -266!A$1+&1,,- cAgr   c                    d}t        | j                  d         D ]&  }|t        j                  | |   ||   z
        |z  z  }( t        j                  | j                  d   t        j
                        }t        | j                  d         D ]X  }t        t        j                  | |   ||   z
        |dz
        t        | |   ||   z
        z  t        |d|dz
  z        z  ||<   Z |d|z  z  |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   r9   r   r   r"   s         r   minkowski_gradr@      s     F1771: -266!A$1+&1,,- 88AGGAJbjj1D1771: 
qtad{#a#g/1Q4!A$; &3!a%=*+ 	Q
 cAg$$r   c                    t        j                  | | z        }t        j                  ||z        }t        j                  t        j                  | |z
  d            }t        j                  dd|d|z
  d|z
  z  z  z  z         S )zPoincare 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)ur6   	sq_u_norm	sq_v_normsq_dists        r   poincarerI      sn     q1uIq1uIffRXXa!eQ'(G::a!w1y=Q]*KLMMNNr   c                 j   t        j                  dt        j                  | dz        z         }t        j                  dt        j                  |dz        z         }||z  }t        | j                  d         D ]  }|| |   ||   z  z  } |dk  rd}dt        j                  |dz
        t        j                  |dz         z  z  }t        j
                  | j                  d         }t        | j                  d         D ]  }|| |   |z  |z  ||   z
  z  ||<    t        j                  |      |fS )Nr
   r   r   g1  ?r   )r   r   rB   r   r   r/   rD   )r   r   stBr   
grad_coeffr"   s           r   hyperboloid_gradrO      s   
BFF1a4L !A
BFF1a4L !A	AA1771: 	QqTAaD[ 	AvAQ78J 88AGGAJD1771: 9!A$(a1Q4 78Q9 ::a=$r   c                     d}t        | j                  d         D ],  }|||   t        j                  | |   ||   z
        |z  z  z  }. |d|z  z  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   wr9   r   r   s         r   weighted_minkowskirR      sc     F1771: 2!A$!qt,1112 cAgr   c           	         d}t        | j                  d         D ],  }|||   t        j                  | |   ||   z
        |z  z  z  }. t        j                  | j                  d   t        j
                        }t        | j                  d         D ]^  }||   t        t        j                  | |   ||   z
        |dz
        z  t        | |   ||   z
        z  t        |d|dz
  z        z  ||<   ` |d|z  z  |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   rQ   r9   r   r   r"   s          r   weighted_minkowski_gradrT      s    F1771: 4!A$"&&1!-!3334 88AGGAJbjj1D1771: 
aD"&&1!%C121Q4!A$;  &3!a%=*+ 	Q
 cAg$$r   c                    d}t        j                  | j                  d   t         j                        }t	        | j                  d         D ]  }| |   ||   z
  ||<    t	        | j                  d         D ]<  }d}t	        | j                  d         D ]  }||||f   ||   z  z  } ||||   z  z  }> t        j
                  |      S )Nr   r   r   )r   r=   r   r>   r   r   )r   r   vinvr   diffr   tmpjs           r   mahalanobisrZ     s    F88AGGAJbjj1D1771: A$1+Q 1771:  qwwqz" 	(A41:Q''C	(#Q-	  776?r   c                    d}t        j                  | j                  d   t         j                        }t	        | j                  d         D ]  }| |   ||   z
  ||<    t        j
                  | j                        }t	        | j                  d         D ]T  }d}t	        | j                  d         D ]*  }||||f   ||   z  z  }||xx   |||f   ||   z  z  cc<   , ||||   z  z  }V t        j                  |      }	|d|	z   z  }
|	|
fS )Nr   r   r   r    )r   r=   r   r>   r   r/   r   )r   r   rV   r   rW   r   grad_tmprX   rY   distr"   s              r   mahalanobis_gradr^   #  s   F88AGGAJbjj1D1771: A$1+Q xx H1771:  qwwqz" 	0A41:Q''CQK41:Q//K	0 	#Q-  776?Dtd{#D:r   c                     d}t        | j                  d         D ]  }| |   ||   k7  s|dz  } t        |      | j                  d   z  S )Nr   r   r   r   r   floatr   s       r   hammingrb   8  sT    F1771: Q41Q4<cMF =1771:%%r   c                     d}t        | j                  d         D ]]  }t        j                  | |         t        j                  ||         z   }|dkD  s:|t        j                  | |   ||   z
        |z  z  }_ |S Nr   r   r*   )r   r   r   r   denominators        r   canberrarf   B  sw    F1771: 8ffQqTlRVVAaD\1?bffQqTAaD[)K77F8
 Mr   c                     d}t        j                  | j                        }t        | j                  d         D ]  }t        j                  | |         t        j                  ||         z   }|dkD  s:|t        j                  | |   ||   z
        |z  z  }t        j
                  | |   ||   z
        |z  t        j                  | |   ||   z
        t        j
                  | |         z  |dz  z  z
  ||<    ||fS )Nr   r   r   r.   )r   r   r   r"   r   re   s         r   canberra_gradrh   M  s    F88AGGD1771: ffQqTlRVVAaD\1?bffQqTAaD[)K77F!qt${2&&1!%!5QFG G	 4<r   c                     d}d}t        | j                  d         D ]D  }|t        j                  | |   ||   z
        z  }|t        j                  | |   ||   z         z  }F |dkD  rt	        |      |z  S yrd   )r   r   r   r+   ra   )r   r   	numeratorre   r   s        r   bray_curtisrk   ]  s    IK1771: +RVVAaD1Q4K((	rvvadQqTk**+ SY+--r   c                 |   d}d}t        | j                  d         D ]D  }|t        j                  | |   ||   z
        z  }|t        j                  | |   ||   z         z  }F |dkD  r0t	        |      |z  }t        j
                  | |z
        |z
  |z  }||fS d}t        j                  | j                        }||fS rd   )r   r   r   r+   ra   r   r/   )r   r   rj   re   r   r]   r"   s          r   bray_curtis_gradrm   k  s    IK1771: +RVVAaD1Q4K((	rvvadQqTk**+ SY+-A%4
 : xx :r   c                     d}d}t        | j                  d         D ]$  }| |   dk7  }||   dk7  }||xs |z  }||xr |z  }& |dk(  ryt        ||z
        |z  S rd   r`   )r   r   num_non_zero	num_equalr   x_truey_trues          r   jaccardrs   }  s    LI1771: '11(&(V&&		' s\I-.==r   c                     d}t        | j                  d         D ]  }| |   dk7  }||   dk7  }|||k7  z  } t        |      | j                  d   z  S rd   r`   r   r   num_not_equalr   rq   rr   s         r   matchingrw     sf    M1771: *116))*
 !''!*,,r   c                     d}d}t        | j                  d         D ]#  }| |   dk7  }||   dk7  }||xr |z  }|||k7  z  }% |dk(  ry|d|z  |z   z  S Nr   r          @r   r   r   r   num_true_truerv   r   rq   rr   s          r   dicer~         MM1771: *11*F*6))	* m 3m CDDr   c                     d}d}t        | j                  d         D ]#  }| |   dk7  }||   dk7  }||xr |z  }|||k7  z  }% |dk(  ryt        ||z
  | j                  d   z         || j                  d   z   z  S rd   r`   r|   s          r   	kulsinskir     s    MM1771: *11*F*6))	* ]]2QWWQZ?@AGGAJ&
 	
r   c                     d}t        | j                  d         D ]  }| |   dk7  }||   dk7  }|||k7  z  } d|z  | j                  d   |z   z  S ry   r{   ru   s         r   rogers_tanimotor     k    M1771: *116))*
 -AGGAJ$>??r   c                 6   d}t        | j                  d         D ]  }| |   dk7  }||   dk7  }||xr |z  } |t        j                  | dk7        k(  r|t        j                  |dk7        k(  ryt	        | j                  d   |z
        | j                  d   z  S rd   )r   r   r   rB   ra   )r   r   r}   r   rq   rr   s         r   
russellraor     s    M1771: +11*F*+
 qAv&=BFF16N+JQWWQZ-/0AGGAJ??r   c                     d}t        | j                  d         D ]  }| |   dk7  }||   dk7  }|||k7  z  } d|z  | j                  d   |z   z  S ry   r{   ru   s         r   sokal_michenerr     r   r   c                     d}d}t        | j                  d         D ]#  }| |   dk7  }||   dk7  }||xr |z  }|||k7  z  }% |dk(  ry|d|z  |z   z  S )Nr   r         ?r{   r|   s          r   sokal_sneathr     r   r   c                    | j                   d   dk7  rt        d      t        j                  d| d   |d   z
  z        }t        j                  d| d   |d   z
  z        }t        j                  |dz  t        j
                  | d         t        j
                  |d         z  |dz  z  z         }dt        j                  |      z  S )Nr   r   0haversine is only defined for 2 dimensional datar   r
   rz   )r   
ValueErrorr   sinr   cosarcsin)r   r   sin_latsin_longr   s        r   	haversiner     s    wwqzQKLLffSAaD1Q4K()GvvcQqTAaD[)*HWWWaZ"&&1,!"=!"KKLF6"""r   c                    | j                   d   dk7  rt        d      t        j                  d| d   |d   z
  z        }t        j                  d| d   |d   z
  z        }t        j                  d| d   |d   z
  z        }t        j                  d| d   |d   z
  z        }t        j                  | d   t        j
                  dz  z         t        j                  |d   t        j
                  dz  z         z  |dz  z  }||dz  z   }dt        j                  t        j                  t        t        t        |      d      d                  z  }t        j                  t        |dz
              t        j                  t        |            z  }	t        j                  ||z  t        j                  | d   t        j
                  dz  z         t        j                  |d   t        j
                  dz  z         z  |dz  z  z
  t        j                  | d   t        j
                  dz  z         t        j                  |d   t        j
                  dz  z         z  |z  |z  g      |	dz   z  }
||
fS )Nr   r   r   r   r
   rz   r    )r   r   r   r   r   pir   r   minr2   r+   array)r   r   r   cos_latr   cos_longa_0a_1r!   denomr"   s              r   haversine_gradr     s    	wwqzQKLLffSAaD1Q4K()GffSAaD1Q4K()GvvcQqTAaD[)*HvvcQqTAaD[)*H
&&1	!
"RVVAaD25519,<%=
=!
KC


CbiiCC!$4a 89::AGGCaL!BGGCH$55E88 '!&&1	)*RVVAaD255194D-EERSST VVAaD25519$%qtbeeai/?(@@8KhV	
 
D d7Nr   c                    d}d}d}t        | j                  d         D ]/  }| |   dk7  }||   dk7  }||xr |z  }||xr | z  }|| xr |z  }1 | j                  d   |z
  |z
  |z
  }|dk(  s|dk(  ryd|z  |z  ||z  ||z  z   z  S ry   r{   )	r   r   r}   num_true_falsenum_false_truer   rq   rr   num_false_falses	            r   yuler     s    MNN1771: 211*F*&1&j1v:1612 ggaj=0>ANRO# 5n$~5O+n~.MM
 	
r   c                     d}d}d}t        | j                  d         D ]&  }|| |   ||   z  z  }|| |   dz  z  }|||   dz  z  }( |dk(  r|dk(  ry|dk(  s|dk(  ryd|t        j                  ||z        z  z
  S Nr   r   r   r   r   )r   r   r   norm_xnorm_yr   s         r   cosiner   ,  s    FFF1771: !A$1+!A$!)!A$!)
 }3	3&C-frwwv7788r   c                    d}d}d}t        | j                  d         D ]&  }|| |   ||   z  z  }|| |   dz  z  }|||   dz  z  }( |dk(  r*|dk(  r%d}t        j                  | j                        }||fS |dk(  s|dk(  r%d}t        j                  | j                        }||fS | |z  ||z  z
   t        j                  |dz  |z        z  }d|t        j                  ||z        z  z
  }||fS )Nr   r   r   r      r   r   r   r/   r   )r   r   r   r   r   r   r]   r"   s           r   cosine_gradr   >  s   FFF1771: !A$1+!A$!)!A$!)
 }3xx  : 
3&C-xx 
 : Va&j()BGGFAI4F,GGfrwwv778:r   c                    d}d}d}d}d}t        | j                  d         D ]  }|| |   z  }|||   z  } || j                  d   z  }|| j                  d   z  }t        | j                  d         D ]*  }| |   |z
  }||   |z
  }	||dz  z  }||	dz  z  }|||	z  z  }, |dk(  r|dk(  ry|dk(  ryd|t        j                  ||z        z  z
  S r   r   )
r   r   mu_xmu_yr   r   dot_productr   	shifted_x	shifted_ys
             r   correlationr   U  s   DDFFK1771: !! 	AGGAJDAGGAJD1771: -aD4K	aD4K	)Q,)Q,y9,,- }3		kBGGFVO$<<==r   c                 8   d}d}d}t        | j                  d         D ]3  }|t        j                  | |   ||   z        z  }|| |   z  }|||   z  }5 |dk(  r|dk(  ry|dk(  s|dk(  ryt        j                  d|t        j                  ||z        z  z
        S )Nr   r   r   r
   r   )r   r   r   	l1_norm_x	l1_norm_yr   s         r   	hellingerr   s  s    FII1771: "''!A$1+&&QqT	QqT	
 A~)q.	a9>wwq6BGGI	,A$BBBCCr   c                 j   d}d}d}t        j                  | j                  d         }t        | j                  d         D ];  }t        j                  | |   ||   z        ||<   |||   z  }|| |   z  }|||   z  }= |dk(  r*|dk(  r%d}t        j
                  | j                        }||fS |dk(  s|dk(  r%d}t        j
                  | j                        }||fS t        j                  ||z        }	t        j                  d||	z  z
        }d|z  }
||z  d|	dz  z  z  }|||z  |	z  z
  |
z  }||fS )Nr   r   r   r
   r   r   )r   r=   r   r   r   r/   )r   r   r   r   r   	grad_termr   r]   r"   
dist_denom
grad_denomgrad_numer_consts               r   hellinger_gradr     s`   FII$I1771: wwqtad{+	!)A,QqT	QqT		 A~)q.xx  : 
a9>xx  : WWY23
wwq6J../X
%.1z1}3DE A	MJ$>?:M:r   c                     | dk(  ry| t        j                  |       z  | z
  dt        j                  dt         j                  z  | z        z  z   d| dz  z  z   S )Nr
   r   r   rz   r   g      (@r   logr   r   s    r   approx_log_Gammar     sP    Avrvvay=1sRVVC"%%K!O%<<<sa$h?OOOr   c                 N   t        | |      }t        | |      }|dk  rct        j                  |       }t	        dt        |            D ]3  }|t        j                  |      t        j                  ||z         z
  z  }5 |S t        |       t        |      z   t        | |z         z
  S )N   r
   )r   r2   r   r   r   intr   )r   r   r   bvaluer   s         r   log_betar     s    Aq	AAq	A1u
q#a&! 	/ARVVAYA..E	/"%5a%88;KAPQE;RRRr   c                     t        j                  d      d| z  dz   z  dt        j                  dt         j                  z  | z        z  z   d| z  z   S )Nrz   g       r   g      ?r   r   s    r   log_single_betar     sF    66#;$(S.)C"&&ruuq2I,IIETUIUUr   c           	      F   t        j                  |       }t        j                  |      }d}d}d}t        | j                  d         D ]{  }| |   ||   z  dkD  r8|t	        | |   ||         z  }|t        | |         z  }|t        ||         z  }I| |   dkD  r|t        | |         z  }||   dkD  sk|t        ||         z  }} t        j                  d|z  |t	        ||      z
  |t        |      z
  z
  z  d|z  |t	        ||      z
  |t        |      z
  z
  z  z         S )zThe 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   rB   r   r   r   r   r   )data1data2n1n2log_bself_denom1self_denom2r   s           r   ll_dirichletr     sC    
B	BEKK5;;q>" 98eAh$XeAha11E?5844K?5844K Qx#~uQx88Qx#~uQx889 77bEHR,,ob>Q0QRS
(ehr2..+PR@S2ST
U	V r   c                    | j                   d   }d}d}d}d}t        |      D ],  }| |xx   |z  cc<   || |   z  }||xx   |z  cc<   |||   z  }. t        |      D ]  }| |xx   |z  cc<   ||xx   |z  cc<    t        |      D ]P  }|| |   t        j                  | |   ||   z        z  z  }|||   t        j                  ||   | |   z        z  z  }R ||z   dz  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   s	            r   symmetric_klr     s    	

AEE
C
C1X 	!	1	!	1	 1X 	!	! 1X *qtbffQqTAaD[)))qtbffQqTAaD[)))* #I?r   c                    | j                   d   }d}d}d}d}t        |      D ],  }| |xx   |z  cc<   || |   z  }||xx   |z  cc<   |||   z  }. t        |      D ]  }| |xx   |z  cc<   ||xx   |z  cc<    t        |      D ]P  }|| |   t        j                  | |   ||   z        z  z  }|||   t        j                  ||   | |   z        z  z  }R ||z   dz  }	t        j                  || z        | |z  z
  dz   dz  }
|	|
fS )z5
    symmetrized KL divergence and its gradient

    r   r   r   r
   r   )r   r   r   r   r   r   r   r   r   r]   r"   s              r   symmetric_kl_gradr     s=    	

AEE
C
C1X 	!	1	!	1	 1X 	!	! 1X *qtbffQqTAaD[)))qtbffQqTAaD[)))* #I?DFF1q5MQU#a'1,D:r   c                 `   d}d}d}d}d}t        | j                  d         D ]  }|| |   z  }|||   z  } || j                  d   z  }|| j                  d   z  }t        | j                  d         D ]*  }| |   |z
  }||   |z
  }	||dz  z  }||	dz  z  }|||	z  z  }, |dk(  r*|dk(  r%d}
t        j                  | j                        }|
|fS |dk(  r%d}
t        j                  | j                        }|
|fS d|t        j                  ||z        z  z
  }
| |z
  |z  ||z
  |z  z
  |
z  }|
|fS r   r   )r   r   r   r   r   r   r   r   r   r   r]   r"   s               r   correlation_gradr   -  s   DDFFK1771: !! 	AGGAJDAGGAJD1771: -aD4K	aD4K	)Q,)Q,y9,,- }3xx  : 
	xx 
 : kBGGFVO$<<=TV#q4x;&>>$F:r   @   c                 4   | | j                         z  j                  t        j                        }||j                         z  j                  t        j                        }t        j                  |j
                  t        j                        }t        j                  |j
                  t        j                        }t        |      D ]D  }	||z  }
||
dkD     |
|
dkD     z  ||
dkD  <   |j                  |z  }
||
dkD     |
|
dkD     z  ||
dkD  <   F t        j                  |      |z  t        j                  |      z  }d}t        |j
                  d         D ]<  }t        |j
                  d         D ]  }|||f   dkD  s||||f   |||f   z  z  }! > |S )Nr   r   r   r
   )	rB   astyper   r>   onesr   r   Tdiag)r   r   Mcostmaxiterr9   qrE   r6   r   rL   r   r   r   rY   s                  r   sinkhorn_distancer   P  so    
QUUWRZZ(A	
QUUWRZZ(A
rzz*A
rzz*A7^ 'EQU8aAh&!a%CC!GQU8aAh&!a%	' 
a"''!*	$BF288A; 0rxx{# 	0A!Q$x!|"QT(T!Q$Z//	00
 Mr   c                    | d   |d   z
  }| d   |d   z
  }t        j                  | d         t        j                  |d         z   }t        j                  | d         }|dz  |dz  z   d|z  z  t        j                  |      z   t        j                  dt         j                  z        z   }t        j
                  dt         j                        }||z  |d<   ||z  |d<   |d|z  |dz  |dz  z   d|dz  z  z  z
  z  |d<   ||fS )Nr   r
   r   r   r   )r   r+   r   r   r   r=   r>   )r   r   mu_1mu_2r%   
sign_sigmar]   r"   s           r   spherical_gaussian_energy_gradr   j  s    Q4!A$;DQ4!A$;DFF1Q4L266!A$<'E1J!GdAg!e),rvve}<rvva"%%i?PPD88Arzz"DUlDGUlDGC%K47T1W+<UAX*NNODG:r   c                 6   | d   |d   z
  }| d   |d   z
  }t        j                  | d         t        j                  |d         z   }d}t        j                  | d         t        j                  |d         z   }||z  }t        j                  | d         }t        j                  | d         }	|dk(  r2|dz  |dz  z   t        j                  g dt         j                        fS d|z  }
t        j                  |      |dz  z  |
|z  |z  z
  t        j                  |      |dz  z  z   }||z  t        j
                  t        j                  |            z   dz  t        j
                  dt         j                  z        z   }t        j                  d	t         j                        }d|z  |z  |
|z  z
  d|z  z  |d<   d|z  |z  |
|z  z
  d|z  z  |d<   ||||z
  z  ||dz  z  z   z  d|dz  z  z  |d<   |	|||z
  z  ||dz  z  z   z  d|dz  z  z  |d<   ||fS )
Nr   r
   r   r   r   )r   r   r   r   r   rz      )r   r+   r   r   r>   r   r   r=   )r   r   r   r   sigma_11sigma_12sigma_22detsign_s1sign_s2
cross_termm_distr]   r"   s                 r   diagonal_gaussian_energy_gradr   |  s   Q4!A$;DQ4!A$;Dvvad|bffQqTl*HHvvad|bffQqTl*H
X
CggadmGggadmG
czQwq "((+?rzz"RRRXJ
xD!G$
t
d
"	#
&&
dAg
&	'  SL266"&&+..#5q255y8IID88ARZZ(D8|d"Z$%661s7CDG8|d"Z$%661s7CDGS6\2S47]BCq3PQ6zRDGS6\2S47]BCq3PQ6zRDG:r   c           
         | d   |d   z
  }| d   |d   z
  }t        j                  | d         | d<   t        j                  |d         |d<   t        j                  | d         | d<   t        j                  |d         |d<   t        j                  t        j                  | d               | d<   t        j                  t        j                  |d               |d<   |d   t        j                  |d         dz  z  |d   t        j                  |d         dz  z  z   }|d   |d   z
  t        j                  |d         z  t        j                  |d         z  }|d   t        j                  |d         dz  z  |d   t        j                  |d         dz  z  z   }| d   t        j                  | d         dz  z  | d   t        j                  | d         dz  z  z   |z   }| d   | d   z
  t        j                  | d         z  t        j                  | d         z  |z   }| d   t        j                  | d         dz  z  | d   t        j                  | d         dz  z  z   |z   }	t        j                  ||	z  |dz  z
        }
|	|dz  z  d|z  |z  |z  z
  ||dz  z  z   }|
dk  r2|dz  |dz  z   t        j
                  g dt         j                        fS ||
z  t        j                  |
      z   t        j                  dt         j                  z        z   }t        j                  d	t         j                        }d|	z  |z  d|z  |z  z
  |
z  |d<   d|z  |z  d|z  |z  z
  |
z  |d<   ||t        j                  | d         dz  z  |t        j                  | d         z  t        j                  | d         z  z
  z  |d<   |dxx   ||t        j                  | d         dz  z  |t        j                  | d         z  t        j                  | d         z  z
  z  z  cc<   |dxx   |
z  cc<   |dxx   |t        j                  | d         dz  z  |	z  z  cc<   |dxx   |t        j                  | d         dz  z  |z  z  cc<   |dxx   |dz  |z  t        j                  | d         z  t        j                  | d         z  z  cc<   |dxx   |
dz  d
z   z  cc<   ||t        j                  | d         dz  z  |t        j                  | d         z  t        j                  | d         z  z
  z  |d<   |dxx   ||t        j                  | d         dz  z  |t        j                  | d         z  t        j                  | d         z  z
  z  z  cc<   |dxx   |
z  cc<   |dxx   |t        j                  | d         dz  z  |	z  z  cc<   |dxx   |t        j                  | d         dz  z  |z  z  cc<   |dxx   |dz  |z  t        j                  | d         z  t        j                  | d         z  z  cc<   |dxx   |
dz  d
z   z  cc<   | d   | d   z
  d|z  |z  t        j                  d| d   z        z  |dz  |dz  z
  t        j                  d| d   z        z  z
  z  |d<   |dxx   |
z  cc<   |dxx   || d   | d   z
  z  t        j                  d| d   z        z  |	z  z  cc<   |dxx   || d   | d   z
  z  t        j                  d| d   z        z  |z  z  cc<   |dxx   |dz  |z  | d   | d   z
  z  t        j                  d| d   z        z  z  cc<   |dxx   |
dz  d
z   z  cc<   ||fS )Nr   r
   r   r      g3#I9)r   r   r   r   r   r   r   g:0yE>)
r   r+   r   r   r   r   r>   r   r   r/   )r   r   r   r   r   r   cr   r   r   	det_sigmax_inv_sigma_y_numeratorr]   r"   s                 r   gaussian_energy_gradr    s5   Q4!A$;DQ4!A$;D 66!A$<AaD66!A$<AaD 66!A$<AaD66!A$<AaD 99RVVAaD\"AaD99RVVAaD\"AaD 	
!rvvad|q  1Q4"&&1,!*;#;;A	
1!qt$rvvad|3A	!rvvad|q  1Q4"&&1,!*;#;;A tbffQqTla''!A$!1B*BBQFH!qtrvvad|+bffQqTl:Q>HtbffQqTla''!A$!1B*BBQFH x(*Xq[89I47Q\D0477(T1W:LL  5!GdAgHH.bjjA
 	

 #Y.	1BBRVVAPRPUPUIEVVD88Arzz"D8|d"Q\D%88IEDG8|d"Q\D%88IEDGdRVVAaD\Q..qt1DrvvaPQd|1SSTDGGttbffQqTla//$!2EqQRt2TTUUGGyGG&!)::XEEGG&!)::XEEGG&*X5qtDrvvaPQd|SSGGy!|d""GdRVVAaD\Q..qt1DrvvaPQd|1SSTDGGttbffQqTla//$!2EqQRt2TTUUGGyGG&!)::XEEGG&!)::XEEGG&*X5qtDrvvaPQd|SSGGy!|d""Gtad{	D4"&&QqT**dAga.?266!aPQd(CS-SSDG 	GyGG&!A$1+6AaD9IIHTTGG&!A$1+6AaD9IIHTTGG&*X51!EqSTUVSWxHXXXGGy!|d""G:r   c                    | d   |d   z
  }| d   |d   z
  }| d   |d   z   }t        j                  |      }|dk(  r)dt        j                  g dt         j                        fS |dz  |dz  z   t        j                  |      z  dt        j
                  t        j                  |            z  z   t        j
                  dt         j                  z        z   }t        j                  dt         j                        }d|z  t        j                  |      z  |d<   d|z  t        j                  |      z  |d<   ||dz  |dz  z    |dz  z  dt        j                  |      z  z   z  |d<   ||fS )Nr   r
   r   g      $@)r   r   g      r   r   )r   r   r   r>   r+   r   r   r=   )r   r   r   r   r%   
sigma_signr]   r"   s           r   spherical_gaussian_gradr    sL   Q4!A$;DQ4!A$;DaD1Q4KEJzRXX.bjjAAA 
q47	bffUm+
bffRVVE]#
#	$
&&RUU
	 	
 88ARZZ(D4x266%=(DG4x266%=(DGdAga/0E1H=RVVE]ARSTDG:r   c                 ,   |dk(  r/dt        | j                         | j                         z
        dz  iS |dk(  rst        j                  j                  |       }t        j                  j                  |       }t        j                  j                  |       }t        |||      }||dz  dS |dk(  r]t        j                  | D cg c]  }t        |       c}      }t        j                  j                  |      }|dz  }	|	dz  }||	dz  d	S i S c c}w )
Nordinalsupport_sizerz   count)poisson_lambda)r	  normalisationstringg      ?)r
  max_dist)ra   r2   r   scipystatstmintmaxtmeancount_distancer   r   len)
datametric	min_count	max_countlambda_r
  r   lengths
max_lengthr  s
             r   get_discrete_paramsr    s    dhhj488:&= > DEE	7	KK$$T*	KK$$T*	++##D)&y)GT%*S0
 	
 
8	((D1qCF12[[%%g.
# 3!.HsNKK 	 2s   Dc                     | |k(  ryy)Nr   r   r   )r   r   s     r   categorical_distancer    s    Avr   c                     t        t        |            }t        |      D ]   \  }}||    ||   k(  st        |      |z  c S  y)Nr   )ra   r  	enumerate)r   r   cat_hierarchyn_levelslevelcatss         r   !hierarchical_categorical_distancer$  #  sM    S'(H / t7d1g<(** r   c                 $    t        | |z
        |z  S N)r+   )r   r   r  s      r   ordinal_distancer'  -  s    q1u:$$r   c                    t        t        | |            }t        t        | |            }t        j                  |      }|dk  rd}n?|dk  r,d}t        d|      D ]  }|t        j                  |      z  } nt        |dz         }d}	t        ||      D ](  }|	||z  |z
  |z
  z  }	|t        j                  |      z  }* |	|z  S )Nr   r   
   r
   )r   r   r2   r   r   r   r   )
r   r   r	  r
  lohi
log_lambdalog_k_factorialkr   s
             r   r  r  2  s    	SAYB	SAYB'J	Av	bq" 	)Arvvay(O	) +262F2r] %!j.>1OCC266!9$% M!!r   c                 "   t        |       t        |      }}t        ||z
        |kD  rt        ||z
        |z  S t        j                  |dz         j	                  t        j
                        }t        j                  |dz         }t        |      D ]u  }|dz   ||<   t        |      D ]<  }	||	dz      dz   }
||	   dz   }t        | |   ||	   k(        }t        |
||      ||	dz   <   > |}t        j                  |      |kD  sp||z  c S  ||   |z  S )Nr
   )
r  r+   r   aranger   float64r/   r   r   r   )r   r   r
  max_distancex_leny_lenv0v1r   rY   deletion_costinsertion_costsubstitution_costs                r   levenshteinr:  K  s#   q63q65E 55=L(55=!M11	519		$	$RZZ	0B	%!)	B5\ 0A1u 	NAq1uIMMUQYN #AaDAaDL 1M>;LMBq1uI	N  66":$-//0" e9}$$r   r   l2r,   taxicabl1r3   	linfinitylinftylinfr:   rI   
seuclideanr&   
wminkowskirR   rZ   rf   r   r   r   r   
braycurtisr   r   rb   rs   r~   rw   r   rogerstanimotor   sokalsneathsokalmichenerr   )categoricalr  hierarchical_categoricalr  r  )	r   r   r   rC  r   spherical_gaussian_energydiagonal_gaussian_energygaussian_energyhyperboloid)rG  rH  r  r  r  )parallelc                 *   |t        j                  | j                  d   | j                  d   f      }t        | j                  d         D ]C  }t        |dz   | j                  d         D ]"  } || |   | |         |||f<   |||f   |||f<   $ E |S t        j                  | j                  d   |j                  d   f      }t        | j                  d         D ]3  }t        |j                  d         D ]  } || |   ||         |||f<    5 |S )Nr   r
   )r   r/   r   r   )XYr  r   r   rY   s         r   parallel_special_metricrQ    s    y1771:qwwqz23qwwqz" 	,A1q5!''!*- ,%adAaD1q!t%ad|q!t,	, M 1771:qwwqz23qwwqz" 	2A1771:& 2%adAaD1q!t2	2 Mr   )rM  nogil   c           	         || d}}| j                   d   x}}n"|d}}| j                   d   |j                   d   }}t        j                  ||ft        j                        }||z  dz   }	t	        j
                  |	      D ]s  }
|
|z  }t        ||z   |      }|r|nd}t        |||      D ]G  }t        ||z   |      }t        ||      D ]'  }t        ||      D ]  } || |   ||         |||f<    ) I u |S )NTr   Fr   r
   )r   r   r/   r>   numbapranger   r   )rO  rP  r  
chunk_sizeXXsymmetricalrow_sizecol_sizer   n_row_chunks	chunk_idxr   chunk_end_nm_startmchunk_end_mr   rY   s                     r   chunked_parallel_special_metricrb    s   yTKggaj(8UKWWQZ(XXx*"**=F
*a/L\\,/ 7	
"!j.(3"!w*5 	7Aa*nh7K1k* 7q+. 7A#)!A$1#6F1a4L77	7	7 Mr   c                     t              rM|t        |j                               ndt        j                  d      dfd	       }t        | |||      S t           }t        | ||      S )Nr   Tr   c                      | |g S r&  r   )_X_Ykwd_valsr  s     r   _partial_metricz0pairwise_special_metric.<locals>._partial_metric  s    "b,8,,r   )r  ensure_all_finite)r  r&  )callabletuplevaluesrU  njitr   named_distancesrQ  )rO  rP  r  kwdsri  rh  special_metric_funcrg  s     `    @r   pairwise_special_metricrq    sy     T[[]+HH	T	"	- 
#	- "q<M
 	
 .f5"1a0CDDr   )r   )gdy=)r   )r   r   )r      )Nr   NT)MrU  numpyr   scipy.statsr  sklearn.metricsr   eyer1  _mock_identity
_mock_costr   
_mock_onesrm  r   r   r#   r&   r(   r,   r0   r3   r7   r:   r@   rI   rO   rR   rT   rZ   r^   rb   rf   rh   rk   rm   rs   rw   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r$  r'  r  r:  rn  named_distances_with_gradientsDISCRETE_METRICSSPECIAL_METRICSrQ  rb  rq  r   r   r   <module>r}     s	      .,>!
RWWQbjj)
   T	 	 T  '1   T,6   
 
   
 
  &  $ % %4 
O 
O  , )Q  " $.! % %4 )  "  .  ( & &     
 
  " > > - - E E 
 
" @ @ 
@ 
@ @ @ E E # #  : 
 
* 9 9" T , > >: D D$  < P P 	S 	S V V  D T < T >  D TR 2 T " T D TE EP T 6.   ;=$   % % " "0 % %<-- 	)- 	-
 y- 	)- - - i- I- - - (- 4-  $!-" ,#-$ ;%-( )-* f+-, ;--. /-0 1-2 +3-4 L5-6 L7-: w;-< w=-> D?-@ A-B C-D oE-F *G-H <I-J ^K-L DM-P ( AY-^"" 	." 	"
 ~" 	." " " n" N" " -" 9" )"  1!"" ##"& '"( k)"* $"%!? =+#=" B  	 T!%i  ( T&)-iB  '. AEEr   