Ë
    kQêjÖ  ã                   ó^   — d dl mZmZmZ d dlZd dlmZ ddlm	Z	 erddl
mZ  G d„ d	e	«      Zy)
é    )ÚUnionÚListÚTYPE_CHECKINGN)Údefaultdicté   )ÚRerankeré   )ÚLanceVectorQueryBuilderc                   ó°   ‡ — e Zd ZdZddefˆ fd„Zd„ Zdedej                  dej                  fd„Z
	 	 ddeeej                     ed	   f   ded
efd„Zˆ xZS )ÚRRFRerankeraÃ  
    Reranks the results using Reciprocal Rank Fusion(RRF) algorithm based
    on the scores of vector and FTS search.
    Parameters
    ----------
    K : int, default 60
        A constant used in the RRF formula (default is 60). Experiments
        indicate that k = 60 was near-optimal, but that the choice is
        not critical. See paper:
        https://plg.uwaterloo.ca/~gvcormac/cormacksigir09-rrf.pdf
    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.
    ÚKc                 óR   •— |dk  rt        d«      ‚t        ‰| �	  |«       || _        y )Nr   zK must be greater than 0)Ú
ValueErrorÚsuperÚ__init__r   )Úselfr   Úreturn_scoreÚ	__class__s      €úZ/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/lancedb/rerankers/rrf.pyr   zRRFReranker.__init__!   s*   ø€ Ø�Š6ÜÐ7Ó8Ð8Ü‰Ñ˜Ô&Øˆ�ó    c                 ó"   — d| j                   › d�S )NzRRFReranker(K=ú))r   )r   s    r   Ú__str__zRRFReranker.__str__'   s   € Ø §¡˜x qÐ)Ð)r   ÚqueryÚvector_resultsÚfts_resultsc                 ó†  — |r|d   j                  «       ng }|r|d   j                  «       ng }t        t        «      }||fD ]3  }t        |d«      D ]"  \  }}	||	xx   d|| j                  z   z  z  cc<   Œ$ Œ5 | j
                  dk(  r| j                  ||«      }
n| j                  ||«      }
|
d   j                  «       }|D �cg c]  }||   ‘Œ	 }}|
j                  dt        j                  |t        j                  «       ¬«      «      }
|
j                  dg«      }
| j
                  dk(  r| j                  |
«      }
|
S c c}w )NÚ_rowidr   ÚallÚ_relevance_score©Útype©r    Ú
descendingÚ	relevance)Ú	to_pylistr   ÚfloatÚ	enumerater   ÚscoreÚ_merge_and_keep_scoresÚmerge_resultsÚappend_columnÚpaÚarrayÚfloat32Úsort_byÚ_keep_relevance_score)r   r   r   r   Ú
vector_idsÚfts_idsÚrrf_score_mapÚidsÚiÚ	result_idÚcombined_resultsÚcombined_row_idsÚrow_idÚrelevance_scoress                 r   Úrerank_hybridzRRFReranker.rerank_hybrid*   sY  € ñ >L�^ HÑ-×7Ñ7Ô9ÐQSˆ
Ù7B�+˜hÑ'×1Ñ1Ô3ÈˆÜ#¤EÓ*ˆð  Ð(ò 	=ˆCÜ )¨#¨qÓ 1ò =‘��9Ø˜iÓ(¨A°°T·V±V±Ñ,<Ñ<Ô(ñ=ð	=ð �:‰:˜ÒØ#×:Ñ:¸>È;ÓWÑà#×1Ñ1°.À+ÓNÐØ+¨HÑ5×?Ñ?ÓAÐØ@PÖQ°f˜M¨&Ó1ÐQÐÐQØ+×9Ñ9Ø¤§¡Ð)9ÄÇ
Á
ÃÔ Mó
Ðð ,×3Ñ3Ø/Ð0ó
Ðð �:‰:˜Ò$Ø#×9Ñ9Ð:JÓKÐàÐùò Rs   ÃD>r
   Údeduplicatec                 ó   ‡— ‰st        d«      ‚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        d„ ‰D «       «      st        d«      ‚t        t        «      }‰D ]D  }t        |d	   j                  «       d
