Skip to content

Commit df0dcbf

Browse files
committed
decouple topology related state queries
Signed-off-by: Nitish Bharambe <[email protected]>
1 parent 0c065ea commit df0dcbf

File tree

3 files changed

+46
-21
lines changed

3 files changed

+46
-21
lines changed

power_grid_model_c/power_grid_model/include/power_grid_model/main_core/state.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ concept component_container_c = requires(ContainerType const& c, ID id) {
3737
{ c.template get_item<ComponentType>(id) } -> std::convertible_to<ComponentType const&>;
3838
};
3939

40+
template <typename ContainerType, typename ComponentType>
41+
concept extended_component_container_c =
42+
component_container_c<ContainerType, ComponentType> && requires(ContainerType const& c, Idx2D const& idx2d) {
43+
{ c.template size<ComponentType>() } -> std::same_as<Idx>;
44+
{ c.template get_seq<ComponentType>(idx2d) } -> std::same_as<Idx>;
45+
};
46+
4047
template <template <typename T> class StateType, typename ContainerType, typename ComponentType>
4148
concept model_component_state_c =
4249
component_container_c<typename StateType<ContainerType>::ComponentContainer, ComponentType> &&

power_grid_model_c/power_grid_model/include/power_grid_model/main_core/state_queries.hpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,23 @@
99
#include "../all_components.hpp"
1010

1111
namespace power_grid_model::main_core {
12+
13+
// using only components and not state
14+
15+
template <typename ComponentType, class ComponentContainer>
16+
requires extended_component_container_c<ComponentContainer, ComponentType>
17+
constexpr auto get_component_size(ComponentContainer const& components) {
18+
return components.template size<ComponentType>();
19+
}
20+
21+
template <typename ComponentType, class ComponentContainer>
22+
requires extended_component_container_c<ComponentContainer, ComponentType>
23+
inline Idx get_component_sequence_idx(ComponentContainer const& components, auto const& id_or_index) {
24+
return components.template get_seq<ComponentType>(id_or_index);
25+
}
26+
27+
// existing implementation
28+
1229
template <typename ComponentType, class ComponentContainer>
1330
requires model_component_state_c<MainModelState, ComponentContainer, ComponentType>
1431
inline Idx get_component_type_index(MainModelState<ComponentContainer> const& state) {

power_grid_model_c/power_grid_model/include/power_grid_model/main_core/topology.hpp

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,16 @@ template <std::same_as<Node> Component, class ComponentContainer>
3232
requires model_component_state_c<MainModelState, ComponentContainer, Component>
3333
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
3434
ComponentTopology& comp_topo) {
35-
comp_topo.n_node = get_component_size<Node>(state);
35+
comp_topo.n_node = get_component_size<Node>(state.components);
3636
}
3737

3838
template <std::same_as<Branch> Component, class ComponentContainer>
3939
requires model_component_state_c<MainModelState, ComponentContainer, Component>
4040
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
4141
ComponentTopology& comp_topo) {
4242
detail::register_topo_components<Component>(state, comp_topo.branch_node_idx, [&state](Branch const& branch) {
43-
return BranchIdx{get_component_sequence_idx<Node>(state, branch.from_node()),
44-
get_component_sequence_idx<Node>(state, branch.to_node())};
43+
return BranchIdx{get_component_sequence_idx<Node>(state.components, branch.from_node()),
44+
get_component_sequence_idx<Node>(state.components, branch.to_node())};
4545
});
4646
}
4747

@@ -50,9 +50,9 @@ template <std::same_as<Branch3> Component, class ComponentContainer>
5050
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
5151
ComponentTopology& comp_topo) {
5252
detail::register_topo_components<Component>(state, comp_topo.branch3_node_idx, [&state](Branch3 const& branch3) {
53-
return Branch3Idx{get_component_sequence_idx<Node>(state, branch3.node_1()),
54-
get_component_sequence_idx<Node>(state, branch3.node_2()),
55-
get_component_sequence_idx<Node>(state, branch3.node_3())};
53+
return Branch3Idx{get_component_sequence_idx<Node>(state.components, branch3.node_1()),
54+
get_component_sequence_idx<Node>(state.components, branch3.node_2()),
55+
get_component_sequence_idx<Node>(state.components, branch3.node_3())};
5656
});
5757
}
5858

@@ -61,7 +61,7 @@ template <std::same_as<Source> Component, class ComponentContainer>
6161
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
6262
ComponentTopology& comp_topo) {
6363
detail::register_topo_components<Component>(state, comp_topo.source_node_idx, [&state](Source const& source) {
64-
return get_component_sequence_idx<Node>(state, source.node());
64+
return get_component_sequence_idx<Node>(state.components, source.node());
6565
});
6666
}
6767

