Skip to content

Commit c8d8512

Browse files
committed
add all MainModelType features
Signed-off-by: Nitish Bharambe <[email protected]>
1 parent a01f8f3 commit c8d8512

File tree

2 files changed

+60
-30
lines changed

2 files changed

+60
-30
lines changed

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

Lines changed: 56 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010

1111
#include <array>
1212
#include <vector>
13-
1413
namespace power_grid_model::main_core::utils {
1514

1615
constexpr Idx invalid_index{-1};
16+
/////////////////// To remove ///////////////////
1717

1818
template <class... ComponentTypes> constexpr size_t n_types = sizeof...(ComponentTypes);
1919
template <class CompType, class... ComponentTypes>
@@ -29,6 +29,7 @@ template <class... Types, class Functor> constexpr void run_functor_with_all_typ
2929
template <class... Types, class Functor> constexpr auto run_functor_with_all_types_return_array(Functor functor) {
3030
return std::array { functor.template operator()<Types>()... };
3131
}
32+
/////////////////// To remove ///////////////////
3233

3334
template <typename Tuple> struct tuple_type_identities_to_tuple_types;
3435

@@ -45,52 +46,81 @@ constexpr auto filter_tuple_types(std::tuple<std::type_identity<Types>...>,
4546
constexpr auto sub_type_in_type = []<typename T>() { return (std::is_same_v<T, SelectTypes> || ...); };
4647

4748
return std::tuple_cat(std::conditional_t<sub_type_in_type.template operator()<Types>(),
48-
std::tuple<typename std::type_identity<Types>>, std::tuple<>>{}...);
49+
std::tuple<std::type_identity<Types>>, std::tuple<>>{}...);
50+
}
51+
52+
template <typename Tuple, class Functor, std::size_t... Indices>
53+
constexpr void run_functor_with_tuple_index_return_void(Functor functor, std::index_sequence<Indices...>) {
54+
(functor.template operator()<std::tuple_element_t<Indices, Tuple>>(), ...);
4955
}
5056

51-
// concept validate_component_types_c =
52-
// dependent_type_check<Source, Node, ComponentType...> && dependent_type_check<Line, Node, ComponentType...> &&
53-
// dependent_type_check<ThreeWindingTransformer, Node, ComponentType...> &&
54-
// dependent_type_check<Shunt, Node, ComponentType...> &&
55-
// dependent_type_check<GenericLoadGen, Node, ComponentType...> &&
56-
// dependent_type_check<GenericVoltageSensor, Node, ComponentType...>;
57+
template <typename Tuple, class Functor> constexpr void run_functor_with_tuple_return_void(Functor functor) {
58+
run_functor_with_tuple_index_return_void<Tuple>(functor, std::make_index_sequence<std::tuple_size_v<Tuple>>{});
59+
}
60+
61+
template <typename Tuple, class Functor, std::size_t... Indices>
62+
constexpr auto run_functor_with_tuple_index_return_array(Functor functor, std::index_sequence<Indices...>) {
63+
return std::array { functor.template operator()<std::tuple_element_t<Indices, Tuple>>()... };
64+
}
65+
66+
template <typename Tuple, class Functor> constexpr auto run_functor_with_tuple_return_array(Functor functor) {
67+
return run_functor_with_tuple_index_return_array<Tuple>(functor,
68+
std::make_index_sequence<std::tuple_size_v<Tuple>>{});
69+
}
5770

58-
// main model implementation template
5971
template <class T, class U> struct MainModelType;
6072

