Janus 2.0.0
High-performance C++20 dual-mode numerical framework
Loading...
Searching...
No Matches
TranscriptionBase.hpp
Go to the documentation of this file.
1
5
6#pragma once
7
8#include "Opti.hpp"
11#include <functional>
12#include <string>
13#include <tuple>
14#include <utility>
15
16namespace janus {
17
28template <typename Derived> class TranscriptionBase {
29 public:
34 explicit TranscriptionBase(Opti &opti) : opti_(opti) {}
35
41 if (!setup_complete_) {
42 throw RuntimeError("TranscriptionBase: call setup() before set_initial_state()");
43 }
44 if (x0.size() != n_states_) {
45 throw InvalidArgument("TranscriptionBase: x0 size mismatch");
46 }
47 for (int i = 0; i < n_states_; ++i) {
48 opti_.subject_to(states_(0, i) == x0(i));
49 }
50 }
51
57 void set_initial_state(int idx, double value) {
58 if (!setup_complete_) {
59 throw RuntimeError("TranscriptionBase: call setup() before set_initial_state()");
60 }
61 if (idx < 0 || idx >= n_states_) {
62 throw InvalidArgument("TranscriptionBase: initial state index out of range");
63 }
64 opti_.subject_to(states_(0, idx) == value);
65 }
66
72 if (!setup_complete_) {
73 throw RuntimeError("TranscriptionBase: call setup() before set_final_state()");
74 }
75 if (xf.size() != n_states_) {
76 throw InvalidArgument("TranscriptionBase: xf size mismatch");
77 }
78 for (int i = 0; i < n_states_; ++i) {
79 opti_.subject_to(states_(n_nodes_ - 1, i) == xf(i));
80 }
81 }
82
88 void set_final_state(int idx, double value) {
89 if (!setup_complete_) {
90 throw RuntimeError("TranscriptionBase: call setup() before set_final_state()");
91 }
92 if (idx < 0 || idx >= n_states_) {
93 throw InvalidArgument("TranscriptionBase: final state index out of range");
94 }
95 opti_.subject_to(states_(n_nodes_ - 1, idx) == value);
96 }
97
104 template <typename Func> void set_dynamics(Func &&dynamics) {
105 if (!setup_complete_) {
106 throw RuntimeError("TranscriptionBase: call setup() before set_dynamics()");
107 }
109 throw RuntimeError("TranscriptionBase: set_dynamics() cannot be called after "
110 "add_dynamics_constraints(); call setup() again to start fresh");
111 }
112
113 dynamics_ = [fn = std::forward<Func>(dynamics)](
114 const SymbolicVector &x, const SymbolicVector &u,
115 const SymbolicScalar &t) -> SymbolicVector { return fn(x, u, t); };
116 dynamics_set_ = true;
117 }
118
121 const SymbolicMatrix &states() const { return states_; }
124 const SymbolicMatrix &controls() const { return controls_; }
127 const NumericVector &time_grid() const { return tau_; }
130 int n_nodes() const { return n_nodes_; }
133 int n_states() const { return n_states_; }
136 int n_controls() const { return n_controls_; }
137
140 if (!setup_complete_) {
141 throw RuntimeError("TranscriptionBase: call setup() before add_dynamics_constraints()");
142 }
143 static_cast<Derived *>(this)->add_dynamics_constraints_impl();
145 }
146
151
152 protected:
154 int n_states_ = 0;
155 int n_controls_ = 0;
156 int n_nodes_ = 0;
157
158 double t0_ = 0.0;
159 double tf_fixed_ = 1.0;
161 bool tf_is_variable_ = false;
162
163 bool setup_complete_ = false;
164 bool dynamics_set_ = false;
166
170
171 std::function<SymbolicVector(const SymbolicVector &, const SymbolicVector &,
172 const SymbolicScalar &)>
174
176 if (tf_is_variable_) {
177 return tf_symbolic_ - t0_;
178 }
179 return SymbolicScalar(tf_fixed_ - t0_);
180 }
181
183 if (k < 0 || k >= tau_.size()) {
184 throw InvalidArgument("TranscriptionBase: node index out of range");
185 }
186 return t0_ + tau_(k) * get_duration();
187 }
188
190 if (k < 0 || k >= states_.rows()) {
191 throw InvalidArgument("TranscriptionBase: state node index out of range");
192 }
194 for (int i = 0; i < n_states_; ++i) {
195 x(i) = states_(k, i);
196 }
197 return x;
198 }
199
201 if (k < 0 || k >= controls_.rows()) {
202 throw InvalidArgument("TranscriptionBase: control node index out of range");
203 }
205 for (int i = 0; i < n_controls_; ++i) {
206 u(i) = controls_(k, i);
207 }
208 return u;
209 }
210};
211
212} // namespace janus
Custom exception hierarchy for Janus framework.
Core type aliases for numeric and symbolic Eigen/CasADi interop.
High-level nonlinear programming interface.
Input validation failed (e.g., mismatched sizes, invalid parameters).
Definition JanusError.hpp:31
Main optimization environment class.
Definition Opti.hpp:167
Operation failed at runtime (e.g., CasADi eval with free variables).
Definition JanusError.hpp:41
bool tf_is_variable_
Definition TranscriptionBase.hpp:161
void add_continuity_constraints()
Alias for add_dynamics_constraints().
Definition TranscriptionBase.hpp:150
SymbolicMatrix controls_
Definition TranscriptionBase.hpp:169
int n_controls_
Definition TranscriptionBase.hpp:155
int n_controls() const
Get the number of control variables per node.
Definition TranscriptionBase.hpp:136
void set_initial_state(const NumericVector &x0)
Pin all initial states to specified values.
Definition TranscriptionBase.hpp:40
const NumericVector & time_grid() const
Get the normalized time grid.
Definition TranscriptionBase.hpp:127
void set_dynamics(Func &&dynamics)
Register the dynamics function xdot = f(x, u, t).
Definition TranscriptionBase.hpp:104
void add_dynamics_constraints()
Add dynamics constraints to the optimization problem.
Definition TranscriptionBase.hpp:139
int n_states_
Definition TranscriptionBase.hpp:154
double t0_
Definition TranscriptionBase.hpp:158
const SymbolicMatrix & states() const
Get the state decision variable matrix.
Definition TranscriptionBase.hpp:121
int n_states() const
Get the number of state variables per node.
Definition TranscriptionBase.hpp:133
NumericVector tau_
Definition TranscriptionBase.hpp:167
void set_final_state(int idx, double value)
Pin a single final state component.
Definition TranscriptionBase.hpp:88
int n_nodes() const
Get the number of discretization nodes.
Definition TranscriptionBase.hpp:130
TranscriptionBase(Opti &opti)
Construct with a reference to the optimization environment.
Definition TranscriptionBase.hpp:34
double tf_fixed_
Definition TranscriptionBase.hpp:159
std::function< SymbolicVector(const SymbolicVector &, const SymbolicVector &, const SymbolicScalar &)> dynamics_
Definition TranscriptionBase.hpp:173
void add_defect_constraints()
Alias for add_dynamics_constraints().
Definition TranscriptionBase.hpp:148
void set_final_state(const NumericVector &xf)
Pin all final states to specified values.
Definition TranscriptionBase.hpp:71
SymbolicScalar tf_symbolic_
Definition TranscriptionBase.hpp:160
SymbolicMatrix states_
Definition TranscriptionBase.hpp:168
bool setup_complete_
Definition TranscriptionBase.hpp:163
int n_nodes_
Definition TranscriptionBase.hpp:156
SymbolicVector get_state_at_node(int k) const
Definition TranscriptionBase.hpp:189
const SymbolicMatrix & controls() const
Get the control decision variable matrix.
Definition TranscriptionBase.hpp:124
void set_initial_state(int idx, double value)
Pin a single initial state component.
Definition TranscriptionBase.hpp:57
SymbolicScalar get_duration() const
Definition TranscriptionBase.hpp:175
SymbolicVector get_control_at_node(int k) const
Definition TranscriptionBase.hpp:200
bool dynamics_constraints_added_
Definition TranscriptionBase.hpp:165
SymbolicScalar get_time_at_node(int k) const
Definition TranscriptionBase.hpp:182
bool dynamics_set_
Definition TranscriptionBase.hpp:164
Opti & opti_
Definition TranscriptionBase.hpp:153
Definition Diagnostics.hpp:19
JanusVector< SymbolicScalar > SymbolicVector
Eigen vector of MX elements.
Definition JanusTypes.hpp:72
JanusVector< NumericScalar > NumericVector
Eigen::VectorXd equivalent.
Definition JanusTypes.hpp:67
JanusMatrix< SymbolicScalar > SymbolicMatrix
Eigen matrix of MX elements.
Definition JanusTypes.hpp:71
casadi::MX SymbolicScalar
CasADi MX symbolic scalar.
Definition JanusTypes.hpp:70