From 4f6c9e3376fd0a5ec8ddced9764fb935750bc5d7 Mon Sep 17 00:00:00 2001 From: Paul Heinrich Date: Fri, 22 Mar 2024 13:01:05 +0100 Subject: [PATCH 1/2] add contiguous option to metis --- src/simulation/network/metis_partitioning.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/simulation/network/metis_partitioning.rs b/src/simulation/network/metis_partitioning.rs index 82ef575..c6e32ca 100644 --- a/src/simulation/network/metis_partitioning.rs +++ b/src/simulation/network/metis_partitioning.rs @@ -49,6 +49,7 @@ pub fn partition(network: &Network, num_parts: u32, options: MetisOptions) -> Ve let mut graph = Graph::new(ncon, num_parts as Idx, &mut xadj, &mut adjncy) .set_option(metis::option::UFactor(options.ufactor() as Idx)) .set_option(metis::option::Seed(4711)) + .set_option(metis::option::Contig(true)) .set_adjwgt(&mut adjwgt); if !vwgt.is_empty() { From 1fa189eb8252206ab3d6a563340a51a569508cf7 Mon Sep 17 00:00:00 2001 From: Paul Heinrich Date: Fri, 22 Mar 2024 14:54:18 +0100 Subject: [PATCH 2/2] add contiguous option to metis --- src/simulation/config.rs | 17 ++++++++++++++++- src/simulation/network/metis_partitioning.rs | 19 ++++++++++++------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/simulation/config.rs b/src/simulation/config.rs index 9c35c3e..3cca418 100644 --- a/src/simulation/config.rs +++ b/src/simulation/config.rs @@ -268,6 +268,8 @@ pub struct MetisOptions { pub imbalance_factor: f32, #[serde(default = "u32_value_100")] pub iteration_number: u32, + #[serde(default = "bool_value_true")] + pub contiguous: bool, } #[derive(PartialEq, Debug, ValueEnum, Clone, Copy, Serialize, Deserialize)] @@ -291,6 +293,7 @@ impl Default for MetisOptions { edge_weight: EdgeWeight::Constant, imbalance_factor: 0.03, iteration_number: 10, + contiguous: true, } } } @@ -323,6 +326,11 @@ impl MetisOptions { }; val } + + pub fn set_contiguous(mut self, contiguous: bool) -> Self { + self.contiguous = contiguous; + self + } } fn f32_value_0_03() -> f32 { @@ -337,6 +345,10 @@ fn u32_value_100() -> u32 { 100 } +fn bool_value_true() -> bool { + true +} + fn default_vertex_weight() -> Vec { vec![InLinkCapacity] } @@ -363,6 +375,7 @@ mod tests { edge_weight: EdgeWeight::Constant, imbalance_factor: 1.02, iteration_number: 100, + contiguous: true, }), }; config @@ -385,6 +398,7 @@ mod tests { edge_weight: EdgeWeight::Constant, imbalance_factor: 1.02, iteration_number: 100, + contiguous: true, }) ); } @@ -424,7 +438,8 @@ mod tests { vertex_weight: vec![VertexWeight::InLinkCount], edge_weight: EdgeWeight::Capacity, imbalance_factor: 1.1, - iteration_number: 100 + iteration_number: 100, + contiguous: true, }) ); } diff --git a/src/simulation/network/metis_partitioning.rs b/src/simulation/network/metis_partitioning.rs index c6e32ca..f03b7f9 100644 --- a/src/simulation/network/metis_partitioning.rs +++ b/src/simulation/network/metis_partitioning.rs @@ -49,7 +49,7 @@ pub fn partition(network: &Network, num_parts: u32, options: MetisOptions) -> Ve let mut graph = Graph::new(ncon, num_parts as Idx, &mut xadj, &mut adjncy) .set_option(metis::option::UFactor(options.ufactor() as Idx)) .set_option(metis::option::Seed(4711)) - .set_option(metis::option::Contig(true)) + .set_option(metis::option::Contig(options.contiguous)) .set_adjwgt(&mut adjwgt); if !vwgt.is_empty() { @@ -125,7 +125,7 @@ mod tests { let network = Network::from_file( "./assets/andorra-network.xml.gz", 5, - PartitionMethod::Metis(MetisOptions::default()), + PartitionMethod::Metis(MetisOptions::default().set_contiguous(false)), ); println!("=== Default ==="); let _node_count = node_count(&network); @@ -140,7 +140,8 @@ mod tests { PartitionMethod::Metis( MetisOptions::default() .add_vertex_weight(VertexWeight::InLinkCapacity) - .set_imbalance_factor(0.), + .set_imbalance_factor(0.) + .set_contiguous(false), ), ); println!("=== Capacity ==="); @@ -156,7 +157,8 @@ mod tests { PartitionMethod::Metis( MetisOptions::default() .add_vertex_weight(VertexWeight::InLinkCount) - .set_imbalance_factor(0.), + .set_imbalance_factor(0.) + .set_contiguous(false), ), ); println!("=== InLinkCount ==="); @@ -173,7 +175,8 @@ mod tests { MetisOptions::default() .add_vertex_weight(VertexWeight::InLinkCapacity) .add_vertex_weight(VertexWeight::InLinkCount) - .set_imbalance_factor(0.), + .set_imbalance_factor(0.) + .set_contiguous(false), ), ); println!("=== Capacity & InLinkCount ==="); @@ -189,7 +192,8 @@ mod tests { PartitionMethod::Metis( MetisOptions::default() .add_vertex_weight(VertexWeight::Constant) - .set_imbalance_factor(0.), + .set_imbalance_factor(0.) + .set_contiguous(false), ), ); println!("=== Constant Vertex ==="); @@ -207,7 +211,8 @@ mod tests { .add_vertex_weight(VertexWeight::Constant) .add_vertex_weight(VertexWeight::InLinkCount) .set_imbalance_factor(0.) - .set_iteration_number(100), + .set_iteration_number(100) + .set_contiguous(false), ), ); println!("=== Constant Vertex & InLinkCount ===");