Eigen libary for mbed

Committer:
ykuroda
Date:
Thu Oct 13 04:07:23 2016 +0000
Revision:
0:13a5d365ba16
First commint, Eigne Matrix Class Library

Who changed what in which revision?

UserRevisionLine numberNew 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