Ë
    µŒj F  ã                  óö   — d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZmZ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lmZ d dlm Z   e!g d¢«      Z"dZ#dd„Z$ G d„ de«      Z%y)é    )ÚannotationsN)ÚConfigParser)ÚPath)ÚAnyÚCallableÚDictÚIterableÚListÚOptionalÚTuple)ÚDocument)Ú
Embeddings©Úguard_import)ÚVectorStore)ÚDocstore)ÚInMemoryDocstore)Úmaximal_marginal_relevance)ÚangularÚ	euclideanÚ	manhattanÚhammingÚdotr   c                 ó   — t        d«      S )z1Import annoy if available, otherwise raise error.Úannoyr   © ó    úp/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/vectorstores/annoy.pyÚdependable_annoy_importr      s   € ä˜Ó Ð r   c                  óB  — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 dd„Zedd„«       Z	 d	 	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Z	 d	 	 	 	 	 	 	 dd„Z		 d	 	 	 	 	 	 	 dd	„Z
	 d	 	 	 	 	 	 	 d d
„Z	 d	 	 	 	 	 	 	 	 	 d!d„Z	 d	 	 	 	 	 	 	 	 	 d"d„Z	 d	 	 	 	 	 	 	 	 	 d#d„Z	 	 	 d$	 	 	 	 	 	 	 	 	 	 	 d%d„Z	 	 	 d$	 	 	 	 	 	 	 	 	 	 	 d&d„Zededdf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d'd„«       Zededdf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d(d„«       Zededdf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d)d„«       Zd*d+d„Zeddœ	 	 	 	 	 	 	 d,d„«       Zy)-ÚAnnoya  `Annoy` vector store.

    To use, you should have the ``annoy`` python package installed.

    Example:
        .. code-block:: python

            from langchain_community.vectorstores import Annoy
            db = Annoy(embedding_function, index, docstore, index_to_docstore_id)

    c                óJ   — || _         || _        || _        || _        || _        y)z%Initialize with necessary components.N)Úembedding_functionÚindexÚmetricÚdocstoreÚindex_to_docstore_id)Úselfr#   r$   r%   r&   r'   s         r   Ú__init__zAnnoy.__init__*   s)   € ð #5ˆÔØˆŒ
ØˆŒØ ˆŒØ$8ˆÕ!r   c                 ó   — y ©Nr   )r(   s    r   Ú
embeddingszAnnoy.embeddings9   s   € ð r   Nc                ó   — t        d«      ‚)Nz=Annoy does not allow to add new data once the index is build.)ÚNotImplementedError)r(   ÚtextsÚ	metadatasÚkwargss       r   Ú	add_textszAnnoy.add_texts>   s   € ô "ØKó
ð 	
r   c                óî   — g }t        ||«      D ]c  \  }}| j                  |   }| j                  j                  |«      }t	        |t
        «      st        d|› d|› �«      ‚|j                  ||f«       Œe |S )a  Turns annoy results into a list of documents and scores.

        Args:
            idxs: List of indices of the documents in the index.
            dists: List of distances of the documents in the index.
        Returns:
            List of Documents and scores.
        úCould not find document for id ú, got )Úzipr'   r&   ÚsearchÚ
