o
    Zh                     @  s   d dl mZ d dlZd dlmZmZmZmZ d dl	Z
d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ dddZG dd deZdS )    )annotationsN)AnyIterableListOptional)CallbackManagerForRetrieverRun)Document)
Embeddings)BaseRetriever)
ConfigDictcontexts	List[str]
embeddingsr	   return
np.ndarrayc                 C  sF   t j }tt||j| W  d   S 1 sw   Y  dS )z
    Create an index of embeddings for a list of contexts.

    Args:
        contexts: List of contexts to embed.
        embeddings: Embeddings model to use.

    Returns:
        Index of embeddings.
    N)
concurrentfuturesThreadPoolExecutornparraylistmapembed_query)r   r   executor r   \/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/retrievers/nanopq.pycreate_index   s   $r   c                   @  s   e Zd ZU dZded< 	 dZded< 	 ded< 	 dZd	ed
< 	 dZded< 	 dZded< 	 dZ	ded< 	 dZ
ded< 	 eddZe	d$d%ddZed&ddZd'd"d#ZdS )(NanoPQRetrieverz`NanoPQ retriever.r	   r   Nr   indexr   textsOptional[List[dict]]	metadatas   intkzOptional[float]relevancy_thresholdsubspace   clustersT)Zarbitrary_types_allowedkwargsr   c                 K  s"   t ||}| d||||d|S )N)r   r   r   r!   r   )r   )clsr   r   r!   r)   r   r   r   r   
from_texts5   s   
zNanoPQRetriever.from_texts	documentsIterable[Document]c                 K  s.   t dd |D  \}}| jd|||d|S )Nc                 s  s    | ]	}|j |jfV  qd S NZpage_contentmetadata).0dr   r   r   	<genexpr>M   s    z1NanoPQRetriever.from_documents.<locals>.<genexpr>)r   r   r!   r   )zipr+   )r*   r,   r   r)   r   r!   r   r   r   from_documentsF   s   zNanoPQRetriever.from_documentsquerystrrun_managerr   List[Document]c             	     s   zddl m} W n ty   tdw t j|}z| j jdd	 j
d}W n tyM   dj j
jd  j j j
jd d	}t|w |j j
dd
}|j|dd}|j|d}	t|	}
 fdd|
d j D }|S )Nr   )PQzBCould not import nanopq, please install with `pip install nanopq`.T)MZKsverboseZfloat32zReceived params: training_sample={training_sample}, n_cluster={n_clusters}, subspace={subspace}, embedding_shape={embedding_shape}. Issue with the combination. Please retrace back to find the exact error   )Ztraining_sampleZ
n_clustersr&   Zembedding_shape)Zvecs)r6   )codesc                   s.   g | ]}t  j|  jr j| ni d qS )r/   )r   r   r!   )r1   rowselfr   r   
<listcomp>u   s    z;NanoPQRetriever._get_relevant_documents.<locals>.<listcomp>)Znanopqr:   ImportErrorr   r   r   r   r&   r(   fitr   ZastypeAssertionErrorformatshapeRuntimeErrorencodeZdtableZadistZargsortr$   )rA   r6   r8   r:   Zquery_embedsZpqerror_messageZ
index_codedtdistsZ	sorted_ixZtop_k_resultsr   r@   r   _get_relevant_documentsR   s<   




z'NanoPQRetriever._get_relevant_documentsr.   )
r   r   r   r	   r!   r    r)   r   r   r   )r,   r-   r   r	   r)   r   r   r   )r6   r7   r8   r   r   r9   )__name__
__module____qualname____doc____annotations__r   r!   r$   r%   r&   r(   r   Zmodel_configclassmethodr+   r5   rM   r   r   r   r   r      s6   
 r   )r   r   r   r	   r   r   )
__future__r   concurrent.futuresr   typingr   r   r   r   numpyr   Zlangchain_core.callbacksr   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr	   Zlangchain_core.retrieversr
   Zpydanticr   r   r   r   r   r   r   <module>   s    
