
    Wi}                        d dl mZ d dlZd dlZd dlmZmZ d dlm	Z	m
Z
mZ  ej                  ej                        j                  Z ej                  ej                        j                   Z ej$                  d      dnd       Z ej$                  d      d        Z ej$                  d      d	        Z ej$                  d      d
        Z ej$                  dej.                  j1                  ej.                  j3                  ej.                  j0                  ddd      ej.                  j3                  ej.                  j0                  ddd            gej4                  ej4                  d      d        Z ej$                   ej.                  j9                  ej.                  j3                  ej.                  j0                  dd      ej.                  j3                  ej.                  j                  dd      f      ej.                  j3                  ej.                  j0                  ddd      ej.                  j3                  ej.                  j                  ddd      ej.                  j3                  ej.                  j0                  ddd      ej.                  j3                  ej.                  j                  ddd            gdej.                  j0                  ddd   ej.                  j                  ddd   ej.                  j                  ej.                  j0                  ej.                  j0                  ej.                  j0                  ej.                  j0                  dd      d        Z ej$                  d      d        Z ej$                   ej.                  j9                  ej.                  j?                  ej.                  j0                        ej.                  j?                  ej.                  j                        f      ej.                  j3                  ej.                  j0                  ddd      ej.                  j3                  ej.                  j                  ddd      ej.                  j3                  ej.                  j0                  ddd      ej.                  j3                  ej.                  j                  ddd            gdej.                  j                  ej.                  j0                  ej.                  j0                  ej.                  j0                  ej.                  j0                  dd      d        Z  ej$                  ej.                  j                  ej.                  j3                  ej.                  j0                  ddd      ej.                  j3                  ej.                  j                  ddd      ej.                  j3                  ej.                  j0                  ddd      ej.                  j3                  ej.                  j                  ddd            gdej.                  j                  ej.                  j                  ej.                  j4                  ej.                  j4                  ej.                  j0                  ej.                  j0                  dd      d        Z! ej$                         d        Z" ej$                  d      d        Z# ej$                  dej.                  j                  ej.                  j3                  ej.                  j0                  ddd      ej.                  j3                  ej.                  j                  ddd      ej.                  j3                  ej.                  j0                  ddd      ej.                  j3                  ej.                  j                  ddd            gdej.                  j                  ddd   ej.                  j                  ej.                  j                  ej.                  jH                  ej.                  j4                  d      d         Z% ej$                         d!        Z& ej$                         d"        Z' ej$                         dod#       Z( ej$                         d$        Z) ej$                         d%        Z* ej$                  dej.                  j                  ej.                  j3                  ej.                  j0                  ddd      ej.                  j3                  ej.                  j                  ddd      ej.                  j3                  ej.                  j0                  ddd      ej.                  j3                  ej.                  j                  ddd            gd      d&        Z+ ej$                         d'        Z, ej$                  dej.                  j                  ej.                  j3                  ej.                  j0                  ddd      ej.                  j3                  ej.                  j                  ddd      ej.                  j3                  ej.                  j0                  ddd      ej.                  j3                  ej.                  j                  ddd            gdej.                  jH                  ej.                  jH                  d(      d)        Z- ej\                  d      d*        Z/ ej$                         d+        Z0 ej$                         d,        Z1 ej$                         d-        Z2 ej$                         d.        Z3 ej$                         d/        Z4 ej$                         d0        Z5 ej$                         d1        Z6 ej$                         d2        Z7 ej$                  dej.                  j                  ej.                  j                  ej.                  j                  ej.                  jH                  ej.                  j4                  d3      d4        Z8 ej\                  dd5      d6        Z9 ej$                         d7        Z: ej$                  dd8ej.                  j                  i      d9        Z; ej$                         d:        Z< ej$                         d;        Z= ej$                  dej.                  j                  ej.                  j                  ej.                  j                  ej.                  jH                  ej.                  j4                  d<      d=        Z> ej\                  dd5      d>        Z? ej$                         d?        Z@d@ ZA ej$                         e@fdA       ZB ej$                         dpdB       ZC ej$                         dC        ZD ej$                         dD        ZE ej$                  ddEF      	 dqdG       ZF ej$                  ddEF      	 dqdH       ZGi dIe#dJe#dKe%dLe&dMe&dNe&dOe'dPe'dQe'dRe'dSe(dTe*dUe+dVe)dWe,dXe1dYe0i dZe2d[e3d\e4d]e5d^e6d_e7d`e<daeBdbeBdceCddeCdeeCdeeCdfe=dgeDdheDdieEeEeEdjZHdkZIe%ej                  dle%ej                  dle8e9dle;e9dle>e?dle-e/dldmZKy)r    )print_functionN)normtau_rand)kantorovichjensen_shannon_divergencesymmetric_kl_divergenceT)cachec                 n    t        j                  | |z
        }|||t        j                  |      z  z   k  S N)npabs)abrtolatoldiffs        ^/home/sietch6/trending-topics-pipeline/venv/lib/python3.12/site-packages/pynndescent/sparse.pyiscloser      s0    66!a%=DD4"&&)++,,    c                     t        j                  |       }t        j                  t        j                  dt         j                        |dd  |d d k7  f      }||   S )N   dtype)r   sortconcatenateonesbool_)arrauxflags      r   
