Skip to content

Commit adfd800

Browse files
committed
move to new file
Signed-off-by: Nitish Bharambe <[email protected]>
1 parent 746264f commit adfd800

File tree

5 files changed

+137
-113
lines changed

5 files changed

+137
-113
lines changed

power_grid_model_c/power_grid_model/include/power_grid_model/main_core/core_utils.hpp

Lines changed: 0 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,6 @@ namespace power_grid_model::main_core::utils {
1414

1515
namespace detail {
1616

17-
template <typename Tuple> struct tuple_type_identities_to_tuple_types;
18-
19-
template <typename... Ts> struct tuple_type_identities_to_tuple_types<std::tuple<std::type_identity<Ts>...>> {
20-
using type = std::tuple<Ts...>;
21-
};
22-
23-
template <typename Tuple>
24-
using tuple_type_identities_to_tuple_types_t = typename tuple_type_identities_to_tuple_types<Tuple>::type;
25-
26-
template <typename... Types, typename... SelectTypes>
27-
constexpr auto filter_tuple_types(std::tuple<std::type_identity<Types>...> /* types*/,
28-
std::tuple<std::type_identity<SelectTypes>...> /* select_types*/) {
29-
constexpr auto sub_type_in_type = []<typename T>() { return (std::is_same_v<T, SelectTypes> || ...); };
30-
31-
return std::tuple_cat(std::conditional_t<sub_type_in_type.template operator()<Types>(),
32-
std::tuple<std::type_identity<Types>>, std::tuple<>>{}...);
33-
}
34-
3517
template <typename Tuple, class Functor, std::size_t... Indices>
3618
constexpr void run_functor_with_tuple_index_return_void(Functor functor, std::index_sequence<Indices...>) {
3719
(functor.template operator()<std::tuple_element_t<Indices, Tuple>>(), ...);
@@ -41,33 +23,6 @@ constexpr void run_functor_with_tuple_index_return_void(Functor functor, std::in
4123

4224
constexpr Idx invalid_index{-1};
4325

44-
struct UpdateCompProperties {
45-
bool has_any_elements{false}; // whether the component has any elements in the update data
46-
bool ids_all_na{false}; // whether all ids are all NA
47-
bool ids_part_na{false}; // whether some ids are NA but some are not
48-
bool dense{false}; // whether the component is dense
49-
bool uniform{false}; // whether the component is uniform
50-
bool is_columnar{false}; // whether the component is columnar
51-
bool update_ids_match{false}; // whether the ids match
52-
Idx elements_ps_in_update{utils::invalid_index}; // count of elements for this component per scenario in update
53-
Idx elements_in_base{utils::invalid_index}; // count of elements for this component per scenario in input
54-
55-
constexpr bool no_id() const { return !has_any_elements || ids_all_na; }
56-
constexpr bool qualify_for_optional_id() const {
57-
return update_ids_match && ids_all_na && uniform && elements_ps_in_update == elements_in_base;
58-
}
59-
constexpr bool provided_ids_valid() const {
60-
return is_empty_component() || (update_ids_match && !(ids_all_na || ids_part_na));
61-
}
62-
constexpr bool is_empty_component() const { return !has_any_elements; }
63-
constexpr bool is_independent() const { return qualify_for_optional_id() || provided_ids_valid(); }
64-
constexpr Idx get_n_elements() const {
65-
assert(uniform || elements_ps_in_update == utils::invalid_index);
66-
67-
return qualify_for_optional_id() ? elements_ps_in_update : na_Idx;
68-
}
69-
};
70-
7126
/////////////////// To remove ///////////////////
7227

7328
template <class... ComponentTypes> constexpr size_t n_types = sizeof...(ComponentTypes);
@@ -91,62 +46,4 @@ template <typename Tuple, class Functor> constexpr void run_functor_with_tuple_r
9146
std::make_index_sequence<std::tuple_size_v<Tuple>>{});
9247
}
9348

94-
template <class T, class U> struct MainModelType;
95-
96-
// TODO: discussion on checking dependent types can also be done here.
97-
template <class... ExtraRetrievableType, class... ComponentType>
98-
struct MainModelType<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentList<ComponentType...>> {
99-
100-
using ComponentContainer = Container<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentType...>;
101-
using MainModelState = main_core::MainModelState<ComponentContainer>;
102-
using ComponentTypesTuple = std::tuple<ComponentType...>;
103-
104-
static constexpr size_t n_types = sizeof...(ComponentType);
105-
// TODO Should not have to go via container_impl.
106-
template <class CompType>
107-
static constexpr size_t index_of_component = container_impl::get_cls_pos_v<CompType, ComponentType...>;
108-
109-
private:
110-
static constexpr auto all_types_tuple_v_ =
111-
std::tuple<std::type_identity<ComponentType>..., std::type_identity<ExtraRetrievableType>...>{};
112-
// TODO: Would making a unique be necessary? We have Node mentioned as a ExtraRetrievableType and ComponentType so
113-
// summing up is possible but maybe not appropriate. Would it be better to handle them both separately? using
114-
115-
static constexpr auto topology_types_tuple_v_ =
116-
std::tuple<std::type_identity<Node>, std::type_identity<Branch>, std::type_identity<Branch3>,
117-
std::type_identity<Source>, std::type_identity<Shunt>, std::type_identity<GenericLoadGen>,
118-
std::type_identity<GenericVoltageSensor>, std::type_identity<GenericPowerSensor>,
119-
std::type_identity<GenericCurrentSensor>, std::type_identity<Regulator>>{};
120-
121-
static constexpr auto topology_connection_types_tuple_v_ =
122-
std::tuple<std::type_identity<Branch>, std::type_identity<Branch3>, std::type_identity<Source>>{};
123-
124-
public:
125-
using TopologyTypesTuple = detail::tuple_type_identities_to_tuple_types_t<decltype(detail::filter_tuple_types(
126-
topology_types_tuple_v_, all_types_tuple_v_))>;
127-
using TopologyConnectionTypesTuple =
128-
detail::tuple_type_identities_to_tuple_types_t<decltype(detail::filter_tuple_types(
129-
topology_connection_types_tuple_v_, all_types_tuple_v_))>;
130-
131-
// Update related types
132-
using OwnedUpdateDataset = std::tuple<std::vector<typename ComponentType::UpdateType>...>;
133-
using SequenceIdxView = std::array<std::span<Idx2D const>, n_types>;
134-
using UpdateIndependence = std::array<UpdateCompProperties, n_types>;
135-
using SequenceIdx = std::array<std::vector<Idx2D>, n_types>;
136-
using SequenceIdxRefWrappers = std::array<std::reference_wrapper<std::vector<Idx2D> const>, n_types>;
137-
using ComponentFlags = std::array<bool, n_types>;
138-
139-
// Clean these 2. They are unused
140-
static constexpr auto branch_param_in_seq_map =
141-
std::array{index_of_component<Line>, index_of_component<Link>, index_of_component<Transformer>};
142-
static constexpr auto shunt_param_in_seq_map = std::array{index_of_component<Shunt>};
143-
144-
template <class Functor> static constexpr void run_functor_with_all_component_types_return_void(Functor functor) {
145-
(functor.template operator()<ComponentType>(), ...);
146-
}
147-
template <class Functor> static constexpr auto run_functor_with_all_component_types_return_array(Functor functor) {
148-
return std::array { functor.template operator()<ComponentType>()... };
149-
}
150-
};
151-
15249
} // namespace power_grid_model::main_core::utils
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
// SPDX-FileCopyrightText: Contributors to the Power Grid Model project <[email protected]>
2+
//
3+
// SPDX-License-Identifier: MPL-2.0
4+
5+
#pragma once
6+
7+
#include "../all_components.hpp"
8+
#include "../container.hpp"
9+
#include "state.hpp"
10+
#include "update.hpp"
11+
12+
#include <array>
13+
#include <vector>
14+
namespace power_grid_model::main_core {
15+
16+
namespace detail {
17+
18+
template <typename Tuple> struct tuple_type_identities_to_tuple_types;
19+
20+
template <typename... Ts> struct tuple_type_identities_to_tuple_types<std::tuple<std::type_identity<Ts>...>> {
21+
using type = std::tuple<Ts...>;
22+
};
23+
24+
template <typename Tuple>
25+
using tuple_type_identities_to_tuple_types_t = typename tuple_type_identities_to_tuple_types<Tuple>::type;
26+
27+
template <typename... Types, typename... SelectTypes>
28+
constexpr auto filter_tuple_types(std::tuple<std::type_identity<Types>...> /* types*/,
29+
std::tuple<std::type_identity<SelectTypes>...> /* select_types*/) {
30+
constexpr auto sub_type_in_type = []<typename T>() { return (std::is_same_v<T, SelectTypes> || ...); };
31+
32+
return std::tuple_cat(std::conditional_t<sub_type_in_type.template operator()<Types>(),
33+
std::tuple<std::type_identity<Types>>, std::tuple<>>{}...);
34+
}
35+
36+
template <typename Tuple, class Functor, std::size_t... Indices>
37+
constexpr void run_functor_with_tuple_index_return_void(Functor functor, std::index_sequence<Indices...>) {
38+
(functor.template operator()<std::tuple_element_t<Indices, Tuple>>(), ...);
39+
}
40+
41+
} // namespace detail
42+
43+
template <class T, class U> struct MainModelType;
44+
45+
// TODO: discussion on checking dependent types can also be done here.
46+
template <class... ExtraRetrievableType, class... ComponentType>
47+
struct MainModelType<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentList<ComponentType...>> {
48+
49+
using ComponentContainer = Container<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentType...>;
50+
using MainModelState = main_core::MainModelState<ComponentContainer>;
51+
using ComponentTypesTuple = std::tuple<ComponentType...>;
52+
53+
static constexpr size_t n_types = sizeof...(ComponentType);
54+
// TODO Should not have to go via container_impl.
55+
template <class CompType>
56+
static constexpr size_t index_of_component = container_impl::get_cls_pos_v<CompType, ComponentType...>;
57+
58+
private:
59+
static constexpr auto all_types_tuple_v_ =
60+
std::tuple<std::type_identity<ComponentType>..., std::type_identity<ExtraRetrievableType>...>{};
61+
// TODO: Would making a unique be necessary? We have Node mentioned as a ExtraRetrievableType and ComponentType so
62+
// summing up is possible but maybe not appropriate. Would it be better to handle them both separately? using
63+
64+
static constexpr auto topology_types_tuple_v_ =
65+
std::tuple<std::type_identity<Node>, std::type_identity<Branch>, std::type_identity<Branch3>,
66+
std::type_identity<Source>, std::type_identity<Shunt>, std::type_identity<GenericLoadGen>,
67+
std::type_identity<GenericVoltageSensor>, std::type_identity<GenericPowerSensor>,
68+
std::type_identity<GenericCurrentSensor>, std::type_identity<Regulator>>{};
69+
70+
static constexpr auto topology_connection_types_tuple_v_ =
71+
std::tuple<std::type_identity<Branch>, std::type_identity<Branch3>, std::type_identity<Source>>{};
72+
73+
public:
74+
using TopologyTypesTuple = detail::tuple_type_identities_to_tuple_types_t<decltype(detail::filter_tuple_types(
75+
topology_types_tuple_v_, all_types_tuple_v_))>;
76+
using TopologyConnectionTypesTuple =
77+
detail::tuple_type_identities_to_tuple_types_t<decltype(detail::filter_tuple_types(
78+
topology_connection_types_tuple_v_, all_types_tuple_v_))>;
79+
80+
// Update related types
81+
using OwnedUpdateDataset = std::tuple<std::vector<typename ComponentType::UpdateType>...>;
82+
using SequenceIdxView = std::array<std::span<Idx2D const>, n_types>;
83+
using UpdateIndependence = std::array<main_core::update::independence::UpdateCompProperties, n_types>;
84+
using SequenceIdx = std::array<std::vector<Idx2D>, n_types>;
85+
using SequenceIdxRefWrappers = std::array<std::reference_wrapper<std::vector<Idx2D> const>, n_types>;
86+
using ComponentFlags = std::array<bool, n_types>;
87+
88+
// Clean these 2. They are unused
89+
static constexpr auto branch_param_in_seq_map =
90+
std::array{index_of_component<Line>, index_of_component<Link>, index_of_component<Transformer>};
91+
static constexpr auto shunt_param_in_seq_map = std::array{index_of_component<Shunt>};
92+
93+
template <class Functor> static constexpr void run_functor_with_all_component_types_return_void(Functor functor) {
94+
(functor.template operator()<ComponentType>(), ...);
95+
}
96+
template <class Functor> static constexpr auto run_functor_with_all_component_types_return_array(Functor functor) {
97+
return std::array { functor.template operator()<ComponentType>()... };
98+
}
99+
};
100+
101+
} // namespace power_grid_model::main_core

power_grid_model_c/power_grid_model/include/power_grid_model/main_core/update.hpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,32 @@ template <typename T> bool check_id_na(T const& obj) {
4646

4747
namespace independence {
4848

49-
using UpdateCompProperties = utils::UpdateCompProperties;
49+
struct UpdateCompProperties {
50+
bool has_any_elements{false}; // whether the component has any elements in the update data
51+
bool ids_all_na{false}; // whether all ids are all NA
52+
bool ids_part_na{false}; // whether some ids are NA but some are not
53+
bool dense{false}; // whether the component is dense
54+
bool uniform{false}; // whether the component is uniform
55+
bool is_columnar{false}; // whether the component is columnar
56+
bool update_ids_match{false}; // whether the ids match
57+
Idx elements_ps_in_update{utils::invalid_index}; // count of elements for this component per scenario in update
58+
Idx elements_in_base{utils::invalid_index}; // count of elements for this component per scenario in input
59+
60+
constexpr bool no_id() const { return !has_any_elements || ids_all_na; }
61+
constexpr bool qualify_for_optional_id() const {
62+
return update_ids_match && ids_all_na && uniform && elements_ps_in_update == elements_in_base;
63+
}
64+
constexpr bool provided_ids_valid() const {
65+
return is_empty_component() || (update_ids_match && !(ids_all_na || ids_part_na));
66+
}
67+
constexpr bool is_empty_component() const { return !has_any_elements; }
68+
constexpr bool is_independent() const { return qualify_for_optional_id() || provided_ids_valid(); }
69+
constexpr Idx get_n_elements() const {
70+
assert(uniform || elements_ps_in_update == utils::invalid_index);
71+
72+
return qualify_for_optional_id() ? elements_ps_in_update : na_Idx;
73+
}
74+
};
5075

5176
template <typename CompType> void process_buffer_span(auto const& all_spans, UpdateCompProperties& properties) {
5277
properties.ids_all_na = std::ranges::all_of(all_spans, [](auto const& vec) {

power_grid_model_c/power_grid_model/include/power_grid_model/main_model_impl.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232

3333
// main model implementation
3434
#include "main_core/calculation_input_preparation.hpp"
35-
#include "main_core/core_utils.hpp"
3635
#include "main_core/input.hpp"
36+
#include "main_core/main_model_type.hpp"
3737
#include "main_core/math_state.hpp"
3838
#include "main_core/output.hpp"
3939
#include "main_core/topology.hpp"
@@ -124,8 +124,8 @@ template <class... ExtraRetrievableType, class... ComponentType>
124124
class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentList<ComponentType...>> {
125125

126126
private:
127-
using ModelType = main_core::utils::MainModelType<ExtraRetrievableTypes<ExtraRetrievableType...>,
128-
ComponentList<ComponentType...>>;
127+
using ModelType =
128+
main_core::MainModelType<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentList<ComponentType...>>;
129129
// internal type traits
130130
// container class
131131
using ComponentContainer = typename ModelType::ComponentContainer;

tests/cpp_unit_tests/test_core_utils.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44

55
#include <power_grid_model/container.hpp>
66
#include <power_grid_model/main_core/core_utils.hpp>
7+
#include <power_grid_model/main_core/main_model_type.hpp>
78

89
#include <doctest/doctest.h>
910

10-
namespace power_grid_model::main_core::utils {
11+
namespace power_grid_model::main_core {
1112

1213
namespace {
1314
struct AComponent {
@@ -40,7 +41,7 @@ TEST_CASE("MainModelType") {
4041
CHECK(calls == std::vector<std::string_view>{"node", "source"});
4142

4243
calls.clear();
43-
run_functor_with_tuple_return_void<typename ModelType::TopologyTypesTuple>(
44+
utils::run_functor_with_tuple_return_void<typename ModelType::TopologyTypesTuple>(
4445
[&calls]<typename CompType>() { calls.push_back(std::string_view(CompType::name)); });
4546
CHECK(calls == std::vector<std::string_view>{"node", "source"});
4647

@@ -71,7 +72,7 @@ TEST_CASE("MainModelType") {
7172
CHECK(calls == std::vector<std::string_view>{"node", "line", "source"});
7273
calls.clear();
7374

74-
run_functor_with_tuple_return_void<typename ModelType::TopologyTypesTuple>(
75+
utils::run_functor_with_tuple_return_void<typename ModelType::TopologyTypesTuple>(
7576
[&calls]<typename CompType>() { calls.push_back(std::string_view(CompType::name)); });
7677
CHECK(calls == std::vector<std::string_view>{"node", "branch", "source"});
7778
}
@@ -100,7 +101,7 @@ TEST_CASE("MainModelType") {
100101
CHECK(calls == std::vector<std::string_view>{"line", "source", "node"});
101102
calls.clear();
102103

103-
run_functor_with_tuple_return_void<typename ModelType::TopologyTypesTuple>(
104+
utils::run_functor_with_tuple_return_void<typename ModelType::TopologyTypesTuple>(
104105
[&calls]<typename CompType>() { calls.push_back(std::string_view(CompType::name)); });
105106
CHECK(calls == std::vector<std::string_view>{"node", "branch", "source"});
106107
}
@@ -130,7 +131,7 @@ TEST_CASE("MainModelType") {
130131
CHECK(calls == std::vector<std::string_view>{"node", "a_component", "source"});
131132

132133
calls.clear();
133-
run_functor_with_tuple_return_void<typename ModelType::TopologyTypesTuple>(
134+
utils::run_functor_with_tuple_return_void<typename ModelType::TopologyTypesTuple>(
134135
[&calls]<typename CompType>() { calls.push_back(std::string_view(CompType::name)); });
135136
CHECK(calls == std::vector<std::string_view>{"node", "source"});
136137
}
@@ -151,4 +152,4 @@ TEST_CASE("MainModelType") {
151152
// MathSolverDispatcher const&>);
152153
}
153154

154-
} // namespace power_grid_model::main_core::utils
155+
} // namespace power_grid_model::main_core

0 commit comments

Comments
 (0)