Ë
    µŒj·×  ã                  ó,  — d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZmZmZ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 m!Z! d d
l"m#Z# d dl$m%Z%m&Z&  ejN                  e(«      Z)ddd„Z*dd„Z+ G d„ de«      Z,y)é    )ÚannotationsN)ÚPath)
ÚAnyÚCallableÚDictÚIterableÚListÚOptionalÚSequenceÚSizedÚTupleÚUnion)ÚDocument)Ú
Embeddings)Úrun_in_executor)ÚVectorStore)ÚAddableMixinÚDocstore)ÚInMemoryDocstore)ÚDistanceStrategyÚmaximal_marginal_relevancec                óº   — | €0dt         j                  v rt        t        j                  d«      «      } 	 | rddlm} |S ddl}	 |S # t        $ r t        d«      ‚w xY w)aM  
    Import faiss if available, otherwise raise error.
    If FAISS_NO_AVX2 environment variable is set, it will be considered
    to load FAISS with no AVX2 optimization.

    Args:
        no_avx2: Load FAISS strictly with no AVX2 optimization
            so that the vectorstore is portable and compatible with other devices.
    NÚFAISS_NO_AVX2r   )Ú	swigfaissz¨Could not import faiss python package. Please install it with `pip install faiss-gpu` (for CUDA supported GPU) or `pip install faiss-cpu` (depending on Python version).)ÚosÚenvironÚboolÚgetenvÚfaissr   ÚImportError)Úno_avx2r   s     úp/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/vectorstores/faiss.pyÚdependable_faiss_importr#   '   si   € ð €˜?¬b¯j©jÑ8Ü”r—y‘y Ó1Ó2ˆð

ÙÝ0ð €Lô ð €Løô ò 
ÜðHó
ð 	
ð
ús   ´A ¾A ÁAc                óÎ   — t        | t        «      rUt        |t        «      rEt        | «      t        |«      k7  r.t        |› d|› d|› dt        | «      › d|› dt        |«      › �«      ‚y )Nz and z% expected to be equal length but len(z)=z	 and len()Ú
isinstancer   ÚlenÚ
ValueError)ÚxÚyÚx_nameÚy_names       r"   Ú_len_check_if_sizedr,   B   sk   € Ü�!”UÔ¤
¨1¬eÔ 4¼¸Q»Ä3ÀqÃ6Ò9IÜØˆh�e˜F˜8ð $Ø�(˜"œS ›V˜H I¨f¨X°R¼¸A»°xðAó
ð 	
ð ó    c                  ó4  — e Zd ZdZddej
                  f	 	 	 	 	 	 	 	 	 	 	 	 	 d1d„Zed2d„«       Zd3d„Z	d3d„Z
d4d„Zd4d	„Z	 	 d5	 	 	 	 	 	 	 	 	 d6d
„Z	 	 d5	 	 	 	 	 	 	 	 	 d7d„Z	 	 d5	 	 	 	 	 	 	 	 	 d7d„Z	 	 d5	 	 	 	 	 	 	 	 	 d8d„Z	 	 	 d9	 	 	 	 	 	 	 	 	 	 	 d:d„Z	 	 	 d9	 	 	 	 	 	 	 	 	 	 	 d:d„Z	 	 	 d9	 	 	 	 	 	 	 	 	 	 	 d;d„Z	 	 	 d9	 	 	 	 	 	 	 	 	 	 	 d;d„Z	 	 	 d9	 	 	 	 	 	 	 	 	 	 	 d<d„Z	 	 	 d9	 	 	 	 	 	 	 	 	 	 	 d=d„Z	 	 	 d9	 	 	 	 	 	 	 	 	 	 	 d>d„Z	 	 	 d9	 	 	 	 	 	 	 	 	 	 	 d>d„Zdddddœ	 	 	 	 	 	 	 	 	 	 	 d?d„Zdddddœ	 	 	 	 	 	 	 	 	 	 	 d?d„Z	 	 	 	 d@	 	 	 	 	 	 	 	 	 	 	 	 	 dAd„Z	 	 	 	 d@	 	 	 	 	 	 	 	 	 	 	 	 	 dAd„Z	 	 	 	 d@	 	 	 	 	 	 	 	 	 	 	 	 	 dBd„Z	 	 	 	 d@	 	 	 	 	 	 	 	 	 	 	 	 	 dBd„ZdCdDd „ZdEd!„Z e!dddej
                  f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dFd"„«       Z"e!	 	 d5	 	 	 	 	 	 	 	 	 	 	 dGd#„«       Z#e!	 	 d5	 	 	 	 	 	 	 	 	 	 	 dHd$„«       Z$e!	 	 d5	 	 	 	 	 	 	 	 	 	 	 dId%„«       Z%e!	 	 d5	 	 	 	 	 	 	 	 	 	 	 dId&„«       Z&dJdKd'„Z'e!	 dJdd(œ	 	 	 	 	 	 	 	 	 	 	 dLd)„«       Z(dMd*„Z)e!dd(œ	 	 	 	 	 	 	 	 	 dNd+„«       Z*dOd,„Z+	 	 	 d9	 	 	 	 	 	 	 	 	 	 	 d;d-„Z,	 	 	 d9	 	 	 	 	 	 	 	 	 	 	 d;d.„Z-e.	 	 	 	 dPd/„«       Z/dQd0„Z0y)RÚFAISSuÇ  FAISS vector store integration.

    See [The FAISS Library](https://arxiv.org/pdf/2401.08281) paper.

    Setup:
        Install ``langchain_community`` and ``faiss-cpu`` python packages.

        .. code-block:: bash

            pip install -qU langchain_community faiss-cpu

    Key init args â€” indexing params:
        embedding_function: Embeddings
            Embedding function to use.

    Key init args â€” client params:
        index: Any
            FAISS index to use.
        docstore: Docstore
            Docstore to use.
        index_to_docstore_id: Dict[int, str]
            Mapping of index to docstore id.

    Instantiate:
        .. code-block:: python

            import faiss
            from langchain_community.vectorstores import FAISS
            from langchain_community.docstore.in_memory import InMemoryDocstore
            from langchain_openai import OpenAIEmbeddings

            index = faiss.IndexFlatL2(len(OpenAIEmbeddings().embed_query("hello world")))

            vector_store = FAISS(
                embedding_function=OpenAIEmbeddings(),
                index=index,
                docstore= InMemoryDocstore(),
                index_to_docstore_id={}
            )

    Add Documents:
        .. code-block:: python

            from langchain_core.documents import Document

            document_1 = Document(page_content="foo", metadata={"baz": "bar"})
            document_2 = Document(page_content="thud", metadata={"bar": "baz"})
            document_3 = Document(page_content="i will be deleted :(")

            documents = [document_1, document_2, document_3]
            ids = ["1", "2", "3"]
            vector_store.add_documents(documents=documents, ids=ids)

    Delete Documents:
        .. code-block:: python

            vector_store.delete(ids=["3"])

    Search:
        .. code-block:: python

            results = vector_store.similarity_search(query="thud",k=1)
            for doc in results:
                print(f"* {doc.page_content} [{doc.metadata}]")

        .. code-block:: python

            * thud [{'bar': 'baz'}]

    Search with filter:
        .. code-block:: python

            results = vector_store.similarity_search(query="thud",k=1,filter={"bar": "baz"})
            for doc in results:
                print(f"* {doc.page_content} [{doc.metadata}]")

        .. code-block:: python

            * thud [{'bar': 'baz'}]

    Search with score:
        .. code-block:: python

            results = vector_store.similarity_search_with_score(query="qux",k=1)
            for doc, score in results:
                print(f"* [SIM={score:3f}] {doc.page_content} [{doc.metadata}]")

        .. code-block:: python

            * [SIM=0.335304] foo [{'baz': 'bar'}]

    Async:
        .. code-block:: python

            # add documents
            # await vector_store.aadd_documents(documents=documents, ids=ids)

            # delete documents
            # await vector_store.adelete(ids=["3"])

            # search
            # results = vector_store.asimilarity_search(query="thud",k=1)

            # search with score
            results = await vector_store.asimilarity_search_with_score(query="qux",k=1)
            for doc,score in results:
                print(f"* [SIM={score:3f}] {doc.page_content} [{doc.metadata}]")

        .. code-block:: python

            * [SIM=0.335304] foo [{'baz': 'bar'}]

    Use as Retriever:
        .. code-block:: python

            retriever = vector_store.as_retriever(
                search_type="mmr",
                search_kwargs={"k": 1, "fetch_k": 2, "lambda_mult": 0.5},
            )
            retriever.invoke("thud")

        .. code-block:: python

            [Document(metadata={'bar': 'baz'}, page_content='thud')]

    NFc                óJ  — t        |t        «      st        j                  d«       || _        || _        || _        || _        || _        || _	        || _
        | j                  t        j                  k7  r0| j                  r#t        j                  d| j                  › �«       yyy)z%Initialize with necessary components.út`embedding_function` is expected to be an Embeddings object, support for passing in a function will soon be removed.z2Normalizing L2 is not applicable for metric type: N)r%   r   ÚloggerÚwarningÚembedding_functionÚindexÚdocstoreÚindex_to_docstore_idÚdistance_strategyÚoverride_relevance_score_fnÚ_normalize_L2r   ÚEUCLIDEAN_DISTANCEÚwarningsÚwarn)Úselfr4   r5   r6   r7   Úrelevance_score_fnÚnormalize_L2r8   s           r"   Ú__init__zFAISS.__init__Ë   s¤   € ô Ð,¬jÔ9Ü�N‰NðBôð #5ˆÔØˆŒ
Ø ˆŒØ$8ˆÔ!Ø!2ˆÔØ+=ˆÔ(Ø)ˆÔà×"Ñ"Ô&6×&IÑ&IÒIØ×"Ò"ä�M‰Mð Ø $× 6Ñ 6Ð7ð9õð #ð Jr-   c                óR   — t        | j                  t        «      r| j                  S d S ©N)r%   r4   r   ©r>   s    r"   Ú
embeddingszFAISS.embeddingsî   s.   € ô ˜$×1Ñ1´:Ô>ð ×#Ñ#ð	
ð ð	
r-   c                ó´   — t        | j                  t        «      r| j                  j                  |«      S |D �cg c]  }| j                  |«      ‘Œ c}S c c}w rC   )r%   r4   r   Úembed_documents)r>   ÚtextsÚtexts      r"   Ú_embed_documentszFAISS._embed_documentsö   sL   € Ü�d×-Ñ-¬zÔ:Ø×*Ñ*×:Ñ:¸5ÓAÐAá>CÓD¹e°d�D×+Ñ+¨DÕ1¸eÑDÐDùÒDs   ºAc              ƒ  óž   K  — t        | j                  t        «      r#| j                  j                  |«      ƒ d {  –—† S t	        d«      ‚7 Œ­w©Nr1   )r%   r4   r   Úaembed_documentsÚ	Exception)r>   rH   s     r"   Ú_aembed_documentszFAISS._aembed_documentsü   sK   è ø€ Ü�d×-Ñ-¬zÔ:Ø×0Ñ0×AÑAÀ%ÓH×HÐHô
 ðBóð ð Iúó   ‚9A»A¼Ac                óŽ   — t        | j                  t        «      r| j                  j                  |«      S | j                  |«      S rC   )r%   r4   r   Úembed_query©r>   rI   s     r"   Ú_embed_queryzFAISS._embed_query  s:   € Ü�d×-Ñ-¬zÔ:Ø×*Ñ*×6Ñ6°tÓ<Ð<à×*Ñ*¨4Ó0Ð0r-   c              ƒ  óž   K  — t        | j                  t        «      r#| j                  j                  |«      ƒ d {  –—† S t	        d«      ‚7 Œ­wrL   )r%   r4   r   Úaembed_queryrN   rS   s     r"   Ú_aembed_queryzFAISS._aembed_query  sK   è ø€ Ü�d×-Ñ-¬zÔ:Ø×0Ñ0×=Ñ=¸dÓC×CÐCô ðBóð ð DúrP   c           
     ó   — t        «       }t        | j                  t        «      st	        d| j                  › d�«      ‚t        ||dd«       |xs+ |D �cg c]  }t        t        j                  «       «      ‘Œ! c}}t        ||dd«       |xs	 d„ |D «       }t        |||«      D ��	�
