o
    .ѹg҆                     @   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   Zdtype      ?c                 C   s   | dk rdS dS )Nr       )ar   r   R/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/umap/distances.pysign      r   TZfastmathc                 C   s:   d}t | jd D ]}|| | ||  d 7 }q	t|S )z]Standard euclidean distance.

    ..math::
        D(x, y) = \sqrt{\sum_i (x_i - y_i)^2}
            r   r   N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   ư>Nr   )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   Nr   )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   Nr   )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   N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   N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   N)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   N)r   r   r   r"   r%   r   )r   r   r   Zmax_ir   vr   r   r   r
   chebyshev_grad}   s   r*   c                 C   sB   d}t | jd D ]}|t| | ||  | 7 }q	|d|  S )ag  Minkowski distance.

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

    This is a general distance. For p=1 it is equivalent to
    manhattan distance, for p=2 it is Euclidean distance, and
    for p=infinity it is Chebyshev distance. In general it is better
    to use the more specialised functions for those distances.
    r   r   r   Nr!   )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   Nr   r   r   r"   emptyfloat32powr   )r   r   r+   r   r   r   r   r   r
   minkowski_grad   s    r1   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   N)r   sumpowerarccosh)ur)   Z	sq_u_normZ	sq_v_normZsq_distr   r   r
   poincare   s   "r6   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   r2   r   r   r%   r4   )r   r   stBr   Z
grad_coeffr   r   r   r
   hyperboloid_grad   s    "r:   c                 C   sJ   d}t | jd D ]}||| t| | ||  |  7 }q	|d|  S )aP  A weighted version of Minkowski distance.

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

    If weights w_i are inverse standard deviations of data in each dimension
    then this represented a standardised Minkowski distance (and is
    equivalent to standardised Euclidean distance for p=1).
    r   r   r   Nr!   )r   r   wr+   r   r   r   r   r
   weighted_minkowski   s   (r<   c                 C   s   d}t | jd D ]}||| t| | ||  |  7 }q	tj| jd tjd}t | jd D ]+}|| 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   Nr-   )r   r   r;   r+   r   r   r   r   r   r
   weighted_minkowski_grad   s   (r=   c                 C   s   d}t j| jd t jd}t| jd D ]}| | ||  ||< qt| jd D ]"}d}t| jd D ]}||||f ||  7 }q3||||  7 }q(t |S )Nr   r   r   )r   r.   r   r/   r   r   )r   r   vinvr   diffr   tmpjr   r   r
   mahalanobis  s   
rB   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   r.   r   r/   r   r%   r   )r   r   r>   r   r?   r   Zgrad_tmpr@   rA   distr   r   r   r
   mahalanobis_grad#  s   "
