Skip to content

Commit 5b2e550

Browse files
authored
Merge pull request #1123 from PowerGridModel/feature/state-queries-to-container-queries
Cleanup main model: Move state queries to component queries
2 parents cf9d604 + 8ddcb14 commit 5b2e550

File tree

14 files changed

+337
-308
lines changed

14 files changed

+337
-308
lines changed

power_grid_model_c/power_grid_model/include/power_grid_model/container_fwd.hpp

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,42 @@ namespace power_grid_model::common {
1212

1313
namespace detail {
1414
template <typename ContainerType, typename RetrievableType>
15-
concept single_component_container_c = requires(ContainerType const& c, ID id, Idx2D idx2d) {
16-
{ c.template citer<RetrievableType>().begin() } -> std::forward_iterator;
17-
{ c.template citer<RetrievableType>().end() } -> std::forward_iterator;
18-
{ *(c.template citer<RetrievableType>().begin()) } -> std::same_as<RetrievableType const&>;
19-
{
20-
c.template citer<RetrievableType>().end()
21-
} -> std::same_as<decltype(c.template citer<RetrievableType>().begin())>;
22-
{ c.template get_item<RetrievableType>(id) } -> std::convertible_to<RetrievableType const&>;
23-
{ c.template size<RetrievableType>() } -> std::same_as<Idx>;
24-
{ c.template get_seq<RetrievableType>(idx2d) } -> std::same_as<Idx>;
25-
};
15+
concept single_component_container_c =
16+
ContainerType::template is_gettable_v<RetrievableType> &&
17+
requires(ContainerType const& c, ContainerType& nc, ID id, Idx idx, Idx2D idx2d) {
18+
{ c.template citer<RetrievableType>().begin() } -> std::forward_iterator;
19+
{ c.template citer<RetrievableType>().end() } -> std::forward_iterator;
20+
{ *(c.template citer<RetrievableType>().begin()) } -> std::same_as<RetrievableType const&>;
21+
{
22+
c.template citer<RetrievableType>().end()
23+
} -> std::same_as<decltype(c.template citer<RetrievableType>().begin())>;
24+
{ c.template size<RetrievableType>() } -> std::same_as<Idx>;
25+
{ c.template get_seq<RetrievableType>(idx2d) } -> std::same_as<Idx>;
26+
{ c.template get_idx_by_id<RetrievableType>(id) } -> std::same_as<Idx2D>;
27+
{ nc.template get_item<RetrievableType>(id) } -> std::same_as<RetrievableType&>;
28+
{ c.template get_item<RetrievableType>(id) } -> std::same_as<RetrievableType const&>;
29+
{ nc.template get_item_by_seq<RetrievableType>(idx) } -> std::same_as<RetrievableType&>;
30+
{ c.template get_item_by_seq<RetrievableType>(idx) } -> std::same_as<RetrievableType const&>;
31+
};
32+
33+
template <typename ContainerType, typename StoragableType, typename... Args>
34+
concept storagable_single_component_container_c =
35+
single_component_container_c<ContainerType, StoragableType> &&
36+
ContainerType::template is_storageable_v<StoragableType> &&
37+
requires(ContainerType const& c, ContainerType& nc, size_t size, ID id, Args... args) {
38+
{ c.template get_group_idx<StoragableType>() } -> std::same_as<Idx>;
39+
{ c.template get_type_idx<StoragableType>() } -> std::same_as<Idx>;
40+
{ nc.template reserve<StoragableType>(size) } -> std::same_as<void>;
41+
{ nc.template emplace<StoragableType>(id, args...) } -> std::same_as<void>;
42+
};
43+
2644
} // namespace detail
2745

2846
template <typename ContainerType, typename... RetrievableType>
2947
concept component_container_c = (detail::single_component_container_c<ContainerType, RetrievableType> && ...);
3048

49+
template <typename ContainerType, typename... StoragableType>
50+
concept storagable_component_container_c =
51+
(detail::storagable_single_component_container_c<ContainerType, StoragableType> && ...);
52+
3153
} // namespace power_grid_model::common

