§
    šŠtjº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"dS )é    )ÚannotationsN)ÚPath)ÚAnyÚCallableÚDictÚIterableÚListÚOptionalÚTuple)ÚDocument)Ú
Embeddings©Úguard_import)ÚVectorStore)ÚAddableMixinÚDocstore)ÚInMemoryDocstore)ÚDistanceStrategyÚxú
np.ndarrayÚreturnc                óx   — | t          j        t           j                             | dd¬¦  «        dd¦  «        z  } | S )z!Normalize vectors to unit length.éÿÿÿÿT)ÚaxisÚkeepdimsgê-�™—q=N)ÚnpÚclipÚlinalgÚnorm)r   s    úd/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/vectorstores/scann.pyÚ	normalizer!      s3   € à�Œ•”—’ ¨°T�Ñ:Ô:¸EÀ4Ñ	HÔ	HÑH€AØ€Hó    r   c                 ó    — t          d¦  «        S )z=
    Import `scann` if available, otherwise raise error.
    Úscannr   © r"   r    Údependable_scann_importr&      s   € õ ˜Ñ Ô Ð r"   c                  óB  — e Zd ZdZddej        dfdFd„Z	 	 dGdHd „Z	 	 dGdId!„Z	 	 dGdJd$„Z	dKdLd&„Z
	 	 	 dMdNd0„Z	 	 	 dMdOd3„Z	 	 	 dMdPd5„Z	 	 	 dMdQd6„Ze	 	 	 dRdSd8„¦   «         Ze	 	 dGdTd9„¦   «         Ze	 	 dGdUd;„¦   «         ZdVdWd?„Ze	 dVdd@œdXdB„¦   «         ZdYdD„Z	 	 	 dMdOdE„ZdS )ZÚ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)
    NFÚ	embeddingr   Úindexr   Údocstorer   Úindex_to_docstore_idúDict[int, str]Úrelevance_score_fnú"Optional[Callable[[float], float]]Únormalize_L2ÚboolÚdistance_strategyr   Úscann_configúOptional[str]c	                óv   — || _         || _        || _        || _        || _        || _        || _        || _        dS )z%Initialize with necessary components.N)r)   r*   r+   r,   r2   Úoverride_relevance_score_fnÚ_normalize_L2Ú_scann_config)	Úselfr)   r*   r+   r,   r.   r0   r2   r3   s	            r    Ú__init__zScaNN.__init__3   sG   € ð #ˆŒØˆŒ
Ø ˆŒØ$8ˆÔ!Ø!2ˆÔØ+=ˆÔ(Ø)ˆÔØ)ˆÔÐÐr"   ÚtextsúIterable[str]Ú
embeddingsúIterable[List[float]]Ú	metadatasúOptional[List[dict]]ÚidsúOptional[List[str]]Úkwargsr   ú	List[str]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)r9   r;   r=   r?   rA   rC   s         r    Ú__addzScaNN.__addH   sX   € õ ˜$œ-­Ñ6Ô6ð 	Ýð@Ø'+¤}ð@ð @ð @ñô ð õ "Ð"LÑMÔMÐMr"   c                ót   — | 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?   rA   )r)   Úembed_documentsÚlistÚ_ScaNN__add)r9   r;   r?   rA   rC   r=   s         r    Ú	add_textszScaNN.add_textsW   sB   € ð$ ”^×3Ò3µD¸±K´KÑ@Ô@ˆ
ØˆtŒz˜% ÐT°yÀcÐTÐTÈVÐTÐTÐTr"   Útext_embeddingsú!Iterable[Tuple[str, List[float]]]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.
        rF   rG   rM   )rH   r+   r   rI   ÚziprP   )r9   rR   r?   rA   rC   r;   r=   s          r    Úadd_embeddingszScaNN.add_embeddingsl   s{   € õ$ ˜$œ-­Ñ6Ô6ð 	Ýð@Ø'+¤}ð@ð @ð @ñô ð õ
   Ð1ÑˆˆzàˆtŒz˜% ÐT°yÀcÐTÐTÈVÐTÐTÐTr"   úOptional[bool]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.)rJ   )r9   rA   rC   s      r    ÚdeletezScaNN.deleteˆ   s   € õ "Ð"NÑOÔOÐOr"   é   é   úList[float]ÚkÚintÚfilterúOptional[Dict[str, Any]]Úfetch_kúList[Tuple[Document, float]]c                óš  ‡‡‡— t          j        |gt           j        ¬¦  «        }| j        rt	          |¦  «        }| j                             ||€|n|¦  «        \  }}g }	t          |d         ¦  «        D ]ñ\  }
}|dk    rŒ| j        |         }| j	         
                    |¦  «        Št          ‰t          ¦  «        st          d|› d‰› �¦  «        ‚|�od„ |                     ¦   «         D ¦   «         }t          ˆfd„|                     ¦   «         D ¦   «         ¦  «        r#|	                     ‰|d         |
         f¦  «         ŒÎ|	                     ‰|d         |
         f¦  «         Œò|                     d	¦  «        Š‰�F| j        t&          j        t&          j        fv rt,          j        nt,          j        Šˆˆfd
