Metis 2.0.0
High-performance C++20 dual-mode numerical framework
Loading...
Searching...
No Matches
Linalg.hpp File Reference

Linear algebra operations (solve, inverse, determinant, eigendecomposition, norms). More...

#include "metis/core/MetisConcepts.hpp"
#include "metis/core/MetisError.hpp"
#include "metis/core/MetisTypes.hpp"
#include "metis/math/Arithmetic.hpp"
#include "metis/math/Logic.hpp"
#include "metis/math/Trig.hpp"
#include <Eigen/Dense>
#include <Eigen/IterativeLinearSolvers>
#include <Eigen/SparseCholesky>
#include <Eigen/SparseLU>
#include <Eigen/SparseQR>
#include <algorithm>
#include <array>
#include <casadi/casadi.hpp>
#include <cmath>
#include <complex>
#include <functional>
#include <limits>
#include <numeric>
#include <string>
#include <unsupported/Eigen/IterativeSolvers>
#include <vector>
Include dependency graph for Linalg.hpp:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  metis::LinearSolvePolicy
 Configuration for linear system solve backend and algorithm. More...
class  metis::detail::FunctionalPreconditioner
struct  metis::EigenDecomposition< Scalar >
 Result of eigendecomposition: eigenvalues and eigenvectors. More...

Namespaces

namespace  metis
namespace  metis::detail
 Smooth approximation of ReLU function: softplus(x) = (1/beta) * log(1 + exp(beta * x)).

Enumerations

enum class  metis::LinearSolveBackend { metis::Dense , metis::SparseDirect , metis::IterativeKrylov }
 Backend selection for linear system solves. More...
enum class  metis::DenseLinearSolver {
  metis::ColPivHouseholderQR , metis::PartialPivLU , metis::FullPivLU , metis::LLT ,
  metis::LDLT
}
 Dense linear solver algorithm. More...
enum class  metis::SparseDirectLinearSolver { metis::SparseLU , metis::SparseQR , metis::SimplicialLLT , metis::SimplicialLDLT }
 Sparse direct solver algorithm. More...
enum class  metis::IterativeKrylovSolver { metis::BiCGSTAB , metis::GMRES }
 Iterative Krylov solver algorithm. More...
enum class  metis::IterativePreconditioner { metis::None , metis::Diagonal }
 Preconditioner for iterative solvers. More...
enum class  metis::NormType { metis::L1 , metis::L2 , metis::Inf , metis::Frobenius }
 Norm type selection. More...

Functions

void metis::detail::validate_linear_solve_dims (Eigen::Index a_rows, Eigen::Index a_cols, Eigen::Index b_rows, const std::string &context)
void metis::detail::validate_square_required (Eigen::Index rows, Eigen::Index cols, const std::string &context, const std::string &solver_name)
void metis::detail::validate_iterative_policy (const LinearSolvePolicy &policy, const std::string &context)
std::function< NumericVector(const NumericVector &)> metis::detail::make_preconditioner (const SparseMatrix &A, const LinearSolvePolicy &policy)
template<typename MatrixLike>
SparseMatrix metis::detail::dense_to_sparse (const MatrixLike &A)
template<typename DerivedB>
auto metis::detail::solve_sparse_direct_numeric (const SparseMatrix &A, const Eigen::MatrixBase< DerivedB > &b, const LinearSolvePolicy &policy)
template<typename Solver, typename DerivedB>
auto metis::detail::solve_iterative_with_solver (Solver &solver, const Eigen::MatrixBase< DerivedB > &b)
template<typename DerivedB>
auto metis::detail::solve_iterative_numeric (const SparseMatrix &A, const Eigen::MatrixBase< DerivedB > &b, const LinearSolvePolicy &policy)
template<typename DerivedA, typename DerivedB>
auto metis::detail::solve_dense_numeric (const Eigen::MatrixBase< DerivedA > &A, const Eigen::MatrixBase< DerivedB > &b, const LinearSolvePolicy &policy)
template<typename DerivedA, typename DerivedB>
auto metis::solve (const Eigen::MatrixBase< DerivedA > &A, const Eigen::MatrixBase< DerivedB > &b)
 Solves linear system Ax = b using the default backend policy.
template<typename DerivedA, typename DerivedB>
auto metis::solve (const Eigen::MatrixBase< DerivedA > &A, const Eigen::MatrixBase< DerivedB > &b, const LinearSolvePolicy &policy)
 Solves linear system Ax = b using an explicit backend policy.
