Metis 2.0.0
High-performance C++20 dual-mode numerical framework
Loading...
Searching...
No Matches
MetisTypes.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 metis {
36
37// --- Matrix Types ---
42template <typename Scalar>
43using MetisMatrix = Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>;
44
49template <typename Scalar> using MetisVector = 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// --- Dense Decompositions (aliases for Eigen decomposition types) ---
88template <typename MatrixType> using LLT = Eigen::LLT<MatrixType>;
89template <typename MatrixType> using LDLT = Eigen::LDLT<MatrixType>;
90template <typename MatrixType> using PartialPivLU = Eigen::PartialPivLU<MatrixType>;
91template <typename MatrixType> using FullPivLU = Eigen::FullPivLU<MatrixType>;
92template <typename MatrixType> using ColPivHouseholderQR = Eigen::ColPivHouseholderQR<MatrixType>;
93
94// --- Sparse Decompositions ---
95template <typename MatrixType, typename Ord = Eigen::COLAMDOrdering<int>>
96using SparseQR = Eigen::SparseQR<MatrixType, Ord>;
97template <typename MatrixType> using SimplicialLLT = Eigen::SimplicialLLT<MatrixType>;
98template <typename MatrixType> using SimplicialLDLT = Eigen::SimplicialLDLT<MatrixType>;
99
100// --- Symbolic Variable Creation ---
101
107inline SymbolicScalar sym(const std::string &name) { return casadi::MX::sym(name); }
108
116inline SymbolicScalar sym(const std::string &name, int rows, int cols = 1) {
117 return casadi::MX::sym(name, rows, cols);
118}
119
132inline SymbolicVector sym_vector(const std::string &name, int size) {
133 casadi::MX mx = casadi::MX::sym(name, size, 1);
134 SymbolicVector v(size);
135 for (int i = 0; i < size; ++i) {
136 v(i) = mx(i);
137 }
138 return v;
139}
140
154inline SymbolicVector sym_vec(const std::string &name, int size) {
155 // Delegate to sym_vector - they are equivalent
156 return sym_vector(name, size);
157}
158
172inline std::pair<SymbolicVector, SymbolicScalar> sym_vec_pair(const std::string &name, int size) {
173 casadi::MX mx = casadi::MX::sym(name, size, 1);
174 SymbolicVector v(size);
175 for (int i = 0; i < size; ++i) {
176 v(i) = mx(i);
177 }
178 return {v, mx};
179}
180
191 casadi::MX m(v.size(), 1);
192 for (int i = 0; i < v.size(); ++i) {
193 m(i) = v(i);
194 }
195 return m;
196}
197
198// --- Universal Conversion Helpers ---
199
206template <typename Derived> casadi::MX to_mx(const Eigen::MatrixBase<Derived> &e) {
207 if (e.size() == 0)
208 return casadi::MX(e.rows(), e.cols());
209
210 // Create an MX of correct shape
211 casadi::MX m(e.rows(), e.cols());
212 // Fill it element-wise
213 for (Eigen::Index i = 0; i < e.rows(); ++i) {
214 for (Eigen::Index j = 0; j < e.cols(); ++j) {
215 if constexpr (std::is_same_v<typename Derived::Scalar, casadi::MX>) {
216 m(static_cast<int>(i), static_cast<int>(j)) = e(i, j);
217 } else {
218 m(static_cast<int>(i), static_cast<int>(j)) = casadi::MX(e(i, j));
219 }
220 }
221 }
222 return m;
223}
224
230inline Eigen::Matrix<casadi::MX, Eigen::Dynamic, Eigen::Dynamic> to_eigen(const casadi::MX &m) {
231 Eigen::Matrix<casadi::MX, Eigen::Dynamic, Eigen::Dynamic> e(m.size1(), m.size2());
232 for (int i = 0; i < m.size1(); ++i) {
233 for (int j = 0; j < m.size2(); ++j) {
234 e(i, j) = m(i, j);
235 }
236 }
237 return e;
238}
239
245inline SymbolicVector as_vector(const casadi::MX &m) {
246 SymbolicVector v(m.size1());
247 for (int i = 0; i < m.size1(); ++i) {
248 v(i) = m(i);
249 }
250 return v;
251}
252
262 public:
267 SymbolicArg(const SymbolicScalar &s) : mx_(s) {}
268
274 template <typename Derived> SymbolicArg(const Eigen::MatrixBase<Derived> &e) : mx_(to_mx(e)) {}
275
280 operator SymbolicScalar() const { return mx_; }
281
286 SymbolicScalar get() const { return mx_; }
287
288 private:
289 SymbolicScalar mx_;
290};
291
292} // namespace metis
SymbolicScalar get() const
Get underlying CasADi MX object.
Definition MetisTypes.hpp:286
SymbolicArg(const Eigen::MatrixBase< Derived > &e)
Construct from Eigen matrix of symbolic scalars.
Definition MetisTypes.hpp:274
SymbolicArg(const SymbolicScalar &s)
Construct from single symbolic scalar (MX).
Definition MetisTypes.hpp:267
Definition MetisTypes.hpp:9
Definition Diagnostics.hpp:19
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > MetisVector
Dynamic-size column vector for both numeric and symbolic backends.
Definition MetisTypes.hpp:49
std::pair< SymbolicVector, SymbolicScalar > sym_vec_pair(const std::string &name, int size)
Create symbolic vector and return both SymbolicVector and underlying MX.
Definition MetisTypes.hpp:172
MetisVector< SymbolicScalar > SymbolicVector
Eigen vector of MX elements.
Definition MetisTypes.hpp:72
SymbolicScalar as_mx(const SymbolicVector &v)
Get the underlying MX representation of a SymbolicVector.
Definition MetisTypes.hpp:190
Eigen::LDLT< MatrixType > LDLT
Definition MetisTypes.hpp:89
Eigen::Matrix< Scalar, 4, 4 > Mat4
Definition MetisTypes.hpp:62
Eigen::SparseQR< MatrixType, Ord > SparseQR
Definition MetisTypes.hpp:96
SymbolicVector sym_vec(const std::string &name, int size)
Create a symbolic vector preserving the CasADi primitive connection.
Definition MetisTypes.hpp:154
Eigen::FullPivLU< MatrixType > FullPivLU
Definition MetisTypes.hpp:91
MetisVector< NumericScalar > NumericVector
Eigen::VectorXd equivalent.
Definition MetisTypes.hpp:67
casadi::MX SymbolicScalar
CasADi MX symbolic scalar.
Definition MetisTypes.hpp:70
Eigen::ColPivHouseholderQR< MatrixType > ColPivHouseholderQR
Definition MetisTypes.hpp:92
Eigen::Matrix< Scalar, 3, 3 > Mat3
Definition MetisTypes.hpp:61
Eigen::Matrix< casadi::MX, Eigen::Dynamic, Eigen::Dynamic > to_eigen(const casadi::MX &m)
Convert CasADi MX to Eigen matrix of MX.
Definition MetisTypes.hpp:230
SymbolicScalar sym(const std::string &name)
Create a named symbolic scalar variable.
Definition MetisTypes.hpp:107
Eigen::SparseMatrix< double > SparseMatrix
Sparse matrix types for efficient storage of large, sparse numeric data.
Definition MetisTypes.hpp:80
Eigen::Matrix< Scalar, 3, 1 > Vec3
Definition MetisTypes.hpp:57
Eigen::PartialPivLU< MatrixType > PartialPivLU
Definition MetisTypes.hpp:90
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > MetisMatrix
Dynamic-size matrix for both numeric and symbolic backends.
Definition MetisTypes.hpp:43
Eigen::LLT< MatrixType > LLT
Dense decomposition type aliases matching Eigen's decomposition templates. Use these in metis interna...
Definition MetisTypes.hpp:88
casadi::MX to_mx(const Eigen::MatrixBase< Derived > &e)
Convert Eigen matrix of MX (or numeric) to CasADi MX.
Definition MetisTypes.hpp:206
SymbolicVector as_vector(const casadi::MX &m)
Convert CasADi MX vector to SymbolicVector (Eigen container of MX).
Definition MetisTypes.hpp:245
SymbolicVector sym_vector(const std::string &name, int size)
Create a named symbolic vector (returns SymbolicVector).
Definition MetisTypes.hpp:132
Eigen::Matrix< Scalar, 2, 1 > Vec2
Fixed-size vectors and matrices for performance-critical code.
Definition MetisTypes.hpp:56
Eigen::Triplet< double > SparseTriplet
(row, col, value) triplet
Definition MetisTypes.hpp:81
Eigen::Matrix< Scalar, 2, 2 > Mat2
Definition MetisTypes.hpp:60
double NumericScalar
Numeric scalar type.
Definition MetisTypes.hpp:65
Eigen::SimplicialLLT< MatrixType > SimplicialLLT
Definition MetisTypes.hpp:97
Eigen::SimplicialLDLT< MatrixType > SimplicialLDLT
Definition MetisTypes.hpp:98
MetisMatrix< SymbolicScalar > SymbolicMatrix
Eigen matrix of MX elements.
Definition MetisTypes.hpp:71
Eigen::Matrix< Scalar, 4, 1 > Vec4
Definition MetisTypes.hpp:58
MetisMatrix< NumericScalar > NumericMatrix
Eigen::MatrixXd equivalent.
Definition MetisTypes.hpp:66
static int digits10()
Definition MetisTypes.hpp:25
static int min_exponent()
Definition MetisTypes.hpp:26
static casadi::MX dummy_precision()
Definition MetisTypes.hpp:29
static casadi::MX highest()
Definition MetisTypes.hpp:30
@ RequireInitialization
Definition MetisTypes.hpp:19
@ IsSigned
Definition MetisTypes.hpp:18
@ IsInteger
Definition MetisTypes.hpp:17
@ AddCost
Definition MetisTypes.hpp:21
@ MulCost
Definition MetisTypes.hpp:22
@ ReadCost
Definition MetisTypes.hpp:20
@ IsComplex
Definition MetisTypes.hpp:16
static casadi::MX epsilon()
Definition MetisTypes.hpp:28
static int max_exponent()
Definition MetisTypes.hpp:27
static casadi::MX lowest()
Definition MetisTypes.hpp:31