pub struct GraphNeuralNetwork {
pub config: GnnConfig,
pub nodes: Vec<NodeFeatures>,
pub adjacency: Vec<Vec<(GnnNodeId, f64)>>,
pub trained_iterations: u64,
}Expand description
Message-passing Graph Neural Network.
Supports dynamic node/edge addition/removal, configurable aggregation strategies, and multi-layer propagation.
Fields§
§config: GnnConfigGNN configuration (layers, aggregation, iterations).
nodes: Vec<NodeFeatures>Node feature vectors; index matches the logical node id.
adjacency: Vec<Vec<(GnnNodeId, f64)>>Adjacency list: adjacency[node_idx] = list of (neighbour_id, weight).
trained_iterations: u64Cumulative message-passing iterations executed so far.
Implementations§
Source§impl GraphNeuralNetwork
impl GraphNeuralNetwork
Sourcepub fn new(config: GnnConfig) -> Self
pub fn new(config: GnnConfig) -> Self
Create a new, empty graph neural network with the given configuration.
Sourcepub fn add_node(&mut self, features: Vec<f64>) -> GnnNodeId
pub fn add_node(&mut self, features: Vec<f64>) -> GnnNodeId
Append a new node with the provided feature vector.
Returns the GnnNodeId assigned to the new node.
Sourcepub fn add_edge(
&mut self,
from: GnnNodeId,
to: GnnNodeId,
weight: f64,
) -> Result<(), GnnError>
pub fn add_edge( &mut self, from: GnnNodeId, to: GnnNodeId, weight: f64, ) -> Result<(), GnnError>
Add an undirected edge between from and to with the given weight.
Both directions are stored so that neighbour aggregation works transparently for undirected graphs.
§Errors
Returns GnnError::NodeNotFound if either node id is out of bounds.
Sourcepub fn remove_node(&mut self, id: GnnNodeId) -> bool
pub fn remove_node(&mut self, id: GnnNodeId) -> bool
Remove the node with the given id together with all edges incident to it.
Returns true if the node existed, false otherwise.
Note: Removing a node renumbers all nodes with higher indices; any
previously obtained GnnNodeIds for those nodes become stale.
Sourcepub fn forward(&self) -> Vec<Vec<f64>>
pub fn forward(&self) -> Vec<Vec<f64>>
Run num_iterations rounds of message passing and return the final node
embeddings.
Each iteration:
- Every node aggregates its neighbours’ current feature vectors using
the configured
GnnAggregation. - The aggregated vector is passed through every
GnnLayerin order.
Returns one embedding Vec<f64> per node in node-index order.
Sourcepub fn aggregate_neighbors(
&self,
node_id: GnnNodeId,
features: &[Vec<f64>],
) -> Vec<f64>
pub fn aggregate_neighbors( &self, node_id: GnnNodeId, features: &[Vec<f64>], ) -> Vec<f64>
Aggregate the feature vectors of node_id’s neighbours according to
the configured aggregation strategy.
Falls back to the node’s own features when it has no neighbours.
Sourcepub fn apply_layer(input: &[f64], layer: &GnnLayer) -> Vec<f64>
pub fn apply_layer(input: &[f64], layer: &GnnLayer) -> Vec<f64>
Apply a single layer (linear transform + bias + activation) to input.
layer.weights must be [output_dim × input_dim]. Rows shorter than
input are zero-padded; inputs longer than any row are silently ignored
for that row (safe defaults for heterogeneous graphs).
Sourcepub fn node_embedding(&self, id: GnnNodeId) -> Result<Vec<f64>, GnnError>
pub fn node_embedding(&self, id: GnnNodeId) -> Result<Vec<f64>, GnnError>
Compute the embedding for a single node.
§Errors
GnnError::EmptyGraphif the graph has no nodes.GnnError::NodeNotFoundifidis out of range.
Sourcepub fn graph_embedding(&self) -> Vec<f64>
pub fn graph_embedding(&self) -> Vec<f64>
Compute the graph-level embedding as the element-wise mean of all node embeddings.
Returns an empty vector if the graph has no nodes or if the node embeddings are empty.
Auto Trait Implementations§
impl Freeze for GraphNeuralNetwork
impl RefUnwindSafe for GraphNeuralNetwork
impl Send for GraphNeuralNetwork
impl Sync for GraphNeuralNetwork
impl Unpin for GraphNeuralNetwork
impl UnsafeUnpin for GraphNeuralNetwork
impl UnwindSafe for GraphNeuralNetwork
Blanket Implementations§
impl<T> Allocation for T
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
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