From 4bfc775dd83dab6ddc3a254a00ad739ed44f5107 Mon Sep 17 00:00:00 2001 From: Jerry Guo Date: Tue, 20 Aug 2024 15:08:34 +0200 Subject: [PATCH 1/5] init Signed-off-by: Jerry Guo From db8e33f0b842b6eab61f0bb1ae30ef2c72f9cf54 Mon Sep 17 00:00:00 2001 From: Jerry Guo Date: Tue, 20 Aug 2024 16:13:37 +0200 Subject: [PATCH 2/5] updated transformer rank algorithm; updated tests; updated doc Signed-off-by: Jerry Guo --- docs/user_manual/calculations.md | 2 +- .../optimizer/tap_position_optimizer.hpp | 15 +++++++++------ .../test_tap_position_optimizer.cpp | 6 +++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/docs/user_manual/calculations.md b/docs/user_manual/calculations.md index e715d3af6..397c0058b 100644 --- a/docs/user_manual/calculations.md +++ b/docs/user_manual/calculations.md @@ -600,7 +600,7 @@ Power flow calculations that take the behavior of these regulators into account The following control logic is used: -- Regulated transformers are ranked according to how close they are to {hoverxreftooltip}`sources ` in terms of the amount of transformers inbetween. +- Regulated transformers are ranked according to how close they are to {hoverxreftooltip}`sources ` in terms of the amount of regulated transformers inbetween. - Transformers are regulated in order according to their ranks. - Initialize all transformers to their starting tap position (see {hoverxreftooltip}`user_manual/calculations:Initialization and exploitation of regulated transformers`) - Find the optimal state using the following procedure diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/optimizer/tap_position_optimizer.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/optimizer/tap_position_optimizer.hpp index ad72863c0..5893ce5d3 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/optimizer/tap_position_optimizer.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/optimizer/tap_position_optimizer.hpp @@ -113,11 +113,14 @@ inline void process_trafo3w_edge(main_core::main_model_state_c auto const& state auto const& non_tap_side_node = tap_at_first_side ? to_node : from_node; // add regulated idx only when the first side node is tap side node. // This is done to add only one directional edge with regulated idx. - Idx2D const regulated_idx = from_node == tap_side_node ? unregulated_idx : trafo3w_idx; - add_to_edge(state, edges, edge_props, tap_side_node, non_tap_side_node, {regulated_idx, 1}); + if (from_node == tap_side_node) { + add_to_edge(state, edges, edge_props, tap_side_node, non_tap_side_node, {unregulated_idx, 0}); + } else { + add_to_edge(state, edges, edge_props, tap_side_node, non_tap_side_node, {trafo3w_idx, 1}); + } } else { - add_to_edge(state, edges, edge_props, from_node, to_node, {unregulated_idx, 1}); - add_to_edge(state, edges, edge_props, to_node, from_node, {unregulated_idx, 1}); + add_to_edge(state, edges, edge_props, from_node, to_node, {unregulated_idx, 0}); + add_to_edge(state, edges, edge_props, to_node, from_node, {unregulated_idx, 0}); } } } @@ -154,8 +157,8 @@ constexpr void add_edge(main_core::MainModelState const& sta add_to_edge(state, edges, edge_props, tap_side_node, non_tap_side_node, {main_core::get_component_idx_by_id(state, transformer.id()), 1}); } else { - add_to_edge(state, edges, edge_props, from_node, to_node, {unregulated_idx, 1}); - add_to_edge(state, edges, edge_props, to_node, from_node, {unregulated_idx, 1}); + add_to_edge(state, edges, edge_props, from_node, to_node, {unregulated_idx, 0}); + add_to_edge(state, edges, edge_props, to_node, from_node, {unregulated_idx, 0}); } } } diff --git a/tests/cpp_unit_tests/test_tap_position_optimizer.cpp b/tests/cpp_unit_tests/test_tap_position_optimizer.cpp index 4f541fe1e..7169949ad 100644 --- a/tests/cpp_unit_tests/test_tap_position_optimizer.cpp +++ b/tests/cpp_unit_tests/test_tap_position_optimizer.cpp @@ -231,7 +231,7 @@ TEST_CASE("Test Transformer ranking") { expected_edges_prop.insert(expected_edges_prop.end(), {{{3, 0}, 1}, {{3, 1}, 1}, {{3, 2}, 1}, {{3, 3}, 1}, {{3, 4}, 1}}); expected_edges_prop.insert(expected_edges_prop.end(), - {{{4, 0}, 1}, {unregulated_idx, 1}, {unregulated_idx, 1}, {unregulated_idx, 1}}); + {{{4, 0}, 1}, {unregulated_idx, 0}, {unregulated_idx, 0}, {unregulated_idx, 0}}); expected_edges_prop.insert(expected_edges_prop.end(), 10, {unregulated_idx, 0}); std::vector const expected_vertex_props{ @@ -329,8 +329,8 @@ TEST_CASE("Test Transformer ranking") { SUBCASE("Ranking complete the graph") { pgm_tap::RankedTransformerGroups order = pgm_tap::rank_transformers(state); - pgm_tap::RankedTransformerGroups const ref_order{{Idx2D{3, 0}, Idx2D{3, 1}, Idx2D{4, 0}}, - {Idx2D{3, 3}, Idx2D{3, 2}, Idx2D{3, 4}}}; + pgm_tap::RankedTransformerGroups const ref_order{ + {Idx2D{3, 0}, Idx2D{3, 1}, Idx2D{4, 0}, Idx2D{3, 3}, Idx2D{3, 2}, Idx2D{3, 4}}}; CHECK(order == ref_order); } } From 66d668346de94935a14f159c253ba797c62bb204 Mon Sep 17 00:00:00 2001 From: Jerry Guo Date: Thu, 14 Nov 2024 09:16:13 +0100 Subject: [PATCH 3/5] address comments Signed-off-by: Jerry Guo --- .../optimizer/tap_position_optimizer.hpp | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/optimizer/tap_position_optimizer.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/optimizer/tap_position_optimizer.hpp index 756e89912..cf17ffbdc 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/optimizer/tap_position_optimizer.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/optimizer/tap_position_optimizer.hpp @@ -42,7 +42,6 @@ using RankedTransformerGroups = std::vector>; constexpr auto infty = std::numeric_limits::max(); constexpr Idx2D unregulated_idx = {-1, -1}; - struct TrafoGraphVertex { bool is_source{}; }; @@ -66,6 +65,7 @@ struct TrafoGraphEdge { } }; +constexpr TrafoGraphEdge unregulated_edge_prop = {unregulated_idx, 0}; using TrafoGraphEdges = std::vector>; using TrafoGraphEdgeProperties = std::vector; @@ -113,14 +113,11 @@ inline void process_trafo3w_edge(main_core::main_model_state_c auto const& state auto const& non_tap_side_node = tap_at_first_side ? to_node : from_node; // add regulated idx only when the first side node is tap side node. // This is done to add only one directional edge with regulated idx. - if (from_node == tap_side_node) { - add_to_edge(state, edges, edge_props, tap_side_node, non_tap_side_node, {unregulated_idx, 0}); - } else { - add_to_edge(state, edges, edge_props, tap_side_node, non_tap_side_node, {trafo3w_idx, 1}); - } + TrafoGraphEdge const edge_value = (from_node == tap_side_node) ? unregulated_edge_prop : {trafo3w_idx, 1}; + add_to_edge(state, edges, edge_props, tap_side_node, non_tap_side_node, edge_value); } else { - add_to_edge(state, edges, edge_props, from_node, to_node, {unregulated_idx, 0}); - add_to_edge(state, edges, edge_props, to_node, from_node, {unregulated_idx, 0}); + add_to_edge(state, edges, edge_props, from_node, to_node, unregulated_edge_prop); + add_to_edge(state, edges, edge_props, to_node, from_node, unregulated_edge_prop); } } } @@ -156,8 +153,8 @@ constexpr void add_edge(main_core::MainModelState const& sta add_to_edge(state, edges, edge_props, tap_side_node, non_tap_side_node, {main_core::get_component_idx_by_id(state, transformer.id()), 1}); } else { - add_to_edge(state, edges, edge_props, from_node, to_node, {unregulated_idx, 0}); - add_to_edge(state, edges, edge_props, to_node, from_node, {unregulated_idx, 0}); + add_to_edge(state, edges, edge_props, from_node, to_node, unregulated_edge_prop); + add_to_edge(state, edges, edge_props, to_node, from_node, unregulated_edge_prop); } } } @@ -175,8 +172,8 @@ constexpr void add_edge(main_core::MainModelState const& sta if (!branch.from_status() || !branch.to_status()) { continue; } - add_to_edge(state, edges, edge_props, branch.from_node(), branch.to_node(), {unregulated_idx, 0}); - add_to_edge(state, edges, edge_props, branch.to_node(), branch.from_node(), {unregulated_idx, 0}); + add_to_edge(state, edges, edge_props, branch.from_node(), branch.to_node(), unregulated_edge_prop); + add_to_edge(state, edges, edge_props, branch.to_node(), branch.from_node(), unregulated_edge_prop); } } From 4d390d5f86d42b569b0892f753d25d550410c804 Mon Sep 17 00:00:00 2001 From: Jerry Guo Date: Thu, 14 Nov 2024 09:17:29 +0100 Subject: [PATCH 4/5] minor Signed-off-by: Jerry Guo --- .../power_grid_model/optimizer/tap_position_optimizer.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/optimizer/tap_position_optimizer.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/optimizer/tap_position_optimizer.hpp index cf17ffbdc..95841500b 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/optimizer/tap_position_optimizer.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/optimizer/tap_position_optimizer.hpp @@ -113,7 +113,7 @@ inline void process_trafo3w_edge(main_core::main_model_state_c auto const& state auto const& non_tap_side_node = tap_at_first_side ? to_node : from_node; // add regulated idx only when the first side node is tap side node. // This is done to add only one directional edge with regulated idx. - TrafoGraphEdge const edge_value = (from_node == tap_side_node) ? unregulated_edge_prop : {trafo3w_idx, 1}; + auto const edge_value = (from_node == tap_side_node) ? unregulated_edge_prop : TrafoGraphEdge{trafo3w_idx, 1}; add_to_edge(state, edges, edge_props, tap_side_node, non_tap_side_node, edge_value); } else { add_to_edge(state, edges, edge_props, from_node, to_node, unregulated_edge_prop); From 6b9814689eb9fc9b080c4a3f49b203c40b2a2fff Mon Sep 17 00:00:00 2001 From: Jerry Guo Date: Thu, 14 Nov 2024 09:41:28 +0100 Subject: [PATCH 5/5] f formatter Signed-off-by: Jerry Guo --- .../power_grid_model/optimizer/tap_position_optimizer.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/optimizer/tap_position_optimizer.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/optimizer/tap_position_optimizer.hpp index 95841500b..599380d42 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/optimizer/tap_position_optimizer.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/optimizer/tap_position_optimizer.hpp @@ -113,7 +113,8 @@ inline void process_trafo3w_edge(main_core::main_model_state_c auto const& state auto const& non_tap_side_node = tap_at_first_side ? to_node : from_node; // add regulated idx only when the first side node is tap side node. // This is done to add only one directional edge with regulated idx. - auto const edge_value = (from_node == tap_side_node) ? unregulated_edge_prop : TrafoGraphEdge{trafo3w_idx, 1}; + auto const edge_value = + (from_node == tap_side_node) ? unregulated_edge_prop : TrafoGraphEdge{trafo3w_idx, 1}; add_to_edge(state, edges, edge_props, tap_side_node, non_tap_side_node, edge_value); } else { add_to_edge(state, edges, edge_props, from_node, to_node, unregulated_edge_prop);