6#include <casadi/casadi.hpp>
14template <>
struct NumTraits<casadi::MX> : GenericNumTraits<casadi::MX> {
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(); }
30 static inline casadi::MX
highest() {
return std::numeric_limits<double>::max(); }
31 static inline casadi::MX
lowest() {
return std::numeric_limits<double>::lowest(); }
42template <
typename Scalar>
43using MetisMatrix = Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>;
49template <
typename Scalar>
using MetisVector = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>;
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>;
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>;
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>;
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>;
117 return casadi::MX::sym(name, rows, cols);
133 casadi::MX mx = casadi::MX::sym(name, size, 1);
135 for (
int i = 0; i < size; ++i) {
172inline std::pair<SymbolicVector, SymbolicScalar>
sym_vec_pair(
const std::string &name,
int size) {
173 casadi::MX mx = casadi::MX::sym(name, size, 1);
175 for (
int i = 0; i < size; ++i) {
191 casadi::MX m(v.size(), 1);
192 for (
int i = 0; i < v.size(); ++i) {
206template <
typename Derived> casadi::MX
to_mx(
const Eigen::MatrixBase<Derived> &e) {
208 return casadi::MX(e.rows(), e.cols());
211 casadi::MX m(e.rows(), e.cols());
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);
218 m(
static_cast<int>(i),
static_cast<int>(j)) = casadi::MX(e(i, j));
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) {
247 for (
int i = 0; i < m.size1(); ++i) {
274 template <
typename Derived>
SymbolicArg(
const Eigen::MatrixBase<Derived> &e) : mx_(
to_mx(e)) {}
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