Rename Layer to KmerLayer across obikindex and obikphylo
This commit renames the `Layer` type to `KmerLayer` throughout the `obikindex` and `obikphylo` crates. All imports, struct fields, function signatures, pattern matches, and instantiation calls have been updated accordingly. The change is a purely structural refactor that tightens type constraints without altering runtime behavior or data models.
This commit is contained in:
@@ -39,7 +39,7 @@ use crate::layer::typed_layer::{COUNTS_DIR, LayerContent, PRESENCE_DIR, TypedLay
|
||||
/// (`Count`/`Presence`) exist so far; states in between (unitigs written,
|
||||
/// MPHF built, evidence built, matrix not yet built) are not represented
|
||||
/// yet.
|
||||
pub enum Layer {
|
||||
pub enum KmerLayer {
|
||||
/// Just a directory — nothing built yet. Every method below other than
|
||||
/// the path accessors panics on this variant: calling them means the
|
||||
/// caller assumed a layer was ready when it wasn't, an implementation
|
||||
@@ -51,13 +51,13 @@ pub enum Layer {
|
||||
Presence(TypedLayer<PersistentBitMatrix>),
|
||||
}
|
||||
|
||||
impl Layer {
|
||||
impl KmerLayer {
|
||||
/// An empty shell at `dir` — creates the directory (if it doesn't
|
||||
/// already exist) but nothing inside it. The starting state for
|
||||
/// building a new layer.
|
||||
pub fn create(dir: &Path) -> std::io::Result<Self> {
|
||||
std::fs::create_dir_all(dir)?;
|
||||
Ok(Layer::Empty {
|
||||
Ok(KmerLayer::Empty {
|
||||
dir: dir.to_owned(),
|
||||
})
|
||||
}
|
||||
@@ -73,9 +73,9 @@ impl Layer {
|
||||
pub fn open(layer_dir: &Path, mode: &IndexMode, with_counts: bool) -> OLMResult<Self> {
|
||||
if with_counts && layer_dir.join(COUNTS_DIR).exists() {
|
||||
return TypedLayer::<PersistentCompactIntMatrix>::open(layer_dir, mode)
|
||||
.map(Layer::Count);
|
||||
.map(KmerLayer::Count);
|
||||
}
|
||||
TypedLayer::<PersistentBitMatrix>::open(layer_dir, mode).map(Layer::Presence)
|
||||
TypedLayer::<PersistentBitMatrix>::open(layer_dir, mode).map(KmerLayer::Presence)
|
||||
}
|
||||
|
||||
// ── Paths — only meaningful before anything is built ───────────────
|
||||
@@ -93,7 +93,7 @@ impl Layer {
|
||||
/// again here would mean it lost track of its own state.
|
||||
pub fn dir(&self) -> &Path {
|
||||
match self {
|
||||
Layer::Empty { dir } => dir,
|
||||
KmerLayer::Empty { dir } => dir,
|
||||
_ => panic!("Layer::dir() only available on Empty — caller already has this path"),
|
||||
}
|
||||
}
|
||||
@@ -121,33 +121,33 @@ impl Layer {
|
||||
|
||||
pub fn content(&self) -> LayerContent {
|
||||
match self {
|
||||
Layer::Count(_) => LayerContent::Count,
|
||||
Layer::Presence(_) => LayerContent::Presence,
|
||||
Layer::Empty { .. } => panic!("Layer::content() called on an Empty layer"),
|
||||
KmerLayer::Count(_) => LayerContent::Count,
|
||||
KmerLayer::Presence(_) => LayerContent::Presence,
|
||||
KmerLayer::Empty { .. } => panic!("Layer::content() called on an Empty layer"),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn evidence_kind(&self) -> EvidenceKind {
|
||||
match self {
|
||||
Layer::Count(l) => l.evidence_kind(),
|
||||
Layer::Presence(l) => l.evidence_kind(),
|
||||
Layer::Empty { .. } => panic!("Layer::evidence_kind() called on an Empty layer"),
|
||||
KmerLayer::Count(l) => l.evidence_kind(),
|
||||
KmerLayer::Presence(l) => l.evidence_kind(),
|
||||
KmerLayer::Empty { .. } => panic!("Layer::evidence_kind() called on an Empty layer"),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn n(&self) -> usize {
|
||||
match self {
|
||||
Layer::Count(l) => l.n(),
|
||||
Layer::Presence(l) => l.n(),
|
||||
Layer::Empty { .. } => panic!("Layer::n() called on an Empty layer"),
|
||||
KmerLayer::Count(l) => l.n(),
|
||||
KmerLayer::Presence(l) => l.n(),
|
||||
KmerLayer::Empty { .. } => panic!("Layer::n() called on an Empty layer"),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn find_slot(&self, kmer: CanonicalKmer) -> Option<usize> {
|
||||
match self {
|
||||
Layer::Count(l) => l.find_slot(kmer),
|
||||
Layer::Presence(l) => l.find_slot(kmer),
|
||||
Layer::Empty { .. } => panic!("Layer::find_slot() called on an Empty layer"),
|
||||
KmerLayer::Count(l) => l.find_slot(kmer),
|
||||
KmerLayer::Presence(l) => l.find_slot(kmer),
|
||||
KmerLayer::Empty { .. } => panic!("Layer::find_slot() called on an Empty layer"),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -156,17 +156,17 @@ impl Layer {
|
||||
/// the evidence check `find_slot`/`find` would perform is redundant.
|
||||
pub fn hash_batch(&self, kmers: &[CanonicalKmer]) -> Vec<usize> {
|
||||
match self {
|
||||
Layer::Count(l) => l.hash_batch(kmers),
|
||||
Layer::Presence(l) => l.hash_batch(kmers),
|
||||
Layer::Empty { .. } => panic!("Layer::hash_batch() called on an Empty layer"),
|
||||
KmerLayer::Count(l) => l.hash_batch(kmers),
|
||||
KmerLayer::Presence(l) => l.hash_batch(kmers),
|
||||
KmerLayer::Empty { .. } => panic!("Layer::hash_batch() called on an Empty layer"),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn n_cols(&self) -> usize {
|
||||
match self {
|
||||
Layer::Count(l) => l.n_cols(),
|
||||
Layer::Presence(l) => l.n_cols(),
|
||||
Layer::Empty { .. } => panic!("Layer::n_cols() called on an Empty layer"),
|
||||
KmerLayer::Count(l) => l.n_cols(),
|
||||
KmerLayer::Presence(l) => l.n_cols(),
|
||||
KmerLayer::Empty { .. } => panic!("Layer::n_cols() called on an Empty layer"),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -178,8 +178,8 @@ impl Layer {
|
||||
/// presence (`!= 0`) in place.
|
||||
pub fn fill_sub_matrix_carries(&self, slots: &[usize], out: &mut [Vec<bool>]) {
|
||||
match self {
|
||||
Layer::Presence(l) => l.fill_sub_matrix(slots, out),
|
||||
Layer::Count(l) => {
|
||||
KmerLayer::Presence(l) => l.fill_sub_matrix(slots, out),
|
||||
KmerLayer::Count(l) => {
|
||||
let mut counts: Vec<Vec<u32>> = out.iter().map(|_| Vec::new()).collect();
|
||||
l.fill_sub_matrix(slots, &mut counts);
|
||||
for (o, c) in out.iter_mut().zip(counts.iter()) {
|
||||
@@ -187,7 +187,7 @@ impl Layer {
|
||||
o.extend(c.iter().map(|&v| v != 0));
|
||||
}
|
||||
}
|
||||
Layer::Empty { .. } => {
|
||||
KmerLayer::Empty { .. } => {
|
||||
panic!("Layer::fill_sub_matrix_carries() called on an Empty layer")
|
||||
}
|
||||
}
|
||||
@@ -196,18 +196,18 @@ impl Layer {
|
||||
/// Raw MPHF lookup: kmer → slot, no membership check.
|
||||
pub fn hash(&self, kmer: CanonicalKmer) -> usize {
|
||||
match self {
|
||||
Layer::Count(l) => l.hash(kmer),
|
||||
Layer::Presence(l) => l.hash(kmer),
|
||||
Layer::Empty { .. } => panic!("Layer::hash() called on an Empty layer"),
|
||||
KmerLayer::Count(l) => l.hash(kmer),
|
||||
KmerLayer::Presence(l) => l.hash(kmer),
|
||||
KmerLayer::Empty { .. } => panic!("Layer::hash() called on an Empty layer"),
|
||||
}
|
||||
}
|
||||
|
||||
/// Iterate over all canonical kmers in the layer, in deterministic order.
|
||||
pub fn iter_kmers(&self) -> crate::layer::mphf_layer::KmerIter {
|
||||
match self {
|
||||
Layer::Count(l) => l.iter_kmers(),
|
||||
Layer::Presence(l) => l.iter_kmers(),
|
||||
Layer::Empty { .. } => panic!("Layer::iter_kmers() called on an Empty layer"),
|
||||
KmerLayer::Count(l) => l.iter_kmers(),
|
||||
KmerLayer::Presence(l) => l.iter_kmers(),
|
||||
KmerLayer::Empty { .. } => panic!("Layer::iter_kmers() called on an Empty layer"),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -215,18 +215,18 @@ impl Layer {
|
||||
/// sequence index in `unitigs.bin`.
|
||||
pub fn enumerate_kmers(&self) -> std::iter::Enumerate<crate::layer::mphf_layer::KmerIter> {
|
||||
match self {
|
||||
Layer::Count(l) => l.enumerate_kmers(),
|
||||
Layer::Presence(l) => l.enumerate_kmers(),
|
||||
Layer::Empty { .. } => panic!("Layer::enumerate_kmers() called on an Empty layer"),
|
||||
KmerLayer::Count(l) => l.enumerate_kmers(),
|
||||
KmerLayer::Presence(l) => l.enumerate_kmers(),
|
||||
KmerLayer::Empty { .. } => panic!("Layer::enumerate_kmers() called on an Empty layer"),
|
||||
}
|
||||
}
|
||||
|
||||
/// Iterate over the layer's canonical kmers in batches of `n`.
|
||||
pub fn iter_kmers_batch(&self, n: usize) -> crate::layer::mphf_layer::KmerBatchIter {
|
||||
match self {
|
||||
Layer::Count(l) => l.iter_kmers_batch(n),
|
||||
Layer::Presence(l) => l.iter_kmers_batch(n),
|
||||
Layer::Empty { .. } => panic!("Layer::iter_kmers_batch() called on an Empty layer"),
|
||||
KmerLayer::Count(l) => l.iter_kmers_batch(n),
|
||||
KmerLayer::Presence(l) => l.iter_kmers_batch(n),
|
||||
KmerLayer::Empty { .. } => panic!("Layer::iter_kmers_batch() called on an Empty layer"),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -237,9 +237,9 @@ impl Layer {
|
||||
n: usize,
|
||||
) -> Box<dyn Iterator<Item = (usize, Vec<CanonicalKmer>)> + Send + 'static> {
|
||||
match self {
|
||||
Layer::Count(l) => Box::new(l.enumerate_kmers_batch(n)),
|
||||
Layer::Presence(l) => Box::new(l.enumerate_kmers_batch(n)),
|
||||
Layer::Empty { .. } => {
|
||||
KmerLayer::Count(l) => Box::new(l.enumerate_kmers_batch(n)),
|
||||
KmerLayer::Presence(l) => Box::new(l.enumerate_kmers_batch(n)),
|
||||
KmerLayer::Empty { .. } => {
|
||||
panic!("Layer::enumerate_kmers_batch() called on an Empty layer")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,19 +2,19 @@ pub mod content_layer;
|
||||
pub mod error;
|
||||
pub mod evidence;
|
||||
pub mod fingerprint;
|
||||
pub mod typed_layer;
|
||||
pub mod layered_store;
|
||||
pub mod map;
|
||||
pub mod meta;
|
||||
pub(crate) mod mphf_layer;
|
||||
pub mod typed_layer;
|
||||
|
||||
pub use content_layer::Layer;
|
||||
pub use content_layer::KmerLayer;
|
||||
pub use error::{OLMError, OLMResult};
|
||||
pub use typed_layer::{
|
||||
dereplicated_superkmers_path, layer_dir, open_data, raw_superkmers_path, HasLayerContent,
|
||||
HasStorageKind, Hit, LayerContent, LayerData, TypedLayer,
|
||||
};
|
||||
pub use layered_store::LayeredStore;
|
||||
pub use map::LayeredMap;
|
||||
pub use meta::{IndexMode, PartitionMeta};
|
||||
pub use mphf_layer::{EvidenceKind, KmerBatchIter, KmerIter, MphfLayer, MphfOnly};
|
||||
pub use typed_layer::{
|
||||
HasLayerContent, HasStorageKind, Hit, LayerContent, LayerData, TypedLayer,
|
||||
dereplicated_superkmers_path, layer_dir, open_data, raw_superkmers_path,
|
||||
};
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
use crate::layer::{IndexMode, KmerLayer, OLMResult, layer_dir};
|
||||
use obikseq::CanonicalKmer;
|
||||
use crate::layer::{layer_dir, IndexMode, Layer, OLMResult};
|
||||
|
||||
/// Partition subdirectory name, under an index's root — the single source
|
||||
/// of truth for the on-disk `partitions/part_NNNNN` naming convention.
|
||||
@@ -47,7 +47,7 @@ pub fn index_dir(root: &Path, i: usize) -> PathBuf {
|
||||
|
||||
/// One partition's open layers, in layer order (layer 0 first).
|
||||
pub struct KmerPartition {
|
||||
layers: Vec<Layer>,
|
||||
layers: Vec<KmerLayer>,
|
||||
}
|
||||
|
||||
impl KmerPartition {
|
||||
@@ -55,9 +55,14 @@ impl KmerPartition {
|
||||
/// `index_dir/layer_1`, ... up to `n_layers`), eagerly — not lazily on
|
||||
/// first access, so the caller pays the mmap cost once, up front,
|
||||
/// rather than at an unpredictable point during later lookups.
|
||||
pub fn open(index_dir: &Path, mode: &IndexMode, n_layers: usize, with_counts: bool) -> OLMResult<Self> {
|
||||
pub fn open(
|
||||
index_dir: &Path,
|
||||
mode: &IndexMode,
|
||||
n_layers: usize,
|
||||
with_counts: bool,
|
||||
) -> OLMResult<Self> {
|
||||
let layers = (0..n_layers)
|
||||
.map(|l| Layer::open(&layer_dir(index_dir, l), mode, with_counts))
|
||||
.map(|l| KmerLayer::open(&layer_dir(index_dir, l), mode, with_counts))
|
||||
.collect::<OLMResult<Vec<_>>>()?;
|
||||
Ok(Self { layers })
|
||||
}
|
||||
@@ -66,11 +71,11 @@ impl KmerPartition {
|
||||
self.layers.len()
|
||||
}
|
||||
|
||||
pub fn layer(&self, i: usize) -> &Layer {
|
||||
pub fn layer(&self, i: usize) -> &KmerLayer {
|
||||
&self.layers[i]
|
||||
}
|
||||
|
||||
pub fn layers(&self) -> &[Layer] {
|
||||
pub fn layers(&self) -> &[KmerLayer] {
|
||||
&self.layers
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user