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();
282 Eigen::SparseQR<SparseMatrix, Eigen::COLAMDOrdering<int>> solver;
283 solver.compute(matrix);
284 if (solver.info() != Eigen::Success) {
287 return solver.solve(b).eval();
291 Eigen::SimplicialLLT<SparseMatrix> solver;
292 solver.compute(matrix);
293 if (solver.info() != Eigen::Success) {
296 return solver.solve(b).eval();
300 Eigen::SimplicialLDLT<SparseMatrix> solver;
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>;
361template <
typename DerivedA,
typename DerivedB>
366 return A.colPivHouseholderQr().solve(b).eval();
369 return A.partialPivLu().solve(b).eval();
372 return A.fullPivLu().solve(b).eval();
375 Eigen::LLT<NumericMatrix> solver(A.eval());
376 if (solver.info() != Eigen::Success) {
379 return solver.solve(b).eval();
383 Eigen::LDLT<NumericMatrix> solver(A.eval());
384 if (solver.info() != Eigen::Success) {
387 return solver.solve(b).eval();
391 return A.colPivHouseholderQr().solve(b).eval();
407template <
typename DerivedA,
typename DerivedB>
408auto solve(
const Eigen::MatrixBase<DerivedA> &A,
const Eigen::MatrixBase<DerivedB> &b) {
415template <
typename DerivedA,
typename DerivedB>
416auto solve(
const Eigen::MatrixBase<DerivedA> &A,
const Eigen::MatrixBase<DerivedB> &b,
418 using Scalar =
typename DerivedA::Scalar;
421 if constexpr (std::is_floating_point_v<Scalar>) {
437 "solve: symbolic_options require a non-empty symbolic_linear_solver");
453template <
typename DerivedB>
461template <
typename DerivedB>
485template <
typename DerivedX,
typename DerivedY>
486auto outer(
const Eigen::MatrixBase<DerivedX> &x,
const Eigen::MatrixBase<DerivedY> &y) {
489 return x * y.transpose();
499template <
typename DerivedA,
typename DerivedB>
500auto dot(
const Eigen::MatrixBase<DerivedA> &a,
const Eigen::MatrixBase<DerivedB> &b) {
512template <
typename DerivedA,
typename DerivedB>
513auto cross(
const Eigen::MatrixBase<DerivedA> &a,
const Eigen::MatrixBase<DerivedB> &b) {
514 if (a.size() != 3 || b.size() != 3) {
515 throw InvalidArgument(
"cross: both vectors must have exactly 3 elements");
518 using Scalar =
typename DerivedA::Scalar;
519 Eigen::Matrix<Scalar, Eigen::Dynamic, 1> res(3);
520 res(0) = a(1) * b(2) - a(2) * b(1);
521 res(1) = a(2) * b(0) - a(0) * b(2);
522 res(2) = a(0) * b(1) - a(1) * b(0);
532template <
typename Derived>
auto inv(
const Eigen::MatrixBase<Derived> &A) {
533 using Scalar =
typename Derived::Scalar;
534 if constexpr (std::is_floating_point_v<Scalar>) {
535 return A.inverse().eval();
549template <
typename Derived>
auto det(
const Eigen::MatrixBase<Derived> &A) {
550 using Scalar =
typename Derived::Scalar;
551 if constexpr (std::is_floating_point_v<Scalar>) {
552 return A.determinant();
566template <
typename DerivedA,
typename DerivedB>
567auto inner(
const Eigen::MatrixBase<DerivedA> &a,
const Eigen::MatrixBase<DerivedB> &b) {
577template <
typename Derived>
auto pinv(
const Eigen::MatrixBase<Derived> &A) {
578 using Scalar =
typename Derived::Scalar;
579 if constexpr (std::is_floating_point_v<Scalar>) {
580 return A.completeOrthogonalDecomposition().pseudoInverse();
606template <
typename Derived>
608 using Scalar =
typename Derived::Scalar;
610 if constexpr (std::is_floating_point_v<Scalar>) {
613 return x.template lpNorm<1>();
617 return x.template lpNorm<Eigen::Infinity>();
627 return SymbolicScalar::norm_1(x_mx);
629 return SymbolicScalar::norm_2(x_mx);
631 return SymbolicScalar::norm_inf(x_mx);
633 return SymbolicScalar::norm_fro(x_mx);
635 return SymbolicScalar::norm_2(x_mx);
656 if constexpr (std::is_floating_point_v<Scalar>) {
657 if (v_norm <= std::numeric_limits<Scalar>::epsilon()) {
658 throw InvalidArgument(
"eigendecomposition: eigenvector construction failed");
664template <
typename Scalar>
666 const auto n01 =
janus::dot(cands[0], cands[0]);
667 const auto n02 =
janus::dot(cands[1], cands[1]);
668 const auto n12 =
janus::dot(cands[2], cands[2]);
670 if constexpr (std::is_floating_point_v<Scalar>) {
671 const auto *best = &cands[0];
672 Scalar best_norm = n01;
673 if (n02 > best_norm) {
677 if (n12 > best_norm) {
689template <
typename Scalar>
692 first << A(0, 1), lambda - A(0, 0);
695 second << lambda - A(1, 1), A(1, 0);
697 if constexpr (std::is_floating_point_v<Scalar>) {
706template <
typename Scalar>
709 shifted(0, 0) = shifted(0, 0) - lambda;
710 shifted(1, 1) = shifted(1, 1) - lambda;
711 shifted(2, 2) = shifted(2, 2) - lambda;
722 return A(0, 0) * (A(1, 1) * A(2, 2) - A(1, 2) * A(2, 1)) -
723 A(0, 1) * (A(1, 0) * A(2, 2) - A(1, 2) * A(2, 0)) +
724 A(0, 2) * (A(1, 0) * A(2, 1) - A(1, 1) * A(2, 0));
727template <
typename Scalar>
729 std::vector<Eigen::Index> order(
static_cast<size_t>(eigenvalues.size()));
730 std::iota(order.begin(), order.end(), Eigen::Index{0});
731 std::sort(order.begin(), order.end(), [&](Eigen::Index lhs, Eigen::Index rhs) {
732 return eigenvalues(lhs) < eigenvalues(rhs);
737 for (Eigen::Index i = 0; i < eigenvalues.size(); ++i) {
738 sorted_values(i) = eigenvalues(order[
static_cast<size_t>(i)]);
739 sorted_vectors.col(i) = eigenvectors.col(order[
static_cast<size_t>(i)]);
742 eigenvalues = std::move(sorted_values);
743 eigenvectors = std::move(sorted_vectors);
746template <
typename Scalar>
748 if (A.rows() != A.cols()) {
761 const Scalar trace = A(0, 0) + A(1, 1);
762 const Scalar disc =
janus::sqrt((A(0, 0) - A(1, 1)) * (A(0, 0) - A(1, 1)) +
763 Scalar(4.0) * A(0, 1) * A(0, 1));
767 result.
eigenvalues(0) = Scalar(0.5) * (trace - disc);
768 result.
eigenvalues(1) = Scalar(0.5) * (trace + disc);
777 const Scalar q = (A(0, 0) + A(1, 1) + A(2, 2)) / Scalar(3.0);
778 const Scalar p1 = A(0, 1) * A(0, 1) + A(0, 2) * A(0, 2) + A(1, 2) * A(1, 2);
779 const Scalar a00 = A(0, 0) - q;
780 const Scalar a11 = A(1, 1) - q;
781 const Scalar a22 = A(2, 2) - q;
782 const Scalar p2 = a00 * a00 + a11 * a11 + a22 * a22 + Scalar(2.0) * p1;
784 if constexpr (std::is_floating_point_v<Scalar>) {
785 if (p2 <= std::numeric_limits<Scalar>::epsilon()) {
793 const auto has_spread = p2 > Scalar(0.0);
797 centered(0, 0) = centered(0, 0) - q;
798 centered(1, 1) = centered(1, 1) - q;
799 centered(2, 2) = centered(2, 2) - q;
805 constexpr double kTwoPiOverThree = 2.0943951023931954923;
806 Scalar largest = q + Scalar(2.0) * p *
janus::cos(phi);
807 Scalar smallest = q + Scalar(2.0) * p *
janus::cos(phi + Scalar(kTwoPiOverThree));
808 Scalar middle = Scalar(3.0) * q - largest - smallest;
829 "eig_symmetric: symbolic support is limited to 1x1, 2x2, and 3x3 matrices");
842template <
typename Derived>
auto eig(
const Eigen::MatrixBase<Derived> &A) {
843 using Scalar =
typename Derived::Scalar;
845 if (A.rows() != A.cols()) {
849 if constexpr (std::is_floating_point_v<Scalar>) {
851 using Complex = std::complex<Scalar>;
852 using ComplexMatrix = Eigen::Matrix<Complex, Eigen::Dynamic, Eigen::Dynamic>;
853 using ComplexVector = Eigen::Matrix<Complex, Eigen::Dynamic, 1>;
863 Eigen::EigenSolver<Matrix> solver(A.eval());
864 if (solver.info() != Eigen::Success) {
868 const ComplexVector values_complex = solver.eigenvalues();
869 const ComplexMatrix vectors_complex = solver.eigenvectors();
870 constexpr Scalar kImagTol = Scalar(1e-10);
872 for (Eigen::Index i = 0; i < values_complex.size(); ++i) {
873 if (std::abs(values_complex(i).imag()) > kImagTol) {
878 for (Eigen::Index i = 0; i < vectors_complex.rows(); ++i) {
879 for (Eigen::Index j = 0; j < vectors_complex.cols(); ++j) {
880 if (std::abs(vectors_complex(i, j).imag()) > kImagTol) {
893 "eig: symbolic general eigendecomposition is not supported for CasADi MX; use "
894 "eig_symmetric() for 1x1, 2x2, or 3x3 symmetric matrices");
905template <
typename Derived>
auto eig_symmetric(
const Eigen::MatrixBase<Derived> &A) {
906 using Scalar =
typename Derived::Scalar;
908 if (A.rows() != A.cols()) {
912 if constexpr (std::is_floating_point_v<Scalar>) {
913 if (!A.isApprox(A.transpose(), 1e-12)) {
914 throw InvalidArgument(
"eig_symmetric: numeric input must be symmetric");
918 Eigen::SelfAdjointEigenSolver<Matrix> solver(A.eval());
919 if (solver.info() != Eigen::Success) {
952 const T &m12,
const T &m23,
const T &m13) {
954 T
det = m11 * (m33 * m22 - m23 * m23) - m12 * (m33 * m12 - m23 * m13) +
955 m13 * (m23 * m12 - m22 * m13);
957 T inv_det = 1.0 /
det;
959 T a11 = (m33 * m22 - m23 * m23) * inv_det;
960 T a12 = (m13 * m23 - m33 * m12) * inv_det;
961 T a13 = (m12 * m23 - m13 * m22) * inv_det;
962 T a22 = (m33 * m11 - m13 * m13) * inv_det;
963 T a23 = (m12 * m13 - m11 * m23) * inv_det;
964 T a33 = (m11 * m22 - m12 * m12) * inv_det;
966 return {a11, a12, a13, a22, a23, a33};
979template <
typename Scalar>
1000 const std::vector<SparseTriplet> &triplets) {
1002 m.setFromTriplets(triplets.begin(), triplets.end());
1017 sparse.makeCompressed();
Scalar and element-wise arithmetic functions (abs, sqrt, pow, exp, log, etc.).
C++20 concepts constraining valid Janus scalar types.
Custom exception hierarchy for Janus framework.
Core type aliases for numeric and symbolic Eigen/CasADi interop.
Conditional selection, comparison, and logical operations.
Trigonometric and inverse trigonometric functions.
Input validation failed (e.g., mismatched sizes, invalid parameters).
Definition JanusError.hpp:31
Definition Linalg.hpp:156
Eigen::ComputationInfo info() const
Definition Linalg.hpp:199
void _solve_impl(const Rhs &b, Dest &x) const
Definition Linalg.hpp:186
void set_apply(std::function< NumericVector(const NumericVector &)> apply)
Definition Linalg.hpp:165
FunctionalPreconditioner & factorize(const MatType &mat)
Definition Linalg.hpp:176
double Scalar
Definition Linalg.hpp:158
const Eigen::Solve< FunctionalPreconditioner, Rhs > solve(const Eigen::MatrixBase< Rhs > &b) const
Definition Linalg.hpp:193
Eigen::Index rows() const noexcept
Definition Linalg.hpp:169
int StorageIndex
Definition Linalg.hpp:160
FunctionalPreconditioner & compute(const MatType &mat)
Definition Linalg.hpp:182
FunctionalPreconditioner()=default
Eigen::Index cols() const noexcept
Definition Linalg.hpp:170
@ MaxColsAtCompileTime
Definition Linalg.hpp:161
@ ColsAtCompileTime
Definition Linalg.hpp:161
FunctionalPreconditioner & analyzePattern(const MatType &)
Definition Linalg.hpp:172
double RealScalar
Definition Linalg.hpp:159
Smooth approximation of ReLU function: softplus(x) = (1/beta) * log(1 + exp(beta * x)).
Definition Diagnostics.hpp:131
void validate_iterative_policy(const LinearSolvePolicy &policy, const std::string &context)
Definition Linalg.hpp:224
JanusVector< Scalar > symmetric_eigenvector_3x3(const JanusMatrix< Scalar > &A, const Scalar &lambda)
Definition Linalg.hpp:707
auto solve_sparse_direct_numeric(const SparseMatrix &A, const Eigen::MatrixBase< DerivedB > &b, const LinearSolvePolicy &policy)
Definition Linalg.hpp:265
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
std::function< NumericVector(const NumericVector &)> make_preconditioner(const SparseMatrix &A, const LinearSolvePolicy &policy)
Definition Linalg.hpp:237
Scalar determinant_3x3(const JanusMatrix< Scalar > &A)
Definition Linalg.hpp:721
JanusVector< Scalar > best_eigenvector_candidate(const std::array< JanusVector< Scalar >, 3 > &cands)
Definition Linalg.hpp:665
auto solve_iterative_with_solver(Solver &solver, const Eigen::MatrixBase< DerivedB > &b)
Definition Linalg.hpp:313
EigenDecomposition< Scalar > eig_symmetric_symbolic(const JanusMatrix< Scalar > &A)
Definition Linalg.hpp:747
auto select(const Cond &cond, const Eigen::MatrixBase< DerivedTrue > &if_true, const Eigen::MatrixBase< DerivedFalse > &if_false)
Definition Logic.hpp:55
SparseMatrix dense_to_sparse(const MatrixLike &A)
Definition Linalg.hpp:258
JanusVector< Scalar > normalize_vector(const JanusVector< Scalar > &v)
Definition Linalg.hpp:654
auto solve_dense_numeric(const Eigen::MatrixBase< DerivedA > &A, const Eigen::MatrixBase< DerivedB > &b, const LinearSolvePolicy &policy)
Definition Linalg.hpp:362
auto solve_iterative_numeric(const SparseMatrix &A, const Eigen::MatrixBase< DerivedB > &b, const LinearSolvePolicy &policy)
Definition Linalg.hpp:329
JanusVector< Scalar > symmetric_eigenvector_2x2(const JanusMatrix< Scalar > &A, const Scalar &lambda)
Definition Linalg.hpp:690
void sort_eigenpairs(JanusVector< Scalar > &eigenvalues, JanusMatrix< Scalar > &eigenvectors)
Definition Linalg.hpp:728
Definition Diagnostics.hpp:19
Eigen::SparseMatrix< double > SparseMatrix
Sparse matrix types for efficient storage of large, sparse numeric data.
Definition JanusTypes.hpp:80
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
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< Scalar, Eigen::Dynamic, Eigen::Dynamic > JanusMatrix
Dynamic-size matrix for both numeric and symbolic backends.
Definition JanusTypes.hpp:43
Solver
Available NLP solvers.
Definition OptiOptions.hpp:21
NormType
Norm type selection.
Definition Linalg.hpp:593
@ Inf
Infinity (max absolute) norm.
Definition Linalg.hpp:596
@ L2
L2 (Euclidean) norm.
Definition Linalg.hpp:595
@ L1
L1 (Manhattan) norm.
Definition Linalg.hpp:594
@ Frobenius
Frobenius norm.
Definition Linalg.hpp:597
JanusMatrix< NumericScalar > NumericMatrix
Eigen::MatrixXd equivalent.
Definition JanusTypes.hpp:66
auto dot(const Eigen::MatrixBase< DerivedA > &a, const Eigen::MatrixBase< DerivedB > &b)
Computes dot product of two vectors.
Definition Linalg.hpp:500
T sqrt(const T &x)
Computes the square root of a scalar.
Definition Arithmetic.hpp:46
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:951
auto clamp(const T &val, const TLow &low, const THigh &high)
Clamps value between low and high.
Definition Logic.hpp:236
auto det(const Eigen::MatrixBase< Derived > &A)
Computes matrix determinant.
Definition Linalg.hpp:549
T acos(const T &x)
Computes arc cosine of x.
Definition Trig.hpp:121
auto eig_symmetric(const Eigen::MatrixBase< Derived > &A)
Computes the eigendecomposition of a symmetric matrix.
Definition Linalg.hpp:905
JanusVector< NumericScalar > NumericVector
Eigen::VectorXd equivalent.
Definition JanusTypes.hpp:67
SparseMatrix sparse_from_triplets(int rows, int cols, const std::vector< SparseTriplet > &triplets)
Create sparse matrix from triplets.
Definition Linalg.hpp:999
auto inv(const Eigen::MatrixBase< Derived > &A)
Computes matrix inverse.
Definition Linalg.hpp:532
casadi::MX to_mx(const Eigen::MatrixBase< Derived > &e)
Convert Eigen matrix of MX (or numeric) to CasADi MX.
Definition JanusTypes.hpp:189
SparseMatrix sparse_identity(int n)
Create identity sparse matrix.
Definition Linalg.hpp:1035
T cos(const T &x)
Computes cosine of x.
Definition Trig.hpp:46
NumericMatrix to_dense(const SparseMatrix &sparse)
Convert sparse matrix to dense.
Definition Linalg.hpp:1027
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 norm(const Eigen::MatrixBase< Derived > &x, NormType type=NormType::L2)
Computes vector/matrix norm.
Definition Linalg.hpp:607
@ None
Definition AutoDiff.hpp:30
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
auto pinv(const Eigen::MatrixBase< Derived > &A)
Computes Moore-Penrose pseudo-inverse.
Definition Linalg.hpp:577
const char * solver_name(Solver solver)
Get the CasADi solver name string.
Definition OptiOptions.hpp:38
auto cross(const Eigen::MatrixBase< DerivedA > &a, const Eigen::MatrixBase< DerivedB > &b)
Computes 3D cross product.
Definition Linalg.hpp:513
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
IterativePreconditioner
Preconditioner for iterative solvers.
Definition Linalg.hpp:77
@ None
No preconditioning.
Definition Linalg.hpp:78
@ Diagonal
Jacobi (diagonal) preconditioner.
Definition Linalg.hpp:79
SparseMatrix to_sparse(const NumericMatrix &dense, double tol=0.0)
Convert dense matrix to sparse.
Definition Linalg.hpp:1015
constexpr bool is_numeric_scalar_v
Compile-time check for numeric scalar types.
Definition Linalg.hpp:980
auto inner(const Eigen::MatrixBase< DerivedA > &a, const Eigen::MatrixBase< DerivedB > &b)
Computes inner product of two vectors (dot product).
Definition Linalg.hpp:567
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
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:408
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
auto eig(const Eigen::MatrixBase< Derived > &A)
Computes the eigendecomposition of a square matrix with a real spectrum.
Definition Linalg.hpp:842
auto outer(const Eigen::MatrixBase< DerivedX > &x, const Eigen::MatrixBase< DerivedY > &y)
Computes outer product x * y^T.
Definition Linalg.hpp:486
Result of eigendecomposition: eigenvalues and eigenvectors.
Definition Linalg.hpp:647
JanusMatrix< Scalar > eigenvectors
Eigenvectors as columns.
Definition Linalg.hpp:649
JanusVector< Scalar > eigenvalues
Eigenvalues in ascending order.
Definition Linalg.hpp:648
Configuration for linear system solve backend and algorithm.
Definition Linalg.hpp:86
IterativeKrylovSolver iterative_solver
Definition Linalg.hpp:90
LinearSolveBackend backend
Definition Linalg.hpp:87
int gmres_restart
Definition Linalg.hpp:94
LinearSolvePolicy & set_max_iterations(int value)
Definition Linalg.hpp:130
std::function< NumericVector(const NumericVector &)> preconditioner_hook
Definition Linalg.hpp:95
static LinearSolvePolicy sparse_direct(SparseDirectLinearSolver solver=SparseDirectLinearSolver::SparseLU)
Definition Linalg.hpp:108
LinearSolvePolicy & set_symbolic_solver(const std::string &solver, const casadi::Dict &opts=casadi::Dict())
Definition Linalg.hpp:146
double tolerance
Definition Linalg.hpp:92
static LinearSolvePolicy iterative(IterativeKrylovSolver solver=IterativeKrylovSolver::BiCGSTAB, IterativePreconditioner preconditioner=IterativePreconditioner::Diagonal)
Definition Linalg.hpp:116
int max_iterations
Definition Linalg.hpp:93
SparseDirectLinearSolver sparse_direct_solver
Definition Linalg.hpp:89
LinearSolvePolicy & set_preconditioner_hook(std::function< NumericVector(const NumericVector &)> hook)
Definition Linalg.hpp:141
IterativePreconditioner iterative_preconditioner
Definition Linalg.hpp:91
std::string symbolic_linear_solver
Definition Linalg.hpp:96
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
LinearSolvePolicy & set_gmres_restart(int value)
Definition Linalg.hpp:135
casadi::Dict symbolic_options
Definition Linalg.hpp:97