
    3fi                          d Z ddlZddlmZmZ ddlZ ej                  e      Z	eeee
      eej                     ej                  f   Zdededej                  fdZ	 	 ddej                  d	ed
e
dedee   f
dZy)zjCopied over from langchain_community.

This code should be moved to langchain proper or removed entirely.
    N)ListUnionXYreturnc                 ,   t        |       dk(  st        |      dk(  rt        j                  g       S t        j                  |       } t        j                  |      }| j                  d   |j                  d   k7  r&t	        d| j                   d|j                   d      	 ddl}t        j                  | t        j                        } t        j                  |t        j                        }dt        j                  |j                  | |d	            z
  }|S # t        $ r t        j                  d
       t        j                  j                  | d      }t        j                  j                  |d      }t        j                  dd      5  t        j                  | |j                        t        j                   ||      z  }ddd       n# 1 sw Y   nxY wdt        j"                  |      t        j$                  |      z  <   |cY S w xY 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)dtypecosine)metriczUnable to import simsimd, defaulting to NumPy implementation. If you want to use simsimd please install with `pip install simsimd`.axisignore)divideinvalidg        )lennparrayshape
ValueErrorsimsimdfloat32cdistImportErrorloggerdebuglinalgnormerrstatedotTouterisnanisinf)r   r   simdZX_normY_norm
similaritys          W/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_postgres/_utils.pycosine_similarityr,      s   
1v{c!fkxx|
A
AwwqzQWWQZI!'' S wwiq*
 	
HHQbjj)HHQbjj)Aq:;; H	
 **[[(; 	C133"((66*BBJ	C 	C 	CBE
288J'"((:*>>?s,   "A9D A7H8G	HG	7HHquery_embeddingembedding_listlambda_multkc                    t        |t        |            dk  rg S | j                  dk(  rt        j                  | d      } t        | |      d   }t        t        j                  |            }|g}t        j                  ||   g      }t        |      t        |t        |            k  rt        j                   }d}	t        ||      }
t        |      D ]0  \  }}||v rt        |
|         }||z  d|z
  |z  z
  }||kD  s-|}|}	2 |j                  |	       t        j                  |||	   gd      }t        |      t        |t        |            k  r|S )z%Calculate maximal marginal relevance.r   r	   r   )minr   ndimr   expand_dimsr,   intargmaxr   inf	enumeratemaxappend)r-   r.   r/   r0   similarity_to_querymost_similaridxsselected
best_score
idx_to_addsimilarity_to_selectediquery_scoreredundant_scoreequation_scores                  r+   maximal_marginal_relevancerG   1   s^    1c.!"a'	q ..qA+O^LQOryy!456L>Dxx567H
d)c!S01
1ffW

!2>8!L'(;< 		NA{Dy!"8";<Ok)Q_,OO  
*+

		 	J99Xz(B'C!L d)c!S01
1  K    )g      ?   )__doc__loggingtypingr   r   numpyr   	getLogger__name__r   floatndarrayMatrixr,   listr6   rG    rH   r+   <module>rU      s   
   			8	$	tDK $rzz"2BJJ>	? F rzz H 	ZZ  	
 
#YrH   