power_grid_model_c/power_grid_model/include/power_grid_model/job_adapter.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,18 +126,19 @@ template <class MainModel> class JobAdapter : public JobInterface<JobAdapter<Mai
126126
// the order for a cacheable (independent) component by definition is the same across all scenarios
127127
components_to_update_ = model_reference_.get().get_components_to_update(update_data);
128128
update_independence_ = main_core::update::independence::check_update_independence<ModelType>(
129-
model_reference_.get().state(), update_data);
129+
model_reference_.get().state().components, update_data);
130130
std::ranges::transform(update_independence_, independence_flags_.begin(),
131131
[](auto const& comp) { return comp.is_independent(); });
132132
all_scenarios_sequence_ =
133133
std::make_shared<typename ModelType::SequenceIdx>(main_core::update::get_all_sequence_idx_map<ModelType>(
134-
model_reference_.get().state(), update_data, 0, components_to_update_, update_independence_, false));
134+
model_reference_.get().state().components, update_data, 0, components_to_update_, update_independence_,
135+
false));
135136
}
136137

137138
void setup_impl(ConstDataset const& update_data, Idx scenario_idx) {
138139
current_scenario_sequence_cache_ = main_core::update::get_all_sequence_idx_map<ModelType>(
139-
model_reference_.get().state(), update_data, scenario_idx, components_to_update_, update_independence_,
140-
true);
140+
model_reference_.get().state().components, update_data, scenario_idx, components_to_update_,
141+
update_independence_, true);
141142
auto const current_scenario_sequence = get_current_scenario_sequence_view_();
142143
model_reference_.get().template update_components<cached_update_t>(update_data, scenario_idx,
143144
current_scenario_sequence);

