blob: c4cee1a632203f3df5682ddf681eced053ebbb8f [file] [log] [blame] [edit]
#[cfg(feature = "stable_graph")]
#[cfg(test)]
use petgraph::{
graph::{NodeIndex, UnGraph},
Graph, Undirected,
};
#[cfg(feature = "stable_graph")]
#[cfg(test)]
fn b01_example() -> (UnGraph<(), i32>, Vec<NodeIndex>) {
// Implementing b01 case from Vienna test set B
let mut graph = Graph::<(), i32, Undirected>::new_undirected();
let _n0 = graph.add_node(());
let _n1 = graph.add_node(());
let _n2 = graph.add_node(());
let _n3 = graph.add_node(());
let _n4 = graph.add_node(());
let _n5 = graph.add_node(());
let _n6 = graph.add_node(());
let _n7 = graph.add_node(());
let _n8 = graph.add_node(());
let _n9 = graph.add_node(());
let _n10 = graph.add_node(());
let _n11 = graph.add_node(());
let n12 = graph.add_node(());
let _n13 = graph.add_node(());
let _n14 = graph.add_node(());
let _n15 = graph.add_node(());
let _n16 = graph.add_node(());
let _n17 = graph.add_node(());
let _n18 = graph.add_node(());
let _n19 = graph.add_node(());
let _n20 = graph.add_node(());
let _n21 = graph.add_node(());
let n22 = graph.add_node(());
let _n23 = graph.add_node(());
let n24 = graph.add_node(());
let _n25 = graph.add_node(());
let _n26 = graph.add_node(());
let n27 = graph.add_node(());
let _n28 = graph.add_node(());
let _n29 = graph.add_node(());
let _n30 = graph.add_node(());
let _n31 = graph.add_node(());
let _n32 = graph.add_node(());
let _n33 = graph.add_node(());
let n34 = graph.add_node(());
let n35 = graph.add_node(());
let _n36 = graph.add_node(());
let n37 = graph.add_node(());
let _n38 = graph.add_node(());
let _n39 = graph.add_node(());
let _n40 = graph.add_node(());
let _n41 = graph.add_node(());
let _n42 = graph.add_node(());
let _n43 = graph.add_node(());
let _n44 = graph.add_node(());
let _n45 = graph.add_node(());
let _n46 = graph.add_node(());
let _n47 = graph.add_node(());
let n48 = graph.add_node(());
let n49 = graph.add_node(());
let _n50 = graph.add_node(());
graph.extend_with_edges([
(2, 8, 8),
(2, 21, 7),
(2, 32, 2),
(4, 5, 8),
(7, 29, 7),
(11, 3, 7),
(14, 31, 9),
(17, 6, 7),
(17, 42, 6),
(18, 19, 2),
(18, 28, 1),
(18, 43, 1),
(19, 2, 5),
(20, 7, 3),
(20, 14, 7),
(20, 16, 8),
(20, 27, 2),
(20, 38, 8),
(20, 40, 10),
(20, 48, 2),
(21, 12, 7),
(21, 17, 5),
(21, 18, 10),
(22, 10, 6),
(22, 20, 2),
(22, 21, 2),
(22, 40, 8),
(22, 43, 7),
(25, 34, 4),
(27, 34, 4),
(28, 5, 8),
(28, 24, 5),
(29, 9, 5),
(29, 33, 7),
(30, 5, 4),
(30, 15, 1),
(30, 16, 2),
(33, 35, 3),
(34, 20, 10),
(34, 30, 2),
(36, 2, 8),
(36, 4, 6),
(36, 11, 9),
(36, 39, 7),
(36, 49, 9),
(36, 50, 10),
(40, 15, 10),
(40, 23, 3),
(41, 1, 5),
(41, 22, 8),
(41, 25, 5),
(41, 36, 2),
(41, 44, 7),
(41, 47, 7),
(42, 6, 9),
(42, 46, 10),
(44, 24, 8),
(44, 39, 3),
(45, 26, 6),
(45, 28, 1),
(47, 37, 3),
(47, 45, 10),
(50, 13, 1),
]);
let terminals = vec![n48, n49, n22, n35, n27, n12, n37, n34, n24];
(graph, terminals)
}
#[cfg(feature = "stable_graph")]
#[cfg(test)]
fn b07_example() -> (UnGraph<(), i32>, Vec<NodeIndex>) {
// Implementing b07 case from Vienna test set B
let mut graph = Graph::<(), i32, Undirected>::new_undirected();
let _n0 = graph.add_node(());
let _n1 = graph.add_node(());
let _n2 = graph.add_node(());
let _n3 = graph.add_node(());
let _n4 = graph.add_node(());
let _n5 = graph.add_node(());
let _n6 = graph.add_node(());
let _n7 = graph.add_node(());
let _n8 = graph.add_node(());
let _n9 = graph.add_node(());
let _n10 = graph.add_node(());
let _n11 = graph.add_node(());
let _n12 = graph.add_node(());
let _n13 = graph.add_node(());
let n14 = graph.add_node(());
let _n15 = graph.add_node(());
let _n16 = graph.add_node(());
let _n17 = graph.add_node(());
let _n18 = graph.add_node(());
let _n19 = graph.add_node(());
let _n20 = graph.add_node(());
let _n21 = graph.add_node(());
let _n22 = graph.add_node(());
let n23 = graph.add_node(());
let n24 = graph.add_node(());
let _n25 = graph.add_node(());
let n26 = graph.add_node(());
let _n27 = graph.add_node(());
let _n28 = graph.add_node(());
let n29 = graph.add_node(());
let _n30 = graph.add_node(());
let _n31 = graph.add_node(());
let _n32 = graph.add_node(());
let _n33 = graph.add_node(());
let _n34 = graph.add_node(());
let _n35 = graph.add_node(());
let n36 = graph.add_node(());
let _n37 = graph.add_node(());
let _n38 = graph.add_node(());
let _n39 = graph.add_node(());
let _n40 = graph.add_node(());
let _n41 = graph.add_node(());
let _n42 = graph.add_node(());
let _n43 = graph.add_node(());
let _n44 = graph.add_node(());
let _n45 = graph.add_node(());
let _n46 = graph.add_node(());
let _n47 = graph.add_node(());
let _n48 = graph.add_node(());
let _n49 = graph.add_node(());
let _n50 = graph.add_node(());
let n51 = graph.add_node(());
let n52 = graph.add_node(());
let _n53 = graph.add_node(());
let _n54 = graph.add_node(());
let n55 = graph.add_node(());
let _n56 = graph.add_node(());
let _n57 = graph.add_node(());
let _n58 = graph.add_node(());
let n59 = graph.add_node(());
let n60 = graph.add_node(());
let _n61 = graph.add_node(());
let _n62 = graph.add_node(());
let n63 = graph.add_node(());
let _n64 = graph.add_node(());
let _n65 = graph.add_node(());
let _n66 = graph.add_node(());
let _n67 = graph.add_node(());
let _n68 = graph.add_node(());
let _n69 = graph.add_node(());
let n70 = graph.add_node(());
let _n71 = graph.add_node(());
let _n72 = graph.add_node(());
let _n73 = graph.add_node(());
let _n74 = graph.add_node(());
let _n75 = graph.add_node(());
graph.extend_with_edges([
(7, 17, 6),
(7, 69, 1),
(8, 25, 10),
(8, 39, 1),
(9, 70, 4),
(15, 2, 3),
(15, 20, 1),
(18, 45, 2),
(18, 74, 7),
(19, 7, 9),
(19, 64, 7),
(22, 34, 5),
(23, 9, 5),
(25, 19, 7),
(26, 72, 6),
(27, 3, 10),
(27, 36, 10),
(27, 40, 3),
(28, 6, 6),
(28, 48, 7),
(28, 63, 9),
(29, 21, 4),
(30, 29, 1),
(30, 41, 8),
(30, 62, 2),
(32, 34, 3),
(32, 74, 9),
(33, 7, 10),
(38, 7, 6),
(38, 54, 8),
(38, 60, 10),
(38, 65, 2),
(39, 2, 6),
(40, 3, 10),
(41, 1, 9),
(41, 21, 7),
(41, 23, 7),
(42, 12, 2),
(42, 30, 2),
(42, 53, 3),
(42, 56, 10),
(42, 74, 1),
(43, 4, 8),
(43, 51, 9),
(43, 54, 5),
(43, 55, 6),
(43, 71, 2),
(44, 10, 1),
(44, 26, 3),
(44, 28, 9),
(44, 36, 4),
(44, 43, 8),
(44, 46, 2),
(44, 57, 2),
(44, 68, 2),
(45, 1, 6),
(46, 49, 10),
(46, 52, 2),
(47, 27, 5),
(47, 38, 5),
(47, 41, 10),
(48, 14, 2),
(48, 22, 7),
(50, 73, 1),
(51, 8, 4),
(51, 15, 7),
(52, 16, 9),
(53, 16, 10),
(54, 66, 6),
(56, 20, 6),
(56, 75, 2),
(57, 58, 9),
(58, 5, 10),
(59, 11, 9),
(60, 18, 5),
(60, 31, 5),
(60, 35, 8),
(60, 61, 1),
(60, 67, 10),
(61, 32, 9),
(61, 37, 9),
(63, 24, 10),
(65, 16, 3),
(65, 33, 2),
(65, 42, 6),
(65, 44, 4),
(65, 50, 1),
(65, 59, 1),
(67, 20, 3),
(67, 39, 6),
(70, 13, 8),
(71, 70, 4),
(72, 9, 1),
(74, 37, 4),
]);
let terminals = vec![
n55, n52, n60, n63, n24, n26, n70, n36, n29, n51, n23, n59, n14,
];
(graph, terminals)
}
#[cfg(feature = "stable_graph")]
#[cfg(test)]
fn example_kou_paper() -> (UnGraph<(), usize>, Vec<NodeIndex>) {
let mut graph = Graph::<(), usize, Undirected>::new_undirected();
// Add nodes
let nodes: Vec<_> = (0..9).map(|_| graph.add_node(())).collect();
let edges = vec![
(0, 1, 20),
(0, 8, 1),
(1, 2, 8),
(1, 5, 1),
(2, 4, 2),
(2, 3, 9),
(3, 4, 2),
(4, 8, 1),
(4, 4, 1),
(5, 6, 1),
(6, 7, 0), // Note: In the Kou Paper this is 0.5, but the nodes are not present in terminals, so we approximate this with 0
(7, 8, 0), // Note: In the Kou Paper this is 0.5, but the nodes are not present in terminals, so we approximate this with 0
];
// Add edges to the graph
for (u, v, weight) in edges {
graph.add_edge(nodes[u], nodes[v], weight);
}
(graph, vec![nodes[0], nodes[1], nodes[2], nodes[3]])
}
#[cfg(feature = "stable_graph")]
#[cfg(test)]
mod test {
use crate::{b01_example, b07_example, example_kou_paper};
use petgraph::algo::{connected_components, steiner_tree};
use petgraph::graph::UnGraph;
#[test]
fn b01_vienna_test() {
let (graph, terminals) = b01_example();
let st = steiner_tree(&graph, &terminals);
let weights = st.edge_weights().cloned().sum::<i32>();
let steiner_tree_nodes: Vec<_> = st.node_indices().collect();
assert!(terminals.iter().all(|&t| steiner_tree_nodes.contains(&t)));
assert!(st.edge_count() == st.node_count() - 1);
assert_eq!(connected_components(&UnGraph::from(st)), 1);
assert_eq!(weights, 82);
}
#[test]
fn b07_vienna_test() {
let (graph, terminals) = b07_example();
let st = steiner_tree(&graph, &terminals);
let weights = st.edge_weights().cloned().sum::<i32>();
let steiner_tree_nodes: Vec<_> = st.node_indices().collect();
assert!(terminals.iter().all(|&t| steiner_tree_nodes.contains(&t)));
assert!(st.edge_count() == st.node_count() - 1);
assert_eq!(connected_components(&UnGraph::from(st)), 1);
assert_eq!(weights, 111);
}
#[test]
fn example_kous_paper() {
let (graph, terminals) = example_kou_paper();
let st = steiner_tree(&graph, &terminals);
let weights = st.edge_weights().cloned().sum::<usize>();
let steiner_tree_nodes: Vec<_> = st.node_indices().collect();
assert!(terminals.iter().all(|&t| steiner_tree_nodes.contains(&t)));
assert!(st.edge_count() == st.node_count() - 1);
assert_eq!(connected_components(&UnGraph::from(st)), 1);
assert_eq!(weights, 8);
}
}