Ë
    kQêjV&  ã                   óŽ   — d dl mZmZ d dlmZ d dlmZmZmZ d dl	Z
d dlZerddlmZ  eej                  «      Z G d„ de«      Zy)	é    )ÚABCÚabstractmethod)ÚVersion)ÚUnionÚListÚTYPE_CHECKINGNé   )ÚLanceVectorQueryBuilderc            	       óâ  — e Zd Zddefd„Zd„ Zdedej                  fd„Zdej                  fd„Z	ded	ej                  fd
„Z
ededej                  d	ej                  dej                  fd„«       Zdej                  d	ej                  fd„Z	 ddeeej                     ed   f   deedf   defd„Zdej                  fd„Zdej                  d	ej                  fd„Zdej                  fd„Zy)ÚRerankerÚreturn_scorec                 ó|   — |dvrt        d«      ‚|| _        ddi| _        t        j                  dk  r
ddi| _        yy)	a"  
        Interface for a reranker. A reranker is used to rerank the results from a
        vector and FTS search. This is useful for combining the results from both
        search methods.

        Parameters
        ----------
        return_score : str, default "relevance"
            opntions are "relevance" or "all"
            The type of score to return. If "relevance", will return only the relevance
            score. If "all", will return all scores from the vector and FTS search along
            with the relevance score.

        )Ú	relevanceÚallz)score must be either 'relevance' or 'all'Úpromote_optionsÚdefaulté   ÚpromoteTN)Ú
ValueErrorÚscoreÚ_concat_tables_argsÚARROW_VERSIONÚmajor)Úselfr   s     ú[/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/lancedb/rerankers/base.pyÚ__init__zReranker.__init__   sO   € ð Ð3Ñ3ÜÐHÓIÐIØ!ˆŒ
ð %6°yÐ#AˆÔ Ü×Ñ "Ò$Ø(1°4Ð'8ˆDÕ$ð %ó    c                 ó.   — | j                   j                  S )N)Ú	__class__Ú__name__)r   s    r   Ú__str__zReranker.__str__+   s   € Ø�~‰~×&Ñ&Ð&r   ÚqueryÚvector_resultsc                 óF   — t        | j                  j                  › d�«      ‚)ar  
        Rerank function receives the result from the vector search.
        This isn't mandatory to implement

        Parameters
        ----------
        query : str
            The input query
        vector_results : pa.Table
            The results from the vector search

        Returns
        -------
        pa.Table
            The reranked results
        z! does not implement rerank_vector©ÚNotImplementedErrorr   r    )r   r"   r#   s      r   Úrerank_vectorzReranker.rerank_vector.   s'   € ô* "Ø�~‰~×&Ñ&Ð'Ð'HÐIó
ð 	
r   Úresultsc                 ó”   — t        |«      dkD  r|S |j                  dt        j                  g t        j                  «       ¬«      «      S )zH
        Helper method to handle empty FTS results consistently
        r   Ú_relevance_score©Útype)ÚlenÚappend_columnÚpaÚarrayÚfloat32)r   r(   s     r   Ú_handle_empty_resultszReranker._handle_empty_resultsG   s>   € ô ˆw‹<˜!ÒØˆNØ×$Ñ$Ø¤§¡¨´"·*±*³,Ô ?ó
ð 	
r   Úfts_resultsc                 óF   — t        | j                  j                  › d�«      ‚)ai  
        Rerank function receives the result from the FTS search.
        This isn't mandatory to implement

        Parameters
        ----------
        query : str
            The input query
        fts_results : pa.Table
            The results from the FTS search

        Returns
        -------
        pa.Table
            The reranked results
        z does not implement rerank_ftsr%   )r   r"   r3   s      r   Ú
