Ë
    µŒjºQ  ã                  óÞ   — 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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 dd„Z dd„Z! G d„ de«      Z"y)é    )ÚannotationsN)ÚPath)ÚAnyÚCallableÚDictÚIterableÚListÚOptionalÚTuple)ÚDocument)Ú
Embeddings©Úguard_import)ÚVectorStore)ÚAddableMixinÚDocstore)ÚInMemoryDocstore)ÚDistanceStrategyc                óz   — | t        j                  t         j                  j                  | dd¬«      dd«      z  } | S )z!Normalize vectors to unit length.éÿÿÿÿT)ÚaxisÚkeepdimsgê-�™—q=N)ÚnpÚclipÚlinalgÚnorm)Úxs    úp/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/vectorstores/scann.pyÚ	normalizer      s1   € àŒ�‰”—‘—‘ ¨°T�Ó:¸EÀ4Ó	HÑH€AØ€Hó    c                 ó   — t        d«      S )z=
    Import `scann` if available, otherwise raise error.
    Úscannr   © r    r   Údependable_scann_importr$      s   € ô ˜Ó Ð r    c                  óX  — e Zd ZdZddej
                  df	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 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!	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d"d„«       Ze	 	 d	 	 	 	 	 	 	 	 	 	 	 d#d„«       Ze	 	 d	 	 	 	 	 	 	 	 	 	 	 d$d„«       Zd%d&d„Ze	 d%ddœ	 	 	 	 	 	 	 	 	 	 	 d'd„«       Zd(d„Z	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd„Zy))ÚScaNNa  `ScaNN` vector store.

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

    Example:
        .. code-block:: python

            from langchain_community.embeddings import HuggingFaceEmbeddings
            from langchain_community.vectorstores import ScaNN

            model_name = "sentence-transformers/all-mpnet-base-v2"
            db = ScaNN.from_texts(
                ['foo', 'bar', 'barz', 'qux'],
                HuggingFaceEmbeddings(model_name=model_name))
            db.similarity_search('foo?', k=1)
    NFc	                ót   — || _         || _        || _        || _        || _        || _        || _        || _        y)z%Initialize with necessary components.N)Ú	embeddingÚindexÚdocstoreÚindex_to_docstore_idÚdistance_strategyÚoverride_relevance_score_fnÚ_normalize_L2Ú_scann_config)	Úselfr(   r)   r*   r+   Úrelevance_score_fnÚnormalize_L2r,   Úscann_configs	            r   Ú__init__zScaNN.__init__3   sA   € ð #ˆŒØˆŒ
Ø ˆŒØ$8ˆÔ!Ø!2ˆÔØ+=ˆÔ(Ø)ˆÔØ)ˆÕr    c                ó~   — t        | j                  t        «      st        d| j                  › d�«      ‚t	        d«      ‚)NúSIf trying to add texts, the underlying docstore should support adding items, which ú	 does notz(Updates are not available in ScaNN, yet.)Ú
isinstancer*   r   Ú
ValueErrorÚNotImplementedError)r0   ÚtextsÚ
embeddingsÚ	metadatasÚidsÚkwargss         r   Ú__addzScaNN.__addH   sC   € ô ˜$Ÿ-™-¬Ô6Üð'Ø'+§}¡} o°Yð@óð ô "Ð"LÓMÐMr    c                óx   — | j                   j                  t        |«      «      } | j                  ||f||dœ|¤Ž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.
        ©r=   r>   )r(   Úembed_documentsÚlistÚ_ScaNN__add)r0   r;   r=   r>   r?   r<   s         r   Ú	add_textszScaNN.add_textsW   s;   € ð$ —^‘^×3Ñ3´D¸³KÓ@ˆ