cg c]  \  }}	}
t        ||	|
¬«      ‘Œ }}	}}
t        ||dd	«       |r+t        |«      t        t        |«      «      k7  rt	        d
«      ‚t        j                  |t        j                  ¬«      }| j                   r|j#                  |«       | j$                  j'                  |«       | j                  j'                  t        ||«      D ��ci c]  \  }}||“Œ
 c}}«       t        | j(                  «      }t+        |«      D ��ci c]  \  }}||z   |“Œ }}}| j(                  j-                  |«       |S c c}w c c}
}	}w c c}}w c c}}w )NzSIf trying to add texts, the underlying docstore should support adding items, which z	 does notrH   Ú	metadatasÚidsc              3  ó    K  — | ]  }i –— Œ y ­wrC   © )Ú.0Ú_s     r"   Ú	<genexpr>zFAISS.__add.<locals>.<genexpr>+  s   è ø€ Ð"5©u¨!¤2©uùs   ‚)ÚidÚpage_contentÚmetadataÚ	documentsrE   z$Duplicate ids found in the ids list.©Údtype)r#   r%   r6   r   r'   r,   ÚstrÚuuidÚuuid4Úzipr   r&   ÚsetÚnpÚarrayÚfloat32r:   r@   r5   Úaddr7   Ú	enumerateÚupdate)r>   rH   rE   rY   rZ   r   r^   Ú
_metadatasÚid_ÚtÚmrc   ÚvectorÚdocÚstarting_lenÚjÚindex_to_ids                    r"   Ú__addzFAISS.__add  sÌ  € ô (Ó)ˆÜ˜$Ÿ-™-¬Ô6Üð'Ø'+§}¡} o°Yð@óð ô
 	˜E 9¨g°{ÔCàÒ7±Ó7±¨A”cœ$Ÿ*™*›,Õ'°Ñ7ˆÜ˜E 3¨°Ô7àÒ5Ñ"5©uÓ"5ˆ
ô !  e¨ZÔ8õ
á8‘	��Q˜ô ˜¨!°aÖ8Ø8ð 	ò 
ô
 	˜I z°;ÀÔMá”3�s“8œs¤3 s£8›}Ò,ÜÐCÓDÐDä—‘˜*¬B¯J©JÔ7ˆØ×ÒØ×Ñ˜vÔ&Ø�
‰
�‰�vÔð 	�‰×Ñ´C¸¸YÔ4GÔHÑ4G©¨¨S˜3 ™8Ð4GÒHÔIÜ˜4×4Ñ4Ó5ˆÜ;DÀS¼>ÔJ¹>±°°C�| aÑ'¨Ñ,¸>ˆÑJØ×!Ñ!×(Ñ(¨Ô5Øˆ
ùò1 8ùô
ùó  IùãJs   Á$G(Â'G-Æ G4
Æ8G:c                ód   — t        |«      }| j                  |«      }| j                  ||||¬«      S )al  Run more texts through the embeddings and add to the vectorstore.

        Args:
            texts: Iterable of strings to add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.
            ids: Optional list of unique IDs.

        Returns:
            List of ids from adding the texts into the vectorstore.
        ©rY   rZ   )ÚlistrJ   Ú_FAISS__add©r>   rH   rY   rZ   ÚkwargsrE   s         r"   Ú	add_textszFAISS.add_textsB  s4   € ô" �U“ˆØ×*Ñ*¨5Ó1ˆ
Ø�z‰z˜% °yÀcˆzÓJÐJr-   c              ‹  ó€   K  — t        |«      }| j                  |«      ƒ d{  –—† }| j                  ||||¬«      S 7 Œ­w)a‡  Run more texts through the embeddings and add to the vectorstore
            asynchronously.

        Args:
            texts: Iterable of strings to add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.
            ids: Optional list of unique IDs.

        Returns:
            List of ids from adding the texts into the vectorstore.
        Nr|   )r}   rO   r~   r   s         r"   Ú
