WPILibC++ 2023.4.3-108-ge5452e3
BooleanRedux.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 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_ALLANDANY_H
11#define EIGEN_ALLANDANY_H
12
13namespace Eigen {
14
15namespace internal {
16
17template<typename Derived, int UnrollCount, int Rows>
19{
20 enum {
21 col = (UnrollCount-1) / Rows,
22 row = (UnrollCount-1) % Rows
23 };
24
25 EIGEN_DEVICE_FUNC static inline bool run(const Derived &mat)
26 {
28 }
29};
30
31template<typename Derived, int Rows>
32struct all_unroller<Derived, 0, Rows>
33{
34 EIGEN_DEVICE_FUNC static inline bool run(const Derived &/*mat*/) { return true; }
35};
36
37template<typename Derived, int Rows>
38struct all_unroller<Derived, Dynamic, Rows>
39{
40 EIGEN_DEVICE_FUNC static inline bool run(const Derived &) { return false; }
41};
42
43template<typename Derived, int UnrollCount, int Rows>
45{
46 enum {
47 col = (UnrollCount-1) / Rows,
48 row = (UnrollCount-1) % Rows
49 };
50
51 EIGEN_DEVICE_FUNC static inline bool run(const Derived &mat)
52 {
54 }
55};
56
57template<typename Derived, int Rows>
58struct any_unroller<Derived, 0, Rows>
59{
60 EIGEN_DEVICE_FUNC static inline bool run(const Derived & /*mat*/) { return false; }
61};
62
63template<typename Derived, int Rows>
64struct any_unroller<Derived, Dynamic, Rows>
65{
66 EIGEN_DEVICE_FUNC static inline bool run(const Derived &) { return false; }
67};
68
69} // end namespace internal
70
71/** \returns true if all coefficients are true
72 *
73 * Example: \include MatrixBase_all.cpp
74 * Output: \verbinclude MatrixBase_all.out
75 *
76 * \sa any(), Cwise::operator<()
77 */
78template<typename Derived>
80{
81 typedef internal::evaluator<Derived> Evaluator;
82 enum {
83 unroll = SizeAtCompileTime != Dynamic
84 && SizeAtCompileTime * (int(Evaluator::CoeffReadCost) + int(NumTraits<Scalar>::AddCost)) <= EIGEN_UNROLLING_LIMIT
85 };
86 Evaluator evaluator(derived());
87 if(unroll)
88 return internal::all_unroller<Evaluator, unroll ? int(SizeAtCompileTime) : Dynamic, internal::traits<Derived>::RowsAtCompileTime>::run(evaluator);
89 else
90 {
91 for(Index j = 0; j < cols(); ++j)
92 for(Index i = 0; i < rows(); ++i)
93 if (!evaluator.coeff(i, j)) return false;
94 return true;
95 }
96}
97
98/** \returns true if at least one coefficient is true
99 *
100 * \sa all()
101 */
102template<typename Derived>
104{
105 typedef internal::evaluator<Derived> Evaluator;
106 enum {
107 unroll = SizeAtCompileTime != Dynamic
108 && SizeAtCompileTime * (int(Evaluator::CoeffReadCost) + int(NumTraits<Scalar>::AddCost)) <= EIGEN_UNROLLING_LIMIT
109 };
110 Evaluator evaluator(derived());
111 if(unroll)
112 return internal::any_unroller<Evaluator, unroll ? int(SizeAtCompileTime) : Dynamic, internal::traits<Derived>::RowsAtCompileTime>::run(evaluator);
113 else
114 {
115 for(Index j = 0; j < cols(); ++j)
116 for(Index i = 0; i < rows(); ++i)
117 if (evaluator.coeff(i, j)) return true;
118 return false;
119 }
120}
121
122/** \returns the number of coefficients which evaluate to true
123 *
124 * \sa all(), any()
125 */
126template<typename Derived>
128{
129 return derived().template cast<bool>().template cast<Index>().sum();
130}
131
132/** \returns true is \c *this contains at least one Not A Number (NaN).
133 *
134 * \sa allFinite()
135 */
136template<typename Derived>
137inline bool DenseBase<Derived>::hasNaN() const
138{
139#if EIGEN_COMP_MSVC || (defined __FAST_MATH__)
140 return derived().array().isNaN().any();
141#else
142 return !((derived().array()==derived().array()).all());
143#endif
144}
145
146/** \returns true if \c *this contains only finite numbers, i.e., no NaN and no +/-INF values.
147 *
148 * \sa hasNaN()
149 */
150template<typename Derived>
152{
153#if EIGEN_COMP_MSVC || (defined __FAST_MATH__)
154 return derived().array().isFinite().all();
155#else
156 return !((derived()-derived()).hasNaN());
157#endif
158}
159
160} // end namespace Eigen
161
162#endif // EIGEN_ALLANDANY_H
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:986
#define EIGEN_UNROLLING_LIMIT
Defines the maximal loop size to enable meta unrolling of loops.
Definition: Settings.h:24
EIGEN_DEVICE_FUNC bool all() const
Definition: BooleanRedux.h:79
EIGEN_DEVICE_FUNC Index count() const
Definition: BooleanRedux.h:127
bool hasNaN() const
Definition: BooleanRedux.h:137
EIGEN_DEVICE_FUNC bool any() const
Definition: BooleanRedux.h:103
bool allFinite() const
Definition: BooleanRedux.h:151
static const Eigen::internal::all_t all
Can be used as a parameter to DenseBase::operator()(const RowIndices&, const ColIndices&) to index al...
Definition: IndexedViewHelper.h:171
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
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
Holds information about the various numeric (i.e.
Definition: NumTraits.h:233
static EIGEN_DEVICE_FUNC bool run(const Derived &)
Definition: BooleanRedux.h:34
static EIGEN_DEVICE_FUNC bool run(const Derived &)
Definition: BooleanRedux.h:40
Definition: BooleanRedux.h:19
static EIGEN_DEVICE_FUNC bool run(const Derived &mat)
Definition: BooleanRedux.h:25
@ row
Definition: BooleanRedux.h:22
@ col
Definition: BooleanRedux.h:21
static EIGEN_DEVICE_FUNC bool run(const Derived &)
Definition: BooleanRedux.h:60
static EIGEN_DEVICE_FUNC bool run(const Derived &)
Definition: BooleanRedux.h:66
Definition: BooleanRedux.h:45
static EIGEN_DEVICE_FUNC bool run(const Derived &mat)
Definition: BooleanRedux.h:51
@ col
Definition: BooleanRedux.h:47
@ row
Definition: BooleanRedux.h:48
Definition: CoreEvaluators.h:91
Definition: ForwardDeclarations.h:17