WPILibC++ 2023.4.3-108-ge5452e3
SparseDiagonalProduct.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//
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_SPARSE_DIAGONAL_PRODUCT_H
11#define EIGEN_SPARSE_DIAGONAL_PRODUCT_H
12
13namespace Eigen {
14
15// The product of a diagonal matrix with a sparse matrix can be easily
16// implemented using expression template.
17// We have two consider very different cases:
18// 1 - diag * row-major sparse
19// => each inner vector <=> scalar * sparse vector product
20// => so we can reuse CwiseUnaryOp::InnerIterator
21// 2 - diag * col-major sparse
22// => each inner vector <=> densevector * sparse vector cwise product
23// => again, we can reuse specialization of CwiseBinaryOp::InnerIterator
24// for that particular case
25// The two other cases are symmetric.
26
27namespace internal {
28
29enum {
32};
33
34template<typename SparseXprType, typename DiagonalCoeffType, int SDP_Tag>
36
37template<typename Lhs, typename Rhs, int ProductTag>
39 : public sparse_diagonal_product_evaluator<Rhs, typename Lhs::DiagonalVectorType, Rhs::Flags&RowMajorBit?SDP_AsScalarProduct:SDP_AsCwiseProduct>
40{
42 enum { CoeffReadCost = HugeCost, Flags = Rhs::Flags&RowMajorBit, Alignment = 0 }; // FIXME CoeffReadCost & Flags
43
45 explicit product_evaluator(const XprType& xpr) : Base(xpr.rhs(), xpr.lhs().diagonal()) {}
46};
47
48template<typename Lhs, typename Rhs, int ProductTag>
50 : public sparse_diagonal_product_evaluator<Lhs, Transpose<const typename Rhs::DiagonalVectorType>, Lhs::Flags&RowMajorBit?SDP_AsCwiseProduct:SDP_AsScalarProduct>
51{
53 enum { CoeffReadCost = HugeCost, Flags = Lhs::Flags&RowMajorBit, Alignment = 0 }; // FIXME CoeffReadCost & Flags
54
56 explicit product_evaluator(const XprType& xpr) : Base(xpr.lhs(), xpr.rhs().diagonal().transpose()) {}
57};
58
59template<typename SparseXprType, typename DiagonalCoeffType>
60struct sparse_diagonal_product_evaluator<SparseXprType, DiagonalCoeffType, SDP_AsScalarProduct>
61{
62protected:
64 typedef typename SparseXprType::Scalar Scalar;
65
66public:
68 {
69 public:
71 : SparseXprInnerIterator(xprEval.m_sparseXprImpl, outer),
72 m_coeff(xprEval.m_diagCoeffImpl.coeff(outer))
73 {}
74
75 EIGEN_STRONG_INLINE Scalar value() const { return m_coeff * SparseXprInnerIterator::value(); }
76 protected:
77 typename DiagonalCoeffType::Scalar m_coeff;
78 };
79
80 sparse_diagonal_product_evaluator(const SparseXprType &sparseXpr, const DiagonalCoeffType &diagCoeff)
81 : m_sparseXprImpl(sparseXpr), m_diagCoeffImpl(diagCoeff)
82 {}
83
84 Index nonZerosEstimate() const { return m_sparseXprImpl.nonZerosEstimate(); }
85
86protected:
89};
90
91
92template<typename SparseXprType, typename DiagCoeffType>
93struct sparse_diagonal_product_evaluator<SparseXprType, DiagCoeffType, SDP_AsCwiseProduct>
94{
95 typedef typename SparseXprType::Scalar Scalar;
96 typedef typename SparseXprType::StorageIndex StorageIndex;
97
98 typedef typename nested_eval<DiagCoeffType,SparseXprType::IsRowMajor ? SparseXprType::RowsAtCompileTime
99 : SparseXprType::ColsAtCompileTime>::type DiagCoeffNested;
100
102 {
103 typedef typename evaluator<SparseXprType>::InnerIterator SparseXprIter;
104 public:
106 : m_sparseIter(xprEval.m_sparseXprEval, outer), m_diagCoeffNested(xprEval.m_diagCoeffNested)
107 {}
108
109 inline Scalar value() const { return m_sparseIter.value() * m_diagCoeffNested.coeff(index()); }
110 inline StorageIndex index() const { return m_sparseIter.index(); }
111 inline Index outer() const { return m_sparseIter.outer(); }
112 inline Index col() const { return SparseXprType::IsRowMajor ? m_sparseIter.index() : m_sparseIter.outer(); }
113 inline Index row() const { return SparseXprType::IsRowMajor ? m_sparseIter.outer() : m_sparseIter.index(); }
114
115 EIGEN_STRONG_INLINE InnerIterator& operator++() { ++m_sparseIter; return *this; }
116 inline operator bool() const { return m_sparseIter; }
117
118 protected:
119 SparseXprIter m_sparseIter;
121 };
122
123 sparse_diagonal_product_evaluator(const SparseXprType &sparseXpr, const DiagCoeffType &diagCoeff)
124 : m_sparseXprEval(sparseXpr), m_diagCoeffNested(diagCoeff)
125 {}
126
127 Index nonZerosEstimate() const { return m_sparseXprEval.nonZerosEstimate(); }
128
129protected:
132};
133
134} // end namespace internal
135
136} // end namespace Eigen
137
138#endif // EIGEN_SPARSE_DIAGONAL_PRODUCT_H
#define EIGEN_STRONG_INLINE
Definition: Macros.h:927
An InnerIterator allows to loop over the element of any matrix expression.
Definition: CoreIterators.h:34
Expression of the product of two arbitrary matrices or vectors.
Definition: Product.h:75
EIGEN_STRONG_INLINE InnerIterator & operator++()
Definition: SparseDiagonalProduct.h:115
InnerIterator(const sparse_diagonal_product_evaluator &xprEval, Index outer)
Definition: SparseDiagonalProduct.h:105
InnerIterator(const sparse_diagonal_product_evaluator &xprEval, Index outer)
Definition: SparseDiagonalProduct.h:70
type
Definition: core.h:575
const unsigned int RowMajorBit
for a matrix, this means that the storage order is row-major.
Definition: Constants.h:66
@ SDP_AsScalarProduct
Definition: SparseDiagonalProduct.h:30
@ SDP_AsCwiseProduct
Definition: SparseDiagonalProduct.h:31
Namespace containing all symbols from the Eigen library.
Definition: Core:141
@ DefaultProduct
Definition: Constants.h:500
const int HugeCost
This value means that the cost to evaluate an expression coefficient is either very expensive or cann...
Definition: Constants.h:44
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
Definition: Eigen_Colamd.h:50
Definition: Constants.h:531
Definition: Constants.h:537
Definition: CoreEvaluators.h:91
Definition: XprHelper.h:458
sparse_diagonal_product_evaluator< Rhs, typename Lhs::DiagonalVectorType, Rhs::Flags &RowMajorBit?SDP_AsScalarProduct:SDP_AsCwiseProduct > Base
Definition: SparseDiagonalProduct.h:44
sparse_diagonal_product_evaluator< Lhs, Transpose< const typename Rhs::DiagonalVectorType >, Lhs::Flags &RowMajorBit?SDP_AsCwiseProduct:SDP_AsScalarProduct > Base
Definition: SparseDiagonalProduct.h:55
Definition: ForwardDeclarations.h:164
sparse_diagonal_product_evaluator(const SparseXprType &sparseXpr, const DiagonalCoeffType &diagCoeff)
Definition: SparseDiagonalProduct.h:80
evaluator< DiagonalCoeffType > m_diagCoeffImpl
Definition: SparseDiagonalProduct.h:88
evaluator< SparseXprType >::InnerIterator SparseXprInnerIterator
Definition: SparseDiagonalProduct.h:63
nested_eval< DiagCoeffType, SparseXprType::IsRowMajor?SparseXprType::RowsAtCompileTime:SparseXprType::ColsAtCompileTime >::type DiagCoeffNested
Definition: SparseDiagonalProduct.h:99
evaluator< SparseXprType > m_sparseXprEval
Definition: SparseDiagonalProduct.h:130
SparseXprType::StorageIndex StorageIndex
Definition: SparseDiagonalProduct.h:96
sparse_diagonal_product_evaluator(const SparseXprType &sparseXpr, const DiagCoeffType &diagCoeff)
Definition: SparseDiagonalProduct.h:123
Definition: SparseDiagonalProduct.h:35