isinstancer   Ú
ValueErrorÚappend)r(   ÚidxsÚdistsÚdocsÚidxÚdistÚ_idÚdocs           r   Úprocess_index_resultszAnnoy.process_index_resultsH   s|   € ð ˆÜ˜T 5Ö)‰IˆC�Ø×+Ñ+¨CÑ0ˆCØ—-‘-×&Ñ& sÓ+ˆCÜ˜c¤8Ô,Ü Ð#BÀ3À%ÀvÈcÈUÐ!SÓTÐTØ�K‰K˜˜d˜Õ$ð *ð ˆr   éÿÿÿÿc                ój   — | j                   j                  |||d¬«      \  }}| j                  ||«      S ©a}  Return docs most similar to query.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            search_k: inspect up to search_k nodes which defaults
                to n_trees * n if not provided
        Returns:
            List of Documents most similar to the query and score for each
        T©Úsearch_kÚinclude_distances)r$   Úget_nns_by_vectorrB   )r(   Ú	embeddingÚkrG   r;   r<   s         r   Ú&similarity_search_with_score_by_vectorz,Annoy.similarity_search_with_score_by_vector\   s?   € ð —j‘j×2Ñ2Ø�q 8¸tð 3ó 
‰ˆˆeð ×)Ñ)¨$°Ó6Ð6r   c                ój   — | j                   j                  |||d¬«      \  }}| j                  ||«      S rE   )r$   Úget_nns_by_itemrB   )r(   Údocstore_indexrK   rG   r;   r<   s         r   Ú%similarity_search_with_score_by_indexz+Annoy.similarity_search_with_score_by_indexn   s?   € ð —j‘j×0Ñ0Ø˜A¨ÀDð 1ó 
‰ˆˆeð ×)Ñ)¨$°Ó6Ð6r   c                óN   — | j                  |«      }| j                  |||«      }|S )a~  Return docs most similar to query.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            search_k: inspect up to search_k nodes which defaults
                to n_trees * n if not provided

        Returns:
            List of Documents most similar to the query and score for each
        )r#   rL   )r(   ÚqueryrK   rG   rJ   r=   s         r   Úsimilarity_search_with_scorez"Annoy.similarity_search_with_score€   s-   € ð ×+Ñ+¨EÓ2ˆ	Ø×:Ñ:¸9ÀaÈÓRˆØˆr   c                ó^   — | j                  |||«      }|D ��cg c]  \  }}|‘Œ	 c}}S c c}}w )a„  Return docs most similar to embedding vector.

        Args:
            embedding: Embedding to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            search_k: inspect up to search_k nodes which defaults
                to n_trees * n if not provided

        Returns:
            List of Documents most similar to the embedding.
        )rL   )r(   rJ   rK   rG   r1   Údocs_and_scoresrA   Ú_s           r   Úsimilarity_search_by_vectorz!Annoy.similarity_search_by_vector’   s9   € ð ×EÑEØ�q˜(ó
ˆñ #2Ô2¡/™˜˜Q’ /Ò2Ð2ùÓ2ó   ™)c                ó^   — | j                  |||«      }|D ��cg c]  \  }}|‘Œ	 c}}S c c}}w )az  Return docs most similar to docstore_index.

        Args:
            docstore_index: Index of document in docstore
            k: Number of Documents to return. Defaults to 4.
            search_k: inspect up to search_k nodes which defaults
                to n_trees * n if not provided

        Returns:
            List of Documents most similar to the embedding.
        )rP   )r(   rO   rK   rG   r1   rU   rA   rV   s           r   Úsimilarity_search_by_indexz Annoy.similarity_search_by_index¥   s9   € ð ×DÑDØ˜A˜xó
ˆñ #2Ô2¡/™˜˜Q’ /Ò2Ð2ùÓ2rX   c                ó^   — | j                  |||«      }|D ��cg c]  \  }}|‘Œ	 c}}S c c}}w )al  Return docs most similar to query.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            search_k: inspect up to search_k nodes which defaults
                to n_trees * n if not provided

        Returns:
            List of Documents most similar to the query.
        )rS   )r(   rR   rK   rG   r1   rU   rA   rV   s           r   Úsimilarity_searchzAnnoy.similarity_search¸   s4   € ð ×;Ñ;¸EÀ1ÀhÓOˆÙ"1Ô2¡/™˜˜Q’ /Ò2Ð2ùÓ2rX   c                ó  — | j                   j                  ||dd¬«      }|D �cg c]  }| j                   j                  |«      ‘Œ }}t        t	        j
                  |gt        j                  ¬«      |||¬«      }	|	D �cg c]  }|dk7  sŒ	||   ‘Œ }
}g }|
D ]^  }| j                  |   }| j                  j                  |«      }t        |t        «      st        d|› d|› �«      ‚|j                  |«       Œ` |S c c}w c c}w )aô  Return docs selected using the maximal marginal relevance.

        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            embedding: Embedding to look up documents similar to.
            fetch_k: Number of Documents to fetch to pass to MMR algorithm.
            k: Number of Documents to return. Defaults to 4.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5.

        Returns:
            List of Documents selected by maximal marginal relevance.
        rC   FrF   )Údtype)rK   Úlambda_multr4   r5   )r$   rI   Úget_item_vectorr   ÚnpÚarrayÚfloat32r'   r&   r7   r8   r   r9   r:   )r(   rJ   rK   Úfetch_kr_   r1   r;   Úir,   Úmmr_selectedÚselected_indicesr=   r@   rA   s                 r   Ú'max_marginal_relevance_search_by_vectorz-Annoy.max_marginal_relevance_search_by_vectorÉ   s	  € ð2 �z‰z×+Ñ+Ø�w¨¸uð ,ó 
ˆñ >BÓB¹T¸�d—j‘j×0Ñ0°Õ3¸Tˆ
ÐBÜ1Ü�H‰H�i�[¬¯
©
Ô3ØØØ#ô	
ˆñ .:ÓE©\¨¸QÀ"»W˜D ›G¨\ÐÐEàˆÛ!ˆAØ×+Ñ+¨AÑ.ˆCØ—-‘-×&Ñ& sÓ+ˆCÜ˜c¤8Ô,Ü Ð#BÀ3À%ÀvÈcÈUÐ!SÓTÐTØ�K‰K˜Õð "ð ˆùò# Cùò Fs   ¤"C:Á?
C?Â
C?c                óR   — | j                  |«      }| j                  ||||¬«      }|S )aê  Return docs selected using the maximal marginal relevance.

        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch to pass to MMR algorithm.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5.
        Returns:
            List of Documents selected by maximal marginal relevance.
        )r_   )r#   rh   )r(   rR   rK   rd   r_   r1   rJ   r=   s           r   Úmax_marginal_relevance_searchz#Annoy.max_marginal_relevance_searchø   s9   € ð0 ×+Ñ+¨EÓ2ˆ	Ø×;Ñ;Ø�q˜'¨{ð <ó 
ˆð ˆr   éd   c                ó¶  — |t         vrt        d|› dt        t         «      › �«      ‚t        d«      }	|st        d«      ‚t	        |d   «      }
|	j                  |
|¬«      }t        |«      D ]  \  }}|j                  ||«       Œ |j                  ||¬«       g }t        |«      D ]*  \  }}|r||   ni }|j                  t        ||¬«      «       Œ, t        t	        |«      «      D �ci c]   }|t        t        j                  «       «      “Œ" }}t        t        |«      D ��ci c]  \  }}||   |“Œ c}}«      } | |j                   ||||«      S c c}w c c}}w )	NzUnsupported distance metric: z. Expected one of r   z/embeddings must be provided to build AnnoyIndexr   ©r%   )Ún_jobs)Úpage_contentÚmetadata)ÚINDEX_METRICSr9   Úlistr   ÚlenÚ
AnnoyIndexÚ	enumerateÚadd_itemÚbuildr:   r   ÚrangeÚstrÚuuidÚuuid4r   Úembed_query)Úclsr/   r,   rJ   r0   r%   Útreesrn   r1   r   Úfr$   re   ÚembÚ	documentsÚtextrp   Úindex_to_idrA   r&   s                       r   Ú__fromzAnnoy.__from  sc  € ð œÑ&Üà3°F°8ð <'Ü'+¬MÓ':Ð&;ð=óð ô ˜WÓ%ˆÙÜÐNÓOÐOÜ�
˜1‘ÓˆØ× Ñ  ¨6Ð Ó2ˆÜ 
Ö+‰FˆAˆsØ�N‰N˜1˜cÕ"ð ,à�‰�E &ˆÔ)àˆ	Ü  Ö'‰GˆAˆtÙ'0�y ’|°bˆHØ×ÑœX°4À(ÔKÕLð (ô 6;¼3¸y»>Ô5JÓKÑ5J°�qœ#œdŸj™j›lÓ+Ñ+Ð5JˆÐKÜ#Ü/8¸Ô/CÔDÑ/C¡V Q¨ˆ[˜‰^˜SÑ Ð/CÒDó
ˆñ �9×(Ñ(¨%°¸À;ÓOÐOùò	 LùãDs   Ã(%EÄ"E
c           	     óV   — |j                  |«      } | j                  |||||||fi |¤ŽS )aè  Construct Annoy wrapper from raw documents.

        Args:
            texts: List of documents to index.
            embedding: Embedding function to use.
            metadatas: List of metadata dictionaries to associate with documents.
            metric: Metric to use for indexing. Defaults to "angular".
            trees: Number of trees to use for indexing. Defaults to 100.
            n_jobs: Number of jobs to use for indexing. Defaults to -1.

        This is a user friendly interface that:
            1. Embeds documents.
            2. Creates an in memory docstore
            3. Initializes the Annoy database

        This is intended to be a quick way to get started.

        Example:
            .. code-block:: python

                from langchain_community.vectorstores import Annoy
                from langchain_community.embeddings import OpenAIEmbeddings
                embeddings = OpenAIEmbeddings()
                index = Annoy.from_texts(texts, embeddings)
        )Úembed_documentsÚ_Annoy__from)	r}   r/   rJ   r0   r%   r~   rn   r1   r,   s	            r   Ú
from_textszAnnoy.from_texts<  s?   € ðH ×.Ñ.¨uÓ5ˆ
Øˆs�z‰zØ�:˜y¨)°V¸UÀFñ
ØNTñ
ð 	
r   c           	     ó�   — |D �cg c]  }|d   ‘Œ	 }	}|D �cg c]  }|d   ‘Œ	 }
} | j                   |	|
|||||fi |¤ŽS c c}w c c}w )aŒ  Construct Annoy wrapper from embeddings.

        Args:
            text_embeddings: List of tuples of (text, embedding)
            embedding: Embedding function to use.
            metadatas: List of metadata dictionaries to associate with documents.
            metric: Metric to use for indexing. Defaults to "angular".
            trees: Number of trees to use for indexing. Defaults to 100.
            n_jobs: Number of jobs to use for indexing. Defaults to -1

        This is a user friendly interface that:
            1. Creates an in memory docstore with provided embeddings
            2. Initializes the Annoy database

        This is intended to be a quick way to get started.

        Example:
            .. code-block:: python

                from langchain_community.vectorstores import Annoy
                from langchain_community.embeddings import OpenAIEmbeddings
                embeddings = OpenAIEmbeddings()
                text_embeddings = embeddings.embed_documents(texts)
                text_embedding_pairs = list(zip(texts, text_embeddings))
                db = Annoy.from_embeddings(text_embedding_pairs, embeddings)
        r   é   )r‡   )r}   Útext_embeddingsrJ   r0   r%   r~   rn   r1   Útr/   r,   s              r   Úfrom_embeddingszAnnoy.from_embeddingse  sg   € ñJ  /Ó/™˜!��1“˜ˆÐ/Ù$3Ó4¡O˜q�a˜“d Oˆ
Ð4àˆs�z‰zØ�:˜y¨)°V¸UÀFñ
ØNTñ
ð 	
ùò 0ùÚ4s	   …>—AFc                óœ  — t        |«      }t        j                  |d¬«       t        «       }| j                  j
                  | j                  dœ|d<   | j                  j                  t        |dz  «      |¬«       t        |dz  d«      5 }t        j                  | j                  | j                  |f|«       d	d	d	«       y	# 1 sw Y   y	xY w)
a  Save Annoy index, docstore, and index_to_docstore_id to disk.

        Args:
            folder_path: folder path to save index, docstore,
                and index_to_docstore_id to.
            prefault: Whether to pre-load the index into memory.
        T)Úexist_ok)r   r%   ÚANNOYúindex.annoy)Úprefaultú	index.pklÚwbN)r   ÚosÚmakedirsr   r$   r   r%   Úsavery   ÚopenÚpickleÚdumpr&   r'   )r(   Úfolder_pathr’   ÚpathÚconfig_objectÚfiles         r   Ú
save_localzAnnoy.save_local‘  sž   € ô �KÓ ˆÜ
�‰�D 4Õ(ä$›ˆà—‘—‘Ø—k‘kñ"
ˆ�gÑð 	�
‰
�‰œ˜D =Ñ0Ó1¸HˆÔEÜ�$˜Ñ$ dÔ+¨tÜ�K‰K˜Ÿ™¨×(AÑ(AÀ=ÐQÐSWÔX÷ ,×+Ñ+ús   Â.CÃC)Úallow_dangerous_deserializationc               ó€  — |st        d«      ‚t        |«      }t        d«      }t        |dz  d«      5 }t	        j
                  |«      \  }}}	ddd«       t        	d   d   «      }
|	d   d   }|j                  |
|¬	«      }|j                  t        |d
z  «      «        | |j                  ||«      S # 1 sw Y   ŒhxY w)aR  Load Annoy index, docstore, and index_to_docstore_id to disk.

        Args:
            folder_path: folder path to load index, docstore,
                and index_to_docstore_id from.
            embeddings: Embeddings to use when generating queries.
            allow_dangerous_deserialization: whether to allow deserialization
                of the data which involves loading a pickle file.
                Pickle files can be modified by malicious actors to deliver a
                malicious payload that results in execution of
                arbitrary code on your machine.
        aB  The de-serialization relies loading a pickle file. Pickle files can be modified to deliver a malicious payload that results in execution of arbitrary code on your machine.You will need to set `allow_dangerous_deserialization` to `True` to enable deserialization. If you do this, make sure that you trust the source of the data. For example, if you are loading a file that you created, and know that no one else has modified the file, then this is safe to do. Do not set this to `True` if you are loading a file from an untrusted source (e.g., some random site on the internet.).r   r“   ÚrbNr�   r   r%   rm   r‘   )
r9   r   r   r˜   r™   ÚloadÚintrt   ry   r|   )r}   r›   r,   r    rœ   r   rž   r&   r'   r�   r   r%   r$   s                r   Ú
load_localzAnnoy.load_local¥  sÜ   € ñ( /Üð	"óð ô �KÓ ˆä˜WÓ%ˆä�$˜Ñ$ dÔ+¨tô —‘Øóñ	ØØ$Ø÷ ,ô �˜gÑ& sÑ+Ó,ˆØ˜wÑ'¨Ñ1ˆà× Ñ  ¨6Ð Ó2ˆØ�
‰
”3�t˜mÑ+Ó,Ô-áØ×"Ñ" E¨6°8Ð=Qó
ð 	
÷! ,Ð+ús   ³B4Â4B=)
r#   r   r$   r   r%   ry   r&   r   r'   zDict[int, str])ÚreturnzOptional[Embeddings]r+   )r/   zIterable[str]r0   úOptional[List[dict]]r1   r   r¦   ú	List[str])r;   z	List[int]r<   úList[float]r¦   úList[Tuple[Document, float]])é   rC   )rJ   r©   rK   r¤   rG   r¤   r¦   rª   )rO   r¤   rK   r¤   rG   r¤   r¦   rª   )rR   ry   rK   r¤   rG   r¤   r¦   rª   )
rJ   r©   rK   r¤   rG   r¤   r1   r   r¦   úList[Document])
rO   r¤   rK   r¤   rG   r¤   r1   r   r¦   r¬   )
rR   ry   rK   r¤   rG   r¤   r1   r   r¦   r¬   )r«   é   g      à?)rJ   r©   rK   r¤   rd   r¤   r_   Úfloatr1   r   r¦   r¬   )rR   ry   rK   r¤   rd   r¤   r_   r®   r1   r   r¦   r¬   )r/   r¨   r,   zList[List[float]]rJ   r   r0   r§   r%   ry   r~   r¤   rn   r¤   r1   r   r¦   r!   )r/   r¨   rJ   r   r0   r§   r%   ry   r~   r¤   rn   r¤   r1   r   r¦   r!   )r‹   zList[Tuple[str, List[float]]]rJ   r   r0   r§   r%   ry   r~   r¤   rn   r¤   r1   r   r¦   r!   )F)r›   ry   r’   Úboolr¦   ÚNone)r›   ry   r,   r   r    r¯   r¦   r!   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)   Úpropertyr,   r2   rB   rL   rP   rS   rW   rZ   r\   rh   rj   ÚclassmethodÚDEFAULT_METRICr‡   rˆ   r�   rŸ   r¥   r   r   r   r!   r!      sû  „ ñ
ð9à$ð9ð ð9ð ð	9ð
 ð9ð -ó9ð òó ðð +/ð
àð
ð (ð
ð ð	
ð
 
ó
ðØðØ&1ðà	%óð* CEð7Ø$ð7Ø),ð7Ø<?ð7à	%ó7ð& @Bð7Ø!ð7Ø&)ð7Ø9<ð7à	%ó7ð& 79ðØðØ ðØ03ðà	%óð& CEð3Ø$ð3Ø),ð3Ø<?ð3ØPSð3à	ó3ð( @Bð3Ø!ð3Ø&)ð3Ø9<ð3ØMPð3à	ó3ð( 79ð3Øð3Ø ð3Ø03ð3ØDGð3à	ó3ð( ØØ ð-àð-ð ð-ð ð	-ð
 ð-ð ð-ð 
ó-ðd ØØ ðàðð ðð ð	ð
 ðð ðð 
óð< ð +/Ø$ØØð#Pàð#Pð &ð#Pð ð	#Pð
 (ð#Pð ð#Pð ð#Pð ð#Pð ð#Pð 
ò#Pó ð#PðJ ð
 +/Ø$ØØð&
àð&
ð ð&
ð (ð	&
ð
 ð&
ð ð&
ð ð&
ð ð&
ð 
ò&
ó ð&
ðP ð
 +/Ø$ØØð)
à6ð)
ð ð)
ð (ð	)
ð
 ð)
ð ð)
ð ð)
ð ð)
ð 
ò)
ó ð)
ôVYð( ð 16ñ6
àð6
ð ð6
ð
 *.ð6
ð 
ò6
ó ñ6
r   r!   )r¦   r   )&Ú
__future__r   r•   r™   rz   Úconfigparserr   Úpathlibr   Útypingr   r   r   r	   r
   r   r   Únumpyra   Úlangchain_core.documentsr   Úlangchain_core.embeddingsr   Úlangchain_core.utilsr   Úlangchain_core.vectorstoresr   Ú!langchain_community.docstore.baser   Ú&langchain_community.docstore.in_memoryr   Ú&langchain_community.vectorstores.utilsr   Ú	frozensetrq   r·   r   r!   r   r   r   Ú<module>rÅ      s[   ðÝ "ã 	Û Û Ý %Ý ß G× GÑ Gã Ý -Ý 0Ý -Ý 3å 6Ý CÝ MáÒQÓR€Ø€ó!ô

ˆKõ 
r   