1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_ALLANDANY_H 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_ALLANDANY_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived, int UnrollCount> 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct all_unroller 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath col = (UnrollCount-1) / Derived::RowsAtCompileTime, 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath row = (UnrollCount-1) % Derived::RowsAtCompileTime 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static inline bool run(const Derived &mat) 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return all_unroller<Derived, UnrollCount-1>::run(mat) && mat.coeff(row, col); 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezstruct all_unroller<Derived, 0> 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez static inline bool run(const Derived &/*mat*/) { return true; } 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct all_unroller<Derived, Dynamic> 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static inline bool run(const Derived &) { return false; } 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived, int UnrollCount> 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct any_unroller 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath col = (UnrollCount-1) / Derived::RowsAtCompileTime, 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath row = (UnrollCount-1) % Derived::RowsAtCompileTime 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static inline bool run(const Derived &mat) 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return any_unroller<Derived, UnrollCount-1>::run(mat) || mat.coeff(row, col); 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezstruct any_unroller<Derived, 0> 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez static inline bool run(const Derived & /*mat*/) { return false; } 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct any_unroller<Derived, Dynamic> 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static inline bool run(const Derived &) { return false; } 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns true if all coefficients are true 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include MatrixBase_all.cpp 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude MatrixBase_all.out 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa any(), Cwise::operator<() 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool DenseBase<Derived>::all() const 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath unroll = SizeAtCompileTime != Dynamic 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && CoeffReadCost != Dynamic 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && NumTraits<Scalar>::AddCost != Dynamic 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost) <= EIGEN_UNROLLING_LIMIT 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(unroll) 887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return internal::all_unroller<Derived, unroll ? int(SizeAtCompileTime) : Dynamic>::run(derived()); 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index j = 0; j < cols(); ++j) 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index i = 0; i < rows(); ++i) 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (!coeff(i, j)) return false; 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return true; 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns true if at least one coefficient is true 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa all() 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool DenseBase<Derived>::any() const 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath unroll = SizeAtCompileTime != Dynamic 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && CoeffReadCost != Dynamic 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && NumTraits<Scalar>::AddCost != Dynamic 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost) <= EIGEN_UNROLLING_LIMIT 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(unroll) 1127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return internal::any_unroller<Derived, unroll ? int(SizeAtCompileTime) : Dynamic>::run(derived()); 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index j = 0; j < cols(); ++j) 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index i = 0; i < rows(); ++i) 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (coeff(i, j)) return true; 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return false; 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns the number of coefficients which evaluate to true 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa all(), any() 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::Index DenseBase<Derived>::count() const 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().template cast<bool>().template cast<Index>().sum(); 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 1327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez/** \returns true is \c *this contains at least one Not A Number (NaN). 1337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * 1347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * \sa allFinite() 1357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez */ 1367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename Derived> 1377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline bool DenseBase<Derived>::hasNaN() const 1387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{ 1397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return !((derived().array()==derived().array()).all()); 1407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez} 1417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 1427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez/** \returns true if \c *this contains only finite numbers, i.e., no NaN and no +/-INF values. 1437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * 1447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * \sa hasNaN() 1457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez */ 1467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename Derived> 1477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline bool DenseBase<Derived>::allFinite() const 1487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{ 1497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return !((derived()-derived()).hasNaN()); 1507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez} 1517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_ALLANDANY_H 155