.. _program_listing_file_dynamics_dynamics.h: Program Listing for File dynamics.h =================================== |exhale_lsh| :ref:`Return to documentation for file ` (``dynamics/dynamics.h``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #pragma once #include #include #include "lupnt/core/config.h" #include "lupnt/states/params.h" #include "lupnt/states/state.h" namespace lupnt { class Dynamics { protected: bool print_progress_ = false; ParamState params_; public: Dynamics() = default; Dynamics(Config& config); virtual ~Dynamics() = default; void SetPrintProgress(bool print) { print_progress_ = print; } bool GetPrintProgress() { return print_progress_; } virtual State Propagate(const State& x0, Real t0, Real tf, const State* u = nullptr) = 0; virtual State Propagate(const State& x0, Real t0, Real tf, const State* u, MatXd* stm); virtual MatX Propagate(const State& x0, const VecX& tfs, const State* u = nullptr); virtual State PropagateWithParams(const State& x0, Real t0, Real tf, const ParamState& params, const State* u = nullptr); virtual State PropagateWithParams(const State& x0, Real t0, Real tf, const ParamState& params, const State* u, MatXd* stm_state, MatXd* stm_param); virtual MatX PropagateWithParams(const State& x0, const VecX& tfs, const ParamState& params, const State* u = nullptr); void SetParams(const ParamState& params) { params_ = params; } void SetParam(const std::string& key, const Real value) { // set the parameter with the name=key to value std::vector names = params_.GetNames(); auto it = std::find(names.begin(), names.end(), key); if (it != names.end()) { int index = std::distance(names.begin(), it); // Defensive invariant check (optional but good) if (index >= static_cast(params_.size())) { throw std::logic_error( fmt::format("[SetParam] Parameter index out of range for key '{}': " "index = {}, params_.size() = {}, names.size() = {}. " "This indicates a mismatch between parameter names and values.", key, index, params_.size(), names.size())); } params_(index) = value; // assuming value is a single element vector } else { spdlog::warn("Parameter {} not found in Dynamics parameters.", key); } } ParamState GetParams() const { return params_; } Real GetParam(const std::string& key) const { // get the parameter with the name=key std::vector names = params_.GetNames(); auto it = std::find(names.begin(), names.end(), key); if (it != names.end()) { int index = std::distance(names.begin(), it); return params_(index); } return Real(0); // return zero if not found } virtual StateType GetStateType() const = 0; }; } // namespace lupnt