1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1@gmail.com>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_FORWARDDECLARATIONS_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_FORWARDDECLARATIONS_H
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct traits;
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// here we say once and for all that traits<const T> == traits<T>
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// When constness must affect traits, it has to be constness on template parameters on which T itself depends.
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// For example, traits<Map<const T> > != traits<Map<T> >, but
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//              traits<const Map<T> > == traits<Map<T> >
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct traits<const T> : traits<T> {};
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> struct has_direct_access
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum { ret = (traits<Derived>::Flags & DirectAccessBit) ? 1 : 0 };
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> struct accessors_level
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum { has_direct_access = (traits<Derived>::Flags & DirectAccessBit) ? 1 : 0,
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         has_write_access = (traits<Derived>::Flags & LvalueBit) ? 1 : 0,
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         value = has_direct_access ? (has_write_access ? DirectWriteAccessors : DirectAccessors)
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                   : (has_write_access ? WriteAccessors       : ReadOnlyAccessors)
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename T> struct evaluator_traits;
402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate< typename T> struct evaluator;
422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct NumTraits;
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> struct EigenBase;
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class DenseBase;
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class PlainObjectBase;
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived,
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         int Level = internal::accessors_level<Derived>::value >
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass DenseCoeffsBase;
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Rows, int _Cols,
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         int _Options = AutoAlign |
582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#if EIGEN_GNUC_AT(3,4)
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // workaround a bug in at least gcc 3.4.6
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // the innermost ?: ternary operator is misparsed. We write it slightly
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // differently and this makes gcc 3.4.6 happy, but it's ugly.
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // The error would only show up with EIGEN_DEFAULT_TO_ROW_MAJOR is defined
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // (when EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION is RowMajor)
642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          ( (_Rows==1 && _Cols!=1) ? Eigen::RowMajor
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          : !(_Cols==1 && _Rows!=1) ?  EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION
662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          : Eigen::ColMajor ),
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          ( (_Rows==1 && _Cols!=1) ? Eigen::RowMajor
692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          : (_Cols==1 && _Rows!=1) ? Eigen::ColMajor
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         int _MaxRows = _Rows,
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         int _MaxCols = _Cols
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath> class Matrix;
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class MatrixBase;
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class ArrayBase;
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType, unsigned int Added, unsigned int Removed> class Flagged;
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType, template <typename> class StorageBase > class NoAlias;
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> class NestByValue;
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> class ForceAlignedAccess;
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> class SwapWrapper;
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename XprType, int BlockRows=Dynamic, int BlockCols=Dynamic, bool InnerPanel = false> class Block;
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, int Size=Dynamic> class VectorBlock;
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class Transpose;
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class Conjugate;
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename NullaryOp, typename MatrixType>         class CwiseNullaryOp;
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename UnaryOp,   typename MatrixType>         class CwiseUnaryOp;
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ViewOp,    typename MatrixType>         class CwiseUnaryView;
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename BinaryOp,  typename Lhs, typename Rhs>  class CwiseBinaryOp;
942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename TernaryOp, typename Arg1, typename Arg2, typename Arg3>  class CwiseTernaryOp;
952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Decomposition, typename Rhstype>        class Solve;
962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename XprType>                                class Inverse;
972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Lhs, typename Rhs, int Option = DefaultProduct> class Product;
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class DiagonalBase;
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _DiagonalVectorType> class DiagonalWrapper;
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int SizeAtCompileTime, int MaxSizeAtCompileTime=SizeAtCompileTime> class DiagonalMatrix;
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, typename DiagonalType, int ProductOrder> class DiagonalProduct;
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, int Index = 0> class Diagonal;
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int SizeAtCompileTime, int MaxSizeAtCompileTime = SizeAtCompileTime, typename IndexType=int> class PermutationMatrix;
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int SizeAtCompileTime, int MaxSizeAtCompileTime = SizeAtCompileTime, typename IndexType=int> class Transpositions;
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class PermutationBase;
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class TranspositionsBase;
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _IndicesType> class PermutationWrapper;
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _IndicesType> class TranspositionsWrapper;
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived,
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         int Level = internal::accessors_level<Derived>::has_write_access ? WriteAccessors : ReadOnlyAccessors
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath> class MapBase;
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int InnerStrideAtCompileTime, int OuterStrideAtCompileTime> class Stride;
1162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<int Value = Dynamic> class InnerStride;
1172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<int Value = Dynamic> class OuterStride;
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, int MapOptions=Unaligned, typename StrideType = Stride<0,0> > class Map;
1192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived> class RefBase;
1202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename PlainObjectType, int Options = 0,
1212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang         typename StrideType = typename internal::conditional<PlainObjectType::IsVectorAtCompileTime,InnerStride<1>,OuterStride<> >::type > class Ref;
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class TriangularBase;
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, unsigned int Mode> class TriangularView;
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, unsigned int Mode> class SelfAdjointView;
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class SparseView;
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> class WithFormat;
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> struct CommaInitializer;
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class ReturnByValue;
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> class ArrayWrapper;
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> class MatrixWrapper;
1322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived> class SolverBase;
1332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename XprType> class InnerIterator;
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DecompositionType> struct kernel_retval_base;
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DecompositionType> struct kernel_retval;
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DecompositionType> struct image_retval_base;
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DecompositionType> struct image_retval;
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int Rows=Dynamic, int Cols=Dynamic, int Supers=Dynamic, int Subs=Dynamic, int Options=0> class BandMatrix;
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Lhs, typename Rhs> struct product_type;
1482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<bool> struct EnableIf;
1502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/** \internal
1522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \class product_evaluator
1532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * Products need their own evaluator with more template arguments allowing for
1542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * easier partial template specializations.
1552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  */
1562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate< typename T,
1572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          int ProductTag = internal::product_type<typename T::Lhs,typename T::Rhs>::ret,
1582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          typename LhsShape = typename evaluator_traits<typename T::Lhs>::Shape,
1592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          typename RhsShape = typename evaluator_traits<typename T::Rhs>::Shape,
1602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          typename LhsScalar = typename traits<typename T::Lhs>::Scalar,
1612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          typename RhsScalar = typename traits<typename T::Rhs>::Scalar
1622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        > struct product_evaluator;
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Lhs, typename Rhs,
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         int ProductType = internal::product_type<Lhs,Rhs>::value>
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct ProductReturnType;
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// this is a workaround for sun CC
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Lhs, typename Rhs> struct LazyProductReturnType;
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Provides scalar/packet-wise product and product with accumulation
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with optional conjugation of the arguments.
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename LhsScalar, typename RhsScalar, bool ConjLhs=false, bool ConjRhs=false> struct conj_helper;
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_sum_op;
1792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_difference_op;
1802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_conj_product_op;
1812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_min_op;
1822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_max_op;
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_opposite_op;
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_conjugate_op;
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_real_op;
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_imag_op;
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_abs_op;
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_abs2_op;
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_sqrt_op;
1902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar> struct scalar_rsqrt_op;
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_exp_op;
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_log_op;
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_cos_op;
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_sin_op;
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_acos_op;
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_asin_op;
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_tan_op;
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_inverse_op;
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_square_op;
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_cube_op;
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, typename NewType> struct scalar_cast_op;
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_random_op;
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_constant_op;
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_identity_op;
2052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar,bool iscpx> struct scalar_sign_op;
2062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar,typename ScalarExponent> struct scalar_pow_op;
2072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_hypot_op;
208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_product_op;
2097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_quotient_op;
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// SpecialFunctions module
2122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar> struct scalar_lgamma_op;
2132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar> struct scalar_digamma_op;
2142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar> struct scalar_erf_op;
2152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar> struct scalar_erfc_op;
2162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar> struct scalar_igamma_op;
2172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar> struct scalar_igammac_op;
2182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar> struct scalar_zeta_op;
2192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar> struct scalar_betainc_op;
2202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal
222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct IOFormat;
224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Array module
226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Rows, int _Cols,
227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         int _Options = AutoAlign |
2282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#if EIGEN_GNUC_AT(3,4)
229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // workaround a bug in at least gcc 3.4.6
230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // the innermost ?: ternary operator is misparsed. We write it slightly
231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // differently and this makes gcc 3.4.6 happy, but it's ugly.
232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // The error would only show up with EIGEN_DEFAULT_TO_ROW_MAJOR is defined
233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // (when EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION is RowMajor)
2342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          ( (_Rows==1 && _Cols!=1) ? Eigen::RowMajor
235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          : !(_Cols==1 && _Rows!=1) ?  EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION
2362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          : Eigen::ColMajor ),
237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
2382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          ( (_Rows==1 && _Cols!=1) ? Eigen::RowMajor
2392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                          : (_Cols==1 && _Rows!=1) ? Eigen::ColMajor
240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),
241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         int _MaxRows = _Rows, int _MaxCols = _Cols> class Array;
243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType> class Select;
244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, typename BinaryOp, int Direction> class PartialReduxExpr;
245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType, int Direction> class VectorwiseOp;
246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType,int RowFactor,int ColFactor> class Replicate;
247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, int Direction = BothDirections> class Reverse;
248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class FullPivLU;
250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class PartialPivLU;
251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> struct inverse_impl;
253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class HouseholderQR;
255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class ColPivHouseholderQR;
256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class FullPivHouseholderQR;
2572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename MatrixType> class CompleteOrthogonalDecomposition;
258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, int QRPreconditioner = ColPivHouseholderQRPreconditioner> class JacobiSVD;
2592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename MatrixType> class BDCSVD;
260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, int UpLo = Lower> class LLT;
261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, int UpLo = Lower> class LDLT;
262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename VectorsType, typename CoeffsType, int Side=OnTheLeft> class HouseholderSequence;
263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar>     class JacobiRotation;
264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Geometry module:
266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived, int _Dim> class RotationBase;
267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Lhs, typename Rhs> class Cross;
268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class QuaternionBase;
269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> class Rotation2D;
270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> class AngleAxis;
271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar,int Dim> class Translation;
2722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar,int Dim> class AlignedBox;
273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int Options = AutoAlign> class Quaternion;
274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar,int Dim,int Mode,int _Options=AutoAlign> class Transform;
275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename _Scalar, int _AmbientDim, int Options=AutoAlign> class ParametrizedLine;
276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename _Scalar, int _AmbientDim, int Options=AutoAlign> class Hyperplane;
277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> class UniformScaling;
278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType,int Direction> class Homogeneous;
2792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Sparse module:
2812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived> class SparseMatrixBase;
282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// MatrixFunctions module
284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> struct MatrixExponentialReturnValue;
285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class MatrixFunctionReturnValue;
286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class MatrixSquareRootReturnValue;
287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class MatrixLogarithmReturnValue;
2887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename Derived> class MatrixPowerReturnValue;
2892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived> class MatrixComplexPowerReturnValue;
290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar>
293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct stem_function
294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef ComplexScalar type(ComplexScalar, int);
297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_FORWARDDECLARATIONS_H
303