#![deny(missing_docs)]
#![cfg_attr(not(feature = "wasm"), deny(unsafe_code))]
#![warn(clippy::all)]
#![warn(clippy::pedantic)]
#![allow(clippy::module_name_repetitions)]
#![allow(clippy::missing_errors_doc)]
#![allow(clippy::missing_panics_doc)]
pub mod algorithm;
pub mod certificate;
pub mod cluster;
pub mod compact;
pub mod connectivity;
pub mod error;
pub mod euler;
pub mod expander;
pub mod fragment;
pub mod fragmentation;
pub mod graph;
pub mod instance;
pub mod integration;
pub mod linkcut;
pub mod localkcut;
pub mod parallel;
pub mod pool;
pub mod sparsify;
pub mod tree;
pub mod witness;
pub mod wrapper;
pub mod optimization;
pub mod snn;
pub mod subpolynomial;
#[cfg(feature = "jtree")]
pub mod jtree;
mod core;
pub mod time_compat;
#[cfg(feature = "monitoring")]
pub mod monitoring;
#[cfg(feature = "canonical")]
pub mod canonical;
#[cfg(feature = "wasm")]
pub mod wasm;
pub use algorithm::approximate::{
ApproxMinCut, ApproxMinCutConfig, ApproxMinCutResult, ApproxMinCutStats,
};
pub use algorithm::{AlgorithmStats, DynamicMinCut, MinCutBuilder, MinCutConfig, MinCutResult};
pub use certificate::{
AuditData, AuditEntry, AuditEntryType, AuditLogger, CertLocalKCutQuery, CertificateError,
CutCertificate, LocalKCutResponse, LocalKCutResultSummary, UpdateTrigger, UpdateType,
};
pub use cluster::hierarchy::{
Expander, HierarchyCluster, HierarchyConfig, HierarchyStats, MirrorCut, Precluster,
ThreeLevelHierarchy,
};
pub use cluster::{Cluster, ClusterHierarchy};
pub use compact::{
BitSet256, CompactAdjacency, CompactCoreState, CompactEdge, CompactEdgeId, CompactVertexId,
CompactWitness, CoreResult, MAX_EDGES_PER_CORE, MAX_VERTICES_PER_CORE,
};
pub use connectivity::polylog::{PolylogConnectivity, PolylogStats};
pub use connectivity::DynamicConnectivity;
pub use error::{MinCutError, Result};
pub use euler::EulerTourTree;
pub use expander::{Conductance, ExpanderComponent, ExpanderDecomposition};
pub use fragment::{Fragment, FragmentResult, FragmentingAlgorithm};
pub use fragmentation::{
Fragment as FragmentationFragment, Fragmentation, FragmentationConfig, TrimResult,
};
pub use graph::{DynamicGraph, Edge, EdgeId, GraphStats, VertexId, Weight};
pub use instance::{
BoundedInstance, InstanceResult, ProperCutInstance, StubInstance, WitnessHandle,
};
pub use integration::{CommunityDetector, GraphPartitioner, RuVectorGraphAnalyzer};
pub use linkcut::LinkCutTree;
pub use localkcut::{
ColorMask, DeterministicFamilyGenerator, DeterministicLocalKCut, EdgeColor, ForestPacking,
LocalCutResult, LocalKCut, LocalKCutOracle, LocalKCutQuery,
LocalKCutResult as PaperLocalKCutResult,
};
pub use parallel::{
compute_core_range, CoreDistributor, CoreExecutor, CoreMessage, CoreStrategy, ResultAggregator,
SharedCoordinator, WorkItem, NUM_CORES, RANGES_PER_CORE, RANGE_FACTOR, TOTAL_RANGES,
};
pub use sparsify::{SparseGraph, SparsifyConfig};
pub use subpolynomial::{
HierarchyLevel, HierarchyStatistics, LevelExpander, MinCutQueryResult, RecourseStats,
SubpolyConfig, SubpolynomialMinCut,
};
pub use tree::{DecompositionNode, HierarchicalDecomposition, LevelInfo};
pub use witness::{EdgeWitness, LazyWitnessTree, WitnessTree};
pub use wrapper::MinCutWrapper;
pub use optimization::{
BatchConfig,
BenchmarkResult,
BenchmarkSuite,
CacheConfig,
CacheStats,
DegreePresparse,
DistanceArray,
LazyLevel,
LevelPool,
OptimizationBenchmark,
ParallelConfig,
ParallelLevelUpdater,
PathDistanceCache,
PoolConfig,
PoolStats,
PrefetchHint,
PresparseConfig,
PresparseResult,
PresparseStats,
SimdDistanceOps,
TypedArrayTransfer,
WasmBatchOps,
WorkStealingScheduler,
};
#[cfg(feature = "jtree")]
pub use jtree::{
ApproximateCut, BmsspJTreeLevel, ContractedGraph, CutResult as JTreeCutResult,
DynamicCutSparsifier, EscalationPolicy, EscalationTrigger, JTreeConfig, JTreeError,
JTreeHierarchy, JTreeLevel, JTreeStatistics, LevelConfig, LevelStatistics, PathCutResult,
QueryResult as CoordinatorQueryResult, RecourseTracker, SparsifierConfig, SparsifierStatistics,
Tier, TierMetrics, TwoTierCoordinator, VertexSplitResult,
};
#[cfg(feature = "jtree")]
pub use jtree::ForestPacking as JTreeForestPacking;
pub use snn::{
AttractorConfig,
AttractorDynamics,
CPGConfig,
CausalConfig,
CausalDiscoverySNN,
CausalGraph,
CausalRelation,
CognitiveMinCutEngine,
EnergyLandscape,
EngineConfig,
EngineMetrics,
GrowthRules,
LIFNeuron,
LayerConfig,
MetaAction,
MetaCognitiveMinCut,
MetaLevel,
MorphConfig,
MorphogeneticSNN,
NetworkConfig,
NeuralGraphOptimizer,
NeuronConfig,
NeuronState,
OptimizationResult,
OptimizerConfig,
OscillatorNeuron,
PhaseTopology,
PolicySNN,
SNNMinCutConfig,
STDPConfig,
SimTime,
Spike,
SpikeTrain,
SpikingNetwork,
StrangeLoopConfig,
Synapse,
SynapseMatrix,
TimeCrystalCPG,
TuringPattern,
ValueNetwork,
};
#[cfg(feature = "agentic")]
pub use integration::AgenticAnalyzer;
#[cfg(feature = "canonical")]
pub use canonical::{
CactusCycle, CactusEdge, CactusGraph, CactusVertex, CanonicalCutResult, CanonicalMinCut,
CanonicalMinCutImpl, FixedWeight, WitnessReceipt,
};
#[cfg(feature = "canonical")]
pub use canonical::source_anchored::{
canonical_mincut, make_receipt, receipts_agree, CanonicalMinCutResult as SourceAnchoredResult,
SourceAnchoredConfig, SourceAnchoredCut, SourceAnchoredMinCut, SourceAnchoredReceipt,
};
#[cfg(feature = "canonical")]
pub use canonical::tree_packing::{
canonical_mincut_fast, GomoryHuEdge, GomoryHuTree, TreeMinCutResult,
};
#[cfg(feature = "canonical")]
pub use canonical::dynamic::{
DynamicMinCut as DynamicCanonicalMinCut, DynamicMinCutConfig as DynamicCanonicalConfig,
EdgeMutation,
};
#[cfg(feature = "monitoring")]
pub use monitoring::{
EventType, MinCutEvent, MinCutMonitor, MonitorBuilder, MonitorConfig, MonitorMetrics, Threshold,
};
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
pub const NAME: &str = env!("CARGO_PKG_NAME");
pub mod prelude {
pub use crate::{
compute_core_range,
AlgorithmStats,
ApproxMinCut,
ApproxMinCutConfig,
AttractorConfig,
AttractorDynamics,
AuditLogger,
BitSet256,
BoundedInstance,
CPGConfig,
CertificateError,
Cluster,
ClusterHierarchy,
CognitiveMinCutEngine,
ColorMask,
CommunityDetector,
CompactAdjacency,
CompactCoreState,
CompactEdge,
CompactEdgeId,
CompactVertexId,
CompactWitness,
Conductance,
CoreDistributor,
CoreExecutor,
CoreResult,
CoreStrategy,
CutCertificate,
DeterministicFamilyGenerator,
DeterministicLocalKCut,
DynamicConnectivity,
DynamicGraph,
DynamicMinCut,
Edge,
EdgeColor,
EdgeId,
EngineConfig,
EngineMetrics,
ExpanderComponent,
ExpanderDecomposition,
ForestPacking,
Fragment,
FragmentResult,
FragmentingAlgorithm,
GraphPartitioner,
InstanceResult,
LocalCutResult,
LocalKCut,
LocalKCutOracle,
LocalKCutQuery,
MinCutBuilder,
MinCutConfig,
MinCutError,
MinCutResult,
MinCutWrapper,
NeuralGraphOptimizer,
OptimizerConfig,
PaperLocalKCutResult,
PolylogConnectivity,
PolylogStats,
ProperCutInstance,
RecourseStats,
Result,
ResultAggregator,
RuVectorGraphAnalyzer,
SharedCoordinator,
SimTime,
Spike,
StubInstance,
SubpolyConfig,
SubpolynomialMinCut,
TimeCrystalCPG,
VertexId,
Weight,
WitnessHandle,
MAX_EDGES_PER_CORE,
MAX_VERTICES_PER_CORE,
NUM_CORES,
RANGES_PER_CORE,
};
#[cfg(feature = "agentic")]
pub use crate::AgenticAnalyzer;
#[cfg(feature = "monitoring")]
pub use crate::{EventType, MinCutEvent, MinCutMonitor, MonitorBuilder};
#[cfg(feature = "canonical")]
pub use crate::{
CactusCycle, CactusEdge, CactusGraph, CactusVertex, CanonicalCutResult, CanonicalMinCut,
CanonicalMinCutImpl, DynamicCanonicalConfig, DynamicCanonicalMinCut, EdgeMutation,
FixedWeight, GomoryHuTree, SourceAnchoredConfig, SourceAnchoredCut,
SourceAnchoredMinCut, SourceAnchoredReceipt, TreeMinCutResult, WitnessReceipt,
};
#[cfg(feature = "jtree")]
pub use crate::{
ApproximateCut, BmsspJTreeLevel, ContractedGraph, CoordinatorQueryResult,
DynamicCutSparsifier, EscalationPolicy, EscalationTrigger, JTreeConfig, JTreeCutResult,
JTreeError, JTreeForestPacking, JTreeHierarchy, JTreeLevel, JTreeStatistics, LevelConfig,
LevelStatistics, PathCutResult, RecourseTracker, SparsifierConfig, SparsifierStatistics,
Tier, TierMetrics, TwoTierCoordinator, VertexSplitResult,
};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_version_constant() {
assert!(!VERSION.is_empty());
assert!(!NAME.is_empty());
assert_eq!(NAME, "ruvector-mincut");
}
#[test]
fn test_basic_workflow() {
let mut mincut = MinCutBuilder::new()
.exact()
.with_edges(vec![(1, 2, 1.0), (2, 3, 1.0), (3, 1, 1.0)])
.build()
.unwrap();
assert_eq!(mincut.num_vertices(), 3);
assert_eq!(mincut.num_edges(), 3);
assert_eq!(mincut.min_cut_value(), 2.0);
let new_cut = mincut.insert_edge(1, 4, 2.0).unwrap();
assert!(new_cut.is_finite());
assert_eq!(mincut.num_edges(), 4);
let new_cut = mincut.delete_edge(1, 2).unwrap();
assert!(new_cut.is_finite());
assert_eq!(mincut.num_edges(), 3);
}
#[test]
fn test_prelude_imports() {
use crate::prelude::*;
let mincut = MinCutBuilder::new().build().unwrap();
assert_eq!(mincut.min_cut_value(), f64::INFINITY);
}
#[test]
fn test_approximate_mode() {
let mincut = MinCutBuilder::new()
.approximate(0.1)
.with_edges(vec![(1, 2, 1.0)])
.build()
.unwrap();
let result = mincut.min_cut();
assert!(!result.is_exact);
assert_eq!(result.approximation_ratio, 1.1);
}
#[test]
fn test_exact_mode() {
let mincut = MinCutBuilder::new()
.exact()
.with_edges(vec![(1, 2, 1.0)])
.build()
.unwrap();
let result = mincut.min_cut();
assert!(result.is_exact);
assert_eq!(result.approximation_ratio, 1.0);
}
#[test]
fn test_min_cut_result() {
let mincut = MinCutBuilder::new()
.with_edges(vec![(1, 2, 1.0), (2, 3, 1.0), (3, 1, 1.0)])
.build()
.unwrap();
let result = mincut.min_cut();
assert_eq!(result.value, 2.0);
assert!(result.cut_edges.is_some());
assert!(result.partition.is_some());
if let Some((s, t)) = result.partition {
assert_eq!(s.len() + t.len(), 3);
assert!(!s.is_empty());
assert!(!t.is_empty());
}
}
#[test]
fn test_graph_stats() {
let mincut = MinCutBuilder::new()
.with_edges(vec![(1, 2, 2.0), (2, 3, 3.0), (3, 1, 1.0)])
.build()
.unwrap();
let graph = mincut.graph();
let stats = graph.read().stats();
assert_eq!(stats.num_vertices, 3);
assert_eq!(stats.num_edges, 3);
assert_eq!(stats.total_weight, 6.0);
assert_eq!(stats.min_degree, 2);
assert_eq!(stats.max_degree, 2);
}
#[test]
fn test_algorithm_stats() {
let mut mincut = MinCutBuilder::new()
.with_edges(vec![(1, 2, 1.0)])
.build()
.unwrap();
mincut.insert_edge(2, 3, 1.0).unwrap();
mincut.delete_edge(1, 2).unwrap();
let _ = mincut.min_cut_value();
let stats = mincut.stats();
assert_eq!(stats.insertions, 1);
assert_eq!(stats.deletions, 1);
assert_eq!(stats.queries, 1);
assert!(stats.avg_update_time_us > 0.0);
}
#[test]
fn test_dynamic_updates() {
let mut mincut = MinCutBuilder::new().build().unwrap();
assert_eq!(mincut.min_cut_value(), f64::INFINITY);
mincut.insert_edge(1, 2, 1.0).unwrap();
assert_eq!(mincut.min_cut_value(), 1.0);
mincut.insert_edge(2, 3, 1.0).unwrap();
assert_eq!(mincut.min_cut_value(), 1.0);
mincut.insert_edge(3, 1, 1.0).unwrap();
assert_eq!(mincut.min_cut_value(), 2.0);
}
#[test]
fn test_disconnected_graph() {
let mincut = MinCutBuilder::new()
.with_edges(vec![(1, 2, 1.0), (3, 4, 1.0)])
.build()
.unwrap();
assert!(!mincut.is_connected());
assert_eq!(mincut.min_cut_value(), 0.0);
}
#[test]
fn test_builder_pattern() {
let mincut = MinCutBuilder::new()
.exact()
.max_cut_size(500)
.parallel(true)
.with_edges(vec![(1, 2, 1.0)])
.build()
.unwrap();
assert!(!mincut.config().approximate);
assert_eq!(mincut.config().max_exact_cut_size, 500);
assert!(mincut.config().parallel);
}
#[test]
fn test_weighted_graph() {
let mincut = MinCutBuilder::new()
.with_edges(vec![(1, 2, 5.0), (2, 3, 3.0), (3, 1, 2.0)])
.build()
.unwrap();
assert_eq!(mincut.min_cut_value(), 5.0);
}
#[test]
fn test_error_handling() {
let mut mincut = MinCutBuilder::new()
.with_edges(vec![(1, 2, 1.0)])
.build()
.unwrap();
let result = mincut.insert_edge(1, 2, 2.0);
assert!(result.is_err());
assert!(matches!(result, Err(MinCutError::EdgeExists(1, 2))));
let result = mincut.delete_edge(3, 4);
assert!(result.is_err());
assert!(matches!(result, Err(MinCutError::EdgeNotFound(3, 4))));
}
#[test]
fn test_large_graph() {
let mut edges = Vec::new();
for i in 0..99 {
edges.push((i, i + 1, 1.0));
}
let mincut = MinCutBuilder::new().with_edges(edges).build().unwrap();
assert_eq!(mincut.num_vertices(), 100);
assert_eq!(mincut.num_edges(), 99);
assert_eq!(mincut.min_cut_value(), 1.0);
}
#[cfg(feature = "monitoring")]
#[test]
fn test_monitoring_feature() {
use crate::monitoring::EventType;
let _ = EventType::CutIncreased;
let _ = EventType::CutDecreased;
}
}