From e6728db46e02203b52fa2bf484e8ccde4cfc53a0 Mon Sep 17 00:00:00 2001 From: Nitish Bharambe Date: Tue, 19 Aug 2025 14:13:16 +0200 Subject: [PATCH 01/17] move construct topology Signed-off-by: Nitish Bharambe --- .../power_grid_model/main_core/topology.hpp | 42 +++++++++++++++++ .../power_grid_model/main_model_impl.hpp | 45 +------------------ 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/topology.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/topology.hpp index 745e5f1dc3..ce098c7849 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/topology.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/topology.hpp @@ -191,4 +191,46 @@ constexpr void register_topology_components(MainModelState c }); } +ComponentTopology construct_topology(main_model_state_c auto const& state) { + ComponentTopology comp_topo; + register_topology_components(state, comp_topo); + register_topology_components(state, comp_topo); + register_topology_components(state, comp_topo); + register_topology_components(state, comp_topo); + register_topology_components(state, comp_topo); + register_topology_components(state, comp_topo); + register_topology_components(state, comp_topo); + register_topology_components(state, comp_topo); + register_topology_components(state, comp_topo); + register_topology_components(state, comp_topo); + return comp_topo; +} + +ComponentConnections construct_components_connections(main_model_state_c auto const& state) { + ComponentConnections comp_conn; + comp_conn.branch_connected.resize(state.comp_topo->branch_node_idx.size()); + comp_conn.branch_phase_shift.resize(state.comp_topo->branch_node_idx.size()); + comp_conn.branch3_connected.resize(state.comp_topo->branch3_node_idx.size()); + comp_conn.branch3_phase_shift.resize(state.comp_topo->branch3_node_idx.size()); + comp_conn.source_connected.resize(state.comp_topo->source_node_idx.size()); + std::transform(state.components.template citer().begin(), state.components.template citer().end(), + comp_conn.branch_connected.begin(), [](Branch const& branch) { + return BranchConnected{static_cast(branch.from_status()), + static_cast(branch.to_status())}; + }); + std::transform(state.components.template citer().begin(), state.components.template citer().end(), + comp_conn.branch_phase_shift.begin(), [](Branch const& branch) { return branch.phase_shift(); }); + std::transform(state.components.template citer().begin(), state.components.template citer().end(), + comp_conn.branch3_connected.begin(), [](Branch3 const& branch3) { + return Branch3Connected{static_cast(branch3.status_1()), + static_cast(branch3.status_2()), + static_cast(branch3.status_3())}; + }); + std::transform(state.components.template citer().begin(), state.components.template citer().end(), + comp_conn.branch3_phase_shift.begin(), [](Branch3 const& branch3) { return branch3.phase_shift(); }); + std::transform(state.components.template citer().begin(), state.components.template citer().end(), + comp_conn.source_connected.begin(), [](Source const& source) { return source.status(); }); + return comp_conn; +} + } // namespace power_grid_model::main_core diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/main_model_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/main_model_impl.hpp index f28e27892e..636e44bec8 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/main_model_impl.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/main_model_impl.hpp @@ -314,22 +314,7 @@ class MainModelImpl, ComponentLis construction_complete_ = true; #endif // !NDEBUG state_.components.set_construction_complete(); - construct_topology(); - } - - void construct_topology() { - ComponentTopology comp_topo; - main_core::register_topology_components(state_, comp_topo); - main_core::register_topology_components(state_, comp_topo); - main_core::register_topology_components(state_, comp_topo); - main_core::register_topology_components(state_, comp_topo); - main_core::register_topology_components(state_, comp_topo); - main_core::register_topology_components(state_, comp_topo); - main_core::register_topology_components(state_, comp_topo); - main_core::register_topology_components(state_, comp_topo); - main_core::register_topology_components(state_, comp_topo); - main_core::register_topology_components(state_, comp_topo); - state_.comp_topo = std::make_shared(std::move(comp_topo)); + state_.comp_topo = std::make_shared(main_core::construct_topology(state_)); } void reset_solvers() { @@ -652,33 +637,7 @@ class MainModelImpl, ComponentLis assert(construction_complete_); // clear old solvers reset_solvers(); - // get connection info - ComponentConnections comp_conn; - comp_conn.branch_connected.resize(state_.comp_topo->branch_node_idx.size()); - comp_conn.branch_phase_shift.resize(state_.comp_topo->branch_node_idx.size()); - comp_conn.branch3_connected.resize(state_.comp_topo->branch3_node_idx.size()); - comp_conn.branch3_phase_shift.resize(state_.comp_topo->branch3_node_idx.size()); - comp_conn.source_connected.resize(state_.comp_topo->source_node_idx.size()); - std::transform( - state_.components.template citer().begin(), state_.components.template citer().end(), - comp_conn.branch_connected.begin(), [](Branch const& branch) { - return BranchConnected{static_cast(branch.from_status()), static_cast(branch.to_status())}; - }); - std::transform(state_.components.template citer().begin(), - state_.components.template citer().end(), comp_conn.branch_phase_shift.begin(), - [](Branch const& branch) { return branch.phase_shift(); }); - std::transform( - state_.components.template citer().begin(), state_.components.template citer().end(), - comp_conn.branch3_connected.begin(), [](Branch3 const& branch3) { - return Branch3Connected{static_cast(branch3.status_1()), static_cast(branch3.status_2()), - static_cast(branch3.status_3())}; - }); - std::transform(state_.components.template citer().begin(), - state_.components.template citer().end(), comp_conn.branch3_phase_shift.begin(), - [](Branch3 const& branch3) { return branch3.phase_shift(); }); - std::transform(state_.components.template citer().begin(), - state_.components.template citer().end(), comp_conn.source_connected.begin(), - [](Source const& source) { return source.status(); }); + ComponentConnections comp_conn = main_core::construct_components_connections(state_); // re build Topology topology{*state_.comp_topo, comp_conn}; std::tie(state_.math_topology, state_.topo_comp_coup) = topology.build_topology(); From 0c065eaaeedce9fb7dcce686bb5cf1bacb2200ff Mon Sep 17 00:00:00 2001 From: Nitish Bharambe Date: Tue, 19 Aug 2025 22:30:54 +0200 Subject: [PATCH 02/17] address sonar cloud Signed-off-by: Nitish Bharambe --- .../power_grid_model/main_core/topology.hpp | 36 ++++++++++--------- .../power_grid_model/main_model_impl.hpp | 2 +- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/topology.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/topology.hpp index ce098c7849..1113a9f134 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/topology.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/topology.hpp @@ -213,23 +213,25 @@ ComponentConnections construct_components_connections(main_model_state_c auto co comp_conn.branch3_connected.resize(state.comp_topo->branch3_node_idx.size()); comp_conn.branch3_phase_shift.resize(state.comp_topo->branch3_node_idx.size()); comp_conn.source_connected.resize(state.comp_topo->source_node_idx.size()); - std::transform(state.components.template citer().begin(), state.components.template citer().end(), - comp_conn.branch_connected.begin(), [](Branch const& branch) { - return BranchConnected{static_cast(branch.from_status()), - static_cast(branch.to_status())}; - }); - std::transform(state.components.template citer().begin(), state.components.template citer().end(), - comp_conn.branch_phase_shift.begin(), [](Branch const& branch) { return branch.phase_shift(); }); - std::transform(state.components.template citer().begin(), state.components.template citer().end(), - comp_conn.branch3_connected.begin(), [](Branch3 const& branch3) { - return Branch3Connected{static_cast(branch3.status_1()), - static_cast(branch3.status_2()), - static_cast(branch3.status_3())}; - }); - std::transform(state.components.template citer().begin(), state.components.template citer().end(), - comp_conn.branch3_phase_shift.begin(), [](Branch3 const& branch3) { return branch3.phase_shift(); }); - std::transform(state.components.template citer().begin(), state.components.template citer().end(), - comp_conn.source_connected.begin(), [](Source const& source) { return source.status(); }); + std::ranges::transform( + state.components.template citer(), comp_conn.branch_connected.begin(), [](Branch const& branch) { + return BranchConnected{static_cast(branch.from_status()), static_cast(branch.to_status())}; + }); + + std::ranges::transform(state.components.template citer(), comp_conn.branch_phase_shift.begin(), + [](Branch const& branch) { return branch.phase_shift(); }); + + std::ranges::transform( + state.components.template citer(), comp_conn.branch3_connected.begin(), [](Branch3 const& branch3) { + return Branch3Connected{static_cast(branch3.status_1()), static_cast(branch3.status_2()), + static_cast(branch3.status_3())}; + }); + + std::ranges::transform(state.components.template citer(), comp_conn.branch3_phase_shift.begin(), + [](Branch3 const& branch3) { return branch3.phase_shift(); }); + + std::ranges::transform(state.components.template citer(), comp_conn.source_connected.begin(), + [](Source const& source) { return source.status(); }); return comp_conn; } diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/main_model_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/main_model_impl.hpp index 636e44bec8..79f44edbd6 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/main_model_impl.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/main_model_impl.hpp @@ -637,7 +637,7 @@ class MainModelImpl, ComponentLis assert(construction_complete_); // clear old solvers reset_solvers(); - ComponentConnections comp_conn = main_core::construct_components_connections(state_); + ComponentConnections const comp_conn = main_core::construct_components_connections(state_); // re build Topology topology{*state_.comp_topo, comp_conn}; std::tie(state_.math_topology, state_.topo_comp_coup) = topology.build_topology(); From df0dcbff77db9bbdda6fe6ee77e074a047b6f156 Mon Sep 17 00:00:00 2001 From: Nitish Bharambe Date: Tue, 19 Aug 2025 22:40:00 +0200 Subject: [PATCH 03/17] decouple topology related state queries Signed-off-by: Nitish Bharambe --- .../power_grid_model/main_core/state.hpp | 7 +++ .../main_core/state_queries.hpp | 17 ++++++++ .../power_grid_model/main_core/topology.hpp | 43 ++++++++++--------- 3 files changed, 46 insertions(+), 21 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/state.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/state.hpp index 94062f430d..c19c5003b1 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/state.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/state.hpp @@ -37,6 +37,13 @@ concept component_container_c = requires(ContainerType const& c, ID id) { { c.template get_item(id) } -> std::convertible_to; }; +template +concept extended_component_container_c = + component_container_c && requires(ContainerType const& c, Idx2D const& idx2d) { + { c.template size() } -> std::same_as; + { c.template get_seq(idx2d) } -> std::same_as; + }; + template