o
    Xεi҆                     @   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  dddZe  dd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	dd]d^Z8e jdd	dd_d`Z9e  dadb Z:e jdd	e	e
dcfdddeZ;e jdd	dfdg Z<e jdd	dhdi Z=e jdd	djdk Z>e jdd	dldm Z?dndo Z@e  dpdq ZAe  i gfdrdsZBe  ddtduZCe  ddvdwZDe  ddydzZEi ded{eded|ed}eded~edededededededed#ed'ed-e i dKe/dOe1dQe2dEe,de"d[e7d^e8d+ed5e$d9e&d7e%d;e'de(d?e)de+de*dIe.eAeCeBeDeEdZFi ded{eded|ed}eded~ededededededed#ed'ed-e!dKe0e:e3e-e#e9e<e=e>ed	ZGdZHdQd[d^de2e7e8efZIe jddde2fddZJe jdddde2dfddZK	dddZLdS )    N)pairwise_distances   dtype      ?c                 C   s   | dk rdS dS )Nr       )ar	   r	   B/home/ubuntu/.local/lib/python3.10/site-packages/umap/distances.pysign      r   Tfastmathc                 C   s:   d}t | jd D ]}|| | ||  d 7 }q	t|S )z]Standard euclidean distance.

    ..math::
        D(x, y) = \sqrt{\sum_i (x_i - y_i)^2}
            r   r   rangeshapenpsqrtxyresultir	   r	   r   	euclidean   s   
r   c                 C   sR   d}t | jd D ]}|| | ||  d 7 }q	t|}| | d|  }||fS )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gradr	   r	   r   euclidean_grad#   s   
r   c                 C   sB   d}t | jd D ]}|| | ||  d ||  7 }q	t|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   r	   r	   r   standardised_euclidean3   s   "
r!   c                 C   s^   d}t | jd D ]}|| | ||  d ||  7 }q	t|}| | d||   }||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   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 ]}|t | | ||  7 }t | | ||  ||< q||fS )ziManhattan, taxicab, or l1 distance with gradient.

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

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

    ..math::
        D(x, y) = \max_i |x_i - y_i|
    r   r   )r   r   r   r$   r'   r   )r   r   r   max_ir   vr   r	   r	   r   chebyshev_grad}   s   r-   c                 C   sB   d}t | jd D ]}|t| | ||  | 7 }q	|d|  S )ag  Minkowski distance.

    ..math::
        D(x, y) = \left(\sum_i |x_i - y_i|^p\right)^{\frac{1}{p}}

    This is a general distance. For p=1 it is equivalent to
    manhattan distance, for p=2 it is Euclidean distance, and
    for p=infinity it is Chebyshev distance. In general it is better
    to use the more specialised functions for those distances.
    r   r   r   r#   )r   r   pr   r   r	   r	   r   	minkowski   s    r/   c                 C   s   d}t | jd D ]}|t| | ||  | 7 }q	tj| jd tjd}t | jd D ]'}tt| | ||  |d t| | ||   t|d|d   ||< q-|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    r4   c                 C   sT   t | |  }t || }t t | | d}t dd|d| d|     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)ur,   	sq_u_norm	sq_v_normsq_distr	   r	   r   poincare   s   "r<   c                 C   s   t dt | d  }t dt |d  }|| }t| jd D ]}|| | ||  8 }q#|dkr6d}dt |d t |d   }t | jd }t| jd D ]}|| | | | ||   ||< qUt ||fS )Nr   r   r   g1  ?r   )r   r   r5   r   r   r'   r7   )r   r   stBr   
grad_coeffr   r	   r	   r   hyperboloid_grad   s    "rA   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   (rC   c                 C   s   d}t | jd D ]}||| t| | ||  |  7 }q	tj| jd tjd}t | jd D ]+}|| tt| | ||  |d  t| | ||   t|d|d   ||< q1|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   r0   )r   r   rB   r.   r   r   r   r	   r	   r   weighted_minkowski_grad   s   (rD   c                 C   s   d}t j| jd t jd}t| jd D ]}| | ||  ||< qt| jd D ]"}d}t| jd D ]}||||f ||  7 }q3||||  7 }q(t |S )Nr   r   r   )r   r1   r   r2   r   r   )r   r   vinvr   diffr   tmpjr	   r	   r   mahalanobis  s   
rI   c                 C   s   d}t j| jd t jd}t| jd D ]}| | ||  ||< qt | j}t| jd D ]2}d}t| jd D ]}||||f ||  7 }||  |||f ||  7  < q9||||  7 }q.t |}	|d|	  }
|	|
fS )Nr   r   r   r   )r   r1   r   r2   r   r'   r   )r   r   rE   r   rF   r   grad_tmprG   rH   distr   r	   r	   r   mahalanobis_grad#  s   "
rL   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   rO   c                 C   s^   d}t | jd D ]#}t| | t||  }|dkr,|t| | ||  | 7 }q	|S Nr   r   r#   )r   r   r   r   denominatorr	   r	   r   canberraB  s   rR   c                 C   s   d}t | j}t| jd D ]H}t | | t ||  }|dkrW|t | | ||  | 7 }t | | ||  | t | | ||  t | |  |d   ||< q||fS )Nr   r   r   r&   )r   r   r   r   r   rQ   r	   r	   r   canberra_gradM  s   *rS   c                 C   sh   d}d}t | jd D ]}|t| | ||  7 }|t| | ||  7 }q|dkr2t|| S dS rP   )r   r   r   r$   rN   )r   r   	numeratorrQ   r   r	   r	   r   bray_curtis]  s   rU   c                 C   s   d}d}t | jd D ]}|t| | ||  7 }|t| | ||  7 }q|dkrAt|| }t| | | | }||fS d}t| j}||fS rP   )r   r   r   r$   rN   r   r'   )r   r   rT   rQ   r   rK   r   r	   r	   r   bray_curtis_gradk  s   rV   c                 C   sh   d}d}t | jd D ]}| | dk}|| dk}||p|7 }||o#|7 }q|dkr,dS t|| | S rP   rM   )r   r   num_non_zero	num_equalr   x_truey_truer	   r	   r   jaccard}     r[   c                 C   sN   d}t | jd D ]}| | dk}|| dk}|||k7 }q	t|| jd  S rP   rM   r   r   num_not_equalr   rY   rZ   r	   r	   r   matching  s   r_   c                 C   h   d}d}t | jd D ]}| | dk}|| dk}||o|7 }|||k7 }q|dkr,dS |d| |  S Nr   r          @r   r   r   r   num_true_truer^   r   rY   rZ   r	   r	   r   dice  r\   rf   c                 C   s|   d}d}t | jd D ]}| | dk}|| dk}||o|7 }|||k7 }q|dkr,dS t|| | jd  || jd   S rP   rM   rd   r	   r	   r   	kulsinski  s   rg   c                 C   R   d}t | jd D ]}| | dk}|| dk}|||k7 }q	d| | jd |  S ra   rc   r]   r	   r	   r   rogers_tanimoto     ri   c                 C   s   d}t | jd D ]}| | dk}|| dk}||o|7 }q	|t| dkkr2|t|dkkr2dS t| jd | | jd  S rP   )r   r   r   r5   rN   )r   r   re   r   rY   rZ   r	   r	   r   
russellrao  s   $rk   c                 C   rh   ra   rc   r]   r	   r	   r   sokal_michener  rj   rl   c                 C   r`   )Nr   r         ?rc   rd   r	   r	   r   sokal_sneath  r\   rn   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 datarm   r   rb   )r   
ValueErrorr   sinr   cosarcsin)r   r   sin_latsin_longr   r	   r	   r   	haversine  s   2rv   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   ro   rm   r   rb   r   )r   rp   r   rq   rr   pirs   r   minr)   r$   array)r   r   rt   cos_latru   cos_longa_0a_1r   denomr   r	   r	   r   haversine_grad  s(   8$ 66	r   c           	      C   s   d}d}d}t | jd D ]"}| | dk}|| dk}||o|7 }||o&| 7 }|| o-|7 }q| jd | | | }|dksC|dkrEdS d| | || ||   S ra   rc   )	r   r   re   num_true_falsenum_false_truer   rY   rZ   num_false_falser	   r	   r   yule  s   
r   c                 C   s   d}d}d}t | jd D ]}|| | ||  7 }|| | d 7 }||| d 7 }q|dkr4|dkr4dS |dks<|dkr>dS d|t||   S Nr   r   r   r   r   )r   r   r   norm_xnorm_yr   r	   r	   r   cosine,  s   r   c                 C   s   d}d}d}t | jd D ]}|| | ||  7 }|| | d 7 }||| d 7 }q|dkr>|dkr>d}t| j}||fS |dksF|dkrRd}t| j}||fS | | ||   t|d |  }d|t||   }||fS )Nr   r   r   r      r   r   r   r'   r   )r   r   r   r   r   r   rK   r   r	   r	   r   cosine_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 }q5|dkr`|dkr`dS |dkrfdS d|t||   S r   r   )
r   r   mu_xmu_yr   r   dot_productr   	shifted_x	shifted_yr	   r	   r   correlationU  s*   r   c                 C   s   d}d}d}t | jd D ]}|t| | ||  7 }|| | 7 }||| 7 }q|dkr3|dkr3dS |dks;|dkr=dS td|t||   S )Nr   r   r   r   r   )r   r   r   	l1_norm_x	l1_norm_yr   r	   r	   r   	hellingers  s   r   c                 C   s  d}d}d}t | jd }t| jd D ]!}t | | ||  ||< ||| 7 }|| | 7 }||| 7 }q|dkrK|dkrKd}t | j}||fS |dksS|dkr_d}t | j}||fS t || }	t d||	  }d| }
|| d|	d   }||| |	  |
 }||fS )Nr   r   r   r   r   r   )r   r1   r   r   r   r'   )r   r   r   r   r   	grad_termr   rK   r   
