15#include <Eigen/IterativeLinearSolvers>
16#include <Eigen/SparseCholesky>
17#include <Eigen/SparseLU>
18#include <Eigen/SparseQR>
21#include <casadi/casadi.hpp>
28#include <unsupported/Eigen/IterativeSolvers>
147 const casadi::Dict &opts = casadi::Dict()) {
166 apply_ = std::move(apply);
169 Eigen::Index
rows() const noexcept {
return size_; }
170 Eigen::Index
cols() const noexcept {
return size_; }
186 template <
typename Rhs,
typename Dest>
void _solve_impl(
const Rhs &b, Dest &x)
const {
188 x = apply_ ? apply_(rhs) : rhs;
191 template <
typename Rhs>
192 inline const Eigen::Solve<FunctionalPreconditioner, Rhs>
193 solve(
const Eigen::MatrixBase<Rhs> &b)
const {
194 eigen_assert(initialized_ &&
"FunctionalPreconditioner is not initialized.");
195 eigen_assert(size_ == b.rows() &&
"FunctionalPreconditioner::solve(): invalid rhs size");
196 return Eigen::Solve<FunctionalPreconditioner, Rhs>(*
this, b.derived());
199 Eigen::ComputationInfo
info()
const {
return Eigen::Success; }
203 Eigen::Index size_ = 0;
204 bool initialized_ =
false;
208 Eigen::Index b_rows,
const std::string &context) {
209 if (a_rows == 0 || a_cols == 0) {
210 throw InvalidArgument(context +
": coefficient matrix must be non-empty");
212 if (b_rows != a_rows) {
213 throw InvalidArgument(context +
": rhs row count must match coefficient matrix rows");
218 const std::string &context,
const std::string &
solver_name) {
247 const double eps = std::numeric_limits<double>::epsilon();
248 for (
int i = 0; i < A.rows(); ++i) {
249 const double diag = A.coeff(i, i);
250 inv_diag(i) = std::abs(diag) > eps ? 1.0 / diag : 1.0;
252 return [inv_diag](
const NumericVector &rhs) {
return inv_diag.array() * rhs.array(); };
260 sparse.makeCompressed();
264template <
typename DerivedB>
267 using Result = Eigen::Matrix<double, Eigen::Dynamic, DerivedB::ColsAtCompileTime>;
270 matrix.makeCompressed();
274 Eigen::SparseLU<SparseMatrix> solver;
275 solver.compute(matrix);
276 if (solver.info() != Eigen::Success) {
279 return solver.solve(b).eval();
283 solver.compute(matrix);
284 if (solver.info() != Eigen::Success) {
287 return solver.solve(b).eval();
292 solver.compute(matrix);
293 if (solver.info() != Eigen::Success) {
296 return solver.solve(b).eval();
301 solver.compute(matrix);
302 if (solver.info() != Eigen::Success) {
305 return solver.solve(b).eval();
312template <
typename Solver,
typename DerivedB>
314 using Result = Eigen::Matrix<double, Eigen::Dynamic, DerivedB::ColsAtCompileTime>;
316 Result x(b.rows(), b.cols());
317 for (
int col = 0; col < b.cols(); ++col) {
320 if (solver.info() != Eigen::Success) {
328template <
typename DerivedB>
339 Eigen::BiCGSTAB<SparseMatrix, FunctionalPreconditioner> solver;
342 solver.preconditioner() = preconditioner;
347 Eigen::GMRES<SparseMatrix, FunctionalPreconditioner> solver;
351 solver.preconditioner() = preconditioner;
357 using Result = Eigen::Matrix<double, Eigen::Dynamic, DerivedB::ColsAtCompileTime>;
363template <
typename DerivedA>
365 DerivedA::RowsAtCompileTime == Eigen::Dynamic ||
366 DerivedA::ColsAtCompileTime == Eigen::Dynamic ||
367 DerivedA::RowsAtCompileTime == DerivedA::ColsAtCompileTime;
369template <
typename DerivedA,
typename DerivedB>
374 return A.colPivHouseholderQr().solve(b).eval();
378 return A.partialPivLu().solve(b).eval();
384 return A.fullPivLu().solve(b).eval();
391 if (solver.info() != Eigen::Success) {
394 return solver.solve(b).eval();
401 if (solver.info() != Eigen::Success) {
404 return solver.solve(b).eval();
409 return A.colPivHouseholderQr().solve(b).eval();
425template <
typename DerivedA,
typename DerivedB>
426auto solve(
const Eigen::MatrixBase<DerivedA> &A,
const Eigen::MatrixBase<DerivedB> &b) {
433template <
typename DerivedA,
typename DerivedB>
434auto solve(
const Eigen::MatrixBase<DerivedA> &A,
const Eigen::MatrixBase<DerivedB> &b,
436 using Scalar =
typename DerivedA::Scalar;
439 if constexpr (std::is_floating_point_v<Scalar>) {
445 Eigen::Matrix<Scalar, DerivedA::ColsAtCompileTime, DerivedB::ColsAtCompileTime>;
463 "solve: symbolic_options require a non-empty symbolic_linear_solver");
479template <
typename DerivedB>
487template <
typename DerivedB>
511template <
typename DerivedX,
typename DerivedY>
512auto outer(
const Eigen::MatrixBase<DerivedX> &x,
const Eigen::MatrixBase<DerivedY> &y) {
515 return x * y.transpose();
525template <
typename DerivedA,
typename DerivedB>
526auto dot(
const Eigen::MatrixBase<DerivedA> &a,
const Eigen::MatrixBase<DerivedB> &b) {
538template <
typename DerivedA,
typename DerivedB>
539auto cross(
const Eigen::MatrixBase<DerivedA> &a,
const Eigen::MatrixBase<DerivedB> &b) {
540 if (a.size() != 3 || b.size() != 3) {
541 throw InvalidArgument(
"cross: both vectors must have exactly 3 elements");
544 using Scalar =
typename DerivedA::Scalar;
545 Eigen::Matrix<Scalar, Eigen::Dynamic, 1> res(3);
546 res(0) = a(1) * b(2) - a(2) * b(1);
547 res(1) = a(2) * b(0) - a(0) * b(2);
548 res(2) = a(0) * b(1) - a(1) * b(0);
558template <
typename Derived>
auto inv(
const Eigen::MatrixBase<Derived> &A) {
559 using Scalar =
typename Derived::Scalar;
560 if constexpr (std::is_floating_point_v<Scalar>) {
561 return A.inverse().eval();
575template <
typename Derived>
auto det(
const Eigen::MatrixBase<Derived> &A) {
576 using Scalar =
typename Derived::Scalar;
577 if constexpr (std::is_floating_point_v<Scalar>) {
578 return A.determinant();
592template <
typename DerivedA,
typename DerivedB>
593auto inner(
const Eigen::MatrixBase<DerivedA> &a,
const Eigen::MatrixBase<DerivedB> &b) {
603template <
typename Derived>
auto pinv(
const Eigen::MatrixBase<Derived> &A) {
604 using Scalar =
typename Derived::Scalar;
605 if constexpr (std::is_floating_point_v<Scalar>) {
606 return A.completeOrthogonalDecomposition().pseudoInverse();
632template <
typename Derived>
634 using Scalar =
typename Derived::Scalar;
636 if constexpr (std::is_floating_point_v<Scalar>) {
639 return x.template lpNorm<1>();
643 return x.template lpNorm<Eigen::Infinity>();
653 return SymbolicScalar::norm_1(x_mx);
655 return SymbolicScalar::norm_2(x_mx);
657 return SymbolicScalar::norm_inf(x_mx);
659 return SymbolicScalar::norm_fro(x_mx);
661 return SymbolicScalar::norm_2(x_mx);
682 if constexpr (std::is_floating_point_v<Scalar>) {
683 if (v_norm <= std::numeric_limits<Scalar>::epsilon()) {
684 throw InvalidArgument(
"eigendecomposition: eigenvector construction failed");
690template <
typename Scalar>
692 const auto n01 =
metis::dot(cands[0], cands[0]);
693 const auto n02 =
metis::dot(cands[1], cands[1]);
694 const auto n12 =
metis::dot(cands[2], cands[2]);
696 if constexpr (std::is_floating_point_v<Scalar>) {
697 const auto *best = &cands[0];
698 Scalar best_norm = n01;
699 if (n02 > best_norm) {
703 if (n12 > best_norm) {
715template <
typename Scalar>
718 first << A(0, 1), lambda - A(0, 0);
721 second << lambda - A(1, 1), A(1, 0);
723 if constexpr (std::is_floating_point_v<Scalar>) {
732template <
typename Scalar>
735 shifted(0, 0) = shifted(0, 0) - lambda;
736 shifted(1, 1) = shifted(1, 1) - lambda;
737 shifted(2, 2) = shifted(2, 2) - lambda;
748 return A(0, 0) * (A(1, 1) * A(2, 2) - A(1, 2) * A(2, 1)) -
749 A(0, 1) * (A(1, 0) * A(2, 2) - A(1, 2) * A(2, 0)) +
750 A(0, 2) * (A(1, 0) * A(2, 1) - A(1, 1) * A(2, 0));
753template <
typename Scalar>
755 std::vector<Eigen::Index> order(
static_cast<size_t>(eigenvalues.size()));
756 std::iota(order.begin(), order.end(), Eigen::Index{0});
757 std::sort(order.begin(), order.end(), [&](Eigen::Index lhs, Eigen::Index rhs) {
758 return eigenvalues(lhs) < eigenvalues(rhs);
763 for (Eigen::Index i = 0; i < eigenvalues.size(); ++i) {
764 sorted_values(i) = eigenvalues(order[
static_cast<size_t>(i)]);
765 sorted_vectors.col(i) = eigenvectors.col(order[
static_cast<size_t>(i)]);
768 eigenvalues = std::move(sorted_values);
769 eigenvectors = std::move(sorted_vectors);
772template <
typename Scalar>
774 if (A.rows() != A.cols()) {
787 const Scalar trace = A(0, 0) + A(1, 1);
788 const Scalar disc =
metis::sqrt((A(0, 0) - A(1, 1)) * (A(0, 0) - A(1, 1)) +
789 Scalar(4.0) * A(0, 1) * A(0, 1));
793 result.
eigenvalues(0) = Scalar(0.5) * (trace - disc);
794 result.
eigenvalues(1) = Scalar(0.5) * (trace + disc);
803 const Scalar q = (A(0, 0) + A(1, 1) + A(2, 2)) / Scalar(3.0);
804 const Scalar p1 = A(0, 1) * A(0, 1) + A(0, 2) * A(0, 2) + A(1, 2) * A(1, 2);
805 const Scalar a00 = A(0, 0) - q;
806 const Scalar a11 = A(1, 1) - q;
807 const Scalar a22 = A(2, 2) - q;
808 const Scalar p2 = a00 * a00 + a11 * a11 + a22 * a22 + Scalar(2.0) * p1;
810 if constexpr (std::is_floating_point_v<Scalar>) {
811 if (p2 <= std::numeric_limits<Scalar>::epsilon()) {
819 const auto has_spread = p2 > Scalar(0.0);
823 centered(0, 0) = centered(0, 0) - q;
824 centered(1, 1) = centered(1, 1) - q;
825 centered(2, 2) = centered(2, 2) - q;
831 constexpr double kTwoPiOverThree = 2.0943951023931954923;
832 Scalar largest = q + Scalar(2.0) * p *
metis::cos(phi);
833 Scalar smallest = q + Scalar(2.0) * p *
metis::cos(phi + Scalar(kTwoPiOverThree));
834 Scalar middle = Scalar(3.0) * q - largest - smallest;
855 "eig_symmetric: symbolic support is limited to 1x1, 2x2, and 3x3 matrices");
868template <
typename Derived>
auto eig(
const Eigen::MatrixBase<Derived> &A) {
869 using Scalar =
typename Derived::Scalar;
871 if (A.rows() != A.cols()) {
875 if constexpr (std::is_floating_point_v<Scalar>) {
877 using Complex = std::complex<Scalar>;
878 using ComplexMatrix = Eigen::Matrix<Complex, Eigen::Dynamic, Eigen::Dynamic>;
879 using ComplexVector = Eigen::Matrix<Complex, Eigen::Dynamic, 1>;
889 Eigen::EigenSolver<Matrix> solver(A.eval());
890 if (solver.info() != Eigen::Success) {
894 const ComplexVector values_complex = solver.eigenvalues();
895 const ComplexMatrix vectors_complex = solver.eigenvectors();
896 constexpr Scalar kImagTol = Scalar(1e-10);
898 for (Eigen::Index i = 0; i < values_complex.size(); ++i) {
899 if (std::abs(values_complex(i).imag()) > kImagTol) {
904 for (Eigen::Index i = 0; i < vectors_complex.rows(); ++i) {
905 for (Eigen::Index j = 0; j < vectors_complex.cols(); ++j) {
906 if (std::abs(vectors_complex(i, j).imag()) > kImagTol) {
919 "eig: symbolic general eigendecomposition is not supported for CasADi MX; use "
920 "eig_symmetric() for 1x1, 2x2, or 3x3 symmetric matrices");
931template <
typename Derived>
auto eig_symmetric(
const Eigen::MatrixBase<Derived> &A) {
932 using Scalar =
typename Derived::Scalar;
934 if (A.rows() != A.cols()) {
938 if constexpr (std::is_floating_point_v<Scalar>) {
939 if (!A.isApprox(A.transpose(), 1e-12)) {
940 throw InvalidArgument(
"eig_symmetric: numeric input must be symmetric");
944 Eigen::SelfAdjointEigenSolver<Matrix> solver(A.eval());
945 if (solver.info() != Eigen::Success) {
978 const T &m12,
const T &m23,
const T &m13) {
980 T
det = m11 * (m33 * m22 - m23 * m23) - m12 * (m33 * m12 - m23 * m13) +
981 m13 * (m23 * m12 - m22 * m13);
983 T inv_det = 1.0 /
det;
985 T a11 = (m33 * m22 - m23 * m23) * inv_det;
986 T a12 = (m13 * m23 - m33 * m12) * inv_det;
987 T a13 = (m12 * m23 - m13 * m22) * inv_det;
988 T a22 = (m33 * m11 - m13 * m13) * inv_det;
989 T a23 = (m12 * m13 - m11 * m23) * inv_det;
990 T a33 = (m11 * m22 - m12 * m12) * inv_det;
992 return {a11, a12, a13, a22, a23, a33};
1005template <
typename Scalar>
1026 const std::vector<SparseTriplet> &triplets) {
1028 m.setFromTriplets(triplets.begin(), triplets.end());
1043 sparse.makeCompressed();
Scalar and element-wise arithmetic functions (abs, sqrt, pow, exp, log, etc.).
Conditional selection, comparison, and logical operations.
C++20 concepts constraining valid Metis scalar types.
Custom exception hierarchy for Metis framework.
Core type aliases for numeric and symbolic Eigen/CasADi interop.
Trigonometric and inverse trigonometric functions.
Input validation failed (e.g., mismatched sizes, invalid parameters).
Definition MetisError.hpp:31
Definition Linalg.hpp:156
const Eigen::Solve< FunctionalPreconditioner, Rhs > solve(const Eigen::MatrixBase< Rhs > &b) const
Definition Linalg.hpp:193
Eigen::ComputationInfo info() const
Definition Linalg.hpp:199
FunctionalPreconditioner & compute(const MatType &mat)
Definition Linalg.hpp:182
@ MaxColsAtCompileTime
Definition Linalg.hpp:161
@ ColsAtCompileTime
Definition Linalg.hpp:161
double Scalar
Definition Linalg.hpp:158
FunctionalPreconditioner & analyzePattern(const MatType &)
Definition Linalg.hpp:172
int StorageIndex
Definition Linalg.hpp:160
Eigen::Index cols() const noexcept
Definition Linalg.hpp:170
FunctionalPreconditioner & factorize(const MatType &mat)
Definition Linalg.hpp:176
void _solve_impl(const Rhs &b, Dest &x) const
Definition Linalg.hpp:186
Eigen::Index rows() const noexcept
Definition Linalg.hpp:169
void set_apply(std::function< NumericVector(const NumericVector &)> apply)
Definition Linalg.hpp:165
double RealScalar
Definition Linalg.hpp:159
FunctionalPreconditioner()=default
Smooth approximation of ReLU function: softplus(x) = (1/beta) * log(1 + exp(beta * x)).
Definition Diagnostics.hpp:131
void sort_eigenpairs(MetisVector< Scalar > &eigenvalues, MetisMatrix< Scalar > &eigenvectors)
Definition Linalg.hpp:754
auto select(const Cond &cond, const Eigen::MatrixBase< DerivedTrue > &if_true, const Eigen::MatrixBase< DerivedFalse > &if_false)
Definition Logic.hpp:55
void validate_linear_solve_dims(Eigen::Index a_rows, Eigen::Index a_cols, Eigen::Index b_rows, const std::string &context)
Definition Linalg.hpp:207
void validate_square_required(Eigen::Index rows, Eigen::Index cols, const std::string &context, const std::string &solver_name)
Definition Linalg.hpp:217
MetisVector< Scalar > symmetric_eigenvector_2x2(const MetisMatrix< Scalar > &A, const Scalar &lambda)
Definition Linalg.hpp:716
MetisVector< Scalar > best_eigenvector_candidate(const std::array< MetisVector< Scalar >, 3 > &cands)
Definition Linalg.hpp:691
MetisVector< Scalar > symmetric_eigenvector_3x3(const MetisMatrix< Scalar > &A, const Scalar &lambda)
Definition Linalg.hpp:733
auto solve_sparse_direct_numeric(const SparseMatrix &A, const Eigen::MatrixBase< DerivedB > &b, const LinearSolvePolicy &policy)
Definition Linalg.hpp:265
void validate_iterative_policy(const LinearSolvePolicy &policy, const std::string &context)
Definition Linalg.hpp:224
auto solve_iterative_with_solver(Solver &solver, const Eigen::MatrixBase< DerivedB > &b)
Definition Linalg.hpp:313
Scalar determinant_3x3(const MetisMatrix< Scalar > &A)
Definition Linalg.hpp:747
std::function< NumericVector(const NumericVector &)> make_preconditioner(const SparseMatrix &A, const LinearSolvePolicy &policy)
Definition Linalg.hpp:237
constexpr bool dense_solver_square_compatible
Definition Linalg.hpp:364
SparseMatrix dense_to_sparse(const MatrixLike &A)
Definition Linalg.hpp:258
auto solve_iterative_numeric(const SparseMatrix &A, const Eigen::MatrixBase< DerivedB > &b, const LinearSolvePolicy &policy)
Definition Linalg.hpp:329
EigenDecomposition< Scalar > eig_symmetric_symbolic(const MetisMatrix< Scalar > &A)
Definition Linalg.hpp:773
MetisVector< Scalar > normalize_vector(const MetisVector< Scalar > &v)
Definition Linalg.hpp:680
auto solve_dense_numeric(const Eigen::MatrixBase< DerivedA > &A, const Eigen::MatrixBase< DerivedB > &b, const LinearSolvePolicy &policy)
Definition Linalg.hpp:370
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
IterativeKrylovSolver
Iterative Krylov solver algorithm.
Definition Linalg.hpp:69
@ BiCGSTAB
Biconjugate gradient stabilized.
Definition Linalg.hpp:70
@ GMRES
Generalized minimal residual.
Definition Linalg.hpp:71
auto inner(const Eigen::MatrixBase< DerivedA > &a, const Eigen::MatrixBase< DerivedB > &b)
Computes inner product of two vectors (dot product).
Definition Linalg.hpp:593
SparseDirectLinearSolver
Sparse direct solver algorithm.
Definition Linalg.hpp:59
@ SimplicialLDLT
Simplicial LDLT (symmetric only).
Definition Linalg.hpp:63
@ SimplicialLLT
Simplicial Cholesky (SPD only).
Definition Linalg.hpp:62
@ SparseLU
Sparse LU factorization.
Definition Linalg.hpp:60
@ SparseQR
Sparse QR factorization.
Definition Linalg.hpp:61
SparseMatrix to_sparse(const NumericMatrix &dense, double tol=0.0)
Convert dense matrix to sparse.
Definition Linalg.hpp:1041
auto outer(const Eigen::MatrixBase< DerivedX > &x, const Eigen::MatrixBase< DerivedY > &y)
Computes outer product x * y^T.
Definition Linalg.hpp:512
NumericMatrix to_dense(const SparseMatrix &sparse)
Convert sparse matrix to dense.
Definition Linalg.hpp:1053
@ None
Definition AutoDiff.hpp:30
Eigen::LDLT< MatrixType > LDLT
Definition MetisTypes.hpp:89
IterativePreconditioner
Preconditioner for iterative solvers.
Definition Linalg.hpp:77
@ None
No preconditioning.
Definition Linalg.hpp:78
@ Diagonal
Jacobi (diagonal) preconditioner.
Definition Linalg.hpp:79
auto dot(const Eigen::MatrixBase< DerivedA > &a, const Eigen::MatrixBase< DerivedB > &b)
Computes dot product of two vectors.
Definition Linalg.hpp:526
Eigen::SparseQR< MatrixType, Ord > SparseQR
Definition MetisTypes.hpp:96
Solver
Available NLP solvers.
Definition OptiOptions.hpp:21
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
auto cross(const Eigen::MatrixBase< DerivedA > &a, const Eigen::MatrixBase< DerivedB > &b)
Computes 3D cross product.
Definition Linalg.hpp:539
T sqrt(const T &x)
Computes the square root of a scalar.
Definition Arithmetic.hpp:46
auto where(const Cond &cond, const T1 &if_true, const T2 &if_false)
Select values based on condition (ternary operator) Returns: cond ? if_true : if_false Supports mixed...
Definition Logic.hpp:43
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
std::tuple< T, T, T, T, T, T > inv_symmetric_3x3_explicit(const T &m11, const T &m22, const T &m33, const T &m12, const T &m23, const T &m13)
Explicit inverse of a symmetric 3x3 matrix.
Definition Linalg.hpp:977
SparseMatrix sparse_from_triplets(int rows, int cols, const std::vector< SparseTriplet > &triplets)
Create sparse matrix from triplets.
Definition Linalg.hpp:1025
NormType
Norm type selection.
Definition Linalg.hpp:619
@ Inf
Infinity (max absolute) norm.
Definition Linalg.hpp:622
@ L2
L2 (Euclidean) norm.
Definition Linalg.hpp:621
@ L1
L1 (Manhattan) norm.
Definition Linalg.hpp:620
@ Frobenius
Frobenius norm.
Definition Linalg.hpp:623
auto solve(const Eigen::MatrixBase< DerivedA > &A, const Eigen::MatrixBase< DerivedB > &b)
Solves linear system Ax = b using the default backend policy.
Definition Linalg.hpp:426
auto inv(const Eigen::MatrixBase< Derived > &A)
Computes matrix inverse.
Definition Linalg.hpp:558
Eigen::SparseMatrix< double > SparseMatrix
Sparse matrix types for efficient storage of large, sparse numeric data.
Definition MetisTypes.hpp:80
auto eig_symmetric(const Eigen::MatrixBase< Derived > &A)
Computes the eigendecomposition of a symmetric matrix.
Definition Linalg.hpp:931
constexpr bool is_numeric_scalar_v
Compile-time check for numeric scalar types.
Definition Linalg.hpp:1006
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
DenseLinearSolver
Dense linear solver algorithm.
Definition Linalg.hpp:48
@ FullPivLU
Full-pivot LU (square only).
Definition Linalg.hpp:51
@ LLT
Cholesky (SPD only).
Definition Linalg.hpp:52
@ LDLT
LDLT (symmetric only).
Definition Linalg.hpp:53
@ PartialPivLU
Partial-pivot LU (square only).
Definition Linalg.hpp:50
@ ColPivHouseholderQR
Column-pivoted Householder QR (default, general).
Definition Linalg.hpp:49
Eigen::LLT< MatrixType > LLT
Dense decomposition type aliases matching Eigen's decomposition templates. Use these in metis interna...
Definition MetisTypes.hpp:88
T cos(const T &x)
Computes cosine of x.
Definition Trig.hpp:46
casadi::MX to_mx(const Eigen::MatrixBase< Derived > &e)
Convert Eigen matrix of MX (or numeric) to CasADi MX.
Definition MetisTypes.hpp:206
auto pinv(const Eigen::MatrixBase< Derived > &A)
Computes Moore-Penrose pseudo-inverse.
Definition Linalg.hpp:603
auto norm(const Eigen::MatrixBase< Derived > &x, NormType type=NormType::L2)
Computes vector/matrix norm.
Definition Linalg.hpp:633
auto det(const Eigen::MatrixBase< Derived > &A)
Computes matrix determinant.
Definition Linalg.hpp:575
auto clamp(const T &val, const TLow &low, const THigh &high)
Clamps value between low and high.
Definition Logic.hpp:236
SparseMatrix sparse_identity(int n)
Create identity sparse matrix.
Definition Linalg.hpp:1061
Eigen::SimplicialLLT< MatrixType > SimplicialLLT
Definition MetisTypes.hpp:97
Eigen::SimplicialLDLT< MatrixType > SimplicialLDLT
Definition MetisTypes.hpp:98
const char * solver_name(Solver solver)
Get the CasADi solver name string.
Definition OptiOptions.hpp:38
T acos(const T &x)
Computes arc cosine of x.
Definition Trig.hpp:121
LinearSolveBackend
Backend selection for linear system solves.
Definition Linalg.hpp:39
@ IterativeKrylov
Iterative Krylov subspace method.
Definition Linalg.hpp:42
@ Dense
Dense matrix factorization.
Definition Linalg.hpp:40
@ SparseDirect
Sparse direct factorization.
Definition Linalg.hpp:41
MetisMatrix< NumericScalar > NumericMatrix
Eigen::MatrixXd equivalent.
Definition MetisTypes.hpp:66
auto eig(const Eigen::MatrixBase< Derived > &A)
Computes the eigendecomposition of a square matrix with a real spectrum.
Definition Linalg.hpp:868
Result of eigendecomposition: eigenvalues and eigenvectors.
Definition Linalg.hpp:673
MetisVector< Scalar > eigenvalues
Eigenvalues in ascending order.
Definition Linalg.hpp:674
MetisMatrix< Scalar > eigenvectors
Eigenvectors as columns.
Definition Linalg.hpp:675
Configuration for linear system solve backend and algorithm.
Definition Linalg.hpp:86
int gmres_restart
Definition Linalg.hpp:94
LinearSolvePolicy & set_gmres_restart(int value)
Definition Linalg.hpp:135
int max_iterations
Definition Linalg.hpp:93
casadi::Dict symbolic_options
Definition Linalg.hpp:97
SparseDirectLinearSolver sparse_direct_solver
Definition Linalg.hpp:89
IterativeKrylovSolver iterative_solver
Definition Linalg.hpp:90
LinearSolvePolicy & set_preconditioner_hook(std::function< NumericVector(const NumericVector &)> hook)
Definition Linalg.hpp:141
LinearSolvePolicy & set_max_iterations(int value)
Definition Linalg.hpp:130
double tolerance
Definition Linalg.hpp:92
std::function< NumericVector(const NumericVector &)> preconditioner_hook
Definition Linalg.hpp:95
static LinearSolvePolicy iterative(IterativeKrylovSolver solver=IterativeKrylovSolver::BiCGSTAB, IterativePreconditioner preconditioner=IterativePreconditioner::Diagonal)
Definition Linalg.hpp:116
LinearSolvePolicy & set_symbolic_solver(const std::string &solver, const casadi::Dict &opts=casadi::Dict())
Definition Linalg.hpp:146
static LinearSolvePolicy sparse_direct(SparseDirectLinearSolver solver=SparseDirectLinearSolver::SparseLU)
Definition Linalg.hpp:108
std::string symbolic_linear_solver
Definition Linalg.hpp:96
IterativePreconditioner iterative_preconditioner
Definition Linalg.hpp:91
LinearSolveBackend backend
Definition Linalg.hpp:87
DenseLinearSolver dense_solver
Definition Linalg.hpp:88
LinearSolvePolicy & set_tolerance(double value)
Definition Linalg.hpp:125
static LinearSolvePolicy dense(DenseLinearSolver solver=DenseLinearSolver::ColPivHouseholderQR)
Definition Linalg.hpp:100