@@ -149,15 +149,7 @@ class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLis
149
149
using MainModelState = main_core::MainModelState<ComponentContainer>;
150
150
using MathState = main_core::MathState;
151
151
152
- // main core utils
153
- static constexpr auto n_types = main_core::utils::n_types<ComponentType...>;
154
- template <class CompType >
155
- static constexpr auto index_of_component = main_core::utils::index_of_component<CompType, ComponentType...>;
156
- using SequenceIdx = main_core::utils::SequenceIdx<ComponentType...>;
157
- using ComponentFlags = main_core::utils::ComponentFlags<ComponentType...>;
158
-
159
- using SequenceIdxView = std::array<std::span<Idx2D const >, n_types>;
160
-
152
+ using SequenceIdxView = std::array<std::span<Idx2D const >, main_core::utils::n_types<ComponentType...>>;
161
153
using OwnedUpdateDataset = std::tuple<std::vector<typename ComponentType::UpdateType>...>;
162
154
163
155
static constexpr Idx ignore_output{-1 };
@@ -187,8 +179,8 @@ class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLis
187
179
}
188
180
189
181
// helper function to get the number of components per type
190
- std::array<Idx, n_types> get_n_components_per_type () const {
191
- std::array<Idx, n_types> result{};
182
+ std::array<Idx, main_core::utils:: n_types<ComponentType...> > get_n_components_per_type () const {
183
+ std::array<Idx, main_core::utils:: n_types<ComponentType...> > result{};
192
184
size_t idx{};
193
185
main_core::utils::run_functor_with_all_types_return_void<ComponentType...>(
194
186
[&result, this , &idx]<typename CompType>() {
@@ -237,7 +229,7 @@ class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLis
237
229
template <class CompType , cache_type_c CacheType,
238
230
forward_iterator_like<typename CompType::UpdateType> ForwardIterator>
239
231
void update_component (ForwardIterator begin, ForwardIterator end, std::span<Idx2D const > sequence_idx) {
240
- constexpr auto comp_index = index_of_component<CompType>;
232
+ constexpr auto comp_index = main_core::utils:: index_of_component<CompType, ComponentType... >;
241
233
242
234
assert (construction_complete_);
243
235
assert (static_cast <ptrdiff_t >(sequence_idx.size ()) == std::distance (begin, end));
@@ -297,12 +289,14 @@ class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLis
297
289
298
290
// overload to update all components across all scenarios
299
291
template <cache_type_c CacheType, typename SequenceIdxMap>
300
- requires (std::same_as<SequenceIdxMap, SequenceIdx> || std::same_as<SequenceIdxMap, SequenceIdxView>)
292
+ requires (std::same_as<SequenceIdxMap, main_core::utils::SequenceIdx<ComponentType...>> ||
293
+ std::same_as<SequenceIdxMap, SequenceIdxView>)
301
294
void update_components (ConstDataset const & update_data, Idx pos, SequenceIdxMap const & sequence_idx_map) {
302
295
main_core::utils::run_functor_with_all_types_return_void<ComponentType...>(
303
296
[this , pos, &update_data, &sequence_idx_map]<typename CT>() {
304
- this ->update_component_row_col <CT, CacheType>(update_data, pos,
305
- std::get<index_of_component<CT>>(sequence_idx_map));
297
+ this ->update_component_row_col <CT, CacheType>(
298
+ update_data, pos,
299
+ std::get<main_core::utils::index_of_component<CT, ComponentType...>>(sequence_idx_map));
306
300
});
307
301
}
308
302
// overload to update all components in the first scenario (e.g. permanent update)
@@ -313,7 +307,7 @@ class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLis
313
307
}
314
308
315
309
template <typename CompType> void restore_component (SequenceIdxView const & sequence_idx) {
316
- constexpr auto component_index = index_of_component<CompType>;
310
+ constexpr auto component_index = main_core::utils:: index_of_component<CompType, ComponentType... >;
317
311
318
312
auto & cached_inverse_update = std::get<component_index>(cached_inverse_update_);
319
313
auto const & component_sequence = std::get<component_index>(sequence_idx);
@@ -331,13 +325,14 @@ class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLis
331
325
update_state (cached_state_changes_);
332
326
cached_state_changes_ = {};
333
327
}
334
- void restore_components (std::array<std::reference_wrapper<std::vector<Idx2D> const >, n_types> const & sequence_idx) {
335
- restore_components (
336
- std::array{std::span<Idx2D const >{std::get<index_of_component<ComponentType>>(sequence_idx).get ()}...});
328
+ void restore_components (std::array<std::reference_wrapper<std::vector<Idx2D> const >,
329
+ main_core::utils::n_types<ComponentType...>> const & sequence_idx) {
330
+ restore_components (std::array{std::span<Idx2D const >{
331
+ std::get<main_core::utils::index_of_component<ComponentType, ComponentType...>>(sequence_idx).get ()}...});
337
332
}
338
- void restore_components (SequenceIdx const & sequence_idx) {
339
- restore_components (
340
- std::array{std::span<Idx2D const >{std::get< index_of_component<ComponentType>>(sequence_idx)}...});
333
+ void restore_components (main_core::utils:: SequenceIdx<ComponentType...> const & sequence_idx) {
334
+ restore_components (std::array{std::span<Idx2D const >{
335
+ std::get<main_core::utils:: index_of_component<ComponentType, ComponentType... >>(sequence_idx)}...});
341
336
}
342
337
343
338
// set complete construction
@@ -393,7 +388,8 @@ class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLis
393
388
}
394
389
395
390
// Entry point for main_model.hpp
396
- template <class ... ComponentTypes> SequenceIdx get_all_sequence_idx_map (ConstDataset const & update_data) {
391
+ template <class ... ComponentTypes>
392
+ main_core::utils::SequenceIdx<ComponentType...> get_all_sequence_idx_map (ConstDataset const & update_data) {
397
393
return main_core::update::get_all_sequence_idx_map<ComponentType...>(state_, update_data);
398
394
}
399
395
@@ -534,7 +530,7 @@ class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLis
534
530
std::vector<CalculationInfo> infos (n_scenarios);
535
531
536
532
// lambda for sub batch calculation
537
- SequenceIdx all_scenarios_sequence;
533
+ main_core::utils:: SequenceIdx<ComponentType...> all_scenarios_sequence;
538
534
auto sub_batch =
539
535
sub_batch_calculation_ (calculation_fn, result_data, update_data, all_scenarios_sequence, exceptions, infos);
540
536
@@ -549,7 +545,8 @@ class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLis
549
545
template <typename Calculate>
550
546
requires std::invocable<std::remove_cvref_t <Calculate>, MainModelImpl&, MutableDataset const &, Idx>
551
547
auto sub_batch_calculation_ (Calculate&& calculation_fn, MutableDataset const & result_data,
552
- ConstDataset const & update_data, SequenceIdx& all_scenarios_sequence,
548
+ ConstDataset const & update_data,
549
+ main_core::utils::SequenceIdx<ComponentType...>& all_scenarios_sequence,
553
550
std::vector<std::string>& exceptions, std::vector<CalculationInfo>& infos) {
554
551
// const ref of current instance
555
552
MainModelImpl const & base_model = *this ;
@@ -576,7 +573,7 @@ class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLis
576
573
};
577
574
auto model = copy_model_functor (start);
578
575
579
- SequenceIdx current_scenario_sequence_cache = SequenceIdx{};
576
+ auto current_scenario_sequence_cache = main_core::utils:: SequenceIdx<ComponentType...> {};
580
577
auto [setup, winddown] = scenario_update_restore (model, update_data, is_independent, all_scenarios_sequence,
581
578
current_scenario_sequence_cache, infos);
582
579
@@ -650,13 +647,14 @@ class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLis
650
647
};
651
648
}
652
649
653
- static auto scenario_update_restore (MainModelImpl& model, ConstDataset const & update_data,
654
- ComponentFlags const & independence_flags,
655
- SequenceIdx const & all_scenario_sequence,
656
- SequenceIdx& current_scenario_sequence_cache,
657
- std::vector<CalculationInfo>& infos) noexcept {
650
+ static auto
651
+ scenario_update_restore (MainModelImpl& model, ConstDataset const & update_data,
652
+ main_core::utils::ComponentFlags<ComponentType...> const & independence_flags,
653
+ main_core::utils::SequenceIdx<ComponentType...> const & all_scenario_sequence,
654
+ main_core::utils::SequenceIdx<ComponentType...>& current_scenario_sequence_cache,
655
+ std::vector<CalculationInfo>& infos) noexcept {
658
656
auto do_update_cache = [&independence_flags] {
659
- ComponentFlags result;
657
+ main_core::utils:: ComponentFlags<ComponentType...> result;
660
658
std::ranges::transform (independence_flags, result.begin (), std::logical_not<>{});
661
659
return result;
662
660
}();
@@ -665,7 +663,7 @@ class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLis
665
663
&independence_flags]() -> SequenceIdxView {
666
664
return main_core::utils::run_functor_with_all_types_return_array<ComponentType...>(
667
665
[&all_scenario_sequence, ¤t_scenario_sequence_cache, &independence_flags]<typename CT>() {
668
- constexpr auto comp_idx = index_of_component<CT>;
666
+ constexpr auto comp_idx = main_core::utils:: index_of_component<CT, ComponentType... >;
669
667
if (std::get<comp_idx>(independence_flags)) {
670
668
return std::span<Idx2D const >{std::get<comp_idx>(all_scenario_sequence)};
671
669
}
@@ -845,7 +843,7 @@ class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLis
845
843
846
844
OwnedUpdateDataset cached_inverse_update_{};
847
845
UpdateChange cached_state_changes_{};
848
- std::array<std::vector<Idx2D>, n_types> parameter_changed_components_{};
846
+ std::array<std::vector<Idx2D>, main_core::utils:: n_types<ComponentType...> > parameter_changed_components_{};
849
847
#ifndef NDEBUG
850
848
// construction_complete is used for debug assertions only
851
849
bool construction_complete_{false };
@@ -970,7 +968,7 @@ class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLis
970
968
template <symmetry_tag sym> std::vector<MathModelParamIncrement> get_math_param_increment () {
971
969
using AddToIncrement = void (*)(std::vector<MathModelParamIncrement>&, MainModelState const &, Idx2D const &);
972
970
973
- static constexpr std::array<AddToIncrement, n_types> add_to_increments{
971
+ static constexpr std::array<AddToIncrement, main_core::utils:: n_types<ComponentType...> > add_to_increments{
974
972
[](std::vector<MathModelParamIncrement>& increments, MainModelState const & state,
975
973
Idx2D const & changed_component_idx) {
976
974
if constexpr (std::derived_from<ComponentType, Branch>) {
@@ -1009,7 +1007,7 @@ class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLis
1009
1007
1010
1008
std::vector<MathModelParamIncrement> math_param_increment (n_math_solvers_);
1011
1009
1012
- for (size_t i = 0 ; i < n_types; ++i) {
1010
+ for (size_t i = 0 ; i < main_core::utils:: n_types<ComponentType...> ; ++i) {
1013
1011
auto const & changed_type_components = parameter_changed_components_[i];
1014
1012
auto const & add_type_to_increment = add_to_increments[i];
1015
1013
for (auto const & changed_component : changed_type_components) {
@@ -1267,8 +1265,11 @@ class MainModelImpl<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLis
1267
1265
1268
1266
// Check the branch and shunt indices
1269
1267
constexpr auto branch_param_in_seq_map =
1270
- std::array{index_of_component<Line>, index_of_component<Link>, index_of_component<Transformer>};
1271
- constexpr auto shunt_param_in_seq_map = std::array{index_of_component<Shunt>};
1268
+ std::array{main_core::utils::index_of_component<Line, ComponentType...>,
1269
+ main_core::utils::index_of_component<Link, ComponentType...>,
1270
+ main_core::utils::index_of_component<Transformer, ComponentType...>};
1271
+ constexpr auto shunt_param_in_seq_map =
1272
+ std::array{main_core::utils::index_of_component<Shunt, ComponentType...>};
1272
1273
1273
1274
for (Idx i = 0 ; i != n_math_solvers_; ++i) {
1274
1275
// construct from existing Y_bus structure if possible
0 commit comments