Øˆt�z‰z˜% ÐT°yÀcÑTÈVÑTÐTr    c                ó¬   — t        | j                  t        «      st        d| j                  › d�«      ‚t	        |Ž \  }} | j
                  ||f||dœ|¤ŽS )a™  Run more texts through the embeddings and add 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.
        r6   r7   rB   )r8   r*   r   r9   ÚziprE   )r0   Útext_embeddingsr=   r>   r?   r;   r<   s          r   Úadd_embeddingszScaNN.add_embeddingsl   se   € ô$ ˜$Ÿ-™-¬Ô6Üð'Ø'+§}¡} o°Yð@óð ô
   Ð1Ñˆˆzàˆt�z‰z˜% ÐT°yÀcÑTÈVÑTÐTr    c                ó   — t        d«      ‚)a3  Delete by vector ID or other criteria.

        Args:
            ids: List of ids to delete.
            **kwargs: Other keyword arguments that subclasses might use.

        Returns:
            Optional[bool]: True if deletion is successful,
            False otherwise, None if not implemented.
        z*Deletions are not available in ScaNN, yet.)r:   )r0   r>   r?   s      r   ÚdeletezScaNN.deleteˆ   s   € ô "Ð"NÓOÐOr    c           
     óÐ  ‡— t        j                  |gt         j                  ¬«      }| j                  rt	        |«      }| j
                  j                  ||€|n|«      \  }}g }	t        |d   «      D ]ä  \  }
}|dk(  rŒ| j                  |   }| j                  j                  |«      Št        ‰t        «      st        d|› d‰› �«      ‚|�s|j                  «       D ��ci c]  \  }}|t        |t        «      s|gn|“Œ }}}t!        ˆfd„|j                  «       D «       «      sŒ²|	j#                  ‰|d   |
   f«       ŒÌ|	j#                  ‰|d   |
   f«       Œæ |j%                  d«      }|�k| j&                  t(        j*                  t(        j,                  fv rt.        j0                  nt.        j2                  }|	D ��cg c]  \  }} |||«      r||f‘Œ }	}}|	d| S c c}}w 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[Dict[str, Any]]): Filter by metadata. Defaults to None.
            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.
        ©ÚdtypeNr   r   zCould not find document for id z, got c              3  ó^   •K  — | ]$  \  }}‰j                   j                  |«      |v –— Œ& y ­w©N)ÚmetadataÚget)Ú.0ÚkeyÚvalueÚdocs      €r   Ú	<genexpr>z?ScaNN.similarity_search_with_score_by_vector.<locals>.<genexpr>Â   s*   øè ø€ ÐWÉ¹*¸#¸u�s—|‘|×'Ñ'¨Ó,°Ô5Éùs   ƒ*-Úscore_threshold)r   ÚarrayÚfloat32r.   r   r)   Úsearch_batchedÚ	enumerater+   r*   Úsearchr8   r   r9   ÚitemsrD   ÚallÚappendrS   r,   r   ÚMAX_INNER_PRODUCTÚJACCARDÚoperatorÚgeÚle)r0   r(   ÚkÚfilterÚfetch_kr?   ÚvectorÚindicesÚscoresÚdocsÚjÚiÚ_idrU   rV   rY   ÚcmprW   Ú