aadd_textszFAISS.aadd_textsW  s@   è ø€ ô$ �U“ˆØ×1Ñ1°%Ó8×8ˆ
Ø�z‰z˜% °yÀcˆzÓJÐJð 9ús   ‚ >¢<£>c                óB   — t        |Ž \  }}| j                  ||||¬«      S )aŽ  Add the given texts and embeddings to the vectorstore.

        Args:
            text_embeddings: Iterable pairs of string and embedding to
                add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.
            ids: Optional list of unique IDs.

        Returns:
            List of ids from adding the texts into the vectorstore.
        r|   )ri   r~   )r>   Útext_embeddingsrY   rZ   r€   rH   rE   s          r"   Úadd_embeddingszFAISS.add_embeddingsm  s*   € ô&   Ð1ÑˆˆzØ�z‰z˜% °yÀcˆzÓJÐJr-   é   é   c                ó|  — t        «       }t        j                  |gt        j                  ¬«      }| j                  r|j                  |«       | j                  j                  ||€|n|«      \  }}	g }
|�| j                  |«      }t        |	d   «      D ]ž  \  }}|dk(  rŒ| j                  |   }| j                  j                  |«      }t        |t        «      st        d|› d|› �«      ‚|�- |j                  «      sŒl|
j!                  ||d   |   f«       Œ†|
j!                  ||d   |   f«       Œ  |j#                  d«      }|�k| j$                  t&        j(                  t&        j*                  fv rt,        j.                  nt,        j0                  }|
D ��cg c]  \  }} |||«      r||f‘Œ }
}}|
d| S c c}}w )aœ  Return docs most similar to query.

        Args:
            embedding: Embedding vector to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            filter (Optional[Union[Callable, Dict[str, Any]]]): Filter by metadata.
                Defaults to None. If a callable, it must take as input the
                metadata dict of Document and return a bool.
            fetch_k: (Optional[int]) Number of Documents to fetch before filtering.
                      Defaults to 20.
            **kwargs: kwargs to be passed to similarity search. Can include:
                score_threshold: Optional, a floating point value between 0 to 1 to
                    filter the resulting set of retrieved docs

        Returns:
            List of documents most similar to the query text and L2 distance
            in float for each. Lower score represents more similarity.
        rd   Nr   éÿÿÿÿúCould not find document for id ú, got Úscore_threshold)r#   rk   rl   rm   r:   r@   r5   ÚsearchÚ_create_filter_funcro   r7   r6   r%   r   r'   rb   ÚappendÚgetr8   r   ÚMAX_INNER_PRODUCTÚJACCARDÚoperatorÚgeÚle)r>   Ú	embeddingÚkÚfilterÚfetch_kr€   r   ru   ÚscoresÚindicesÚdocsÚfilter_funcrx   ÚiÚ_idrv   r�   ÚcmpÚ
similaritys                      r"   Ú&similarity_search_with_score_by_vectorz,FAISS.similarity_search_with_score_by_vectorƒ  s»  € ô4 (Ó)ˆÜ—‘˜9˜+¬R¯Z©ZÔ8ˆØ×ÒØ×Ñ˜vÔ&ØŸ*™*×+Ñ+¨F¸¸±AÈWÓU‰ˆ�ØˆàÐØ×2Ñ2°6Ó:ˆKä˜g a™jÖ)‰DˆAˆqØ�BŠwàØ×+Ñ+¨AÑ.ˆCØ—-‘-×&Ñ& sÓ+ˆCÜ˜c¤8Ô,Ü Ð#BÀ3À%ÀvÈcÈUÐ!SÓTÐTØÐ!Ù˜sŸ|™|Õ,Ø—K‘K  f¨Q¡i°¡lÐ 3Õ4à—‘˜S &¨¡)¨A¡,Ð/Õ0ð *ð !Ÿ*™*Ð%6Ó7ˆØÐ&ð ×)Ñ)Ü$×6Ñ6Ô8H×8PÑ8PÐQñRô —’ô —[‘[ð	 ñ (,ôá'+‘O�C˜Ù�z ?Ô3ð �jÒ!Ø'+ð ñ ð
 �B�Qˆxˆùós   ÆF8c              ‹  óV   K  — t        d| j                  |f|||dœ|¤Žƒ d{  –—† S 7 Œ­w)a›  Return docs most similar to query asynchronously.

        Args:
            embedding: Embedding vector to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            filter (Optional[Dict[str, Any]]): Filter by metadata.
                Defaults to None. If a callable, it must take as input the
                metadata dict of Document and return a bool.

            fetch_k: (Optional[int]) Number of Documents to fetch before filtering.
                      Defaults to 20.
            **kwargs: kwargs to be passed to similarity search. Can include:
                score_threshold: Optional, a floating point value between 0 to 1 to
                    filter the resulting set of retrieved docs

        Returns:
            List of documents most similar to the query text and L2 distance
            in float for each. Lower score represents more similarity.
        N©r˜   r™   rš   )r   r£   )r>   r—   r˜   r™   rš   r€   s         r"   Ú'asimilarity_search_with_score_by_vectorz-FAISS.asimilarity_search_with_score_by_vectorÄ  sH   è ø€ ô: %ØØ×7Ñ7Øð
ð ØØñ
ð ñ
÷ 
ð 	
ð 
úó   ‚ )¢'£)c                óV   — | j                  |«      } | j                  ||f||dœ|¤Ž}|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.
            filter (Optional[Dict[str, str]]): Filter by metadata.
                Defaults to None. If a callable, it must take as input the
                metadata dict of Document and return a bool.

            fetch_k: (Optional[int]) Number of Documents to fetch before filtering.
                      Defaults to 20.

        Returns:
            List of documents most similar to the query text with
            L2 distance in float. Lower score represents more similarity.
        ©r™   rš   )rT   r£   ©r>   Úqueryr˜   r™   rš   r€   r—   r�   s           r"   Úsimilarity_search_with_scorez"FAISS.similarity_search_with_scoreë  sJ   € ð0 ×%Ñ% eÓ,ˆ	Ø:ˆt×:Ñ:ØØð
ð Øñ	
ð
 ñ
ˆð ˆr-   c              ‹  ó†   K  — | j                  |«      ƒ d{  –—† } | j                  ||f||dœ|¤Žƒ d{  –—† }|S 7 Œ%7 Œ­w)a£  Return docs most similar to query asynchronously.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata.
                Defaults to None. If a callable, it must take as input the
                metadata dict of Document and return a bool.

            fetch_k: (Optional[int]) Number of Documents to fetch before filtering.
                      Defaults to 20.

        Returns:
            List of documents most similar to the query text with
            L2 distance in float. Lower score represents more similarity.
        Nr©   )rW   r¦   rª   s           r"   Úasimilarity_search_with_scorez#FAISS.asimilarity_search_with_score  sa   è ø€ ð0 ×,Ñ,¨UÓ3×3ˆ	ØA�T×AÑAØØð
ð Øñ	
ð
 ñ
÷ 
ˆð ˆð 4øð
ús   ‚A—=˜A¶?·A¿Ac                óf   —  | j                   ||f||dœ|¤Ž}|D ��cg c]  \  }}|‘Œ	 c}}S c c}}w )aY  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.
            filter (Optional[Dict[str, str]]): Filter by metadata.
                Defaults to None. If a callable, it must take as input the
                metadata dict of Document and return a bool.

            fetch_k: (Optional[int]) Number of Documents to fetch before filtering.
                      Defaults to 20.

        Returns:
            List of Documents most similar to the embedding.
        r©   )r£   ©	r>   r—   r˜   r™   rš   r€   Údocs_and_scoresrv   r^   s	            r"   Úsimilarity_search_by_vectorz!FAISS.similarity_search_by_vector/  sR   € ð. F˜$×EÑEØØð
ð Øñ	
ð
 ñ
ˆñ #2Ô2¡/™˜˜Q’ /Ò2Ð2ùÓ2ó   �-c              ‹  ó‚   K  —  | j                   ||f||dœ|¤Žƒ d{  –—† }|D ��cg c]  \  }}|‘Œ	 c}}S 7 Œc c}}w ­w)ah  Return docs most similar to embedding vector asynchronously.

        Args:
            embedding: Embedding to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata.
                Defaults to None. If a callable, it must take as input the
                metadata dict of Document and return a bool.

            fetch_k: (Optional[int]) Number of Documents to fetch before filtering.
                      Defaults to 20.

        Returns:
            List of Documents most similar to the embedding.
        r©   N)r¦   r°   s	            r"   Úasimilarity_search_by_vectorz"FAISS.asimilarity_search_by_vectorO  sb   è ø€ ð. !M × LÑ LØØð!
