rankops 0.2.0

Rank fusion and reranking
Documentation
use rankops::rerank::{colbert, FdeConfig};

fn main() -> rankops::rerank::Result<()> {
    let query = vec![vec![1.0, 0.0, 0.0], vec![0.0, 1.0, 0.0]];
    let docs = vec![
        ("doc-a", vec![vec![0.9, 0.1, 0.0], vec![0.1, 0.9, 0.0]]),
        ("doc-b", vec![vec![0.8, 0.0, 0.2], vec![0.0, 0.1, 0.9]]),
        ("doc-c", vec![vec![0.0, 0.2, 0.8], vec![0.2, 0.0, 0.8]]),
    ];

    let fde = FdeConfig::new();
    let proxy = fde.rank(&query, &docs)?;

    println!("Fixed-dimensional proxy ranking:");
    for (doc, score) in &proxy {
        println!("  {doc}: {score:.3}");
    }

    let shortlist: Vec<_> = proxy
        .iter()
        .take(2)
        .map(|(doc, _score)| {
            let tokens = docs
                .iter()
                .find(|(candidate, _tokens)| candidate == doc)
                .expect("proxy result came from the input corpus")
                .1
                .clone();
            (*doc, tokens)
        })
        .collect();

    let exact = colbert::rank(&query, &shortlist);

    println!("\nExact MaxSim rerank of proxy top 2:");
    for (doc, score) in exact {
        println!("  {doc}: {score:.3}");
    }

    Ok(())
}