Ë
    kQêjÍ  ã                   óf   — d dl mZmZmZ d dl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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 )ÚMRRRerankeraÝ  
    Reranks the results using Mean Reciprocal Rank (MRR) algorithm based
    on the scores of vector and FTS search.
    Algorithm reference - https://en.wikipedia.org/wiki/Mean_reciprocal_rank

    MRR calculates the average of reciprocal ranks across different search results.
    For each document, it computes the reciprocal of its rank in each system,
    then takes the mean of these reciprocal ranks as the final score.

    Parameters
    ----------
    weight_vector : float, default 0.5
        Weight for vector search results (0.0 to 1.0)
    weight_fts : float, default 0.5
        Weight for FTS search results (0.0 to 1.0)
        Note: weight_vector + weight_fts should equal 1.0
    return_score : str, default "relevance"
        Options 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.
    Úweight_vectorÚ
weight_ftsc                 ó  •— d|cxk  rdk  st        d«      ‚ t        d«      ‚d|cxk  rdk  st        d«      ‚ t        d«      ‚t        ||z   dz
  «      dkD  rt        d«      ‚t        ‰| �  |«       || _        || _        y )Nç        ç      ð?z)weight_vector must be between 0.0 and 1.0z&weight_fts must be between 0.0 and 1.0g�íµ ÷Æ°>z)weight_vector + weight_fts must equal 1.0)Ú
ValueErrorÚabsÚsuperÚ__init__r   r   )Úselfr   r   Úreturn_scoreÚ	__class__s       €úZ/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/lancedb/rerankers/mrr.pyr   zMRRReranker.__init__(   s˜   ø€ ð �}Ô+¨Ò+ÜÐHÓIÐIð ,ÜÐHÓIÐIØ�zÔ( SÒ(ÜÐEÓFÐFð )ÜÐEÓFÐFÜˆ}˜zÑ)¨CÑ/Ó0°4Ò7ÜÐHÓIÐIä‰Ñ˜Ô&Ø*ˆÔØ$ˆ�ó    c                 ó<   — d| j                   › d| j                  › d�S )NzMRRReranker(weight_vector=z, weight_fts=ú))r   r   )r   s    r   Ú__str__zMRRReranker.__str__9   s+   € à(¨×);Ñ);Ð(<ð =ØŸ/™/Ð*¨!ð-ð	
r   ÚqueryÚvector_resultsÚfts_resultsc                 óŽ  — |r|d   j                  «       ng }|r|d   j                  «       ng }t        t        «      }|r/t        |d«      D ]   \  }}d|z  }	||   j	                  d|	f«       Œ" |r/t        |d«      D ]   \  }}d|z  }	||   j	                  d|	f«       Œ" i }
|j                  «       D ]G  \  }}d}d}|D ]  \  }}	|dk(  r|	}Œ|dk(  sŒ|	}Œ | j                  |z  | j                  |z  z   }||
|<   ŒI | 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   r   ÚvectorÚftsr   ÚallÚ_relevance_score©Útype©r&   Ú
descendingÚ	relevance)Ú	to_pylistr   ÚlistÚ	enumerateÚappendÚitemsr   r   Ú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Úmrr_score_mapÚrankÚ	result_idÚreciprocal_rankÚfinal_mrr_scoresÚscoresÚ	vector_rrÚfts_rrÚ
score_typeÚweighted_mrrÚcombined_resultsÚcombined_row_idsÚrow_idÚrelevance_scoress                       r   Úrerank_hybridzMRRReranker.rerank_hybrid?   s  € ñ >L�^ HÑ-×7Ñ7Ô9ÐQSˆ
Ù7B�+˜hÑ'×1Ñ1Ô3Èˆô $¤DÓ)ˆáÜ#,¨Z¸Ó#;ò M‘��iØ"%¨¡*�Ø˜iÑ(×/Ñ/°¸?Ð0KÕLðMñ Ü#,¨W°aÓ#8ò J‘��iØ"%¨¡*�Ø˜iÑ(×/Ñ/°¸Ð0HÕIðJð ÐØ!.×!4Ñ!4Ó!6ò 	7ÑˆI�vØˆIØˆFà/5ò -Ñ+�
˜OØ Ò)Ø /‘IØ 5Ó(Ø,‘Fð	-ð  ×-Ñ-°	Ñ9¸D¿O¹OÈfÑ<TÑTˆLØ*6Ð˜YÒ'ð	7ð  �:‰:˜ÒØ#×:Ñ:¸>È;ÓWÑà#×1Ñ1°.À+ÓNÐØ+¨HÑ5×?Ñ?ÓAÐØCSÖT¸Ð,¨VÓ4ÐTÐÐTØ+×9Ñ9Ø¤§¡Ð)9ÄÇ
Á
ÃÔ Mó
Ðð ,×3Ñ3Ø/Ð0ó
Ðð �:‰:˜Ò$Ø#×9Ñ9Ð:JÓKÐàÐùò Us   ÅGr
   Údeduplicatec                 ó6  ‡— ‰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 ]B  }|d	   j                  «       }t        |d
