WPILibC++ 2023.4.3-108-ge5452e3
IndexedView.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) 2017 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_INDEXED_VIEW_H
11#define EIGEN_INDEXED_VIEW_H
12
13namespace Eigen {
14
15namespace internal {
16
17template<typename XprType, typename RowIndices, typename ColIndices>
18struct traits<IndexedView<XprType, RowIndices, ColIndices> >
19 : traits<XprType>
20{
21 enum {
22 RowsAtCompileTime = int(array_size<RowIndices>::value),
23 ColsAtCompileTime = int(array_size<ColIndices>::value),
24 MaxRowsAtCompileTime = RowsAtCompileTime != Dynamic ? int(RowsAtCompileTime) : Dynamic,
25 MaxColsAtCompileTime = ColsAtCompileTime != Dynamic ? int(ColsAtCompileTime) : Dynamic,
26
27 XprTypeIsRowMajor = (int(traits<XprType>::Flags)&RowMajorBit) != 0,
28 IsRowMajor = (MaxRowsAtCompileTime==1&&MaxColsAtCompileTime!=1) ? 1
29 : (MaxColsAtCompileTime==1&&MaxRowsAtCompileTime!=1) ? 0
30 : XprTypeIsRowMajor,
31
32 RowIncr = int(get_compile_time_incr<RowIndices>::value),
33 ColIncr = int(get_compile_time_incr<ColIndices>::value),
34 InnerIncr = IsRowMajor ? ColIncr : RowIncr,
35 OuterIncr = IsRowMajor ? RowIncr : ColIncr,
36
37 HasSameStorageOrderAsXprType = (IsRowMajor == XprTypeIsRowMajor),
38 XprInnerStride = HasSameStorageOrderAsXprType ? int(inner_stride_at_compile_time<XprType>::ret) : int(outer_stride_at_compile_time<XprType>::ret),
39 XprOuterstride = HasSameStorageOrderAsXprType ? int(outer_stride_at_compile_time<XprType>::ret) : int(inner_stride_at_compile_time<XprType>::ret),
40
41 InnerSize = XprTypeIsRowMajor ? ColsAtCompileTime : RowsAtCompileTime,
42 IsBlockAlike = InnerIncr==1 && OuterIncr==1,
43 IsInnerPannel = HasSameStorageOrderAsXprType && is_same<AllRange<InnerSize>,typename conditional<XprTypeIsRowMajor,ColIndices,RowIndices>::type>::value,
44
45 InnerStrideAtCompileTime = InnerIncr<0 || InnerIncr==DynamicIndex || XprInnerStride==Dynamic ? Dynamic : XprInnerStride * InnerIncr,
46 OuterStrideAtCompileTime = OuterIncr<0 || OuterIncr==DynamicIndex || XprOuterstride==Dynamic ? Dynamic : XprOuterstride * OuterIncr,
47
48 ReturnAsScalar = is_same<RowIndices,SingleRange>::value && is_same<ColIndices,SingleRange>::value,
49 ReturnAsBlock = (!ReturnAsScalar) && IsBlockAlike,
50 ReturnAsIndexedView = (!ReturnAsScalar) && (!ReturnAsBlock),
51
52 // FIXME we deal with compile-time strides if and only if we have DirectAccessBit flag,
53 // but this is too strict regarding negative strides...
54 DirectAccessMask = (int(InnerIncr)!=UndefinedIncr && int(OuterIncr)!=UndefinedIncr && InnerIncr>=0 && OuterIncr>=0) ? DirectAccessBit : 0,
55 FlagsRowMajorBit = IsRowMajor ? RowMajorBit : 0,
56 FlagsLvalueBit = is_lvalue<XprType>::value ? LvalueBit : 0,
57 FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1) ? LinearAccessBit : 0,
58 Flags = (traits<XprType>::Flags & (HereditaryBits | DirectAccessMask )) | FlagsLvalueBit | FlagsRowMajorBit | FlagsLinearAccessBit
59 };
60
62};
63
64}
65
66template<typename XprType, typename RowIndices, typename ColIndices, typename StorageKind>
67class IndexedViewImpl;
68
69
70/** \class IndexedView
71 * \ingroup Core_Module
72 *
73 * \brief Expression of a non-sequential sub-matrix defined by arbitrary sequences of row and column indices
74 *
75 * \tparam XprType the type of the expression in which we are taking the intersections of sub-rows and sub-columns
76 * \tparam RowIndices the type of the object defining the sequence of row indices
77 * \tparam ColIndices the type of the object defining the sequence of column indices
78 *
79 * This class represents an expression of a sub-matrix (or sub-vector) defined as the intersection
80 * of sub-sets of rows and columns, that are themself defined by generic sequences of row indices \f$ \{r_0,r_1,..r_{m-1}\} \f$
81 * and column indices \f$ \{c_0,c_1,..c_{n-1} \}\f$. Let \f$ A \f$ be the nested matrix, then the resulting matrix \f$ B \f$ has \c m
82 * rows and \c n columns, and its entries are given by: \f$ B(i,j) = A(r_i,c_j) \f$.
83 *
84 * The \c RowIndices and \c ColIndices types must be compatible with the following API:
85 * \code
86 * <integral type> operator[](Index) const;
87 * Index size() const;
88 * \endcode
89 *
90 * Typical supported types thus include:
91 * - std::vector<int>
92 * - std::valarray<int>
93 * - std::array<int>
94 * - Plain C arrays: int[N]
95 * - Eigen::ArrayXi
96 * - decltype(ArrayXi::LinSpaced(...))
97 * - Any view/expressions of the previous types
98 * - Eigen::ArithmeticSequence
99 * - Eigen::internal::AllRange (helper for Eigen::all)
100 * - Eigen::internal::SingleRange (helper for single index)
101 * - etc.
102 *
103 * In typical usages of %Eigen, this class should never be used directly. It is the return type of
104 * DenseBase::operator()(const RowIndices&, const ColIndices&).
105 *
106 * \sa class Block
107 */
108template<typename XprType, typename RowIndices, typename ColIndices>
109class IndexedView : public IndexedViewImpl<XprType, RowIndices, ColIndices, typename internal::traits<XprType>::StorageKind>
110{
111public:
115
116 typedef typename internal::ref_selector<XprType>::non_const_type MatrixTypeNested;
117 typedef typename internal::remove_all<XprType>::type NestedExpression;
118
119 template<typename T0, typename T1>
120 IndexedView(XprType& xpr, const T0& rowIndices, const T1& colIndices)
121 : m_xpr(xpr), m_rowIndices(rowIndices), m_colIndices(colIndices)
122 {}
123
124 /** \returns number of rows */
125 Index rows() const { return internal::size(m_rowIndices); }
126
127 /** \returns number of columns */
128 Index cols() const { return internal::size(m_colIndices); }
129
130 /** \returns the nested expression */
132 nestedExpression() const { return m_xpr; }
133
134 /** \returns the nested expression */
136 nestedExpression() { return m_xpr; }
137
138 /** \returns a const reference to the object storing/generating the row indices */
139 const RowIndices& rowIndices() const { return m_rowIndices; }
140
141 /** \returns a const reference to the object storing/generating the column indices */
142 const ColIndices& colIndices() const { return m_colIndices; }
143
144protected:
146 RowIndices m_rowIndices;
147 ColIndices m_colIndices;
148};
149
150
151// Generic API dispatcher
152template<typename XprType, typename RowIndices, typename ColIndices, typename StorageKind>
154 : public internal::generic_xpr_base<IndexedView<XprType, RowIndices, ColIndices> >::type
155{
156public:
158};
159
160namespace internal {
161
162
163template<typename ArgType, typename RowIndices, typename ColIndices>
164struct unary_evaluator<IndexedView<ArgType, RowIndices, ColIndices>, IndexBased>
165 : evaluator_base<IndexedView<ArgType, RowIndices, ColIndices> >
166{
168
169 enum {
170 CoeffReadCost = evaluator<ArgType>::CoeffReadCost /* TODO + cost of row/col index */,
171
173
175
176 Flags = (evaluator<ArgType>::Flags & (HereditaryBits & ~RowMajorBit /*| LinearAccessBit | DirectAccessBit*/)) | FlagsLinearAccessBit | FlagsRowMajorBit,
177
178 Alignment = 0
179 };
180
181 EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_xpr(xpr)
182 {
183 EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
184 }
185
186 typedef typename XprType::Scalar Scalar;
187 typedef typename XprType::CoeffReturnType CoeffReturnType;
188
191 {
192 return m_argImpl.coeff(m_xpr.rowIndices()[row], m_xpr.colIndices()[col]);
193 }
194
197 {
198 return m_argImpl.coeffRef(m_xpr.rowIndices()[row], m_xpr.colIndices()[col]);
199 }
200
203 {
205 Index row = XprType::RowsAtCompileTime == 1 ? 0 : index;
206 Index col = XprType::RowsAtCompileTime == 1 ? index : 0;
207 return m_argImpl.coeffRef( m_xpr.rowIndices()[row], m_xpr.colIndices()[col]);
208 }
209
211 const Scalar& coeffRef(Index index) const
212 {
213 Index row = XprType::RowsAtCompileTime == 1 ? 0 : index;
214 Index col = XprType::RowsAtCompileTime == 1 ? index : 0;
215 return m_argImpl.coeffRef( m_xpr.rowIndices()[row], m_xpr.colIndices()[col]);
216 }
217
219 const CoeffReturnType coeff(Index index) const
220 {
221 Index row = XprType::RowsAtCompileTime == 1 ? 0 : index;
222 Index col = XprType::RowsAtCompileTime == 1 ? index : 0;
223 return m_argImpl.coeff( m_xpr.rowIndices()[row], m_xpr.colIndices()[col]);
224 }
225
226protected:
227
230
231};
232
233} // end namespace internal
234
235} // end namespace Eigen
236
237#endif // EIGEN_INDEXED_VIEW_H
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ColXpr col(Index i)
This is the const version of col().
Definition: BlockMethods.h:1097
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE RowXpr row(Index i)
This is the const version of row(). *‍/.
Definition: BlockMethods.h:1118
#define EIGEN_GENERIC_PUBLIC_INTERFACE(Derived)
Just a side note.
Definition: Macros.h:1274
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:986
#define EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Derived)
Definition: Macros.h:1241
#define EIGEN_STRONG_INLINE
Definition: Macros.h:927
#define EIGEN_STATIC_ASSERT_LVALUE(Derived)
Definition: StaticAssert.h:202
#define EIGEN_INTERNAL_CHECK_COST_VALUE(C)
Definition: StaticAssert.h:218
Expression of a fixed-size or dynamic-size block.
Definition: Block.h:105
Expression of a non-sequential sub-matrix defined by arbitrary sequences of row and column indices.
Definition: IndexedView.h:110
const RowIndices & rowIndices() const
Definition: IndexedView.h:139
RowIndices m_rowIndices
Definition: IndexedView.h:146
IndexedViewImpl< XprType, RowIndices, ColIndices, typenameinternal::traits< XprType >::StorageKind >::Base Base
Definition: IndexedView.h:112
const ColIndices & colIndices() const
Definition: IndexedView.h:142
Index cols() const
Definition: IndexedView.h:128
internal::remove_reference< XprType >::type & nestedExpression()
Definition: IndexedView.h:136
internal::remove_all< XprType >::type NestedExpression
Definition: IndexedView.h:117
ColIndices m_colIndices
Definition: IndexedView.h:147
const internal::remove_all< XprType >::type & nestedExpression() const
Definition: IndexedView.h:132
Index rows() const
Definition: IndexedView.h:125
MatrixTypeNested m_xpr
Definition: IndexedView.h:145
Definition: IndexedView.h:155
internal::generic_xpr_base< IndexedView< XprType, RowIndices, ColIndices > >::type Base
Definition: IndexedView.h:157
Definition: core.h:1240
type
Definition: core.h:575
const unsigned int LinearAccessBit
Short version: means the expression can be seen as 1D vector.
Definition: Constants.h:130
const unsigned int DirectAccessBit
Means that the underlying array of coefficients can be directly accessed as a plain strided array.
Definition: Constants.h:155
const unsigned int LvalueBit
Means the expression has a coeffRef() method, i.e.
Definition: Constants.h:144
const unsigned int RowMajorBit
for a matrix, this means that the storage order is row-major.
Definition: Constants.h:66
EIGEN_CONSTEXPR Index size(const T &x)
Definition: Meta.h:479
Namespace containing all symbols from the Eigen library.
Definition: Core:141
const int UndefinedIncr
This value means that the increment to go from one value to another in a sequence is not constant for...
Definition: Constants.h:31
const unsigned int HereditaryBits
Definition: Constants.h:195
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
const int DynamicIndex
This value means that a signed quantity (e.g., a signed index) is not known at compile-time,...
Definition: Constants.h:27
const int Dynamic
This value means that a positive quantity (e.g., a size) is not known at compile-time,...
Definition: Constants.h:22
Definition: Eigen_Colamd.h:50
Definition: IndexedViewHelper.h:141
Definition: Constants.h:542
Definition: IndexedViewHelper.h:97
Definition: Meta.h:445
Definition: Meta.h:109
Definition: CoreEvaluators.h:111
Definition: CoreEvaluators.h:91
Definition: XprHelper.h:501
Definition: IndexedViewHelper.h:75
Definition: DenseCoeffsBase.h:659
Definition: XprHelper.h:660
Definition: Meta.h:148
Definition: DenseCoeffsBase.h:671
T type
Definition: Meta.h:126
T type
Definition: Meta.h:114
Block< XprType, RowsAtCompileTime, ColsAtCompileTime, IsInnerPannel > BlockType
Definition: IndexedView.h:61
Definition: ForwardDeclarations.h:17
Definition: Meta.h:96
IndexedView< ArgType, RowIndices, ColIndices > XprType
Definition: IndexedView.h:167
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const
Definition: IndexedView.h:190
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar & coeffRef(Index index) const
Definition: IndexedView.h:211
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & coeffRef(Index index)
Definition: IndexedView.h:202
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & coeffRef(Index row, Index col)
Definition: IndexedView.h:196
EIGEN_DEVICE_FUNC unary_evaluator(const XprType &xpr)
Definition: IndexedView.h:181
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index index) const
Definition: IndexedView.h:219
Definition: CoreEvaluators.h:65