Skip to main content

CycleBasisResult

Struct CycleBasisResult 

Source
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: SccResult

SCC decomposition used for cycle extraction.

Useful for understanding which cycles belong to which SCC. Non-trivial SCCs (len() > 1) contain cycles.

§cycles_skipped: usize

Number 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: CycleBasisBounds

Bounds applied during computation.

Records what limits were used, useful for understanding if the result is complete or partial.

Implementations§

Source§

impl CycleBasisResult

Source

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}
Source

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 cycle
Source

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 cycles
Source

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]
Source

pub fn cyclic_scc_count(&self) -> usize

Returns the number of non-trivial SCCs (those containing cycles).

Source

pub fn has_cycles(&self) -> bool

Returns true if the graph has any cycles.

Trait Implementations§

Source§

impl Clone for CycleBasisResult

Source§

fn clone(&self) -> CycleBasisResult

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CycleBasisResult

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V