«      D ]"  \  }}||xx   d
|| j                  z   z  z  cc<   Œ$ ŒF t        j                  ‰fi | j                  ¤Ž}| j                  |«      }|d	   j                  «       D �	cg c]  }	||	   ‘Œ	 }
}	|j!                  dt        j"                  |
t        j$                  «       ¬«      «      }|j'                  dg«      }| j(                  dk(  r| j+                  |«      }|S c c}w c c}	w )a  
        Overridden method to rerank the results from multiple vector searches.
        This leverages the RRF hybrid reranking algorithm to combine the
        results from multiple vector searches as it doesn't support reranking
        vector results individually.
        z vector_results must not be emptyc              3   óN   •K  — | ]  }t        |t        ‰d    «      «      –— Œ y­w)r   N)Ú
isinstancer"   )Ú.0Úvr   s     €r   ú	<genexpr>z1RRFReranker.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 LanceVectorQueryBuilderc              3   ó8   K  — | ]  }d |j                   v –— Œ y­w)r   N)Úcolumn_names)rA   Úresults     r   rC   z1RRFReranker.rerank_multivector.<locals>.<genexpr>k   s   è ø€ ÒP°v�8˜v×2Ñ2Ô2ÑPùs   ‚z”'_rowid' is required for deduplication.                     add _rowid to search results like this:                     `search().with_row_id(True)`r   r   r    r!   r#   r%   )r   r   r"   Ú__name__Úto_arrowr@   r-   ÚTabler   r'   r(   r&   r   Úconcat_tablesÚ_concat_tables_argsÚ_deduplicater,   r.   r/   r0   r)   r1   )r   r   r   r=   rF   r4   r6   r7   Úcombinedr:   r;   s    `         r   Úrerank_multivectorzRRFReranker.rerank_multivectorM   sÒ  ø€ ñ ÜÐ?Ó@Ð@ô ÓRÀ>ÔRÔRÜØKóð ô
 �˜qÑ!Ó"×+Ñ+Ð/HÒHØ>LÖM°F˜fŸo™oÕ/ÒM‰NÜ˜N¨1Ñ-¬r¯x©xÔ8ÜØXóð ô
 ÑPÀÔPÔPÜð2óð ô $¤EÓ*ˆØ$ò 	=ˆFÜ )¨&°Ñ*:×*DÑ*DÓ*FÈÓ Jò =‘��9Ø˜iÓ(¨A°°T·V±V±Ñ,<Ñ<Ô(ñ=ð	=ô ×#Ñ# NÑO°d×6NÑ6NÑOˆØ×$Ñ$ XÓ.ˆà08¸Ñ0B×0LÑ0LÓ0Nö
Ø&,ˆM˜&Ó!ð
Ðð 
ð ×)Ñ)Ø¤§¡Ð)9ÄÇ
Á
ÃÔ Mó
ˆð ×#Ñ#Ð%GÐ$HÓIˆà�:‰:˜Ò$Ø×1Ñ1°(Ó;ˆHàˆùòE Nùò.
s   ÁGÅG)é<   r%   )NT)rG   Ú
__module__Ú__qualname__Ú__doc__Úintr   r   Ústrr-   rI   r<   r   r   ÚboolrN   Ú__classcell__)r   s   @r   r   r      s„   ø„ ññ"˜#õ ò*ð! àð! ð Ÿ™ð! ð —X‘Xó	! ðL Ø ñ	9à˜d 2§8¡8™n¨dÐ3LÑ.MÐMÑNð9ð ð9ð ÷	9r   r   )Útypingr   r   r   Úpyarrowr-   Úcollectionsr   Úbaser   Útabler
   r   © r   r   ú<module>r]      s*   ð÷
 .Ñ -Û å #Ý áÝ/ôw�(õ wr   