§
    ™Štj$  ã                  ó  — d dl mZ d dlmZmZ d dlZd dlZd dlm	Z	 d dlm
Z
mZ d'd
„Zd(d„Zd'd„Zd)d„Zed*d„¦   «         Zed+d„¦   «         Zd,d„Zed-d„¦   «         Zed.d„¦   «         Zed/d„¦   «         Zd0d„Zd1d"„Zd2d%„Zd3d&„ZdS )4é    )Úannotations)ÚAnyÚoverloadN)Ú
coo_matrix)ÚTensorÚdeviceÚaúlist | np.ndarray | TensorÚreturnr   c                óh  — t          | t          ¦  «        rLt          d„ | D ¦   «         ¦  «        rt          j        d„ | D ¦   «         ¦  «        S t          j        | ¦  «        } n)t          | t          ¦  «        st          j        | ¦  «        } | j        r |                      t          j	        ¬¦  «        S | S )a  
    Converts the input `a` to a PyTorch tensor if it is not already a tensor.
    Handles lists of sparse tensors by stacking them.

    Args:
        a (Union[list, np.ndarray, Tensor]): The input array or tensor.

    Returns:
        Tensor: The converted tensor.
    c              3  óN   K  — | ] }t          |t          ¦  «        o|j        V — Œ!d S ©N)Ú
