Skip to content

Commit

Permalink
logic in place
Browse files Browse the repository at this point in the history
Signed-off-by: Jerry Guo <Jerry.Jinfeng.Guo@alliander.com>
  • Loading branch information
Jerry-Jinfeng-Guo committed Jan 29, 2025
1 parent ddb8a6d commit 0f50854
Showing 1 changed file with 32 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -398,13 +398,15 @@ constexpr IntS one_step_tap_down(transformer_c auto const& transformer) {
// higher voltage at control side => lower voltage at tap side => lower tap pos
constexpr IntS one_step_control_voltage_up(transformer_c auto const& transformer, bool const& control_at_tap_side) {
if (control_at_tap_side) {
// control side is tap side, voltage up requires tap up
return one_step_tap_up(transformer);
}
return one_step_tap_down(transformer);
}
// lower voltage at control side => higher voltage at tap side => higher tap pos
constexpr IntS one_step_control_voltage_down(transformer_c auto const& transformer, bool const& control_at_tap_side) {
if (control_at_tap_side) {
// control side is tap side, voltage down requires tap down
return one_step_tap_down(transformer);
}
return one_step_tap_up(transformer);
Expand Down Expand Up @@ -432,8 +434,8 @@ template <transformer_c... TransformerTypes> class TransformerWrapper {
IntS tap_max() const {
return apply([](auto const& t) { return t.tap_max(); });
}
std::variant<typename TransformerTypes::SideType...> tap_side() const {
return apply([](auto const& t) { return t.tap_side(); });
IntS tap_side() const {
return std::visit([](auto const& t) -> IntS { return static_cast<IntS>(t.get().tap_side()); }, transformer_);
}
int64_t tap_range() const {
return apply([](auto const& t) {
Expand All @@ -456,14 +458,12 @@ template <transformer_c... TransformerTypes> class TransformerWrapper {
template <transformer_c... TransformerTypes> struct TapRegulatorRef {
std::reference_wrapper<const TransformerTapRegulator> regulator;
TransformerWrapper<TransformerTypes...> transformer;

bool control_at_tap_side() const {
return std::visit(
[this](auto const& side) {
return static_cast<IntS>(regulator.get().control_side()) == static_cast<IntS>(side);
},
transformer.tap_side());
return static_cast<IntS>(regulator.get().control_side()) == transformer.tap_side();
}
};

template <typename State>
requires main_core::component_container_c<typename State::ComponentContainer, TransformerTapRegulator>
TransformerTapRegulator const& find_regulator(State const& state, ID regulated_object) {
Expand Down Expand Up @@ -1136,21 +1136,21 @@ class TapPositionOptimizerImpl<std::tuple<TransformerTypes...>, StateCalculator,
auto pilot_run(std::vector<std::vector<RegulatedTransformer>> const& regulator_order) {
using namespace std::string_literals;

// constexpr auto max_voltage_pos = [](transformer_c auto const& transformer, bool /*unused*/) -> IntS {
// // max voltage at control side => min voltage at tap side => min tap pos
// return transformer.tap_min();
// };
// constexpr auto min_voltage_pos = [](transformer_c auto const& transformer, bool /*unused*/) -> IntS {
// // min voltage at control side => max voltage at tap side => max tap pos
// return transformer.tap_max();
// };
constexpr auto max_voltage_pos = [](RegulatedTransformer const& reg_transformer) -> IntS {
constexpr auto max_voltage_pos = [](transformer_c auto const& transformer, bool control_at_tap_side) -> IntS {
if (control_at_tap_side) {
// min voltage at control side => max voltage at tap side => max tap pos
return transformer.tap_max();
}
// max voltage at control side => min voltage at tap side => min tap pos
return reg_transformer.transformer.tap_min();
return transformer.tap_min();
};
constexpr auto min_voltage_pos = [](RegulatedTransformer const& reg_transformer) -> IntS {
constexpr auto min_voltage_pos = [](transformer_c auto const& transformer, bool control_at_tap_side) -> IntS {
if (control_at_tap_side) {
// max voltage at control side => min voltage at tap side => min tap pos
return transformer.tap_min();
}
// min voltage at control side => max voltage at tap side => max tap pos
return reg_transformer.transformer.tap_max();
return transformer.tap_max();
};

switch (strategy_) {
Expand Down Expand Up @@ -1179,19 +1179,11 @@ class TapPositionOptimizerImpl<std::tuple<TransformerTypes...>, StateCalculator,
void exploit_neighborhood(std::vector<std::vector<RegulatedTransformer>> const& regulator_order) {
using namespace std::string_literals;

// constexpr auto increment_voltage = [](transformer_c auto const& transformer, bool control_at_tap_side) ->
// IntS {
// return one_step_control_voltage_up(transformer, control_at_tap_side);
// };
// constexpr auto decrement_voltage = [](transformer_c auto const& transformer, bool control_at_tap_side) ->
// IntS {
// return one_step_control_voltage_down(transformer, control_at_tap_side);
// };
constexpr auto increment_voltage = [](RegulatedTransformer const& reg_transformer) -> IntS {
return one_step_control_voltage_up(reg_transformer.transformer, reg_transformer.control_at_tap_side());
constexpr auto increment_voltage = [](transformer_c auto const& transformer, bool control_at_tap_side) -> IntS {
return one_step_control_voltage_up(transformer, control_at_tap_side);
};
constexpr auto decrement_voltage = [](RegulatedTransformer const& reg_transformer) -> IntS {
return one_step_control_voltage_down(reg_transformer.transformer, reg_transformer.control_at_tap_side());
constexpr auto decrement_voltage = [](transformer_c auto const& transformer, bool control_at_tap_side) -> IntS {
return one_step_control_voltage_down(transformer, control_at_tap_side);
};

switch (strategy_) {
Expand Down Expand Up @@ -1222,25 +1214,29 @@ class TapPositionOptimizerImpl<std::tuple<TransformerTypes...>, StateCalculator,
}

template <typename Func>
requires(std::invocable<Func, RegulatedTransformer const&> &&
std::same_as<std::invoke_result_t<Func, RegulatedTransformer const&>, IntS>)
requires((std::invocable<Func, TransformerTypes const&, bool> &&
std::same_as<std::invoke_result_t<Func, TransformerTypes const&, bool>, IntS>) &&
...)
auto regulate_transformers(Func to_new_tap_pos,
std::vector<std::vector<RegulatedTransformer>> const& regulator_order) const {
UpdateBuffer update_data;

auto const get_update = [to_new_tap_pos_func = std::move(to_new_tap_pos),
&update_data](RegulatedTransformer const& reg_transformer) {
add_tap_pos_update(to_new_tap_pos_func(reg_transformer), reg_transformer.transformer, update_data);
&update_data](transformer_c auto const& transformer, bool control_at_tap_side) {
add_tap_pos_update(to_new_tap_pos_func(transformer, control_at_tap_side), transformer, update_data);
};

for (auto const& sub_order : regulator_order) {
for (auto const& regulator : sub_order) {
regulator.apply(get_update);
bool const control_at_tap_side = regulator.control_at_tap_side();
regulator.transformer.apply(
[&](auto const& transformer) { get_update(transformer, control_at_tap_side); });
}
}

update_state(update_data);
}

static constexpr auto component_cache_update(transformer_c auto const& transformer) {
auto result = get_nan_update(transformer);

Expand Down

0 comments on commit 0f50854

Please sign in to comment.