WPILibC++ 2023.4.3-108-ge5452e3
SparseTriangularView.h
Go to the documentation of this file.
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2009-2015 Gael Guennebaud <gael.guennebaud@inria.fr>
5// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>
6//
7// This Source Code Form is subject to the terms of the Mozilla
8// Public License v. 2.0. If a copy of the MPL was not distributed
9// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10
11#ifndef EIGEN_SPARSE_TRIANGULARVIEW_H
12#define EIGEN_SPARSE_TRIANGULARVIEW_H
13
14namespace Eigen {
15
16/** \ingroup SparseCore_Module
17 *
18 * \brief Base class for a triangular part in a \b sparse matrix
19 *
20 * This class is an abstract base class of class TriangularView, and objects of type TriangularViewImpl cannot be instantiated.
21 * It extends class TriangularView with additional methods which are available for sparse expressions only.
22 *
23 * \sa class TriangularView, SparseMatrixBase::triangularView()
24 */
25template<typename MatrixType, unsigned int Mode> class TriangularViewImpl<MatrixType,Mode,Sparse>
26 : public SparseMatrixBase<TriangularView<MatrixType,Mode> >
27{
28 enum { SkipFirst = ((Mode&Lower) && !(MatrixType::Flags&RowMajorBit))
29 || ((Mode&Upper) && (MatrixType::Flags&RowMajorBit)),
30 SkipLast = !SkipFirst,
31 SkipDiag = (Mode&ZeroDiag) ? 1 : 0,
32 HasUnitDiag = (Mode&UnitDiag) ? 1 : 0
33 };
34
36
37 protected:
38 // dummy solve function to make TriangularView happy.
39 void solve() const;
40
42 public:
43
45
46 typedef typename MatrixType::Nested MatrixTypeNested;
47 typedef typename internal::remove_reference<MatrixTypeNested>::type MatrixTypeNestedNonRef;
48 typedef typename internal::remove_all<MatrixTypeNested>::type MatrixTypeNestedCleaned;
49
50 template<typename RhsType, typename DstType>
52 EIGEN_STRONG_INLINE void _solve_impl(const RhsType &rhs, DstType &dst) const {
54 dst = rhs;
55 this->solveInPlace(dst);
56 }
57
58 /** Applies the inverse of \c *this to the dense vector or matrix \a other, "in-place" */
59 template<typename OtherDerived> void solveInPlace(MatrixBase<OtherDerived>& other) const;
60
61 /** Applies the inverse of \c *this to the sparse vector or matrix \a other, "in-place" */
62 template<typename OtherDerived> void solveInPlace(SparseMatrixBase<OtherDerived>& other) const;
63
64};
65
66namespace internal {
67
68template<typename ArgType, unsigned int Mode>
70 : evaluator_base<TriangularView<ArgType,Mode> >
71{
73
74protected:
75
76 typedef typename XprType::Scalar Scalar;
77 typedef typename XprType::StorageIndex StorageIndex;
79
80 enum { SkipFirst = ((Mode&Lower) && !(ArgType::Flags&RowMajorBit))
81 || ((Mode&Upper) && (ArgType::Flags&RowMajorBit)),
82 SkipLast = !SkipFirst,
83 SkipDiag = (Mode&ZeroDiag) ? 1 : 0,
84 HasUnitDiag = (Mode&UnitDiag) ? 1 : 0
85 };
86
87public:
88
89 enum {
91 Flags = XprType::Flags
92 };
93
94 explicit unary_evaluator(const XprType &xpr) : m_argImpl(xpr.nestedExpression()), m_arg(xpr.nestedExpression()) {}
95
96 inline Index nonZerosEstimate() const {
97 return m_argImpl.nonZerosEstimate();
98 }
99
101 {
102 typedef EvalIterator Base;
103 public:
104
106 : Base(xprEval.m_argImpl,outer), m_returnOne(false), m_containsDiag(Base::outer()<xprEval.m_arg.innerSize())
107 {
108 if(SkipFirst)
109 {
110 while((*this) && ((HasUnitDiag||SkipDiag) ? this->index()<=outer : this->index()<outer))
112 if(HasUnitDiag)
113 m_returnOne = m_containsDiag;
114 }
115 else if(HasUnitDiag && ((!Base::operator bool()) || Base::index()>=Base::outer()))
116 {
117 if((!SkipFirst) && Base::operator bool())
119 m_returnOne = m_containsDiag;
120 }
121 }
122
124 {
125 if(HasUnitDiag && m_returnOne)
126 m_returnOne = false;
127 else
128 {
130 if(HasUnitDiag && (!SkipFirst) && ((!Base::operator bool()) || Base::index()>=Base::outer()))
131 {
132 if((!SkipFirst) && Base::operator bool())
134 m_returnOne = m_containsDiag;
135 }
136 }
137 return *this;
138 }
139
140 EIGEN_STRONG_INLINE operator bool() const
141 {
142 if(HasUnitDiag && m_returnOne)
143 return true;
144 if(SkipFirst) return Base::operator bool();
145 else
146 {
147 if (SkipDiag) return (Base::operator bool() && this->index() < this->outer());
148 else return (Base::operator bool() && this->index() <= this->outer());
149 }
150 }
151
152// inline Index row() const { return (ArgType::Flags&RowMajorBit ? Base::outer() : this->index()); }
153// inline Index col() const { return (ArgType::Flags&RowMajorBit ? this->index() : Base::outer()); }
154 inline StorageIndex index() const
155 {
156 if(HasUnitDiag && m_returnOne) return internal::convert_index<StorageIndex>(Base::outer());
157 else return Base::index();
158 }
159 inline Scalar value() const
160 {
161 if(HasUnitDiag && m_returnOne) return Scalar(1);
162 else return Base::value();
163 }
164
165 protected:
168 private:
169 Scalar& valueRef();
170 };
171
172protected:
174 const ArgType& m_arg;
175};
176
177} // end namespace internal
178
179template<typename Derived>
180template<int Mode>
183{
184 return TriangularView<const Derived, Mode>(derived());
185}
186
187} // end namespace Eigen
188
189#endif // EIGEN_SPARSE_TRIANGULARVIEW_H
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:986
#define EIGEN_STRONG_INLINE
Definition: Macros.h:927
#define EIGEN_SPARSE_PUBLIC_INTERFACE(Derived)
Definition: SparseUtil.h:43
An InnerIterator allows to loop over the element of any matrix expression.
Definition: CoreIterators.h:34
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:50
Base class of any sparse matrices or sparse expressions.
Definition: SparseMatrixBase.h:28
const TriangularView< const Derived, Mode > triangularView() const
Definition: SparseTriangularView.h:182
Expression of a triangular part in a matrix.
Definition: TriangularMatrix.h:189
internal::traits< TriangularView >::Scalar Scalar
Definition: TriangularMatrix.h:193
MatrixType::Nested MatrixTypeNested
Definition: SparseTriangularView.h:46
SparseMatrixBase< TriangularViewType > Base
Definition: SparseTriangularView.h:41
void solveInPlace(MatrixBase< OtherDerived > &other) const
Applies the inverse of *this to the dense vector or matrix other, "in-place".
internal::remove_all< MatrixTypeNested >::type MatrixTypeNestedCleaned
Definition: SparseTriangularView.h:48
void solveInPlace(SparseMatrixBase< OtherDerived > &other) const
Applies the inverse of *this to the sparse vector or matrix other, "in-place".
internal::remove_reference< MatrixTypeNested >::type MatrixTypeNestedNonRef
Definition: SparseTriangularView.h:47
Definition: TriangularMatrix.h:185
EIGEN_STRONG_INLINE InnerIterator & operator++()
Definition: SparseTriangularView.h:123
EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator &xprEval, Index outer)
Definition: SparseTriangularView.h:105
type
Definition: core.h:575
@ UnitDiag
Matrix has ones on the diagonal; to be used in combination with Lower or Upper.
Definition: Constants.h:213
@ ZeroDiag
Matrix has zeros on the diagonal; to be used in combination with Lower or Upper.
Definition: Constants.h:215
@ Lower
View matrix as a lower triangular matrix.
Definition: Constants.h:209
@ Upper
View matrix as an upper triangular matrix.
Definition: Constants.h:211
const unsigned int RowMajorBit
for a matrix, this means that the storage order is row-major.
Definition: Constants.h:66
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const T::Scalar * extract_data(const T &m)
Definition: BlasUtil.h:533
Namespace containing all symbols from the Eigen library.
Definition: Core:141
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
Definition: Eigen_Colamd.h:50
unit_t< Units, T, NonLinearScale > & operator++(unit_t< Units, T, NonLinearScale > &u) noexcept
Definition: base.h:2346
The type used to identify a general sparse storage.
Definition: Constants.h:510
Definition: Constants.h:545
Definition: CoreEvaluators.h:111
Definition: CoreEvaluators.h:91
Definition: Meta.h:148
XprType::StorageIndex StorageIndex
Definition: SparseTriangularView.h:77
TriangularView< ArgType, Mode > XprType
Definition: SparseTriangularView.h:72
Index nonZerosEstimate() const
Definition: SparseTriangularView.h:96
evaluator< ArgType > m_argImpl
Definition: SparseTriangularView.h:173
evaluator< ArgType >::InnerIterator EvalIterator
Definition: SparseTriangularView.h:78
unary_evaluator(const XprType &xpr)
Definition: SparseTriangularView.h:94
Definition: CoreEvaluators.h:65