„|	D ¦   «         }	|	d|…         S )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                óJ   — i | ] \  }}|t          |t          ¦  «        s|gn|“Œ!S r%   )rH   rO   )Ú.0ÚkeyÚvalues      r    ú
<dictcomp>z@ScaNN.similarity_search_with_score_by_vector.<locals>.<dictcomp>¾   sC   € ð ð ð á"˜˜Uð ­
°5½$Ñ(?Ô(?ÐJ˜%˜˜ÀUðð ð r"   c              3  óV   •K  — | ]#\  }}‰j                              |¦  «        |v V — Œ$d S ©N)ÚmetadataÚget)rg   rh   ri   Údocs      €r    ú	<genexpr>z?ScaNN.similarity_search_with_score_by_vector.<locals>.<genexpr>Â   s<   øè è € ÐWÐW¹*¸#¸u�s”|×'Ò'¨Ñ,Ô,°Ð5ÐWÐWÐWÐWÐWÐWr"   Úscore_thresholdc                ó6   •— g | ]\  }} ‰|‰¦  «        ¯||f‘ŒS r%   r%   )rg   ro   Ú
similarityÚcmprq   s      €€r    ú
<listcomp>z@ScaNN.similarity_search_with_score_by_vector.<locals>.<listcomp>Ï   sD   ø€ ð ð ð á#�C˜Ø�3�z ?Ñ3Ô3ðØ�jÐ!ðð ð r"   )r   ÚarrayÚfloat32r7   r!   r*   Úsearch_batchedÚ	enumerater,   r+   ÚsearchrH   r   rI   ÚitemsÚallÚappendrn   r2   r   ÚMAX_INNER_PRODUCTÚJACCARDÚoperatorÚgeÚle)r9   r)   r]   r_   ra   rC   ÚvectorÚindicesÚscoresÚdocsÚjÚiÚ_idrt   ro   rq   s                @@@r    Ú&similarity_search_with_score_by_vectorz,ScaNN.similarity_search_with_score_by_vector–   s  øøø€ õ0 ”˜9˜+­R¬ZÐ8Ñ8Ô8ˆØÔð 	'Ý˜vÑ&Ô&ˆFØœ*×3Ò3Ø˜˜�A�A¨Wñ
ô 
‰ˆ�ð ˆÝ˜g aœjÑ)Ô)ð 	1ð 	1‰DˆAˆqØ�BŠwˆwàØÔ+¨AÔ.ˆCØ”-×&Ò& sÑ+Ô+ˆCÝ˜c¥8Ñ,Ô,ð UÝ Ð!SÀ3Ð!SÐ!SÈcÐ!SÐ!SÑTÔTÐTØÐ!ðð à&,§l¢l¡n¤nðñ ô �õ ÐWÐWÐWÐWÈÏÊÉÌÐWÑWÔWÑWÔWð 5Ø—K’K  f¨Q¤i°¤lÐ 3Ñ4Ô4Ð4øà—’˜S &¨¤)¨A¤,Ð/Ñ0Ô0Ð0Ð0à Ÿ*š*Ð%6Ñ7Ô7ˆØÐ&ð Ô)Ý$Ô6Õ8HÔ8PÐQðRð Rõ ”�õ ”[ð	 ðð ð ð ð à'+ðñ ô ˆDð
 �B�Q�BŒxˆr"   ÚqueryÚstrc                ó^   — | 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.
        ©r_   ra   )r)   Úembed_queryrŠ   )r9   r‹   r]   r_   ra   rC   r)   r†   s           r    Úsimilarity_search_with_scorez"ScaNN.similarity_search_with_scoreÖ   sV   € ð* ”N×.Ò.¨uÑ5Ô5ˆ	Ø:ˆtÔ:ØØð
