use amari_core::Vector;
use amari_network::{GeometricNetwork, NodeMetadata};
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("πΈοΈ Amari Geometric Network Analysis - Basic Example");
println!("================================================\n");
let mut network = GeometricNetwork::<3, 0, 0>::new();
println!("π Creating nodes in 3D geometric space...");
let origin = network.add_node_with_metadata(
Vector::from_components(0.0, 0.0, 0.0).mv,
NodeMetadata::with_label("Origin").with_property("importance", 1.0),
);
let node_x = network.add_node_with_metadata(
Vector::from_components(3.0, 0.0, 0.0).mv,
NodeMetadata::with_label("X-Axis").with_property("importance", 0.8),
);
let node_y = network.add_node_with_metadata(
Vector::from_components(0.0, 4.0, 0.0).mv,
NodeMetadata::with_label("Y-Axis").with_property("importance", 0.8),
);
let node_z = network.add_node_with_metadata(
Vector::from_components(0.0, 0.0, 5.0).mv,
NodeMetadata::with_label("Z-Axis").with_property("importance", 0.7),
);
let center = network.add_node_with_metadata(
Vector::from_components(1.0, 1.0, 1.0).mv,
NodeMetadata::with_label("Center").with_property("importance", 0.9),
);
println!("β
Created {} nodes", network.num_nodes());
println!("\nπ Adding edges between nodes...");
network.add_edge(origin, node_x, 1.0)?;
network.add_edge(origin, node_y, 1.0)?;
network.add_edge(origin, node_z, 1.0)?;
network.add_edge(center, origin, 0.5)?;
network.add_edge(center, node_x, 0.7)?;
network.add_edge(center, node_y, 0.6)?;
network.add_edge(center, node_z, 0.8)?;
network.add_undirected_edge(node_x, node_y, 2.0)?;
network.add_undirected_edge(node_y, node_z, 1.5)?;
println!("β
Created {} edges", network.num_edges());
println!("\nπ Computing geometric distances:");
let distance_xy = network.geometric_distance(node_x, node_y)?;
let distance_oz = network.geometric_distance(origin, node_z)?;
let distance_center_origin = network.geometric_distance(center, origin)?;
println!(" β’ Distance from X-axis to Y-axis: {:.2}", distance_xy);
println!(" β’ Distance from Origin to Z-axis: {:.2}", distance_oz);
println!(
" β’ Distance from Center to Origin: {:.2}",
distance_center_origin
);
println!("\nπ― Computing centrality measures:");
let geometric_centrality = network.compute_geometric_centrality()?;
let betweenness_centrality = network.compute_betweenness_centrality()?;
println!(" Geometric Centrality:");
for (i, centrality) in geometric_centrality.iter().enumerate() {
if let Some(metadata) = network.get_metadata(i) {
if let Some(label) = &metadata.label {
println!(" {} ({}): {:.4}", i, label, centrality);
}
} else {
println!(" {}: {:.4}", i, centrality);
}
}
println!(" Betweenness Centrality:");
for (i, centrality) in betweenness_centrality.iter().enumerate() {
if let Some(metadata) = network.get_metadata(i) {
if let Some(label) = &metadata.label {
println!(" {} ({}): {:.4}", i, label, centrality);
}
} else {
println!(" {}: {:.4}", i, centrality);
}
}
println!("\nπ€οΈ Finding shortest paths:");
if let Some((path, distance)) = network.shortest_path(origin, node_z)? {
println!(
" β’ Path from Origin to Z-axis: {:?} (distance: {:.2})",
path, distance
);
} else {
println!(" β’ No path found from Origin to Z-axis");
}
if let Some((path, distance)) = network.shortest_geometric_path(origin, center)? {
println!(
" β’ Geometric path from Origin to Center: {:?} (distance: {:.2})",
path, distance
);
} else {
println!(" β’ No geometric path found from Origin to Center");
}
println!("\nπ΄ Converting to tropical network for advanced path analysis...");
let tropical_network = network.to_tropical_network()?;
println!(
"β
Tropical network created with {} nodes",
tropical_network.size()
);
println!("\nπ₯ Analyzing node neighborhoods:");
for i in 0..network.num_nodes() {
let neighbors = network.neighbors(i);
let degree = network.degree(i);
if let Some(metadata) = network.get_metadata(i) {
if let Some(label) = &metadata.label {
println!(
" β’ {} ({}): {} neighbors, degree {}",
i,
label,
neighbors.len(),
degree
);
if !neighbors.is_empty() {
println!(" Connected to: {:?}", neighbors);
}
}
}
}
println!("\nπ Basic network analysis complete!");
println!("This example demonstrated:");
println!(" β Creating nodes in 3D geometric space");
println!(" β Adding metadata to nodes");
println!(" β Computing geometric distances using Clifford algebra");
println!(" β Calculating centrality measures");
println!(" β Finding shortest paths");
println!(" β Converting to tropical representation");
Ok(())
}