isinstancer   Ú	is_sparse©Ú.0Úxs     ú_/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sentence_transformers/util/tensor.pyú	<genexpr>z%_convert_to_tensor.<locals>.<genexpr>   s3   è è € Ð@Ð@¸�z˜!�VÑ$Ô$Ð4¨¬Ð@Ð@Ð@Ð@Ð@Ð@ó    c                ór   — g | ]4}|                      ¦   «                              t          j        ¬ ¦  «        ‘Œ5S )©Údtype)ÚcoalesceÚtoÚtorchÚfloat32r   s     r   ú
<listcomp>z&_convert_to_tensor.<locals>.<listcomp>   s0   € ÐPÐPÐPÈ §
¢
¡¤§¢µe´m Ñ DÔ DÐPÐPÐPr   r   )
r   ÚlistÚallr   ÚstackÚtensorr   r   r   r   ©r	   s    r   Ú_convert_to_tensorr$      s§   € õ �!•TÑÔð åÐ@Ð@¸aÐ@Ñ@Ô@Ñ@Ô@ð 	 å”;ÐPÐPÈaÐPÑPÔPÑQÔQÐQå”˜Q‘”ˆAˆAÝ˜�6Ñ"Ô"ð ÝŒL˜‰OŒOˆØ„{ð )Ø�tŠt�%œ-ˆtÑ(Ô(Ð(Ø€Hr   c                ó`   — |                       ¦   «         dk    r|                      d¦  «        } | S )zÊ
    If the tensor `a` is 1-dimensional, it is unsqueezed to add a batch dimension.

    Args:
        a (Tensor): The input tensor.

    Returns:
        Tensor: The tensor with a batch dimension.
    é   r   )ÚdimÚ	unsqueezer#   s    r   Ú_convert_to_batchr)   $   s)   € ð 	‡u‚u�w„w�!‚|€|Ø�KŠK˜‰NŒNˆØ€Hr   c                ó~   — t          | ¦  «        } |                      ¦   «         dk    r|                      d¦  «        } | S )a  
    Converts the input data to a tensor with a batch dimension.
    Handles lists of sparse tensors by stacking them.

    Args:
        a (Union[list, np.ndarray, Tensor]): The input data to be converted.

    Returns:
        Tensor: The converted tensor with a batch dimension.
    r&   r   )r$   r'   r(   r#   s    r   Ú_convert_to_batch_tensorr+   3   s6   € õ 	˜1ÑÔ€AØ‡u‚u�w„w�!‚|€|Ø�KŠK˜‰NŒNˆØ€Hr   Ú
embeddingsc                ó~  — | j         s't          j        j                             | dd¬¦  «        S |                      ¦   «         } |                      ¦   «         |                      ¦   «         }}t          j        |  	                    d¦  «        | j
        ¬¦  «        }|                     d|d         |dz  ¦  «         t          j        |¦  «                             d|d         ¦  «        }|dk    }|                     ¦   «         }||xx         ||         z  cc<   t          j        |||  	                    ¦   «         ¦  «        S )zá
    Normalizes the embeddings matrix, so that each sentence embedding has unit length.

    Args:
        embeddings (Tensor): The input embeddings matrix.

    Returns:
        Tensor: The normalized embeddings matrix.
    é   r&   )Úpr'   r   )r   )r   r   ÚnnÚ
functionalÚ	normalizer   ÚindicesÚvaluesÚzerosÚsizer   Ú
index_add_ÚsqrtÚindex_selectÚcloneÚsparse_coo_tensor)r,   r3   r4   Ú	row_normsÚmaskÚnormalized_valuess         r   Únormalize_embeddingsr?   D   s#  € ð Ôð EÝŒxÔ"×,Ò,¨Z¸1À!Ð,ÑDÔDÐDà×$Ò$Ñ&Ô&€JØ ×(Ò(Ñ*Ô*¨J×,=Ò,=Ñ,?Ô,?ˆV€Gõ ”˜JŸOšO¨AÑ.Ô.°zÔ7HÐIÑIÔI€IØ×Ò˜˜G AœJ¨°©	Ñ2Ô2Ð2Ý”
˜9Ñ%Ô%×2Ò2°1°g¸a´jÑAÔA€Ið �qŠ=€DØŸš™œÐØ�dÐÐÔ˜y¨œÑ.ÐÐÑåÔ" 7Ð,=¸z¿ºÑ?PÔ?PÑQÔQÐQr   ú
np.ndarrayÚtruncate_dimú
int | Nonec                ó   — d S r   © ©r,   rA   s     r   Útruncate_embeddingsrF   a   ó   € ØY\ÐY\r   útorch.Tensorc                ó   — d S r   rD   rE   s     r   rF   rF   e   ó   € Ø]`Ð]`r   únp.ndarray | torch.Tensorc                ó   — | dd|…f         S )a¼  
    Truncates the embeddings matrix.

    Args:
        embeddings (Union[np.ndarray, torch.Tensor]): Embeddings to truncate.
        truncate_dim (Optional[int]): The dimension to truncate sentence embeddings to. `None` does no truncation.

    Example:
        >>> from sentence_transformers import SentenceTransformer
        >>> from sentence_transformers.util import truncate_embeddings
        >>> model = SentenceTransformer("tomaarsen/mpnet-base-nli-matryoshka")
        >>> embeddings = model.encode(["It's so nice outside!", "Today is a beautiful day.", "He drove to work earlier"])
        >>> embeddings.shape
        (3, 768)
        >>> model.similarity(embeddings, embeddings)
        tensor([[1.0000, 0.8100, 0.1426],
                [0.8100, 1.0000, 0.2121],
                [0.1426, 0.2121, 1.0000]])
        >>> truncated_embeddings = truncate_embeddings(embeddings, 128)
        >>> truncated_embeddings.shape
        >>> model.similarity(truncated_embeddings, truncated_embeddings)
        tensor([[1.0000, 0.8092, 0.1987],
                [0.8092, 1.0000, 0.2716],
                [0.1987, 0.2716, 1.0000]])

    Returns:
        Union[np.ndarray, torch.Tensor]: Truncated embeddings.
    .NrD   rE   s     r   rF   rF   i   s   € ð: �c˜=˜L˜=Ð(Ô)Ð)r   Úmax_active_dimsÚintc                ó   — d S r   rD   ©r,   rM   s     r   Úselect_max_active_dimsrQ   ‰   s   € ØilÐilr   ÚNonec                ó   — d S r   rD   rP   s     r   rQ   rQ   �   rG   r   c                ó   — d S r   rD   rP   s     r   rQ   rQ   ‘   rJ   r   c                ó¨  — |€| S |dk    rt          d|› d�¦  «        ‚t          | t          j        ¦  «        rt	          j        | ¦  «        } | j        d         }t	          j        t	          j        | ¦  «        t          ||¦  «        d¬¦  «        \  }}t	          j
        | ¦  «        }|                     d||                      d|¦  «        ¦  «         |S )aÿ  
    Returns a new tensor with only the top-k values (in absolute terms) of each embedding, all others set to zero.

    The input embeddings are never modified in place.

    Args:
        embeddings (Union[np.ndarray, torch.Tensor]): Embeddings to sparsify by keeping only the largest values.
        max_active_dims (Optional[int]): Number of values to keep as non-zeros per embedding. `None` keeps all
            values, returning the embeddings as-is.

    Raises:
        ValueError: If `max_active_dims` is 0 or negative.

    Returns:
        Union[np.ndarray, torch.Tensor]: A new dense tensor of the same shape, with all but the top-k values per
            embedding set to zero. If `max_active_dims` is `None`, the embeddings are returned unchanged.
    Nr   z0max_active_dims must be a positive integer, got ú.éÿÿÿÿ)Úkr'   )Ú
ValueErrorr   ÚnpÚndarrayr   r"   ÚshapeÚtopkÚabsÚminÚ
zeros_likeÚscatter_Úgather)r,   rM   Úembedding_dimÚ_Útop_indicesÚselecteds         r   rQ   rQ   •   sÕ   € ð( ÐØÐØ˜!ÒÐÝÐ^ÈOÐ^Ð^Ð^Ñ_Ô_Ð_å�*�bœjÑ)Ô)ð .Ý”\ *Ñ-Ô-ˆ
àÔ$ RÔ(€Mõ ”Z¥¤	¨*Ñ 5Ô 5½¸_ÈmÑ9\Ô9\ÐbdÐeÑeÔe�N€A€{õ Ô 
Ñ+Ô+€HØ×Ò�b˜+ z×'8Ò'8¸¸[Ñ'IÔ'IÑJÔJÐJà€Or   Úbatchúdict[str, Any]Útarget_devicer   c                ó‚   — | D ];}t          | |         t          ¦  «        r| |                              |¦  «        | |<   Œ<| S )au  
    Send a PyTorch batch (i.e., a dictionary of string keys to Tensors) to a device (e.g. "cpu", "cuda", "mps").

    Args:
        batch (Dict[str, Tensor]): The batch to send to the device.
        target_device (torch.device): The target device (e.g. "cpu", "cuda", "mps").

    Returns:
        Dict[str, Tensor]: The batch with tensors sent to the target device.
    )r   r   r   )rg   ri   Úkeys      r   Úbatch_to_devicerl   ½   sH   € ð ð 6ð 6ˆÝ�e˜C”j¥&Ñ)Ô)ð 	6Ø˜sœŸš }Ñ5Ô5ˆE�#‰JøØ€Lr   r   r   c                óV  — |                       ¦   «         } |                      ¦   «                              ¦   «                              ¦   «         }|                      ¦   «                              ¦   «                              ¦   «         }t          ||d         |d         ff| j        ¬¦  «        S )ac  
    Converts a sparse PyTorch tensor to a SciPy COO sparse matrix.

    Args:
        x (torch.Tensor): A 2-dimensional sparse PyTorch tensor in COO layout.

    Example:
        >>> import torch
        >>> from sentence_transformers.util import to_scipy_coo
        >>> x = torch.sparse_coo_tensor([[0, 1], [1, 0]], [1.0, 2.0], (3, 3))
        >>> to_scipy_coo(x).toarray()
        array([[0., 1., 0.],
               [2., 0., 0.],
               [0., 0., 0.]], dtype=float32)

    Returns:
        scipy.sparse.coo_matrix: A SciPy COO matrix with the same shape, indices and values as the input tensor.
    r   r&   )r\   )r   r3   ÚcpuÚnumpyr4   r   r\   )r   r3   r4   s      r   Úto_scipy_coorp   Î   s~   € ð& 	
�
Š
‰Œ€AØ�iŠi‰kŒk�oŠoÑÔ×%Ò%Ñ'Ô'€GØ�XŠX‰ZŒZ�^Š^ÑÔ×#Ò#Ñ%Ô%€FÝ�v ¨¤
¨G°A¬JÐ7Ð8ÀÄÐHÑHÔHÐHr   c                ó¾  — | j         s|                      ¦   «         } |                      ¦   «         } t          j        |                      d¦  «        | j        t          j        ¬¦  «        }|                      ¦   «         dk    r+d||  	                    ¦   «          
                    ¦   «         <   |S |                      ¦   «         dk    rv|                      ¦   «                              ¦   «         dk    rJ|  	                    ¦   «         }t          j        |d         d¬¦  «        \  }}|                     ¦   «         ||<   |S t          d|                      ¦   «         › d	�¦  «        ‚)
a  
    Compute count vector from sparse embeddings indicating how many samples have non-zero values in each dimension.

    Args:
        embeddings: Sparse tensor of shape (batch_size, vocab_size) or (vocab_size,)

    Returns:
        Count vector of shape (vocab_size,)
    rW   )r   r   r&   r.   r   T)Úreturn_countszExpected 1D or 2D tensor, got ÚD)r   Ú	to_sparser   r   r5   r6   r   Úint32r'   r3   Úsqueezer4   ÚnumelÚuniquerN   rY   )r,   Úcount_vectorr3   Úunique_dimsÚcountss        r   Úcompute_count_vectorr|   ç   s;  € ð Ôð ,Ø×)Ò)Ñ+Ô+ˆ
ð ×$Ò$Ñ&Ô&€Jå”;˜zŸš¨rÑ2Ô2¸:Ô;LÕTYÔT_Ð`Ñ`Ô`€LØ‡~‚~ÑÔ˜1ÒÐà78ˆ�Z×'Ò'Ñ)Ô)×1Ò1Ñ3Ô3Ñ4ØÐØ	�ŠÑ	Ô	˜QÒ	Ð	à×ÒÑÔ×$Ò$Ñ&Ô&¨Ò*Ð*Ø ×(Ò(Ñ*Ô*ˆGå"'¤,¨w°q¬zÈÐ"NÑ"NÔ"NÑˆK˜Ø(.¯
ª
©¬ˆL˜Ñ%àÐåÐM¸*¿.º.Ñ:JÔ:JÐMÐMÐMÑNÔNÐNr   )r	   r
   r   r   )r	   r   r   r   )r,   r   r   r   )r,   r@   rA   rB   r   r@   )r,   rH   rA   rB   r   rH   )r,   rK   rA   rB   r   rK   )r,   rK   rM   rN   r   rH   )r,   r@   rM   rR   r   r@   )r,   rH   rM   rR   r   rH   )r,   rK   rM   rB   r   rK   )rg   rh   ri   r   r   rh   )r   r   r   r   )r,   rH   r   rH   )Ú
__future__r   Útypingr   r   ro   rZ   r   Úscipy.sparser   r   r   r$   r)   r+   r?   rF   rQ   rl   rp   r|   rD   r   r   ú<module>r€      s´  ðØ "Ð "Ð "Ð "Ð "Ð "à  Ð  Ð  Ð  Ð  Ð  Ð  Ð  à Ð Ð Ð Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  ðð ð ð ð2ð ð ð ðð ð ð ð"Rð Rð Rð Rð: 
Ø \Ð \Ð \ñ 
„Ø \ð 
Ø `Ð `Ð `ñ 
„Ø `ð*ð *ð *ð *ð@ 
Ø lÐ lÐ lñ 
„Ø lð 
Ø \Ð \Ð \ñ 
„Ø \ð 
Ø `Ð `Ð `ñ 
„Ø `ð%ð %ð %ð %ðPð ð ð ð"Ið Ið Ið Ið2Oð Oð Oð Oð Oð Or   