ð Øñ	!
ð
 ñ!
÷ 
ˆñ #2Ô2¡/™˜˜Q’ /Ò2Ð2ð
úó 3ùó   ‚?�7ž	?§9³?¹?c                óf   —  | j                   ||f||dœ|¤Ž}|D ��cg c]  \  }}|‘Œ	 c}}S c c}}w )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.
            filter: (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.
            fetch_k: (Optional[int]) Number of Documents to fetch before filtering.
                      Defaults to 20.

        Returns:
            List of Documents most similar to the query.
        r©   )r¬   ©	r>   r«   r˜   r™   rš   r€   r±   rv   r^   s	            r"   Úsimilarity_searchzFAISS.similarity_searcho  sK   € ð( <˜$×;Ñ;Ø�1ð
Ø#¨Wñ
Ø8>ñ
ˆñ #2Ô2¡/™˜˜Q’ /Ò2Ð2ùÓ2r³   c              ‹  ó‚   K  —  | j                   ||f||dœ|¤Žƒ d{  –—† }|D ��cg c]  \  }}|‘Œ	 c}}S 7 Œc c}}w ­w)aÚ  Return docs most similar to query asynchronously.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            filter: (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.
            fetch_k: (Optional[int]) Number of Documents to fetch before filtering.
                      Defaults to 20.

        Returns:
            List of Documents most similar to the query.
        r©   N)r®   r¸   s	            r"   Úasimilarity_searchzFAISS.asimilarity_searchˆ  s\   è ø€ ð( !C × BÑ BØ�1ð!
Ø#¨Wñ!
Ø8>ñ!
÷ 
ˆñ #2Ô2¡/™˜˜Q’ /Ò2Ð2ð
úó 3ùr¶   ç      à?©r˜   rš   Úlambda_multr™   c               óÐ  — | j                   j                  t        j                  |gt        j                  ¬«      |€|n|dz  «      \  }}|�¨| j                  |«      }g }	|d   D ]w  }
|
dk(  rŒ	| j                  |
   }| j                  j                  |«      }t        |t        «      st        d|› d|› �«      ‚ ||j                  «      sŒg|	j                  |
«       Œy t        j                  |	g«      }|d   D �
cg c],  }
|
dk7  sŒ	| j                   j                  t        |
«      «      ‘Œ. }}
t        t        j                  |gt        j                  ¬«      |||¬«      }g }|D ]x  }
|d   |
   dk(  rŒ| j                  |d   |
      }| j                  j                  |«      }t        |t        «      st        d|› d|› �«      ‚|j                  ||d   |
   f«       Œz |S c c}
w )az  Return docs and their similarity scores 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.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch before filtering 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 and similarity scores selected by maximal marginal
                relevance and score for each.
        rd   é   r   rŠ   r‹   rŒ   )r˜   r¾   )r5   rŽ   rk   rl   rm   r�   r7   r6   r%   r   r'   rb   r�   ÚreconstructÚintr   )r>   r—   r˜   rš   r¾   r™   r›   rœ   rž   Úfiltered_indicesrŸ   r    rv   rE   Úmmr_selectedr±   s                   r"   Ú2max_marginal_relevance_search_with_score_by_vectorz8FAISS.max_marginal_relevance_search_with_score_by_vector¡  sß  € ð8 Ÿ*™*×+Ñ+Ü�H‰H�i�[¬¯
©
Ô3Ø�~‰G¨7°Q©;ó
‰ˆ�ð ÐØ×2Ñ2°6Ó:ˆKØ!ÐØ˜Q”Z�Ø˜’7àØ×/Ñ/°Ñ2�Ø—m‘m×*Ñ*¨3Ó/�Ü! #¤xÔ0Ü$Ð'FÀsÀeÈ6ÐRUÐQVÐ%WÓXÐXÙ˜sŸ|™|Õ,Ø$×+Ñ+¨AÕ.ð  ô —h‘hÐ 0Ð1Ó2ˆGà>EÀaºjÓT¹j¸ÈAÐQSËG�d—j‘j×,Ñ,¬S°«VÕ4¸jˆ
ÐTÜ1Ü�H‰H�i�[¬¯
©
Ô3ØØØ#ô	
ˆð ˆÛˆAØ�q‰z˜!‰} Ò"àØ×+Ñ+¨G°A©J°q©MÑ:ˆCØ—-‘-×&Ñ& sÓ+ˆCÜ˜c¤8Ô,Ü Ð#BÀ3À%ÀvÈcÈUÐ!SÓTÐTØ×"Ñ" C¨°©°1©Ð#6Õ7ð ð Ðùò' Us   Ã<
G#Ä&G#c          	   ƒ  óV   K  — t        d| j                  |||||¬«      ƒ d{  –—† S 7 Œ­w)a‰  Return docs and their similarity scores selected using the maximal marginal
            relevance asynchronously.

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

        Args:
            embedding: Embedding to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch before filtering 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 and similarity scores selected by maximal marginal
                relevance and score for each.
        Nr½   )r   rÅ   )r>   r—   r˜   rš   r¾   r™   s         r"   Ú3amax_marginal_relevance_search_with_score_by_vectorz9FAISS.amax_marginal_relevance_search_with_score_by_vectorå  s:   è ø€ ô: %ØØ×CÑCØØØØ#Øô
÷ 
ð 	
ð 
úr§   c                ód   — | j                  |||||¬«      }|D ��	cg c]  \  }}	|‘Œ	 c}	}S 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.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch before filtering 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Å   ©
r>   r—   r˜   rš   r¾   r™   r€   r±   rv   r^   s
             r"   Ú'max_marginal_relevance_search_by_vectorz-FAISS.max_marginal_relevance_search_by_vector  sC   € ð4 ×QÑQØ˜ G¸ÈVð Ró 
ˆñ #2Ô2¡/™˜˜Q’ /Ò2Ð2ùÓ2s   œ,c              ‹  ó€   K  — | j                  |||||¬«      ƒ d{  –—† }|D ��	cg c]  \  }}	|‘Œ	 c}	}S 7 Œc c}	}w ­w)a(  Return docs selected using the maximal marginal relevance asynchronously.

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

        Args:
            embedding: Embedding to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch before filtering 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½   N)rÇ   rÉ   s
             r"   Ú(amax_marginal_relevance_search_by_vectorz.FAISS.amax_marginal_relevance_search_by_vector+  sW   è ø€ ð6 ×JÑJØ˜Q¨¸[ÐQWð Kó ÷ ð 	ñ
 #2Ô2¡/™˜˜Q’ /Ò2Ð2ð	úó 3ùs   ‚>œ6�	>¦8²>¸>c                óX   — | j                  |«      } | j                  |f||||dœ|¤Ž}|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 before filtering (if needed) 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½   )rT   rÊ   ©	r>   r«   r˜   rš   r¾   r™   r€   r—   r�   s	            r"   Úmax_marginal_relevance_searchz#FAISS.max_marginal_relevance_searchL  sK   € ð4 ×%Ñ% eÓ,ˆ	Ø;ˆt×;Ñ;Øð
àØØ#Øñ
ð ñ
ˆð ˆr-   c              ‹  óˆ   K  — | j                  |«      ƒ d{  –—† } | j                  |f||||dœ|¤Žƒ d{  –—† }|S 7 Œ&7 Œ­w)a+  Return docs selected using the maximal marginal relevance asynchronously.

        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 before filtering (if needed) 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.
        Nr½   )rW   rÌ   rÎ   s	            r"   Úamax_marginal_relevance_searchz$FAISS.amax_marginal_relevance_searchq  sb   è ø€ ð4 ×,Ñ,¨UÓ3×3ˆ	ØB�T×BÑBØð
