o
    -ѹg	~                     @   s  d dl mZ d dl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ejd eejjZeejjZejdddd
dZejdddd Zejdddd Zejdddd Zejdejejjejjddddejjejjddddgejejdddd Zejejejejjddejejjddfejjejjddddejjejjddddejjejjddddejjejjddddgdejjddd ejjddd ejjejjejjejjejjddddd Z ejdddd Z!ejejej"ejjej"ejjfejjejjddddejjejjddddejjejjddddejjejjddddgdejjejjejjejjejjdddd d! Z#ejejejjejjddddejjejjddddejjejjddddejjejjddddgdejjejjejjejjejjejjd"ddd#d$ Z$e d%d& Z%ejdd'd(d) Z&ejd*ejejjejjddddejjejjddddejjejjddddejjejjddddgdejjddd ejjejjejj'ejjd+d,d-d. Z(e d/d0 Z)e d1d2 Z*e dd4d5Z+e d6d7 Z,e d8d9 Z-ejd*ejejjejjddddejjejjddddejjejjddddejjejjddddgdd'd:d; Z.e d<d= Z/ejd*ejejjejjddddejjejjddddejjejjddddejjejjddddgdejj'ejj'd>d,d?d@ Z0ej1dd'dAdB Z2e dCdD Z3e dEdF Z4e dGdH Z5e dIdJ Z6e dKdL Z7e dMdN Z8e dOdP Z9e dQdR Z:ejdejjejjejjejj'ejjdSd,dTdU Z;ej1dddVdWdX Z<e dYdZ Z=ejdd[ejjid,d\d] Z>e d^d_ Z?e d`da Z@ejdejjejjejjejj'ejjdbd,dcdd ZAej1dddVdedf ZBe dgdh ZCdidj ZDe eCfdkdlZEe ddmdnZFe dodp ZGe dqdr ZHejddsdt	uddvdwZIejddsdt	uddxdyZJi dze&d{e&d|e(d}e)d~e)de)de*de*de*de*de+de-de.de,de/de4de3i de5de6de7de8de9de:de?deEdeEdeFdeFdeFdeFde@deGdeGdeHeHeHdZKdZLe(ejMde(ejMde;e<de>e<deAeBde0e2ddZNdS )    )print_functionN)normtau_rand)kantorovichjensen_shannon_divergencesymmetric_kl_divergenceCT)cacheh㈵>:0yE>c                 C   s$   t | | }|||t |  kS N)npabs)abZrtolatoldiff r   V/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/pynndescent/sparse.pyisclose   s   r   c                 C   s@   t | }t t jdt jd|dd  |d d kf}|| S )N   Zdtype)r   sortconcatenateonesZbool_)Zarrauxflagr   r   r   
arr_unique   s   
.r   c                 C   s6   | j d dkr	|S |j d dkr| S tt| |fS Nr   )shaper   r   r   )ar1ar2r   r   r   	arr_union&   s
   r#   c                 C   s:   t | |f}|  |d d |dd  |d d k S )Nr   r   )r   r   r   )r!   r"   r   r   r   r   arr_intersect2   s   $r$   zi4(i4[:],i4[:])r   )readonly)i1i2)localsc           	      C   s   | j d dks|j d dkrdS d}d}| j d d }|j d d }| | }|| }d}	 ||krU|d7 }||k rB|d7 }| | }n	 |S ||k rR|d7 }|| }n(	 |S ||k rf||k rf|d7 }| | }n||k rw||k rw|d7 }|| }n	 |S q-)Nr   r   Tr    )	r!   r"   r&   r'   Zlimit1Zlimit2j1j2resultr   r   r   fast_intersection_size:   s>   