power_grid_model_c/power_grid_model/include/power_grid_model/main_core/calculation_input_preparation.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ void prepare_input(main_model_state_c auto const& state, std::vector<Idx2D> cons
9494
if (include(i)) {
9595
Idx2D const math_idx = components[i];
9696
if (math_idx.group != isolated_component) {
97-
auto const& component = get_component_by_sequence<ComponentIn>(state, i);
97+
auto const& component = get_component_by_sequence<ComponentIn>(state.components, i);
9898
CalcStructOut& math_model_input = calc_input[math_idx.group];
9999
std::vector<CalcParamOut>& math_model_input_vect = math_model_input.*comp_vect;
100100
math_model_input_vect[math_idx.pos] = calculate_param<CalcStructOut>(component);
@@ -114,7 +114,7 @@ void prepare_input(main_model_state_c auto const& state, std::vector<Idx2D> cons
114114
if (include(i)) {
115115
Idx2D const math_idx = components[i];
116116
if (math_idx.group != isolated_component) {
117-
auto const& component = get_component_by_sequence<ComponentIn>(state, i);
117+
auto const& component = get_component_by_sequence<ComponentIn>(state.components, i);
118118
CalcStructOut& math_model_input = calc_input[math_idx.group];
119119
std::vector<CalcParamOut>& math_model_input_vect = math_model_input.*comp_vect;
120120
math_model_input_vect[math_idx.pos] = calculate_param<CalcStructOut>(component, extra_args(component));
@@ -132,7 +132,7 @@ void prepare_input_status(main_model_state_c auto const& state, std::vector<Idx2
132132
continue;
133133
}
134134
(input[math_idx.group].*component)[math_idx.pos] =
135-
main_core::get_component_by_sequence<Component>(state, i).status();
135+
main_core::get_component_by_sequence<Component>(state.components, i).status();
136136
}
137137
}
138138
} // namespace detail

power_grid_model_c/power_grid_model/include/power_grid_model/main_core/container_queries.hpp

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@
44

55
#pragma once
66

7+
#include "../all_components.hpp"
78
#include "../container.hpp"
89

910
namespace power_grid_model::main_core {
1011

11-
// TODO Reconfirm if there is duplication with state_queries and if we can remove either one of them
12+
template <typename ComponentType, class ComponentContainer>
13+
requires common::storagable_component_container_c<ComponentContainer, ComponentType>
14+
inline Idx get_component_type_index(ComponentContainer const& components) {
15+
return components.template get_type_idx<ComponentType>();
16+
}
1217

1318
template <typename ComponentType, class ComponentContainer>
1419
requires common::component_container_c<ComponentContainer, ComponentType>
@@ -22,4 +27,88 @@ inline Idx get_component_sequence_idx(ComponentContainer const& components, auto
2227
return components.template get_seq<ComponentType>(id_or_index);
2328
}
2429

30+
template <class ComponentContainer> inline Idx2D get_component_idx_by_id(ComponentContainer const& components, ID id) {
31+
return components.get_idx_by_id(id);
32+
}
33+
34+
template <typename ComponentType, class ComponentContainer>
35+
requires common::component_container_c<ComponentContainer, ComponentType>
36+
inline Idx2D get_component_idx_by_id(ComponentContainer const& components, ID id) {
37+
return components.template get_idx_by_id<ComponentType>(id);
38+
}
39+
40+
template <typename ComponentType, class ComponentContainer>
41+
requires common::storagable_component_container_c<ComponentContainer, ComponentType>
42+
constexpr Idx get_component_group_idx(ComponentContainer const& components) {
43+
return components.template get_group_idx<ComponentType>();
44+
}
45+
46+
template <std::derived_from<Base> BaseComponent, std::derived_from<Base> Component, class ComponentContainer>
47+
requires std::derived_from<Component, BaseComponent> &&
48+
common::component_container_c<ComponentContainer, BaseComponent> &&
49+
common::storagable_component_container_c<ComponentContainer, Component>
50+
constexpr auto get_component_sequence_offset(ComponentContainer const& components) {
51+
return components.template get_start_idx<BaseComponent, Component>();
52+
}
53+
54+
template <typename ComponentType, class ComponentContainer>
55+
requires common::component_container_c<ComponentContainer, ComponentType>
56+
constexpr auto& get_component(ComponentContainer const& components, auto const& id_or_index) {
57+
return components.template get_item<ComponentType>(id_or_index);
58+
}
59+
60+
template <typename ComponentType, class ComponentContainer>
61+
requires common::component_container_c<ComponentContainer, ComponentType>
62+
constexpr auto& get_component(ComponentContainer& components, auto const& id_or_index) {
63+
return components.template get_item<ComponentType>(id_or_index);
64+
}
65+
66+
template <typename ComponentType, class ComponentContainer>
67+
requires common::component_container_c<ComponentContainer, ComponentType>
68+
constexpr auto& get_component_by_sequence(ComponentContainer const& components, Idx sequence) {
69+
return components.template get_item_by_seq<ComponentType>(sequence);
70+
}
71+
72+
template <typename ComponentType, class ComponentContainer>
73+
requires common::component_container_c<ComponentContainer, ComponentType>
74+
constexpr auto& get_component_by_sequence(ComponentContainer& components, Idx sequence) {
75+
return components.template get_item_by_seq<ComponentType>(sequence);
76+
}
77+
78+
template <typename ComponentType, class ComponentContainer, typename... Args>
79+
requires common::storagable_component_container_c<ComponentContainer, ComponentType>
80+
constexpr auto emplace_component(ComponentContainer& components, ID id, Args&&... args) {
81+
return components.template emplace<ComponentType>(id, std::forward<Args>(args)...);
82+
}
83+
84+
template <typename ComponentType, class ComponentContainer, typename... Args>
85+
requires common::storagable_component_container_c<ComponentContainer, ComponentType>
86+
constexpr void reserve_component(ComponentContainer& components, std::integral auto size) {
87+
components.template reserve<ComponentType>(size);
88+
}
89+
90+
template <typename ComponentType, class ComponentContainer>
91+
requires common::component_container_c<ComponentContainer, ComponentType>
92+
constexpr auto get_component_citer(ComponentContainer const& components) {
93+
return components.template citer<ComponentType>();
94+
}
95+
96+
template <std::derived_from<Branch> ComponentType, class ComponentContainer>
97+
requires common::component_container_c<ComponentContainer, ComponentType>
98+
constexpr auto get_topology_index(ComponentContainer const& components, auto const& id_or_index) {
99+
return get_component_sequence_idx<Branch>(components, id_or_index);
100+
}
101+
102+
template <std::derived_from<Branch3> ComponentType, class ComponentContainer>
103+
requires common::component_container_c<ComponentContainer, ComponentType>
104+
constexpr auto get_topology_index(ComponentContainer const& components, auto const& id_or_index) {
105+
return get_component_sequence_idx<Branch3>(components, id_or_index);
106+
}
107+
108+
template <std::derived_from<Regulator> ComponentType, class ComponentContainer>
109+
requires common::component_container_c<ComponentContainer, ComponentType>
110+
constexpr auto get_topology_index(ComponentContainer const& components, auto const& id_or_index) {
111+
return get_component_sequence_idx<Regulator>(components, id_or_index);
112+
}
113+
25114
} // namespace power_grid_model::main_core

0 commit comments

Comments
 (0)