Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/nornir

tests/mimir_fusion.rs

//! Integration proof for the Mimir RRF hybrid-fusion (optimize cycle 1).
//!
//! Mirrors the red-when-broken unit tests in `src/knowledge/fusion.rs` against the
//! PUBLIC API, so the guard runs even in a worktree whose inline `#[cfg(test)]`
//! build is blocked by an unrelated sibling-crate churn. The properties proven:
//! consensus beats a single-list #1, and hybrid recall dominates either engine —
//! exactly the behaviour the `nornir.mimir.search.hybrid_rrf_*` bench measures
//! (recall dense 50% → hybrid 100%).

use nornir::knowledge::fusion::{DEFAULT_RRF_K, fuse_bm25_dense, recall_at_k};

fn keys(v: &[&str]) -> Vec<String> {
    v.iter().map(|s| s.to_string()).collect()
}

#[test]
fn consensus_beats_single_list_number_one() {
    let bm25 = keys(&["A", "consensus"]);
    let dense = keys(&["X", "consensus"]);
    let fused = fuse_bm25_dense(&bm25, &dense, 1.0, 1.0, DEFAULT_RRF_K, 0);
    assert_eq!(
        fused[0], "consensus",
        "decent-in-both tops single-list #1s: {fused:?}"
    );
}

#[test]
fn hybrid_recall_dominates_each_single_engine() {
    // r1 buried by dense, r3 buried by bm25 — neither top-3 covers all; RRF does.
    let relevant = keys(&["r1", "r2", "r3"]);
    let bm25 = keys(&["r1", "r2", "n1", "n2", "r3"]);
    let dense = keys(&["r3", "r2", "n3", "n4", "r1"]);
    let k = 3;
    let r_bm25 = recall_at_k(&bm25, &relevant, k);
    let r_dense = recall_at_k(&dense, &relevant, k);
    let fused = fuse_bm25_dense(&bm25, &dense, 1.0, 1.0, DEFAULT_RRF_K, 0);
    let r_fused = recall_at_k(&fused, &relevant, k);
    assert!(
        r_fused >= r_bm25 && r_fused >= r_dense && (r_fused > r_bm25 || r_fused > r_dense),
        "hybrid recall {r_fused} must dominate bm25 {r_bm25}/dense {r_dense}; fused={fused:?}"
    );
}