ð Øð	
ð 
ð
 ð
ð 
ˆð ˆr"   úList[Document]c                ó>   —  | j         ||f||dœ|¤Ž}d„ |D ¦   «         S )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.
        rŽ   c                ó   — g | ]\  }}|‘ŒS r%   r%   ©rg   ro   Ú_s      r    ru   z5ScaNN.similarity_search_by_vector.<locals>.<listcomp>  ó   € Ð2Ð2Ð2™˜˜Q�Ð2Ð2Ð2r"   )rŠ   )r9   r)   r]   r_   ra   rC   Údocs_and_scoress          r    Úsimilarity_search_by_vectorz!ScaNN.similarity_search_by_vectorõ   sQ   € ð( F˜$ÔEØØð
ð Øð	
ð 
ð
 ð
ð 
ˆð 3Ð2 /Ð2Ñ2Ô2Ð2r"   c                ó>   —  | j         ||f||dœ|¤Ž}d„ |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.
        rŽ   c                ó   — g | ]\  }}|‘ŒS r%   r%   r”   s      r    ru   z+ScaNN.similarity_search.<locals>.<listcomp>)  r–   r"   )r�   )r9   r‹   r]   r_   ra   rC   r—   s          r    Úsimilarity_searchzScaNN.similarity_search  sJ   € ð( <˜$Ô;Ø�1ð
Ø#¨Wð
ð 
Ø8>ð
ð 
ˆð 3Ð2 /Ð2Ñ2Ô2Ð2r"   úList[List[float]]c                ó`  — t          d¦  «        }|                     dt          j        ¦  «        }	|                     dd ¦  «        }
t	          j        |t          j        ¬¦  «        }|rt          |¦  «        }|
�|j         	                    ||
¦  «        }n‘|	t          j
        k    rA|j                             |dd¦  «                             ¦   «                              ¦   «         }n@|j                             |dd¦  «                             ¦   «                              ¦   «         }g }|€d„ |D ¦   «         }t          |¦  «        D ]5\  }}|r||         ni }|                     t!          ||¬	¦  «        ¦  «         Œ6t#          t          |¦  «        ¦  «        }t%          |¦  «        t%          |¦  «        k    r/t'          t%          |¦  «        › d
