Skip to content

Commit 3d29f46

Browse files
committed
shift to component container
Signed-off-by: Nitish Bharambe <[email protected]>
1 parent df0dcbf commit 3d29f46

File tree

2 files changed

+79
-83
lines changed

2 files changed

+79
-83
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ concept extended_component_container_c =
4444
{ c.template get_seq<ComponentType>(idx2d) } -> std::same_as<Idx>;
4545
};
4646

47+
template <typename ContainerType, typename... ComponentType>
48+
concept multi_extended_component_container_c = (extended_component_container_c<ContainerType, ComponentType> && ...);
49+
4750
template <template <typename T> class StateType, typename ContainerType, typename ComponentType>
4851
concept model_component_state_c =
4952
component_container_c<typename StateType<ContainerType>::ComponentContainer, ComponentType> &&

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

Lines changed: 76 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ namespace power_grid_model::main_core {
1414
namespace detail {
1515

1616
template <typename Component, class ComponentContainer, typename ResType, typename ResFunc>
17-
requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
17+
requires component_container_c<ComponentContainer, Component> &&
1818
std::invocable<std::remove_cvref_t<ResFunc>, Component const&> &&
1919
std::convertible_to<std::invoke_result_t<ResFunc, Component const&>, ResType>
20-
constexpr void register_topo_components(MainModelState<ComponentContainer> const& state, std::vector<ResType>& target,
20+
constexpr void register_topo_components(ComponentContainer const& components, std::vector<ResType>& target,
2121
ResFunc&& func) {
22-
auto const begin = get_component_citer<Component>(state).begin();
23-
auto const end = get_component_citer<Component>(state).end();
22+
auto const begin = components.template citer<Component>().begin();
23+
auto const end = components.template citer<Component>().end();
2424

2525
target.resize(std::distance(begin, end));
2626
std::transform(begin, end, target.begin(), std::forward<ResFunc>(func));
@@ -29,80 +29,75 @@ constexpr void register_topo_components(MainModelState<ComponentContainer> const
2929
} // namespace detail
3030

3131
template <std::same_as<Node> Component, class ComponentContainer>
32-
requires model_component_state_c<MainModelState, ComponentContainer, Component>
33-
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
34-
ComponentTopology& comp_topo) {
35-
comp_topo.n_node = get_component_size<Node>(state.components);
32+
requires component_container_c<ComponentContainer, Component>
33+
constexpr void register_topology_components(ComponentContainer const& components, ComponentTopology& comp_topo) {
34+
comp_topo.n_node = get_component_size<Node>(components);
3635
}
3736

3837
template <std::same_as<Branch> Component, class ComponentContainer>
39-
requires model_component_state_c<MainModelState, ComponentContainer, Component>
40-
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
41-
ComponentTopology& comp_topo) {
42-
detail::register_topo_components<Component>(state, comp_topo.branch_node_idx, [&state](Branch const& branch) {
43-
return BranchIdx{get_component_sequence_idx<Node>(state.components, branch.from_node()),
44-
get_component_sequence_idx<Node>(state.components, branch.to_node())};
45-
});
38+
requires multi_extended_component_container_c<ComponentContainer, Component, Node>
39+
constexpr void register_topology_components(ComponentContainer const& components, ComponentTopology& comp_topo) {
40+
detail::register_topo_components<Component>(
41+
components, comp_topo.branch_node_idx, [&components](Branch const& branch) {
42+
return BranchIdx{get_component_sequence_idx<Node>(components, branch.from_node()),
43+
get_component_sequence_idx<Node>(components, branch.to_node())};
44+
});
4645
}
4746

4847
template <std::same_as<Branch3> Component, class ComponentContainer>
49-
requires model_component_state_c<MainModelState, ComponentContainer, Component>
50-
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
51-
ComponentTopology& comp_topo) {
52-
detail::register_topo_components<Component>(state, comp_topo.branch3_node_idx, [&state](Branch3 const& branch3) {
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())};
56-
});
48+
requires multi_extended_component_container_c<ComponentContainer, Component, Node>
49+
constexpr void register_topology_components(ComponentContainer const& components, ComponentTopology& comp_topo) {
50+
detail::register_topo_components<Component>(
51+
components, comp_topo.branch3_node_idx, [&components](Branch3 const& branch3) {
52+
return Branch3Idx{get_component_sequence_idx<Node>(components, branch3.node_1()),
53+
get_component_sequence_idx<Node>(components, branch3.node_2()),
54+
get_component_sequence_idx<Node>(components, branch3.node_3())};
55+
});
5756
}
5857

5958
template <std::same_as<Source> Component, class ComponentContainer>
60-
requires model_component_state_c<MainModelState, ComponentContainer, Component>
61-
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
62-
ComponentTopology& comp_topo) {
63-
detail::register_topo_components<Component>(state, comp_topo.source_node_idx, [&state](Source const& source) {
64-
return get_component_sequence_idx<Node>(state.components, source.node());
65-
});
59+
requires multi_extended_component_container_c<ComponentContainer, Component, Node>
60+
constexpr void register_topology_components(ComponentContainer const& components, ComponentTopology& comp_topo) {
61+
detail::register_topo_components<Component>(
62+
components, comp_topo.source_node_idx,
63+
[&components](Source const& source) { return get_component_sequence_idx<Node>(components, source.node()); });
6664
}
6765

6866
template <std::same_as<Shunt> Component, class ComponentContainer>
69-
requires model_component_state_c<MainModelState, ComponentContainer, Component>
70-
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
71-
ComponentTopology& comp_topo) {
72-
detail::register_topo_components<Component>(state, comp_topo.shunt_node_idx, [&state](Shunt const& shunt) {
73-
return get_component_sequence_idx<Node>(state.components, shunt.node());
74-
});
67+
requires multi_extended_component_container_c<ComponentContainer, Component, Node>
68+
constexpr void register_topology_components(ComponentContainer const& components, ComponentTopology& comp_topo) {
69+
detail::register_topo_components<Component>(
70+
components, comp_topo.shunt_node_idx,
71+
[&components](Shunt const& shunt) { return get_component_sequence_idx<Node>(components, shunt.node()); });
7572
}
7673

7774
template <std::same_as<GenericLoadGen> Component, class ComponentContainer>
78-
requires model_component_state_c<MainModelState, ComponentContainer, Component>
79-
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
80-
ComponentTopology& comp_topo) {
75+
requires multi_extended_component_container_c<ComponentContainer, Component, Node>
76+
constexpr void register_topology_components(ComponentContainer const& components, ComponentTopology& comp_topo) {
8177
detail::register_topo_components<Component>(
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());
78+
components, comp_topo.load_gen_node_idx, [&components](GenericLoadGen const& load_gen) {
79+
return get_component_sequence_idx<Node>(components, load_gen.node());
8480
});
8581

86-
detail::register_topo_components<Component>(state, comp_topo.load_gen_type,
82+
detail::register_topo_components<Component>(components, comp_topo.load_gen_type,
8783
[](GenericLoadGen const& load_gen) { return load_gen.type(); });
8884
}
8985

9086
template <std::same_as<GenericVoltageSensor> Component, class ComponentContainer>
91-
requires model_component_state_c<MainModelState, ComponentContainer, Component>
92-
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
93-
ComponentTopology& comp_topo) {
87+
requires multi_extended_component_container_c<ComponentContainer, Component, Node>
88+
constexpr void register_topology_components(ComponentContainer const& components, ComponentTopology& comp_topo) {
9489
detail::register_topo_components<Component>(
95-
state, comp_topo.voltage_sensor_node_idx, [&state](GenericVoltageSensor const& voltage_sensor) {
96-
return get_component_sequence_idx<Node>(state.components, voltage_sensor.measured_object());
90+
components, comp_topo.voltage_sensor_node_idx, [&components](GenericVoltageSensor const& voltage_sensor) {
91+
return get_component_sequence_idx<Node>(components, voltage_sensor.measured_object());
9792
});
9893
}
9994

10095
template <std::same_as<GenericPowerSensor> Component, class ComponentContainer>
101-
requires model_component_state_c<MainModelState, ComponentContainer, Component>
102-
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
103-
ComponentTopology& comp_topo) {
96+
requires multi_extended_component_container_c<ComponentContainer, Component, Branch, Source, Shunt, GenericLoadGen,
97+
Branch3, Node>
98+
constexpr void register_topology_components(ComponentContainer const& components, ComponentTopology& comp_topo) {
10499
detail::register_topo_components<Component>(
105-
state, comp_topo.power_sensor_object_idx, [&state](GenericPowerSensor const& power_sensor) {
100+
components, comp_topo.power_sensor_object_idx, [&components](GenericPowerSensor const& power_sensor) {
106101
using enum MeasuredTerminalType;
107102

108103
auto const measured_object = power_sensor.measured_object();
@@ -111,40 +106,39 @@ constexpr void register_topology_components(MainModelState<ComponentContainer> c
111106
case branch_from:
112107
[[fallthrough]];
113108
case branch_to:
114-
return get_component_sequence_idx<Branch>(state.components, measured_object);
109+
return get_component_sequence_idx<Branch>(components, measured_object);
115110
case source:
116-
return get_component_sequence_idx<Source>(state.components, measured_object);
111+
return get_component_sequence_idx<Source>(components, measured_object);
117112
case shunt:
118-
return get_component_sequence_idx<Shunt>(state.components, measured_object);
113+
return get_component_sequence_idx<Shunt>(components, measured_object);
119114
case load:
120115
[[fallthrough]];
121116
case generator:
122-
return get_component_sequence_idx<GenericLoadGen>(state.components, measured_object);
117+
return get_component_sequence_idx<GenericLoadGen>(components, measured_object);
123118
case branch3_1:
124119
[[fallthrough]];
125120
case branch3_2:
126121
[[fallthrough]];
127122
case branch3_3:
128-
return get_component_sequence_idx<Branch3>(state.components, measured_object);
123+
return get_component_sequence_idx<Branch3>(components, measured_object);
129124
case node:
130-
return get_component_sequence_idx<Node>(state.components, measured_object);
125+
return get_component_sequence_idx<Node>(components, measured_object);
131126
default:
132127
throw MissingCaseForEnumError("Power sensor idx to seq transformation",
133128
power_sensor.get_terminal_type());
134129
}
135130
});
136131

137132
detail::register_topo_components<Component>(
138-
state, comp_topo.power_sensor_terminal_type,
133+
components, comp_topo.power_sensor_terminal_type,
139134
[](GenericPowerSensor const& power_sensor) { return power_sensor.get_terminal_type(); });
140135
}
141136

142137
template <std::same_as<GenericCurrentSensor> Component, class ComponentContainer>
143-
requires model_component_state_c<MainModelState, ComponentContainer, Component>
144-
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
145-
ComponentTopology& comp_topo) {
138+
requires multi_extended_component_container_c<ComponentContainer, Component, Branch, Branch3>
139+
constexpr void register_topology_components(ComponentContainer const& components, ComponentTopology& comp_topo) {
146140
detail::register_topo_components<Component>(
147-
state, comp_topo.current_sensor_object_idx, [&state](GenericCurrentSensor const& current_sensor) {
141+
components, comp_topo.current_sensor_object_idx, [&components](GenericCurrentSensor const& current_sensor) {
148142
using enum MeasuredTerminalType;
149143

150144
auto const measured_object = current_sensor.measured_object();
@@ -153,57 +147,56 @@ constexpr void register_topology_components(MainModelState<ComponentContainer> c
153147
case branch_from:
154148
[[fallthrough]];
155149
case branch_to:
156-
return get_component_sequence_idx<Branch>(state.components, measured_object);
150+
return get_component_sequence_idx<Branch>(components, measured_object);
157151
case branch3_1:
158152
[[fallthrough]];
159153
case branch3_2:
160154
[[fallthrough]];
161155
case branch3_3:
162-
return get_component_sequence_idx<Branch3>(state.components, measured_object);
156+
return get_component_sequence_idx<Branch3>(components, measured_object);
163157
default:
164158
throw MissingCaseForEnumError("Current sensor idx to seq transformation",
165159
current_sensor.get_terminal_type());
166160
}
167161
});
168162

169163
detail::register_topo_components<Component>(
170-
state, comp_topo.current_sensor_terminal_type,
164+
components, comp_topo.current_sensor_terminal_type,
171165
[](GenericCurrentSensor const& current_sensor) { return current_sensor.get_terminal_type(); });
172166
}
173167

174168
template <std::derived_from<Regulator> Component, class ComponentContainer>
175-
requires model_component_state_c<MainModelState, ComponentContainer, Component>
176-
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
177-
ComponentTopology& comp_topo) {
169+
requires multi_extended_component_container_c<ComponentContainer, Component, Branch, Branch3>
170+
constexpr void register_topology_components(ComponentContainer const& components, ComponentTopology& comp_topo) {
178171
detail::register_topo_components<Component>(
179-
state, comp_topo.regulated_object_idx, [&state](Regulator const& regulator) {
172+
components, comp_topo.regulated_object_idx, [&components](Regulator const& regulator) {
180173
switch (regulator.regulated_object_type()) {
181174
case ComponentType::branch:
182-
return get_component_sequence_idx<Branch>(state.components, regulator.regulated_object());
175+
return get_component_sequence_idx<Branch>(components, regulator.regulated_object());
183176
case ComponentType::branch3:
184-
return get_component_sequence_idx<Branch3>(state.components, regulator.regulated_object());
177+
return get_component_sequence_idx<Branch3>(components, regulator.regulated_object());
185178
default:
186179
throw MissingCaseForEnumError("Regulator idx to seq transformation", regulator.regulated_object_type());
187180
}
188181
});
189182

190-
detail::register_topo_components<Component>(state, comp_topo.regulated_object_type, [](Regulator const& regulator) {
191-
return regulator.regulated_object_type();
192-
});
183+
detail::register_topo_components<Component>(
184+
components, comp_topo.regulated_object_type,
185+
[](Regulator const& regulator) { return regulator.regulated_object_type(); });
193186
}
194187

195188
ComponentTopology construct_topology(main_model_state_c auto const& state) {
196189
ComponentTopology comp_topo;
197-
register_topology_components<Node>(state, comp_topo);
198-
register_topology_components<Branch>(state, comp_topo);
199-
register_topology_components<Branch3>(state, comp_topo);
200-
register_topology_components<Source>(state, comp_topo);
201-
register_topology_components<Shunt>(state, comp_topo);
202-
register_topology_components<GenericLoadGen>(state, comp_topo);
203-
register_topology_components<GenericVoltageSensor>(state, comp_topo);
204-
register_topology_components<GenericPowerSensor>(state, comp_topo);
205-
register_topology_components<GenericCurrentSensor>(state, comp_topo);
206-
register_topology_components<Regulator>(state, comp_topo);
190+
register_topology_components<Node>(state.components, comp_topo);
191+
register_topology_components<Branch>(state.components, comp_topo);
192+
register_topology_components<Branch3>(state.components, comp_topo);
193+
register_topology_components<Source>(state.components, comp_topo);
194+
register_topology_components<Shunt>(state.components, comp_topo);
195+
register_topology_components<GenericLoadGen>(state.components, comp_topo);
196+
register_topology_components<GenericVoltageSensor>(state.components, comp_topo);
197+
register_topology_components<GenericPowerSensor>(state.components, comp_topo);
198+
register_topology_components<GenericCurrentSensor>(state.components, comp_topo);
199+
register_topology_components<Regulator>(state.components, comp_topo);
207200
return comp_topo;
208201
}
209202

0 commit comments

Comments
 (0)