#[cfg(feature = "distributed")]
use numrs2::distributed::prelude::*;
#[cfg(feature = "distributed")]
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("NumRS2 Distributed Computing - Basic Example");
println!("============================================\n");
println!("Initializing distributed environment...");
let world = init().await?;
let rank = world.rank();
let size = world.size();
println!("✓ Process {} of {} initialized successfully", rank, size);
println!(" Hostname: {}", world.process_info().hostname);
println!(" Address: {}\n", world.process_info().addr);
println!("Process Information:");
println!(" Rank: {}", rank);
println!(" Size: {}", size);
println!(" Is root: {}\n", world.is_root());
println!("Creating local data...");
let local_data: Vec<f64> = (0..10).map(|i| (rank * 10 + i) as f64).collect();
println!(" Local data (rank {}): {:?}\n", rank, &local_data[..5]);
println!("Creating distributed array...");
let global_size = size * 10;
let dist_array = DistributedArray::from_local(
local_data.clone(),
DistributionStrategy::Block,
global_size,
&world,
)?;
println!("✓ Distributed array created");
println!(" Global size: {}", dist_array.global_size());
println!(
" Local size (rank {}): {}\n",
rank,
dist_array.local_size()
);
if rank == 0 {
println!("Index Conversion Examples:");
let global_idx = GlobalIndex::new(15);
println!(" Global index 15:");
match dist_array.global_to_local(&global_idx)? {
Some(local_idx) => {
println!(" → Local index: {} (on this process)", local_idx.index());
}
None => {
println!(" → Not owned by this process");
}
}
let local_idx = LocalIndex::new(5);
let global = dist_array.local_to_global(&local_idx)?;
println!(" Local index 5 → Global index: {}\n", global.index());
}
println!("Synchronizing at barrier...");
barrier(&world).await?;
println!("✓ All processes reached barrier\n");
if world.is_root() {
println!("Process Group Information:");
println!(" Total processes: {}", world.group().size());
println!(" Ranks: {:?}\n", world.group().ranks);
}
barrier(&world).await?;
if world.is_root() {
println!("\nFinalizing distributed environment...");
}
finalize(world).await?;
if rank == 0 {
println!("✓ Distributed environment finalized successfully");
println!("\nExample completed successfully! 🎉");
}
Ok(())
}
#[cfg(not(feature = "distributed"))]
fn main() {
eprintln!("This example requires the 'distributed' feature.");
eprintln!("Run with: cargo run --example distributed_basics --features distributed");
std::process::exit(1);
}