§
    ~Štj‰  ã                  ó  — d dl m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 d dlmZ erd dlZ ej        e¦  «        Zeeee                  ee         ef         Zdd„Zdd„Z G d„ ded¬¦  «        Z G d„ d¦  «        ZdS )é    )ÚannotationsN)ÚSequence)ÚTYPE_CHECKINGÚAnyÚCallableÚLiteralÚOptionalÚUnion)Ú	TypedDictÚXÚMatrixÚYÚreturnú
np.ndarrayc                óê  — ddl }t          | ¦  «        dk    st          |¦  «        dk    r |j        g ¦  «        S  |j        | ¦  «        }  |j        |¦  «        }| j        d         |j        d         k    r t	          d| j        › d|j        › d�¦  «        ‚	 ddl} |j        | |j        ¬¦  «        }  |j        ||j        ¬¦  «        }d|                     | |d¬	¦  «        z
  }t          |t          ¦  «        r |j        |g¦  «        S  |j        |¦  «        S # t          $ rÍ t                               d
¦  «         |j                             | d¬¦  «        }|j                             |d¬¦  «        } |j        dd¬¦  «        5   |j        | |j        ¦  «         |j        ||¦  «        z  }ddd¦  «         n# 1 swxY w Y   d| |j        |¦  «         |j        |¦  «        z  <   |cY S w xY w)z<Row-wise cosine similarity between two equal-width matrices.r   Né   z;Number of columns in X and Y must be the same. X has shape z and Y has shape ú.)ÚdtypeÚcosine)ÚmetriczƒUnable to import simsimd, defaulting to NumPy implementation. If you want to use simsimd please install with `pip install simsimd`.)ÚaxisÚignore)ÚdivideÚinvalidg        )ÚnumpyÚlenÚarrayÚshapeÚ
ValueErrorÚsimsimdÚfloat32ÚcdistÚ
isinstanceÚfloatÚImportErrorÚloggerÚdebugÚlinalgÚnormÚerrstateÚdotÚTÚouterÚisnanÚisinf)r   r   ÚnpÚsimdÚZÚX_normÚY_normÚ
similaritys           úe/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langsmith/_internal/_embedding_distance.pyÚcosine_similarityr7      sw  € àÐÐÐå
ˆ1�v„v�‚{€{•c˜!‘f”f ’k�kØˆrŒx˜‰|Œ|ÐàˆŒ�‰Œ€AØˆŒ�‰Œ€AØ„wˆq„z�Q”W˜Q”ZÒÐÝð*È!Ì'ð *ð *Ø œwð*ð *ð *ñ
ô 
ð 	
ðØÐÐÐàˆBŒH�Q˜bœjÐ)Ñ)Ô)ˆØˆBŒH�Q˜bœjÐ)Ñ)Ô)ˆØ�—
’
˜1˜a¨�
Ñ1Ô1Ñ1ˆÝ�a�ÑÔð 	!Ø�2”8˜Q˜C‘=”=Ð ØˆrŒx˜‰{Œ{ÐøÝð ð ð Ý�ŠðHñ	
ô 	
ð 	
ð ”—’ ¨�Ñ*Ô*ˆØ”—’ ¨�Ñ*Ô*ˆàˆRŒ[ °(Ð;Ñ;Ô;ð 	Cð 	CØ˜œ  1¤3™œ¨(¨"¬(°6¸6Ñ*BÔ*BÑBˆJð	Cð 	Cð 	Cñ 	Cô 	Cð 	Cð 	Cð 	Cð 	Cð 	Cð 	Cøøøð 	Cð 	Cð 	Cð 	CàBEˆ
�8�2”8˜JÑ'Ô'¨(¨"¬(°:Ñ*>Ô*>Ñ>Ñ?ØÐÐÐðøøøs>   ÂA2D ÄD ÄA.G2Æ	)F>Æ2G2Æ>G	ÇG2ÇG	Ç)G2Ç1G2ú4Callable[[Sequence[str]], Sequence[Sequence[float]]]c                 ó^   ‡— 	 ddl mŠ n# t          $ r t          d¦  «        ‚w xY wd	ˆfd„} | S )
zGet the OpenAI GPT-3 encoder.r   )ÚClientzÔTHe default encoder for the EmbeddingDistance class uses the OpenAI API. Please either install the openai library with `pip install openai` or provide a custom encoder function (Callable[[str], Sequence[float]]).ÚtextsúSequence[str]r   úSequence[Sequence[float]]c                óŒ   •—  ‰¦   «         }|j                              t          | ¦  «        d¬¦  «        }d„ |j        D ¦   «         S )Nztext-embedding-3-small)ÚinputÚmodelc                ó   — g | ]	}|j         ‘Œ
S © )Ú	embedding)Ú.0Úds     r6   ú
<listcomp>z<_get_openai_encoder.<locals>.encode_text.<locals>.<listcomp>N   s   € Ð3Ð3Ð3 �”Ð3Ð3Ð3ó    )Ú
embeddingsÚcreateÚlistÚdata)r;   ÚclientÚresponseÚOpenAIClients      €r6   Úencode_textz(_get_openai_encoder.<locals>.encode_textI   sO   ø€ Ø�‘”ˆØÔ$×+Ò+Ý�u‘+”+Ð%=ð ,ñ 
ô 
ˆð 4Ð3 X¤]Ð3Ñ3Ô3Ð3rG   )r;   r<   r   r=   )Úopenair:   r%   )rO   rN   s    @r6   Ú_get_openai_encoderrQ   >   sv   ø€ ð
Ø1Ð1Ð1Ð1Ð1Ð1Ð1øÝð 
ð 
ð 
ÝðTñ
ô 
ð 	
ð
øøøð4ð 4ð 4ð 4ð 4ð 4ð Ðs   ƒ
 Š$c                  ó$   — e Zd ZU ded<   ded<   dS )ÚEmbeddingConfigz0Callable[[list[str]], Sequence[Sequence[float]]]ÚencoderzCLiteral['cosine', 'euclidean', 'manhattan', 'chebyshev', 'hamming']r   N)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__rB   rG   r6   rS   rS   S   s*   € € € € € € Ø=Ð=Ð=Ñ=ØOÐOÐOÑOÐOÐOrG   rS   F)Útotalc                  ó¢   — e Zd Z	 ddd„Zdd
