Ë
    kQêj>  ã                   óR   — d dl mZ d dlmZ d dlZddlmZ ddlm	Z	  G d„ d	e	«      Z
y)
é    )Úcached_property)ÚUnionNé   )Úattempt_import_or_raiseé   )ÚRerankerc                   ó  ‡ — e Zd ZdZ	 	 	 	 	 	 ddededeedf   dedef
ˆ fd„Zd	„ Z	e
d
„ «       Zdej                  defd„Zdedej                  dej                  fd„Zdedej                  fd„Zdedej                  fd„Zˆ xZS )ÚCrossEncoderRerankeraâ  
    Reranks the results using a cross encoder model. The cross encoder model is
    used to score the query and each result. The results are then sorted by the score.

    Parameters
    ----------
    model_name : str, default "cross-encoder/ms-marco-TinyBERT-L-6"
        The name of the cross encoder model to use. See the sentence transformers
        documentation for a list of available models.
    column : str, default "text"
        The name of the column to use as input to the cross encoder model.
    device : str, default None
        The device to use for the cross encoder model. If None, will use "cuda"
        if available, otherwise "cpu".
    return_score : str, default "relevance"
        options are "relevance" or "all". Only "relevance" is supported for now.
    trust_remote_code : bool, default True
        If True, will trust the remote code to be safe. If False, will not trust
        the remote code and will not run it
    batch_size : int, default 32
        The number of query-passage pairs scored per forward pass.
    **kwargs
        Additional keyword arguments passed to
        ``sentence_transformers.CrossEncoder``, for example ``max_length`` or
        ``model_kwargs={"torch_dtype": "bfloat16"}``.
    NÚ
model_nameÚcolumnÚdeviceÚtrust_remote_codeÚ
batch_sizec                 óî   •— t         ‰	| �  |«       t        d«      }|| _        || _        || _        || _        || _        || _        | j
                  €$|j                  j                  «       rdnd| _        y y )NÚtorchÚcudaÚcpu)ÚsuperÚ__init__r   r   r   r   r   r   Úkwargsr   Úis_available)
Úselfr   r   r   Úreturn_scorer   r   r   r   Ú	__class__s
            €úd/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/lancedb/rerankers/cross_encoder.pyr   zCrossEncoderReranker.__init__*   sn   ø€ ô 	‰Ñ˜Ô&Ü'¨Ó0ˆØ$ˆŒØˆŒØˆŒØ!2ˆÔØ$ˆŒØˆŒØ�;‰;ÐØ$)§J¡J×$;Ñ$;Ô$=™&À5ˆD�Kð ó    c                 ó"   — d| j                   › d�S )Nz CrossEncoderReranker(model_name=ú))r   )r   s    r   Ú__str__zCrossEncoderReranker.__str__?   s   € Ø1°$·/±/Ð1BÀ!ÐDÐDr   c                 ó˜   — t        d«      } |j                  | j                  f| j                  | j                  dœ| j
                  ¤Ž}|S )NÚsentence_transformers)r   r   )r   ÚCrossEncoderr   r   r   r   )r   ÚsbertÚcross_encoders      r   ÚmodelzCrossEncoderReranker.modelB   sQ   € ä'Ð(?Ó@ˆà*˜×*Ñ*Ø�O‰Oð
à—;‘;Ø"×4Ñ4ñ
ð �k‰kñ	
ˆð Ðr   Ú
result_setÚqueryc                 ón  — | j                  |«      }t        |«      dk(  r|S || j                     j                  «       }|D �cg c]  }||g‘Œ }}| j                  j                  || j                  ¬«      }|j                  dt        j                  |t        j                  «       ¬«      «      }|S c c}w )Nr   )r   Ú_relevance_score)Útype)Ú_handle_empty_resultsÚlenr   Ú	to_pylistr%   Úpredictr   Úappend_columnÚpaÚarrayÚfloat32)r   r&   r'   ÚpassagesÚpassageÚ	cross_inpÚcross_scoress          r   Ú_rerankzCrossEncoderReranker._rerankO   s£   € Ø×/Ñ/°
Ó;ˆ
Üˆz‹?˜aÒØÐØ˜dŸk™kÑ*×4Ñ4Ó6ˆØ5=Ö>¨'�e˜WÒ%Ð>ˆ	Ð>Ø—z‘z×)Ñ)¨)ÀÇÁÐ)ÓPˆØ×-Ñ-Ø¤§¡¨¼B¿J¹J»LÔ Ió
ˆ
ð Ðùò ?s   ÁB2Úvector_resultsÚfts_resultsc                 óö   — | j                   dk(  r| j                  ||«      }n| j                  ||«      }| j                  ||«      }| j                   dk(  r| j	                  |«      }|j                  dg«      }|S )NÚallÚ	relevance©r)   Ú
descending)ÚscoreÚ_merge_and_keep_scoresÚmerge_resultsr7   Ú_keep_relevance_scoreÚsort_by)r   r'   r8   r9   Úcombined_resultss        r   Úrerank_hybridz"CrossEncoderReranker.rerank_hybrid\   s…   € ð �:‰:˜ÒØ#×:Ñ:¸>È;ÓWÑà#×1Ñ1°.À+ÓNÐØŸ<™<Ð(8¸%Ó@Ðà�:‰:˜Ò$Ø#×9Ñ9Ð:JÓKÐà+×3Ñ3Ø/Ð0ó
Ðð  Ðr   c                 ó�   — | j                  ||«      }| j                  dk(  r|j                  dg«      }|j                  dg«      }|S )Nr<   Ú	_distancer=   ©r7   r?   Údrop_columnsrC   )r   r'   r8   s      r   Úrerank_vectorz"CrossEncoderReranker.rerank_vectorq   sJ   € ØŸ™ n°eÓ<ˆØ�:‰:˜Ò$Ø+×8Ñ8¸+¸ÓGˆNà'×/Ñ/Ð1SÐ0TÓUˆØÐr   c                 ó�   — | j                  ||«      }| j                  dk(  r|j                  dg«      }|j                  dg«      }|S )Nr<   Ú_scorer=   rH   )r   r'   r9   s      r   Ú
rerank_ftszCrossEncoderReranker.rerank_ftsy   sJ   € Ø—l‘l ;°Ó6ˆØ�:‰:˜Ò$Ø%×2Ñ2°H°:Ó>ˆKà!×)Ñ)Ð+MÐ*NÓOˆØÐr   )z#cross-encoder/ms-marco-TinyBERT-L-6ÚtextNr<   Té    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústrr   ÚboolÚintr   r   r   r%   r0   ÚTabler7   rE   rJ   rM   Ú__classcell__)r   s   @r   r
   r
      sé   ø„ ñð: @ØØ#'Ø Ø"&ØñIàðIð ðIð �c˜4�iÑ ð	Ið  ðIð õIò*Eð ñ
ó ð
ð "§(¡(ð °3ó ð àð ð Ÿ™ð ð —X‘Xó	 ð* 3ð ¸¿¹ó ð ð °"·(±(÷ r   r
   )Ú	functoolsr   Útypingr   Úpyarrowr0   Úutilr   Úbaser   r
   © r   r   ú<module>r_      s$   ðõ
 &Ý ã å *Ý ôq˜8õ qr   