t%          |¦  «        › d�¦  «        ‚t)          t#          t+          |                     ¦   «         |¦  «        ¦  «        ¦  «        } | ||||fd|i|¤ŽS )Nr$   r2   r3   rd   é   Údot_productÚ
squared_l2c                óN   — g | ]"}t          t          j        ¦   «         ¦  «        ‘Œ#S r%   )rŒ   ÚuuidÚuuid4)rg   r•   s     r    ru   z ScaNN.__from.<locals>.<listcomp>Q  s&   € Ð4Ð4Ð4¨•3•t”z‘|”|Ñ$Ô$Ð4Ð4Ð4r"   )Úpage_contentrm   z ids provided for z, documents. Each document should have an id.r0   )r   rn   r   ÚEUCLIDEAN_DISTANCEr   rv   rw   r!   Úscann_ops_pybindÚcreate_searcherr~   ÚbuilderÚscore_brute_forceÚbuildry   r}   r   ÚdictÚlenÚ	Exceptionr   rU   Úvalues)Úclsr;   r=   r)   r?   rA   r0   rC   r$   r2   r3   rƒ   r*   Ú	documentsrˆ   Útextrm   Úindex_to_idr+   s                      r    Ú__fromzScaNN.__from+  sG  € õ ˜WÑ%Ô%ˆØ"ŸJšJØÕ!1Ô!Dñ
ô 
Ðð —z’z .°$Ñ7Ô7ˆå”˜*­B¬JÐ7Ñ7Ô7ˆØð 	'Ý˜vÑ&Ô&ˆFØÐ#ØÔ*×:Ò:¸6À<ÑPÔPˆEˆEà Õ$4Ô$FÒFÐFàÔ*×2Ò2°6¸1¸mÑLÔLß&Ò&Ñ(Ô(ß’U‘W”Wð �ð Ô*×2Ò2°6¸1¸lÑKÔKß&Ò&Ñ(Ô(ß’U‘W”Wð ð
 ˆ	Øˆ;Ø4Ð4¨eÐ4Ñ4Ô4ˆCÝ  Ñ'Ô'ð 	Mð 	M‰GˆAˆtØ'0Ð8�y ”|�|°bˆHØ×Ò�X°4À(ÐKÑKÔKÑLÔLÐLÐLÝ�9 S™>œ>Ñ*Ô*ˆåˆ{ÑÔ�s 9™~œ~Ò-Ð-ÝÝ�{Ñ#Ô#ð 4ð 4µs¸9±~´~ð 4ð 4ð 4ñô ð õ
 $¥D­¨[×-?Ò-?Ñ-AÔ-AÀ9Ñ)MÔ)MÑ$NÔ$NÑOÔOˆØˆsØØØØð	
ð 
ð
 &ð
ð ð
ð 
ð 	
r"   c                óR   — |                      |¦  «        } | 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)
        rM   )rN   Ú_ScaNN__from)r¯   r;   r)   r?   rA   rC   r=   s          r    Ú
from_textszScaNN.from_textsg  sR   € ð4 ×.Ò.¨uÑ5Ô5ˆ
ØˆsŒzØØØð
ð  Øð
ð 
ð ð
ð 
ð 	
r"   úList[Tuple[str, List[float]]]c                óX   — d„ |D ¦   «         }d„ |D ¦   «         } | j         |||f||dœ|¤ŽS )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)
        c                ó   — g | ]
}|d          ‘ŒS )r   r%   ©rg   Úts     r    ru   z)ScaNN.from_embeddings.<locals>.<listcomp>§  s   € Ð/Ð/Ð/˜!��1”Ð/Ð/Ð/r"   c                ó   — g | ]
}|d          ‘ŒS )rž   r%   rº   s     r    ru   z)ScaNN.from_embeddings.<locals>.<listcomp>¨  s   € Ð4Ð4Ð4˜q�a˜”dÐ4Ð4Ð4r"   rM   )rµ   )r¯   rR   r)   r?   rA   rC   r;   r=   s           r    Úfrom_embeddingszScaNN.from_embeddings‹  se   € ð8 0Ð/˜Ð/Ñ/Ô/ˆØ4Ð4 OÐ4Ñ4Ô4ˆ
ØˆsŒzØØØð
ð  Øð
ð 
ð ð
ð 
ð 	
r"   Úfolder_pathÚ
index_nameÚNonec                ó”  — t          |¦  «        }|d                     |¬¦  «        z  }|                     dd¬¦  «         | j                             t          |¦  «        ¦  «         t          |d                     |¬¦  «        z  d¦  «        5 }t          j        | j	        | j
        f|¦  «         ddd¦  «         dS # 1 swxY w Y   dS )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©r¿   T©Úexist_okÚparentsú{index_name}.pklÚwbN)r   ÚformatÚmkdirr*   Ú	serializerŒ   ÚopenÚpickleÚdumpr+   r,   )r9   r¾   r¿   ÚpathÚ
