o
    Zhc
                     @   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dededejfddZ			ddeded
ee dee deeeeef  ee f f
ddZdS )zMath utils.    N)ListOptionalTupleUnionXYreturnc                 C   sN  t | dkst |dkrtg S t| } t|}| jd |jd kr2td| j d|j dz$ddl}tj| tjd} tj|tjd}dt|j| |dd	 }|W S  ty   t	
d
 tjj| dd}tjj|dd}tjddd t| |jt|| }W d   n1 sw   Y  d|t|t|B < | Y S w )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   U/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/utils/math.pycosine_similarity   s8   



r      top_kscore_thresholdc                 C   s   t | dkst |dkrg g fS t| |}|pd}d|||k < t|p%t |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(    
$