Eigen libary for mbed
src/Core/BooleanRedux.h@1:3b8049da21b8, 2019-09-24 (annotated)
- Committer:
- jsoh91
- Date:
- Tue Sep 24 00:18:23 2019 +0000
- Revision:
- 1:3b8049da21b8
- Parent:
- 0:13a5d365ba16
ignore and revise some of error parts
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ykuroda | 0:13a5d365ba16 | 1 | // This file is part of Eigen, a lightweight C++ template library |
ykuroda | 0:13a5d365ba16 | 2 | // for linear algebra. |
ykuroda | 0:13a5d365ba16 | 3 | // |
ykuroda | 0:13a5d365ba16 | 4 | // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr> |
ykuroda | 0:13a5d365ba16 | 5 | // |
ykuroda | 0:13a5d365ba16 | 6 | // This Source Code Form is subject to the terms of the Mozilla |
ykuroda | 0:13a5d365ba16 | 7 | // Public License v. 2.0. If a copy of the MPL was not distributed |
ykuroda | 0:13a5d365ba16 | 8 | // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. |
ykuroda | 0:13a5d365ba16 | 9 | |
ykuroda | 0:13a5d365ba16 | 10 | #ifndef EIGEN_ALLANDANY_H |
ykuroda | 0:13a5d365ba16 | 11 | #define EIGEN_ALLANDANY_H |
ykuroda | 0:13a5d365ba16 | 12 | |
ykuroda | 0:13a5d365ba16 | 13 | namespace Eigen { |
ykuroda | 0:13a5d365ba16 | 14 | |
ykuroda | 0:13a5d365ba16 | 15 | namespace internal { |
ykuroda | 0:13a5d365ba16 | 16 | |
ykuroda | 0:13a5d365ba16 | 17 | template<typename Derived, int UnrollCount> |
ykuroda | 0:13a5d365ba16 | 18 | struct all_unroller |
ykuroda | 0:13a5d365ba16 | 19 | { |
ykuroda | 0:13a5d365ba16 | 20 | enum { |
ykuroda | 0:13a5d365ba16 | 21 | col = (UnrollCount-1) / Derived::RowsAtCompileTime, |
ykuroda | 0:13a5d365ba16 | 22 | row = (UnrollCount-1) % Derived::RowsAtCompileTime |
ykuroda | 0:13a5d365ba16 | 23 | }; |
ykuroda | 0:13a5d365ba16 | 24 | |
ykuroda | 0:13a5d365ba16 | 25 | static inline bool run(const Derived &mat) |
ykuroda | 0:13a5d365ba16 | 26 | { |
ykuroda | 0:13a5d365ba16 | 27 | return all_unroller<Derived, UnrollCount-1>::run(mat) && mat.coeff(row, col); |
ykuroda | 0:13a5d365ba16 | 28 | } |
ykuroda | 0:13a5d365ba16 | 29 | }; |
ykuroda | 0:13a5d365ba16 | 30 | |
ykuroda | 0:13a5d365ba16 | 31 | template<typename Derived> |
ykuroda | 0:13a5d365ba16 | 32 | struct all_unroller<Derived, 0> |
ykuroda | 0:13a5d365ba16 | 33 | { |
ykuroda | 0:13a5d365ba16 | 34 | static inline bool run(const Derived &/*mat*/) { return true; } |
ykuroda | 0:13a5d365ba16 | 35 | }; |
ykuroda | 0:13a5d365ba16 | 36 | |
ykuroda | 0:13a5d365ba16 | 37 | template<typename Derived> |
ykuroda | 0:13a5d365ba16 | 38 | struct all_unroller<Derived, Dynamic> |
ykuroda | 0:13a5d365ba16 | 39 | { |
ykuroda | 0:13a5d365ba16 | 40 | static inline bool run(const Derived &) { return false; } |
ykuroda | 0:13a5d365ba16 | 41 | }; |
ykuroda | 0:13a5d365ba16 | 42 | |
ykuroda | 0:13a5d365ba16 | 43 | template<typename Derived, int UnrollCount> |
ykuroda | 0:13a5d365ba16 | 44 | struct any_unroller |
ykuroda | 0:13a5d365ba16 | 45 | { |
ykuroda | 0:13a5d365ba16 | 46 | enum { |
ykuroda | 0:13a5d365ba16 | 47 | col = (UnrollCount-1) / Derived::RowsAtCompileTime, |
ykuroda | 0:13a5d365ba16 | 48 | row = (UnrollCount-1) % Derived::RowsAtCompileTime |
ykuroda | 0:13a5d365ba16 | 49 | }; |
ykuroda | 0:13a5d365ba16 | 50 | |
ykuroda | 0:13a5d365ba16 | 51 | static inline bool run(const Derived &mat) |
ykuroda | 0:13a5d365ba16 | 52 | { |
ykuroda | 0:13a5d365ba16 | 53 | return any_unroller<Derived, UnrollCount-1>::run(mat) || mat.coeff(row, col); |
ykuroda | 0:13a5d365ba16 | 54 | } |
ykuroda | 0:13a5d365ba16 | 55 | }; |
ykuroda | 0:13a5d365ba16 | 56 | |
ykuroda | 0:13a5d365ba16 | 57 | template<typename Derived> |
ykuroda | 0:13a5d365ba16 | 58 | struct any_unroller<Derived, 0> |
ykuroda | 0:13a5d365ba16 | 59 | { |
ykuroda | 0:13a5d365ba16 | 60 | static inline bool run(const Derived & /*mat*/) { return false; } |
ykuroda | 0:13a5d365ba16 | 61 | }; |
ykuroda | 0:13a5d365ba16 | 62 | |
ykuroda | 0:13a5d365ba16 | 63 | template<typename Derived> |
ykuroda | 0:13a5d365ba16 | 64 | struct any_unroller<Derived, Dynamic> |
ykuroda | 0:13a5d365ba16 | 65 | { |
ykuroda | 0:13a5d365ba16 | 66 | static inline bool run(const Derived &) { return false; } |
ykuroda | 0:13a5d365ba16 | 67 | }; |
ykuroda | 0:13a5d365ba16 | 68 | |
ykuroda | 0:13a5d365ba16 | 69 | } // end namespace internal |
ykuroda | 0:13a5d365ba16 | 70 | |
ykuroda | 0:13a5d365ba16 | 71 | /** \returns true if all coefficients are true |
ykuroda | 0:13a5d365ba16 | 72 | * |
ykuroda | 0:13a5d365ba16 | 73 | * Example: \include MatrixBase_all.cpp |
ykuroda | 0:13a5d365ba16 | 74 | * Output: \verbinclude MatrixBase_all.out |
ykuroda | 0:13a5d365ba16 | 75 | * |
ykuroda | 0:13a5d365ba16 | 76 | * \sa any(), Cwise::operator<() |
ykuroda | 0:13a5d365ba16 | 77 | */ |
ykuroda | 0:13a5d365ba16 | 78 | template<typename Derived> |
ykuroda | 0:13a5d365ba16 | 79 | inline bool DenseBase<Derived>::all() const |
ykuroda | 0:13a5d365ba16 | 80 | { |
ykuroda | 0:13a5d365ba16 | 81 | enum { |
ykuroda | 0:13a5d365ba16 | 82 | unroll = SizeAtCompileTime != Dynamic |
ykuroda | 0:13a5d365ba16 | 83 | && CoeffReadCost != Dynamic |
ykuroda | 0:13a5d365ba16 | 84 | && NumTraits<Scalar>::AddCost != Dynamic |
ykuroda | 0:13a5d365ba16 | 85 | && SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost) <= EIGEN_UNROLLING_LIMIT |
ykuroda | 0:13a5d365ba16 | 86 | }; |
ykuroda | 0:13a5d365ba16 | 87 | if(unroll) |
ykuroda | 0:13a5d365ba16 | 88 | return internal::all_unroller<Derived, unroll ? int(SizeAtCompileTime) : Dynamic>::run(derived()); |
ykuroda | 0:13a5d365ba16 | 89 | else |
ykuroda | 0:13a5d365ba16 | 90 | { |
ykuroda | 0:13a5d365ba16 | 91 | for(Index j = 0; j < cols(); ++j) |
ykuroda | 0:13a5d365ba16 | 92 | for(Index i = 0; i < rows(); ++i) |
ykuroda | 0:13a5d365ba16 | 93 | if (!coeff(i, j)) return false; |
ykuroda | 0:13a5d365ba16 | 94 | return true; |
ykuroda | 0:13a5d365ba16 | 95 | } |
ykuroda | 0:13a5d365ba16 | 96 | } |
ykuroda | 0:13a5d365ba16 | 97 | |
ykuroda | 0:13a5d365ba16 | 98 | /** \returns true if at least one coefficient is true |
ykuroda | 0:13a5d365ba16 | 99 | * |
ykuroda | 0:13a5d365ba16 | 100 | * \sa all() |
ykuroda | 0:13a5d365ba16 | 101 | */ |
ykuroda | 0:13a5d365ba16 | 102 | template<typename Derived> |
ykuroda | 0:13a5d365ba16 | 103 | inline bool DenseBase<Derived>::any() const |
ykuroda | 0:13a5d365ba16 | 104 | { |
ykuroda | 0:13a5d365ba16 | 105 | enum { |
ykuroda | 0:13a5d365ba16 | 106 | unroll = SizeAtCompileTime != Dynamic |
ykuroda | 0:13a5d365ba16 | 107 | && CoeffReadCost != Dynamic |
ykuroda | 0:13a5d365ba16 | 108 | && NumTraits<Scalar>::AddCost != Dynamic |
ykuroda | 0:13a5d365ba16 | 109 | && SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost) <= EIGEN_UNROLLING_LIMIT |
ykuroda | 0:13a5d365ba16 | 110 | }; |
ykuroda | 0:13a5d365ba16 | 111 | if(unroll) |
ykuroda | 0:13a5d365ba16 | 112 | return internal::any_unroller<Derived, unroll ? int(SizeAtCompileTime) : Dynamic>::run(derived()); |
ykuroda | 0:13a5d365ba16 | 113 | else |
ykuroda | 0:13a5d365ba16 | 114 | { |
ykuroda | 0:13a5d365ba16 | 115 | for(Index j = 0; j < cols(); ++j) |
ykuroda | 0:13a5d365ba16 | 116 | for(Index i = 0; i < rows(); ++i) |
ykuroda | 0:13a5d365ba16 | 117 | if (coeff(i, j)) return true; |
ykuroda | 0:13a5d365ba16 | 118 | return false; |
ykuroda | 0:13a5d365ba16 | 119 | } |
ykuroda | 0:13a5d365ba16 | 120 | } |
ykuroda | 0:13a5d365ba16 | 121 | |
ykuroda | 0:13a5d365ba16 | 122 | /** \returns the number of coefficients which evaluate to true |
ykuroda | 0:13a5d365ba16 | 123 | * |
ykuroda | 0:13a5d365ba16 | 124 | * \sa all(), any() |
ykuroda | 0:13a5d365ba16 | 125 | */ |
ykuroda | 0:13a5d365ba16 | 126 | template<typename Derived> |
ykuroda | 0:13a5d365ba16 | 127 | inline typename DenseBase<Derived>::Index DenseBase<Derived>::count() const |
ykuroda | 0:13a5d365ba16 | 128 | { |
ykuroda | 0:13a5d365ba16 | 129 | return derived().template cast<bool>().template cast<Index>().sum(); |
ykuroda | 0:13a5d365ba16 | 130 | } |
ykuroda | 0:13a5d365ba16 | 131 | |
ykuroda | 0:13a5d365ba16 | 132 | /** \returns true is \c *this contains at least one Not A Number (NaN). |
ykuroda | 0:13a5d365ba16 | 133 | * |
ykuroda | 0:13a5d365ba16 | 134 | * \sa allFinite() |
ykuroda | 0:13a5d365ba16 | 135 | */ |
ykuroda | 0:13a5d365ba16 | 136 | template<typename Derived> |
ykuroda | 0:13a5d365ba16 | 137 | inline bool DenseBase<Derived>::hasNaN() const |
ykuroda | 0:13a5d365ba16 | 138 | { |
ykuroda | 0:13a5d365ba16 | 139 | return !((derived().array()==derived().array()).all()); |
ykuroda | 0:13a5d365ba16 | 140 | } |
ykuroda | 0:13a5d365ba16 | 141 | |
ykuroda | 0:13a5d365ba16 | 142 | /** \returns true if \c *this contains only finite numbers, i.e., no NaN and no +/-INF values. |
ykuroda | 0:13a5d365ba16 | 143 | * |
ykuroda | 0:13a5d365ba16 | 144 | * \sa hasNaN() |
ykuroda | 0:13a5d365ba16 | 145 | */ |
ykuroda | 0:13a5d365ba16 | 146 | template<typename Derived> |
ykuroda | 0:13a5d365ba16 | 147 | inline bool DenseBase<Derived>::allFinite() const |
ykuroda | 0:13a5d365ba16 | 148 | { |
ykuroda | 0:13a5d365ba16 | 149 | return !((derived()-derived()).hasNaN()); |
ykuroda | 0:13a5d365ba16 | 150 | } |
ykuroda | 0:13a5d365ba16 | 151 | |
ykuroda | 0:13a5d365ba16 | 152 | } // end namespace Eigen |
ykuroda | 0:13a5d365ba16 | 153 | |
ykuroda | 0:13a5d365ba16 | 154 | #endif // EIGEN_ALLANDANY_H |