Medial Code Documentation
Loading...
Searching...
No Matches
ArithmeticSequence.h
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_ARITHMETIC_SEQUENCE_H
11#define EIGEN_ARITHMETIC_SEQUENCE_H
12
13namespace Eigen {
14
15namespace internal {
16
17#if (!EIGEN_HAS_CXX11) || !((!EIGEN_COMP_GNUC) || EIGEN_COMP_GNUC>=48)
18template<typename T> struct aseq_negate {};
19
20template<> struct aseq_negate<Index> {
21 typedef Index type;
22};
23
24template<int N> struct aseq_negate<FixedInt<N> > {
25 typedef FixedInt<-N> type;
26};
27
28// Compilation error in the following case:
29template<> struct aseq_negate<FixedInt<DynamicIndex> > {};
30
31template<typename FirstType,typename SizeType,typename IncrType,
35 typedef Index type;
36};
37
38template<typename FirstType,typename SizeType,typename IncrType>
45
46template<typename SizeType,typename IncrType,typename EnableIf = void>
48 typedef Index type;
49};
50
51template<typename SizeType,typename IncrType>
52struct aseq_reverse_first_type_aux<SizeType,IncrType,typename internal::enable_if<bool((SizeType::value+IncrType::value)|0x1)>::type> {
53 typedef FixedInt<(SizeType::value-1)*IncrType::value> type;
54};
55
56template<typename FirstType,typename SizeType,typename IncrType>
58 typedef typename aseq_reverse_first_type_aux<SizeType,IncrType>::type Aux;
60};
61
62template<typename FirstType,typename SizeType,typename IncrType>
68#endif
69
70// Helper to cleanup the type of the increment:
71template<typename T> struct cleanup_seq_incr {
72 typedef typename cleanup_index_type<T,DynamicIndex>::type type;
73};
74
75}
76
77//--------------------------------------------------------------------------------
78// seq(first,last,incr) and seqN(first,size,incr)
79//--------------------------------------------------------------------------------
80
81template<typename FirstType=Index,typename SizeType=Index,typename IncrType=internal::FixedInt<1> >
83
84template<typename FirstType,typename SizeType,typename IncrType>
88seqN(FirstType first, SizeType size, IncrType incr);
89
109template<typename FirstType,typename SizeType,typename IncrType>
111{
112public:
113 ArithmeticSequence(FirstType first, SizeType size) : m_first(first), m_size(size) {}
114 ArithmeticSequence(FirstType first, SizeType size, IncrType incr) : m_first(first), m_size(size), m_incr(incr) {}
115
116 enum {
119 };
120
122 Index size() const { return m_size; }
123
125 Index first() const { return m_first; }
126
128 Index operator[](Index i) const { return m_first + i * m_incr; }
129
130 const FirstType& firstObject() const { return m_first; }
131 const SizeType& sizeObject() const { return m_size; }
132 const IncrType& incrObject() const { return m_incr; }
133
134protected:
135 FirstType m_first;
136 SizeType m_size;
137 IncrType m_incr;
138
139public:
140
141#if EIGEN_HAS_CXX11 && ((!EIGEN_COMP_GNUC) || EIGEN_COMP_GNUC>=48)
142 auto reverse() const -> decltype(Eigen::seqN(m_first+(m_size+fix<-1>())*m_incr,m_size,-m_incr)) {
143 return seqN(m_first+(m_size+fix<-1>())*m_incr,m_size,-m_incr);
144 }
145#else
146protected:
147 typedef typename internal::aseq_negate<IncrType>::type ReverseIncrType;
148 typedef typename internal::aseq_reverse_first_type<FirstType,SizeType,IncrType>::type ReverseFirstType;
149public:
150 ArithmeticSequence<ReverseFirstType,SizeType,ReverseIncrType>
151 reverse() const {
152 return seqN(m_first+(m_size+fix<-1>())*m_incr,m_size,-m_incr);
153 }
154#endif
155};
156
160template<typename FirstType,typename SizeType,typename IncrType>
161ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,typename internal::cleanup_index_type<SizeType>::type,typename internal::cleanup_seq_incr<IncrType>::type >
165
169template<typename FirstType,typename SizeType>
170ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,typename internal::cleanup_index_type<SizeType>::type >
174
175
176#if EIGEN_HAS_CXX11
177
187template<typename FirstType,typename LastType>
188auto seq(FirstType f, LastType l) -> decltype(seqN(typename internal::cleanup_index_type<FirstType>::type(f),
189 ( typename internal::cleanup_index_type<LastType>::type(l)
190 - typename internal::cleanup_index_type<FirstType>::type(f)+fix<1>())))
191{
192 return seqN(typename internal::cleanup_index_type<FirstType>::type(f),
193 (typename internal::cleanup_index_type<LastType>::type(l)
194 -typename internal::cleanup_index_type<FirstType>::type(f)+fix<1>()));
195}
196
206template<typename FirstType,typename LastType, typename IncrType>
207auto seq(FirstType f, LastType l, IncrType incr)
208 -> decltype(seqN(typename internal::cleanup_index_type<FirstType>::type(f),
209 ( typename internal::cleanup_index_type<LastType>::type(l)
210 - typename internal::cleanup_index_type<FirstType>::type(f)+typename internal::cleanup_seq_incr<IncrType>::type(incr)
211 ) / typename internal::cleanup_seq_incr<IncrType>::type(incr),
212 typename internal::cleanup_seq_incr<IncrType>::type(incr)))
213{
214 typedef typename internal::cleanup_seq_incr<IncrType>::type CleanedIncrType;
215 return seqN(typename internal::cleanup_index_type<FirstType>::type(f),
216 ( typename internal::cleanup_index_type<LastType>::type(l)
217 -typename internal::cleanup_index_type<FirstType>::type(f)+CleanedIncrType(incr)) / CleanedIncrType(incr),
218 CleanedIncrType(incr));
219}
220
221#else // EIGEN_HAS_CXX11
222
223template<typename FirstType,typename LastType>
224typename internal::enable_if<!(symbolic::is_symbolic<FirstType>::value || symbolic::is_symbolic<LastType>::value),
225 ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,Index> >::type
226seq(FirstType f, LastType l)
227{
228 return seqN(typename internal::cleanup_index_type<FirstType>::type(f),
229 Index((typename internal::cleanup_index_type<LastType>::type(l)-typename internal::cleanup_index_type<FirstType>::type(f)+fix<1>())));
230}
231
232template<typename FirstTypeDerived,typename LastType>
233typename internal::enable_if<!symbolic::is_symbolic<LastType>::value,
234 ArithmeticSequence<FirstTypeDerived, symbolic::AddExpr<symbolic::AddExpr<symbolic::NegateExpr<FirstTypeDerived>,symbolic::ValueExpr<> >,
235 symbolic::ValueExpr<internal::FixedInt<1> > > > >::type
236seq(const symbolic::BaseExpr<FirstTypeDerived> &f, LastType l)
237{
238 return seqN(f.derived(),(typename internal::cleanup_index_type<LastType>::type(l)-f.derived()+fix<1>()));
239}
240
241template<typename FirstType,typename LastTypeDerived>
242typename internal::enable_if<!symbolic::is_symbolic<FirstType>::value,
243 ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
244 symbolic::AddExpr<symbolic::AddExpr<LastTypeDerived,symbolic::ValueExpr<> >,
245 symbolic::ValueExpr<internal::FixedInt<1> > > > >::type
246seq(FirstType f, const symbolic::BaseExpr<LastTypeDerived> &l)
247{
248 return seqN(typename internal::cleanup_index_type<FirstType>::type(f),(l.derived()-typename internal::cleanup_index_type<FirstType>::type(f)+fix<1>()));
249}
250
251template<typename FirstTypeDerived,typename LastTypeDerived>
252ArithmeticSequence<FirstTypeDerived,
253 symbolic::AddExpr<symbolic::AddExpr<LastTypeDerived,symbolic::NegateExpr<FirstTypeDerived> >,symbolic::ValueExpr<internal::FixedInt<1> > > >
254seq(const symbolic::BaseExpr<FirstTypeDerived> &f, const symbolic::BaseExpr<LastTypeDerived> &l)
255{
256 return seqN(f.derived(),(l.derived()-f.derived()+fix<1>()));
257}
258
259
260template<typename FirstType,typename LastType, typename IncrType>
261typename internal::enable_if<!(symbolic::is_symbolic<FirstType>::value || symbolic::is_symbolic<LastType>::value),
262 ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,Index,typename internal::cleanup_seq_incr<IncrType>::type> >::type
263seq(FirstType f, LastType l, IncrType incr)
264{
265 typedef typename internal::cleanup_seq_incr<IncrType>::type CleanedIncrType;
266 return seqN(typename internal::cleanup_index_type<FirstType>::type(f),
267 Index((typename internal::cleanup_index_type<LastType>::type(l)-typename internal::cleanup_index_type<FirstType>::type(f)+CleanedIncrType(incr))/CleanedIncrType(incr)), incr);
268}
269
270template<typename FirstTypeDerived,typename LastType, typename IncrType>
271typename internal::enable_if<!symbolic::is_symbolic<LastType>::value,
272 ArithmeticSequence<FirstTypeDerived,
273 symbolic::QuotientExpr<symbolic::AddExpr<symbolic::AddExpr<symbolic::NegateExpr<FirstTypeDerived>,
274 symbolic::ValueExpr<> >,
275 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
276 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
277 typename internal::cleanup_seq_incr<IncrType>::type> >::type
278seq(const symbolic::BaseExpr<FirstTypeDerived> &f, LastType l, IncrType incr)
279{
280 typedef typename internal::cleanup_seq_incr<IncrType>::type CleanedIncrType;
281 return seqN(f.derived(),(typename internal::cleanup_index_type<LastType>::type(l)-f.derived()+CleanedIncrType(incr))/CleanedIncrType(incr), incr);
282}
283
284template<typename FirstType,typename LastTypeDerived, typename IncrType>
285typename internal::enable_if<!symbolic::is_symbolic<FirstType>::value,
286 ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
287 symbolic::QuotientExpr<symbolic::AddExpr<symbolic::AddExpr<LastTypeDerived,symbolic::ValueExpr<> >,
288 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
289 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
290 typename internal::cleanup_seq_incr<IncrType>::type> >::type
291seq(FirstType f, const symbolic::BaseExpr<LastTypeDerived> &l, IncrType incr)
292{
293 typedef typename internal::cleanup_seq_incr<IncrType>::type CleanedIncrType;
294 return seqN(typename internal::cleanup_index_type<FirstType>::type(f),
295 (l.derived()-typename internal::cleanup_index_type<FirstType>::type(f)+CleanedIncrType(incr))/CleanedIncrType(incr), incr);
296}
297
298template<typename FirstTypeDerived,typename LastTypeDerived, typename IncrType>
299ArithmeticSequence<FirstTypeDerived,
300 symbolic::QuotientExpr<symbolic::AddExpr<symbolic::AddExpr<LastTypeDerived,
301 symbolic::NegateExpr<FirstTypeDerived> >,
302 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
303 symbolic::ValueExpr<typename internal::cleanup_seq_incr<IncrType>::type> >,
304 typename internal::cleanup_seq_incr<IncrType>::type>
305seq(const symbolic::BaseExpr<FirstTypeDerived> &f, const symbolic::BaseExpr<LastTypeDerived> &l, IncrType incr)
306{
307 typedef typename internal::cleanup_seq_incr<IncrType>::type CleanedIncrType;
308 return seqN(f.derived(),(l.derived()-f.derived()+CleanedIncrType(incr))/CleanedIncrType(incr), incr);
309}
310#endif // EIGEN_HAS_CXX11
311
312#if EIGEN_HAS_CXX11
321template<typename SizeType>
322auto lastN(SizeType size)
323-> decltype(seqN(Eigen::last+fix<1>()-size, size))
324{
325 return seqN(Eigen::last+fix<1>()-size, size);
326}
327
336template<typename SizeType,typename IncrType>
337auto lastN(SizeType size, IncrType incr)
338-> decltype(seqN(Eigen::last-(size-fix<1>())*incr, size, incr))
339{
340 return seqN(Eigen::last-(size-fix<1>())*incr, size, incr);
341}
342#endif
343
344namespace internal {
345
346// Convert a symbolic span into a usable one (i.e., remove last/end "keywords")
347template<typename T>
351
352template<typename FirstType,typename SizeType,typename IncrType,int XprSize>
356
357template<typename FirstType,typename SizeType,typename IncrType>
359makeIndexedViewCompatible(const ArithmeticSequence<FirstType,SizeType,IncrType>& ids, Index size,SpecializedType) {
361 eval_expr_given_size(ids.firstObject(),size),eval_expr_given_size(ids.sizeObject(),size),ids.incrObject());
362}
363
364template<typename FirstType,typename SizeType,typename IncrType>
368
369} // end namespace internal
370
392namespace indexing {
393 using Eigen::all;
394 using Eigen::seq;
395 using Eigen::seqN;
396 #if EIGEN_HAS_CXX11
397 using Eigen::lastN;
398 #endif
399 using Eigen::last;
400 using Eigen::lastp1;
401 using Eigen::fix;
402}
403
404} // end namespace Eigen
405
406#endif // EIGEN_ARITHMETIC_SEQUENCE_H
This class represents an arithmetic progression defined by its first value , its size (aka length) n...
Definition ArithmeticSequence.h:111
Index operator[](Index i) const
Definition ArithmeticSequence.h:128
Index first() const
Definition ArithmeticSequence.h:125
Index size() const
Definition ArithmeticSequence.h:122
Base class for all dense matrices, vectors, and expressions.
Definition MatrixBase.h:50
Definition IntegralConstant.h:52
Definition SymbolicIndex.h:252
Definition SymbolicIndex.h:265
Definition SymbolicIndex.h:52
Namespace containing all symbols from the Eigen library.
Definition LDLT.h:16
ArithmeticSequence< typename internal::cleanup_index_type< FirstType >::type, typename internal::cleanup_index_type< SizeType >::type, typename internal::cleanup_seq_incr< IncrType >::type > seqN(FirstType first, SizeType size, IncrType incr)
Definition ArithmeticSequence.h:162
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
Definition IndexedViewHelper.h:86
Definition ArithmeticSequence.h:18
Definition ArithmeticSequence.h:47
Definition ArithmeticSequence.h:34
Definition ArithmeticSequence.h:71
Definition Meta.h:109
Definition Meta.h:262
Definition IndexedViewHelper.h:75
Definition IntegralConstant.h:133
Definition ArithmeticSequence.h:348
Definition Meta.h:96
Definition SymbolicIndex.h:189