pub struct CycleBasisResult {
pub cycles: Vec<Vec<i64>>,
pub scc_decomposition: SccResult,
pub cycles_skipped: usize,
pub bounds_applied: CycleBasisBounds,
}Expand description
Result of minimal cycle basis computation.
Contains a set of cycles that form a basis for all cycles in the graph. Every cycle in the graph can be expressed as a combination of basis cycles.
§Example
use sqlitegraph::{algo::cycle_basis, SqliteGraph};
let graph = SqliteGraph::open_in_memory()?;
// ... add nodes and edges ...
let result = cycle_basis(&graph)?;
println!("Found {} basis cycles", result.cycles.len());
println!("Nodes in cycles: {:?}", result.cyclic_nodes());
for node in result.cyclic_nodes() {
if result.is_cyclic(node) {
println!("Node {} is in a cycle: {}", node, result.explain_cycle(node));
}
}Fields§
§cycles: Vec<Vec<i64>>The cycle basis: list of cycles.
Each cycle is a vector of node IDs forming a closed loop. Cycles are canonicalized (minimum node ID is first) for consistent comparison and deduplication.
scc_decomposition: SccResultSCC decomposition used for cycle extraction.
Useful for understanding which cycles belong to which SCC. Non-trivial SCCs (len() > 1) contain cycles.
cycles_skipped: usizeNumber of cycles skipped due to bounds.
Incremented when:
- max_cycles limit is reached
- max_cycle_length filters a cycle
- max_per_scc limit is reached for an SCC
bounds_applied: CycleBasisBoundsBounds applied during computation.
Records what limits were used, useful for understanding if the result is complete or partial.
Implementations§
Source§impl CycleBasisResult
impl CycleBasisResult
Sourcepub fn cyclic_nodes(&self) -> AHashSet<i64>
pub fn cyclic_nodes(&self) -> AHashSet<i64>
Returns all nodes involved in any cycle.
This is the union of all nodes in all basis cycles. Useful for identifying “problematic” nodes that need cycle resolution.
§Example
let cyclic = result.cyclic_nodes();
// cyclic contains: {1, 2, 3, 4, 5}Sourcepub fn is_cyclic(&self, node: i64) -> bool
pub fn is_cyclic(&self, node: i64) -> bool
Checks if a node is part of any cycle.
Returns true if the node appears in any basis cycle.
This is a fast check compared to cycles_containing.
§Example
assert!(result.is_cyclic(1)); // In cycle [1, 2, 3]
assert!(!result.is_cyclic(99)); // Not in any cycleSourcepub fn cycles_containing(&self, node: i64) -> Vec<&[i64]>
pub fn cycles_containing(&self, node: i64) -> Vec<&[i64]>
Returns cycles that contain a specific node.
Returns references to the cycles (as slices) that include the given node. Useful for understanding all cycles a node participates in.
§Example
let cycles = result.cycles_containing(1);
assert_eq!(cycles.len(), 2); // Node 1 is in 2 cyclesSourcepub fn explain_cycle(&self, node: i64) -> String
pub fn explain_cycle(&self, node: i64) -> String
Explains why a node is cyclic.
Returns a human-readable explanation of the cycles involving the given node. If the node is not cyclic, returns a message saying so.
§Example
let explanation = result.explain_cycle(1);
println!("{}", explanation);
// Output:
// Node 1 is in 2 cycle(s):
// 1. [1, 2, 3]
// 2. [1, 4, 5]Sourcepub fn cyclic_scc_count(&self) -> usize
pub fn cyclic_scc_count(&self) -> usize
Returns the number of non-trivial SCCs (those containing cycles).
Sourcepub fn has_cycles(&self) -> bool
pub fn has_cycles(&self) -> bool
Returns true if the graph has any cycles.
Trait Implementations§
Source§impl Clone for CycleBasisResult
impl Clone for CycleBasisResult
Source§fn clone(&self) -> CycleBasisResult
fn clone(&self) -> CycleBasisResult
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for CycleBasisResult
impl RefUnwindSafe for CycleBasisResult
impl Send for CycleBasisResult
impl Sync for CycleBasisResult
impl Unpin for CycleBasisResult
impl UnwindSafe for CycleBasisResult
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more