arr_uniquer"      sL    
''#,C>>2771BHH5s12w#cr(7JKLDt9r   c                     | j                   d   dk(  r|S |j                   d   dk(  r| S t        t        j                  | |f            S Nr   )shaper"   r   r   )ar1ar2s     r   	arr_unionr(   $   sD    
yy|q
	1	
"..#s455r   c                 r    t        j                  | |f      }|j                          |d d |dd  |d d k(     S )Nr   r   )r   r   r   )r&   r'   r    s      r   arr_intersectr*   0   s?    
..#s
$CHHJs8CGs3Bx'((r   zi4(i4[:],i4[:])r   C)readonly)i1i2)localsc                 r   | j                   d   dk(  s|j                   d   dk(  ryd}d}| j                   d   dz
  }|j                   d   dz
  }| |   }||   }d}	 ||k(  r+|dz  }||k  r|dz  }| |   }n	 |S ||k  r|dz  }||   }n0	 |S ||k  r||k  r|dz  }| |   }n||k  r||k  r|dz  }||   }n	 |S ^Nr   r   r%   )	r&   r'   r-   r.   limit1limit2j1j2results	            r   fast_intersection_sizer8   8   s    yy|qCIIaLA- 
B	
BYYq\AFYYq\AF	RB	RBF
8aKFF{aW" M F{aW M "Wf!GBRB"Wf!GBRBM1 r   )
result_indresult_datavalr-   r.   r5   r6   )fastmathr/   r	   c                    | j                   d   |j                   d   z   }t        j                  |t        j                        }t        j                  |t        j                        }d}d}d}	|| j                   d   k  r||j                   d   k  r| |   }
||   }|
|k(  r*||   ||   z   }|dk7  r|
||	<   |||	<   |	dz  }	|dz  }|dz  }nB|
|k  r||   }|dk7  r|
||	<   |||	<   |	dz  }	|dz  }n||   }|dk7  r|||	<   |||	<   |	dz  }	|dz  }|| j                   d   k  r||j                   d   k  r|| j                   d   k  r6| |   }
||   }|dk7  r|
||	<   |||	<   |	dz  }	|dz  }|| j                   d   k  r6||j                   d   k  r6||   }||   }|dk7  r|||	<   |||	<   |	dz  }	|dz  }||j                   d   k  r6|d |	 }|d |	 }||fS Nr   r   r   )r%   r   zerosint32float32)ind1data1ind2data2result_sizer9   r:   r-   r.   nnzr5   r6   r;   s                r   
sparse_sumrH   n   sQ   6 **Q-$**Q-/K+RXX6J((;bjj9K	
B	
B
C tzz!}
djjm!3"X"X8)eBi'Cax"$
3#&C q!GB!GB"W)Cax"$
3#&C q!GB)Cax"$
3#&C q!GB3 tzz!}
djjm!38 tzz!}
"XBi!8 JsO"K1HC
a tzz!}
 tzz!}