àØØ#Øñ
ð ñ
÷ 
ˆð ˆð 4øð
ús   ‚A—>˜A·A ¸AÁ Ac                óº  — |€t        d«      ‚t        |«      j                  | j                  j	                  «       «      }|rt        d|› �«      ‚| j                  j                  «       D ��ci c]  \  }}||“Œ
 }}}|D �ch c]  }||   ’Œ	 }}| j                  j                  t        j                  |t        j                  ¬«      «       | j                  j                  |«       t        | j                  j                  «       «      D ��cg c]  \  }}||vr|‘Œ }	}}t        |	«      D ��ci c]  \  }}||“Œ
 c}}| _        yc c}}w c c}w c c}}w c c}}w )z÷Delete by ID. These are the IDs in the vectorstore.

        Args:
            ids: List of ids to delete.

        Returns:
            Optional[bool]: True if deletion is successful,
            False otherwise, None if not implemented.
        zNo ids provided to delete.zESome specified ids do not exist in the current store. Ids not found: rd   T)r'   rj   Ú
differencer7   ÚvaluesÚitemsr5   Ú
remove_idsrk   ÚfromiterÚint64r6   ÚdeleteÚsortedro   )
r>   rZ   r€   Úmissing_idsÚidxrr   Úreversed_indexÚindex_to_deleterŸ   Úremaining_idss
             r"   rÙ   zFAISS.delete–  sR  € ð ˆ;ÜÐ9Ó:Ð:Ü˜#“h×)Ñ)¨$×*CÑ*C×*JÑ*JÓ*LÓMˆÙÜØWØ�-ð!óð ð
 48×3LÑ3L×3RÑ3RÔ3TÔUÑ3T¡x s¨C˜#˜s™(Ð3TˆÑUÙ:=Ó>¹#°3˜>¨#Ó.¸#ˆÐ>à�
‰
×ÑœbŸk™k¨/ÄÇÁÔJÔKØ�‰×Ñ˜SÔ!ô ! ×!:Ñ!:×!@Ñ!@Ó!BÔCô
áC‘��3Ø˜Ñ'ò ØCð 	ñ 
ô
 ;DÀMÔ:RÔ$SÑ:R±°°3 Q¨¡VÐ:RÒ$SˆÔ!àùó VùÚ>ùó

ùó
 %Ts   Á-EÂEÄEÄ/Ec           
     óŠ  — t        | j                  t        «      st        d«      ‚t	        | j
                  «      }| j                  j                  |j                  «       g }|j
                  j                  «       D ]R  \  }}|j                  j                  |«      }t        |t        «      st        d«      ‚|j                  ||z   ||f«       ŒT | j                  j                  |D ���ci c]	  \  }}}||“Œ c}}}«       |D �	��ci c]	  \  }	}}|	|“Œ }
}}	}| j
                  j                  |
«       yc c}}}w c c}}}	w )zæMerge another FAISS object with the current one.

        Add the target FAISS to the current one.

        Args:
            target: FAISS object you wish to merge into the current one

        Returns:
            None.
        z'Cannot merge with this type of docstorezDocument should be returnedN)r%   r6   r   r'   r&   r7   r5   Ú
merge_fromrÕ   rŽ   r   r�   rn   rp   )r>   Útargetrw   Ú	full_inforŸ   Ú	target_idrv   r^   r    r5   ry   s              r"   rá   zFAISS.merge_from¸  s  € ô ˜$Ÿ-™-¬Ô6ÜÐFÓGÐGä˜4×4Ñ4Ó5ˆð 	�
‰
×Ñ˜fŸl™lÔ+ð ˆ	Ø"×7Ñ7×=Ñ=Ö?‰LˆAˆyØ—/‘/×(Ñ(¨Ó3ˆCÜ˜c¤8Ô,Ü Ð!>Ó?Ð?Ø×Ñ˜l¨QÑ.°	¸3Ð?Õ@ð	 @ð 	�‰×Ñ±yÕA±y©¨¨3°˜3 ™8°yÓAÔBÙ7@ÕA±y¡m e¨S°!�u˜c‘z°yˆÒAØ×!Ñ!×(Ñ(¨Õ5ùô BùÜAs   Ã,D7Ä	D>c                óV  — t        «       }	|t        j                  k(  r|	j                  t	        |d   «      «      }
n|	j                  t	        |d   «      «      }
|j                  dt        «       «      }|j                  di «      } | ||
||f||dœ|¤Ž}|j                  ||||¬«       |S )Nr   r6   r7   )r@   r8   r|   )	r#   r   r’   ÚIndexFlatIPr&   ÚIndexFlatL2Úpopr   r~   )ÚclsrH   rE   r—   rY   rZ   r@   r8   r€   r   r5   r6   r7   Úvecstores                 r"   Ú__fromzFAISS.__fromØ  s½   € ô (Ó)ˆØÔ 0× BÑ BÒBØ×%Ñ%¤c¨*°Q©-Ó&8Ó9‰Eð ×%Ñ%¤c¨*°Q©-Ó&8Ó9ˆEØ—:‘:˜jÔ*:Ó*<Ó=ˆØ%Ÿz™zÐ*@À"ÓEÐÙØØØØ ð	
ð
 &Ø/ñ
ð ñ
ˆð 	�‰�u˜j°IÀ3ˆÔGØˆr-   c                óT   — |j                  |«      } | j                  |||f||dœ|¤ŽS )aO  Construct FAISS wrapper from raw documents.

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

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

        Example:
            .. code-block:: python

                from langchain_community.vectorstores import FAISS
                from langchain_community.embeddings import OpenAIEmbeddings

                embeddings = OpenAIEmbeddings()
                faiss = FAISS.from_texts(texts, embeddings)
        r|   )rG   Ú_FAISS__from©ré   rH   r—   rY   rZ   r€   rE   s          r"   Ú
from_textszFAISS.from_textsø  sG   € ð6 ×.Ñ.¨uÓ5ˆ
Øˆs�z‰zØØØð
ð  Øñ
ð ñ
ð 	
r-   c              ‹  óp   K  — |j                  |«      ƒ d{  –—† } | j                  |||f||dœ|¤ŽS 7 Œ­w)ae  Construct FAISS wrapper from raw documents asynchronously.

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

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

        Example:
            .. code-block:: python

                from langchain_community.vectorstores import FAISS
                from langchain_community.embeddings import OpenAIEmbeddings

                embeddings = OpenAIEmbeddings()
                faiss = await FAISS.afrom_texts(texts, embeddings)
        Nr|   )rM   rí   rî   s          r"   Úafrom_textszFAISS.afrom_texts  sS   è ø€ ð6 %×5Ñ5°eÓ<×<ˆ
Øˆs�z‰zØØØð
ð  Øñ
ð ñ
ð 	
ð =ús   ‚6—4˜6c                ól   — t        |Ž \  }} | j                  t        |«      t        |«      |f||dœ|¤ŽS )aê  Construct FAISS wrapper from raw documents.

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

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

        Example:
            .. code-block:: python

                from langchain_community.vectorstores import FAISS
                from langchain_community.embeddings import OpenAIEmbeddings

                embeddings = OpenAIEmbeddings()
                text_embeddings = embeddings.embed_documents(texts)
                text_embedding_pairs = zip(texts, text_embeddings)
                faiss = FAISS.from_embeddings(text_embedding_pairs, embeddings)
        r|   )ri   rí   r}   )ré   r…   r—   rY   rZ   r€   rH   rE   s           r"   Úfrom_embeddingszFAISS.from_embeddingsB  sO   € ô:   Ð1ÑˆˆzØˆs�z‰zÜ�‹KÜ�ÓØð
ð  Øñ
ð ñ
ð 	
r-   c              ‹  ó8   K  —  | j                   ||f||dœ|¤ŽS ­w)z:Construct FAISS wrapper from raw documents asynchronously.r|   )ró   )ré   r…   r—   rY   rZ   r€   s         r"   Úafrom_embeddingszFAISS.afrom_embeddingsi  s:   è ø€ ð #ˆs×"Ñ"ØØð
ð  Øñ	
ð
 ñ
