a
    bgc
                  
   @   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   sV  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yP   t	
d
 tjj| dd}tjj|dd}tjddd* t| |jt|| }W d   n1 s&0    Y  d|t|t|B < | Y S 0 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   l/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/utils/math.pycosine_similarity   s4    



: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   numpyr   	getLogger__name__r   floatZndarrayZMatrixr   intr(   r   r   r   r   <module>   s   
$  