"XBi!8 JsO"K1HC
a tzz!}
 DS!Jds#K{""r   c                      t        | |||       S r   )rH   )rB   rC   rD   rE   s       r   sparse_diffrJ      s    dE4%00r   )r;   r-   r.   r5   r6   c                 `   t         j                  j                  j                  t         j                  j
                        }t         j                  j                  j                  t         j                  j                        }d}d}|| j                  d   k  r||j                  d   k  r| |   }||   }	||	k(  r=||   ||   z  }
|
dk7  r"|j                  |       |j                  |
       |dz  }|dz  }n||	k  r|dz  }n|dz  }|| j                  d   k  r||j                  d   k  r||fS r1   )	numbatypedList
empty_listtypesr@   rA   r%   append)rB   rC   rD   rE   r9   r:   r-   r.   r5   r6   r;   s              r   
sparse_mulrR      s   4 !!,,U[[->->?J++""--ekk.A.ABK	
B	
B tzz!}
djjm!3"X"X8)eBi'Cax!!"%""3'!GB!GB"W!GB!GB tzz!}
djjm!3  {""r   )r7   r;   r-   r.   r5   r6   c                 "   | j                   d   }|j                   d   }d}d}d}| |   }	||   }
	 |	|
k(  r3||   ||   z  }||z  }|dz  }||k\  r|S | |   }	|dz  }||k\  r|S ||   }
n(|	|
k  r|dz  }||k\  r|S | |   }	n|dz  }||k\  r|S ||   }
a)Nr           r   r2   )rB   rC   rD   rE   dim1dim2r7   r-   r.   r5   r6   r;   s               r   sparse_dot_productrW      s    , ::a=D::a=DF	
B	
B	bB	bB 8)eBi'CcMF!GBTzbB!GBTzbB"W!GBTzbB!GBTzbB+ r   c                    t        | |      }t        j                  |j                  d   t        j                        }t        j                  |j                  d   t        j                        }d}d}d}	|| j                  d   k  r||j                  d   k  r| |   }
||   }|
|k(  r0||   ||   z   }|dk7  r||   ||	<   ||   ||	<   |	dz  }	|dz  }|dz  }n>|
|k  r||   }|dk7  r||   ||	<   |	dz  }	|dz  }n||   }|dk7  r||   ||	<   |	dz  }	|dz  }|| j                  d   k  r||j                  d   k  r|| j                  d   k  r/||   }|dk7  r||   ||	<   |	dz  }	|dz  }|| j                  d   k  r/||j                  d   k  r/||   }|dk7  r||   ||	<   |	dz  }	|dz  }||j                  d   k  r/|d |	 }|d |	 }||fS r>   )r(   r   r?   r%   rA   )rB   rC   rD   rE   r9   result_data1result_data2r-   r.   rG   r5   r6   r;   s                r   dense_unionr[   <  s:   4&J88J,,Q/rzzBL88J,,Q/rzzBL	
B	
B
C tzz!}
djjm!3"X"X8)eBi'Cax$)"IS!$)"IS!q!GB!GB"W)Cax$)"IS!q!GB)Cax$)"IS!q!GB/ tzz!}
djjm!34 tzz!}
Bi!8 %b	L1HC
a tzz!}
 tzz!}
Bi!8 %b	L1HC
a tzz!}
  %L%L%%r   )r<   c                     t        | |||      \  }}d}t        |j                  d         D ]  }|||   dz  z  } t        j                  |      S )NrT   r      )rJ   ranger%   r   sqrtrB   rC   rD   rE   _aux_datar7   is           r   sparse_euclideanrd   v  sY    dE47KAxF8>>!$% #(1+""#776?r   z#f4(i4[::1],f4[::1],i4[::1],f4[::1]))rb   r7   r   dimrc   )r<   r/   c                 ~    t        | |||      \  }}d}t        |      }t        |      D ]  }|||   ||   z  z  } |S NrT   )rJ   lenr^   )	rB   rC   rD   rE   ra   rb   r7   re   rc   s	            r   sparse_squared_euclideanri     sU    ( dE47KAxF