similaritys                    ` r   Ú&similarity_search_with_score_by_vectorz,ScaNN.similarity_search_with_score_by_vector–   sì  ø€ ô0 —‘˜9˜+¬R¯Z©ZÔ8ˆØ×ÒÜ˜vÓ&ˆFØŸ*™*×3Ñ3Ø˜˜‘A¨Wó
‰ˆ�ð ˆÜ˜g a™jÖ)‰DˆAˆqØ�BŠwàØ×+Ñ+¨AÑ.ˆCØ—-‘-×&Ñ& sÓ+ˆCÜ˜c¤8Ô,Ü Ð#BÀ3À%ÀvÈcÈUÐ!SÓTÐTØÐ!ð '-§l¡l¤nôá&4™
˜˜Uð ¬
°5¼$Ô(?˜%™ÀUÑJØ&4ð ñ ô ÓWÈÏÉÌÓWÕWØ—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   Ã GÆ=G"c                ój   — | j                   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.
            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.
        ©rh   ri   )r(   Úembed_queryrs   )r0   Úqueryrg   rh   ri   r?   r(   rm   s           r   Úsimilarity_search_with_scorez"ScaNN.similarity_search_with_scoreÖ   sN   € ð* —N‘N×.Ñ.¨uÓ5ˆ	Ø:ˆt×:Ñ:ØØð
ð Øñ	
ð
 ñ
ˆð ˆr    c                óf   —  | j                   ||f||dœ|¤Ž}|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.
            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 embedding.
        ru   )rs   )	r0   r(   rg   rh   ri   r?   Údocs_and_scoresrW   Ú_s	            r   Úsimilarity_search_by_vectorz!ScaNN.similarity_search_by_vectorõ   sR   € ð( F˜$×EÑEØØð
ð Øñ	
ð
 ñ
ˆñ #2Ô2¡/™˜˜Q’ /Ò2Ð2ùÓ2ó   �-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.
        ru   )rx   )	r0   rw   rg   rh   ri   r?   rz   rW   r{   s	            r   Úsimilarity_searchzScaNN.similarity_search  sK   € ð( <˜$×;Ñ;Ø�1ð
Ø#¨Wñ
Ø8>ñ
ˆñ #2Ô2¡/™˜˜Q’ /Ò2Ð2ùÓ2r}   c                ó  — t        d«      }|j                  dt        j                  «      }	|j                  dd «      }
t	        j
                  |t        j                  ¬«      }|rt        |«      }|
�|j                  j                  ||
«      }n†|	t        j                  k(  r:|j                  j                  |dd«      j                  «       j                  «       }n9|j                  j                  |dd«      j                  «       j                  «       }g }|€*|D �cg c]  }t        t        j                   «       «      ‘Œ! }}t#        |«      D ]*  \  }}|r||   ni }|j%                  t'        ||¬«      «       Œ, t)        t#        |«      «      }t+        |«      t+        |«      k7  r#t-        t+        |«      › d	t+        |«      › d
�«      ‚t/        t)        t1        |j3                  «       |«      «      «      } | ||||fd|i|¤ŽS c c}w )Nr"   r,   r3   rN   é   Údot_productÚ
squared_l2)Úpage_contentrR   z ids provided for z, documents. Each document should have an id.r2   )r   rS   r   ÚEUCLIDEAN_DISTANCEr   rZ   r[   r   Úscann_ops_pybindÚcreate_searcherrb   ÚbuilderÚscore_brute_forceÚbuildÚstrÚuuidÚuuid4r]   ra   r   ÚdictÚlenÚ	Exceptionr   rH   Úvalues)Úclsr;   r<   r(   r=   r>   r2   r?   r"   r,   r3   rj   r)   Ú	documentsr{   ro   ÚtextrR   Úindex_to_idr*   s                       r   Ú__fromzScaNN.__from+  sè  € ô ˜WÓ%ˆØ"ŸJ™JØÔ!1×!DÑ!Dó
Ðð —z‘z .°$Ó7ˆä—‘˜*¬B¯J©JÔ7ˆÙÜ˜vÓ&ˆFØÐ#Ø×*Ñ*×:Ñ:¸6À<ÓP‰Eà Ô$4×$FÑ$FÒFà×*Ñ*×2Ñ2°6¸1¸mÓLß&Ñ&Ó(ß‘U“Wñ ð ×*Ñ*×2Ñ2°6¸1¸lÓKß&Ñ&Ó(ß‘U“Wð ð
 ˆ	Øˆ;Ù.3Ó4©e¨”3”t—z‘z“|Õ$¨eˆCÐ4Ü  Ö'‰GˆAˆtÙ'0�y ’|°bˆHØ×ÑœX°4À(ÔKÕLð (ô œ9 S›>Ó*ˆäˆ{Óœs 9›~Ò-ÜÜ�{Ó#Ð$Ð$6´s¸9³~Ð6Fð G4ð 4óð ô
 $¤D¬¨[×-?Ñ-?Ó-AÀ9Ó)MÓ$NÓOˆÙØØØØñ	
ð
 &ð
ð ñ
ð 	
ùò 5s   Ä$Hc                óT   — |j                  |«      } | j                  |||f||dœ|¤ŽS )aN  Construct ScaNN wrapper from raw documents.

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

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

        Example:
            .. code-block:: python

                from langchain_community.vectorstores import ScaNN
                from langchain_community.embeddings import OpenAIEmbeddings
                embeddings = OpenAIEmbeddings()
                scann = ScaNN.from_texts(texts, embeddings)
        rB   )rC   Ú_ScaNN__from)r’   r;   r(   r=   r>   r?   r<   s          r   Ú
from_textszScaNN.from_textsg  sG   € ð4 ×.Ñ.¨uÓ5ˆ
Øˆs�z‰zØØØð
ð  Øñ
ð ñ
ð 	
r    c                óŽ   — |D �cg c]  }|d   ‘Œ	 }}|D �cg c]  }|d   ‘Œ	 }} | j                   |||f||dœ|¤ŽS c c}w c c}w )aï  Construct ScaNN wrapper from raw documents.

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

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

        Example:
            .. code-block:: python

                from langchain_community.vectorstores import ScaNN
                from langchain_community.embeddings import OpenAIEmbeddings
                embeddings = OpenAIEmbeddings()
                text_embeddings = embeddings.embed_documents(texts)
                text_embedding_pairs = list(zip(texts, text_embeddings))
                scann = ScaNN.from_embeddings(text_embedding_pairs, embeddings)
        r   r�   rB   )r˜   )	r’   rI   r(   r=   r>   r?   Útr;   r<   s	            r   Úfrom_embeddingszScaNN.from_embeddings‹  so   € ñ8  /Ó/™˜!��1“˜ˆÐ/Ù$3Ó4¡O˜q�a˜“d Oˆ
Ð4Øˆs�z‰zØØØð
ð  Øñ
ð ñ
ð 	
ùò 0ùÚ4s	   …=—Ac                ór  — t        |«      }|dj                  |¬«      z  }|j                  dd¬«       | j                  j	                  t        |«      «       t        |dj                  |¬«      z  d«      5 }t        j                  | j                  | j                  f|«       ddd«       y# 1 sw Y   yxY w)zÀSave ScaNN 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}.scann©Ú
index_nameT©Úexist_okÚparentsú{index_name}.pklÚwbN)r   ÚformatÚmkdirr)   Ú	serializer‹   ÚopenÚpickleÚdumpr*   r+   )r0   Úfolder_pathr    ÚpathÚ
scann_pathÚfs         r   Ú
save_localzScaNN.save_local²  sŸ   € ô �KÓ ˆØÐ0×7Ñ7À:Ð7ÓNÑNˆ
Ø×Ñ $°ÐÔ5ð 	�
‰
×ÑœS ›_Ô-ô �$Ð+×2Ñ2¸jÐ2ÓIÑIÈ4ÔPÐTUÜ�K‰K˜Ÿ™¨×(AÑ(AÐBÀAÔF÷ Q×PÑPús   Á7-B-Â-B6)Úallow_dangerous_deserializationc               ó�  — |st        d«      ‚t        |«      }|dj                  |¬«      z  }|j                  dd¬«       t	        d«      }|j
                  j                  t        |«      «      }	t        |dj                  |¬«      z  d«      5 }
t        j                  |
«      \  }}d	d	d	«        | ||	fi |¤ŽS # 1 sw Y   ŒxY w)
a•  Load ScaNN index, docstore, and index_to_docstore_id from disk.

        Args:
            folder_path: folder path to load index, docstore,
                and index_to_docstore_id from.
            embedding: 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.
        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Ÿ   Tr¡   r"   r¤   ÚrbN)r9   r   r¦   r§   r   r†   Úload_searcherr‹   r©   rª   Úload)r’   r¬   r(   r    r±   r?   r­   r®   r"   r)   r¯   r*   r+   s                r   Ú
load_localzScaNN.load_localÄ  sÝ   € ñ. /Üð	"óð ô �KÓ ˆØÐ0×7Ñ7À:Ð7ÓNÑNˆ
Ø×Ñ $°ÐÔ5ä˜WÓ%ˆØ×&Ñ&×4Ñ4´S¸³_ÓEˆô �$Ð+×2Ñ2¸jÐ2ÓIÑIÈ4ÔPÐTUô —‘ØóñØØ$÷ Qñ �9˜e XÐ/CÑNÀvÑNÐN÷ QÐPús   ÂB<Â<Cc                óì   — | j                   �| 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)r-   r,   r   rb   Ú%_max_inner_product_relevance_score_fnr…   Ú_euclidean_relevance_score_fnr9   )r0   s    r   Ú_select_relevance_score_fnz ScaNN._select_relevance_score_fnú  sr   € ð ×+Ñ+Ð7Ø×3Ñ3Ð3ð ×!Ñ!Ô%5×%GÑ%GÒGØ×=Ñ=Ð=Ø×#Ñ#Ô'7×'JÑ'JÒJà×5Ñ5Ð5äð óð r    c                ó  — |j                  dd«      }| j                  «       }|€t        d«      ‚ | j                  |f|||dœ|¤Ž}|D �	�
cg c]  \  }	}
|	 ||
«      f‘Œ }}	}
|�|D �	�cg c]  \  }	}||k\  r|	|f‘Œ }}	}|S c c}
}	w c c}}	w )z?Return docs and their similarity scores on a scale from 0 to 1.rY   NzLnormalize_score_fn must be provided to ScaNN constructor to normalize scores)rg   rh   ri   )Úpoprº   r9   rx   )r0   rw   rg   rh   ri   r?   rY   r1   rz   rW   ÚscoreÚdocs_and_rel_scoresrr   s                r   Ú(_similarity_search_with_relevance_scoresz.ScaNN._similarity_search_with_relevance_scores  sç   € ð !Ÿ*™*Ð%6¸Ó=ˆØ!×<Ñ<Ó>ÐØÐ%Üð9óð ð <˜$×;Ñ;Øð
àØØñ	
ð
 ñ
ˆñ @Oô
Ù?N±°°eˆSÑ$ UÓ+Ò,¸ð 	ñ 
ð Ð&ñ (;ô#á':‘O�C˜Ø Ò0ð �jÒ!Ø':ð  ñ #ð
 #Ð"ùó
ùó#s   ÁBÁ*B)r(   r   r)   r   r*   r   r+   zDict[int, str]r1   z"Optional[Callable[[float], float]]r2   Úboolr,   r   r3   zOptional[str])NN)r;   úIterable[str]r<   zIterable[List[float]]r=   úOptional[List[dict]]r>   úOptional[List[str]]r?   r   Úreturnú	List[str])
r;   rÁ   r=   rÂ   r>   rÃ   r?   r   rÄ   rÅ   )
rI   z!Iterable[Tuple[str, List[float]]]r=   rÂ   r>   rÃ   r?   r   rÄ   rÅ   rQ   )r>   rÃ   r?   r   rÄ   zOptional[bool])é   Né   )r(   úList[float]rg   Úintrh   úOptional[Dict[str, Any]]ri   rÉ   r?   r   rÄ   úList[Tuple[Document, float]])rw   r‹   rg   rÉ   rh   rÊ   ri   rÉ   r?   r   rÄ   rË   )r(   rÈ   rg   rÉ   rh   rÊ   ri   rÉ   r?   r   rÄ   úList[Document])rw   r‹   rg   rÉ   rh   rÊ   ri   rÉ   r?   r   rÄ   rÌ   )NNF)r;   rÅ   r<   zList[List[float]]r(   r   r=   rÂ   r>   rÃ   r2   rÀ   r?   r   rÄ   r&   )r;   rÅ   r(   r   r=   rÂ   r>   rÃ   r?   r   rÄ   r&   )rI   zList[Tuple[str, List[float]]]r(   r   r=   rÂ   r>   rÃ   r?   r   rÄ   r&   )r)   )r¬   r‹   r    r‹   rÄ   ÚNone)r¬   r‹   r(   r   r    r‹   r±   rÀ   r?   r   rÄ   r&   )rÄ   zCallable[[float], float])Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r…   r4   rE   rF   rJ   rL   rs   rx   r|   r   Úclassmethodr˜   r™   rœ   r°   r¶   rº   r¿   r#   r    r   r&   r&   !   sM  „ ñð. BFØ"Ø.>×.QÑ.QØ&*ð*àð*ð ð*ð ð	*ð
 -ð*ð ?ð*ð ð*ð ,ð*ð $ó*ð2 +/Ø#'ðNàðNð *ðNð (ð	Nð
 !ðNð ðNð 
óNð$ +/Ø#'ð	UàðUð (ðUð !ð	Uð
 ðUð 
óUð0 +/Ø#'ð	Uà:ðUð (ðUð !ð	Uð
 ðUð 
óUô8Pð" Ø+/Øð>àð>ð ð>ð )ð	>ð
 ð>ð ð>ð 
&ó>ðF Ø+/Øðàðð ðð )ð	ð
 ðð ðð 
&óðD Ø+/Øð3àð3ð ð3ð )ð	3ð
 ð3ð ð3ð 
ó3ð@ Ø+/Øð3àð3ð ð3ð )ð	3ð
 ð3ð ð3ð 
ó3ð2 ð +/Ø#'Ø"ð9
àð9
ð &ð9
ð ð	9
ð
 (ð9
ð !ð9
ð ð9
ð ð9
ð 
ò9
ó ð9
ðv ð
 +/Ø#'ð!
àð!
ð ð!
ð (ð	!
ð
 !ð!
ð ð!
ð 
ò!
ó ð!
ðF ð
 +/Ø#'ð$
à6ð$
ð ð$
ð (ð	$
ð
 !ð$
ð ð$
ð 
ò$
ó ð$
ôLGð$ ð
 "ð	3Oð 16ñ3Oàð3Oð ð3Oð ð	3Oð *.ð3Oð ð3Oð 
ò3Oó ð3Oójð8 Ø+/Øð"#àð"#ð ð"#ð )ð	"#ð
 ð"#ð ð"#ð 
&ô"#r    r&   )r   ú
np.ndarrayrÄ   rÓ   )rÄ   r   )#Ú
__future__r   rd   rª   rŒ   Úpathlibr   Útypingr   r   r   r   r	   r
   r   Únumpyr   Úlangchain_core.documentsr   Úlangchain_core.embeddingsr   Úlangchain_core.utilsr   Úlangchain_core.vectorstoresr   Ú!langchain_community.docstore.baser   r   Ú&langchain_community.docstore.in_memoryr   Ú&langchain_community.vectorstores.utilsr   r   r$   r&   r#   r    r   Ú<module>rß      sM   ðÝ "ã Û Û Ý ß G× GÑ Gã Ý -Ý 0Ý -Ý 3ç DÝ CÝ Cóó!ôT#ˆKõ T#r    