rerank_ftszReranker.rerank_ftsQ   s'   € ô* "Ø�~‰~×&Ñ&Ð'Ð'EÐFó
ð 	
r   Úreturnc                  ó   — y)aD  
        Rerank function receives the individual results from the vector and FTS search
        results. You can choose to use any of the results to generate the final results,
        allowing maximum flexibility. This is mandatory to implement

        Parameters
        ----------
        query : str
            The input query
        vector_results : pa.Table
            The results from the vector search
        fts_results : pa.Table
            The results from the FTS search

        Returns
        -------
        pa.Table
            The reranked results
        N© )r   r"   r#   r3   s       r   Úrerank_hybridzReranker.rerank_hybridj   s   € ð4 	r   c                 ól   — t        j                  ||gfi | j                  ¤Ž}| j                  |«      }|S )a¢  
        Merge the results from the vector and FTS search. This is a vanilla merging
        function that just concatenates the results and removes the duplicates.

        NOTE: This doesn't take score into account. It'll keep the instance that was
        encountered first. This is designed for rerankers that don't use the score.
        In case you want to use the score, or support `return_scores="all"` you'll
        have to implement your own merging function.

        Parameters
        ----------
        vector_results : pa.Table
            The results from the vector search
        fts_results : pa.Table
            The results from the FTS search
        )r/   Úconcat_tablesr   Ú_deduplicate)r   r#   r3   Úcombineds       r   Úmerge_resultszReranker.merge_results†   sA   € ô" ×#Ñ#Ø˜[Ð)ñ
Ø-1×-EÑ-Eñ
ˆð
 ×$Ñ$ XÓ.ˆàˆr   r
   NÚdeduplicatec                 óú  ‡— t        ‰t        «      s‰gn‰Št        ˆfd„‰D «       «      st        d«      ‚t	        ‰d   «      j
                  dk(  r‰D �cg c]  }|j                  «       ‘Œ c}Šn(t        ‰d   t        j                  «      st        d«      ‚t        j                  ‰fi | j                  ¤Ž}| j                  ||«      }|r*d|j                  vrt        d«      ‚| j                  |«      }|S c c}w )aù  
        This is a rerank function that receives the results from multiple
        vector searches. For example, this can be used to combine the
        results of two vector searches with different embeddings.

        Parameters
        ----------
        vector_results : List[pa.Table] or List[LanceVectorQueryBuilder]
            The results from the vector search. Either accepts the query builder
            if the results haven't been executed yet or the results in arrow format.
        query : str or None,
            The input query. Some rerankers might not need the query to rerank.
            In that case, it can be set to None explicitly. This is intended to
            be handled by the reranker implementations.
        deduplicate : bool, optional
            Whether to deduplicate the results based on the `_rowid` column,
            by default False. Requires `_rowid` to be present in the results.

        Returns
        -------
        pa.Table
            The reranked results
        c              3   óN   •K  — | ]  }t        |t        ‰d    «      «      –— Œ y­w)r   N)Ú
isinstancer,   )Ú.0Úvr#   s     €r   ú	<genexpr>z.Reranker.rerank_multivector.<locals>.<genexpr>Â   s"   øè ø€ ÒR¸a”:˜a¤ n°QÑ&7Ó!8×9ÑRùs   ƒ"%z9All elements in vector_results should be of the same typer   r
   zFvector_results should be a list of pa.Table or LanceVectorQueryBuilderÚ_rowidz”'_rowid' is required for deduplication.                     add _rowid to search results like this:                     `search().with_row_id(True)`)rB   Úlistr   r   r,   r    Úto_arrowr/   ÚTabler;   r   r'   Úcolumn_namesr<   )r   r#   r"   r?   Úresultr=   Úrerankeds    `     r   Úrerank_multivectorzReranker.rerank_multivector    s  ø€ ô< %/¨~¼tÔ$Dˆ^ÑÈ.ð 	ô
 ÓRÀ>ÔRÔRÜØKóð ô
 �˜qÑ!Ó"×+Ñ+Ð/HÒHØ>LÖM°F˜fŸo™oÕ/ÒM‰NÜ˜N¨1Ñ-¬r¯x©xÔ8ÜØXóð ô ×#Ñ# NÑO°d×6NÑ6NÑOˆà×%Ñ% e¨XÓ6ˆñ Ø˜x×4Ñ4Ñ4Ü ð2óð ð
 ×(Ñ(¨Ó2ˆHàˆùò+ Ns   ÁC8Útablec                 óö   — |j                  d«      }t        j                  |j                  d   d«      }t        j                  t        j
                  |«      d¬«      \  }}d||<   |j                  |¬«      }|S )zE
        Deduplicate the table based on the `_rowid` column.
        rF   r   FT)Úreturn_index)Úmask)ÚcolumnÚnpÚfullÚshapeÚuniquer0   Úfilter)r   rN   Úrow_idrQ   Ú_Úmask_indicesÚdeduped_tables          r   r<   zReranker._deduplicateà   si   € ð —‘˜hÓ'ˆô �w‰w˜Ÿ™ A™¨Ó/ˆÜŸ)™)¤B§H¡H¨VÓ$4À4ÔH‰ˆˆ<Ø!ˆˆ\ÑØŸ™¨$˜Ó/ˆàÐr   c           	      ó  — t        j                  |j                  |j                  g«      }d|j                  vrF|j	                  dt        j
                  dgt        |«      z  t        j                  «       ¬«      «      }d|j                  vrF|j	                  dt        j
                  dgt        |«      z  t        j                  «       ¬«      «      }|j                  «       D �ci c]  }|d   |“Œ
 }}|j                  «       D �ci c]  }|d   |“Œ
 }}|j                  «       D ]  \  }}||v r|d   ||   d<   Œ|||<   Œ t         j                  j                  t        |j                  «       «      |¬«      }	|	S c c}w c c}w )z¼
        Merge the results from the vector and FTS search and keep the scores.
        This op is slower than just keeping relevance score but can be useful
        for debugging.
        Ú	_distanceNr+   Ú_scorerF   )Úschema)r/   Úunify_schemasr_   rJ   r.   r0   r-   r1   Ú	to_pylistÚitemsrI   Úfrom_pylistrG   Úvalues)
