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
2011-02-12 17:43:29 +00:00
* the matrix created by evaluation of that expression .
* \ sa \ ref TopicStorageOrders */
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
*
2010-10-28 09:40:20 -04:00
* Means the expression has a coeffRef ( ) method , i . e . is writable as its individual coefficients are directly addressable .
* This rules out read - only expressions .
*
2010-12-10 02:09:58 -05:00
* Note that DirectAccessBit and LvalueBit are mutually orthogonal , as there are examples of expression having one but note
* the other :
* \ li writable expressions that don ' t have a very simple memory layout as a strided array , have LvalueBit but not DirectAccessBit
* \ li Map - to - const expressions , for example Map < const Matrix > , have DirectAccessBit but not LvalueBit
2010-10-28 09:40:20 -04:00
*
* Expressions having LvalueBit also have their coeff ( ) method returning a const reference instead of returning a new value .
2008-06-26 16:06:41 +00:00
*/
2010-10-28 09:40:20 -04:00
const unsigned int LvalueBit = 0x20 ;
2008-06-03 02:06:18 +00:00
2008-08-09 18:41:24 +00:00
/** \ingroup flags
*
2010-12-10 02:09:58 -05:00
* Means that the underlying array of coefficients can be directly accessed as a plain strided array . The memory layout
* of the array of coefficients must be exactly the natural one suggested by rows ( ) , cols ( ) ,
2010-10-28 09:40:20 -04:00
* outerStride ( ) , innerStride ( ) , and the RowMajorBit . This rules out expressions such as Diagonal , whose coefficients ,
* though referencable , do not have such a regular memory layout .
2010-12-10 02:09:58 -05:00
*
* See the comment on LvalueBit for an explanation of how LvalueBit and DirectAccessBit are mutually orthogonal .
2010-10-28 09:40:20 -04:00
*/
const unsigned int DirectAccessBit = 0x40 ;
2008-08-09 18:41:24 +00:00
2010-07-21 10:57:01 +02:00
/** \ingroup flags
*
2010-10-28 09:40:20 -04:00
* means the first coefficient packet is guaranteed to be aligned */
const unsigned int AlignedBit = 0x80 ;
2010-07-21 10:57:01 +02:00
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
2011-05-03 17:08:14 +01:00
/** \defgroup enums Enumerations
* \ ingroup Core_Module
*
* Various enumerations used in % Eigen . Many of these are used as template parameters .
*/
/** \ingroup enums
* Enum containing possible values for the \ p Mode parameter of
* MatrixBase : : selfadjointView ( ) and MatrixBase : : triangularView ( ) . */
2010-01-07 21:15:32 +01:00
enum {
2011-05-03 17:08:14 +01:00
/** View matrix as a lower triangular matrix. */
Lower = 0x1 ,
/** View matrix as an upper triangular matrix. */
Upper = 0x2 ,
/** %Matrix has ones on the diagonal; to be used in combination with #Lower or #Upper. */
UnitDiag = 0x4 ,
/** %Matrix has zeros on the diagonal; to be used in combination with #Lower or #Upper. */
ZeroDiag = 0x8 ,
/** View matrix as a lower triangular matrix with ones on the diagonal. */
UnitLower = UnitDiag | Lower ,
/** View matrix as an upper triangular matrix with ones on the diagonal. */
UnitUpper = UnitDiag | Upper ,
/** View matrix as a lower triangular matrix with zeros on the diagonal. */
StrictlyLower = ZeroDiag | Lower ,
/** View matrix as an upper triangular matrix with zeros on the diagonal. */
StrictlyUpper = ZeroDiag | Upper ,
/** Used in BandMatrix and SelfAdjointView to indicate that the matrix is self-adjoint. */
SelfAdjoint = 0x10
} ;
/** \ingroup enums
* Enum for indicating whether an object is aligned or not . */
enum {
/** Object is not correctly aligned for vectorization. */
Unaligned = 0 ,
/** Object is aligned for vectorization. */
Aligned = 1
} ;
2009-05-10 16:24:39 +00:00
2011-05-03 17:08:14 +01:00
/** \ingroup enums
* Enum used by DenseBase : : corner ( ) in Eigen2 compatibility mode . */
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
2011-05-03 17:08:14 +01:00
/** \ingroup enums
* Enum containing possible values for the \ p Direction parameter of
* Reverse , PartialReduxExpr and VectorwiseOp . */
enum DirectionType {
/** For Reverse, all columns are reversed;
* for PartialReduxExpr and VectorwiseOp , act on columns . */
Vertical ,
/** For Reverse, all rows are reversed;
* for PartialReduxExpr and VectorwiseOp , act on rows . */
Horizontal ,
/** For Reverse, both rows and columns are reversed;
* not used for PartialReduxExpr and VectorwiseOp . */
BothDirections
} ;
/** \internal \ingroup enums
* Enum to specify how to traverse the entries of a matrix . */
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
} ;
2011-05-03 17:08:14 +01:00
/** \internal \ingroup enums
* Enum to specify whether to unroll loops when traversing over the entries of a matrix . */
2008-06-23 10:32:48 +00:00
enum {
2011-05-03 17:08:14 +01:00
/** \internal Do not unroll loops. */
2008-11-30 21:49:02 +00:00
NoUnrolling ,
2011-05-03 17:08:14 +01:00
/** \internal Unroll only the inner loop, but not the outer loop. */
2008-06-23 10:32:48 +00:00
InnerUnrolling ,
2011-05-03 17:08:14 +01:00
/** \internal Unroll both the inner and the outer loop. If there is only one loop,
* because linear traversal is used , then unroll that loop . */
2008-11-30 21:49:02 +00:00
CompleteUnrolling
2008-06-23 10:32:48 +00:00
} ;
2011-05-03 17:08:14 +01:00
/** \ingroup enums
* Enum containing possible values for the \ p _Options template parameter of
* Matrix , Array and BandMatrix . */
2008-06-29 21:29:12 +00:00
enum {
2011-05-03 17:08:14 +01:00
/** Storage order is column major (see \ref TopicStorageOrders). */
2009-01-06 18:07:16 +00:00
ColMajor = 0 ,
2011-05-03 17:08:14 +01:00
/** Storage order is row major (see \ref TopicStorageOrders). */
2009-01-06 18:07:16 +00:00
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
} ;
2011-05-03 17:08:14 +01:00
/** \ingroup enums
* Enum for specifying whether to apply or solve on the left or right . */
2009-07-30 16:03:06 +02:00
enum {
2011-05-03 17:08:14 +01:00
/** Apply transformation on the left. */
OnTheLeft = 1 ,
/** Apply transformation on the right. */
OnTheRight = 2
2009-07-30 16:03:06 +02:00
} ;
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 ;
}
2011-05-03 17:08:14 +01:00
/** \internal \ingroup enums
* Used in AmbiVector . */
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
} ;
2011-05-03 17:08:14 +01:00
/** \ingroup enums
* Used as template parameter in DenseCoeffBase and MapBase to indicate
* which accessors should be provided . */
2010-07-21 10:57:01 +02:00
enum AccessorLevels {
2011-05-03 17:08:14 +01:00
/** Read-only access via a member function. */
ReadOnlyAccessors ,
/** Read/write access via member functions. */
WriteAccessors ,
/** Direct read-only access to the coefficients. */
DirectAccessors ,
/** Direct read/write access to the coefficients. */
DirectWriteAccessors
2010-07-21 10:57:01 +02:00
} ;
2011-05-03 17:08:14 +01:00
/** \ingroup enums
* Enum with options to give to various decompositions . */
2010-06-16 23:48:16 +02:00
enum DecompositionOptions {
2011-05-03 17:08:14 +01:00
/** \internal Not used (meant for LDLT?). */
Pivoting = 0x01 ,
/** \internal Not used (meant for LDLT?). */
NoPivoting = 0x02 ,
/** Used in JacobiSVD to indicate that the square matrix U is to be computed. */
ComputeFullU = 0x04 ,
/** Used in JacobiSVD to indicate that the thin matrix U is to be computed. */
ComputeThinU = 0x08 ,
/** Used in JacobiSVD to indicate that the square matrix V is to be computed. */
ComputeFullV = 0x10 ,
/** Used in JacobiSVD to indicate that the thin matrix V is to be computed. */
ComputeThinV = 0x20 ,
/** Used in SelfAdjointEigenSolver and GeneralizedSelfAdjointEigenSolver to specify
* that only the eigenvalues are to be computed and not the eigenvectors . */
EigenvaluesOnly = 0x40 ,
/** Used in SelfAdjointEigenSolver and GeneralizedSelfAdjointEigenSolver to specify
* that both the eigenvalues and the eigenvectors are to be computed . */
ComputeEigenvectors = 0x80 ,
/** \internal */
2010-06-16 23:48:16 +02:00
EigVecMask = EigenvaluesOnly | ComputeEigenvectors ,
2011-05-03 17:08:14 +01:00
/** Used in GeneralizedSelfAdjointEigenSolver to indicate that it should
* solve the generalized eigenproblem \ f $ Ax = \ lambda B x \ f $ . */
2010-06-16 23:48:16 +02:00
Ax_lBx = 0x100 ,
2011-05-03 17:08:14 +01:00
/** Used in GeneralizedSelfAdjointEigenSolver to indicate that it should
* solve the generalized eigenproblem \ f $ ABx = \ lambda x \ f $ . */
2010-06-16 23:48:16 +02:00
ABx_lx = 0x200 ,
2011-05-03 17:08:14 +01:00
/** Used in GeneralizedSelfAdjointEigenSolver to indicate that it should
* solve the generalized eigenproblem \ f $ BAx = \ lambda x \ f $ . */
2010-06-16 23:48:16 +02:00
BAx_lx = 0x400 ,
2011-05-03 17:08:14 +01:00
/** \internal */
2010-06-16 23:48:16 +02:00
GenEigMask = Ax_lBx | ABx_lx | BAx_lx
} ;
2011-05-03 17:08:14 +01:00
/** \ingroup enums
* Possible values for the \ p QRPreconditioner template parameter of JacobiSVD . */
2010-10-08 10:42:32 -04:00
enum QRPreconditioners {
2011-05-03 17:08:14 +01:00
/** Do not specify what is to be done if the SVD of a non-square matrix is asked for. */
2010-10-08 10:42:32 -04:00
NoQRPreconditioner ,
2011-05-03 17:08:14 +01:00
/** Use a QR decomposition without pivoting as the first step. */
2010-10-08 10:42:32 -04:00
HouseholderQRPreconditioner ,
2011-05-03 17:08:14 +01:00
/** Use a QR decomposition with column pivoting as the first step. */
2010-10-08 10:42:32 -04:00
ColPivHouseholderQRPreconditioner ,
2011-05-03 17:08:14 +01:00
/** Use a QR decomposition with full pivoting as the first step. */
2010-10-08 10:42:32 -04:00
FullPivHouseholderQRPreconditioner
} ;
2011-05-04 14:28:45 +01:00
# ifdef Success
# error The preprocessor symbol 'Success' is defined, possibly by the X11 header file X.h
# endif
2011-05-03 17:08:14 +01:00
/** \ingroups enums
* Enum for reporting the status of a computation . */
2010-06-12 10:12:22 +02:00
enum ComputationInfo {
2011-05-03 17:08:14 +01:00
/** Computation was successful. */
Success = 0 ,
/** The provided data did not satisfy the prerequisites. */
NumericalIssue = 1 ,
/** Iterative procedure did not converge. */
2011-07-18 13:37:41 +02:00
NoConvergence = 2 ,
/** The inputs are invalid, or the algorithm has been properly called.
* When assertions are enabled , such errors trigger an assert . */
InvalidInput = 3
2010-06-12 10:12:22 +02:00
} ;
2011-05-03 17:08:14 +01:00
/** \ingroup enums
* Enum used to specify how a particular transformation is stored in a matrix .
* \ sa Transform , Hyperplane : : transform ( ) . */
2009-03-05 10:25:22 +00:00
enum TransformTraits {
2011-05-03 17:08:14 +01:00
/** Transformation is an isometry. */
2009-03-08 11:35:30 +00:00
Isometry = 0x1 ,
2011-05-03 17:08:14 +01:00
/** Transformation is an affine transformation stored as a (Dim+1)^2 matrix whose last row is
* assumed to be [ 0 . . . 0 1 ] . */
2009-03-08 11:35:30 +00:00
Affine = 0x2 ,
2011-05-03 17:08:14 +01:00
/** Transformation is an affine transformation stored as a (Dim) x (Dim+1) matrix. */
2009-03-08 11:35:30 +00:00
AffineCompact = 0x10 | Affine ,
2011-05-03 17:08:14 +01:00
/** Transformation is a general projective transformation stored as a (Dim+1)^2 matrix. */
2009-03-08 11:35:30 +00:00
Projective = 0x20
2009-03-05 10:25:22 +00:00
} ;
2011-05-03 17:08:14 +01:00
/** \internal \ingroup enums
* Enum used to choose between implementation depending on the computer architecture . */
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
2011-05-03 17:08:14 +01:00
/** \internal \ingroup enums
* Enum used as template parameter in GeneralProduct . */
2010-02-09 11:05:39 +01:00
enum { CoeffBasedProductMode , LazyCoeffBasedProductMode , OuterProduct , InnerProduct , GemvProduct , GemmProduct } ;
2010-02-05 23:44:24 +01:00
2011-05-03 17:08:14 +01:00
/** \internal \ingroup enums
* Enum used in experimental parallel implementation . */
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