template<typename DerivedB>
auto metis::solve (const SparseMatrix &A, const Eigen::MatrixBase< DerivedB > &b)
 Solve a numeric sparse linear system with a sparse-aware default backend.
template<typename DerivedB>
auto metis::solve (const SparseMatrix &A, const Eigen::MatrixBase< DerivedB > &b, const LinearSolvePolicy &policy)
 Solve a numeric sparse linear system using an explicit backend policy.
template<typename DerivedX, typename DerivedY>
auto metis::outer (const Eigen::MatrixBase< DerivedX > &x, const Eigen::MatrixBase< DerivedY > &y)
 Computes outer product x * y^T.
template<typename DerivedA, typename DerivedB>
auto metis::dot (const Eigen::MatrixBase< DerivedA > &a, const Eigen::MatrixBase< DerivedB > &b)
 Computes dot product of two vectors.
template<typename DerivedA, typename DerivedB>
auto metis::cross (const Eigen::MatrixBase< DerivedA > &a, const Eigen::MatrixBase< DerivedB > &b)
 Computes 3D cross product.
template<typename Derived>
auto metis::inv (const Eigen::MatrixBase< Derived > &A)
 Computes matrix inverse.
template<typename Derived>
auto metis::det (const Eigen::MatrixBase< Derived > &A)
 Computes matrix determinant.
template<typename DerivedA, typename DerivedB>
auto metis::inner (const Eigen::MatrixBase< DerivedA > &a, const Eigen::MatrixBase< DerivedB > &b)
 Computes inner product of two vectors (dot product).
template<typename Derived>
auto metis::pinv (const Eigen::MatrixBase< Derived > &A)
 Computes Moore-Penrose pseudo-inverse.
template<typename Derived>
auto metis::norm (const Eigen::MatrixBase< Derived > &x, NormType type=NormType::L2)
 Computes vector/matrix norm.
template<typename Scalar>
MetisVector< Scalar > metis::detail::normalize_vector (const MetisVector< Scalar > &v)
template<typename Scalar>
MetisVector< Scalar > metis::detail::best_eigenvector_candidate (const std::array< MetisVector< Scalar >, 3 > &cands)
template<typename Scalar>
MetisVector< Scalar > metis::detail::symmetric_eigenvector_2x2 (const MetisMatrix< Scalar > &A, const Scalar &lambda)
template<typename Scalar>
MetisVector< Scalar > metis::detail::symmetric_eigenvector_3x3 (const MetisMatrix< Scalar > &A, const Scalar &lambda)
template<typename Scalar>
Scalar metis::detail::determinant_3x3 (const MetisMatrix< Scalar > &A)
template<typename Scalar>
void metis::detail::sort_eigenpairs (MetisVector< Scalar > &eigenvalues, MetisMatrix< Scalar > &eigenvectors)
template<typename Scalar>
EigenDecomposition< Scalar > metis::detail::eig_symmetric_symbolic (const MetisMatrix< Scalar > &A)
template<typename Derived>
auto metis::eig (const Eigen::MatrixBase< Derived > &A)
 Computes the eigendecomposition of a square matrix with a real spectrum.
template<typename Derived>
auto metis::eig_symmetric (const Eigen::MatrixBase< Derived > &A)
 Computes the eigendecomposition of a symmetric matrix.
template<typename T>
std::tuple< T, T, T, T, T, T > metis::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.
SparseMatrix metis::sparse_from_triplets (int rows, int cols, const std::vector< SparseTriplet > &triplets)
 Create sparse matrix from triplets.
SparseMatrix metis::to_sparse (const NumericMatrix &dense, double tol=0.0)
 Convert dense matrix to sparse.
NumericMatrix metis::to_dense (const SparseMatrix &sparse)
 Convert sparse matrix to dense.
SparseMatrix metis::sparse_identity (int n)
 Create identity sparse matrix.

Variables

template<typename DerivedA>
constexpr bool metis::detail::dense_solver_square_compatible
template<typename Scalar>
constexpr bool metis::is_numeric_scalar_v = std::is_floating_point_v<Scalar> || std::is_integral_v<Scalar>
 Compile-time check for numeric scalar types.

Detailed Description

Linear algebra operations (solve, inverse, determinant, eigendecomposition, norms).

See also
Arithmetic.hpp