From fb8c6e427cc1974927cb2f30dfc86c5846faaa1c Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Sat, 13 Jun 2026 10:46:35 +0200 Subject: [PATCH] refactor: pass Unitig objects directly instead of raw byte slices Refactored `try_for_each_unitig` and related pipelines across `obidebruinj` and `obikpartitionner` to accept `Unitig` instances directly. This eliminates manual `Unitig::from_nucleotides()` conversions, simplifies the data flow, and reduces unnecessary allocation overhead. --- src/obidebruinj/src/debruijn.rs | 14 ++++++-------- src/obidebruinj/src/tests/debruijn.rs | 4 ++-- src/obikpartitionner/src/index_layer.rs | 4 ++-- src/obikpartitionner/src/merge_layer.rs | 4 ++-- src/obikpartitionner/src/rebuild_layer.rs | 4 ++-- 5 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/obidebruinj/src/debruijn.rs b/src/obidebruinj/src/debruijn.rs index ed52c4d..a435d83 100644 --- a/src/obidebruinj/src/debruijn.rs +++ b/src/obidebruinj/src/debruijn.rs @@ -1,7 +1,7 @@ //use ahash::RandomState; use hashbrown::HashMap; use obikseq::k; -use obikseq::{CanonicalKmer, Sequence}; +use obikseq::{CanonicalKmer, Sequence, Unitig}; use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; use std::cell::RefCell; use std::fmt; @@ -452,17 +452,17 @@ impl GraphDeBruijn { pub fn try_for_each_unitig(&self, f: F) -> Result<(), E> where E: Send, - F: FnMut(&[u8]) -> Result<(), E> + Send, + F: FnMut(&Unitig) -> Result<(), E> + Send, { thread_local! { static BUF: RefCell> = RefCell::new(Vec::with_capacity(4096)); } - let (tx, rx) = crossbeam_channel::bounded::>(rayon::current_num_threads() * 256); + let (tx, rx) = crossbeam_channel::bounded::(rayon::current_num_threads() * 256); std::thread::scope(|s| { let writer = s.spawn(move || -> Result<(), E> { let mut f = f; - for nucs in rx { - f(&nucs)?; + for unitig in rx { + f(&unitig)?; } Ok(()) }); @@ -471,9 +471,7 @@ impl GraphDeBruijn { let mut buf = buf.borrow_mut(); buf.clear(); buf.extend(iter); - let to_send = buf.clone(); - buf.clear(); - tx.send(to_send).ok(); + tx.send(Unitig::from_nucleotides(&buf)).ok(); }); }); drop(tx); diff --git a/src/obidebruinj/src/tests/debruijn.rs b/src/obidebruinj/src/tests/debruijn.rs index 17f4b2f..a315ce7 100644 --- a/src/obidebruinj/src/tests/debruijn.rs +++ b/src/obidebruinj/src/tests/debruijn.rs @@ -24,8 +24,8 @@ fn canonical_kmers(seq: &[u8]) -> Vec { fn collect_unitigs(g: &GraphDeBruijn) -> Vec { let mut unitigs = Vec::new(); - g.try_for_each_unitig(|nucs| -> Result<(), std::convert::Infallible> { - unitigs.push(Unitig::from_nucleotides(nucs)); + g.try_for_each_unitig(|unitig| -> Result<(), std::convert::Infallible> { + unitigs.push(unitig.clone()); Ok(()) }) .unwrap(); diff --git a/src/obikpartitionner/src/index_layer.rs b/src/obikpartitionner/src/index_layer.rs index acc8623..8eed6db 100644 --- a/src/obikpartitionner/src/index_layer.rs +++ b/src/obikpartitionner/src/index_layer.rs @@ -107,8 +107,8 @@ impl KmerPartition { fs::create_dir_all(&layer_dir)?; let mut uw = Layer::<()>::unitig_writer(&layer_dir).map_err(olm_to_sk)?; - g.try_for_each_unitig(|nucs| { - uw.write(&obikseq::unitig::Unitig::from_nucleotides(nucs)) + g.try_for_each_unitig(|unitig| { + uw.write(unitig) })?; uw.close()?; diff --git a/src/obikpartitionner/src/merge_layer.rs b/src/obikpartitionner/src/merge_layer.rs index d38042a..494cb71 100644 --- a/src/obikpartitionner/src/merge_layer.rs +++ b/src/obikpartitionner/src/merge_layer.rs @@ -307,8 +307,8 @@ impl KmerPartition { g.compute_degrees_and_mark_starts(); fs::create_dir_all(&new_layer_dir)?; let mut uw = Layer::<()>::unitig_writer(&new_layer_dir).map_err(olm_to_sk)?; - g.try_for_each_unitig(|nucs| { - uw.write(&obikseq::unitig::Unitig::from_nucleotides(nucs)) + g.try_for_each_unitig(|unitig| { + uw.write(unitig) })?; uw.close()?; let n = g.len(); diff --git a/src/obikpartitionner/src/rebuild_layer.rs b/src/obikpartitionner/src/rebuild_layer.rs index 1a4c238..ea09536 100644 --- a/src/obikpartitionner/src/rebuild_layer.rs +++ b/src/obikpartitionner/src/rebuild_layer.rs @@ -168,8 +168,8 @@ impl KmerPartition { fs::create_dir_all(&dst_layer_dir)?; let mut uw = Layer::<()>::unitig_writer(&dst_layer_dir).map_err(olm_to_sk)?; - g.try_for_each_unitig(|nucs| { - uw.write(&obikseq::unitig::Unitig::from_nucleotides(nucs)) + g.try_for_each_unitig(|unitig| { + uw.write(unitig) })?; uw.close()?; drop(g);