U
    hc
                  
   @   s   d Z ddlZddlmZmZmZmZ ddlZe	e
Zeeee  eej ejf ZeeejdddZdeeee ee eeeeef  ee f dd	d
ZdS )zMath utils.    N)ListOptionalTupleUnion)XYreturnc                 C   sB  t | dkst |dkr"tg S t| } t|}| jd |jd krdtd| j d|j dzHddl}tj| tjd} tj|tjd}dt|j| |dd	 }|W S  tk
r<   t	
d
 tjj| dd}tjj|dd}tjddd  t| |jt|| }W 5 Q R X d|t|t|B < | Y S X dS )z<Row-wise cosine similarity between two equal-width matrices.r      z;Number of columns in X and Y must be the same. X has shape z and Y has shape .N)ZdtypeZcosine)ZmetriczUnable to import simsimd, defaulting to NumPy implementation. If you want to use simsimd please install with `pip install simsimd`.Zaxisignore)divideinvalidg        )lennparrayshape
ValueErrorZsimsimdZfloat32ZcdistImportErrorloggerdebugZlinalgZnormZerrstatedotTouterisnanisinf)r   r   ZsimdZZX_normZY_normZ
similarity r   B/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/utils/math.pycosine_similarity   s0    


$r      )r   r   top_kscore_thresholdr   c                 C   s   t | dkst |dkr g g fS t| |}|p0d}d|||k < t|pJt |t|}tj|| dd| d }|t| |  ddd }t||j	}| | 
 }tt| |fS )a  Row-wise cosine similarity with optional top-k and score threshold filtering.

    Args:
        X: Matrix.
        Y: Matrix, same width as X.
        top_k: Max number of results to return.
        score_threshold: Minimum cosine similarity of results.

    Returns:
        Tuple of two lists. First contains two-tuples of indices (X_idx, Y_idx),
            second contains corresponding cosine similarities.
    r   g      Nr   )r   r   minr   Zcount_nonzeroZargpartitionZargsortZravelZunravel_indexr   tolistlistzip)r   r   r!   r"   Zscore_arrayZ
top_k_idxsZret_idxsZscoresr   r   r   cosine_similarity_top_k.   s    
 r(   )r    N)__doc__loggingtypingr   r   r   r   Znumpyr   	getLogger__name__r   floatZndarrayZMatrixr   intr(   r   r   r   r   <module>   s   
$  