From e0b3f57dcc2b4d4cfaaf44bbed288297c3541984 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Fri, 15 Aug 2025 09:08:36 +0200 Subject: [PATCH 01/26] logging calculation info Signed-off-by: Martijn Govers --- .../common/calculation_info.hpp | 63 ++++++++++++- .../power_grid_model/common/logging.hpp | 93 +++++++++++++++++++ .../power_grid_model/common/logging_impl.hpp | 49 ++++++++++ .../include/power_grid_model/common/timer.hpp | 30 ++---- .../include/power_grid_model/job_dispatch.hpp | 10 +- .../main_core/calculation_info.hpp | 9 +- .../power_grid_model/main_model_impl.hpp | 6 +- .../iterative_linear_se_solver.hpp | 3 +- .../math_solver/iterative_pf_solver.hpp | 3 +- .../math_solver/newton_raphson_se_solver.hpp | 3 +- 10 files changed, 223 insertions(+), 46 deletions(-) create mode 100644 power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp create mode 100644 power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index 1da3a37f69..3b8590e979 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -4,13 +4,74 @@ #pragma once +#include "logging_impl.hpp" + #include #include +#include #include +#include #include namespace power_grid_model { +namespace common::logging { +class CalculationInfo : public DefaultLogger { + using Data = std::map; + + public: + using const_iterator = Data::const_iterator; + + void log(LoggingTag tag, double value) override { log_impl(tag, value); } + void log(LoggingTag tag, Idx value) override { log_impl(tag, static_cast(value)); } + void merge(const CalculationInfo& other) { + for (const auto& [tag, value] : other.data_) { + log(tag, value); + } + } + + private: + Data data_; + + void log_impl(LoggingTag tag, double value) { + using enum LoggingTag; + + switch (tag) { + case timer: + return accumulate_log(tag, value); + case iterative_pf_solver_max_num_iter: + case ilse_max_num_iter: + case nrse_max_num_iter: + return maximize_log(tag, value); + default: + return; + } + } + void accumulate_log(LoggingTag tag, double value) { data_[tag] += value; } + void maximize_log(LoggingTag tag, double value) { data_[tag] = std::max(data_[tag], value); } + + public: + static std::string make_key(LoggingTag code) { // TODO(mgovers): make private + only use for reporting + auto const name = common::logging::to_string(code); + + std::stringstream ss; + ss << std::setw(4) << std::setfill('0') << static_cast>(code) << "."; + auto key = ss.str(); + for (size_t i = 0, n = key.length() - 1; i < n; ++i) { + if (key[i] == '0') { + break; + } + key += "\t"; + } + key += name; + return key; + } -using CalculationInfo = std::map>; + auto begin() { return std::ranges::begin(data_); } + auto begin() const { return std::ranges::begin(data_); } + auto end() { return std::ranges::end(data_); } + auto end() const { return std::ranges::end(data_); } +}; +} // namespace common::logging +using common::logging::CalculationInfo; } // namespace power_grid_model diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp new file mode 100644 index 0000000000..c01e8f4d58 --- /dev/null +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp @@ -0,0 +1,93 @@ +// SPDX-FileCopyrightText: Contributors to the Power Grid Model project +// +// SPDX-License-Identifier: MPL-2.0 + +#pragma once + +#include "common.hpp" + +#include + +namespace power_grid_model { +namespace common::logging { + +enum class LoggingTag : Idx { + unknown = -1, + log = 0, + timer = 1, + total_single_calculation_in_thread = 0100, + total_batch_calculation_in_thread = 0200, + copy_model = 1100, + update_model = 1200, + restore_model = 1201, + scenario_exception = 1300, + recover_from_bad = 1400, + prepare = 2100, + math_calculation = 2200, + iterative_pf_solver_max_num_iter = 2226, + ilse_max_num_iter = 2228, + nrse_max_num_iter = 2229, // used to be duplicate number + produce_output = 3000, +}; + +constexpr auto to_string(LoggingTag tag) { + using enum LoggingTag; + using namespace std::string_literals; + + switch (tag) { + case log: + return "log"s; + case timer: + return "timer"s; + case total_single_calculation_in_thread: + return "Total single calculation in thread"s; + case total_batch_calculation_in_thread: + return "Total batch calculation in thread"s; + case copy_model: + return "Copy model"s; + case update_model: + return "Update model"s; + case restore_model: + return "Restore model"s; + case scenario_exception: + return "Scenario exception"s; + case recover_from_bad: + return "Recover from bad"s; + case prepare: + return "Prepare"s; + case math_calculation: + return "Math calculation"s; + case iterative_pf_solver_max_num_iter: + // return "Iterative PF solver max num iter"s; + return "Max number of iterations"s; + case ilse_max_num_iter: + // return "ILSE max num iter"s; + return "Max number of iterations"s; + case nrse_max_num_iter: + // return "NRSE max num iter"s; + return "Max number of iterations"s; + case produce_output: + return "Produce output"s; + default: + return "unknown"s; + } +} + +struct Logger { + virtual void log(LoggingTag tag, std::string_view message) = 0; + virtual void log(LoggingTag tag, double value) = 0; + virtual void log(LoggingTag tag, Idx value) = 0; + + virtual ~Logger() = default; +}; + +struct LogDispatch : public Logger { + virtual void registrar(Logger* logger) = 0; + virtual void deregistrar(Logger* logger) = 0; +}; + +} // namespace common::logging + +using common::logging::LoggingTag; + +} // namespace power_grid_model diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp new file mode 100644 index 0000000000..5bfc81522e --- /dev/null +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp @@ -0,0 +1,49 @@ +// SPDX-FileCopyrightText: Contributors to the Power Grid Model project +// +// SPDX-License-Identifier: MPL-2.0 + +#pragma once + +#include "logging.hpp" + +#include +#include + +namespace power_grid_model::common::logging { +class DefaultLogger : public Logger { + void log(LoggingTag /*tag*/, std::string_view /*message*/) override {} + void log(LoggingTag /*tag*/, double /*value*/) override {} + void log(LoggingTag /*tag*/, Idx /*value*/) override {} +}; + +class LogDispatcher : public LogDispatch { + public: + void log(LoggingTag tag, std::string_view message) override { log_impl(tag, message); } + void log(LoggingTag tag, double value) override { log_impl(tag, value); } + void log(LoggingTag tag, Idx value) override { log_impl(tag, value); } + void registrar(Logger* logger) override { + if (logger) { + loggers_.push_back(logger); + } + } + void deregistrar(Logger* logger) override { + if (logger) { + std::erase(loggers_, logger); + } + } + + ~LogDispatcher() override = default; + + private: + std::vector loggers_; + + template void log_impl(LoggingTag tag, T value) { + for (auto& logger : loggers_) { + if (logger) { + logger->log(tag, value); + } + } + } +}; + +} // namespace power_grid_model::common::logging diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp index baeee42aa3..75a876cf0b 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp @@ -4,11 +4,10 @@ #pragma once -#include "calculation_info.hpp" +#include "calculation_info.hpp" // TODO(mgovers): remove this dependency from Timer #include "common.hpp" #include -#include #include namespace power_grid_model { @@ -19,15 +18,15 @@ using Duration = std::chrono::duration; class Timer { private: CalculationInfo* info_; - int code_; - std::string name_; + LoggingTag code_; Clock::time_point start_; public: - Timer() : info_(nullptr), code_{-1} {}; + Timer() : info_(nullptr), code_{LoggingTag::unknown} {}; - Timer(CalculationInfo& info, int code, std::string name) - : info_{&info}, code_{code}, name_{std::move(name)}, start_{Clock::now()} {} + explicit Timer(CalculationInfo& info, int code, std::string /*name*/) // TODO(mgovers): remove + : Timer(info, static_cast(code)) {} + Timer(CalculationInfo& info, LoggingTag code) : info_{&info}, code_{code}, start_{Clock::now()} {} Timer(Timer const&) = delete; Timer(Timer&&) = default; @@ -40,7 +39,6 @@ class Timer { // Copy/move members info_ = timer.info_; code_ = timer.code_; - name_ = std::move(timer.name_); start_ = timer.start_; // Disable original timer @@ -60,24 +58,10 @@ class Timer { if (info_ != nullptr) { auto const now = Clock::now(); auto const duration = Duration(now - start_); - info_->operator[](Timer::make_key(code_, name_)) += (double)duration.count(); + info_->log(code_, static_cast(duration.count())); info_ = nullptr; } } - - static std::string make_key(int code, std::string_view name) { - std::stringstream ss; - ss << std::setw(4) << std::setfill('0') << code << "."; - auto key = ss.str(); - for (size_t i = 0, n = key.length() - 1; i < n; ++i) { - if (key[i] == '0') { - break; - } - key += "\t"; - } - key += name; - return key; - } }; } // namespace power_grid_model diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/job_dispatch.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/job_dispatch.hpp index d95db1481e..197c00fc5d 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/job_dispatch.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/job_dispatch.hpp @@ -61,22 +61,22 @@ class JobDispatch { CalculationInfo thread_info; - Timer t_total(thread_info, 0200, "Total batch calculation in thread"); + Timer t_total{thread_info, LoggingTag::total_batch_calculation_in_thread}; auto const copy_adapter_functor = [&base_adapter, &thread_info]() { - Timer const t_copy_adapter_functor(thread_info, 1100, "Copy model"); + Timer const t_copy_adapter_functor{thread_info, LoggingTag::copy_model}; return Adapter{base_adapter}; }; auto adapter = copy_adapter_functor(); auto setup = [&adapter, &update_data, &thread_info](Idx scenario_idx) { - Timer const t_update_model(thread_info, 1200, "Update model"); + Timer const t_update_model{thread_info, LoggingTag::update_model}; adapter.setup(update_data, scenario_idx); }; auto winddown = [&adapter, &thread_info]() { - Timer const t_restore_model(thread_info, 1201, "Restore model"); + Timer const t_restore_model{thread_info, LoggingTag::restore_model}; adapter.winddown(); }; @@ -96,7 +96,7 @@ class JobDispatch { scenario_exception_handler(adapter, exceptions, thread_info), std::move(recover_from_bad)); for (Idx scenario_idx = start; scenario_idx < n_scenarios; scenario_idx += stride) { - Timer const t_total_single(thread_info, 0100, "Total single calculation in thread"); + Timer const t_total_single{thread_info, LoggingTag::total_single_calculation_in_thread}; calculate_scenario(scenario_idx); } diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/calculation_info.hpp index cb9100442e..5627bdafd5 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/calculation_info.hpp @@ -11,14 +11,7 @@ namespace power_grid_model::main_core { inline CalculationInfo& merge_into(CalculationInfo& destination, CalculationInfo const& source) { - static auto const key = Timer::make_key(2226, "Max number of iterations"); - for (auto const& [k, v] : source) { - if (k == key) { - destination[k] = std::max(destination[k], v); - } else { - destination[k] += v; - } - } + destination.merge(source); return destination; } diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/main_model_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/main_model_impl.hpp index f28e27892e..561800cd5c 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/main_model_impl.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/main_model_impl.hpp @@ -423,14 +423,14 @@ class MainModelImpl, ComponentLis calculation_info_ = CalculationInfo{}; // prepare auto const& input = [this, prepare_input_ = std::forward(prepare_input)] { - Timer const timer(calculation_info_, 2100, "Prepare"); + Timer const timer{calculation_info_, LoggingTag::prepare}; prepare_solvers(); assert(is_topology_up_to_date_ && is_parameter_up_to_date()); return prepare_input_(n_math_solvers_); }(); // calculate return [this, &input, solve_ = std::forward(solve)] { - Timer const timer(calculation_info_, 2200, "Math Calculation"); + Timer const timer{calculation_info_, LoggingTag::math_calculation}; auto& solvers = get_solvers(); auto& y_bus_vec = get_y_bus(); std::vector solver_output; @@ -595,7 +595,7 @@ class MainModelImpl, ComponentLis } }; - Timer const t_output(calculation_info_, 3000, "Produce output"); + Timer const t_output{calculation_info_, LoggingTag::produce_output}; main_core::utils::run_functor_with_all_types_return_void(output_func); } diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp index 9d3e5bf353..2d4f27942b 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp @@ -137,8 +137,7 @@ template class IterativeLinearSESolver { sub_timer.stop(); main_timer.stop(); - auto const key = Timer::make_key(2228, "Max number of iterations"); - calculation_info[key] = std::max(calculation_info[key], static_cast(num_iter)); + calculation_info.log(LoggingTag::ilse_max_num_iter, num_iter); return output; } diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp index c4557e5499..527c07ced9 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp @@ -75,8 +75,7 @@ template class IterativePFSolver { // Manually stop timers to avoid "Max number of iterations" to be included in the timing. main_timer.stop(); - auto const key = Timer::make_key(2226, "Max number of iterations"); - calculation_info[key] = std::max(calculation_info[key], static_cast(num_iter)); + calculation_info.log(LoggingTag::iterative_pf_solver_max_num_iter, num_iter); return output; } diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp index 3d93b59147..f8c00159db 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp @@ -197,8 +197,7 @@ template class NewtonRaphsonSESolver { sub_timer.stop(); main_timer.stop(); - auto const key = Timer::make_key(2228, "Max number of iterations"); - calculation_info[key] = std::max(calculation_info[key], static_cast(num_iter)); + calculation_info.log(LoggingTag::nrse_max_num_iter, num_iter); return output; } From 5f4ec7c0f30fbe851ce651c34a72324f65750627 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Tue, 19 Aug 2025 15:55:44 +0200 Subject: [PATCH 02/26] cleanup Signed-off-by: Martijn Govers --- .../include/power_grid_model/common/calculation_info.hpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index ec1720fd9b..4d5ba974f0 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -71,7 +71,11 @@ class CalculationInfo : public DefaultLogger { } } void accumulate_log(LogEvent tag, double value) { data_[tag] += value; } - void maximize_log(LogEvent tag, double value) { data_[tag] = std::max(data_[tag], value); } + void maximize_log(LogEvent tag, double value) { + if (auto& stored_value = data_[tag]; value > stored_value) { + stored_value = value; + } + } public: auto begin() { return std::ranges::begin(data_); } From 83a445922c726607b3b32c890713d7cf60bb080e Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Tue, 19 Aug 2025 16:40:26 +0200 Subject: [PATCH 03/26] replace calculation info with generic logger Signed-off-by: Martijn Govers --- .../power_grid_model/common/logging.hpp | 4 ++ .../power_grid_model/common/logging_impl.hpp | 8 ++- .../include/power_grid_model/common/timer.hpp | 5 +- .../iterative_linear_se_solver.hpp | 20 +++--- .../math_solver/iterative_pf_solver.hpp | 16 ++--- .../math_solver/linear_pf_solver.hpp | 11 ++-- .../math_solver/math_solver.hpp | 63 +++++++++---------- .../math_solver/math_solver_dispatch.hpp | 9 ++- .../math_solver/newton_raphson_se_solver.hpp | 18 +++--- tests/cpp_unit_tests/test_math_solver_pf.hpp | 29 ++++----- tests/cpp_unit_tests/test_math_solver_se.hpp | 60 +++++++++--------- 11 files changed, 122 insertions(+), 121 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp index 5d78653701..a7085201b8 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp @@ -48,6 +48,9 @@ struct Logger { virtual void log(LogEvent tag, double value) = 0; virtual void log(LogEvent tag, Idx value) = 0; + // creates a new logger of the same type as the current one + virtual std::unique_ptr clone() const = 0; + virtual ~Logger() = default; }; @@ -59,5 +62,6 @@ struct LogDispatch : public Logger { } // namespace common::logging using common::logging::LogEvent; +using common::logging::Logger; } // namespace power_grid_model diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp index 1aed158b32..b1d7b07329 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp @@ -14,6 +14,7 @@ class DefaultLogger : public Logger { void log(LogEvent /*tag*/, std::string_view /*message*/) override {} void log(LogEvent /*tag*/, double /*value*/) override {} void log(LogEvent /*tag*/, Idx /*value*/) override {} + std::unique_ptr clone() const override { return std::make_unique(); } }; class LogDispatcher : public LogDispatch { @@ -22,7 +23,7 @@ class LogDispatcher : public LogDispatch { void log(LogEvent tag, double value) override { log_impl(tag, value); } void log(LogEvent tag, Idx value) override { log_impl(tag, value); } void registrar(Logger* logger) override { - if (logger) { + if (logger && std::ranges::find(loggers_, logger) == loggers_.end()) { loggers_.push_back(logger); } } @@ -31,13 +32,16 @@ class LogDispatcher : public LogDispatch { std::erase(loggers_, logger); } } + std::unique_ptr clone() const override { return std::make_unique(); } ~LogDispatcher() override = default; private: std::vector loggers_; - template void log_impl(LogEvent tag, T value) { + template + requires std::same_as || std::same_as || std::same_as + void log_impl(LogEvent tag, T value) { for (auto& logger : loggers_) { if (logger) { logger->log(tag, value); diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp index 9e40caf2a3..05dc2426f1 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp @@ -4,7 +4,6 @@ #pragma once -#include "calculation_info.hpp" // TODO(mgovers): remove this dependency from Timer #include "common.hpp" #include "logging.hpp" @@ -18,13 +17,13 @@ using Duration = std::chrono::duration; class Timer { private: - CalculationInfo* info_; + Logger* info_; LogEvent code_; Clock::time_point start_; public: Timer() : info_(nullptr), code_{LogEvent::unknown} {}; - Timer(CalculationInfo& info, LogEvent code) : info_{&info}, code_{code}, start_{Clock::now()} {} + Timer(Logger& info, LogEvent code) : info_{&info}, code_{code}, start_{Clock::now()} {} Timer(Timer const&) = delete; Timer(Timer&&) = default; diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp index b9f069629b..121f6006fe 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp @@ -84,7 +84,7 @@ template class IterativeLinearSESolver { perm_(y_bus.size()) {} SolverOutput run_state_estimation(YBus const& y_bus, StateEstimationInput const& input, - double err_tol, Idx max_iter, CalculationInfo& calculation_info) { + double err_tol, Idx max_iter, Logger& log) { // prepare Timer main_timer; Timer sub_timer; @@ -93,22 +93,22 @@ template class IterativeLinearSESolver { output.bus_injection.resize(n_bus_); double max_dev = std::numeric_limits::max(); - main_timer = Timer{calculation_info, LogEvent::math_solver}; + main_timer = Timer{log, LogEvent::math_solver}; // preprocess measured value - sub_timer = Timer{calculation_info, LogEvent::preprocess_measured_value}; + sub_timer = Timer{log, LogEvent::preprocess_measured_value}; MeasuredValues const measured_values{y_bus.shared_topology(), input}; auto const observability_result = observability_check(measured_values, y_bus.math_topology(), y_bus.y_bus_structure()); // prepare matrix - sub_timer = Timer{calculation_info, LogEvent::prepare_matrix_including_prefactorization}; + sub_timer = Timer{log, LogEvent::prepare_matrix_including_prefactorization}; prepare_matrix(y_bus, measured_values); // prefactorize sparse_solver_.prefactorize(data_gain_, perm_, observability_result.use_perturbation()); // initialize voltage with initial angle - sub_timer = Timer{calculation_info, LogEvent::initialize_voltages}; // TODO(mgovers): make scoped subtimers + sub_timer = Timer{log, LogEvent::initialize_voltages}; // TODO(mgovers): make scoped subtimers RealValue const mean_angle_shift = measured_values.mean_angle_shift(); for (Idx bus = 0; bus != n_bus_; ++bus) { output.u[bus] = exp(1.0i * (mean_angle_shift + math_topo_->phase_shift[bus])); @@ -120,24 +120,24 @@ template class IterativeLinearSESolver { if (num_iter++ == max_iter) { throw IterationDiverge{max_iter, max_dev, err_tol}; } - sub_timer = Timer{calculation_info, LogEvent::calculate_rhs}; + sub_timer = Timer{log, LogEvent::calculate_rhs}; prepare_rhs(y_bus, measured_values, output.u); // solve with prefactorization - sub_timer = Timer{calculation_info, LogEvent::solve_sparse_linear_equation_prefactorized}; + sub_timer = Timer{log, LogEvent::solve_sparse_linear_equation_prefactorized}; sparse_solver_.solve_with_prefactorized_matrix(data_gain_, perm_, x_rhs_, x_rhs_); - sub_timer = Timer{calculation_info, LogEvent::iterate_unknown}; + sub_timer = Timer{log, LogEvent::iterate_unknown}; max_dev = iterate_unknown(output.u, measured_values.has_angle()); }; // calculate math result - sub_timer = Timer{calculation_info, LogEvent::calculate_math_result}; + sub_timer = Timer{log, LogEvent::calculate_math_result}; detail::calculate_se_result(y_bus, measured_values, output); // Manually stop timers to avoid "Max number of iterations" to be included in the timing. sub_timer.stop(); main_timer.stop(); - calculation_info.log(LogEvent::max_num_iter, num_iter); + log.log(LogEvent::max_num_iter, num_iter); return output; } diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp index 4c8eaf315f..04b3a9bf95 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp @@ -25,7 +25,7 @@ template class IterativePFSolver { public: friend DerivedSolver; SolverOutput run_power_flow(YBus const& y_bus, PowerFlowInput const& input, double err_tol, - Idx max_iter, CalculationInfo& calculation_info) { + Idx max_iter, Logger& log) { // get derived reference for derived solver class auto derived_solver = static_cast(*this); @@ -34,11 +34,11 @@ template class IterativePFSolver { output.u.resize(n_bus_); double max_dev = std::numeric_limits::infinity(); - Timer main_timer{calculation_info, LogEvent::math_solver}; + Timer main_timer{log, LogEvent::math_solver}; // initialize { - Timer const sub_timer{calculation_info, LogEvent::initialize_calculation}; + Timer const sub_timer{log, LogEvent::initialize_calculation}; // Further initialization specific to the derived solver derived_solver.initialize_derived_solver(y_bus, input, output); } @@ -52,30 +52,30 @@ template class IterativePFSolver { } { // Prepare the matrices of linear equations to be solved - Timer const sub_timer{calculation_info, LogEvent::prepare_matrices}; + Timer const sub_timer{log, LogEvent::prepare_matrices}; derived_solver.prepare_matrix_and_rhs(y_bus, input, output.u); } { // Solve the linear equations - Timer const sub_timer{calculation_info, LogEvent::solve_sparse_linear_equation}; + Timer const sub_timer{log, LogEvent::solve_sparse_linear_equation}; derived_solver.solve_matrix(); } { // Calculate maximum deviation of voltage at any bus - Timer const sub_timer{calculation_info, LogEvent::iterate_unknown}; + Timer const sub_timer{log, LogEvent::iterate_unknown}; max_dev = derived_solver.iterate_unknown(output.u); } } // calculate math result { - Timer const sub_timer{calculation_info, LogEvent::calculate_math_result}; + Timer const sub_timer{log, LogEvent::calculate_math_result}; calculate_result(y_bus, input, output); } // Manually stop timers to avoid "Max number of iterations" to be included in the timing. main_timer.stop(); - calculation_info.log(LogEvent::iterative_pf_solver_max_num_iter, num_iter); + log.log(LogEvent::iterative_pf_solver_max_num_iter, num_iter); return output; } diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp index c9765fbdaa..3dd49cfe27 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp @@ -62,28 +62,27 @@ template class LinearPFSolver { sparse_solver_{y_bus.shared_indptr_lu(), y_bus.shared_indices_lu(), y_bus.shared_diag_lu()}, perm_(n_bus_) {} - SolverOutput run_power_flow(YBus const& y_bus, PowerFlowInput const& input, - CalculationInfo& calculation_info) { + SolverOutput run_power_flow(YBus const& y_bus, PowerFlowInput const& input, Logger& log) { using enum LogEvent; // output SolverOutput output; output.u.resize(n_bus_); - Timer const main_timer{calculation_info, math_solver}; + Timer const main_timer{log, math_solver}; // prepare matrix - Timer sub_timer{calculation_info, prepare_matrix}; + Timer sub_timer{log, prepare_matrix}; detail::copy_y_bus(y_bus, mat_data_); prepare_matrix_and_rhs(y_bus, input, output); // solve // u vector will have I_injection for slack bus for now - sub_timer = Timer{calculation_info, solve_sparse_linear_equation}; + sub_timer = Timer{log, solve_sparse_linear_equation}; sparse_solver_.prefactorize_and_solve(mat_data_, perm_, output.u, output.u); // calculate math result - sub_timer = Timer{calculation_info, calculate_math_result}; + sub_timer = Timer{log, calculate_math_result}; calculate_result(y_bus, input, output); // output diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver.hpp index 63aad17412..75deca5994 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver.hpp @@ -34,9 +34,8 @@ template class MathSolver : public MathSolverBase { MathSolver* clone() const final { return new MathSolver(*this); } - SolverOutput run_power_flow(PowerFlowInput const& input, double err_tol, Idx max_iter, - CalculationInfo& calculation_info, CalculationMethod calculation_method, - YBus const& y_bus) final { + SolverOutput run_power_flow(PowerFlowInput const& input, double err_tol, Idx max_iter, Logger& log, + CalculationMethod calculation_method, YBus const& y_bus) final { using enum CalculationMethod; // set method to always linear if all load_gens have const_y @@ -46,20 +45,20 @@ template class MathSolver : public MathSolverBase { case default_method: [[fallthrough]]; // use Newton-Raphson by default case newton_raphson: - return run_power_flow_newton_raphson(input, err_tol, max_iter, calculation_info, y_bus); + return run_power_flow_newton_raphson(input, err_tol, max_iter, log, y_bus); case linear: - return run_power_flow_linear(input, err_tol, max_iter, calculation_info, y_bus); + return run_power_flow_linear(input, err_tol, max_iter, log, y_bus); case linear_current: - return run_power_flow_linear_current(input, err_tol, max_iter, calculation_info, y_bus); + return run_power_flow_linear_current(input, err_tol, max_iter, log, y_bus); case iterative_current: - return run_power_flow_iterative_current(input, err_tol, max_iter, calculation_info, y_bus); + return run_power_flow_iterative_current(input, err_tol, max_iter, log, y_bus); default: throw InvalidCalculationMethod{}; } } SolverOutput run_state_estimation(StateEstimationInput const& input, double err_tol, Idx max_iter, - CalculationInfo& calculation_info, CalculationMethod calculation_method, + Logger& log, CalculationMethod calculation_method, YBus const& y_bus) final { using enum CalculationMethod; @@ -67,15 +66,15 @@ template class MathSolver : public MathSolverBase { case default_method: [[fallthrough]]; // use iterative linear by default case iterative_linear: - return run_state_estimation_iterative_linear(input, err_tol, max_iter, calculation_info, y_bus); + return run_state_estimation_iterative_linear(input, err_tol, max_iter, log, y_bus); case newton_raphson: - return run_state_estimation_newton_raphson(input, err_tol, max_iter, calculation_info, y_bus); + return run_state_estimation_newton_raphson(input, err_tol, max_iter, log, y_bus); default: throw InvalidCalculationMethod{}; } } - ShortCircuitSolverOutput run_short_circuit(ShortCircuitInput const& input, CalculationInfo& calculation_info, + ShortCircuitSolverOutput run_short_circuit(ShortCircuitInput const& input, Logger& log, CalculationMethod calculation_method, YBus const& y_bus) final { if (calculation_method != CalculationMethod::default_method && @@ -85,7 +84,7 @@ template class MathSolver : public MathSolverBase { // construct model if needed if (!iec60909_sc_solver_.has_value()) { - Timer const timer{calculation_info, LogEvent::create_math_solver}; + Timer const timer{log, LogEvent::create_math_solver}; iec60909_sc_solver_.emplace(y_bus, topo_ptr_); } @@ -117,65 +116,59 @@ template class MathSolver : public MathSolverBase { std::optional> iec60909_sc_solver_; SolverOutput run_power_flow_newton_raphson(PowerFlowInput const& input, double err_tol, Idx max_iter, - CalculationInfo& calculation_info, YBus const& y_bus) { + Logger& log, YBus const& y_bus) { if (!newton_raphson_pf_solver_.has_value()) { - Timer const timer{calculation_info, LogEvent::create_math_solver}; + Timer const timer{log, LogEvent::create_math_solver}; newton_raphson_pf_solver_.emplace(y_bus, topo_ptr_); } - return newton_raphson_pf_solver_.value().run_power_flow(y_bus, input, err_tol, max_iter, calculation_info); + return newton_raphson_pf_solver_.value().run_power_flow(y_bus, input, err_tol, max_iter, log); } SolverOutput run_power_flow_linear(PowerFlowInput const& input, double /* err_tol */, Idx /* max_iter */, - CalculationInfo& calculation_info, YBus const& y_bus) { + Logger& log, YBus const& y_bus) { if (!linear_pf_solver_.has_value()) { - Timer const timer{calculation_info, LogEvent::create_math_solver}; + Timer const timer{log, LogEvent::create_math_solver}; linear_pf_solver_.emplace(y_bus, topo_ptr_); } - return linear_pf_solver_.value().run_power_flow(y_bus, input, calculation_info); + return linear_pf_solver_.value().run_power_flow(y_bus, input, log); } SolverOutput run_power_flow_iterative_current(PowerFlowInput const& input, double err_tol, Idx max_iter, - CalculationInfo& calculation_info, YBus const& y_bus) { + Logger& log, YBus const& y_bus) { if (!iterative_current_pf_solver_.has_value()) { - Timer const timer{calculation_info, LogEvent::create_math_solver}; + Timer const timer{log, LogEvent::create_math_solver}; iterative_current_pf_solver_.emplace(y_bus, topo_ptr_); } - return iterative_current_pf_solver_.value().run_power_flow(y_bus, input, err_tol, max_iter, calculation_info); + return iterative_current_pf_solver_.value().run_power_flow(y_bus, input, err_tol, max_iter, log); } SolverOutput run_power_flow_linear_current(PowerFlowInput const& input, double /* err_tol */, - Idx /* max_iter */, CalculationInfo& calculation_info, - YBus const& y_bus) { - return run_power_flow_iterative_current(input, std::numeric_limits::infinity(), 1, calculation_info, - y_bus); + Idx /* max_iter */, Logger& log, YBus const& y_bus) { + return run_power_flow_iterative_current(input, std::numeric_limits::infinity(), 1, log, y_bus); } SolverOutput run_state_estimation_iterative_linear(StateEstimationInput const& input, double err_tol, - Idx max_iter, CalculationInfo& calculation_info, - YBus const& y_bus) { + Idx max_iter, Logger& log, YBus const& y_bus) { // construct model if needed if (!iterative_linear_se_solver_.has_value()) { - Timer const timer{calculation_info, LogEvent::create_math_solver}; + Timer const timer{log, LogEvent::create_math_solver}; iterative_linear_se_solver_.emplace(y_bus, topo_ptr_); } // call calculation - return iterative_linear_se_solver_.value().run_state_estimation(y_bus, input, err_tol, max_iter, - calculation_info); + return iterative_linear_se_solver_.value().run_state_estimation(y_bus, input, err_tol, max_iter, log); } SolverOutput run_state_estimation_newton_raphson(StateEstimationInput const& input, double err_tol, - Idx max_iter, CalculationInfo& calculation_info, - YBus const& y_bus) { + Idx max_iter, Logger& log, YBus const& y_bus) { // construct model if needed if (!newton_raphson_se_solver_.has_value()) { - Timer const timer{calculation_info, LogEvent::create_math_solver}; + Timer const timer{log, LogEvent::create_math_solver}; newton_raphson_se_solver_.emplace(y_bus, topo_ptr_); } // call calculation - return newton_raphson_se_solver_.value().run_state_estimation(y_bus, input, err_tol, max_iter, - calculation_info); + return newton_raphson_se_solver_.value().run_state_estimation(y_bus, input, err_tol, max_iter, log); } }; diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver_dispatch.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver_dispatch.hpp index 00f17c7ff0..19cbe7d3e1 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver_dispatch.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver_dispatch.hpp @@ -30,13 +30,12 @@ template class MathSolverBase { virtual MathSolverBase* clone() const = 0; virtual SolverOutput run_power_flow(PowerFlowInput const& input, double err_tol, Idx max_iter, - CalculationInfo& calculation_info, CalculationMethod calculation_method, + Logger& log, CalculationMethod calculation_method, YBus const& y_bus) = 0; virtual SolverOutput run_state_estimation(StateEstimationInput const& input, double err_tol, Idx max_iter, - CalculationInfo& calculation_info, - CalculationMethod calculation_method, YBus const& y_bus) = 0; - virtual ShortCircuitSolverOutput run_short_circuit(ShortCircuitInput const& input, - CalculationInfo& calculation_info, + Logger& log, CalculationMethod calculation_method, + YBus const& y_bus) = 0; + virtual ShortCircuitSolverOutput run_short_circuit(ShortCircuitInput const& input, Logger& log, CalculationMethod calculation_method, YBus const& y_bus) = 0; virtual void clear_solver() = 0; diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp index c2cbf32299..54b9ba9c48 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp @@ -152,7 +152,7 @@ template class NewtonRaphsonSESolver { perm_(y_bus.size()) {} SolverOutput run_state_estimation(YBus const& y_bus, StateEstimationInput const& input, - double err_tol, Idx max_iter, CalculationInfo& calculation_info) { + double err_tol, Idx max_iter, Logger& log) { // prepare Timer main_timer; Timer sub_timer; @@ -161,16 +161,16 @@ template class NewtonRaphsonSESolver { output.bus_injection.resize(n_bus_); double max_dev = std::numeric_limits::max(); - main_timer = Timer{calculation_info, LogEvent::math_solver}; + main_timer = Timer{log, LogEvent::math_solver}; // preprocess measured value - sub_timer = Timer{calculation_info, LogEvent::preprocess_measured_value}; + sub_timer = Timer{log, LogEvent::preprocess_measured_value}; MeasuredValues const measured_values{y_bus.shared_topology(), input}; auto const observability_result = observability_check(measured_values, y_bus.math_topology(), y_bus.y_bus_structure()); // initialize voltage with initial angle - sub_timer = Timer{calculation_info, LogEvent::initialize_voltages}; + sub_timer = Timer{log, LogEvent::initialize_voltages}; initialize_unknown(output.u, measured_values); // loop to iterate @@ -179,25 +179,25 @@ template class NewtonRaphsonSESolver { if (num_iter++ == max_iter) { throw IterationDiverge{max_iter, max_dev, err_tol}; } - sub_timer = Timer{calculation_info, LogEvent::prepare_lhs_rhs}; + sub_timer = Timer{log, LogEvent::prepare_lhs_rhs}; prepare_matrix_and_rhs(y_bus, measured_values, output.u); // solve with prefactorization - sub_timer = Timer{calculation_info, LogEvent::solve_sparse_linear_equation}; + sub_timer = Timer{log, LogEvent::solve_sparse_linear_equation}; sparse_solver_.prefactorize_and_solve(data_gain_, perm_, delta_x_rhs_, delta_x_rhs_, observability_result.use_perturbation()); - sub_timer = Timer{calculation_info, LogEvent::iterate_unknown}; + sub_timer = Timer{log, LogEvent::iterate_unknown}; max_dev = iterate_unknown(output.u, measured_values); }; // calculate math result - sub_timer = Timer{calculation_info, LogEvent::calculate_math_result}; + sub_timer = Timer{log, LogEvent::calculate_math_result}; detail::calculate_se_result(y_bus, measured_values, output); // Manually stop timers to avoid "Max number of iterations" to be included in the timing. sub_timer.stop(); main_timer.stop(); - calculation_info.log(LogEvent::max_num_iter, num_iter); + log.log(LogEvent::max_num_iter, num_iter); return output; } diff --git a/tests/cpp_unit_tests/test_math_solver_pf.hpp b/tests/cpp_unit_tests/test_math_solver_pf.hpp index 1971d83ea4..d51d445766 100644 --- a/tests/cpp_unit_tests/test_math_solver_pf.hpp +++ b/tests/cpp_unit_tests/test_math_solver_pf.hpp @@ -8,7 +8,7 @@ #include "test_math_solver_common.hpp" -#include +#include #include #include @@ -16,11 +16,11 @@ namespace power_grid_model { template inline auto run_power_flow(SolverType& solver, YBus const& y_bus, PowerFlowInput const& input, double err_tol, Idx max_iter, - CalculationInfo& calculation_info) { + Logger& log) { if constexpr (SolverType::is_iterative) { - return solver.run_power_flow(y_bus, input, err_tol, max_iter, calculation_info); + return solver.run_power_flow(y_bus, input, err_tol, max_iter, log); } else { - return solver.run_power_flow(y_bus, input, calculation_info); + return solver.run_power_flow(y_bus, input, log); } }; @@ -74,6 +74,7 @@ template struct PFSolverTestGrid : public SteadyStateSol TEST_CASE_TEMPLATE_DEFINE("Test math solver - PF", SolverType, test_math_solver_pf_id) { using sym = typename SolverType::sym; + using common::logging::DefaultLogger; PFSolverTestGrid const grid; @@ -89,20 +90,20 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - PF", SolverType, test_math_solver_ SolverType::is_iterative ? 1e-12 : 0.15; // linear methods may be very inaccurate SolverType solver{y_bus, topo_ptr}; - CalculationInfo info; + DefaultLogger log; PowerFlowInput const pf_input = grid.pf_input(); - SolverOutput const output = run_power_flow(solver, y_bus, pf_input, error_tolerance, num_iter, info); + SolverOutput const output = run_power_flow(solver, y_bus, pf_input, error_tolerance, num_iter, log); assert_output(output, grid.output_ref(), false, result_tolerance); } SUBCASE("Test const z pf solver") { SolverType solver{y_bus, topo_ptr}; - CalculationInfo info; + DefaultLogger log; // const z PowerFlowInput const pf_input_z = grid.pf_input_z(); - SolverOutput const output = run_power_flow(solver, y_bus, pf_input_z, 1e-12, 20, info); + SolverOutput const output = run_power_flow(solver, y_bus, pf_input_z, 1e-12, 20, log); assert_output(output, grid.output_ref_z()); // for const z, all methods (including linear) should be accurate } @@ -113,19 +114,19 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - PF", SolverType, test_math_solver_ constexpr auto result_tolerance{0.15}; SolverType solver{y_bus, topo_ptr}; - CalculationInfo info; + DefaultLogger log; PowerFlowInput const pf_input = grid.pf_input(); - SolverOutput const output = run_power_flow(solver, y_bus, pf_input, error_tolerance, 1, info); + SolverOutput const output = run_power_flow(solver, y_bus, pf_input, error_tolerance, 1, log); assert_output(output, grid.output_ref(), false, result_tolerance); } SUBCASE("Test not converge") { SolverType solver{y_bus, topo_ptr}; - CalculationInfo info; + DefaultLogger log; PowerFlowInput pf_input = grid.pf_input(); pf_input.s_injection[6] = ComplexValue{1e6}; - CHECK_THROWS_AS(run_power_flow(solver, y_bus, pf_input, 1e-12, 20, info), IterationDiverge); + CHECK_THROWS_AS(run_power_flow(solver, y_bus, pf_input, 1e-12, 20, log), IterationDiverge); } } @@ -136,10 +137,10 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - PF", SolverType, test_math_solver_ singular_param.shunt_param[0] = ComplexTensor{}; y_bus.update_admittance(std::make_shared const>(singular_param)); SolverType solver{y_bus, topo_ptr}; - CalculationInfo info; + DefaultLogger log; PowerFlowInput const pf_input = grid.pf_input(); - CHECK_THROWS_AS(run_power_flow(solver, y_bus, pf_input, 1e-12, 20, info), SparseMatrixError); + CHECK_THROWS_AS(run_power_flow(solver, y_bus, pf_input, 1e-12, 20, log), SparseMatrixError); } } diff --git a/tests/cpp_unit_tests/test_math_solver_se.hpp b/tests/cpp_unit_tests/test_math_solver_se.hpp index 2d63245920..d7a90f0f2a 100644 --- a/tests/cpp_unit_tests/test_math_solver_se.hpp +++ b/tests/cpp_unit_tests/test_math_solver_se.hpp @@ -8,8 +8,8 @@ #include "test_math_solver_common.hpp" -#include #include +#include #include #include @@ -17,11 +17,13 @@ namespace power_grid_model { template inline auto run_state_estimation(SolverType& solver, YBus const& y_bus, StateEstimationInput const& input, double err_tol, - Idx max_iter, CalculationInfo& calculation_info) { + Idx max_iter, Logger& log) { static_assert(SolverType::is_iterative); // otherwise, call different version - return solver.run_state_estimation(y_bus, input, err_tol, max_iter, calculation_info); + return solver.run_state_estimation(y_bus, input, err_tol, max_iter, log); }; +inline auto get_logger() { return common::logging::DefaultLogger{}; } + template struct SESolverTestGrid : public SteadyStateSolverTestGrid { using sym = sym_type; @@ -315,37 +317,37 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE", SolverType, test_math_solver_ SUBCASE("Test se with angle") { SolverType solver{y_bus, topo_ptr}; - CalculationInfo info; + auto log = get_logger(); auto const se_input = grid.se_input_angle(); SolverOutput const output = - run_state_estimation(solver, y_bus, se_input, error_tolerance, num_iter, info); + run_state_estimation(solver, y_bus, se_input, error_tolerance, num_iter, log); assert_output(output, grid.output_ref()); } SUBCASE("Test se without angle") { SolverType solver{y_bus, topo_ptr}; - CalculationInfo info; + auto log = get_logger(); auto const se_input = grid.se_input_no_angle(); SolverOutput const output = - run_state_estimation(solver, y_bus, se_input, error_tolerance, num_iter, info); + run_state_estimation(solver, y_bus, se_input, error_tolerance, num_iter, log); assert_output(output, grid.output_ref(), true); } SUBCASE("Test se with angle, const z") { SolverType solver{y_bus, topo_ptr}; - CalculationInfo info; + auto log = get_logger(); auto const se_input = grid.se_input_angle_const_z(); SolverOutput const output = - run_state_estimation(solver, y_bus, se_input, error_tolerance, num_iter, info); + run_state_estimation(solver, y_bus, se_input, error_tolerance, num_iter, log); assert_output(output, grid.output_ref_z()); } SUBCASE("Test se with angle and different power variances") { SolverType solver{y_bus, topo_ptr}; - CalculationInfo info; + auto log = get_logger(); auto se_input = grid.se_input_angle(); auto& branch_from_power = se_input.measured_branch_from_power.front(); @@ -353,7 +355,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE", SolverType, test_math_solver_ branch_from_power.imag_component.variance = RealValue{0.75}; SolverOutput const output = - run_state_estimation(solver, y_bus, se_input, error_tolerance, num_iter, info); + run_state_estimation(solver, y_bus, se_input, error_tolerance, num_iter, log); assert_output(output, grid.output_ref()); } } @@ -363,21 +365,21 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE", SolverType, test_math_solver_ YBus const y_bus{topo_ptr, param_ptr}; SUBCASE("Test se with local angle current sensors") { SolverType solver{y_bus, topo_ptr}; - CalculationInfo info; + auto log = get_logger(); auto const se_input = grid.se_input_angle_current_sensors(AngleMeasurementType::local_angle); SolverOutput const output = - run_state_estimation(solver, y_bus, se_input, error_tolerance, num_iter, info); + run_state_estimation(solver, y_bus, se_input, error_tolerance, num_iter, log); assert_output(output, grid.output_ref()); } SUBCASE("Test se with global angle current sensors") { SolverType solver{y_bus, topo_ptr}; - CalculationInfo info; + auto log = get_logger(); auto const se_input = grid.se_input_angle_current_sensors(AngleMeasurementType::global_angle); SolverOutput const output = - run_state_estimation(solver, y_bus, se_input, error_tolerance, num_iter, info); + run_state_estimation(solver, y_bus, se_input, error_tolerance, num_iter, log); assert_output(output, grid.output_ref()); } } @@ -422,10 +424,10 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, zero variance test", SolverTyp se_input.measured_voltage = {{.value = 1.0, .variance = 1.0}}; SolverType solver{y_bus_sym, topo_ptr}; - CalculationInfo info; + auto log = get_logger(); SolverOutput output; - output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, info); + output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); // check both voltage check_close(output.u[0], 1.0); @@ -472,7 +474,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes se_input.load_gen_status = {1}; se_input.measured_voltage = {{.value = 1.0, .variance = 0.1}}; - CalculationInfo info; + auto log = get_logger(); SolverOutput output; SUBCASE("Source and branch") { @@ -498,7 +500,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes SolverType solver{y_bus_sym, topo_ptr}; - output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, info); + output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); CHECK(real(output.bus_injection[0]) == doctest::Approx(1.95)); CHECK(real(output.source[0].s) == doctest::Approx(1.95)); @@ -540,7 +542,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes {.angle_measurement_type = AngleMeasurementType::local_angle, .measurement = {.real_component = {.value = 1.97, .variance = 0.05}, .imag_component = {.value = 0.0, .variance = 0.05}}}}; - output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, info); + output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); CHECK(real(output.bus_injection[0]) == doctest::Approx(1.95)); CHECK(real(output.source[0].s) == doctest::Approx(1.95)); @@ -556,7 +558,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes .measurement = {.real_component = {.value = 0.0, .variance = 0.05}, .imag_component = {.value = 1.97, .variance = 0.05}}}}; - output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, info); + output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); CHECK(imag(output.bus_injection[0]) == doctest::Approx(1.95)); CHECK(imag(output.source[0].s) == doctest::Approx(1.95)); @@ -573,7 +575,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes .measurement = {.real_component = {.value = real(1.97 * global_shift), .variance = 0.05}, .imag_component = {.value = imag(1.97 * global_shift), .variance = 0.05}}}}; - output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, info); + output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); CHECK(real(output.bus_injection[0]) == doctest::Approx(1.95)); CHECK(real(output.source[0].s) == doctest::Approx(1.95)); @@ -606,7 +608,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes YBus const y_bus_sym{topo_ptr, param_ptr}; SolverType solver{y_bus_sym, topo_ptr}; - output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, info); + output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); CHECK(real(output.bus_injection[1]) == doctest::Approx(-1.95)); CHECK(real(output.load_gen[0].s) == doctest::Approx(-1.95)); @@ -638,7 +640,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes YBus const y_bus_sym{topo_ptr, param_ptr}; SolverType solver{y_bus_sym, topo_ptr}; - output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, info); + output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); CHECK(real(output.bus_injection[0]) == doctest::Approx(2.0)); CHECK(real(output.source[0].s) == doctest::Approx(2.0)); @@ -670,7 +672,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes YBus const y_bus_sym{topo_ptr, param_ptr}; SolverType solver{y_bus_sym, topo_ptr}; - output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, info); + output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); CHECK(real(output.bus_injection[0]) == doctest::Approx(2.0)); CHECK(real(output.source[0].s) == doctest::Approx(2.0)); @@ -702,7 +704,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes YBus const y_bus_sym{topo_ptr, param_ptr}; SolverType solver{y_bus_sym, topo_ptr}; - output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, info); + output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); CHECK(real(output.bus_injection[1]) == doctest::Approx(-2.0)); CHECK(real(output.load_gen[0].s) == doctest::Approx(-2.0)); @@ -732,7 +734,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes YBus const y_bus_sym{topo_ptr, param_ptr}; SolverType solver{y_bus_sym, topo_ptr}; - output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, info); + output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); CHECK(real(output.bus_injection[1]) == doctest::Approx(-2.0)); CHECK(real(output.branch[0].s_t) == doctest::Approx(-2.0)); @@ -766,7 +768,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes YBus const y_bus_sym{topo_ptr, param_ptr}; SolverType solver{y_bus_sym, topo_ptr}; - output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, info); + output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); CHECK(real(output.bus_injection[1]) == doctest::Approx(-1.0)); CHECK(real(output.load_gen[0].s) == doctest::Approx(-1.85)); @@ -799,7 +801,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes YBus const y_bus_sym{topo_ptr, param_ptr}; SolverType solver{y_bus_sym, topo_ptr}; - output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, info); + output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); // the different aggregation of the load gen's P and Q measurements cause differences compared to the case with // identical variances From c1d6b99906c01c75c86786ecca03b6b7339150d4 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 20 Aug 2025 10:47:50 +0200 Subject: [PATCH 04/26] improve header include order Signed-off-by: Martijn Govers --- .../include/power_grid_model/auxiliary/dataset.hpp | 5 +++-- .../include/power_grid_model/component/asym_line.hpp | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/auxiliary/dataset.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/auxiliary/dataset.hpp index 7a4ba77e49..8a6b8f5d34 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/auxiliary/dataset.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/auxiliary/dataset.hpp @@ -6,12 +6,13 @@ // handle dataset and buffer related stuff +#include "dataset_fwd.hpp" +#include "meta_data.hpp" + #include "../common/common.hpp" #include "../common/counting_iterator.hpp" #include "../common/exception.hpp" #include "../common/iterator_facade.hpp" -#include "dataset_fwd.hpp" -#include "meta_data.hpp" #include #include diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/component/asym_line.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/component/asym_line.hpp index 652431ec17..d1d5542178 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/component/asym_line.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/component/asym_line.hpp @@ -4,10 +4,8 @@ #pragma once -#include - #include "branch.hpp" -#include +#include "line_utils.hpp" #include "../auxiliary/input.hpp" #include "../auxiliary/output.hpp" @@ -16,7 +14,9 @@ #include "../common/common.hpp" #include "../common/matrix_utils.hpp" #include "../common/three_phase_tensor.hpp" -#include "line_utils.hpp" + +#include +#include namespace power_grid_model { From cf7534e378e825d77445508b78ccbe49d7ef3ccb Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 20 Aug 2025 12:43:38 +0200 Subject: [PATCH 05/26] extend process Signed-off-by: Martijn Govers --- .../power_grid_model/common/calculation_info.hpp | 7 +------ .../include/power_grid_model/common/logging.hpp | 1 - .../include/power_grid_model/common/logging_impl.hpp | 6 ++++-- .../power_grid_model/main_core/calculation_info.hpp | 6 ++++-- tests/benchmark_cpp/benchmark.cpp | 3 +-- tests/cpp_unit_tests/test_math_solver_pf.hpp | 12 ++++++------ tests/cpp_unit_tests/test_math_solver_se.hpp | 2 +- 7 files changed, 17 insertions(+), 20 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index 4d5ba974f0..b36a2f0b41 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -15,7 +15,7 @@ namespace power_grid_model { namespace common::logging { -class CalculationInfo : public DefaultLogger { +class CalculationInfo : public NoLogger { using Data = std::map; public: @@ -23,11 +23,6 @@ class CalculationInfo : public DefaultLogger { void log(LogEvent tag, double value) override { log_impl(tag, value); } void log(LogEvent tag, Idx value) override { log_impl(tag, static_cast(value)); } - void merge(const CalculationInfo& other) { - for (const auto& [tag, value] : other.data_) { - log(tag, value); - } - } private: Data data_; diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp index a7085201b8..e3c20bba04 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp @@ -10,7 +10,6 @@ namespace power_grid_model { namespace common::logging { - enum class LogEvent : int16_t { unknown = -1, total = 0000, // TODO(mgovers): find other error code? diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp index b1d7b07329..a82130ee0d 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp @@ -10,11 +10,13 @@ #include namespace power_grid_model::common::logging { -class DefaultLogger : public Logger { +class NoLogger : public Logger { + LoggerType logger_type() const override { return LoggerType::no_logger; } + void log(LogEvent /*tag*/, std::string_view /*message*/) override {} void log(LogEvent /*tag*/, double /*value*/) override {} void log(LogEvent /*tag*/, Idx /*value*/) override {} - std::unique_ptr clone() const override { return std::make_unique(); } + std::unique_ptr clone() const override { return std::make_unique(); } }; class LogDispatcher : public LogDispatch { diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/calculation_info.hpp index 5627bdafd5..12adfc05ac 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/calculation_info.hpp @@ -10,8 +10,10 @@ namespace power_grid_model::main_core { -inline CalculationInfo& merge_into(CalculationInfo& destination, CalculationInfo const& source) { - destination.merge(source); +inline Logger& merge_into(Logger& destination, CalculationInfo const& source) { + for (const auto& [tag, value] : source) { + destination.log(tag, value); + } return destination; } diff --git a/tests/benchmark_cpp/benchmark.cpp b/tests/benchmark_cpp/benchmark.cpp index 0fb2fca69e..59d7335470 100644 --- a/tests/benchmark_cpp/benchmark.cpp +++ b/tests/benchmark_cpp/benchmark.cpp @@ -152,8 +152,7 @@ struct PowerGridBenchmark { try { // calculate main_model->calculate(model_options, output.get_dataset(), batch_data.get_dataset()); - CalculationInfo info_extra = main_model->calculation_info(); - info.merge(info_extra); + merge_into(info, main_model->calculation_info()); } catch (std::exception const& e) { std::cout << std::format("\nAn exception was raised during execution: {}\n", e.what()); } diff --git a/tests/cpp_unit_tests/test_math_solver_pf.hpp b/tests/cpp_unit_tests/test_math_solver_pf.hpp index d51d445766..89a61688da 100644 --- a/tests/cpp_unit_tests/test_math_solver_pf.hpp +++ b/tests/cpp_unit_tests/test_math_solver_pf.hpp @@ -74,7 +74,7 @@ template struct PFSolverTestGrid : public SteadyStateSol TEST_CASE_TEMPLATE_DEFINE("Test math solver - PF", SolverType, test_math_solver_pf_id) { using sym = typename SolverType::sym; - using common::logging::DefaultLogger; + using common::logging::NoLogger; PFSolverTestGrid const grid; @@ -90,7 +90,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - PF", SolverType, test_math_solver_ SolverType::is_iterative ? 1e-12 : 0.15; // linear methods may be very inaccurate SolverType solver{y_bus, topo_ptr}; - DefaultLogger log; + NoLogger log; PowerFlowInput const pf_input = grid.pf_input(); SolverOutput const output = run_power_flow(solver, y_bus, pf_input, error_tolerance, num_iter, log); @@ -99,7 +99,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - PF", SolverType, test_math_solver_ SUBCASE("Test const z pf solver") { SolverType solver{y_bus, topo_ptr}; - DefaultLogger log; + NoLogger log; // const z PowerFlowInput const pf_input_z = grid.pf_input_z(); @@ -114,7 +114,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - PF", SolverType, test_math_solver_ constexpr auto result_tolerance{0.15}; SolverType solver{y_bus, topo_ptr}; - DefaultLogger log; + NoLogger log; PowerFlowInput const pf_input = grid.pf_input(); SolverOutput const output = run_power_flow(solver, y_bus, pf_input, error_tolerance, 1, log); @@ -122,7 +122,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - PF", SolverType, test_math_solver_ } SUBCASE("Test not converge") { SolverType solver{y_bus, topo_ptr}; - DefaultLogger log; + NoLogger log; PowerFlowInput pf_input = grid.pf_input(); pf_input.s_injection[6] = ComplexValue{1e6}; @@ -137,7 +137,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - PF", SolverType, test_math_solver_ singular_param.shunt_param[0] = ComplexTensor{}; y_bus.update_admittance(std::make_shared const>(singular_param)); SolverType solver{y_bus, topo_ptr}; - DefaultLogger log; + NoLogger log; PowerFlowInput const pf_input = grid.pf_input(); CHECK_THROWS_AS(run_power_flow(solver, y_bus, pf_input, 1e-12, 20, log), SparseMatrixError); diff --git a/tests/cpp_unit_tests/test_math_solver_se.hpp b/tests/cpp_unit_tests/test_math_solver_se.hpp index d7a90f0f2a..9c0f99a83c 100644 --- a/tests/cpp_unit_tests/test_math_solver_se.hpp +++ b/tests/cpp_unit_tests/test_math_solver_se.hpp @@ -22,7 +22,7 @@ inline auto run_state_estimation(SolverType& solver, YBus struct SESolverTestGrid : public SteadyStateSolverTestGrid { using sym = sym_type; From d3d1ae01efd3a196235ee185a60ef5a500d3ec5b Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 20 Aug 2025 13:18:36 +0200 Subject: [PATCH 06/26] fix tests Signed-off-by: Martijn Govers --- .../power_grid_model/common/calculation_info.hpp | 3 ++- .../include/power_grid_model/common/logging.hpp | 1 + .../include/power_grid_model/common/logging_impl.hpp | 2 -- .../include/power_grid_model/job_dispatch.hpp | 2 +- tests/cpp_unit_tests/test_job_dispatch.cpp | 10 +++++++--- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index b36a2f0b41..167d2939c6 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -16,9 +16,9 @@ namespace power_grid_model { namespace common::logging { class CalculationInfo : public NoLogger { - using Data = std::map; public: + using Data = std::map; using const_iterator = Data::const_iterator; void log(LogEvent tag, double value) override { log_impl(tag, value); } @@ -73,6 +73,7 @@ class CalculationInfo : public NoLogger { } public: + Data const& report() const { return data_; } auto begin() { return std::ranges::begin(data_); } auto begin() const { return std::ranges::begin(data_); } auto end() { return std::ranges::end(data_); } diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp index e3c20bba04..4bab6c3b9d 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp @@ -6,6 +6,7 @@ #include "common.hpp" +#include #include namespace power_grid_model { diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp index a82130ee0d..1df8f98d14 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp @@ -11,8 +11,6 @@ namespace power_grid_model::common::logging { class NoLogger : public Logger { - LoggerType logger_type() const override { return LoggerType::no_logger; } - void log(LogEvent /*tag*/, std::string_view /*message*/) override {} void log(LogEvent /*tag*/, double /*value*/) override {} void log(LogEvent /*tag*/, Idx /*value*/) override {} diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/job_dispatch.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/job_dispatch.hpp index 97f77634bd..f72991e0d2 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/job_dispatch.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/job_dispatch.hpp @@ -178,7 +178,7 @@ class JobDispatch { } catch (...) { messages[scenario_idx] = "unknown exception"; } - info.merge(adapter.get_calculation_info()); + main_core::merge_into(info, adapter.get_calculation_info()); }; } diff --git a/tests/cpp_unit_tests/test_job_dispatch.cpp b/tests/cpp_unit_tests/test_job_dispatch.cpp index 0161cd4cd3..55ff333cd6 100644 --- a/tests/cpp_unit_tests/test_job_dispatch.cpp +++ b/tests/cpp_unit_tests/test_job_dispatch.cpp @@ -73,7 +73,11 @@ class JobAdapterMock : public JobInterface { void prepare_job_dispatch_impl(MockUpdateDataset const& /*update_data*/) const { /* patch base class function */ } void setup_impl(MockUpdateDataset const& /*update_data*/, Idx /*scenario_idx*/) const { ++(counter_->setup_calls); } void winddown_impl() const { ++(counter_->winddown_calls); } - static CalculationInfo get_calculation_info_impl() { return CalculationInfo{{LogEvent::unknown, 0.0}}; } + static CalculationInfo get_calculation_info_impl() { + CalculationInfo info; + info.log(LogEvent::total, 0.0); + return info; + } void thread_safe_add_calculation_info_impl(CalculationInfo const& /*info*/) const { ++(counter_->thread_safe_add_calculation_info_calls); } @@ -346,7 +350,7 @@ TEST_CASE("Test job dispatch logic") { handler(scenario_idx); } CHECK(messages[scenario_idx] == expected_message); - CHECK(info.at(LogEvent::unknown) == 0.0); + REQUIRE(info.report() == CalculationInfo::Data{{LogEvent::total, 0.0}}); } SUBCASE("Unknown exception") { Idx const scenario_idx = 3; // arbitrary index @@ -356,7 +360,7 @@ TEST_CASE("Test job dispatch logic") { handler(scenario_idx); } CHECK(messages[scenario_idx] == "unknown exception"); - CHECK(info.at(LogEvent::unknown) == 0.0); + REQUIRE(info.report() == CalculationInfo::Data{{LogEvent::total, 0.0}}); } } SUBCASE("Test handle_batch_exceptions") { From 30057cb03e3032ddb65854b4c672ba26d9933fb5 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 20 Aug 2025 13:21:08 +0200 Subject: [PATCH 07/26] use report when reporting Signed-off-by: Martijn Govers --- .../include/power_grid_model/common/calculation_info.hpp | 4 ---- tests/benchmark_cpp/benchmark.cpp | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index 167d2939c6..83077d8363 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -74,10 +74,6 @@ class CalculationInfo : public NoLogger { public: Data const& report() const { return data_; } - auto begin() { return std::ranges::begin(data_); } - auto begin() const { return std::ranges::begin(data_); } - auto end() { return std::ranges::end(data_); } - auto end() const { return std::ranges::end(data_); } }; } // namespace common::logging diff --git a/tests/benchmark_cpp/benchmark.cpp b/tests/benchmark_cpp/benchmark.cpp index 59d7335470..ea6692f5c8 100644 --- a/tests/benchmark_cpp/benchmark.cpp +++ b/tests/benchmark_cpp/benchmark.cpp @@ -220,7 +220,7 @@ struct PowerGridBenchmark { } static void print_info(CalculationInfo const& info) { - for (auto const& [key, val] : info) { + for (auto const& [key, val] : info.report()) { std::cout << make_key(key) << ": " << val << '\n'; } } From 644d8d93d9326fabe985a75b7abdea46e3dda58a Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 20 Aug 2025 13:22:04 +0200 Subject: [PATCH 08/26] improve type exposure Signed-off-by: Martijn Govers --- .../include/power_grid_model/common/calculation_info.hpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index 83077d8363..6bb2daa58b 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -16,16 +16,15 @@ namespace power_grid_model { namespace common::logging { class CalculationInfo : public NoLogger { - public: - using Data = std::map; - using const_iterator = Data::const_iterator; + using Report = std::map; + using const_iterator = Report::const_iterator; void log(LogEvent tag, double value) override { log_impl(tag, value); } void log(LogEvent tag, Idx value) override { log_impl(tag, static_cast(value)); } private: - Data data_; + Report data_; void log_impl(LogEvent tag, double value) { using enum LogEvent; @@ -73,7 +72,7 @@ class CalculationInfo : public NoLogger { } public: - Data const& report() const { return data_; } + Report const& report() const { return data_; } }; } // namespace common::logging From 4432cfc51932fd373b974618ddb597bebec38e43 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 20 Aug 2025 13:26:20 +0200 Subject: [PATCH 09/26] fix Signed-off-by: Martijn Govers --- .../power_grid_model/common/calculation_info.hpp | 10 ++++++---- .../power_grid_model/main_core/calculation_info.hpp | 2 +- tests/cpp_unit_tests/test_job_dispatch.cpp | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index 6bb2daa58b..83082bdd52 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -16,15 +16,17 @@ namespace power_grid_model { namespace common::logging { class CalculationInfo : public NoLogger { + using Data = std::map; + public: - using Report = std::map; - using const_iterator = Report::const_iterator; + using Report = std::add_lvalue_reference_t>; + static_assert(std::same_as); void log(LogEvent tag, double value) override { log_impl(tag, value); } void log(LogEvent tag, Idx value) override { log_impl(tag, static_cast(value)); } private: - Report data_; + Data data_; void log_impl(LogEvent tag, double value) { using enum LogEvent; @@ -72,7 +74,7 @@ class CalculationInfo : public NoLogger { } public: - Report const& report() const { return data_; } + Report report() const { return data_; } }; } // namespace common::logging diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/calculation_info.hpp index 12adfc05ac..ae2e56ada9 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/calculation_info.hpp @@ -11,7 +11,7 @@ namespace power_grid_model::main_core { inline Logger& merge_into(Logger& destination, CalculationInfo const& source) { - for (const auto& [tag, value] : source) { + for (const auto& [tag, value] : source.report()) { destination.log(tag, value); } return destination; diff --git a/tests/cpp_unit_tests/test_job_dispatch.cpp b/tests/cpp_unit_tests/test_job_dispatch.cpp index 55ff333cd6..89877f807f 100644 --- a/tests/cpp_unit_tests/test_job_dispatch.cpp +++ b/tests/cpp_unit_tests/test_job_dispatch.cpp @@ -350,7 +350,7 @@ TEST_CASE("Test job dispatch logic") { handler(scenario_idx); } CHECK(messages[scenario_idx] == expected_message); - REQUIRE(info.report() == CalculationInfo::Data{{LogEvent::total, 0.0}}); + REQUIRE(info.report() == CalculationInfo::Report{{LogEvent::total, 0.0}}); } SUBCASE("Unknown exception") { Idx const scenario_idx = 3; // arbitrary index @@ -360,7 +360,7 @@ TEST_CASE("Test job dispatch logic") { handler(scenario_idx); } CHECK(messages[scenario_idx] == "unknown exception"); - REQUIRE(info.report() == CalculationInfo::Data{{LogEvent::total, 0.0}}); + REQUIRE(info.report() == CalculationInfo::Report{{LogEvent::total, 0.0}}); } } SUBCASE("Test handle_batch_exceptions") { From 9fc3c393ac5289285679c433bf88ad8ffdce0c41 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 20 Aug 2025 13:31:54 +0200 Subject: [PATCH 10/26] remove remaining headers from calculation info Signed-off-by: Martijn Govers --- .../include/power_grid_model/common/calculation_info.hpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index 83082bdd52..7b3cb39366 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -6,12 +6,7 @@ #include "logging_impl.hpp" -#include -#include -#include #include -#include -#include namespace power_grid_model { namespace common::logging { From 008e980f9657f44b46e9cde32469e1bb9325de02 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Thu, 21 Aug 2025 08:22:51 +0200 Subject: [PATCH 11/26] fix benchmark compilation Signed-off-by: Martijn Govers --- .../include/power_grid_model/common/calculation_info.hpp | 1 + tests/benchmark_cpp/benchmark.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index 7b3cb39366..85de997672 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -70,6 +70,7 @@ class CalculationInfo : public NoLogger { public: Report report() const { return data_; } + void clear() { data_.clear(); } }; } // namespace common::logging diff --git a/tests/benchmark_cpp/benchmark.cpp b/tests/benchmark_cpp/benchmark.cpp index ea6692f5c8..c14d51ccc3 100644 --- a/tests/benchmark_cpp/benchmark.cpp +++ b/tests/benchmark_cpp/benchmark.cpp @@ -99,7 +99,7 @@ std::string make_key(LogEvent code) { } key += "\t"; } - key += common::logging::to_string(code); + key += to_string(code); return key; } @@ -152,7 +152,7 @@ struct PowerGridBenchmark { try { // calculate main_model->calculate(model_options, output.get_dataset(), batch_data.get_dataset()); - merge_into(info, main_model->calculation_info()); + main_core::merge_into(info, main_model->calculation_info()); } catch (std::exception const& e) { std::cout << std::format("\nAn exception was raised during execution: {}\n", e.what()); } From 3cc60aaa2222fc818a6c1de3c212a68bc3da653d Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Fri, 22 Aug 2025 11:55:43 +0200 Subject: [PATCH 12/26] apply suggestion Signed-off-by: Martijn Govers --- .../power_grid_model/common/logging.hpp | 1 + .../power_grid_model/common/logging_impl.hpp | 22 ++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp index 4bab6c3b9d..9bd87c78df 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp @@ -44,6 +44,7 @@ enum class LogEvent : int16_t { }; struct Logger { + virtual void log(LogEvent tag) = 0; virtual void log(LogEvent tag, std::string_view message) = 0; virtual void log(LogEvent tag, double value) = 0; virtual void log(LogEvent tag, Idx value) = 0; diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp index 1df8f98d14..03bf5c0348 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp @@ -11,6 +11,7 @@ namespace power_grid_model::common::logging { class NoLogger : public Logger { + void log(LogEvent /*tag*/) override {} void log(LogEvent /*tag*/, std::string_view /*message*/) override {} void log(LogEvent /*tag*/, double /*value*/) override {} void log(LogEvent /*tag*/, Idx /*value*/) override {} @@ -19,6 +20,7 @@ class NoLogger : public Logger { class LogDispatcher : public LogDispatch { public: + void log(LogEvent tag) override { log_impl(tag); } void log(LogEvent tag, std::string_view message) override { log_impl(tag, message); } void log(LogEvent tag, double value) override { log_impl(tag, value); } void log(LogEvent tag, Idx value) override { log_impl(tag, value); } @@ -39,13 +41,21 @@ class LogDispatcher : public LogDispatch { private: std::vector loggers_; - template - requires std::same_as || std::same_as || std::same_as - void log_impl(LogEvent tag, T value) { - for (auto& logger : loggers_) { - if (logger) { - logger->log(tag, value); + template + constexpr void log_impl(LogEvent tag, T&&... values) + requires requires(Logger log_) { + { log_.log(tag, values...) }; + } + { + if (loggers_.size() == 1 && loggers_.front() != nullptr) { // allows perfect forwarding to log messages + loggers_.front()->log(tag, std::forward(values)...); + } else { + for (auto& logger : loggers_) { + if (logger) { + logger->log(tag, values...); + } } + capturing::into_the_void(std::forward(values)...); } } }; From 126b1c4ab4affc3e0269fa2d80b9b7184f17c83d Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Mon, 25 Aug 2025 09:46:45 +0200 Subject: [PATCH 13/26] clang-tidy Signed-off-by: Martijn Govers --- .../power_grid_model/common/calculation_info.hpp | 2 +- .../include/power_grid_model/common/logging_impl.hpp | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index 85de997672..fe8c6d87b5 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -23,7 +23,7 @@ class CalculationInfo : public NoLogger { private: Data data_; - void log_impl(LogEvent tag, double value) { + auto log_impl(LogEvent tag, double value) { using enum LogEvent; switch (tag) { diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp index 03bf5c0348..2a724d3e80 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp @@ -18,24 +18,28 @@ class NoLogger : public Logger { std::unique_ptr clone() const override { return std::make_unique(); } }; -class LogDispatcher : public LogDispatch { +class LogDispatcher final : public LogDispatch { public: void log(LogEvent tag) override { log_impl(tag); } void log(LogEvent tag, std::string_view message) override { log_impl(tag, message); } void log(LogEvent tag, double value) override { log_impl(tag, value); } void log(LogEvent tag, Idx value) override { log_impl(tag, value); } void registrar(Logger* logger) override { - if (logger && std::ranges::find(loggers_, logger) == loggers_.end()) { + if (logger != nullptr && std::ranges::find(loggers_, logger) == loggers_.end()) { loggers_.push_back(logger); } } void deregistrar(Logger* logger) override { - if (logger) { + if (logger != nullptr) { std::erase(loggers_, logger); } } std::unique_ptr clone() const override { return std::make_unique(); } + LogDispatcher(const LogDispatcher&) = delete; + LogDispatcher& operator=(const LogDispatcher&) = delete; + LogDispatcher(LogDispatcher&&) = default; + LogDispatcher& operator=(LogDispatcher&&) = default; ~LogDispatcher() override = default; private: @@ -51,7 +55,7 @@ class LogDispatcher : public LogDispatch { loggers_.front()->log(tag, std::forward(values)...); } else { for (auto& logger : loggers_) { - if (logger) { + if (logger != nullptr) { logger->log(tag, values...); } } From 69b737a064ae1897e7f9b047d18cd8a5a94162ef Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Mon, 25 Aug 2025 09:48:56 +0200 Subject: [PATCH 14/26] return void Signed-off-by: Martijn Govers --- .../include/power_grid_model/common/calculation_info.hpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index fe8c6d87b5..598b1c7d98 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -23,7 +23,7 @@ class CalculationInfo : public NoLogger { private: Data data_; - auto log_impl(LogEvent tag, double value) { + void log_impl(LogEvent tag, double value) { using enum LogEvent; switch (tag) { @@ -53,10 +53,12 @@ class CalculationInfo : public NoLogger { case iterate_unknown: case calculate_math_result: case produce_output: - return accumulate_log(tag, value); + accumulate_log(tag, value); + return; case iterative_pf_solver_max_num_iter: case max_num_iter: - return maximize_log(tag, value); + maximize_log(tag, value); + return; default: return; } From 97cf1766870fc28d6719f3fa8fc6d56272f932d7 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Mon, 25 Aug 2025 09:56:32 +0200 Subject: [PATCH 15/26] fix compilation Signed-off-by: Martijn Govers --- .../include/power_grid_model/common/logging_impl.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp index 2a724d3e80..b7130d3223 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp @@ -36,6 +36,7 @@ class LogDispatcher final : public LogDispatch { } std::unique_ptr clone() const override { return std::make_unique(); } + LogDispatcher() = default; LogDispatcher(const LogDispatcher&) = delete; LogDispatcher& operator=(const LogDispatcher&) = delete; LogDispatcher(LogDispatcher&&) = default; From babf8b1ee5f91f7bc5e749ba373f7f710a23d7e0 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 27 Aug 2025 11:35:39 +0200 Subject: [PATCH 16/26] remove log dispatcher cfr. offline discussion Signed-off-by: Martijn Govers --- .../power_grid_model/common/logging.hpp | 5 -- .../power_grid_model/common/logging_impl.hpp | 47 ------------------- 2 files changed, 52 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp index 9bd87c78df..f8f465d0d8 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp @@ -55,11 +55,6 @@ struct Logger { virtual ~Logger() = default; }; -struct LogDispatch : public Logger { - virtual void registrar(Logger* logger) = 0; - virtual void deregistrar(Logger* logger) = 0; -}; - } // namespace common::logging using common::logging::LogEvent; diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp index b7130d3223..3fc1e120e1 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp @@ -18,51 +18,4 @@ class NoLogger : public Logger { std::unique_ptr clone() const override { return std::make_unique(); } }; -class LogDispatcher final : public LogDispatch { - public: - void log(LogEvent tag) override { log_impl(tag); } - void log(LogEvent tag, std::string_view message) override { log_impl(tag, message); } - void log(LogEvent tag, double value) override { log_impl(tag, value); } - void log(LogEvent tag, Idx value) override { log_impl(tag, value); } - void registrar(Logger* logger) override { - if (logger != nullptr && std::ranges::find(loggers_, logger) == loggers_.end()) { - loggers_.push_back(logger); - } - } - void deregistrar(Logger* logger) override { - if (logger != nullptr) { - std::erase(loggers_, logger); - } - } - std::unique_ptr clone() const override { return std::make_unique(); } - - LogDispatcher() = default; - LogDispatcher(const LogDispatcher&) = delete; - LogDispatcher& operator=(const LogDispatcher&) = delete; - LogDispatcher(LogDispatcher&&) = default; - LogDispatcher& operator=(LogDispatcher&&) = default; - ~LogDispatcher() override = default; - - private: - std::vector loggers_; - - template - constexpr void log_impl(LogEvent tag, T&&... values) - requires requires(Logger log_) { - { log_.log(tag, values...) }; - } - { - if (loggers_.size() == 1 && loggers_.front() != nullptr) { // allows perfect forwarding to log messages - loggers_.front()->log(tag, std::forward(values)...); - } else { - for (auto& logger : loggers_) { - if (logger != nullptr) { - logger->log(tag, values...); - } - } - capturing::into_the_void(std::forward(values)...); - } - } -}; - } // namespace power_grid_model::common::logging From aac61a1e3be0e8ad94e910cd7c556c099190bb94 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 27 Aug 2025 11:40:38 +0200 Subject: [PATCH 17/26] resolve sonar cloud Signed-off-by: Martijn Govers --- .../include/power_grid_model/common/logging.hpp | 3 --- .../include/power_grid_model/common/logging_impl.hpp | 9 ++++----- .../include/power_grid_model/common/timer.hpp | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp index f8f465d0d8..a6d2ec6467 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp @@ -49,9 +49,6 @@ struct Logger { virtual void log(LogEvent tag, double value) = 0; virtual void log(LogEvent tag, Idx value) = 0; - // creates a new logger of the same type as the current one - virtual std::unique_ptr clone() const = 0; - virtual ~Logger() = default; }; diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp index 3fc1e120e1..b54ec7dcef 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp @@ -11,11 +11,10 @@ namespace power_grid_model::common::logging { class NoLogger : public Logger { - void log(LogEvent /*tag*/) override {} - void log(LogEvent /*tag*/, std::string_view /*message*/) override {} - void log(LogEvent /*tag*/, double /*value*/) override {} - void log(LogEvent /*tag*/, Idx /*value*/) override {} - std::unique_ptr clone() const override { return std::make_unique(); } + virtual void log(LogEvent /*tag*/) override { /* no logging */ } + virtual void log(LogEvent /*tag*/, std::string_view /*message*/) override { /* no logging */ } + virtual void log(LogEvent /*tag*/, double /*value*/) override { /* no logging */ } + virtual void log(LogEvent /*tag*/, Idx /*value*/) override { /* no logging */ } }; } // namespace power_grid_model::common::logging diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp index 05dc2426f1..c97f3b6266 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp @@ -55,7 +55,7 @@ class Timer { if (info_ != nullptr) { auto const now = Clock::now(); auto const duration = Duration(now - start_); - info_->log(code_, static_cast(duration.count())); + info_->log(code_, duration.count()); info_ = nullptr; } } From 6bdea5fb21197cb40c6effe2c0e97d20869ffea0 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 27 Aug 2025 11:41:19 +0200 Subject: [PATCH 18/26] resolve sonar cloud Signed-off-by: Martijn Govers --- .../power_grid_model/include/power_grid_model/common/timer.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp index c97f3b6266..57a95b7000 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp @@ -22,7 +22,7 @@ class Timer { Clock::time_point start_; public: - Timer() : info_(nullptr), code_{LogEvent::unknown} {}; + Timer() : info_{nullptr}, code_{LogEvent::unknown} {}; Timer(Logger& info, LogEvent code) : info_{&info}, code_{code}, start_{Clock::now()} {} Timer(Timer const&) = delete; From e6faf8a67943ad19633eb193f259664d88f34005 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 27 Aug 2025 12:01:22 +0200 Subject: [PATCH 19/26] sonar cloud Signed-off-by: Martijn Govers --- .../power_grid_model/common/calculation_info.hpp | 4 ++-- .../power_grid_model/common/logging_impl.hpp | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index 598b1c7d98..59da78db0b 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -17,8 +17,8 @@ class CalculationInfo : public NoLogger { using Report = std::add_lvalue_reference_t>; static_assert(std::same_as); - void log(LogEvent tag, double value) override { log_impl(tag, value); } - void log(LogEvent tag, Idx value) override { log_impl(tag, static_cast(value)); } + virtual void log(LogEvent tag, double value) override { log_impl(tag, value); } + virtual void log(LogEvent tag, Idx value) override { log_impl(tag, static_cast(value)); } private: Data data_; diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp index b54ec7dcef..1a1a1dafc6 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp @@ -11,10 +11,18 @@ namespace power_grid_model::common::logging { class NoLogger : public Logger { - virtual void log(LogEvent /*tag*/) override { /* no logging */ } - virtual void log(LogEvent /*tag*/, std::string_view /*message*/) override { /* no logging */ } - virtual void log(LogEvent /*tag*/, double /*value*/) override { /* no logging */ } - virtual void log(LogEvent /*tag*/, Idx /*value*/) override { /* no logging */ } + void log(LogEvent /*tag*/) override { + // no logging + } + void log(LogEvent /*tag*/, std::string_view /*message*/) override { + // no logging + } + void log(LogEvent /*tag*/, double /*value*/) override { + // no logging + } + void log(LogEvent /*tag*/, Idx /*value*/) override { + // no logging + } }; } // namespace power_grid_model::common::logging From f4ba5a709a58d52d9ab5615c3fba261b240d3860 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 27 Aug 2025 12:58:37 +0200 Subject: [PATCH 20/26] fix Signed-off-by: Martijn Govers --- .../power_grid_model/common/calculation_info.hpp | 4 ++-- .../include/power_grid_model/common/logging.hpp | 10 ++++++++-- .../include/power_grid_model/common/logging_impl.hpp | 5 +++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index 59da78db0b..598b1c7d98 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -17,8 +17,8 @@ class CalculationInfo : public NoLogger { using Report = std::add_lvalue_reference_t>; static_assert(std::same_as); - virtual void log(LogEvent tag, double value) override { log_impl(tag, value); } - virtual void log(LogEvent tag, Idx value) override { log_impl(tag, static_cast(value)); } + void log(LogEvent tag, double value) override { log_impl(tag, value); } + void log(LogEvent tag, Idx value) override { log_impl(tag, static_cast(value)); } private: Data data_; diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp index a6d2ec6467..0b5609e7ee 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp @@ -43,13 +43,19 @@ enum class LogEvent : int16_t { max_num_iter = 2248, // TODO(mgovers): find other error code }; -struct Logger { +class Logger { + public: virtual void log(LogEvent tag) = 0; virtual void log(LogEvent tag, std::string_view message) = 0; virtual void log(LogEvent tag, double value) = 0; virtual void log(LogEvent tag, Idx value) = 0; + virtual ~Logger() = 0; - virtual ~Logger() = default; + protected: + Logger(Logger const&) = default; + Logger(Logger&&) = default; + Logger& operator=(Logger const&) = default; + Logger& operator=(Logger&&) = default; }; } // namespace common::logging diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp index 1a1a1dafc6..eddf0514c8 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp @@ -23,6 +23,11 @@ class NoLogger : public Logger { void log(LogEvent /*tag*/, Idx /*value*/) override { // no logging } + NoLogger(NoLogger const&) = default; + NoLogger(NoLogger&&) = default; + NoLogger& operator=(NoLogger const&) = default; + NoLogger& operator=(NoLogger&&) = default; + ~NoLogger() override = default; }; } // namespace power_grid_model::common::logging From b700a08e291736b855359b121ae7e5c779acb01b Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 27 Aug 2025 13:00:25 +0200 Subject: [PATCH 21/26] noexcept Signed-off-by: Martijn Govers --- .../include/power_grid_model/common/calculation_info.hpp | 5 +++++ .../include/power_grid_model/common/logging.hpp | 4 ++-- .../include/power_grid_model/common/logging_impl.hpp | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index 598b1c7d98..400a45c378 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -19,6 +19,11 @@ class CalculationInfo : public NoLogger { void log(LogEvent tag, double value) override { log_impl(tag, value); } void log(LogEvent tag, Idx value) override { log_impl(tag, static_cast(value)); } + + CalculationInfo(CalculationInfo const&) = default; + CalculationInfo(CalculationInfo&&) noexcept = default; + CalculationInfo& operator=(CalculationInfo const&) = default; + CalculationInfo& operator=(CalculationInfo&&) noexcept = default; private: Data data_; diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp index 0b5609e7ee..7f1c4f255d 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp @@ -53,9 +53,9 @@ class Logger { protected: Logger(Logger const&) = default; - Logger(Logger&&) = default; + Logger(Logger&&) noexcept = default; Logger& operator=(Logger const&) = default; - Logger& operator=(Logger&&) = default; + Logger& operator=(Logger&&) noexcept = default; }; } // namespace common::logging diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp index eddf0514c8..df51b32995 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp @@ -24,9 +24,9 @@ class NoLogger : public Logger { // no logging } NoLogger(NoLogger const&) = default; - NoLogger(NoLogger&&) = default; + NoLogger(NoLogger&&) noexcept = default; NoLogger& operator=(NoLogger const&) = default; - NoLogger& operator=(NoLogger&&) = default; + NoLogger& operator=(NoLogger&&) noexcept = default; ~NoLogger() override = default; }; From bbc901e19ed770d907d51ee6dfb2d975b29124e8 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 27 Aug 2025 13:00:42 +0200 Subject: [PATCH 22/26] noexcept Signed-off-by: Martijn Govers --- .../include/power_grid_model/common/logging_impl.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp index df51b32995..0bfcb517ba 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp @@ -11,6 +11,7 @@ namespace power_grid_model::common::logging { class NoLogger : public Logger { + public: void log(LogEvent /*tag*/) override { // no logging } From ff561f1529f4f5038b390c99c80ee72367363de4 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 27 Aug 2025 15:03:12 +0200 Subject: [PATCH 23/26] fix compilation Signed-off-by: Martijn Govers --- .../power_grid_model/common/calculation_info.hpp | 16 ++++++++++++---- .../include/power_grid_model/common/logging.hpp | 8 +++++--- .../power_grid_model/common/logging_impl.hpp | 5 ----- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index 400a45c378..f4da0c8a18 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -10,20 +10,28 @@ namespace power_grid_model { namespace common::logging { -class CalculationInfo : public NoLogger { +class CalculationInfo : public Logger { using Data = std::map; public: using Report = std::add_lvalue_reference_t>; static_assert(std::same_as); - void log(LogEvent tag, double value) override { log_impl(tag, value); } - void log(LogEvent tag, Idx value) override { log_impl(tag, static_cast(value)); } - + CalculationInfo() = default; CalculationInfo(CalculationInfo const&) = default; CalculationInfo(CalculationInfo&&) noexcept = default; CalculationInfo& operator=(CalculationInfo const&) = default; CalculationInfo& operator=(CalculationInfo&&) noexcept = default; + ~CalculationInfo() = default; + + void log(LogEvent tag) override { + // ignore all such events for now + } + void log(LogEvent tag, std::string_view /*message*/) override { + // ignore all such events for now + } + void log(LogEvent tag, double value) override { log_impl(tag, value); } + void log(LogEvent tag, Idx value) override { log_impl(tag, static_cast(value)); } private: Data data_; diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp index 7f1c4f255d..8356e82775 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp @@ -49,13 +49,15 @@ class Logger { virtual void log(LogEvent tag, std::string_view message) = 0; virtual void log(LogEvent tag, double value) = 0; virtual void log(LogEvent tag, Idx value) = 0; - virtual ~Logger() = 0; + + Logger(Logger&&) noexcept = default; + Logger& operator=(Logger&&) noexcept = default; protected: + Logger() = default; Logger(Logger const&) = default; - Logger(Logger&&) noexcept = default; Logger& operator=(Logger const&) = default; - Logger& operator=(Logger&&) noexcept = default; + virtual ~Logger() = default; }; } // namespace common::logging diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp index 0bfcb517ba..5aa4b0e031 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging_impl.hpp @@ -24,11 +24,6 @@ class NoLogger : public Logger { void log(LogEvent /*tag*/, Idx /*value*/) override { // no logging } - NoLogger(NoLogger const&) = default; - NoLogger(NoLogger&&) noexcept = default; - NoLogger& operator=(NoLogger const&) = default; - NoLogger& operator=(NoLogger&&) noexcept = default; - ~NoLogger() override = default; }; } // namespace power_grid_model::common::logging From 474a313a6623b9b0f6ecfa71fbff386eb679c8f4 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 27 Aug 2025 15:52:43 +0200 Subject: [PATCH 24/26] unused variable Signed-off-by: Martijn Govers --- .../include/power_grid_model/common/calculation_info.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index f4da0c8a18..ea38532c9f 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -24,10 +24,10 @@ class CalculationInfo : public Logger { CalculationInfo& operator=(CalculationInfo&&) noexcept = default; ~CalculationInfo() = default; - void log(LogEvent tag) override { + void log(LogEvent /*tag*/) override { // ignore all such events for now } - void log(LogEvent tag, std::string_view /*message*/) override { + void log(LogEvent /*tag*/, std::string_view /*message*/) override { // ignore all such events for now } void log(LogEvent tag, double value) override { log_impl(tag, value); } From 720984d9e8c9bb51ac35fdd9220a257651b741b1 Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Wed, 27 Aug 2025 16:16:55 +0200 Subject: [PATCH 25/26] sonar cloud Signed-off-by: Martijn Govers --- .../include/power_grid_model/common/calculation_info.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index ea38532c9f..74bf4a69be 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -10,7 +10,7 @@ namespace power_grid_model { namespace common::logging { -class CalculationInfo : public Logger { +class CalculationInfo final: public Logger { using Data = std::map; public: @@ -22,7 +22,7 @@ class CalculationInfo : public Logger { CalculationInfo(CalculationInfo&&) noexcept = default; CalculationInfo& operator=(CalculationInfo const&) = default; CalculationInfo& operator=(CalculationInfo&&) noexcept = default; - ~CalculationInfo() = default; + ~CalculationInfo() override = default; void log(LogEvent /*tag*/) override { // ignore all such events for now From ddb62cc7d309d5128401b6677c4f95ad2267eeac Mon Sep 17 00:00:00 2001 From: Martijn Govers Date: Thu, 28 Aug 2025 09:34:13 +0200 Subject: [PATCH 26/26] public virtual destructor Signed-off-by: Martijn Govers --- .../include/power_grid_model/common/calculation_info.hpp | 7 +++---- .../include/power_grid_model/common/logging.hpp | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp index 74bf4a69be..1a0b17cbc0 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/calculation_info.hpp @@ -10,7 +10,7 @@ namespace power_grid_model { namespace common::logging { -class CalculationInfo final: public Logger { +class CalculationInfo final : public Logger { using Data = std::map; public: @@ -78,9 +78,8 @@ class CalculationInfo final: public Logger { } void accumulate_log(LogEvent tag, double value) { data_[tag] += value; } void maximize_log(LogEvent tag, double value) { - if (auto& stored_value = data_[tag]; value > stored_value) { - stored_value = value; - } + auto& stored_value = data_[tag]; + stored_value = std::max(value, stored_value); } public: diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp index 8356e82775..b73b014d4f 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/common/logging.hpp @@ -52,12 +52,12 @@ class Logger { Logger(Logger&&) noexcept = default; Logger& operator=(Logger&&) noexcept = default; + virtual ~Logger() = default; protected: Logger() = default; Logger(Logger const&) = default; Logger& operator=(Logger const&) = default; - virtual ~Logger() = default; }; } // namespace common::logging