«      D ]  \  }}	d|z  }
||	   j                  |
«       Œ  ŒD t        ‰«      }i }|j                  «       D ]+  \  }	}t        t!        j"                  |«      «      |z  }|||	<   Œ- t        j$                  ‰fi | j&                  ¤Ž}| j)                  |«      }|d	   j                  «       }|D �cg c]  }||   ‘Œ	 }}|j+                  dt        j,                  |t        j.                  «       ¬«      «      }|j1                  dg«      }| j2                  dk(  r| j5                  |«      }|S c c}w c c}w )aw  
        Reranks the results from multiple vector searches using MRR algorithm.
        Each vector search result is treated as a separate ranking system,
        and MRR calculates the mean of reciprocal ranks across all systems.
        This cannot reuse rerank_hybrid because MRR semantics require treating
        each vector result as a separate ranking system.
        z vector_results must not be emptyc              3   óN   •K  — | ]  }t        |t        ‰d    «      «      –— Œ y­w)r   N)Ú
isinstancer(   )Ú.0Úvr   s     €r   ú	<genexpr>z1MRRReranker.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)rO   Úresults     r   rQ   z1MRRReranker.rerank_multivector.<locals>.<genexpr>•   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%   r(   Ú__name__Úto_arrowrN   r5   ÚTabler   r-   r,   r.   r/   Úlenr0   ÚfloatÚnpÚsumÚconcat_tablesÚ_concat_tables_argsÚ_deduplicater4   r6   r7   r8   r1   r9   )r   r   r   rK   rT   r<   Úresult_tableÚ
result_idsr=   r>   r?   Únum_systemsr@   Úreciprocal_ranksÚmean_rrÚcombinedrG   rH   rI   s    `                 r   Úrerank_multivectorzMRRReranker.rerank_multivectorx   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óð ô $¤DÓ)ˆà*ò 	AˆLØ% hÑ/×9Ñ9Ó;ˆJÜ#,¨Z¸Ó#;ò A‘��iØ"%¨¡*�Ø˜iÑ(×/Ñ/°Õ@ñAð	Aô ˜.Ó)ˆØÐØ+8×+>Ñ+>Ó+@ò 	2Ñ'ˆIÐ'ÜœBŸF™FÐ#3Ó4Ó5¸ÑCˆGØ*1Ð˜YÒ'ð	2ô ×#Ñ# NÑO°d×6NÑ6NÑOˆØ×$Ñ$ XÓ.ˆà# HÑ-×7Ñ7Ó9ÐàCSÖT¸Ð,¨VÓ4ÐTÐÐTØ×)Ñ)Ø¤§¡Ð)9ÄÇ
Á
ÃÔ Mó
ˆð ×#Ñ#Ð%GÐ$HÓIˆà�:‰:˜Ò$Ø×1Ñ1°(Ó;ˆHàˆùò_ NùòL Us   ÁHÆH)ç      à?rf   r+   )NT)rU   Ú
__module__Ú__qualname__Ú__doc__rY   r   r   Ústrr5   rW   rJ   r   r   Úboolre   Ú__classcell__)r   s   @r   r   r      sž   ø„ ñð2  #ØØ ñ	%àð%ð õ%ò"
ð7 àð7 ð Ÿ™ð7 ð —X‘Xó	7 ðx Ø ñ	Fà˜d 2§8¡8™n¨dÐ3LÑ.MÐMÑNðFð ðFð ÷	Fr   r   )Útypingr   r   r   Úpyarrowr5   ÚnumpyrZ   Úcollectionsr   Úbaser   Útabler
   r   © r   r   ú<module>rt      s-   ð÷
 .Ñ -Û Û å #Ý áÝ/ôn�(õ nr   