r   r#   r3   Úcombined_schemaÚrowÚvector_results_dictÚfts_results_dictÚkeyÚvaluer=   s
             r   Ú_merge_and_keep_scoreszReranker._merge_and_keep_scoresî   s}  € ô ×*Ñ*¨N×,AÑ,AÀ;×CUÑCUÐ+VÓWˆà˜k×6Ñ6Ñ6Ø%×3Ñ3ØÜ—‘˜$˜¤# kÓ"2Ñ2¼¿¹»ÔFóˆKð
 ˜>×6Ñ6Ñ6Ø+×9Ñ9ØÜ—‘˜$˜¤# nÓ"5Ñ5¼B¿J¹J»LÔIóˆNð >L×=UÑ=UÓ=WÖX°c˜s 8™}¨cÑ1ÐXÐÐXØ:E×:OÑ:OÓ:QÖR°3˜C ™M¨3Ñ.ÐRÐÐRð +×0Ñ0Ó2ò 	1‰JˆC�ØÐ)Ñ)Ø5:¸8±_Ð# CÑ(¨Ò2à+0Ð# CÒ(ð		1ô —8‘8×'Ñ'ÜÐ$×+Ñ+Ó-Ó.°ð (ó 
ˆð ˆùò YùÚRs   Ã&E=ÄFÚcombined_resultsc                 ó¤   — | j                   dk(  r@d|j                  v r|j                  dg«      }d|j                  v r|j                  dg«      }|S )Nr   r^   r]   )r   rJ   Údrop_columns)r   rl   s     r   Ú_keep_relevance_scorezReranker._keep_relevance_score  sX   € Ø�:‰:˜Ò$ØÐ+×8Ñ8Ñ8Ø#3×#@Ñ#@À(ÀÓ#LÐ ØÐ.×;Ñ;Ñ;Ø#3×#@Ñ#@À+ÀÓ#OÐ ØÐr   )r   )F)r    Ú
__module__Ú__qualname__Ústrr   r!   r/   rI   r'   r2   r5   r   r9   r>   r   r   ÚboolrM   r<   rk   ro   r8   r   r   r   r      s>  „ ñ9 Só 9ò0'ð
àð
ð Ÿ™ó
ð2
¨R¯X©Xó 
ð
àð
ð —X‘Xó
ð2 ðàðð Ÿ™ðð —X‘Xð	ð
 
�‰òó ðð6¨B¯H©Hð À2Ç8Á8ó ð< "ñ	>à˜d 2§8¡8™n¨dÐ3LÑ.MÐMÑNð>ð �S˜$�YÑð>ð ó	>ð@ "§(¡(ó ð"°R·X±Xð "ÈBÏHÉHó "ðH °b·h±hô  r   r   )Úabcr   r   Úpackaging.versionr   Útypingr   r   r   ÚnumpyrS   Úpyarrowr/   rN   r
   Ú__version__r   r   r8   r   r   ú<module>rz      s;   ð÷
 $Ý %ß -Ñ -ã Û áÝ/á˜Ÿ™Ó'€ôF ˆsõ F r   