Icarus
Vehicle Simulation as a Transformable Computational Graph, built on Vulcan and Janus
Loading...
Searching...
No Matches
IntegrationManager.hpp
Go to the documentation of this file.
1#pragma once
2
16
21
22#include <functional>
23#include <memory>
24#include <stdexcept>
25
26namespace icarus {
27
28// =============================================================================
29// IntegrationManager
30// =============================================================================
31
40template <typename Scalar> class IntegrationManager {
41 public:
43 using DerivativeFunc = std::function<JanusVector<Scalar>(Scalar, const JanusVector<Scalar> &)>;
44
45 IntegrationManager() = default;
46
54 void Configure(const IntegratorConfig<Scalar> &config) {
55 config_ = config;
56 integrator_ = IntegratorFactory<Scalar>::Create(config);
57 }
58
66 integrator_ = IntegratorFactory<Scalar>::Create(config_);
67 }
68
74 void Configure(const std::string &type_name) {
75 IntegratorType type = parse_integrator_type(type_name);
76 Configure(type);
77 }
78
84 integrator_ = IntegratorFactory<Scalar>::Create(config_);
85 }
86
96 [[nodiscard]] JanusVector<Scalar> Step(const DerivativeFunc &deriv_func,
97 const JanusVector<Scalar> &X, Scalar t, Scalar dt) {
98 if (!integrator_) {
99 throw std::runtime_error(
100 "IntegrationManager: integrator not configured. Call Configure() first.");
101 }
102 return integrator_->Step(deriv_func, X, t, dt);
103 }
104
117 const JanusVector<Scalar> &X, Scalar t,
118 Scalar dt_request) {
119 if (!integrator_) {
120 throw std::runtime_error(
121 "IntegrationManager: integrator not configured. Call Configure() first.");
122 }
123 if (!integrator_->IsAdaptive()) {
124 throw std::runtime_error(
125 "IntegrationManager: AdaptiveStep() requires an adaptive integrator. "
126 "Current integrator: " +
127 integrator_->Name());
128 }
129
130 auto *adaptive = dynamic_cast<AdaptiveIntegrator<Scalar> *>(integrator_.get());
131 if (!adaptive) {
132 throw std::runtime_error("IntegrationManager: failed to cast to AdaptiveIntegrator");
133 }
134 return adaptive->AdaptiveStep(deriv_func, X, t, dt_request);
135 }
136
140 [[nodiscard]] IntegratorType Type() const {
141 if (integrator_) {
142 return integrator_->Type();
143 }
144 return config_.type;
145 }
146
150 [[nodiscard]] const IntegratorConfig<Scalar> &Config() const { return config_; }
151
155 [[nodiscard]] std::string Name() const {
156 if (integrator_) {
157 return integrator_->Name();
158 }
159 return to_string(config_.type);
160 }
161
165 [[nodiscard]] bool IsConfigured() const { return integrator_ != nullptr; }
166
170 [[nodiscard]] bool IsAdaptive() const { return integrator_ && integrator_->IsAdaptive(); }
171
175 [[nodiscard]] Integrator<Scalar> *GetIntegrator() { return integrator_.get(); }
176
180 [[nodiscard]] const Integrator<Scalar> *GetIntegrator() const { return integrator_.get(); }
181
182 private:
183 std::unique_ptr<Integrator<Scalar>> integrator_;
185};
186
187} // namespace icarus
Core type definitions, concepts, and configuration for Icarus.
Factory for creating integrators from configuration.
Integrator type enumeration and configuration.
Abstract interface for numerical integrators.
Interface for adaptive step integrators.
Definition Integrator.hpp:101
const IntegratorConfig< Scalar > & Config() const
Get current configuration.
Definition IntegrationManager.hpp:150
void Configure(IntegratorType type)
Configure from integrator type enum.
Definition IntegrationManager.hpp:64
void ConfigureDefault()
Configure with default integrator (RK4).
Definition IntegrationManager.hpp:82
void Configure(const std::string &type_name)
Configure from type name string.
Definition IntegrationManager.hpp:74
std::string Name() const
Get integrator name.
Definition IntegrationManager.hpp:155
Integrator< Scalar > * GetIntegrator()
Get direct access to integrator (expert use).
Definition IntegrationManager.hpp:175
const Integrator< Scalar > * GetIntegrator() const
Get direct const access to integrator (expert use).
Definition IntegrationManager.hpp:180
bool IsAdaptive() const
Check if current integrator supports adaptive stepping.
Definition IntegrationManager.hpp:170
void Configure(const IntegratorConfig< Scalar > &config)
Configure from IntegratorConfig.
Definition IntegrationManager.hpp:54
IntegratorType Type() const
Get current integrator type.
Definition IntegrationManager.hpp:140
bool IsConfigured() const
Check if integrator is configured.
Definition IntegrationManager.hpp:165
JanusVector< Scalar > Step(const DerivativeFunc &deriv_func, const JanusVector< Scalar > &X, Scalar t, Scalar dt)
Perform fixed-step integration.
Definition IntegrationManager.hpp:96
AdaptiveStepResult< Scalar > AdaptiveStep(const DerivativeFunc &deriv_func, const JanusVector< Scalar > &X, Scalar t, Scalar dt_request)
Perform adaptive-step integration.
Definition IntegrationManager.hpp:116
std::function< JanusVector< Scalar >(Scalar, const JanusVector< Scalar > &)> DerivativeFunc
Derivative function signature: (t, X) -> X_dot.
Definition IntegrationManager.hpp:43
static std::unique_ptr< Integrator< Scalar > > Create(const IntegratorConfig< Scalar > &config)
Create integrator from configuration.
Definition IntegratorFactory.hpp:35
Abstract interface for numerical integrators.
Definition Integrator.hpp:45
Definition AggregationTypes.hpp:13
const char * to_string(SignalKind kind)
Convert SignalKind to string.
Definition Signal.hpp:86
IntegratorType
Available integrator methods.
Definition IntegratorTypes.hpp:27
IntegratorType parse_integrator_type(const std::string &name)
Parse integrator type from string (case-insensitive).
Definition IntegratorTypes.hpp:56
Result from adaptive step integrators.
Definition Integrator.hpp:26
Configuration for integrator creation.
Definition IntegratorTypes.hpp:83
static IntegratorConfig RK4Default()
Create default RK4 config.
Definition IntegratorTypes.hpp:96
static IntegratorConfig ForMethod(IntegratorType method)
Create config for specified method.
Definition IntegratorTypes.hpp:117