h-C3Z ,(1+++,Mr   c                     t        | |||      \  }}d}t        |j                  d         D ]  }|t        j                  ||         z  } |S NrT   r   rJ   r^   r%   r   r   r`   s           r   sparse_manhattanrm     sT    dE47KAxF8>>!$% &"&&!%%&Mr   c                     t        | |||      \  }}d}t        |j                  d         D ]$  }t        |t	        j
                  ||               }& |S rk   )rJ   r^   r%   maxr   r   r`   s           r   sparse_chebyshevrp     sV    dE47KAxF8>>!$% 2VRVVHQK012Mr   c                     t        | |||      \  }}d}t        |j                  d         D ]   }|t        j                  ||         |z  z  }" |d|z  z  S )NrT   r         ?rl   )	rB   rC   rD   rE   pra   rb   r7   rc   s	            r   sparse_minkowskirt     sc    dE47KAxF8>>!$% +"&&!%**+cAgr   c                 Z    t        | |||      d   j                  d   }t        |      |z  S r$   )rJ   r%   float)rB   rC   rD   rE   
n_featuresnum_not_equals         r   sparse_hammingry     s2    eT59!<BB1EM*,,r   c                 J   t        j                  |      }t        j                  |      }t        | |||      \  }}d|z  j                  t         j                        }t        | |||      \  }}	t        j                  |	      }	t        ||	||      \  }
}d}|D ]  }||z  }	 |S )Nrr   rT   )r   r   rH   astyperA   rJ   rR   )rB   rC   rD   rE   	abs_data1	abs_data2
denom_inds
denom_data
numer_inds
numer_datara   val_datar7   r;   s                 r   sparse_canberrar     s    uIuI'iyIJ

"**2::6J(udEBJ

#JZZLKAxF # Mr   c                 <   t        | |||      \  }}t        j                  |      }|j                  d   dk(  ryt        j                  |      }|dk(  ryt        | |||      \  }}t        j                  |      }t        j                  |      }t        |      |z  S Nr   rT   )rH   r   r   r%   sumrJ   rv   )	rB   rC   rD   rE   ra   r   denominatorr   	numerators	            r   sparse_bray_curtisr     s     tUD%8MAz
#Ja&&$KceT59MAz
#Jz"Ik))r   c                     t        | |      }| j                  d   |j                  d   z   |z
  }|dk(  ryt        ||z
        |z  S r   r8   r%   rv   rB   rC   rD   rE   	num_equalnum_non_zeros         r   sparse_jaccardr     sM    &tT2I::a=4::a=09<Lq\I-.==r   )r   r   c                     t        | |      }| j                  d   |j                  d   z   |z
  }|dk(  ry|dk(  rt        S t        j                  ||z         S r   )r8   r%   FLOAT32_MAXr   log2r   s         r   sparse_alternative_jaccardr     s^     'tT2I::a=4::a=09<Lq	a	L0111r   c                 "    dt        d|        z
  S )Nrr          @)pow)vs    r   correct_alternative_jaccardr     s    S1"r   c                     t        | |      }| j                  d   |j                  d   z   |z
  }||z
  }t        |      |z  S r$   r   rB   rC   rD   rE   rw   num_true_truer   rx   s           r   sparse_matchingr     sG    *46M::a=4::a=0=@L =0M*,,r   c                     t        | |      }| j                  d   |j                  d   z   |z
  }||z
  }|dk(  ry|d|z  |z   z  S )Nr   rT   r   r8   r%   rB   rC   rD   rE   r   r   rx   s          r   sparse_dicer   !  W    *46M::a=4::a=0=@L =0Mm 3m CDDr   c                     t        | |      }| j                  d   |j                  d   z   |z
  }||z
  }|dk(  ryt        ||z
  |z         ||z   z  S r   r   r   s           r   sparse_kulsinskir   -  sf    *46M::a=4::a=0=@L =0M]]2Z?@J&
 	