r-   )
result_indresult_datavalr&   r'   r*   r+   )fastmathr(   r	   c                 C   s  | j d |j d  }tj|tjd}tj|tjd}d}d}d}	|| j d k r||j d k r| | }
|| }|
|kr[|| ||  }|dkrR|
||	< |||	< |	d7 }	|d7 }|d7 }n5|
|k rx|| }|dkrs|
||	< |||	< |	d7 }	|d7 }n|| }|dkr|||	< |||	< |	d7 }	|d7 }|| j d k r||j d k s.|| j d k r| | }
|| }|dkr|
||	< |||	< |	d7 }	|d7 }|| j d k s||j d k r|| }|| }|dkr|||	< |||	< |	d7 }	|d7 }||j d k s|d |	 }|d |	 }||fS Nr   r   r   )r    r   zerosint32float32)ind1data1ind2data2Zresult_sizer.   r/   r&   r'   nnzr*   r+   r0   r   r   r   
sparse_sump   sh   

	
r;   c                 C   s   t | ||| S r   )r;   )r6   r7   r8   r9   r   r   r   sparse_diff      r<   )r0   r&   r'   r*   r+   c                 C   s   t jjt jj}t jjt jj}d}d}|| jd k rj||jd k rj| | }|| }	||	krO|| ||  }
|
dkrF|| ||
 |d7 }|d7 }n||	k rX|d7 }n|d7 }|| jd k rj||jd k s$||fS )Nr   r   )	numbatypedListZ
empty_listtypesr4   r5   r    append)r6   r7   r8   r9   r.   r/   r&   r'   r*   r+   r0   r   r   r   
sparse_mul   s&   



rC   )r,   r0   r&   r'   r*   r+   c                 C   s   | j d }|j d }d}d}d}| | }	|| }
	 |	|
krF|| ||  }||7 }|d7 }||kr3|S | | }	|d7 }||krA|S || }
n!|	|
k rY|d7 }||krT|S | | }	n|d7 }||krc|S || }
q)Nr           Tr   r)   )r6   r7   r8   r9   Zdim1Zdim2r,   r&   r'   r*   r+   r0   r   r   r   sparse_dot_product  s:   



rE   c                 C   s  t | |}tj|jd tjd}tj|jd tjd}d}d}d}	|| jd k r||jd k r| | }
|| }|
|kr`|| ||  }|dkrW|| ||	< || ||	< |	d7 }	|d7 }|d7 }n1|
|k r{|| }|dkrv|| ||	< |	d7 }	|d7 }n|| }|dkr|| ||	< |	d7 }	|d7 }|| jd k r||jd k s/|| jd k r|| }|dkr|| ||	< |	d7 }	|d7 }|| jd k s||jd k r|| }|dkr|| ||	< |	d7 }	|d7 }||jd k s|d |	 }|d |	 }||fS r2   )r#   r   r3   r    r5   )r6   r7   r8   r9   r.   Zresult_data1Zresult_data2r&   r'   r:   r*   r+   r0   r   r   r   dense_union>  s\   


rF   )r1   c                 C   sD   t | |||\}}d}t|jd D ]
}||| d 7 }qt|S )NrD   r      )r<   ranger    r   sqrtr6   r7   r8   r9   _aux_datar,   ir   r   r   sparse_euclideanx  s
   
rN   z#f4(i4[::1],f4[::1],i4[::1],f4[::1]))rL   r,   r   dimrM   )r1   r(   c           	      C   sD   t | |||\}}d}t|}t|D ]}||| ||  7 }q|S NrD   )r<   lenrH   )	r6   r7   r8   r9   rK   rL   r,   rO   rM   r   r   r   sparse_squared_euclidean  s   rR   c                 C   s@   t | |||\}}d}t|jd D ]}|t|| 7 }q|S NrD   r   r<   rH   r    r   r   rJ   r   r   r   sparse_manhattan  s
   rU   c                 C   sB   t | |||\}}d}t|jd D ]}t|t|| }q|S rS   )r<   rH   r    maxr   r   rJ   r   r   r   sparse_chebyshev  s
   rW          @c           	      C   sL   t | |||\}}d}t|jd D ]}|t|| | 7 }q|d|  S )NrD   r         ?rT   )	r6   r7   r8   r9   prK   rL   r,   rM   r   r   r   sparse_minkowski  s
   r[   c                 C   s$   t | |||d jd }t|| S r   )r<   r    float)r6   r7   r8   r9   
n_featuresnum_not_equalr   r   r   sparse_hamming  s   r_   c                 C   s~   t |}t |}t| |||\}}d| t j}t| |||\}}	t |	}	t||	||\}
}d}|D ]}||7 }q6|S )NrY   rD   )r   r   r;   Zastyper5   r<   rC   )r6   r7   r8   r9   Z	abs_data1Z	abs_data2Z
denom_inds
denom_dataZ
numer_inds
numer_datarK   Zval_datar,   r0   r   r   r   sparse_canberra  s   



rb   c           	      C   sv   t | |||\}}t|}|jd dkrdS t|}|dkr"dS t| |||\}}t|}t|}t|| S Nr   rD   )r;   r   r   r    sumr<   r\   )	r6   r7   r8   r9   rK   r`   denominatorra   	numeratorr   r   r   sparse_bray_curtis  s   