„Zdd„Zedd„¦   «         Zedd„¦   «         Zedd„¦   «         Z	edd„¦   «         Z
edd„¦   «         ZdS )ÚEmbeddingDistanceNÚconfigúOptional[EmbeddingConfig]c                ó–   — |pi }|                      d¦  «        pd| _        |                      d¦  «        pt          ¦   «         | _        d S )Nr   r   rT   )ÚgetÚdistancerQ   rT   )Úselfr\   s     r6   Ú__init__zEmbeddingDistance.__init__Y   sH   € ð �˜2ˆØŸ
š
 8Ñ,Ô,Ð8°ˆŒØ—z’z )Ñ,Ô,ÐEÕ0CÑ0EÔ0EˆŒˆˆrG   Ú
predictionÚstrÚ	referencer   r$   c                óþ   — 	 dd l }n# t          $ r t          d¦  «        ‚w xY w|                      ||g¦  «        } |j        |¦  «        }|                      |d         |d         ¦  «                             ¦   «         S )Nr   zWThe EmbeddingDistance class requires NumPy. Please install it with `pip install numpy`.r   )r   r%   rT   r   Ú_compute_distanceÚitem)ra   rc   re   r0   rH   Úvectors         r6   ÚevaluatezEmbeddingDistance.evaluatea   s›   € ð
	ØÐÐÐÐøÝð 	ð 	ð 	Ýð'ñô ð ð	øøøð
 —\’\ :¨yÐ"9Ñ:Ô:ˆ