dist_denom
grad_denom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   rm   rb   r   g      (@r   logrw   r   r	   r	   r   approx_log_Gamma  s   6r   c                 C   sx   t | |}t| |}|dk r.t| }tdt|D ]}|t|t||  7 }q|S t| t| t| |  S )N   r   )rx   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 )Nrb   g       rm   g      ?r   r   r	   r	   r   log_single_beta  s   6r   c                 C   s  t | }t |}d}d}d}t| jd D ]D}| | ||  dkr?|t| | || 7 }|t| | 7 }|t|| 7 }q| | dkrM|t| | 7 }|| dkr[|t|| 7 }qt d| |t|| |t|   d| |t|| |t|    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   r5   r   r   r   r   r   )data1data2n1n2log_bself_denom1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 ]}| |  |  < ||  |  < q4t|D ]$}|| | t| | ||   7 }||| t|| | |   7 }qK|| 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 ]}| |  |  < ||  |  < q4t|D ]$}|| | t| | ||   7 }||| t|| | |   7 }qK|| 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   rK   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 }q5|dkrj|dkrjd}
t| j}|
|fS |dkrzd}
t| j}|
|fS d|t||   }
| | | || |  |
 }|
|fS r   r   )r   r   r   r   r   r   r   r   r   r   rK   r   r	   r	   r   correlation_grad-  s6   r   @   c                 C   s   | |    tj}||   tj}tj|jtjd}tj|jtjd}t|D ]+}	|| }
||
dk |
|
dk  ||
dk< |j| }
||
dk |
|
dk  ||
dk< q*t|| t| }d}t|jd D ]"}t|jd D ]}|||f dkr||||f |||f  7 }qtqk|S )Nr   r   r   r   )	r5   astyper   r2   onesr   r   Tdiag)r   r   Mcostmaxiterr.   qr8   r,   r   r>   rw   r   r   rH   r	   r	   r   sinkhorn_distanceP  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   r   r   )r   r$   r   r   rw   r1   r2   )r   r   mu_1mu_2r    
sign_sigmarK   r   r	   r	   r   spherical_gaussian_energy_gradj  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rV|d |d  t jg d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   r   )r   r   r   r   r   rb      )r   r$   r   ry   r2   r   rw   r1   )r   r   r   r   sigma_11sigma_12sigma_22detsign_s1sign_s2
cross_termm_distrK   r   r	   r	   r   diagonal_gaussian_energy_grad|  s0   $
,  ,,r   c              
   C   s*  | 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g d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   r      g3#I9)r   r   r   r   r   r   r   g:0yE>)