rg   c                 C   s>   t | |}| jd |jd  | }|dkrdS t|| | S rc   r-   r    r\   r6   r7   r8   r9   	num_equalnum_non_zeror   r   r   sparse_jaccard  s
   
rl   )rk   rj   c                 C   sJ   t | |}| jd |jd  | }|dkrdS |dkrtS t||  S rc   )r-   r    FLOAT32_MAXr   log2ri   r   r   r   sparse_alternative_jaccard  s   
ro   c                 C   s   dt d|   S )NrY   rX   )pow)vr   r   r   correct_alternative_jaccard  r=   rr   c                 C   s6   t | |}| jd |jd  | }|| }t|| S r   rh   r6   r7   r8   r9   r]   num_true_truerk   r^   r   r   r   sparse_matching  s   
ru   c                 C   F   t | |}| jd |jd  | }|| }|dkrdS |d| |  S )Nr   rD   rX   r-   r    r6   r7   r8   r9   rt   rk   r^   r   r   r   sparse_dice#     
ry   c                 C   sN   t | |}| jd |jd  | }|| }|dkrdS t|| | ||  S rc   rh   rs   r   r   r   sparse_kulsinski/  s   
r{   c                 C   :   t | |}| jd |jd  | }|| }d| ||  S Nr   rX   rw   rs   r   r   r   sparse_rogers_tanimoto=     
r~   c                 C   sh   | j d |j d krt| |krdS t| |}|t|dkkr,|t|dkkr,dS t|| | S rc   )r    r   allr-   rd   r\   )r6   r7   r8   r9   r]   rt   r   r   r   sparse_russellraoF  s   "
$r   c                 C   r|   r}   rw   rs   r   r   r   sparse_sokal_michenerS  r   r   c                 C   rv   )Nr   rD   g      ?rw   rx   r   r   r   sparse_sokal_sneath\  rz   r   c           
      C   sp   t | |||\}}d}t|}t|}|D ]}	||	7 }q|dkr&|dkr&dS |dks.|dkr0dS d|||   S NrD   rY   )rC   r   )
r6   r7   r8   r9   rK   rL   r,   norm1norm2r0   r   r   r   sparse_cosineh  s   
r   )r,   norm_xnorm_yrO   rM   c                 C   s   t | |||\}}d}t|}t|}t|}	t|	D ]}
|||
 7 }q|dkr.|dkr.dS |dks6|dkr8tS |dkr>tS || | }t|S rP   )rC   r   rQ   rH   rm   r   rn   )r6   r7   r8   r9   rK   rL   r,   r   r   rO   rM   r   r   r   sparse_alternative_cosinez  s   