scann_pathÚfs         r    Ú
save_localzScaNN.save_local²  s  € õ �KÑ Ô ˆØÐ0×7Ò7À:Ð7ÑNÔNÑNˆ
Ø×Ò $°ÐÑ5Ô5Ð5ð 	Œ
×Ò�S ™_œ_Ñ-Ô-Ð-õ �$Ð+×2Ò2¸jÐ2ÑIÔIÑIÈ4ÑPÔPð 	GÐTUÝŒK˜œ¨Ô(AÐBÀAÑFÔFÐFð	Gð 	Gð 	Gñ 	Gô 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gøøøð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gs   Â"B=Â=CÃC)Úallow_dangerous_deserializationrÓ   c               óÒ  — |st          d¦  «        ‚t          |¦  «        }|d                     |¬¦  «        z  }|                     dd¬¦  «         t	          d¦  «        }|j                             t          |¦  «        ¦  «        }	t          |d                     |¬¦  «        z  d¦  «        5 }
t          j
        |
¦  «        \  }}d	d	d	¦  «         n# 1 swxY w Y    | ||	||fi |¤ŽS )
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)rI   r   rÉ   rÊ   r   r¦   Úload_searcherrŒ   rÌ   rÍ   Úload)r¯   r¾   r)   r¿   rÓ   rC   rÏ   rÐ   r$   r*   rÑ   r+   r,   s                r    Ú
load_localzScaNN.load_localÄ  sL  € ð. /ð 	Ýð	"ñô ð õ �KÑ Ô ˆØÐ0×7Ò7À:Ð7ÑNÔNÑNˆ
Ø×Ò $°ÐÑ5Ô5Ð5å˜WÑ%Ô%ˆØÔ&×4Ò4µS¸±_´_ÑEÔEˆõ �$Ð+×2Ò2¸jÐ2ÑIÔIÑIÈ4ÑPÔPð 	ÐTUõ ”Øñô ñØØ$ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð ˆs�9˜e XÐ/CÐNÐNÀvÐNÐNÐNs   Â.CÃCÃCúCallable[[float], float]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.
        NzJUnknown distance strategy, must be cosine, max_inner_product, or euclidean)r6   r2   r   r~   Ú%_max_inner_product_relevance_score_fnr¥   Ú_euclidean_relevance_score_fnrI   )r9   s    r    Ú_select_relevance_score_fnz ScaNN._select_relevance_score_fnú  se   € ð Ô+Ð7ØÔ3Ð3ð Ô!Õ%5Ô%GÒGÐGØÔ=Ð=ØÔ#Õ'7Ô'JÒJÐJàÔ5Ð5åð ñô ð r"   c                óà   ‡‡	— |                      dd¦  «        Š	|                      ¦   «         Š‰€t          d¦  «        ‚ | j        |f|||dœ|¤Ž}ˆfd„|D ¦   «         }‰	�ˆ	fd„|D ¦   «         }|S )z?Return docs and their similarity scores on a scale from 0 to 1.rq   NzLnormalize_score_fn must be provided to ScaNN constructor to normalize scores)r]   r_   ra   c                ó0   •— g | ]\  }}| ‰|¦  «        f‘ŒS r%   r%   )rg   ro   Úscorer.   s      €r    ru   zBScaNN._similarity_search_with_relevance_scores.<locals>.<listcomp>,  s;   ø€ ð 
