feat: centralize index configuration and add hybrid mode
Centralizes index configuration by storing a single `IndexMode` (`Exact`, `Approx`, or `Hybrid`) in `PartitionMeta`, eliminating per-layer metadata files. Introduces a `Hybrid` evidence mode and an `--approx` CLI flag to toggle between exact and probabilistic indexing. Refactors the build and query pipelines to dynamically dispatch based on the configured mode, deferring `.idx` generation to Pass 2 and only requiring it for Exact/Hybrid modes. Updates layer opening to load appropriate data structures, enforces strict parameter validation during merges, and clarifies performance trade-offs in documentation.
This commit is contained in:
@@ -9,7 +9,7 @@ use obisys::{Reporter, Stage};
|
||||
use rayon::prelude::*;
|
||||
use tracing::info;
|
||||
|
||||
use obilayeredmap::EvidenceKind;
|
||||
use obilayeredmap::IndexMode;
|
||||
|
||||
use crate::error::{OKIError, OKIResult};
|
||||
use crate::index::KmerIndex;
|
||||
@@ -271,14 +271,16 @@ fn partition_bar(n: u64) -> ProgressBar {
|
||||
/// - all `Exact` → OK, returns `Exact`
|
||||
/// - all `Approx { b, z }` same params → OK, returns `Approx { b, z }`
|
||||
/// - mixed exact/approx or different approx params → `IncompatibleEvidence`
|
||||
fn validate_evidence_compat(sources: &[&KmerIndex]) -> OKIResult<EvidenceKind> {
|
||||
fn validate_evidence_compat(sources: &[&KmerIndex]) -> OKIResult<IndexMode> {
|
||||
let ref_ev = &sources[0].meta.config.evidence;
|
||||
for src in &sources[1..] {
|
||||
let ev = &src.meta.config.evidence;
|
||||
let compat = match (ref_ev, ev) {
|
||||
(EvidenceKind::Exact, EvidenceKind::Exact) => true,
|
||||
(EvidenceKind::Approx { b: b1, z: z1 },
|
||||
EvidenceKind::Approx { b: b2, z: z2 }) => b1 == b2 && z1 == z2,
|
||||
(IndexMode::Exact, IndexMode::Exact) => true,
|
||||
(IndexMode::Approx { b: b1, z: z1 },
|
||||
IndexMode::Approx { b: b2, z: z2 }) => b1 == b2 && z1 == z2,
|
||||
(IndexMode::Hybrid { b: b1, z: z1 },
|
||||
IndexMode::Hybrid { b: b2, z: z2 }) => b1 == b2 && z1 == z2,
|
||||
_ => false,
|
||||
};
|
||||
if !compat {
|
||||
|
||||
Reference in New Issue
Block a user