ð 	
ùs   ‚c                óP  — t        |«      }|j                  dd¬«       t        «       }|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 FAISS index, docstore, and index_to_docstore_id to disk.

        Args:
            folder_path: folder path to save index, docstore,
                and index_to_docstore_id to.
            index_name: for saving with a specific index file name
        T)Úexist_okÚparentsú.faissú.pklÚwbN)r   Úmkdirr#   Úwrite_indexr5   rf   ÚopenÚpickleÚdumpr6   r7   )r>   Úfolder_pathÚ
index_nameÚpathr   Úfs         r"   Ú
save_localzFAISS.save_local{  s�   € ô �KÓ ˆØ�
‰
˜D¨$ˆ
Ô/ô (Ó)ˆØ×Ñ˜$Ÿ*™*¤c¨$°J°<¸vÐ1FÑ*FÓ&GÔHô �$˜J˜< tÐ,Ñ,¨dÔ3°qÜ�K‰K˜Ÿ™¨×(AÑ(AÐBÀAÔF÷ 4×3Ñ3ús   Á&-BÂB%)Úallow_dangerous_deserializationc               ó  — |st        d«      ‚t        |«      }t        «       }|j                  t	        ||› d�z  «      «      }t        ||› d�z  d«      5 }	t        j                  |	«      \  }
}ddd«        | ||
fi |¤ŽS # 1 sw Y   ŒxY w)a–  Load FAISS index, docstore, and index_to_docstore_id from disk.

        Args:
            folder_path: folder path to load index, docstore,
                and index_to_docstore_id from.
            embeddings: Embeddings to use when generating queries
            index_name: for saving with a specific index file name
            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.
        áB  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ú   ÚrbN)r'   r   r#   Ú
read_indexrf   rþ   rÿ   Úload)ré   r  rE   r  r  r€   r  r   r5   r  r6   r7   s               r"   Ú
load_localzFAISS.load_localŽ  s«   € ñ. /Üð	"óð ô �KÓ ˆä'Ó)ˆØ× Ñ ¤ T¨z¨l¸&Ð,AÑ%AÓ!BÓCˆô �$˜J˜< tÐ,Ñ,¨dÔ3°qô —‘ØóñØØ$÷ 4ñ �:˜u hÐ0DÑOÈÑOÐO÷ 4Ð3ús   ÁBÂBc                ón   — t        j                  | j                  | j                  | j                  f«      S )zCSerialize FAISS index, docstore, and index_to_docstore_id to bytes.)rÿ   Údumpsr5   r6   r7   rD   s    r"   Úserialize_to_byteszFAISS.serialize_to_bytesÂ  s&   € ä�|‰|˜TŸZ™Z¨¯©¸×8QÑ8QÐRÓSÐSr-   c               óf   — |st        d«      ‚t        j                  |«      \  }}} | ||||fi |¤ŽS )zGDeserialize FAISS index, docstore, and index_to_docstore_id from bytes.r  )r'   rÿ   Úloads)ré   Ú
serializedrE   r  r€   r5   r6   r7   s           r"   Údeserialize_from_byteszFAISS.deserialize_from_bytesÆ  sQ   € ñ /Üð	"óð ô  �L‰LØó
ñ		
ØØØ ñ �:˜u hÐ0DÑOÈÑOÐOr-   c                ó>  — | j                   �| j                   S | j                  t        j                  k(  r| j                  S | j                  t        j
                  k(  r| j                  S | j                  t        j                  k(  r| j                  S t        d«      ‚)a8  
        The 'correct' relevance function
        may differ depending on a few things, including:
        - the distance / similarity metric used by the VectorStore
        - the scale of your embeddings (OpenAI's are unit normed. Many others are not!)
        - embedding dimensionality
        - etc.
        zJUnknown distance strategy, must be cosine, max_inner_product, or euclidean)
r9   r8   r   r’   Ú%_max_inner_product_relevance_score_fnr;   Ú_euclidean_relevance_score_fnÚCOSINEÚ_cosine_relevance_score_fnr'   rD   s    r"   Ú_select_relevance_score_fnz FAISS._select_relevance_score_fnæ  s“   € ð ×+Ñ+Ð7Ø×3Ñ3Ð3ð ×!Ñ!Ô%5×%GÑ%GÒGØ×=Ñ=Ð=Ø×#Ñ#Ô'7×'JÑ'JÒJà×5Ñ5Ð5Ø×#Ñ#Ô'7×'>Ñ'>Ò>Ø×2Ñ2Ð2äð óð r-   c                ó²   — | j                  «       }|€t        d«      ‚ | j                  |f|||dœ|¤Ž}|D ��	cg c]  \  }}	| ||	«      f‘Œ }
}}	|
S c c}	}w )ú?Return docs and their similarity scores on a scale from 0 to 1.úLrelevance_score_fn must be provided to FAISS constructor to normalize scoresr¥   )r  r'   r¬   ©r>   r«   r˜   r™   rš   r€   r?   r±   rv   ÚscoreÚdocs_and_rel_scoress              r"   Ú(_similarity_search_with_relevance_scoresz.FAISS._similarity_search_with_relevance_scores  s–   € ð "×<Ñ<Ó>ÐØÐ%Üð9óð ð <˜$×;Ñ;Øð
àØØñ	
ð
 ñ
ˆñ @Oô
Ù?N±°°eˆSÑ$ UÓ+Ò,¸ð 	ñ 
ð #Ð"ùó
s   ºAc              ‹  óÎ   K  — | j                  «       }|€t        d«      ‚ | j                  |f|||dœ|¤Žƒ d{  –—† }|D ��	cg c]  \  }}	| ||	«      f‘Œ }
}}	|
S 7 Œ"c c}	}w ­w)r  Nr  r¥   )r  r'   r®   r  s              r"   Ú)_asimilarity_search_with_relevance_scoresz/FAISS._asimilarity_search_with_relevance_scores  s¥   è ø€ ð "×<Ñ<Ó>ÐØÐ%Üð9óð ð !C × BÑ BØð!
àØØñ	!
ð
 ñ!
÷ 
ˆñ @Oô
Ù?N±°°eˆSÑ$ UÓ+Ò,¸ð 	ñ 
ð #Ð"ð
úó
ùs!   ‚8A%ºA»	A%ÁAÁA%ÁA%c                ó†  ‡‡‡‡— t        | «      r| S t        | t        «      st        dt	        | «      › �«      ‚ddlm}m}m}m	}m
}m} ||||||dœ}d„ d„ dœ}||z  Št        t        ‰«      g d¢z   «      }	d	Š| D ])  }
|
sŒ|
j                  d
«      sŒ|
|	vsŒt        d|
› �«      ‚ 	 	 	 	 	 	 dˆˆfd„Šdˆˆfd„Š ‰| «      S )aÆ  
        Create a filter function based on the provided filter.

        Args:
            filter: A callable or a dictionary representing the filter
            conditions for documents.

        Returns:
            A function that takes Document's metadata and returns True if it
            satisfies the filter conditions, otherwise False.

        Raises:
            ValueError: If the filter is invalid or contains unsupported operators.
        z5filter must be a dict of metadata or a callable, not r   )Úeqr•   Úgtr–   ÚltÚne)z$eqz$neqz$gtz$ltz$gtez$ltec                ó
   — | |v S rC   r\   ©ÚaÚbs     r"   Ú<lambda>z+FAISS._create_filter_func.<locals>.<lambda>`  s   €   Q¡r-   c                ó
   — | |vS rC   r\   r)  s     r"   r,  z+FAISS._create_filter_func.<locals>.<lambda>a  s   €  ¨!¡r-   )z$inz$nin)ú$andú$orú$noté
   Ú$ú&filter contains unsupported operator: c                ó8  •‡ ‡‡‡— t        ‰t        «      rKg Š‰j                  «       D ]-  \  }}|‰vrt        d|› �«      ‚‰j	                  ‰|   |f«       Œ/ dˆ ˆfd„}|S t        ‰t
        «      r%t        ‰«      ‰kD  rt        ‰«      Šˆˆ fd„S ˆˆ fd„S ˆˆ fd„S )a„  
            Creates a filter function based on field and condition.

            Args:
                field: The document field to filter on
                condition: Filter condition (dict for operators, list for in,
                           or direct value for equality)

            Returns:
                A filter function that takes a document and returns boolean
            r3  c                óP   •‡— | j                  ‰«      Št        ˆfd„‰D «       «      S )aW  
                    Evaluates a document against a set of predefined operators
                    and their values. This function applies multiple
                    comparison/sequence operators to a specific field value
                    from the document. All conditions must be satisfied for the
                    function to return True.

                    Args:
                        doc (Dict[str, Any]): The document to evaluate, containing
                        key-value pairs where keys are field names and values
                        are the field values. The document must contain the field
                        being filtered.

                    Returns:
                        bool: True if the document's field value satisfies all
                            operator conditions, False otherwise.
                    c              3  ó6   •K  — | ]  \  }} |‰|«      –— Œ y ­wrC   r\   )r]   ÚopÚvalueÚ	doc_values      €r"   r_   zYFAISS._create_filter_func.<locals>.filter_func_cond.<locals>.filter_fn.<locals>.<genexpr>”  s   øè ø€ ÐOÁY¹	¸¸E™r )¨U×3ÁYùs   ƒ)r‘   Úall)rv   r9  ÚfieldÚ	operatorss    @€€r"   Ú	filter_fnzFFAISS._create_filter_func.<locals>.filter_func_cond.<locals>.filter_fn�  s#   ù€ ð$ !$§¡¨£�IÜÓOÁYÓOÓOÐOr-   c                ó*   •— | j                  ‰«      ‰v S rC   ©r‘   )rv   Úcondition_setr;  s    €€r"   r,  zEFAISS._create_filter_func.<locals>.filter_func_cond.<locals>.<lambda>›  s   ø€  s§w¡w¨u£~¸Ñ'Fr-   c                ó*   •— | j                  ‰«      ‰v S rC   r?  ©rv   Ú	conditionr;  s    €€r"   r,  zEFAISS._create_filter_func.<locals>.filter_func_cond.<locals>.<lambda>œ  s   ø€  3§7¡7¨5£>°YÑ#>r-   c                ó,   •— | j                  ‰«      ‰k(  S rC   r?  rB  s    €€r"   r,  zEFAISS._create_filter_func.<locals>.filter_func_cond.<locals>.<lambda>ž  s   ø€ ˜sŸw™w u›~°Ò:r-   )rv   úDict[str, Any]Úreturnr   )r%   ÚdictrÕ   r'   r�   r}   r&   Ú	frozenset)	r;  rC  r7  r8  r=  r@  r<  Ú
