style: apply consistent formatting and whitespace normalization

Applies consistent formatting, whitespace normalization, and indentation standardization to `debruijn.rs` and `merge.rs`. Reorganizes imports and downgrades a unitig traversal log from `info!` to `debug!`. No functional logic or runtime behavior is altered.
This commit is contained in:
Eric Coissac
2026-06-13 11:41:14 +02:00
parent bc14346f5f
commit fddf630772
2 changed files with 209 additions and 68 deletions
+80 -21
View File
@@ -1,15 +1,15 @@
//use ahash::RandomState;
use crossbeam_channel;
use hashbrown::HashMap;
use obikseq::k;
use obikseq::{CanonicalKmer, Sequence, Unitig};
use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
use std::cell::RefCell;
use std::fmt;
use crossbeam_channel;
use std::sync::atomic::{AtomicU8, Ordering};
use xxhash_rust::xxh3::Xxh3Builder;
use std::time::Instant;
use tracing::{debug, info};
use xxhash_rust::xxh3::Xxh3Builder;
// ── Types ─────────────────────────────────────────────────────────────────────
@@ -99,7 +99,6 @@ impl Node {
(self.0 >> 5) & 0b11
}
/// Marks the node as visited.
#[inline]
pub fn set_visited(&mut self) {
@@ -180,8 +179,12 @@ impl WalkState {
}
pub fn reachable(&self, graph: &GraphDeBruijn) -> bool {
WalkState { kmer: self.kmer, node: self.node, direct: !self.direct }
.leavable(graph)
WalkState {
kmer: self.kmer,
node: self.node,
direct: !self.direct,
}
.leavable(graph)
}
pub fn walk(&self, graph: &GraphDeBruijn) -> Option<(WalkState, u8)> {
@@ -197,8 +200,19 @@ impl WalkState {
if next_node.is_visited() {
return None;
}
let reachable = if dnext { next_node.can_extend_left() } else { next_node.can_extend_right() };
reachable.then_some((WalkState { kmer: cnext, node: next_node, direct: dnext }, nuc))
let reachable = if dnext {
next_node.can_extend_left()
} else {
next_node.can_extend_right()
};
reachable.then_some((
WalkState {
kmer: cnext,
node: next_node,
direct: dnext,
},
nuc,
))
} else {
if !self.node.can_extend_left() {
return None;
@@ -211,8 +225,19 @@ impl WalkState {
if next_node.is_visited() {
return None;
}
let reachable = if dnext { next_node.can_extend_right() } else { next_node.can_extend_left() };
reachable.then_some((WalkState { kmer: cnext, node: next_node, direct: dnext }, 3 - nuc))
let reachable = if dnext {
next_node.can_extend_right()
} else {
next_node.can_extend_left()
};
reachable.then_some((
WalkState {
kmer: cnext,
node: next_node,
direct: dnext,
},
3 - nuc,
))
}
}
}
@@ -275,7 +300,11 @@ impl GraphDeBruijn {
node.set_left(lc, ln);
atomic.store(node.0, Ordering::Relaxed);
});
debug!("[compute_degrees] pass 1 (degrees): {:?} — {} nodes", t1.elapsed(), self.nodes.len());
debug!(
"[compute_degrees] pass 1 (degrees): {:?} — {} nodes",
t1.elapsed(),
self.nodes.len()
);
// Pass 2: mark start nodes
@@ -290,7 +319,11 @@ impl GraphDeBruijn {
atomic.store(node.0, Ordering::Relaxed);
}
});
debug!("[compute_degrees] pass 2 (starts): {:?} — {} nodes", t2.elapsed(), self.nodes.len());
debug!(
"[compute_degrees] pass 2 (starts): {:?} — {} nodes",
t2.elapsed(),
self.nodes.len()
);
}
pub fn is_visited(&self, kmer: &CanonicalKmer) -> Option<bool> {
@@ -328,14 +361,28 @@ impl GraphDeBruijn {
}
fn unitig_nucleotides(&self, kmer: CanonicalKmer, k: usize) -> Option<UnitigNucIter<'_>> {
let old = self.nodes.get(&kmer)?.fetch_or(IS_VISITED_MASK, Ordering::AcqRel);
if old & IS_VISITED_MASK != 0 { return None; }
let old = self
.nodes
.get(&kmer)?
.fetch_or(IS_VISITED_MASK, Ordering::AcqRel);
if old & IS_VISITED_MASK != 0 {
return None;
}
let start = WalkState::new(kmer, Node(old), true);
let next_step = start.walk(self).and_then(|(next_state, nuc)| {
let ext_old = self.nodes.get(&next_state.kmer)?.fetch_or(IS_VISITED_MASK, Ordering::AcqRel);
let ext_old = self
.nodes
.get(&next_state.kmer)?
.fetch_or(IS_VISITED_MASK, Ordering::AcqRel);
(ext_old & IS_VISITED_MASK == 0).then_some((next_state, nuc))
});
Some(UnitigNucIter { graph: self, start: kmer, pos: 0, k, next_step })
Some(UnitigNucIter {
graph: self,
start: kmer,
pos: 0,
k,
next_step,
})
}
pub fn for_each_unitig(&self, f: impl Fn(UnitigNucIter<'_>) + Sync) {
@@ -352,7 +399,9 @@ impl GraphDeBruijn {
self.nodes
.par_iter()
.filter_map(|(&kmer, atomic)| {
Node(atomic.load(Ordering::Acquire)).is_start().then_some(kmer)
Node(atomic.load(Ordering::Acquire))
.is_start()
.then_some(kmer)
})
.for_each(|kmer| {
if let Some(iter) = self.unitig_nucleotides(kmer, k) {
@@ -403,10 +452,10 @@ impl GraphDeBruijn {
}
}
info!(
debug!(
chains = n_chains.load(Ordering::Relaxed),
phase2 = n2.load(Ordering::Relaxed),
total = n_chains.load(Ordering::Relaxed) + n2.load(Ordering::Relaxed),
total = n_chains.load(Ordering::Relaxed) + n2.load(Ordering::Relaxed),
"unitig traversal complete"
);
}
@@ -508,7 +557,11 @@ impl Iterator for UnitigNucIter<'_> {
Some(nuc)
} else if let Some((state, nuc)) = self.next_step.take() {
self.next_step = state.walk(self.graph).and_then(|(next_state, next_nuc)| {
let old = self.graph.nodes.get(&next_state.kmer)?.fetch_or(IS_VISITED_MASK, Ordering::AcqRel);
let old = self
.graph
.nodes
.get(&next_state.kmer)?
.fetch_or(IS_VISITED_MASK, Ordering::AcqRel);
(old & IS_VISITED_MASK == 0).then_some((next_state, next_nuc))
});
Some(nuc)
@@ -539,10 +592,16 @@ fn count_neighbors(
}
nuc = i as u8;
count += 1;
if count >= 2 { return (2, None); }
if count >= 2 {
return (2, None);
}
}
}
if count == 1 { (1, Some(nuc)) } else { (0, None) }
if count == 1 {
(1, Some(nuc))
} else {
(0, None)
}
}
// ── tests ─────────────────────────────────────────────────────────────────────