r   r$   rs   rq   rr   ry   r2   r   rw   r'   )r   r   r   r   r
   r   cr   r   r   	det_sigmax_inv_sigma_y_numeratorrK   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g d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   r   g      r   r   )r   r   ry   r2   r$   r   rw   r1   )r   r   r   r   r    
sigma_signrK   r   r	   r	   r   spherical_gaussian_grad  s"   
0r   c           	      C   s   |dkrdt |  |   d iS |dkr6tj| }tj| }tj| }t|||d}||d dS |dkrYt	
dd	 | D }tj|}|d
 }|d }||d dS i S )Nordinalsupport_sizerb   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)rN   r)   rx   scipystatstmintmaxtmeancount_distancer   ry   )	datametric	min_count	max_countlambda_r   lengths
max_lengthr   r	   r	   r   get_discrete_params  s"   r   c                 C   s   | |krdS dS )Nr   r   r	   )r   r   r	   r	   r   categorical_distance  r   r   c                 C   sB   t t|}t|D ]\}}||  || krt ||   S q
dS )Nr   )rN   r   	enumerate)r   r   cat_hierarchyn_levelslevelcatsr	   r	   r   !hierarchical_categorical_distance#  s   r   c                 C   s   t | | | S N)r$   )r   r   r   r	   r	   r   ordinal_distance-  s   r   c           
      C   s   t t| |}t t| |}t|}|dk rd}n|dk r0d}td|D ]	}|t|7 }q%nt|d }d}	t||D ]}|	|| | | 7 }	|t|7 }q=|	| S )Nr   r   
   r   )r   rx   r)   r   r   r   r   )
