rustkernel_graph/
lib.rs

1//! # RustKernel Graph Analytics
2//!
3//! GPU-accelerated graph analytics kernels including centrality measures,
4//! community detection, motif analysis, similarity metrics, and AML-focused analytics.
5//!
6//! ## Kernels
7//!
8//! ### Centrality (6 kernels)
9//! - `DegreeCentrality` - Ring kernel, O(1) query
10//! - `BetweennessCentrality` - Ring kernel, Brandes algorithm
11//! - `ClosenessCentrality` - Ring kernel, BFS-based
12//! - `EigenvectorCentrality` - Ring kernel, power iteration
13//! - `PageRank` - Ring kernel, power iteration with teleport
14//! - `KatzCentrality` - Ring kernel, attenuated paths
15//!
16//! ### Community Detection (3 kernels)
17//! - `ModularityScore` - Batch kernel
18//! - `LouvainCommunity` - Batch kernel, multi-level optimization
19//! - `LabelPropagation` - Batch kernel
20//!
21//! ### Motif Detection (3 kernels)
22//! - `TriangleCounting` - Ring kernel
23//! - `MotifDetection` - Batch kernel, k-node subgraph census
24//! - `KCliqueDetection` - Batch kernel
25//!
26//! ### Similarity (5 kernels)
27//! - `JaccardSimilarity` - Batch kernel
28//! - `CosineSimilarity` - Batch kernel
29//! - `AdamicAdarIndex` - Batch kernel
30//! - `CommonNeighbors` - Batch kernel
31//! - `ValueSimilarity` - Batch kernel (JSD/Wasserstein)
32//!
33//! ### Metrics (5 kernels)
34//! - `GraphDensity` - Batch kernel
35//! - `AveragePathLength` - Batch kernel
36//! - `ClusteringCoefficient` - Batch kernel
37//! - `ConnectedComponents` - Batch kernel
38//! - `FullGraphMetrics` - Batch kernel
39//!
40//! ### Topology (2 kernels)
41//! - `DegreeRatio` - Ring kernel, source/sink classification
42//! - `StarTopologyScore` - Batch kernel, hub-and-spoke detection
43//!
44//! ### Cycles (1 kernel)
45//! - `ShortCycleParticipation` - Batch kernel, 2-4 hop cycle detection (AML)
46//!
47//! ### Paths (1 kernel)
48//! - `ShortestPath` - Batch kernel, BFS/Delta-Stepping SSSP/APSP
49//!
50//! ### Graph Neural Networks (2 kernels)
51//! - `GNNInference` - Message passing neural network inference
52//! - `GraphAttention` - Graph Attention Network (GAT) with multi-head attention
53
54#![warn(missing_docs)]
55#![warn(clippy::all)]
56
57pub mod centrality;
58pub mod community;
59pub mod cycles;
60pub mod gnn;
61pub mod messages;
62pub mod metrics;
63pub mod motif;
64pub mod paths;
65pub mod ring_messages;
66pub mod similarity;
67pub mod topology;
68
69// Common graph types
70pub mod types;
71
72/// Prelude for convenient imports.
73pub mod prelude {
74    pub use crate::centrality::*;
75    pub use crate::community::*;
76    pub use crate::cycles::*;
77    pub use crate::gnn::*;
78    pub use crate::messages::*;
79    pub use crate::metrics::*;
80    pub use crate::motif::*;
81    pub use crate::paths::*;
82    pub use crate::ring_messages::*;
83    pub use crate::similarity::*;
84    pub use crate::topology::*;
85    pub use crate::types::*;
86}
87
88/// Register all graph kernels with a registry.
89pub fn register_all(
90    registry: &rustkernel_core::registry::KernelRegistry,
91) -> rustkernel_core::error::Result<()> {
92    use rustkernel_core::traits::GpuKernel;
93
94    tracing::info!("Registering graph analytics kernels");
95
96    // Centrality kernels (6)
97    registry.register_metadata(centrality::PageRank::new().metadata().clone())?;
98    registry.register_metadata(centrality::DegreeCentrality::new().metadata().clone())?;
99    registry.register_metadata(centrality::BetweennessCentrality::new().metadata().clone())?;
100    registry.register_metadata(centrality::ClosenessCentrality::new().metadata().clone())?;
101    registry.register_metadata(centrality::EigenvectorCentrality::new().metadata().clone())?;
102    registry.register_metadata(centrality::KatzCentrality::new().metadata().clone())?;
103
104    // Community detection kernels (3)
105    registry.register_metadata(community::ModularityScore::new().metadata().clone())?;
106    registry.register_metadata(community::LouvainCommunity::new().metadata().clone())?;
107    registry.register_metadata(community::LabelPropagation::new().metadata().clone())?;
108
109    // Similarity kernels (5)
110    registry.register_metadata(similarity::JaccardSimilarity::new().metadata().clone())?;
111    registry.register_metadata(similarity::CosineSimilarity::new().metadata().clone())?;
112    registry.register_metadata(similarity::AdamicAdarIndex::new().metadata().clone())?;
113    registry.register_metadata(similarity::CommonNeighbors::new().metadata().clone())?;
114    registry.register_metadata(similarity::ValueSimilarity::new().metadata().clone())?;
115
116    // Metrics kernels (5)
117    registry.register_metadata(metrics::GraphDensity::new().metadata().clone())?;
118    registry.register_metadata(metrics::AveragePathLength::new().metadata().clone())?;
119    registry.register_metadata(metrics::ClusteringCoefficient::new().metadata().clone())?;
120    registry.register_metadata(metrics::ConnectedComponents::new().metadata().clone())?;
121    registry.register_metadata(metrics::FullGraphMetrics::new().metadata().clone())?;
122
123    // Motif detection kernels (3)
124    registry.register_metadata(motif::TriangleCounting::new().metadata().clone())?;
125    registry.register_metadata(motif::MotifDetection::new().metadata().clone())?;
126    registry.register_metadata(motif::KCliqueDetection::new().metadata().clone())?;
127
128    // Topology kernels (2)
129    registry.register_metadata(topology::DegreeRatio::new().metadata().clone())?;
130    registry.register_metadata(topology::StarTopologyScore::new().metadata().clone())?;
131
132    // Cycle detection kernels (1)
133    registry.register_metadata(cycles::ShortCycleParticipation::new().metadata().clone())?;
134
135    // Path kernels (1)
136    registry.register_metadata(paths::ShortestPath::new().metadata().clone())?;
137
138    // GNN kernels (2)
139    registry.register_metadata(gnn::GNNInference::new().metadata().clone())?;
140    registry.register_metadata(gnn::GraphAttention::new().metadata().clone())?;
141
142    tracing::info!("Registered 28 graph analytics kernels");
143    Ok(())
144}
145
146#[cfg(test)]
147mod tests {
148    use super::*;
149    use rustkernel_core::registry::KernelRegistry;
150
151    #[test]
152    fn test_register_all() {
153        let registry = KernelRegistry::new();
154        register_all(&registry).expect("Failed to register graph kernels");
155        assert_eq!(registry.total_count(), 28);
156    }
157
158    #[test]
159    fn test_register_all_by_domain() {
160        use rustkernel_core::domain::Domain;
161
162        let registry = KernelRegistry::new();
163        register_all(&registry).expect("Failed to register graph kernels");
164
165        let graph_kernels = registry.by_domain(Domain::GraphAnalytics);
166        assert_eq!(graph_kernels.len(), 28);
167    }
168}