@@ -70,7 +70,7 @@ template <std::same_as<Shunt> Component, class ComponentContainer>
7070
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
7171
ComponentTopology& comp_topo) {
7272
detail::register_topo_components<Component>(state, comp_topo.shunt_node_idx, [&state](Shunt const& shunt) {
73-
return get_component_sequence_idx<Node>(state, shunt.node());
73+
return get_component_sequence_idx<Node>(state.components, shunt.node());
7474
});
7575
}
7676

@@ -79,8 +79,9 @@ template <std::same_as<GenericLoadGen> Component, class ComponentContainer>
7979
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
8080
ComponentTopology& comp_topo) {
8181
detail::register_topo_components<Component>(
82-
state, comp_topo.load_gen_node_idx,
83-
[&state](GenericLoadGen const& load_gen) { return get_component_sequence_idx<Node>(state, load_gen.node()); });
82+
state, comp_topo.load_gen_node_idx, [&state](GenericLoadGen const& load_gen) {
83+
return get_component_sequence_idx<Node>(state.components, load_gen.node());
84+
});
8485

8586
detail::register_topo_components<Component>(state, comp_topo.load_gen_type,
8687
[](GenericLoadGen const& load_gen) { return load_gen.type(); });
@@ -92,7 +93,7 @@ constexpr void register_topology_components(MainModelState<ComponentContainer> c
9293
ComponentTopology& comp_topo) {
9394
detail::register_topo_components<Component>(
9495
state, comp_topo.voltage_sensor_node_idx, [&state](GenericVoltageSensor const& voltage_sensor) {
95-
return get_component_sequence_idx<Node>(state, voltage_sensor.measured_object());
96+
return get_component_sequence_idx<Node>(state.components, voltage_sensor.measured_object());
9697
});
9798
}
9899

@@ -110,23 +111,23 @@ constexpr void register_topology_components(MainModelState<ComponentContainer> c
110111
case branch_from:
111112
[[fallthrough]];
112113
case branch_to:
113-
return get_component_sequence_idx<Branch>(state, measured_object);
114+
return get_component_sequence_idx<Branch>(state.components, measured_object);
114115
case source:
115-
return get_component_sequence_idx<Source>(state, measured_object);
116+
return get_component_sequence_idx<Source>(state.components, measured_object);
116117
case shunt:
117-
return get_component_sequence_idx<Shunt>(state, measured_object);
118+
return get_component_sequence_idx<Shunt>(state.components, measured_object);
118119
case load:
119120
[[fallthrough]];
120121
case generator:
121-
return get_component_sequence_idx<GenericLoadGen>(state, measured_object);
122+
return get_component_sequence_idx<GenericLoadGen>(state.components, measured_object);
122123
case branch3_1:
123124
[[fallthrough]];
124125
case branch3_2:
125126
[[fallthrough]];
126127
case branch3_3:
127-
return get_component_sequence_idx<Branch3>(state, measured_object);
128+
return get_component_sequence_idx<Branch3>(state.components, measured_object);
128129
case node:
129-
return get_component_sequence_idx<Node>(state, measured_object);
130+
return get_component_sequence_idx<Node>(state.components, measured_object);
130131
default:
131132
throw MissingCaseForEnumError("Power sensor idx to seq transformation",
132133
power_sensor.get_terminal_type());
@@ -152,13 +153,13 @@ constexpr void register_topology_components(MainModelState<ComponentContainer> c
152153
case branch_from:
153154
[[fallthrough]];
154155
case branch_to:
155-
return get_component_sequence_idx<Branch>(state, measured_object);
156+
return get_component_sequence_idx<Branch>(state.components, measured_object);
156157
case branch3_1:
157158
[[fallthrough]];
158159
case branch3_2:
159160
[[fallthrough]];
160161
case branch3_3:
161-
return get_component_sequence_idx<Branch3>(state, measured_object);
162+
return get_component_sequence_idx<Branch3>(state.components, measured_object);
162163
default:
163164
throw MissingCaseForEnumError("Current sensor idx to seq transformation",
164165
current_sensor.get_terminal_type());
@@ -178,9 +179,9 @@ constexpr void register_topology_components(MainModelState<ComponentContainer> c
178179
state, comp_topo.regulated_object_idx, [&state](Regulator const& regulator) {
179180
switch (regulator.regulated_object_type()) {
180181
case ComponentType::branch:
181-
return get_component_sequence_idx<Branch>(state, regulator.regulated_object());
182+
return get_component_sequence_idx<Branch>(state.components, regulator.regulated_object());
182183
case ComponentType::branch3:
183-
return get_component_sequence_idx<Branch3>(state, regulator.regulated_object());
184+
return get_component_sequence_idx<Branch3>(state.components, regulator.regulated_object());
184185
default:
185186
throw MissingCaseForEnumError("Regulator idx to seq transformation", regulator.regulated_object_type());
186187
}

0 commit comments

Comments
 (0)