r   r   r   r   lohi
log_lambdalog_k_factorialkr   r	   r	   r   r   2  s    
r      c                 C   s   t | t |}}t|| |krt|| | S t|d tj}t|d }t|D ]@}|d ||< t|D ]$}	||	d  d }
||	 d }t| | ||	 k}t	|
||||	d < q;|}t	||kro||   S q/|| | S )Nr   )
r   r$   r   aranger   float64r'   r   r   rx   )r   r   r   max_distancex_leny_lenv0v1r   rH   deletion_costinsertion_costsubstitution_costr	   r	   r   levenshteinK  s"   r  l2taxicabl1	linfinitylinftylinf
seuclidean
wminkowski
braycurtisrogerstanimotosokalsneathsokalmichener)categoricalr   hierarchical_categoricalr   r   )	r   r   rv   r  r   spherical_gaussian_energydiagonal_gaussian_energygaussian_energyhyperboloid)r  r  r   r   r   )parallelc                 C   s   |d u rAt | jd | jd f}t| jd D ]&}t|d | jd D ]}|| | | | |||f< |||f |||f< q$q|S t | jd |jd f}t| jd D ]}t|jd D ]}|| | || |||f< q^qU|S )Nr   r   )r   r'   r   r   )XYr   r   r   rH   r	   r	   r   parallel_special_metric  s   
r  )r  nogil   c                 C   s   |d u r| d}}| j d  }}n|d}}| j d |j d }}tj||ftjd}|| d }	t|	D ]@}
|
| }t|| |}|rG|nd}t|||D ]&}t|| |}t||D ]}t||D ]}|| | || |||f< qdq]qOq6|S )NTr   Fr   r   )r   r   r'   r2   numbaprangerx   r   )r  r  r   
chunk_sizeXXsymmetricalrow_sizecol_sizer   n_row_chunks	chunk_idxr   chunk_end_nm_startmchunk_end_mr   rH   r	   r	   r   chunked_parallel_special_metric  s(   

r-  c                    sd   t r'|d urt|  nd tjddd fdd	}t| |||dS t }t| ||dS )	Nr	   Tr   c                    s   | |g R  S r   r	   )_X_Ykwd_valsr   r	   r   _partial_metric  s   z0pairwise_special_metric.<locals>._partial_metric)r   force_all_finite)r   r   )callabletuplevaluesr   njitr   named_distancesr  )r  r  r   kwdsr3  r2  special_metric_funcr	   r0  r   pairwise_special_metric  s   
r;  )r   )r   )r   )r   r   )r   r   )Nr   NT)Mr   numpyr   scipy.statsr   sklearn.metricsr   eyer   _mock_identity
_mock_costr   
_mock_onesr7  r   r   r   r!   r"   r%   r(   r*   r-   r/   r4   r<   rA   rC   rD   rI   rL   rO   rR   rS   rU   rV   r[   r_   rf   rg   ri   rk   rl   rn   rv   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  r8  named_distances_with_gradientsDISCRETE_METRICSSPECIAL_METRICSr  r-  r;  r	   r	   r	   r   <module>   s  












	


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









	












"


"




"

H

		
 !"#$%&(/	
!	