61-
template <class... ExtraRetrievableType, class... ComponentType>
6273
// TODO: discussion on checking dependent types can also be done here.
63-
// requires validate_component_types_c<ComponentType...>
74+
template <class... ExtraRetrievableType, class... ComponentType>
6475
struct MainModelType<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentList<ComponentType...>> {
6576

6677
using ComponentContainer = Container<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentType...>;
6778
using MainModelState = main_core::MainModelState<ComponentContainer>;
6879
using ExtraRetrievableTypesTuple = std::tuple<std::type_identity<ExtraRetrievableType>...>;
6980
using ComponentTypesTuple = std::tuple<ComponentType...>;
7081

71-
// TODO: Clean up using-s
72-
using _AllTypesTuple =
73-
std::tuple<std::type_identity<ComponentType>..., std::type_identity<ExtraRetrievableType>...>;
82+
static constexpr size_t n_types = sizeof...(ComponentType);
83+
// TODO Should not have to go via container_impl.
84+
template <class CompType>
85+
static constexpr size_t index_of_component = container_impl::get_cls_pos_v<CompType, ComponentType...>;
86+
87+
static constexpr auto all_types_tuple_v_ =
88+
std::tuple<std::type_identity<ComponentType>..., std::type_identity<ExtraRetrievableType>...>{};
7489
// TODO: Would making a unique be necessary? We have Node mentioned as a ExtraRetrievableType and ComponentType so
7590
// summing up is possible but maybe not appropriate. Would it be better to handle them both separately? using
76-
// _AllTypesTupleUnique = typename tuple_type_identities_to_tuple_types<decltype(filter_tuple_types(
77-
// _TopologyTypesTuple{}, _AllTypesTuple{}))>::type;
7891

79-
using _ComponentTypesTuple = std::tuple<std::type_identity<ComponentType>...>;
80-
using _TopologyTypesTuple =
92+
static constexpr auto topology_types_tuple_v_ =
8193
std::tuple<std::type_identity<Node>, std::type_identity<Branch>, std::type_identity<Branch3>,
8294
std::type_identity<Source>, std::type_identity<Shunt>, std::type_identity<GenericLoadGen>,
8395
std::type_identity<GenericVoltageSensor>, std::type_identity<GenericPowerSensor>,
84-
std::type_identity<GenericCurrentSensor>, std::type_identity<Regulator>>;
85-
using _TopologyConnectionTypes =
86-
std::tuple<std::type_identity<Branch>, std::type_identity<Branch3>, std::type_identity<Source>>;
96+
std::type_identity<GenericCurrentSensor>, std::type_identity<Regulator>>{};
8797

88-
using TopologyTypesTuple =
89-
tuple_type_identities_to_tuple_types_t<decltype(filter_tuple_types(_TopologyTypesTuple{}, _AllTypesTuple{}))>;
90-
using TopologyConnectionTypesTuple = tuple_type_identities_to_tuple_types_t<decltype(filter_tuple_types(
91-
_TopologyConnectionTypes{}, _AllTypesTuple{}))>;
98+
static constexpr auto topology_connection_types_tuple_v_ =
99+
std::tuple<std::type_identity<Branch>, std::type_identity<Branch3>, std::type_identity<Source>>{};
92100

93-
static constexpr size_t n_component_types = main_core::utils::n_types<ComponentType...>;
101+
using TopologyTypesTuple = tuple_type_identities_to_tuple_types_t<decltype(filter_tuple_types(
102+
topology_types_tuple_v_, all_types_tuple_v_))>;
103+
using TopologyConnectionTypesTuple = tuple_type_identities_to_tuple_types_t<decltype(filter_tuple_types(
104+
topology_connection_types_tuple_v_, all_types_tuple_v_))>;
105+
106+
// Update related types
107+
using OwnedUpdateDataset = std::tuple<std::vector<typename ComponentType::UpdateType>...>;
108+
using SequenceIdxView = std::array<std::span<Idx2D const>, n_types>;
109+
// using UpdateIndependence = std::array<UpdateCompProperties, n_types>;
110+
using SequenceIdx = std::array<std::vector<Idx2D>, n_types>;
111+
using ComponentFlags = std::array<bool, n_types>;
112+
113+
// Clean these 2. They are unused
114+
static constexpr auto branch_param_in_seq_map =
115+
std::array{index_of_component<Line>, index_of_component<Link>, index_of_component<Transformer>};
116+
static constexpr auto shunt_param_in_seq_map = std::array{index_of_component<Shunt>};
117+
118+
template <class Functor> static constexpr void run_functor_with_all_component_types_return_void(Functor functor) {
119+
(functor.template operator()<ComponentType>(), ...);
120+
}
121+
template <class Functor> static constexpr auto run_functor_with_all_component_types_return_array(Functor functor) {
122+
return std::array { functor.template operator()<ComponentType>()... };
123+
}
94124
};
95125

96126
} // namespace power_grid_model::main_core::utils

tests/cpp_unit_tests/test_core_utils.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ TEST_CASE("MainModelType") {
2424
static_assert(std::is_same_v<typename ModelType::ComponentTypesTuple, std::tuple<Node, Source>>);
2525
static_assert(std::is_same_v<typename ModelType::TopologyTypesTuple, std::tuple<Node, Source>>);
2626
static_assert(std::is_same_v<typename ModelType::TopologyConnectionTypesTuple, std::tuple<Source>>);
27-
static_assert(ModelType::n_component_types == 2);
27+
static_assert(ModelType::n_types == 2);
2828
}
2929
SUBCASE("Node Line Source") {
3030
using ModelType =
@@ -36,7 +36,7 @@ TEST_CASE("MainModelType") {
3636
static_assert(std::is_same_v<typename ModelType::ComponentTypesTuple, std::tuple<Node, Line, Source>>);
3737
static_assert(std::is_same_v<typename ModelType::TopologyTypesTuple, std::tuple<Node, Branch, Source>>);
3838
static_assert(std::is_same_v<typename ModelType::TopologyConnectionTypesTuple, std::tuple<Branch, Source>>);
39-
static_assert(ModelType::n_component_types == 3);
39+
static_assert(ModelType::n_types == 3);
4040
}
4141
SUBCASE("Different component order: Line Source Node") {
4242
using ModelType =
@@ -48,7 +48,7 @@ TEST_CASE("MainModelType") {
4848
static_assert(std::is_same_v<typename ModelType::ComponentTypesTuple, std::tuple<Line, Source, Node>>);
4949
static_assert(std::is_same_v<typename ModelType::TopologyTypesTuple, std::tuple<Node, Branch, Source>>);
5050
static_assert(std::is_same_v<typename ModelType::TopologyConnectionTypesTuple, std::tuple<Branch, Source>>);
51-
static_assert(ModelType::n_component_types == 3);
51+
static_assert(ModelType::n_types == 3);
5252
}
5353
SUBCASE("Bad case: Line Source") {
5454
// TODO rewrite for checking fail instead of pass
@@ -59,7 +59,7 @@ TEST_CASE("MainModelType") {
5959
static_assert(std::is_same_v<typename ModelType::ComponentTypesTuple, std::tuple<Line, Source>>);
6060
static_assert(std::is_same_v<typename ModelType::TopologyTypesTuple, std::tuple<Branch, Source>>);
6161
static_assert(std::is_same_v<typename ModelType::TopologyConnectionTypesTuple, std::tuple<Branch, Source>>);
62-
static_assert(ModelType::n_component_types == 2);
62+
static_assert(ModelType::n_types == 2);
6363
}
6464

6565
// TODO add static_assert(std::constructible_from<ModelType, double, meta_data::MetaData const&,

0 commit comments

Comments
 (0)