OPERATIONSÚSET_CONVERT_THRESHOLDs	   ``   @@€€r"   Úfilter_func_condz3FAISS._create_filter_func.<locals>.filter_func_condl  sž   ü€ ô ˜)¤TÔ*Ø�	Ø!*§¡Ö!2‘I�B˜Ø Ñ+Ü(Ð+QÐRTÐQUÐ)VÓWÐWØ×$Ñ$ j°¡n°eÐ%<Õ=ð "3ö
Pð* !Ð ä˜)¤TÔ*Ü�y“>Ð$9Ò9Ü$-¨iÓ$8�MÜFÐFÜ>Ð>ä:Ð:r-   c                ó8  •‡‡‡— d| v r| d   D �cg c]
  } ‰|«      ‘Œ c}Šˆfd„S d| v r| d   D �cg c]
  } ‰|«      ‘Œ c}Šˆfd„S d| v r ‰| d   «      Šˆfd„S | j                  «       D ��cg c]  \  }} ‰||«      ‘Œ c}}Šˆfd„S c c}w c c}w c c}}w )aÕ  
            Creates a filter function that evaluates documents against specified
            filter conditions.

            This function processes a dictionary of filter conditions and returns
            a callable that can evaluate documents against these conditions. It
            supports logical operators ($and, $or, $not) and field-level filtering.

            Args:
                filter (Dict[str, Any]): A dictionary containing filter conditions.
                Can include:
                    - Logical operators ($and, $or, $not) with lists of sub-filters
                    - Field-level conditions with comparison or sequence operators
                    - Direct field-value mappings for equality comparison

            Returns:
                Callable[[Dict[str, Any]], bool]: A function that takes a document
                (as a dictionary) and returns True if the document matches all
                filter conditions, False otherwise.
            r.  c                ó.   •‡ — t        ˆ fd„‰D «       «      S )Nc              3  ó.   •K  — | ]  } |‰«      –— Œ y ­wrC   r\   ©r]   r  rv   s     €r"   r_   zSFAISS._create_filter_func.<locals>.filter_func.<locals>.<lambda>.<locals>.<genexpr>·  ó   øè ø€ Ð&?±w°!¡q¨§v±wùó   ƒ©r:  ©rv   Úfilterss   `€r"   r,  z@FAISS._create_filter_func.<locals>.filter_func.<locals>.<lambda>·  ó   ù€ ¤3Ó&?±wÓ&?Ô#?r-   r/  c                ó.   •‡ — t        ˆ fd„‰D «       «      S )Nc              3  ó.   •K  — | ]  } |‰«      –— Œ y ­wrC   r\   rO  s     €r"   r_   zSFAISS._create_filter_func.<locals>.filter_func.<locals>.<lambda>.<locals>.<genexpr>»  rP  rQ  )ÚanyrS  s   `€r"   r,  z@FAISS._create_filter_func.<locals>.filter_func.<locals>.<lambda>»  rU  r-   r0  c                ó   •—  ‰| «       S rC   r\   )rv   Úconds    €r"   r,  z@FAISS._create_filter_func.<locals>.filter_func.<locals>.<lambda>¿  s   ø€ ¡t¨C£y¡=r-   c                ó.   •‡ — t        ˆ fd„‰D «       «      S )Nc              3  ó.   •K  — | ]  } |‰«      –— Œ y ­wrC   r\   )r]   rC  rv   s     €r"   r_   zSFAISS._create_filter_func.<locals>.filter_func.<locals>.<lambda>.<locals>.<genexpr>Å  s   øè ø€ Ð"NÁ:°i¡9¨S§>Á:ùrQ  rR  )rv   Ú
