use heapless_graphs::{
algorithms::{transpose_graph, transpose_graph_inplace},
edgelist::edge_list::EdgeList,
graph::Graph,
};
fn main() {
println!("Graph Transposition Demo");
println!("========================");
println!("\n1. Software Dependency Analysis");
println!("Original dependencies: A->B, B->C, A->C");
let dependencies = EdgeList::<8, usize, _>::new([(0, 1), (1, 2), (0, 2)]); let mut reverse_deps = EdgeList::<8, usize, [Option<(usize, usize)>; 8]>::new([None; 8]);
transpose_graph(&dependencies, &mut reverse_deps).unwrap();
println!("Reverse dependencies (who depends on whom):");
for (from, to) in reverse_deps.iter_edges().unwrap() {
let from_name = match from {
0 => "A",
1 => "B",
2 => "C",
_ => "?",
};
let to_name = match to {
0 => "A",
1 => "B",
2 => "C",
_ => "?",
};
println!(" {} is depended on by {}", from_name, to_name);
}
println!("\n2. Social Network Analysis");
println!("Original follows: Alice->Bob, Bob->Charlie, Alice->Charlie");
let follows = EdgeList::<8, usize, _>::new([(0, 1), (1, 2), (0, 2)]); let mut followers = EdgeList::<8, usize, [Option<(usize, usize)>; 8]>::new([None; 8]);
transpose_graph(&follows, &mut followers).unwrap();
println!("Follower relationships:");
for (followed, follower) in followers.iter_edges().unwrap() {
let followed_name = match followed {
0 => "Alice",
1 => "Bob",
2 => "Charlie",
_ => "?",
};
let follower_name = match follower {
0 => "Alice",
1 => "Bob",
2 => "Charlie",
_ => "?",
};
println!(" {} is followed by {}", followed_name, follower_name);
}
println!("\n3. In-place Transposition (Atomic)");
let mut graph = EdgeList::<8, usize, [Option<(usize, usize)>; 8]>::new([
Some((0, 1)),
Some((1, 2)),
Some((2, 0)),
None,
None,
None,
None,
None,
]);
let mut buffer = [(0usize, 0usize); 8];
println!("Before transpose:");
for (from, to) in graph.iter_edges().unwrap() {
println!(" {} -> {}", from, to);
}
transpose_graph_inplace(&mut graph, &mut buffer, true).unwrap();
println!("After transpose:");
for (from, to) in graph.iter_edges().unwrap() {
println!(" {} -> {}", from, to);
}
println!("\n4. Fast In-place Transposition (No Validation)");
let mut graph = EdgeList::<8, usize, [Option<(usize, usize)>; 8]>::new([
Some((0, 1)),
Some((1, 2)),
Some((2, 0)),
None,
None,
None,
None,
None,
]);
let mut buffer = [(0usize, 0usize); 8];
println!("Before fast transpose:");
for (from, to) in graph.iter_edges().unwrap() {
println!(" {} -> {}", from, to);
}
transpose_graph_inplace(&mut graph, &mut buffer, false).unwrap();
println!("After fast transpose:");
for (from, to) in graph.iter_edges().unwrap() {
println!(" {} -> {}", from, to);
}
}