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
//
First part of a big refactoring of alignment control to enable the handling of arbitrarily aligned buffers. It includes:
- AlignedBit flag is deprecated. Alignment is now specified by the evaluator through the 'Alignment' enum, e.g., evaluator<Xpr>::Alignment. Its value is in Bytes.
- Add several enums to specify alignment: Aligned8, Aligned16, Aligned32, Aligned64, Aligned128. AlignedMax corresponds to EIGEN_MAX_ALIGN_BYTES. Such enums are used to define the above Alignment value, and as the 'Options' template parameter of Map<> and Ref<>.
- The Aligned enum is now deprecated. It is now an alias for Aligned16.
- Currently, traits<Matrix<>>, traits<Array<>>, traits<Ref<>>, traits<Map<>>, and traits<Block<>> also expose the Alignment enum.
2015-08-06 15:31:07 +02:00
// Copyright (C) 2008-2015 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>
2021-01-21 21:11:57 +00:00
// Copyright (C) 2020, Arm Limited and Contributors
2008-04-10 09:41:13 +00:00
//
2012-07-13 14:42:47 -04:00
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
2008-04-10 09:41:13 +00:00
# ifndef EIGEN_CONSTANTS_H
# define EIGEN_CONSTANTS_H
2021-09-10 19:12:26 +00:00
# include "../InternalHeaderCheck.h"
2012-04-15 11:06:28 +01:00
namespace Eigen {
2012-07-10 23:04:17 +02:00
/** This value means that a positive quantity (e.g., a size) is not known at compile-time, and that instead the value is
2008-11-30 21:49:02 +00:00
* 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
2012-07-10 23:04:17 +02:00
/** This value means that a signed quantity (e.g., a signed index) is not known at compile-time, and that instead its value
* has to be specified at runtime .
*/
const int DynamicIndex = 0xffffff ;
2017-01-06 15:54:55 +01:00
/** This value means that the increment to go from one value to another in a sequence is not constant for each step.
*/
const int UndefinedIncr = 0xfffffe ;
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
2015-10-28 11:42:14 +01:00
/** This value means that the cost to evaluate an expression coefficient is either very expensive or
* cannot be known at compile time .
*
* This value has to be positive to ( 1 ) simplify cost computation , and ( 2 ) allow to distinguish between a very expensive and very very expensive expressions .
* It thus must also be large enough to make sure unrolling won ' t happen and that sub expressions will be evaluated , but not too large to avoid overflow .
*/
2015-10-28 13:39:02 +01:00
const int HugeCost = 10000 ;
2015-10-28 11:42:14 +01: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
2015-12-30 16:45:44 +01:00
* the matrix created by evaluation of that expression .
* \ sa \ blank \ 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
2014-02-20 15:25:06 +01:00
* \ deprecated
2010-02-06 17:43:32 +01:00
* means the expression should be evaluated before any assignment */
2015-12-30 16:47:49 +01:00
EIGEN_DEPRECATED
2014-02-20 15:25:06 +01:00
const unsigned int EvalBeforeAssigningBit = 0x4 ; // FIXME deprecated
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
2015-08-07 10:45:02 +02:00
/** \deprecated \ingroup flags
2010-07-21 10:57:01 +02:00
*
2013-10-28 17:44:07 +01:00
* means the first coefficient packet is guaranteed to be aligned .
2021-08-03 09:40:33 +09:00
* An expression cannot have the AlignedBit without the PacketAccessBit flag .
2013-10-28 17:44:07 +01:00
* In other words , this means we are allow to perform an aligned packet access to the first element regardless
* of the expression kind :
* \ code
* expression . packet < Aligned > ( 0 ) ;
* \ endcode
*/
2015-12-30 16:47:49 +01:00
EIGEN_DEPRECATED 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
2014-06-27 15:53:51 +02:00
/** \ingroup flags
*
* for an expression , this means that the storage order
* can be either row - major or column - major .
* The precise choice will be decided at evaluation time or when
* combined with other expressions .
2015-12-30 16:45:44 +01:00
* \ sa \ blank \ ref RowMajorBit , \ ref TopicStorageOrders */
2014-06-27 15:53:51 +02:00
const unsigned int NoPreferredStorageOrderBit = 0x200 ;
2015-02-07 22:00:46 +01:00
/** \ingroup flags
*
* Means that the underlying coefficients can be accessed through pointers to the sparse ( un ) compressed storage format ,
* that is , the expression provides :
* \ code
inline const Scalar * valuePtr ( ) const ;
inline const Index * innerIndexPtr ( ) const ;
inline const Index * outerIndexPtr ( ) const ;
inline const Index * innerNonZeroPtr ( ) const ;
\ endcode
*/
const unsigned int CompressedAccessBit = 0x400 ;
2014-06-27 15:53:51 +02:00
2008-05-14 08:20:15 +00:00
// list of flags that are inherited by default
const unsigned int HereditaryBits = RowMajorBit
2015-12-30 16:47:49 +01:00
| EvalBeforeNestingBit ;
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
2015-10-09 12:10:58 +02:00
* Enum containing possible values for the \ c Mode or \ c UpLo parameter of
* MatrixBase : : selfadjointView ( ) and MatrixBase : : triangularView ( ) , and selfadjoint solvers . */
2016-05-18 13:26:56 +02:00
enum UpLoType {
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. */
2012-02-04 14:20:56 +01:00
SelfAdjoint = 0x10 ,
/** Used to support symmetric, non-selfadjoint, complex matrices. */
Symmetric = 0x20
2011-05-03 17:08:14 +01:00
} ;
/** \ingroup enums
First part of a big refactoring of alignment control to enable the handling of arbitrarily aligned buffers. It includes:
- AlignedBit flag is deprecated. Alignment is now specified by the evaluator through the 'Alignment' enum, e.g., evaluator<Xpr>::Alignment. Its value is in Bytes.
- Add several enums to specify alignment: Aligned8, Aligned16, Aligned32, Aligned64, Aligned128. AlignedMax corresponds to EIGEN_MAX_ALIGN_BYTES. Such enums are used to define the above Alignment value, and as the 'Options' template parameter of Map<> and Ref<>.
- The Aligned enum is now deprecated. It is now an alias for Aligned16.
- Currently, traits<Matrix<>>, traits<Array<>>, traits<Ref<>>, traits<Map<>>, and traits<Block<>> also expose the Alignment enum.
2015-08-06 15:31:07 +02:00
* Enum for indicating whether a buffer is aligned or not . */
2016-05-18 13:26:56 +02:00
enum AlignmentType {
First part of a big refactoring of alignment control to enable the handling of arbitrarily aligned buffers. It includes:
- AlignedBit flag is deprecated. Alignment is now specified by the evaluator through the 'Alignment' enum, e.g., evaluator<Xpr>::Alignment. Its value is in Bytes.
- Add several enums to specify alignment: Aligned8, Aligned16, Aligned32, Aligned64, Aligned128. AlignedMax corresponds to EIGEN_MAX_ALIGN_BYTES. Such enums are used to define the above Alignment value, and as the 'Options' template parameter of Map<> and Ref<>.
- The Aligned enum is now deprecated. It is now an alias for Aligned16.
- Currently, traits<Matrix<>>, traits<Array<>>, traits<Ref<>>, traits<Map<>>, and traits<Block<>> also expose the Alignment enum.
2015-08-06 15:31:07 +02:00
Unaligned = 0 , /**< Data pointer has no specific alignment. */
Aligned8 = 8 , /**< Data pointer is aligned on a 8 bytes boundary. */
Aligned16 = 16 , /**< Data pointer is aligned on a 16 bytes boundary. */
Aligned32 = 32 , /**< Data pointer is aligned on a 32 bytes boundary. */
Aligned64 = 64 , /**< Data pointer is aligned on a 64 bytes boundary. */
Aligned128 = 128 , /**< Data pointer is aligned on a 128 bytes boundary. */
AlignedMask = 255 ,
Aligned = 16 , /**< \deprecated Synonym for Aligned16. */
# if EIGEN_MAX_ALIGN_BYTES==128
AlignedMax = Aligned128
# elif EIGEN_MAX_ALIGN_BYTES==64
AlignedMax = Aligned64
# elif EIGEN_MAX_ALIGN_BYTES==32
AlignedMax = Aligned32
# elif EIGEN_MAX_ALIGN_BYTES==16
AlignedMax = Aligned16
# elif EIGEN_MAX_ALIGN_BYTES==8
AlignedMax = Aligned8
# elif EIGEN_MAX_ALIGN_BYTES==0
AlignedMax = Unaligned
# else
# error Invalid value for EIGEN_MAX_ALIGN_BYTES
# endif
2011-05-03 17:08:14 +01:00
} ;
2009-05-10 16:24:39 +00: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 . */
2016-05-18 13:26:56 +02:00
enum TraversalType {
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*/
2012-06-29 13:32:12 +01:00
InvalidTraversal ,
/** \internal Evaluate all entries at once */
AllAtOnceTraversal
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 . */
2016-05-18 13:26:56 +02:00
enum UnrollingType {
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-08-18 10:19:25 +02:00
/** \internal \ingroup enums
* Enum to specify whether to use the default ( built - in ) implementation or the specialization . */
2016-05-18 13:26:56 +02:00
enum SpecializedType {
2011-08-18 10:19:25 +02:00
Specialized ,
BuiltIn
} ;
2011-05-03 17:08:14 +01:00
/** \ingroup enums
2021-08-04 22:41:52 +00:00
* Enum containing possible values for the \ p Options_ template parameter of
2011-05-03 17:08:14 +01:00
* Matrix , Array and BandMatrix . */
2016-05-06 11:31:56 +02:00
enum StorageOptions {
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
2012-12-24 13:33:22 +01:00
/** Align the matrix itself if it is vectorizable fixed-size */
2009-03-26 16:30:54 +00:00
AutoAlign = 0 ,
2012-12-24 13:33:22 +01:00
/** 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
2015-03-30 14:55:54 -07: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 . */
2016-05-18 13:26:56 +02:00
enum SideType {
2011-05-03 17:08:14 +01:00
/** Apply transformation on the left. */
2020-10-07 19:05:18 +00:00
OnTheLeft = 1 ,
2011-05-03 17:08:14 +01:00
/** Apply transformation on the right. */
2020-10-07 19:05:18 +00:00
OnTheRight = 2
2009-07-30 16:03:06 +02:00
} ;
2020-10-07 19:05:18 +00:00
/** \ingroup enums
* Enum for specifying NaN - propagation behavior , e . g . for coeff - wise min / max . */
enum NaNPropagationOptions {
/** Implementation defined behavior if NaNs are present. */
PropagateFast = 0 ,
/** Always propagate NaNs. */
PropagateNaN ,
/** Always propagate not-NaNs. */
PropagateNumbers
} ;
2017-02-21 13:49:09 +01:00
2012-04-29 15:37:44 +01:00
/* the following used to be written as:
*
* struct NoChange_t { } ;
* namespace {
* EIGEN_UNUSED NoChange_t NoChange ;
* }
*
* on the ground that it feels dangerous to disambiguate overloaded functions on enum / integer types .
* However , this leads to " variable declared but never referenced " warnings on Intel Composer XE ,
* and we do not know how to get rid of them ( bug 450 ) .
2009-06-25 03:33:47 +02:00
*/
2009-06-24 22:07:03 +02:00
2012-04-29 15:37:44 +01:00
enum NoChange_t { NoChange } ;
enum Sequential_t { Sequential } ;
enum Default_t { Default } ;
2009-10-18 00:47:40 -04:00
2011-05-03 17:08:14 +01:00
/** \internal \ingroup enums
* Used in AmbiVector . */
2016-05-18 13:26:56 +02:00
enum AmbiVectorMode {
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-12-08 14:22:06 +00:00
/** \ingroup enums
2011-05-03 17:08:14 +01:00
* 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 ,
2011-12-08 14:22:06 +00:00
/** The inputs are invalid, or the algorithm has been improperly called.
2011-07-18 13:37:41 +02:00
* 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 ,
2014-08-29 20:03:49 +00:00
VSX = 0x3 ,
NEON = 0x4 ,
2018-07-06 16:04:30 -07:00
MSA = 0x5 ,
2021-01-21 21:11:57 +00:00
SVE = 0x6 ,
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
2014-08-29 20:03:49 +00:00
# elif defined EIGEN_VECTORIZE_VSX
Target = VSX
# elif defined EIGEN_VECTORIZE_NEON
Target = NEON
2021-01-21 21:11:57 +00:00
# elif defined EIGEN_VECTORIZE_SVE
Target = SVE
2018-07-06 16:04:30 -07:00
# elif defined EIGEN_VECTORIZE_MSA
Target = MSA
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
2016-05-06 11:31:56 +02:00
* Enum used as template parameter in Product and product evaluators . */
2016-05-18 13:26:56 +02:00
enum ProductImplType
2016-05-06 11:31:56 +02:00
{ DefaultProduct = 0 , LazyProduct , AliasFreeProduct , 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 { } ;
2014-12-05 12:49:30 +01:00
/** The type used to identify a general sparse storage. */
struct Sparse { } ;
2016-05-06 11:31:56 +02:00
/** The type used to identify a general solver (factored) storage. */
2015-12-01 14:38:47 +01:00
struct SolverStorage { } ;
2014-07-30 15:22:50 +02:00
/** The type used to identify a permutation storage. */
struct PermutationStorage { } ;
2015-06-19 14:10:44 +02:00
/** The type used to identify a permutation storage. */
struct TranspositionsStorage { } ;
2010-04-16 10:13:32 -04:00
/** The type used to identify a matrix expression */
struct MatrixXpr { } ;
/** The type used to identify an array expression */
struct ArrayXpr { } ;
2013-12-02 14:05:34 +01:00
// An evaluator must define its shape. By default, it can be one of the following:
2014-07-22 11:35:56 +02:00
struct DenseShape { static std : : string debugName ( ) { return " DenseShape " ; } } ;
2015-12-01 14:38:47 +01:00
struct SolverShape { static std : : string debugName ( ) { return " SolverShape " ; } } ;
2014-07-31 14:54:54 +02:00
struct HomogeneousShape { static std : : string debugName ( ) { return " HomogeneousShape " ; } } ;
2014-07-22 11:35:56 +02:00
struct DiagonalShape { static std : : string debugName ( ) { return " DiagonalShape " ; } } ;
struct BandShape { static std : : string debugName ( ) { return " BandShape " ; } } ;
struct TriangularShape { static std : : string debugName ( ) { return " TriangularShape " ; } } ;
struct SelfAdjointShape { static std : : string debugName ( ) { return " SelfAdjointShape " ; } } ;
struct PermutationShape { static std : : string debugName ( ) { return " PermutationShape " ; } } ;
2015-06-19 11:50:24 +02:00
struct TranspositionsShape { static std : : string debugName ( ) { return " TranspositionsShape " ; } } ;
2014-07-22 11:35:56 +02:00
struct SparseShape { static std : : string debugName ( ) { return " SparseShape " ; } } ;
2013-12-02 14:05:34 +01:00
2014-09-29 13:36:57 +02:00
namespace internal {
// random access iterators based on coeff*() accessors.
struct IndexBased { } ;
// evaluator based on iterators to access coefficients.
struct IteratorBased { } ;
2015-05-07 17:28:40 +02:00
/** \internal
* Constants for comparison functors
*/
enum ComparisonName {
cmp_EQ = 0 ,
cmp_LT = 1 ,
cmp_LE = 2 ,
cmp_UNORD = 3 ,
2015-11-06 09:18:43 -08:00
cmp_NEQ = 4 ,
cmp_GT = 5 ,
cmp_GE = 6
2015-05-07 17:28:40 +02:00
} ;
2014-09-29 13:36:57 +02:00
} // end namespace internal
2012-04-15 11:06:28 +01:00
} // end namespace Eigen
2008-04-10 09:41:13 +00:00
# endif // EIGEN_CONSTANTS_H