Janus 2.0.0
High-performance C++20 dual-mode numerical framework
Loading...
Searching...
No Matches
JanusTypes.hpp
Go to the documentation of this file.
1
3#pragma once
4#include <Eigen/Dense>
5#include <Eigen/Sparse>
6#include <casadi/casadi.hpp>
7#include <limits>
8
9namespace Eigen {
14template <> struct NumTraits<casadi::MX> : GenericNumTraits<casadi::MX> {
15 enum {
23 };
24
25 static inline int digits10() { return std::numeric_limits<double>::digits10; }
26 static inline int min_exponent() { return std::numeric_limits<double>::min_exponent; }
27 static inline int max_exponent() { return std::numeric_limits<double>::max_exponent; }
28 static inline casadi::MX epsilon() { return std::numeric_limits<double>::epsilon(); }
29 static inline casadi::MX dummy_precision() { return 1e-5; }
30 static inline casadi::MX highest() { return std::numeric_limits<double>::max(); }
31 static inline casadi::MX lowest() { return std::numeric_limits<double>::lowest(); }
32};
33} // namespace Eigen
34
35namespace janus {
36
37// --- Matrix Types ---
42template <typename Scalar>
43using JanusMatrix = Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>;
44
49template <typename Scalar> using JanusVector = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>;
50
51// --- Fixed-Size Types ---
56template <typename Scalar> using Vec2 = Eigen::Matrix<Scalar, 2, 1>;
57template <typename Scalar> using Vec3 = Eigen::Matrix<Scalar, 3, 1>;
58template <typename Scalar> using Vec4 = Eigen::Matrix<Scalar, 4, 1>;
59
60template <typename Scalar> using Mat2 = Eigen::Matrix<Scalar, 2, 2>;
61template <typename Scalar> using Mat3 = Eigen::Matrix<Scalar, 3, 3>;
62template <typename Scalar> using Mat4 = Eigen::Matrix<Scalar, 4, 4>;
63
64// Numeric Backend
65using NumericScalar = double;
68
69// Symbolic Backend
70using SymbolicScalar = casadi::MX;
73
74// --- Sparse Numeric Types ---
80using SparseMatrix = Eigen::SparseMatrix<double>;
81using SparseTriplet = Eigen::Triplet<double>;
82
83// --- Symbolic Variable Creation ---
84
90inline SymbolicScalar sym(const std::string &name) { return casadi::MX::sym(name); }
91
99inline SymbolicScalar sym(const std::string &name, int rows, int cols = 1) {
100 return casadi::MX::sym(name, rows, cols);
101}
102
115inline SymbolicVector sym_vector(const std::string &name, int size) {
116 casadi::MX mx = casadi::MX::sym(name, size, 1);
117 SymbolicVector v(size);
118 for (int i = 0; i < size; ++i) {
119 v(i) = mx(i);
120 }
121 return v;
122}
123
137inline SymbolicVector sym_vec(const std::string &name, int size) {
138 // Delegate to sym_vector - they are equivalent
139 return sym_vector(name, size);
140}
141
155inline std::pair<SymbolicVector, SymbolicScalar> sym_vec_pair(const std::string &name, int size) {
156 casadi::MX mx = casadi::MX::sym(name, size, 1);
157 SymbolicVector v(size);
158 for (int i = 0; i < size; ++i) {
159 v(i) = mx(i);
160 }
161 return {v, mx};
162}
163
174 casadi::MX m(v.size(), 1);
175 for (int i = 0; i < v.size(); ++i) {
176 m(i) = v(i);
177 }
178 return m;
179}
180
181// --- Universal Conversion Helpers ---
182
189template <typename Derived> casadi::MX to_mx(const Eigen::MatrixBase<Derived> &e) {
190 if (e.size() == 0)
191 return casadi::MX(e.rows(), e.cols());
192
193 // Create an MX of correct shape
194 casadi::MX m(e.rows(), e.cols());
195 // Fill it element-wise
196 for (Eigen::Index i = 0; i < e.rows(); ++i) {
197 for (Eigen::Index j = 0; j < e.cols(); ++j) {
198 if constexpr (std::is_same_v<typename Derived::Scalar, casadi::MX>) {
199 m(static_cast<int>(i), static_cast<int>(j)) = e(i, j);
200 } else {
201 m(static_cast<int>(i), static_cast<int>(j)) = casadi::MX(e(i, j));
202 }
203 }
204 }
205 return m;
206}
207
213inline Eigen::Matrix<casadi::MX, Eigen::Dynamic, Eigen::Dynamic> to_eigen(const casadi::MX &m) {
214 Eigen::Matrix<casadi::MX, Eigen::Dynamic, Eigen::Dynamic> e(m.size1(), m.size2());
215 for (int i = 0; i < m.size1(); ++i) {
216 for (int j = 0; j < m.size2(); ++j) {
217 e(i, j) = m(i, j);
218 }
219 }
220 return e;
221}
222
228inline SymbolicVector as_vector(const casadi::MX &m) {
229 SymbolicVector v(m.size1());
230 for (int i = 0; i < m.size1(); ++i) {
231 v(i) = m(i);
232 }
233 return v;
234}
235
240inline SymbolicVector to_eigen_vec(const casadi::MX &m) { return as_vector(m); }
241
251 public:
256 SymbolicArg(const SymbolicScalar &s) : mx_(s) {}
257
263 template <typename Derived> SymbolicArg(const Eigen::MatrixBase<Derived> &e) {
264 if (e.size() == 0) {
265 mx_ = casadi::MX(e.rows(), e.cols());
266 return;
267 }
268 mx_ = casadi::MX(e.rows(), e.cols());
269 for (Eigen::Index i = 0; i < e.rows(); ++i) {
270 for (Eigen::Index j = 0; j < e.cols(); ++j) {
271 mx_(static_cast<int>(i), static_cast<int>(j)) = e(i, j);
272 }
273 }
274 }
275
280 operator SymbolicScalar() const { return mx_; }
281
286 SymbolicScalar get() const { return mx_; }
287
288 private:
289 SymbolicScalar mx_;
290};
291
292} // namespace janus
SymbolicScalar get() const
Get underlying CasADi MX object.
Definition JanusTypes.hpp:286
SymbolicArg(const SymbolicScalar &s)
Construct from single symbolic scalar (MX).
Definition JanusTypes.hpp:256
SymbolicArg(const Eigen::MatrixBase< Derived > &e)
Construct from Eigen matrix of symbolic scalars.
Definition JanusTypes.hpp:263
Definition JanusTypes.hpp:9
Definition Diagnostics.hpp:19
Eigen::SparseMatrix< double > SparseMatrix
Sparse matrix types for efficient storage of large, sparse numeric data.
Definition JanusTypes.hpp:80
JanusVector< SymbolicScalar > SymbolicVector
Eigen vector of MX elements.
Definition JanusTypes.hpp:72
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > JanusMatrix
Dynamic-size matrix for both numeric and symbolic backends.
Definition JanusTypes.hpp:43
Eigen::Matrix< Scalar, 2, 1 > Vec2
Fixed-size vectors and matrices for performance-critical code.
Definition JanusTypes.hpp:56
SymbolicVector sym_vec(const std::string &name, int size)
Create a symbolic vector preserving the CasADi primitive connection.
Definition JanusTypes.hpp:137
JanusMatrix< NumericScalar > NumericMatrix
Eigen::MatrixXd equivalent.
Definition JanusTypes.hpp:66
Eigen::Matrix< Scalar, 4, 4 > Mat4
Definition JanusTypes.hpp:62
Eigen::Triplet< double > SparseTriplet
(row, col, value) triplet
Definition JanusTypes.hpp:81
SymbolicVector as_vector(const casadi::MX &m)
Convert CasADi MX vector to SymbolicVector (Eigen container of MX).
Definition JanusTypes.hpp:228
JanusVector< NumericScalar > NumericVector
Eigen::VectorXd equivalent.
Definition JanusTypes.hpp:67
Eigen::Matrix< Scalar, 2, 2 > Mat2
Definition JanusTypes.hpp:60
Eigen::Matrix< Scalar, 4, 1 > Vec4
Definition JanusTypes.hpp:58
casadi::MX to_mx(const Eigen::MatrixBase< Derived > &e)
Convert Eigen matrix of MX (or numeric) to CasADi MX.
Definition JanusTypes.hpp:189
std::pair< SymbolicVector, SymbolicScalar > sym_vec_pair(const std::string &name, int size)
Create symbolic vector and return both SymbolicVector and underlying MX.
Definition JanusTypes.hpp:155
Eigen::Matrix< Scalar, 3, 3 > Mat3
Definition JanusTypes.hpp:61
JanusMatrix< SymbolicScalar > SymbolicMatrix
Eigen matrix of MX elements.
Definition JanusTypes.hpp:71
SymbolicScalar sym(const std::string &name)
Create a named symbolic scalar variable.
Definition JanusTypes.hpp:90
SymbolicVector to_eigen_vec(const casadi::MX &m)
Backwards compatibility alias for as_vector.
Definition JanusTypes.hpp:240
Eigen::Matrix< casadi::MX, Eigen::Dynamic, Eigen::Dynamic > to_eigen(const casadi::MX &m)
Convert CasADi MX to Eigen matrix of MX.
Definition JanusTypes.hpp:213
Eigen::Matrix< Scalar, 3, 1 > Vec3
Definition JanusTypes.hpp:57
SymbolicVector sym_vector(const std::string &name, int size)
Create a named symbolic vector (returns SymbolicVector).
Definition JanusTypes.hpp:115
double NumericScalar
Numeric scalar type.
Definition JanusTypes.hpp:65
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > JanusVector
Dynamic-size column vector for both numeric and symbolic backends.
Definition JanusTypes.hpp:49
casadi::MX SymbolicScalar
CasADi MX symbolic scalar.
Definition JanusTypes.hpp:70
SymbolicScalar as_mx(const SymbolicVector &v)
Get the underlying MX representation of a SymbolicVector.
Definition JanusTypes.hpp:173
static int digits10()
Definition JanusTypes.hpp:25
static int min_exponent()
Definition JanusTypes.hpp:26
static casadi::MX dummy_precision()
Definition JanusTypes.hpp:29
static casadi::MX highest()
Definition JanusTypes.hpp:30
static casadi::MX epsilon()
Definition JanusTypes.hpp:28
static int max_exponent()
Definition JanusTypes.hpp:27
@ RequireInitialization
Definition JanusTypes.hpp:19
@ IsSigned
Definition JanusTypes.hpp:18
@ IsInteger
Definition JanusTypes.hpp:17
@ AddCost
Definition JanusTypes.hpp:21
@ MulCost
Definition JanusTypes.hpp:22
@ ReadCost
Definition JanusTypes.hpp:20
@ IsComplex
Definition JanusTypes.hpp:16
static casadi::MX lowest()
Definition JanusTypes.hpp:31