r   )r1   r	   c                 C   s.   t dt| dds| dk rdS dtd|   S NrD   gHz>)r   rY   rX   )r   r   rp   dr   r   r   !sparse_correct_alternative_cosine  s   r   c                 C   s   t | |||}d| S )NrY   )rE   r6   r7   r8   r9   r,   r   r   r   
sparse_dot  s   r   r,   c                 C   s&   t | |||}|dkrtS t| S rP   )rE   rm   r   rn   r   r   r   r   sparse_alternative_dot  s   r   c                 C   sF  d}d}d}| j d dkr|j d dkrdS | j d dks$|j d dkr&dS t|j d D ]}||| 7 }q-t|j d D ]}||| 7 }q=|| }|| }tj|j d tjd}	tj|j d tjd}
t|j d D ]
}|| | |	|< qkt|j d D ]
}|| | |
|< q}tt|	d || j d  |d   }tt|
d ||j d  |d   }t| |	||
\}}t|}|D ]}||7 }qt| j d D ]}| | |vr||	| | 8 }qt|j d D ]}|| |vr||
| | 8 }qt	| |}||| ||j d   7 }|dkr|dkrdS |dkrdS d|||   S )NrD   r   rY   r   rG   )
r    rH   r   emptyr5   rI   r   rC   setr#   )r6   r7   r8   r9   r]   Zmu_xZmu_yZdot_productrM   Zshifted_data1Zshifted_data2r   r   Zdot_prod_indsZdot_prod_dataZcommon_indicesr0   Zall_indicesr   r   r   sparse_correlation  sX     


r   c                 C   s   t | |||\}}d}t|}t|}t|| }	|D ]	}
|t|
7 }q|dkr2|dkr2dS |dks:|dkr<dS ||	krBdS td||	  S r   )rC   r   rd   rI   )r6   r7   r8   r9   aux_indsrL   r,   r   r   Zsqrt_norm_prodr0   r   r   r   sparse_hellinger  s   

r   )r,   	l1_norm_x	l1_norm_yrO   rM   c                 C   s   t | |||\}}d}t|}t|}t|}	t|	D ]}
|t||
 7 }q|dkr3|dkr3dS |dks;|dkr=tS |dkrCtS t|| | }t|S rS   )rC   r   rd   rQ   rH   rI   rm   rn   )r6   r7   r8   r9   r   rL   r,   r   r   rO   rM   r   r   r   sparse_alternative_hellinger	  s   


