WPILibC++ 2023.4.3-108-ge5452e3
SparseProduct.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) 2008-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_SPARSEPRODUCT_H
11#define EIGEN_SPARSEPRODUCT_H
12
13namespace Eigen {
14
15/** \returns an expression of the product of two sparse matrices.
16 * By default a conservative product preserving the symbolic non zeros is performed.
17 * The automatic pruning of the small values can be achieved by calling the pruned() function
18 * in which case a totally different product algorithm is employed:
19 * \code
20 * C = (A*B).pruned(); // suppress numerical zeros (exact)
21 * C = (A*B).pruned(ref);
22 * C = (A*B).pruned(ref,epsilon);
23 * \endcode
24 * where \c ref is a meaningful non zero reference value.
25 * */
26template<typename Derived>
27template<typename OtherDerived>
28inline const Product<Derived,OtherDerived,AliasFreeProduct>
30{
32}
33
34namespace internal {
35
36// sparse * sparse
37template<typename Lhs, typename Rhs, int ProductType>
38struct generic_product_impl<Lhs, Rhs, SparseShape, SparseShape, ProductType>
39{
40 template<typename Dest>
41 static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs)
42 {
43 evalTo(dst, lhs, rhs, typename evaluator_traits<Dest>::Shape());
44 }
45
46 // dense += sparse * sparse
47 template<typename Dest,typename ActualLhs>
48 static void addTo(Dest& dst, const ActualLhs& lhs, const Rhs& rhs, typename enable_if<is_same<typename evaluator_traits<Dest>::Shape,DenseShape>::value,int*>::type* = 0)
49 {
50 typedef typename nested_eval<ActualLhs,Dynamic>::type LhsNested;
51 typedef typename nested_eval<Rhs,Dynamic>::type RhsNested;
52 LhsNested lhsNested(lhs);
53 RhsNested rhsNested(rhs);
55 typename remove_all<RhsNested>::type, Dest>::run(lhsNested,rhsNested,dst);
56 }
57
58 // dense -= sparse * sparse
59 template<typename Dest>
60 static void subTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, typename enable_if<is_same<typename evaluator_traits<Dest>::Shape,DenseShape>::value,int*>::type* = 0)
61 {
62 addTo(dst, -lhs, rhs);
63 }
64
65protected:
66
67 // sparse = sparse * sparse
68 template<typename Dest>
69 static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, SparseShape)
70 {
71 typedef typename nested_eval<Lhs,Dynamic>::type LhsNested;
72 typedef typename nested_eval<Rhs,Dynamic>::type RhsNested;
73 LhsNested lhsNested(lhs);
74 RhsNested rhsNested(rhs);
76 typename remove_all<RhsNested>::type, Dest>::run(lhsNested,rhsNested,dst);
77 }
78
79 // dense = sparse * sparse
80 template<typename Dest>
81 static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, DenseShape)
82 {
83 dst.setZero();
84 addTo(dst, lhs, rhs);
85 }
86};
87
88// sparse * sparse-triangular
89template<typename Lhs, typename Rhs, int ProductType>
91 : public generic_product_impl<Lhs, Rhs, SparseShape, SparseShape, ProductType>
92{};
93
94// sparse-triangular * sparse
95template<typename Lhs, typename Rhs, int ProductType>
97 : public generic_product_impl<Lhs, Rhs, SparseShape, SparseShape, ProductType>
98{};
99
100// dense = sparse-product (can be sparse*sparse, sparse*perm, etc.)
101template< typename DstXprType, typename Lhs, typename Rhs>
102struct Assignment<DstXprType, Product<Lhs,Rhs,AliasFreeProduct>, internal::assign_op<typename DstXprType::Scalar,typename Product<Lhs,Rhs,AliasFreeProduct>::Scalar>, Sparse2Dense>
103{
106 {
107 Index dstRows = src.rows();
108 Index dstCols = src.cols();
109 if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
110 dst.resize(dstRows, dstCols);
111
113 }
114};
115
116// dense += sparse-product (can be sparse*sparse, sparse*perm, etc.)
117template< typename DstXprType, typename Lhs, typename Rhs>
118struct Assignment<DstXprType, Product<Lhs,Rhs,AliasFreeProduct>, internal::add_assign_op<typename DstXprType::Scalar,typename Product<Lhs,Rhs,AliasFreeProduct>::Scalar>, Sparse2Dense>
119{
122 {
124 }
125};
126
127// dense -= sparse-product (can be sparse*sparse, sparse*perm, etc.)
128template< typename DstXprType, typename Lhs, typename Rhs>
129struct Assignment<DstXprType, Product<Lhs,Rhs,AliasFreeProduct>, internal::sub_assign_op<typename DstXprType::Scalar,typename Product<Lhs,Rhs,AliasFreeProduct>::Scalar>, Sparse2Dense>
130{
133 {
135 }
136};
137
138template<typename Lhs, typename Rhs, int Options>
139struct unary_evaluator<SparseView<Product<Lhs, Rhs, Options> >, IteratorBased>
140 : public evaluator<typename Product<Lhs, Rhs, DefaultProduct>::PlainObject>
141{
145
146 explicit unary_evaluator(const XprType& xpr)
147 : m_result(xpr.rows(), xpr.cols())
148 {
149 using std::abs;
150 ::new (static_cast<Base*>(this)) Base(m_result);
151 typedef typename nested_eval<Lhs,Dynamic>::type LhsNested;
152 typedef typename nested_eval<Rhs,Dynamic>::type RhsNested;
153 LhsNested lhsNested(xpr.nestedExpression().lhs());
154 RhsNested rhsNested(xpr.nestedExpression().rhs());
155
157 typename remove_all<RhsNested>::type, PlainObject>::run(lhsNested,rhsNested,m_result,
158 abs(xpr.reference())*xpr.epsilon());
159 }
160
161protected:
163};
164
165} // end namespace internal
166
167// sparse matrix = sparse-product (can be sparse*sparse, sparse*perm, etc.)
168template<typename Scalar, int _Options, typename _StorageIndex>
169template<typename Lhs, typename Rhs>
171{
172 // std::cout << "in Assignment : " << DstOptions << "\n";
173 SparseMatrix dst(src.rows(),src.cols());
175 this->swap(dst);
176 return *this;
177}
178
179} // end namespace Eigen
180
181#endif // EIGEN_SPARSEPRODUCT_H
Expression of the product of two arbitrary matrices or vectors.
Definition: Product.h:75
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const LhsNestedCleaned & lhs() const
Definition: Product.h:107
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const RhsNestedCleaned & rhs() const
Definition: Product.h:109
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition: Product.h:104
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition: Product.h:102
Base class of any sparse matrices or sparse expressions.
Definition: SparseMatrixBase.h:28
const Product< Derived, OtherDerived > operator*(const DiagonalBase< OtherDerived > &other) const
Definition: SparseMatrixBase.h:302
const Derived & derived() const
Definition: SparseMatrixBase.h:143
A versatible sparse matrix representation.
Definition: SparseMatrix.h:98
SparseMatrix & operator=(const SparseMatrix &other)
Definition: SparseMatrix.h:759
Expression of a dense or sparse matrix with zero or too small values removed.
Definition: SparseView.h:46
const internal::remove_all< MatrixTypeNested >::type & nestedExpression() const
Definition: SparseView.h:66
Scalar reference() const
Definition: SparseView.h:68
RealScalar epsilon() const
Definition: SparseView.h:69
Definition: core.h:1240
type
Definition: core.h:575
UnitType abs(const UnitType x) noexcept
Compute absolute value.
Definition: math.h:721
EIGEN_STRONG_INLINE void swap(T &a, T &b)
Definition: Meta.h:766
Namespace containing all symbols from the Eigen library.
Definition: Core:141
@ AliasFreeProduct
Definition: Constants.h:500
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:528
Definition: Constants.h:537
static void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op< typename DstXprType::Scalar, typename SrcXprType::Scalar > &)
Definition: SparseProduct.h:132
static void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op< typename DstXprType::Scalar, typename SrcXprType::Scalar > &)
Definition: SparseProduct.h:121
static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op< typename DstXprType::Scalar, typename SrcXprType::Scalar > &)
Definition: SparseProduct.h:105
Definition: AssignEvaluator.h:824
Definition: Constants.h:545
Definition: SparseAssign.h:62
Definition: SparseUtil.h:137
Definition: AssignmentFunctors.h:46
Definition: AssignmentFunctors.h:21
Definition: ConservativeSparseSparseProduct.h:131
Definition: Meta.h:273
storage_kind_to_shape< typenametraits< T >::StorageKind >::Shape Shape
Definition: CoreEvaluators.h:74
Definition: CoreEvaluators.h:91
static void evalTo(Dest &dst, const Lhs &lhs, const Rhs &rhs, DenseShape)
Definition: SparseProduct.h:81
static void addTo(Dest &dst, const ActualLhs &lhs, const Rhs &rhs, typename enable_if< is_same< typename evaluator_traits< Dest >::Shape, DenseShape >::value, int * >::type *=0)
Definition: SparseProduct.h:48
static void evalTo(Dest &dst, const Lhs &lhs, const Rhs &rhs, SparseShape)
Definition: SparseProduct.h:69
static void subTo(Dest &dst, const Lhs &lhs, const Rhs &rhs, typename enable_if< is_same< typename evaluator_traits< Dest >::Shape, DenseShape >::value, int * >::type *=0)
Definition: SparseProduct.h:60
static void evalTo(Dest &dst, const Lhs &lhs, const Rhs &rhs)
Definition: SparseProduct.h:41
Definition: ProductEvaluators.h:86
Definition: Meta.h:148
T type
Definition: Meta.h:126
Definition: SparseSparseProductWithPruning.h:84
Definition: ConservativeSparseSparseProduct.h:304
Definition: AssignmentFunctors.h:67
Definition: Meta.h:96
SparseView< Product< Lhs, Rhs, Options > > XprType
Definition: SparseProduct.h:142
Definition: CoreEvaluators.h:65