r   c                 ~    t        | |      }| j                  d   |j                  d   z   |z
  }||z
  }d|z  ||z   z  S Nr   r   r   r   s           r   sparse_rogers_tanimotor   ;  L    *46M::a=4::a=0=@L =0M-J$>??r   c                    | j                   d   |j                   d   k(  rt        j                  | |k(        ryt        | |      }|t        j                  |dk7        k(  r|t        j                  |dk7        k(  ryt        ||z
        |z  S r   )r%   r   allr8   r   rv   )rB   rC   rD   rE   rw   r   s         r   sparse_russellraor   D  sz    zz!}

1%"&&*>*46Muz**}uPQz@R/RZ-/0J??r   c                 ~    t        | |      }| j                  d   |j                  d   z   |z
  }||z
  }d|z  ||z   z  S r   r   r   s           r   sparse_sokal_michenerr   Q  r   r   c                     t        | |      }| j                  d   |j                  d   z   |z
  }||z
  }|dk(  ry|d|z  |z   z  S )Nr   rT   g      ?r   r   s          r   sparse_sokal_sneathr   Z  r   r   c                     t        | |||      \  }}d}t        |      }t        |      }|D ]  }	||	z  }	 |dk(  r|dk(  ry|dk(  s|dk(  ryd|||z  z  z
  S NrT   rr   )rR   r   )
rB   rC   rD   rE   ra   rb   r7   norm1norm2r;   s
             r   sparse_cosiner   f  s{    T5$6KAxFKEKE # |	##f.//r   )r7   norm_xnorm_yre   rc   c                     t        | |||      \  }}d}t        |      }t        |      }t        |      }	t        |	      D ]
  }
|||
   z  } |dk(  r|dk(  ry|dk(  s|dk(  rt        S |dk  rt        S ||z  |z  }t        j                  |      S rg   )rR   r   rh   r^   r   r   r   )rB   rC   rD   rE   ra   rb   r7   r   r   re   rc   s              r   sparse_alternative_cosiner   x  s     T5$6KAxF%[F%[F
h-C3Z (1+}3	3&C-	36/V+wwvr   )r<   r	   c                 \    t        dt        |       d      s| dk  rydt        d|        z
  S NrT   gHz>)r   rr   r   )r   r   r   ds    r   !sparse_correct_alternative_cosiner     s.    sCF&!c'Sqb\!!r   c                 (    t        | |||      }d|z
  S )Nrr   )rW   rB   rC   rD   rE   r7   s        r   
