From 922feeca6fb8341bede422ef166e37d145ddeaf7 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Thu, 27 Aug 2026 09:12:21 +0200 Subject: [PATCH 1/2] performance bypass link solver if needed Signed-off-by: Martijn Govers --- .../main_core/topological_node_output.hpp | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/topological_node_output.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/topological_node_output.hpp index bc060310ae..206e04cfb5 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/topological_node_output.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/topological_node_output.hpp @@ -162,6 +162,10 @@ template requires std::invocable, ComplexVector> ComplexValueVector compute_link_solver(LinkSolver link_solver, SuperNodeSolverInput const& super_node_solver_input) { + if (std::ranges::empty(super_node_solver_input.links)) { + return {}; + } + if constexpr (is_symmetric_v) { return link_solver(super_node_solver_input.links | std::ranges::to(), super_node_solver_input.get_total_injection_per_node()); @@ -199,18 +203,15 @@ template std::same_as>>) std::vector get_link_output(ComplexValueVector const& link_solver_result) { - std::vector link_output; - link_output.reserve(link_solver_result.size()); - - for (auto const& result : link_solver_result) { - if constexpr (std::same_as>>) { - link_output.emplace_back(BranchSolverOutputType{.s_f = result, .s_t = -result}); - } else { - link_output.emplace_back(BranchSolverOutputType{.i_f = result, .i_t = -result}); - } - } - return link_output; + return link_solver_result | std::views::transform([](auto const& result) -> BranchSolverOutputType { + if constexpr (std::same_as>>) { + return BranchSolverOutputType{.s_f = result, .s_t = -result}; + } else { + return BranchSolverOutputType{.i_f = result, .i_t = -result}; + } + }) | + std::ranges::to(); } template From b0705063f7a9bc9e18d8330909ebe02592cdc32f Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Thu, 27 Aug 2026 09:49:34 +0200 Subject: [PATCH 2/2] fix tests Signed-off-by: Martijn Govers --- .../main_core/test_topological_node_output.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/cpp_unit_tests/main_core/test_topological_node_output.cpp b/tests/cpp_unit_tests/main_core/test_topological_node_output.cpp index b81337043e..ed1a55bcf6 100644 --- a/tests/cpp_unit_tests/main_core/test_topological_node_output.cpp +++ b/tests/cpp_unit_tests/main_core/test_topological_node_output.cpp @@ -524,12 +524,10 @@ TEST_CASE("Test topological node output") { auto const result = detail::solve_topological_nodes(std::ref(mock), state, math_output); - REQUIRE(mock.call_count == 2); + REQUIRE(mock.call_count == 1); CHECK(mock.recorded_edges[0] == links); - CHECK(mock.recorded_edges[1].empty()); CHECK(mock.recorded_loads[0] == ComplexVector{DoubleComplex{}, -dummy_complex_value_sym(), dummy_complex_value_sym()}); - CHECK(mock.recorded_loads[1] == ComplexVector{DoubleComplex{}}); REQUIRE(result.size() == 2); CHECK(result[0].bus_injection == @@ -558,12 +556,10 @@ TEST_CASE("Test topological node output") { auto const result = detail::solve_topological_nodes(std::ref(mock), state, math_output); - REQUIRE(mock.call_count == 2); + REQUIRE(mock.call_count == 1); CHECK(mock.recorded_edges[0] == links); - CHECK(mock.recorded_edges[1].empty()); CHECK(mock.recorded_loads[0] == ComplexVector{dummy_complex_value_sym(), -dummy_complex_value_sym(), DoubleComplex{}}); - CHECK(mock.recorded_loads[1] == ComplexVector{DoubleComplex{}}); REQUIRE(result.size() == 2); REQUIRE(result[0].link.size() == 2);