Eigen  3.4.90 (git rev 5a9f66fb35d03a4da9ef8976e67a61b30aa16dcf)
 
Loading...
Searching...
No Matches
SparseSolverBase.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2014 Gael Guennebaud <[email protected]>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10#ifndef EIGEN_SPARSESOLVERBASE_H
11#define EIGEN_SPARSESOLVERBASE_H
12
13// IWYU pragma: private
14#include "./InternalHeaderCheck.h"
15
16namespace Eigen {
17
18namespace internal {
19
24template <typename Decomposition, typename Rhs, typename Dest>
25std::enable_if_t<Rhs::ColsAtCompileTime != 1 && Dest::ColsAtCompileTime != 1> solve_sparse_through_dense_panels(
26 const Decomposition& dec, const Rhs& rhs, Dest& dest) {
27 EIGEN_STATIC_ASSERT((Dest::Flags & RowMajorBit) == 0, THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
28 typedef typename Dest::Scalar DestScalar;
29 // we process the sparse rhs per block of NbColsAtOnce columns temporarily stored into a dense matrix.
30 static const Index NbColsAtOnce = 4;
31 Index rhsCols = rhs.cols();
32 Index size = rhs.rows();
33 // the temporary matrices do not need more columns than NbColsAtOnce:
34 Index tmpCols = (std::min)(rhsCols, NbColsAtOnce);
37 for (Index k = 0; k < rhsCols; k += NbColsAtOnce) {
38 Index actualCols = std::min<Index>(rhsCols - k, NbColsAtOnce);
39 tmp.leftCols(actualCols) = rhs.middleCols(k, actualCols);
40 tmpX.leftCols(actualCols) = dec.solve(tmp.leftCols(actualCols));
41 dest.middleCols(k, actualCols) = tmpX.leftCols(actualCols).sparseView();
42 }
43}
44
45// Overload for vector as rhs
46template <typename Decomposition, typename Rhs, typename Dest>
47std::enable_if_t<Rhs::ColsAtCompileTime == 1 || Dest::ColsAtCompileTime == 1> solve_sparse_through_dense_panels(
48 const Decomposition& dec, const Rhs& rhs, Dest& dest) {
49 typedef typename Dest::Scalar DestScalar;
50 Index size = rhs.rows();
53 dest_dense = dec.solve(rhs_dense);
54 dest = dest_dense.sparseView();
55}
56
57} // end namespace internal
58
66template <typename Derived>
67class SparseSolverBase : internal::noncopyable {
68 public:
70 SparseSolverBase() : m_isInitialized(false) {}
71
72 SparseSolverBase(SparseSolverBase&& other) : internal::noncopyable{}, m_isInitialized{other.m_isInitialized} {}
73
74 ~SparseSolverBase() {}
75
76 Derived& derived() { return *static_cast<Derived*>(this); }
77 const Derived& derived() const { return *static_cast<const Derived*>(this); }
78
83 template <typename Rhs>
84 inline const Solve<Derived, Rhs> solve(const MatrixBase<Rhs>& b) const {
85 eigen_assert(m_isInitialized && "Solver is not initialized.");
86 eigen_assert(derived().rows() == b.rows() && "solve(): invalid number of rows of the right hand side matrix b");
87 return Solve<Derived, Rhs>(derived(), b.derived());
88 }
89
94 template <typename Rhs>
95 inline const Solve<Derived, Rhs> solve(const SparseMatrixBase<Rhs>& b) const {
96 eigen_assert(m_isInitialized && "Solver is not initialized.");
97 eigen_assert(derived().rows() == b.rows() && "solve(): invalid number of rows of the right hand side matrix b");
98 return Solve<Derived, Rhs>(derived(), b.derived());
99 }
100
101#ifndef EIGEN_PARSED_BY_DOXYGEN
103 template <typename Rhs, typename Dest>
104 void _solve_impl(const SparseMatrixBase<Rhs>& b, SparseMatrixBase<Dest>& dest) const {
105 internal::solve_sparse_through_dense_panels(derived(), b.derived(), dest.derived());
106 }
107#endif // EIGEN_PARSED_BY_DOXYGEN
108
109 protected:
110 mutable bool m_isInitialized;
111};
112
113} // end namespace Eigen
114
115#endif // EIGEN_SPARSESOLVERBASE_H
Derived & derived()
Definition EigenBase.h:49
EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition EigenBase.h:59
Base class for all dense matrices, vectors, and expressions.
Definition MatrixBase.h:52
The matrix class, also used for vectors and row-vectors.
Definition Matrix.h:186
Pseudo expression representing a solving operation.
Definition Solve.h:62
Base class of any sparse matrices or sparse expressions.
Definition SparseMatrixBase.h:30
Index rows() const
Definition SparseMatrixBase.h:182
A base class for sparse solvers.
Definition SparseSolverBase.h:67
const Solve< Derived, Rhs > solve(const MatrixBase< Rhs > &b) const
Definition SparseSolverBase.h:84
const Solve< Derived, Rhs > solve(const SparseMatrixBase< Rhs > &b) const
Definition SparseSolverBase.h:95
SparseSolverBase()
Definition SparseSolverBase.h:70
const unsigned int RowMajorBit
Definition Constants.h:70
Namespace containing all symbols from the Eigen library.
Definition Core:137
Derived & derived()
Definition EigenBase.h:49