Ø�”˜*Ñ%Ô%ˆØ×%Ò% f¨Q¤i°¸´Ñ;Ô;×@Ò@ÑBÔBÐBs   ‚ ‡!Úar   Úbúnp.floatingc                óz  — | j         dk    r|                      ||¦  «        S | j         dk    r|                      ||¦  «        S | j         dk    r|                      ||¦  «        S | j         dk    r|                      ||¦  «        S | j         dk    r|                      ||¦  «        S t          d| j         › �¦  «        ‚)Nr   Ú	euclideanÚ	manhattanÚ	chebyshevÚhammingzInvalid distance metric: )r`   Ú_cosine_distanceÚ_euclidean_distanceÚ_manhattan_distanceÚ_chebyshev_distanceÚ_hamming_distancer   )ra   rk   rl   s      r6   rg   z#EmbeddingDistance._compute_distanceq   sÊ   € ØŒ=˜HÒ$Ð$Ø×(Ò(¨¨AÑ.Ô.Ð.ØŒ]˜kÒ)Ð)Ø×+Ò+¨A¨qÑ1Ô1Ð1ØŒ]˜kÒ)Ð)Ø×+Ò+¨A¨qÑ1Ô1Ð1ØŒ]˜kÒ)Ð)Ø×+Ò+¨A¨qÑ1Ô1Ð1ØŒ]˜iÒ'Ð'Ø×)Ò)¨!¨QÑ/Ô/Ð/åÐH¸¼ÐHÐHÑIÔIÐIrG   c                ó,   — dt          | g|g¦  «        z
  S )zäCompute the cosine distance between two vectors.

        Args:
            a (np.ndarray): The first vector.
            b (np.ndarray): The second vector.

        Returns:
            np.ndarray: The cosine distance.
        g      ð?)r7   ©rk   rl   s     r6   rs   z"EmbeddingDistance._cosine_distance   s   € ð Õ&¨ s¨Q¨CÑ0Ô0Ñ0Ð0rG   c                óF   — t           j                             | |z
  ¦  «        S )zëCompute the Euclidean distance between two vectors.

        Args:
            a (np.ndarray): The first vector.
            b (np.ndarray): The second vector.

        Returns:
            np.floating: The Euclidean distance.
        )r0   r(   r)   ry   s     r6   rt   z%EmbeddingDistance._euclidean_distanceŒ   s   € õ Œy�~Š~˜a !™eÑ$Ô$Ð$rG   c                óT   — t          j        t          j        | |z
  ¦  «        ¦  «        S )zëCompute the Manhattan distance between two vectors.

        Args:
            a (np.ndarray): The first vector.
            b (np.ndarray): The second vector.

        Returns:
            np.floating: The Manhattan distance.
        )r0   ÚsumÚabsry   s     r6   ru   z%EmbeddingDistance._manhattan_distance™   ó    € õ Œv•b”f˜Q ™U‘m”mÑ$Ô$Ð$rG   c                óT   — t          j        t          j        | |z
  ¦  «        ¦  «        S )zëCompute the Chebyshev distance between two vectors.

        Args:
            a (np.ndarray): The first vector.
            b (np.ndarray): The second vector.

        Returns:
            np.floating: The Chebyshev distance.
        )r0   Úmaxr}   ry   s     r6   rv   z%EmbeddingDistance._chebyshev_distance¦   r~   rG   c                ó2   — t          j        | |k    ¦  «        S )zçCompute the Hamming distance between two vectors.

        Args:
            a (np.ndarray): The first vector.
            b (np.ndarray): The second vector.

        Returns:
            np.floating: The Hamming distance.
        )r0   Úmeanry   s     r6   rw   z#EmbeddingDistance._hamming_distance³   s   € õ Œw�q˜A’v‰ŒÐrG   )N)r\   r]   )rc   rd   re   rd   r   r$   )rk   r   rl   r   r   rm   )rk   r   rl   r   r   r   )rU   rV   rW   rb   rj   rg   Ústaticmethodrs   rt   ru   rv   rw   rB   rG   r6   r[   r[   X   s  € € € € € ð -1ðFð Fð Fð Fð FðCð Cð Cð Cð Jð Jð Jð Jð ð
1ð 
1ð 
1ñ „\ð
1ð ð
%ð 
%ð 
%ñ „\ð
%ð ð
%ð 
%ð 
%ñ „\ð
%ð ð
%ð 
%ð 
%ñ „\ð
%ð ð
ð 
ð 
ñ „\ð
ð 
ð 
rG   r[   )r   r   r   r   r   r   )r   r8   )Ú
__future__r   ÚloggingÚcollections.abcr   Útypingr   r   r   r   r	   r
   Útyping_extensionsr   r   r0   Ú	getLoggerrU   r&   rJ   r$   r   r7   rQ   rS   r[   rB   rG   r6   ú<module>rŠ      s{  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø $Ð $Ð $Ð $Ð $Ð $ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð (Ð 'Ð 'Ð 'Ð 'Ð 'àð ØÐÐÐð 
ˆÔ	˜8Ñ	$Ô	$€à	ˆt�D˜”KÔ  $ s¤)¨SÐ0Ô	1€ð"ð "ð "ð "ðJð ð ð ð*Pð Pð Pð Pð P�i uð Pñ Pô Pð Pð
fð fð fð fð fñ fô fð fð fð frG   