Skip to content

Commit 8f9c7b8

Browse files
authored
Merge branch 'main' into feature/move-prepare-logic
Signed-off-by: Martijn Govers <[email protected]>
2 parents c6b6df8 + 56355b8 commit 8f9c7b8

File tree

8 files changed

+111
-94
lines changed

8 files changed

+111
-94
lines changed

power_grid_model_c/power_grid_model/include/power_grid_model/auxiliary/dataset.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,8 @@ template <dataset_type_tag dataset_type_> class Dataset {
490490
result.add_buffer(component_info.component->name, size, size, nullptr, nullptr);
491491
for (auto const& attribute_buffer : buffer.attributes) {
492492
result.add_attribute_buffer(component_info.component->name, attribute_buffer.meta_attribute->name,
493-
static_cast<Data*>(static_cast<AdvanceablePtr>(attribute_buffer.data)));
493+
static_cast<Data*>(static_cast<AdvanceablePtr>(attribute_buffer.data) +
494+
attribute_buffer.meta_attribute->size * offset));
494495
}
495496
} else {
496497
Data* data = component_info.component->advance_ptr(buffer.data, offset);

power_grid_model_c/power_grid_model/include/power_grid_model/job_adapter.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ class JobDispatchAdapter<MainModel, ComponentList<ComponentType...>>
8282

8383
// TODO(figueroa1395): Keep calculation_fn at the adapter level only
8484
template <typename Calculate>
85-
requires std::invocable<std::remove_cvref_t<Calculate>, MainModel&, MutableDataset const&, Idx>
85+
requires std::invocable<std::remove_cvref_t<Calculate>, MainModel&, MutableDataset const&, bool>
8686
void calculate_impl(Calculate&& calculation_fn, MutableDataset const& result_data, Idx scenario_idx) const {
87-
std::forward<Calculate>(calculation_fn)(model_.get(), result_data, scenario_idx);
87+
std::forward<Calculate>(calculation_fn)(model_.get(), result_data.get_individual_scenario(scenario_idx), false);
8888
}
8989

9090
template <typename Calculate>
@@ -99,7 +99,7 @@ class JobDispatchAdapter<MainModel, ComponentList<ComponentType...>>
9999
"sym_output",
100100
model_.get().meta_data(),
101101
},
102-
ignore_output);
102+
true);
103103
} catch (SparseMatrixError const&) { // NOLINT(bugprone-empty-catch) // NOSONAR
104104
// missing entries are provided in the update data
105105
} catch (NotObservableError const&) { // NOLINT(bugprone-empty-catch) // NOSONAR

power_grid_model_c/power_grid_model/include/power_grid_model/job_interface.hpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,15 @@ namespace power_grid_model {
1818
template <typename Adapter> class JobDispatchInterface {
1919
public:
2020
template <typename Calculate, typename ResultDataset>
21-
requires requires(Adapter& adapter, Calculate&& calculation_fn, ResultDataset const& result_data, Idx pos) {
22-
{ adapter.calculate_impl(std::forward<Calculate>(calculation_fn), result_data, pos) } -> std::same_as<void>;
21+
requires requires(Adapter& adapter, Calculate&& calculation_fn, ResultDataset const& result_data,
22+
Idx scenario_idx) {
23+
{
24+
adapter.calculate_impl(std::forward<Calculate>(calculation_fn), result_data, scenario_idx)
25+
} -> std::same_as<void>;
2326
}
24-
void calculate(Calculate&& calculation_fn, ResultDataset const& result_data, Idx pos = 0) {
25-
return static_cast<Adapter*>(this)->calculate_impl(std::forward<Calculate>(calculation_fn), result_data, pos);
27+
void calculate(Calculate&& calculation_fn, ResultDataset const& result_data, Idx scenario_idx = 0) {
28+
return static_cast<Adapter*>(this)->calculate_impl(std::forward<Calculate>(calculation_fn), result_data,
29+
scenario_idx);
2630
}
2731

2832
template <typename Calculate>

power_grid_model_c/power_grid_model/include/power_grid_model/main_core/output.hpp

Lines changed: 57 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,25 @@ constexpr auto comp_base_sequence_cbegin(MainModelState<ComponentContainer> cons
8585
return state.comp_topo->regulated_object_idx.cbegin() + get_component_sequence_offset<Regulator, Component>(state);
8686
}
8787

88-
template <typename Component, typename IndexType, class ComponentContainer, typename ResIt, typename ResFunc>
88+
template <std::derived_from<Base> Component, class ComponentContainer>
89+
requires model_component_state_c<MainModelState, ComponentContainer, Component>
90+
constexpr auto comp_base_sequence(MainModelState<ComponentContainer> const& state) {
91+
auto const start = comp_base_sequence_cbegin<Component>(state);
92+
return std::ranges::subrange{start, start + get_component_size<Component>(state)};
93+
}
94+
95+
template <typename Component, typename IndexType, class ComponentContainer, std::ranges::viewable_range ComponentOutput,
96+
typename ResFunc>
8997
requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
9098
std::invocable<std::remove_cvref_t<ResFunc>, Component const&, IndexType> &&
9199
assignable_to<std::invoke_result_t<ResFunc, Component const&, IndexType>,
92-
std::add_lvalue_reference_t<std::iter_value_t<ResIt>>> &&
93-
std::convertible_to<IndexType,
94-
decltype(*comp_base_sequence_cbegin<Component>(MainModelState<ComponentContainer>{}))>
95-
constexpr ResIt produce_output(MainModelState<ComponentContainer> const& state, ResIt res_it, ResFunc&& func) {
96-
return std::transform(get_component_citer<Component>(state).begin(), get_component_citer<Component>(state).end(),
97-
comp_base_sequence_cbegin<Component>(state), std::move(res_it), std::forward<ResFunc>(func));
100+
std::ranges::range_reference_t<ComponentOutput>> &&
101+
std::convertible_to<IndexType, std::ranges::range_value_t<decltype(comp_base_sequence<Component>(
102+
MainModelState<ComponentContainer>{}))>>
103+
constexpr void produce_output(MainModelState<ComponentContainer> const& state, ComponentOutput&& output,
104+
ResFunc&& func) {
105+
std::ranges::transform(get_component_citer<Component>(state), comp_base_sequence<Component>(state),
106+
std::ranges::begin(output), std::forward<ResFunc>(func));
98107
}
99108

100109
} // namespace detail
@@ -439,93 +448,86 @@ output_result(Component const& transformer_tap_regulator, MainModelState<Compone
439448

440449
// output base component
441450
template <std::derived_from<Base> Component, class ComponentContainer, solver_output_type SolverOutputType,
442-
typename ResIt>
451+
std::ranges::viewable_range ComponentOutput>
443452
requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
444453
requires(Component const& component, std::vector<SolverOutputType> const& solver_output, Idx2D math_id) {
445454
{
446455
output_result<Component>(component, solver_output, math_id)
447-
} -> detail::assignable_to<std::add_lvalue_reference_t<std::iter_value_t<ResIt>>>;
456+
} -> detail::assignable_to<std::ranges::range_reference_t<ComponentOutput>>;
448457
}
449-
constexpr ResIt output_result(MainModelState<ComponentContainer> const& state,
450-
MathOutput<std::vector<SolverOutputType>> const& math_output, ResIt res_it) {
451-
return detail::produce_output<Component, Idx2D>(
452-
state, res_it, [&math_output](Component const& component, Idx2D math_id) {
458+
constexpr void output_result(MainModelState<ComponentContainer> const& state,
459+
MathOutput<std::vector<SolverOutputType>> const& math_output, ComponentOutput&& output) {
460+
detail::produce_output<Component, Idx2D>(
461+
state, std::forward<ComponentOutput>(output), [&math_output](Component const& component, Idx2D math_id) {
453462
return output_result<Component>(component, math_output.solver_output, math_id);
454463
});
455464
}
456465
template <std::derived_from<Base> Component, class ComponentContainer, solver_output_type SolverOutputType,
457-
typename ResIt>
466+
std::ranges::viewable_range ComponentOutput>
458467
requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
459468
requires(Component const& component, MainModelState<ComponentContainer> const& state,
460469
std::vector<SolverOutputType> const& solver_output, Idx2D math_id) {
461470
{
462471
output_result<Component>(component, state, solver_output, math_id)
463-
} -> detail::assignable_to<std::add_lvalue_reference_t<std::iter_value_t<ResIt>>>;
472+
} -> detail::assignable_to<std::ranges::range_reference_t<ComponentOutput>>;
464473
}
465-
constexpr ResIt output_result(MainModelState<ComponentContainer> const& state,
466-
MathOutput<std::vector<SolverOutputType>> const& math_output, ResIt res_it) {
467-
return detail::produce_output<Component, Idx2D>(
468-
state, res_it, [&state, &math_output](Component const& component, Idx2D const math_id) {
469-
return output_result<Component>(component, state, math_output.solver_output, math_id);
470-
});
474+
constexpr void output_result(MainModelState<ComponentContainer> const& state,
475+
MathOutput<std::vector<SolverOutputType>> const& math_output, ComponentOutput&& output) {
476+
detail::produce_output<Component, Idx2D>(state, std::forward<ComponentOutput>(output),
477+
[&state, &math_output](Component const& component, Idx2D const math_id) {
478+
return output_result<Component>(component, state,
479+
math_output.solver_output, math_id);
480+
});
471481
}
472482
template <std::derived_from<Base> Component, class ComponentContainer, solver_output_type SolverOutputType,
473-
typename ResIt>
483+
std::ranges::viewable_range ComponentOutput>
474484
requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
475485
requires(Component const& component, MainModelState<ComponentContainer> const& state,
476486
std::vector<SolverOutputType> const& solver_output, Idx obj_seq) {
477487
{
478488
output_result<Component>(component, state, solver_output, obj_seq)
479-
} -> detail::assignable_to<std::add_lvalue_reference_t<std::iter_value_t<ResIt>>>;
489+
} -> detail::assignable_to<std::ranges::range_reference_t<ComponentOutput>>;
480490
}
481-
constexpr ResIt output_result(MainModelState<ComponentContainer> const& state,
482-
MathOutput<std::vector<SolverOutputType>> const& math_output, ResIt res_it) {
483-
return detail::produce_output<Component, Idx>(
484-
state, res_it, [&state, &math_output](Component const& component, Idx const obj_seq) {
485-
return output_result<Component, ComponentContainer>(component, state, math_output.solver_output, obj_seq);
486-
});
491+
constexpr void output_result(MainModelState<ComponentContainer> const& state,
492+
MathOutput<std::vector<SolverOutputType>> const& math_output, ComponentOutput&& output) {
493+
detail::produce_output<Component, Idx>(state, std::forward<ComponentOutput>(output),
494+
[&state, &math_output](Component const& component, Idx const obj_seq) {
495+
return output_result<Component, ComponentContainer>(
496+
component, state, math_output.solver_output, obj_seq);
497+
});
487498
}
488499
template <std::derived_from<Base> Component, class ComponentContainer, solver_output_type SolverOutputType,
489-
typename ResIt>
500+
std::ranges::viewable_range ComponentOutput>
490501
requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
491502
requires(Component const& component, std::vector<SolverOutputType> const& solver_output,
492503
Idx2DBranch3 const& math_id) {
493504
{
494505
output_result<Component>(component, solver_output, math_id)
495-
} -> detail::assignable_to<std::add_lvalue_reference_t<std::iter_value_t<ResIt>>>;
506+
} -> detail::assignable_to<std::ranges::range_reference_t<ComponentOutput>>;
496507
}
497-
constexpr ResIt output_result(MainModelState<ComponentContainer> const& state,
498-
MathOutput<std::vector<SolverOutputType>> const& math_output, ResIt res_it) {
499-
return detail::produce_output<Component, Idx2DBranch3>(
500-
state, res_it, [&math_output](Component const& component, Idx2DBranch3 const& math_id) {
508+
constexpr void output_result(MainModelState<ComponentContainer> const& state,
509+
MathOutput<std::vector<SolverOutputType>> const& math_output, ComponentOutput&& output) {
510+
detail::produce_output<Component, Idx2DBranch3>(
511+
state, std::forward<ComponentOutput>(output),
512+
[&math_output](Component const& component, Idx2DBranch3 const& math_id) {
501513
return output_result<Component>(component, math_output.solver_output, math_id);
502514
});
503515
}
504-
template <std::derived_from<Base> Component, class ComponentContainer, typename SolverOutputType, typename ResIt>
516+
template <std::derived_from<Base> Component, class ComponentContainer, typename SolverOutputType,
517+
std::ranges::viewable_range ComponentOutput>
505518
requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
506519
requires(Component const& component, MainModelState<ComponentContainer> const& state,
507520
MathOutput<SolverOutputType> const& math_output, Idx const obj_seq) {
508521
{
509522
output_result<Component>(component, state, math_output, obj_seq)
510-
} -> detail::assignable_to<std::add_lvalue_reference_t<std::iter_value_t<ResIt>>>;
523+
} -> detail::assignable_to<std::ranges::range_reference_t<ComponentOutput>>;
511524
}
512-
constexpr ResIt output_result(MainModelState<ComponentContainer> const& state,
513-
MathOutput<SolverOutputType> const& math_output, ResIt res_it) {
514-
return detail::produce_output<Component, Idx>(
515-
state, std::move(res_it), [&state, &math_output](Component const& component, Idx const obj_seq) {
516-
return output_result<Component, ComponentContainer>(component, state, math_output, obj_seq);
517-
});
518-
}
519-
520-
// output source, load_gen, shunt individually
521-
template <std::same_as<Appliance> Component, class ComponentContainer, solver_output_type SolverOutputType,
522-
typename ResIt>
523-
requires model_component_state_c<MainModelState, ComponentContainer, Component>
524-
constexpr ResIt output_result(MainModelState<ComponentContainer> const& state,
525-
MathOutput<std::vector<SolverOutputType>> const& math_output, ResIt res_it) {
526-
res_it = output_result<Source>(state, math_output, res_it);
527-
res_it = output_result<GenericLoadGen>(state, math_output, res_it);
528-
res_it = output_result<Shunt>(state, math_output, res_it);
529-
return res_it;
525+
constexpr void output_result(MainModelState<ComponentContainer> const& state,
526+
MathOutput<SolverOutputType> const& math_output, ComponentOutput&& output) {
527+
detail::produce_output<Component, Idx>(state, std::forward<ComponentOutput>(output),
528+
[&state, &math_output](Component const& component, Idx const obj_seq) {
529+
return output_result<Component, ComponentContainer>(
530+
component, state, math_output, obj_seq);
531+
});
530532
}
531533
} // namespace power_grid_model::main_core

0 commit comments

Comments
 (0)