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