conditionss   `€r"   r,  z@FAISS._create_filter_func.<locals>.filter_func.<locals>.<lambda>Å  s   ù€ œsÓ"NÁ:Ó"NÔNr-   )rÕ   )	r™   Ú
sub_filterr;  rC  rZ  r]  rT  rž   rK  s	       @@@€€r"   rž   z.FAISS._create_filter_func.<locals>.filter_func   sÁ   û€ ð* ˜ÑØEKÈFÂ^ÓTÁ^°z™; zÕ2À^ÑT�Û?Ð?à˜‰ØEKÈEÂ]ÓSÁ]°z™; zÕ2À]ÑS�Û?Ð?à˜ÑÙ" 6¨&¡>Ó2�Û0Ð0ð )/¯©¬ôá(6Ñ$�E˜9ñ ! ¨	Õ2Ø(6òˆJó OÐNùò Uùò Tùós   �B²BÁ0B)r;  rf   rC  z%Union[Dict[str, Any], List[Any], Any]rF  ú Callable[[Dict[str, Any]], bool])r™   rE  rF  r_  )Úcallabler%   rG  r'   Útyper”   r$  r•   r%  r–   r&  r'  rH  r}   Ú
startswith)r™   r$  r•   r%  r–   r&  r'  ÚCOMPARISON_OPERATORSÚSEQUENCE_OPERATORSÚVALID_OPERATORSr7  rI  rJ  rž   rK  s              @@@@r"   r�   zFAISS._create_filter_func;  sù   û€ ô$ �FÔØˆMä˜&¤$Ô'ÜØGÌÈVËÀ~ÐVóð ÷ 	4×3ð ØØØØØñ 
Ðñ 'Ù+ñ
Ðð *Ð,>Ñ>ˆ
Ü#¤D¨Ó$4Ò7NÑ$NÓOˆØ "Ðó ˆBÚ�b—m‘m CÕ(¨R°Ò-FÜ Ð#IÈ"ÈÐ!NÓOÐOð ð2	;Øð2	;Ø#Hð2	;à-ö2	;öh%	OñN ˜6Ó"Ð"r-   c               ó¨   — |D �cg c]  }| j                   j                  |«      ‘Œ }}|D �cg c]  }t        |t        «      sŒ|‘Œ c}S c c}w c c}w rC   )r6   rŽ   r%   r   )r>   rZ   rr   r�   rv   s        r"   Ú
get_by_idszFAISS.get_by_idsÉ  sK   € Ù58Ó9±S¨c�—‘×$Ñ$ SÕ)°SˆÐ9Ù#ÓA™t˜¤z°#´xÕ'@’˜tÑAÐAùò :ùÚAs   …"A
­AÁA)r4   z/Union[Callable[[str], List[float]], Embeddings]r5   r   r6   r   r7   zDict[int, str]r?   z"Optional[Callable[[float], float]]r@   r   r8   r   )rF  zOptional[Embeddings])rH   ú	List[str]rF  úList[List[float]])rI   rf   rF  úList[float])NN)
rH   úIterable[str]rE   zIterable[List[float]]rY   úOptional[Iterable[dict]]rZ   úOptional[List[str]]rF  rh  )
rH   rk  rY   úOptional[List[dict]]rZ   rm  r€   r   rF  rh  )
r…   ú!Iterable[Tuple[str, List[float]]]rY   rn  rZ   rm  r€   r   rF  rh  )r‡   Nrˆ   )r—   rj  r˜   rÂ   r™   ú)Optional[Union[Callable, Dict[str, Any]]]rš   rÂ   r€   r   rF  úList[Tuple[Document, float]])r«   rf   r˜   rÂ   r™   rp  rš   rÂ   r€   r   rF  rq  )r—   rj  r˜   rÂ   r™   zOptional[Dict[str, Any]]rš   rÂ   r€   r   rF  úList[Document])r—   rj  r˜   rÂ   r™   rp  rš   rÂ   r€   r   rF  rr  )r«   rf   r˜   rÂ   r™   rp  rš   rÂ   r€   r   rF  rr  )r—   rj  r˜   rÂ   rš   rÂ   r¾   Úfloatr™   rp  rF  rq  )r‡   rˆ   r¼   N)r—   rj  r˜   rÂ   rš   rÂ   r¾   rs  r™   rp  r€   r   rF  rr  )r«   rf   r˜   rÂ   rš   rÂ   r¾   rs  r™   rp  r€   r   rF  rr  rC   )rZ   rm  r€   r   rF  úOptional[bool])râ   r/   rF  ÚNone)rH   rk  rE   ri  r—   r   rY   rl  rZ   rm  r@   r   r8   r   r€   r   rF  r/   )rH   rh  r—   r   rY   rn  rZ   rm  r€   r   rF  r/   )rH   z	list[str]r—   r   rY   rn  rZ   rm  r€   r   rF  r/   )r…   ro  r—   r   rY   rl  rZ   rm  r€   r   rF  r/   )r5   )r  rf   r  rf   rF  ru  )r  rf   rE   r   r  rf   r  r   r€   r   rF  r/   )rF  Úbytes)
r  rv  rE   r   r  r   r€   r   rF  r/   )rF  zCallable[[float], float])r™   rp  rF  r_  )rZ   zSequence[str]rF  zlist[Document])1Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r;   rA   ÚpropertyrE   rJ   rO   rT   rW   r~   r�   rƒ   r†   r£   r¦   r¬   r®   r²   rµ   r¹   r»   rÅ   rÇ   rÊ   rÌ   rÏ   rÑ   rÙ   rá   Úclassmethodrí   rï   rñ   ró   rõ   r  r  r  r  r  r   r"  Ústaticmethodr�   rg  r\   r-   r"   r/   r/   K   sd	  „ ñ}ðP BFØ"Ø.>×.QÑ.Qð!ð
ð!ð ð!ð ð!ð -ð!ð ?ð!ð ð!ð ,ó!ðF ò
ó ð
óEó
ó1óð /3Ø#'ð(àð(ð *ð(ð ,ð	(ð
 !ð(ð 
ó(ðZ +/Ø#'ð	KàðKð (ðKð !ð	Kð
 ðKð 
óKð0 +/Ø#'ð	KàðKð (ðKð !ð	Kð
 ðKð 
óKð2 +/Ø#'ð	Kà:ðKð (ðKð !ð	Kð
 ðKð 
óKð2 Ø<@Øð?àð?ð ð?ð :ð	?ð
 ð?ð ð?ð 
&ó?ðH Ø<@Øð%
àð%
ð ð%
ð :ð	%
ð
 ð%
ð ð%
ð 
&ó%
ðT Ø<@Øð àð ð ð ð :ð	 ð
 ð ð ð ð 
&ó ðJ Ø<@Øð àð ð ð ð :ð	 ð
 ð ð ð ð 
&ó ðJ Ø+/Øð3àð3ð ð3ð )ð	3ð
 ð3ð ð3ð 
ó3ðF Ø<@Øð3àð3ð ð3ð :ð	3ð
 ð3ð ð3ð 
ó3ðF Ø<@Øð3àð3ð ð3ð :ð	3ð
 ð3ð ð3ð 
ó3ð8 Ø<@Øð3àð3ð ð3ð :ð	3ð
 ð3ð ð3ð 
ó3ð: ØØ Ø<@ñBàðBð ð	Bð
 ðBð ðBð :ðBð 
&óBðP ØØ Ø<@ñ%
àð%
ð ð	%
ð
 ð%
ð ð%
ð :ð%
ð 
&ó%
ðT ØØ Ø<@ð3àð3ð ð3ð ð	3ð
 ð3ð :ð3ð ð3ð 
ó3ðD ØØ Ø<@ð3àð3ð ð3ð ð	3ð
 ð3ð :ð3ð ð3ð 
ó3ðH ØØ Ø<@ð#àð#ð ð#ð ð	#ð
 ð#ð :ð#ð ð#ð 
ó#ðP ØØ Ø<@ð#àð#ð ð#ð ð	#ð
 ð#ð :ð#ð ð#ð 
ó#ôJ óD6ð@ ð /3Ø#'Ø"Ø.>×.QÑ.Qðàðð &ðð ð	ð
 ,ðð !ðð ðð ,ðð ðð 
òó ðð> ð
 +/Ø#'ð"
àð"
ð ð"
ð (ð	"
ð
 !ð"
ð ð"
ð 
ò"
ó ð"
ðH ð
 +/Ø#'ð"
àð"
ð ð"
ð (ð	"
ð
 !ð"
ð ð"
ð 
ò"
ó ð"
ðH ð
 /3Ø#'ð$
à:ð$
ð ð$
ð ,ð	$
ð
 !ð$
ð ð$
ð 
ò$
ó ð$
ðL ð
 /3Ø#'ð
à:ð
ð ð
ð ,ð	
ð
 !ð
ð ð
ð 
ò
ó ð
ô"Gð& ð
 "ð	1Pð 16ñ1Pàð1Pð ð1Pð ð	1Pð *.ð1Pð ð1Pð 
ò1Pó ð1PófTð ð 16ñPàðPð ðPð
 *.ðPð ðPð 
òPó ðPó>ð< Ø<@Øð#àð#ð ð#ð :ð	#ð
 ð#ð ð#ð 
&ó#ð@ Ø<@Øð#àð#ð ð#ð :ð	#ð
 ð#ð ð#ð 
&ó#ð: ðK#Ø9ðK#à	)òK#ó ðK#ôZBr-   r/   rC   )r!   rt  rF  r   )
r(   r   r)   r   r*   rf   r+   rf   rF  ru  )-Ú
__future__r   Úloggingr”   r   rÿ   rg   r<   Úpathlibr   Útypingr   r   r   r   r	   r
   r   r   r   r   Únumpyrk   Úlangchain_core.documentsr   Úlangchain_core.embeddingsr   Úlangchain_core.runnables.configr   Úlangchain_core.vectorstoresr   Ú!langchain_community.docstore.baser   r   Ú&langchain_community.docstore.in_memoryr   Ú&langchain_community.vectorstores.utilsr   r   Ú	getLoggerrw  r2   r#   r,   r/   r\   r-   r"   Ú<module>r‹     sv   ðÝ "ã Û Û 	Û Û Û Ý ÷÷ ÷ ó Ý -Ý 0Ý ;Ý 3ç DÝ C÷ð
 
ˆ×	Ñ	˜8Ó	$€ôó6ô@BˆKõ @Br-   