ð 
ð 
Ù1;°°eˆSÐ$Ð$ UÑ+Ô+Ð,ð
ð 
ð 
r"   c                ó*   •— g | ]\  }}|‰k    ¯||f‘ŒS r%   r%   )rg   ro   rs   rq   s      €r    ru   zBScaNN._similarity_search_with_relevance_scores.<locals>.<listcomp>0  s7   ø€ ð #ð #ð #á#�C˜Ø Ò0Ð0ð �jÐ!à0Ð0Ð0r"   )ÚpoprÝ   rI   r�   )
r9   r‹   r]   r_   ra   rC   r—   Údocs_and_rel_scoresr.   rq   s
           @@r    Ú(_similarity_search_with_relevance_scoresz.ScaNN._similarity_search_with_relevance_scores  sá   øø€ ð !Ÿ*š*Ð%6¸Ñ=Ô=ˆØ!×<Ò<Ñ>Ô>ÐØÐ%Ýð9ñô ð ð <˜$Ô;Øð
àØØð	
ð 
ð
 ð
ð 
ˆð
ð 
ð 
ð 
Ø?Nð
ñ 
ô 
Ðð Ð&ð#ð #ð #ð #à':ð#ñ #ô #Ðð
 #Ð"r"   )r)   r   r*   r   r+   r   r,   r-   r.   r/   r0   r1   r2   r   r3   r4   )NN)r;   r<   r=   r>   r?   r@   rA   rB   rC   r   r   rD   )
r;   r<   r?   r@   rA   rB   rC   r   r   rD   )
rR   rS   r?   r@   rA   rB   rC   r   r   rD   rl   )rA   rB   rC   r   r   rW   )rZ   Nr[   )r)   r\   r]   r^   r_   r`   ra   r^   rC   r   r   rb   )r‹   rŒ   r]   r^   r_   r`   ra   r^   rC   r   r   rb   )r)   r\   r]   r^   r_   r`   ra   r^   rC   r   r   r‘   )r‹   rŒ   r]   r^   r_   r`   ra   r^   rC   r   r   r‘   )NNF)r;   rD   r=   rœ   r)   r   r?   r@   rA   rB   r0   r1   rC   r   r   r(   )r;   rD   r)   r   r?   r@   rA   rB   rC   r   r   r(   )rR   r·   r)   r   r?   r@   rA   rB   rC   r   r   r(   )r*   )r¾   rŒ   r¿   rŒ   r   rÀ   )r¾   rŒ   r)   r   r¿   rŒ   rÓ   r1   rC   r   r   r(   )r   rÙ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r¥   r:   rP   rQ   rV   rY   rŠ   r�   r˜   r›   Úclassmethodrµ   r¶   r½   rÒ   rØ   rÝ   rä   r%   r"   r    r(   r(   !   s‘  € € € € € ðð ð. BFØ"Ø.>Ô.QØ&*ð*ð *ð *ð *ð *ð2 +/Ø#'ðNð Nð Nð Nð Nð$ +/Ø#'ð	Uð Uð Uð Uð Uð0 +/Ø#'ð	Uð Uð Uð Uð Uð8Pð Pð Pð Pð Pð" Ø+/Øð>ð >ð >ð >ð >ðF Ø+/Øðð ð ð ð ðD Ø+/Øð3ð 3ð 3ð 3ð 3ð@ Ø+/Øð3ð 3ð 3ð 3ð 3ð2 ð +/Ø#'Ø"ð9
ð 9
ð 9
ð 9
ñ „[ð9
ðv ð
 +/Ø#'ð!
ð !
ð !
ð !
ñ „[ð!
ðF ð
 +/Ø#'ð$
ð $
ð $
ð $
ñ „[ð$
ðLGð Gð Gð Gð Gð$ ð
 "ð	3Oð 16ð3Oð 3Oð 3Oð 3Oð 3Oñ „[ð3Oðjð ð ð ð8 Ø+/Øð"#ð "#ð "#ð "#ð "#ð "#ð "#r"   r(   )r   r   r   r   )r   r   )#Ú
__future__r   r€   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õ      sp  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ Gà Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø -Ð -Ð -Ð -Ð -Ð -Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3à DÐ DÐ DÐ DÐ DÐ DÐ DÐ DØ CÐ CÐ CÐ CÐ CÐ CØ CÐ CÐ CÐ CÐ CÐ Cðð ð ð ð!ð !ð !ð !ðT#ð T#ð T#ð T#ð T#ˆKñ T#ô T#ð T#ð T#ð T#r"   