2008-04-10 09:41:13 +00:00
// This file is part of Eigen, a lightweight C++ template library
2009-05-22 20:25:33 +02:00
// for linear algebra.
2008-04-10 09:41:13 +00:00
//
2010-06-24 23:21:58 +02:00
// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>
2009-08-14 15:49:14 -04:00
// Copyright (C) 2007-2009 Benoit Jacob <jacob.benoit.1@gmail.com>
2008-04-10 09:41:13 +00:00
//
// Eigen is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 3 of the License, or (at your option) any later version.
//
// Alternatively, you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License and a copy of the GNU General Public License along with
// Eigen. If not, see <http://www.gnu.org/licenses/>.
# ifndef EIGEN_CONSTANTS_H
# define EIGEN_CONSTANTS_H
2008-11-30 21:49:02 +00:00
/** This value means that a quantity is not known at compile-time, and that instead the value is
* stored in some runtime variable .
*
2009-08-14 15:49:14 -04:00
* Changing the value of Dynamic breaks the ABI , as Dynamic is often used as a template parameter for Matrix .
2008-11-30 21:49:02 +00:00
*/
2010-06-11 07:56:50 -04:00
const int Dynamic = - 1 ;
2008-11-30 21:49:02 +00:00
/** This value means +Infinity; it is currently used only as the p parameter to MatrixBase::lpNorm<int>().
* The value Infinity there means the L - infinity norm .
*/
2008-11-03 22:47:00 +00:00
const int Infinity = - 1 ;
2008-04-10 09:41:13 +00:00
2010-07-06 13:10:08 +01:00
/** \defgroup flags Flags
2008-08-26 19:12:23 +00:00
* \ ingroup Core_Module
2008-06-03 02:06:18 +00:00
*
* These are the possible bits which can be OR ' ed to constitute the flags of a matrix or
* expression .
*
2008-09-15 15:45:41 +00:00
* It is important to note that these flags are a purely compile - time notion . They are a compile - time property of
* an expression type , implemented as enum ' s . They are not stored in memory at runtime , and they do not incur any
* runtime overhead .
*
2008-06-03 02:06:18 +00:00
* \ sa MatrixBase : : Flags
*/
/** \ingroup flags
*
* for a matrix , this means that the storage order is row - major .
* If this bit is not set , the storage order is column - major .
* For an expression , this determines the storage order of
* the matrix created by evaluation of that expression . */
2008-04-10 09:41:13 +00:00
const unsigned int RowMajorBit = 0x1 ;
2008-06-03 02:06:18 +00:00
/** \ingroup flags
*
* means the expression should be evaluated by the calling expression */
const unsigned int EvalBeforeNestingBit = 0x2 ;
/** \ingroup flags
*
2010-02-06 17:43:32 +01:00
* means the expression should be evaluated before any assignment */
2009-08-16 00:14:05 +02:00
const unsigned int EvalBeforeAssigningBit = 0x4 ;
2008-06-03 02:06:18 +00:00
/** \ingroup flags
*
2008-06-26 16:06:41 +00:00
* Short version : means the expression might be vectorized
*
* Long version : means that the coefficients can be handled by packets
* and start at a memory location whose alignment meets the requirements
* of the present CPU architecture for optimized packet access . In the fixed - size
2010-02-26 20:12:51 -05:00
* case , there is the additional condition that it be possible to access all the
* coefficients by packets ( this implies the requirement that the size be a multiple of 16 bytes ,
* and that any nontrivial strides don ' t break the alignment ) . In the dynamic - size case ,
* there is no such condition on the total size and strides , so it might not be possible to access
* all coeffs by packets .
2008-06-26 16:06:41 +00:00
*
2008-07-04 12:43:55 +00:00
* \ note This bit can be set regardless of whether vectorization is actually enabled .
* To check for actual vectorizability , see \ a ActualPacketAccessBit .
2008-06-26 16:06:41 +00:00
*/
const unsigned int PacketAccessBit = 0x8 ;
2008-07-04 12:43:55 +00:00
# ifdef EIGEN_VECTORIZE
/** \ingroup flags
*
* If vectorization is enabled ( EIGEN_VECTORIZE is defined ) this constant
* is set to the value \ a PacketAccessBit .
*
* If vectorization is not enabled ( EIGEN_VECTORIZE is not defined ) this constant
* is set to the value 0.
*/
const unsigned int ActualPacketAccessBit = PacketAccessBit ;
2008-04-10 09:41:13 +00:00
# else
2008-07-04 12:43:55 +00:00
const unsigned int ActualPacketAccessBit = 0x0 ;
2008-04-10 09:41:13 +00:00
# endif
2008-06-03 02:06:18 +00:00
/** \ingroup flags
*
2008-06-26 16:06:41 +00:00
* Short version : means the expression can be seen as 1 D vector .
*
* Long version : means that one can access the coefficients
* of this expression by coeff ( int ) , and coeffRef ( int ) in the case of a lvalue expression . These
* index - based access methods are guaranteed
* to not have to do any runtime computation of a ( row , col ) - pair from the index , so that it
* is guaranteed that whenever it is available , index - based access is at least as fast as
* ( row , col ) - based access . Expressions for which that isn ' t possible don ' t have the LinearAccessBit .
*
* If both PacketAccessBit and LinearAccessBit are set , then the
* packets of this expression can be accessed by packet ( int ) , and writePacket ( int ) in the case of a
* lvalue expression .
*
* Typically , all vector expressions have the LinearAccessBit , but there is one exception :
* Product expressions don ' t have it , because it would be troublesome for vectorization , even when the
* Product is a vector expression . Thus , vector Product expressions allow index - based coefficient access but
* not index - based packet access , so they don ' t have the LinearAccessBit .
*/
const unsigned int LinearAccessBit = 0x10 ;
/** \ingroup flags
*
* Means that the underlying array of coefficients can be directly accessed . This means two things .
* First , references to the coefficients must be available through coeffRef ( int , int ) . This rules out read - only
* expressions whose coefficients are computed on demand by coeff ( int , int ) . Second , the memory layout of the
2010-02-25 21:01:52 -05:00
* array of coefficients must be exactly the natural one suggested by rows ( ) , cols ( ) , outerStride ( ) , innerStride ( ) , and the RowMajorBit .
2009-05-10 16:24:39 +00:00
* This rules out expressions such as Diagonal , whose coefficients , though referencable , do not have
2008-06-26 16:06:41 +00:00
* such a regular memory layout .
*/
const unsigned int DirectAccessBit = 0x20 ;
2008-06-03 02:06:18 +00:00
2008-08-09 18:41:24 +00:00
/** \ingroup flags
*
* means the first coefficient packet is guaranteed to be aligned */
const unsigned int AlignedBit = 0x40 ;
2010-07-21 10:57:01 +02:00
/** \ingroup flags
*
* Means the expression is writable . Note that DirectAccessBit implies LvalueBit .
* Internaly , it is mainly used to enable the writable coeff accessors , and makes
* the read - only coeff accessors to return by const reference .
*/
const unsigned int LvalueBit = 0x80 ;
2010-04-16 10:13:32 -04:00
const unsigned int NestByRefBit = 0x100 ;
2008-06-03 02:06:18 +00:00
2008-05-14 08:20:15 +00:00
// list of flags that are inherited by default
const unsigned int HereditaryBits = RowMajorBit
| EvalBeforeNestingBit
2009-11-17 16:04:19 +01:00
| EvalBeforeAssigningBit ;
2008-04-10 09:41:13 +00:00
2010-01-07 21:15:32 +01:00
// Possible values for the Mode parameter of triangularView()
enum {
Lower = 0x1 , Upper = 0x2 , UnitDiag = 0x4 , ZeroDiag = 0x8 ,
UnitLower = UnitDiag | Lower , UnitUpper = UnitDiag | Upper ,
StrictlyLower = ZeroDiag | Lower , StrictlyUpper = ZeroDiag | Upper ,
SelfAdjoint = 0x10 } ;
2009-05-10 16:24:39 +00:00
2009-10-23 14:26:14 +02:00
enum { Unaligned = 0 , Aligned = 1 } ;
2008-04-10 09:41:13 +00:00
enum { ConditionalJumpCost = 5 } ;
2010-04-22 14:11:18 -04:00
// FIXME after the corner() API change, this was not needed anymore, except by AlignedBox
// TODO: find out what to do with that. Adapt the AlignedBox API ?
2008-04-10 09:41:13 +00:00
enum CornerType { TopLeft , TopRight , BottomLeft , BottomRight } ;
2010-04-22 14:11:18 -04:00
2009-02-06 09:01:50 +00:00
enum DirectionType { Vertical , Horizontal , BothDirections } ;
2009-11-18 14:52:52 +01:00
enum ProductEvaluationMode { NormalProduct , CacheFriendlyProduct } ;
2008-04-10 09:41:13 +00:00
2008-06-23 10:32:48 +00:00
enum {
2009-11-18 11:57:07 -05:00
/** \internal Default traversal, no vectorization, no index-based access */
DefaultTraversal ,
/** \internal No vectorization, use index-based access to have only one for loop instead of 2 nested loops */
LinearTraversal ,
2008-08-28 21:44:56 +00:00
/** \internal Equivalent to a slice vectorization for fixed-size matrices having good alignment
2008-08-09 18:41:24 +00:00
* and good size */
2009-11-18 11:57:07 -05:00
InnerVectorizedTraversal ,
2008-08-09 18:41:24 +00:00
/** \internal Vectorization path using a single loop plus scalar loops for the
* unaligned boundaries */
2009-11-18 11:57:07 -05:00
LinearVectorizedTraversal ,
2008-08-09 18:41:24 +00:00
/** \internal Generic vectorization path using one vectorized loop per row/column with some
* scalar loops to handle the unaligned boundaries */
2010-07-19 23:31:08 +02:00
SliceVectorizedTraversal ,
/** \internal Special case to properly handle incompatible scalar types or other defecting cases*/
InvalidTraversal
2008-06-23 10:32:48 +00:00
} ;
enum {
2008-11-30 21:49:02 +00:00
NoUnrolling ,
2008-06-23 10:32:48 +00:00
InnerUnrolling ,
2008-11-30 21:49:02 +00:00
CompleteUnrolling
2008-06-23 10:32:48 +00:00
} ;
2008-06-29 21:29:12 +00:00
enum {
2009-01-06 18:07:16 +00:00
ColMajor = 0 ,
RowMajor = 0x1 , // it is only a coincidence that this is equal to RowMajorBit -- don't rely on that
/** \internal Align the matrix itself if it is vectorizable fixed-size */
2009-03-26 16:30:54 +00:00
AutoAlign = 0 ,
2009-12-14 17:26:24 -05:00
/** \internal Don't require alignment for the matrix itself (the array of coefficients, if dynamically allocated, may still be requested to be aligned) */ // FIXME --- clarify the situation
2009-03-26 16:30:54 +00:00
DontAlign = 0x2
2008-06-29 21:29:12 +00:00
} ;
2009-07-30 16:03:06 +02:00
enum {
OnTheLeft = 1 ,
OnTheRight = 2
} ;
2009-06-25 03:33:47 +02:00
/* the following could as well be written:
* enum NoChange_t { NoChange } ;
* but it feels dangerous to disambiguate overloaded functions on enum / integer types .
* If on some platform it is really impossible to get rid of " unused variable " warnings , then
* we can always come back to that solution .
*/
struct NoChange_t { } ;
namespace {
EIGEN_UNUSED NoChange_t NoChange ;
}
2009-06-24 22:07:03 +02:00
2010-01-26 19:42:17 +01:00
struct Sequential_t { } ;
namespace {
EIGEN_UNUSED Sequential_t Sequential ;
}
2009-10-18 00:47:40 -04:00
struct Default_t { } ;
namespace {
EIGEN_UNUSED Default_t Default ;
}
2008-07-12 22:59:34 +00:00
enum {
2008-09-02 19:55:26 +00:00
IsDense = 0 ,
2010-04-23 11:36:22 -04:00
IsSparse
2008-07-12 22:59:34 +00:00
} ;
2010-07-21 10:57:01 +02:00
enum AccessorLevels {
ReadOnlyAccessors , WriteAccessors , DirectAccessors
} ;
2010-06-16 23:48:16 +02:00
enum DecompositionOptions {
Pivoting = 0x01 , // LDLT,
NoPivoting = 0x02 , // LDLT,
ComputeU = 0x10 , // SVD,
2010-10-08 10:42:32 -04:00
ComputeV = 0x20 , // SVD,
2010-06-16 23:48:16 +02:00
EigenvaluesOnly = 0x40 , // all eigen solvers
ComputeEigenvectors = 0x80 , // all eigen solvers
EigVecMask = EigenvaluesOnly | ComputeEigenvectors ,
Ax_lBx = 0x100 ,
ABx_lx = 0x200 ,
BAx_lx = 0x400 ,
GenEigMask = Ax_lBx | ABx_lx | BAx_lx
} ;
2010-10-08 10:42:32 -04:00
enum QRPreconditioners {
NoQRPreconditioner ,
HouseholderQRPreconditioner ,
ColPivHouseholderQRPreconditioner ,
FullPivHouseholderQRPreconditioner
} ;
2010-06-12 10:12:22 +02:00
/** \brief Enum for reporting the status of a computation.
*/
enum ComputationInfo {
Success = 0 , /**< \brief Computation was successful. */
NumericalIssue = 1 , /**< \brief The provided data did not satisfy the prerequisites. */
NoConvergence = 2 /**< \brief Iterative procedure did not converge. */
} ;
2009-03-05 10:25:22 +00:00
enum TransformTraits {
2009-03-08 11:35:30 +00:00
Isometry = 0x1 ,
Affine = 0x2 ,
AffineCompact = 0x10 | Affine ,
Projective = 0x20
2009-03-05 10:25:22 +00:00
} ;
2009-12-14 17:26:24 -05:00
namespace Architecture
{
enum Type {
Generic = 0x0 ,
SSE = 0x1 ,
AltiVec = 0x2 ,
2009-03-07 13:52:44 +00:00
# if defined EIGEN_VECTORIZE_SSE
2009-12-14 17:26:24 -05:00
Target = SSE
2009-03-07 13:52:44 +00:00
# elif defined EIGEN_VECTORIZE_ALTIVEC
2009-12-14 17:26:24 -05:00
Target = AltiVec
2009-03-07 13:52:44 +00:00
# else
2009-12-14 17:26:24 -05:00
Target = Generic
2009-03-07 13:52:44 +00:00
# endif
2009-12-14 17:26:24 -05:00
} ;
}
2009-03-07 13:52:44 +00:00
2010-02-09 11:05:39 +01:00
enum { CoeffBasedProductMode , LazyCoeffBasedProductMode , OuterProduct , InnerProduct , GemvProduct , GemmProduct } ;
2010-02-05 23:44:24 +01:00
2010-06-07 16:35:25 +02:00
enum Action { GetAction , SetAction } ;
2010-04-16 10:13:32 -04:00
/** The type used to identify a dense storage. */
struct Dense { } ;
/** The type used to identify a matrix expression */
struct MatrixXpr { } ;
/** The type used to identify an array expression */
struct ArrayXpr { } ;
2008-04-10 09:41:13 +00:00
# endif // EIGEN_CONSTANTS_H