sparse_dotr     s    eT59F<r   r7   c                 `    t        | |||      }|dk  rt        S t        j                  |       S rg   )rW   r   r   r   r   s        r   sparse_alternative_dotr     s2      eT59F}r   c                 0   d}d}d}| j                   d   dk(  r|j                   d   dk(  ry| j                   d   dk(  s|j                   d   dk(  ryt        |j                   d         D ]
  }|||   z  } t        |j                   d         D ]
  }|||   z  } ||z  }||z  }t        j                  |j                   d   t        j                        }	t        j                  |j                   d   t        j                        }
t        |j                   d         D ]  }||   |z
  |	|<    t        |j                   d         D ]  }||   |z
  |
|<    t        j
                  t        |	      dz  || j                   d   z
  |dz  z  z         }t        j
                  t        |
      dz  ||j                   d   z
  |dz  z  z         }t        | |	||
      \  }}t        |      }|D ]  }||z  }	 t        | j                   d         D ]  }| |   |vs||	|   |z  z  } t        |j                   d         D ]  }||   |vs||
|   |z  z  } t        | |      }|||z  ||j                   d   z
  z  z  }|dk(  r|dk(  ry|dk(  ryd|||z  z  z
  S )NrT   r   rr   r   r]   )
r%   r^   r   emptyrA   r_   r   rR   setr(   )rB   rC   rD   rE   rw   mu_xmu_ydot_productrc   shifted_data1shifted_data2r   r   dot_prod_indsdot_prod_datacommon_indicesr;   all_indicess                     r   sparse_correlationr     s    DDKzz!}djjmq0	A!	tzz!}15;;q>" a5;;q>" a 	JDJDHHU[[^2::>MHHU[[^2::>M5;;q>" + 8d?a+5;;q>" + 8d?a+ GG	m		!j4::a=&@T1W%MME GG	m		!j4::a=&@T1W%MME $.dM4#W M='N s 4::a=! 57.(=+t44K5 4::a=! 57.(=+t44K5 D$'K4$;*{/@/@/C"CDDK|		kUU]344r   c                 X   t        | |||      \  }}d}t        j                  |      }t        j                  |      }t        j                  ||z        }	|D ]  }
|t        j                  |
      z  } |dk(  r|dk(  ry|dk(  s|dk(  ry||	kD  ryt        j                  d||	z  z
        S r   )rR   r   r   r_   )rB   rC   rD   rE   aux_indsrb   r7   r   r   sqrt_norm_prodr;   s              r   sparse_hellingerr     s    #D%u=HhFFF5MEFF5MEWWUU]+N "''#, |	##	.	 wwsf~5677r   )r7   	l1_norm_x	l1_norm_yre   rc   c                    t        | |||      \  }}d}t        j                  |      }t        j                  |      }t        |      }	t	        |	      D ]  }
|t        j
                  ||
         z  } |dk(  r|dk(  ry|dk(  s|dk(  rt        S |dk  rt        S t        j
                  ||z        |z  }t        j                  |      S rk   )rR   r   r   rh   r^   r_   r   r   )rB   rC   rD   rE   r   rb   r7   r   r   re   rc   s              r   sparse_alternative_hellingerr     s     $D%u=HhFuIuI
h-C3Z '"''(1+&&' A~)q.	a9>	1Y./&8wwvr   c                     t        dt        |       d      s| dk  ryt        j                  dt	        d|        z
        S r   )r   r   r   r_   r   r   s    r   $sparse_correct_alternative_hellingerr   '  s7    sCF&!c'wwsSqb\)**r   c                 4    t        j                  | |k(         S r   )r   rA   )xys     r   dummy_ground_metricr   /  s    ::!q&j!!r   c                 D     t        j                          fd       }|S )a  Generate a "ground_metric" suitable for passing to a ``sparse_kantorovich``
    distance function. This should be a metric that, given indices of the data,
    should produce the ground distance between the corresponding vectors. This
    allows the construction of a cost_matrix or ground_distance_matrix between
    sparse samples on the fly -- without having to compute an all pairs distance.
    This is particularly useful for things like word-mover-distance.

    For example, to create a suitable ground_metric for word-mover distance one
    would use:

    ``wmd_ground_metric = create_ground_metric(word_vectors, cosine)``

    Parameters
    ----------
    ground_vectors: array of shape (n_features, d)
        The set of vectors between which ground_distances are measured. That is,
        there should be a vector for each feature of the space one wishes to compute
        Kantorovich distance over.

    metric: callable (numba jitted)
        The underlying metric used to cpmpute distances between feature vectors.

    Returns
    -------
    ground_metric: callable (numba jitted)
        A ground metric suitable for passing to ``sparse_kantorovich``.
    c                 "     |    |         S r    )index1index2ground_vectorsmetrics     r   ground_metricz+create_ground_metric.<locals>.ground_metricQ  s    nV,nV.DEEr   )rL   njit)r   r   r   s   `` r   create_ground_metricr   4  s'    : ZZ\F F r   c                    t        j                  | j                  d   |j                  d   f      }t        | j                  d         D ]3  }t        |j                  d         D ]  } || |   ||         |||f<    5 t	        |||      S r$   )r   r   r%   r^   r   )rB   rC   rD   rE   r   cost_matrixrc   js           r   sparse_kantorovichr   X  s     ((DJJqM4::a=9:K4::a=! @tzz!}% 	@A -d1gtAw ?K1	@@ ue[11r   c                    d}d}d}d}d}	d}
d}t        j                  |      }t        j                  |      }d }|| j                  d   k  r|	|j                  d   k  r| |   }||	   }||k(  r:||||z
  z  z  }|
||   |z  z  }
|||	   |z  z  } ||
|z
  |      }|}|dz  }|	dz  }	nX||k  r*||||z
  z  z  }|
||   |z  z  }
 ||
|z
  |      }|}|dz  }n)||||z
  z  z  }|||	   |z  z  } ||
|z
  |      }|}|	dz  }	|| j                  d   k  r|	|j                  d   k  r|| j                  d   k  rA| |   }||||z
  z  z  }|
||   |z  z  }
 ||
|z
  |      }|}|dz  }|| j                  d   k  rA|	|j                  d   k  rA||	   }||||z
  z  z  }|||	   |z  z  } ||
|z
  |      }|}|	dz  }	|	|j                  d   k  rAt        j                  |d|z        S )NrT   r   c                 T    t        j                  t        j                  |       |      S r   )r   powerr   )r   rs   s     r   <lambda>z'sparse_wasserstein_1d.<locals>.<lambda>o  s    A. r   r   rr   )r   r   r%   r   )rB   rC   rD   rE   rs   r7   old_inddeltar-   r.   cdf1cdf2r   r   r   r5   r6   s                    r   sparse_wasserstein_1dr   c  s   FGE	
B	
BDDuIuI.D tzz!}
djjm!3"X"X8erG|,,FE"I	))DE"I	))Da(EG!GB!GB"WerG|,,FE"I	))Da(EG!GBerG|,,FE"I	))Da(EG!GB/ tzz!}
djjm!32 tzz!}
"X%2<((b	I%%TD[!$
a tzz!}
 tzz!}
"X%2<((b	I%%TD[!$
a tzz!}
 88FC!G$$r   c                 <    t        | |||      \  }}t        ||      S r   )r[   r   rB   rC   rD   rE   dense_data1dense_data2s         r    sparse_jensen_shannon_divergencer     s$    *4eDK$[+>>r   c                 <    t        | |||      \  }}t        ||      S r   )r[   r   r   s         r   sparse_symmetric_kl_divergencer     s$    *4eDK";<<r   F)parallelr	   c           	      (   t        j                  | j                  d         D ]i  }| |df   g}	||df   g}
t        d| j                  d         D ]  }| ||f   dk  r nd}t        t	        |	            D ]  }|	|   }||| ||f      || ||f   dz       }||| ||f      || ||f   dz       }|||   ||dz       }|||   ||dz       } |||||      }|
|   t
        kD  sl||||f   k  swt        |      |k  sd} n |s|	j                  | ||f          |
j                  |||f           t        | j                  d         D ]A  }|t	        |	      k  r|	|   | ||f<   |
|   |||f<   &d| ||f<   t        j                  |||f<   C l | |fS )Nr   r   TFr   )
rL   pranger%   r^   rh   FLOAT32_EPSr   rQ   r   inf)indices	distancesdata_indicesdata_indptr	data_datadist	rng_stateprune_probabilityrc   new_indicesnew_distancesr   r!   kcfrom_ind	from_datato_indto_datar   s                       r   	diversifyr    s    \\'--*+ &)q!t}o"1a4)q'--*+ 	6Aq!t}q D3{+, N'1.WQT]Q=N1O &1.WQT]Q=N1O	 &k!n{1q57IJ#KN[Q5GH9fg> #k1a)AqD/6I	*->>$#& ""71a4=1$$Yq!t_55	68 w}}Q'( 	)A3{## +A1"/"2	!Q$ "1"$&&	!Q$	)A&)P Ir   c	           	         | j                   d   dz
  }	t        j                  |	      D ]U  }
|| |
   | |
dz       }|| |
   | |
dz       }t        j                  |      }t        j
                  |j                   d   t        j                        }t        d|j                   d         D ]  }||   }t        |      D ]  }||   }||   dk(  s||   }||   }|||   ||dz       }|||   ||dz       }|||   ||dz       }|||   ||dz       } |||||      }||   t        kD  sk|||   k  stt        |      |k  sd||<      t        |j                   d         D ]  }||   }||   dk(  sd|| |
   |z   <    X y )Nr   r   r   )
r%   rL   r   r   argsortr   int8r^   r   r   )graph_indptrgraph_indices
graph_datar  r  r  r  r  r  n_nodesrc   current_indicescurrent_dataorderretainedidxr   r
  lrs   q	from_indsr  to_indsr  r   s                             r   diversify_csrr!    s      #a'G\\'" #4'Q,q1u:MN!,q/LQ4GH

<(775;;q>9EKKN+ 	"Cc
A3Z "!HA;!#'*A'*A ,[^k!a%>P QI )+a.;q1u;M NI*;q>KA<NOG'AQU9KLGY	7GDA#A4\!_9L#I.1BB*+HQK!%"		"0 Q( 	4Cc
A{a23
<?Q./	4A#4J r   	euclideanl2sqeuclidean	manhattanl1taxicab	chebyshevlinflinfty	linfinity	minkowskicanberra
braycurtishammingjaccarddicematching	kulsinskirogerstanimoto
russellraosokalmichenersokalsneathcosinecorrelationr   wassersteinwasserstein_1dzwasserstein-1dzkantorovich-1d	hellingerzjensen-shannonjensen_shannonzsymmetric-kl)symmetric_klsymmetric_kullback_liebler)r/  r2  r3  r4  r5  r6  r9  )r  
correction)r"  r#  r8  dotr<  r0  )gh㈵>g:0yE>)r   )r   )rr   )L
__future__r   numpyr   rL   pynndescent.utilsr   r   pynndescent.distancesr   r   r   finforA   epsr   ro   r   r   r   r"   r(   r*   rP   r@   Arrayuint16r8   TuplerH   rJ   ListTyperR   rW   r[   rd   intpri   rm   rp   rt   ry   r   r   r   r   	vectorizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r!  sparse_named_distancessparse_need_n_featuresr_   !sparse_fast_distance_alternativesr   r   r   <module>rQ     s/  
 &   ,  bhhrzz"&&bhhrzz"&& $- - $  $6 6 $) ) KKekk//C$GKKekk//C$G	
 llll&&R 	
!!%++"3"3Q<!!%++"5"5q#>	
 KKekk//C$GKKekk111cDIKKekk//C$GKKekk111cDI
	
 kk''!,{{**3Q3/{{""kkkkkkkk 14<#54<#~ $1 1 	
$$U[[%6%67$$U[[%8%89	
 KKekk//C$GKKekk111cDIKKekk//C$GKKekk111cDI
	
 {{""kkkkkkkk /2#32#6  	KKekk//C$GKKekk111cDIKKekk//C$GKKekk111cDI		
 ++%%{{""kk  kk  kkkk '*#+*#N 6& 6&r T  -KKekk//C$GKKekk111cDIKKekk//C$GKKekk111cDI		
 KK''!,++%%##{{[[&'&       - -
    -KKekk//C$GKKekk111cDIKKekk//C$GKKekk111cDI		
 **( > > -KKekk//C$GKKekk111cDIKKekk//C$GKKekk111cDI		
 !KK,,5;;;K;KL	2	2 $  
 - - E E 

 

 @ @ 	@ 	@ @ @ E E 0 0" ++%%++%%++%%{{[[

& $d+" ,"   %++%%   95 95x 8 8( ++%%[[(([[(({{[[

* $d++ ,+ " "!H ?R 2 2 7% 7%~ ? ?
 = =
 T' 3 (3l T' 3 (3l*!* 	
* +	*
 !* 	
* * !* * * !* !* * $*" ~#*$ ~%*& K'*( )** !+*, ,-*. #/*0 *1*2 &3*6 m7*8 %9*< %=*> %?*@ +A*B +C*D +E*F +G*H !I*J 6K*L 6M*N 2O*P 3"@S* X $ 3"''J+277
C)7
 '7
 -:
 +1% !r   