rD   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   rG   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   rJ   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   rI   r   r   r
   canberra_gradM  s   *rK   c                 C   sh   d}d}t | jd D ]}|t| | ||  7 }|t| | ||  7 }q|dkr2t|| S dS rH   )r   r   r   r"   rF   )r   r   	numeratorrI   r   r   r   r
   bray_curtis]  s   rM   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 rH   )r   r   r   r"   rF   r   r%   )r   r   rL   rI   r   rC   r   r   r   r
   bray_curtis_gradk  s   rN   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 rH   rE   )r   r   Znum_non_zeroZ	num_equalr   x_truey_truer   r   r
   jaccard}     rQ   c                 C   sN   d}t | jd D ]}| | dk}|| dk}|||k7 }q	t|| jd  S rH   rE   r   r   num_not_equalr   rO   rP   r   r   r
   matching  s   rU   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_truerT   r   rO   rP   r   r   r
   dice  rR   r\   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 rH   rE   rZ   r   r   r
   	kulsinski  s   r]   c                 C   R   d}t | jd D ]}| | dk}|| dk}|||k7 }q	d| | jd |  S rW   rY   rS   r   r   r
   rogers_tanimoto     r_   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 rH   )r   r   r   r2   rF   )r   r   r[   r   rO   rP   r   r   r
   
russellrao  s   $ra   c                 C   r^   rW   rY   rS   r   r   r
   sokal_michener  r`   rb   c                 C   rV   )Nr   r         ?rY   rZ   r   r   r
   sokal_sneath  rR   rd   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 datarc   r   rX   )r   
ValueErrorr   sinr   cosarcsin)r   r   sin_latsin_longr   r   r   r
   	haversine  s   2rl   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   re   rc   r   rX   r   )r   rf   r   rg   rh   piri   r   minr'   r"   array)r   r   rj   Zcos_latrk   Zcos_longZa_0Za_1r   Zdenomr   r   r   r
   haversine_grad  s(   8$ 66	rp   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 rW   rY   )	r   r   r[   Znum_true_falseZnum_false_truer   rO   rP   Znum_false_falser   r   r
   yule  s   
rq   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   ru   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   rs   rt   r   rC   r   r   r   r
   cosine_grad>  s$   $rx   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 rr   r   )
r   r   mu_xmu_yrs   rt   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   rv   )r   r.   r   r   r   r%   )r   r   r   r   r   Z	grad_termr   rC   r   Z
dist_denomZ
grad_denomZgrad_numer_constr   r   r
   hellinger_grad  s.   	r   c                 C   sB   | dkrdS | t |  |  dt dt j |    d| d   S )Nr   r   rc   rX   r   g      (@r   logrm   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   )rn   r'   r   r   r   intr   )r   r   r	   bvaluer   r   r   r
   log_beta  s   

r   c                 C   s6   t dd|  d  dt dt j |    d|   S )NrX   g       rc   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   N)r   r2   r   r   r   r   r   )Zdata1Zdata2Zn1Zn2Zlog_bZself_denom1Zself_denom2r   r   r   r
   ll_dirichlet  s(   
	
  r   dy=c           	      C   s   | j d }d}d}d}d}t|D ]}| |  |7  < || | 7 }||  |7  < ||| 7 }qt|D ]}| |  |  < ||  |  < 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   N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   Nr   )r   r   r   r   r   r   r   r   r   rC   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 rr   rw   )r   r   ry   rz   rs   rt   r{   r   r|   r}   rC   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   )	r2   astyper   r/   onesr   r   TZdiag)r   r   MZcostmaxiterr+   qr5   r)   r   r8   rm   r   r   rA   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   rv   r   )r   r"   r   r   rm   r.   r/   )r   r   mu_1mu_2r   Z
sign_sigmarC   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   rv   )r   r   r   r   r   rX      )r   r"   r   ro   r/   r   rm   r.   )r   r   r   r   sigma_11sigma_12sigma_22ZdetZsign_s1Zsign_s2Z
cross_termZm_distrC   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   rv      g3#I9)r   r   r   r   r   r   r   g:0yE>)
r   r"   ri   rg   rh   ro   r/   r   rm   r%   )r   r   r   r   r	   r   cr   r   r   Z	det_sigmaZx_inv_sigma_y_numeratorrC   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   rv   )r   r   ro   r/   r"   r   rm   r.   )r   r   r   r   r   Z
sigma_signrC   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_sizerX   count)poisson_lambda)r   normalisationstringc                 S   s   g | ]}t |qS r   )len).0r   r   r   r
   
<listcomp>  s    z'get_discrete_params.<locals>.<listcomp>g      ?)r   max_dist)rF   r'   rn   scipystatsZtminZtmaxZtmeancount_distancer   ro   )	datametricZ	min_count	max_countZlambda_r   lengths
max_lengthr   r   r   r
   get_discrete_params  s"   r   c                 C   s   | |krdS dS )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   )rF   r   	enumerate)r   r   Zcat_hierarchyZn_levelslevelZcatsr   r   r
   !hierarchical_categorical_distance#  s   r   c                 C   s   t | | | S N)r"   )r   r   r   r   r   r
   ordinal_distance-  s   r   c           
      C   s   t t| |}t t| |}t|}|dk rd}n|dk r/d}td|D ]}|t|7 }q%t|d }d}	t||D ]}|	|| | | 7 }	|t|7 }q<|	| S )Nr   r   
   r   )r   rn   r'   r   r   r   r   )
r   r   r   r   lohiZ
log_lambdaZ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   Zaranger   float64r%   r   r   rn   )r   r   r   Zmax_distanceZx_lenZy_lenZv0Zv1r   rA   Zdeletion_costZinsertion_costZsubstitution_costr   r   r
   levenshteinK  s"   r   l2Ztaxicabl1Z	linfinityZlinftyZlinfZ
seuclideanZ
wminkowski
braycurtisZrogerstanimotoZsokalsneathZsokalmichener)categoricalr   hierarchical_categoricalr   r   )	r~   r   rl   r   r   Zspherical_gaussian_energyZdiagonal_gaussian_energyZgaussian_energyZ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   rA   r   r   r
   parallel_special_metric  s   
r   )r   Z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%   r/   numbaZprangern   r   )r   r   r   
chunk_sizeZXXZsymmetricalZrow_sizeZcol_sizer   Zn_row_chunksZ	chunk_idxr   Zchunk_end_nZm_startmZchunk_end_mr   rA   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   )Z_XZ_YZ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   kwdsr   r   Zspecial_metric_funcr   r   r
   pairwise_special_metric  s   
r   )r   )r   )r   )r   r   )r   r   )Nr   NT)Mr   Znumpyr   Zscipy.statsr   Zsklearn.metricsr   Zeyer   Z_mock_identityZ
_mock_costr   Z
_mock_onesr   r   r   r   r   r    r#   r&   r(   r*   r,   r1   r6   r:   r<   r=   rB   rD   rG   rJ   rK   rM   rN   rQ   rU   r\   r]   r_   ra   rb   rd   rl   rp   rq   ru   rx   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Znamed_distances_with_gradientsZDISCRETE_METRICSZSPECIAL_METRICSr   r   r   r   r   r   r
   <module>   s  












	


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








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