r   c                 C   s4   t dt| dds| dk rdS tdtd|   S r   )r   r   r   rI   rp   r   r   r   r   $sparse_correct_alternative_hellinger)  s   r   c                 C   s   t | |k S r   )r   r5   )xyr   r   r   dummy_ground_metric1  r=   r   c                    s   t   fd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    |   | S r   r   )Zindex1index2ground_vectorsmetricr   r   ground_metricS  s   z+create_ground_metric.<locals>.ground_metricN)r>   njit)r   r   r   r   r   r   create_ground_metric6  s   r   c                 C   sh   t | jd |jd f}t| jd D ]}t|jd D ]}|| | || |||f< qqt|||S r   )r   r   r    rH   r   )r6   r7   r8   r9   r   Zcost_matrixrM   jr   r   r   sparse_kantorovichZ  s   r   c                 C   s(  d}d}d}d}d}	d}
d}t |}t |}dd }|| jd k r|	|jd k r| | }||	 }||kr`||||  7 }|
|| | 7 }
|||	 | 7 }||
| |}|}|d7 }|	d7 }	n?||k r||||  7 }|
|| | 7 }
||
| |}|}|d7 }n||||  7 }|||	 | 7 }||
| |}|}|	d7 }	|| jd k r|	|jd k s*|| jd k r| | }||||  7 }|
|| | 7 }
||
| |}|}|d7 }|| jd k s|	|jd k r||	 }||||  7 }|||	 | 7 }||
| |}|}|	d7 }	|	|jd k st |d| S )NrD   r   c                 S   s   t t | |S r   )r   powerr   )r   rZ   r   r   r   <lambda>q  s    z'sparse_wasserstein_1d.<locals>.<lambda>r   rY   )r   rd   r    r   )r6   r7   r8   r9   rZ   r,   Zold_inddeltar&   r'   Zcdf1Zcdf2r   r   r   r*   r+   r   r   r   sparse_wasserstein_1de  sd   



r   c                 C      t | |||\}}t||S r   )rF   r   r6   r7   r8   r9   Zdense_data1Zdense_data2r   r   r    sparse_jensen_shannon_divergence     
r   c                 C   r   r   )rF   r   r   r   r   r   sparse_symmetric_kl_divergence  r   r   F)parallelr	   rY   c              	   C   s  t | jd D ]}| |df g}	||df g}
td| jd D ]}| ||f dk r, qd}tt|	D ]e}|	| }||| ||f  || ||f d   }||| ||f  || ||f d   }||| ||d   }||| ||d   }|||||}|
| tkr||||f k rt||k rd} qq4|r|	| ||f  |
|||f  q t| jd D ]&}|t|	k r|	| | ||f< |
| |||f< qd| ||f< tj	|||f< qq| |fS )Nr   r   TFr   )
r>   pranger    rH   rQ   FLOAT32_EPSr   rB   r   inf)indicesZ	distancesdata_indicesdata_indptr	data_datadist	rng_stateprune_probabilityrM   Znew_indicesZnew_distancesr   r   kcZfrom_ind	from_dataZto_indto_datar   r   r   r   	diversify  sF   ""r   c	                 C   s  | j d d }	t|	D ]}
|| |
 | |
d   }|| |
 | |
d   }t|}tj|j d tjd}td|j d D ]n}|| }t|D ]c}|| }|| dkr|| }|| }||| ||d   }||| ||d   }||| ||d   }||| ||d   }|||||}|| tkr||| k rt	||k rd||<  q>qHq>t|j d D ]}|| }|| dkrd|| |
 | < qqd S )Nr   r   r   )
r    r>   r   r   Zargsortr   Zint8rH   r   r   )Zgraph_indptrZgraph_indicesZ
graph_datar   r   r   r   r   r   Zn_nodesrM   Zcurrent_indicesZcurrent_dataorderZretainedidxr   r   lrZ   qZ	from_indsr   Zto_indsr   r   r   r   r   diversify_csr  s>   
r   	euclideanl2ZsqeuclideanZ	manhattanl1ZtaxicabZ	chebyshevZlinfZlinftyZ	linfinityZ	minkowskiZcanberraZ
braycurtishammingjaccardZdicematching	kulsinskirogerstanimoto
russellraosokalmichenerZsokalsneathcosinecorrelationr   ZwassersteinZwasserstein_1dzwasserstein-1dzkantorovich-1d	hellingerzjensen-shannonZjensen_shannonzsymmetric-kl)Zsymmetric_klZsymmetric_kullback_liebler)r   r   r   r   r   r   r   )r   Z
correction)r   r   r   dotr   r   )r
   r   )rX   )r   )rY   )O
__future__r   localeZnumpyr   r>   Zpynndescent.utilsr   r   Zpynndescent.distancesr   r   r   	setlocale
LC_NUMERICZfinfor5   Zepsr   rV   rm   r   r   r   r#   r$   rA   r4   ArrayZuint16r-   Tupler;   r<   ZListTyperC   rE   rF   rN   ZintprR   rU   rW   r[   r_   rb   rg   rl   ro   Z	vectorizerr   ru   ry   r{   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zsparse_named_distancesZsparse_need_n_featuresrI   Z!sparse_fast_distance_alternativesr   r   r   r   <module>   st  







)	

?

	
'

9
	
	



	


	














	
<



$
?

	6
6	
 !"#$%&'(,


