mirror of
https://gitlab.com/libeigen/eigen.git
synced 2024-12-21 07:19:46 +08:00
a96c849c20
To get the links to work, I also had to document the Eigen namespace. Unfortunately, this means that the word Eigen is linked whenever it appears in the docs.
372 lines
12 KiB
Plaintext
372 lines
12 KiB
Plaintext
// This file is part of Eigen, a lightweight C++ template library
|
|
// for linear algebra.
|
|
//
|
|
// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
|
|
// Copyright (C) 2007-2011 Benoit Jacob <jacob.benoit.1@gmail.com>
|
|
//
|
|
// 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_CORE_H
|
|
#define EIGEN_CORE_H
|
|
|
|
// first thing Eigen does: stop the compiler from committing suicide
|
|
#include "src/Core/util/DisableStupidWarnings.h"
|
|
|
|
// then include this file where all our macros are defined. It's really important to do it first because
|
|
// it's where we do all the alignment settings (platform detection and honoring the user's will if he
|
|
// defined e.g. EIGEN_DONT_ALIGN) so it needs to be done before we do anything with vectorization.
|
|
#include "src/Core/util/Macros.h"
|
|
|
|
// if alignment is disabled, then disable vectorization. Note: EIGEN_ALIGN is the proper check, it takes into
|
|
// account both the user's will (EIGEN_DONT_ALIGN) and our own platform checks
|
|
#if !EIGEN_ALIGN
|
|
#ifndef EIGEN_DONT_VECTORIZE
|
|
#define EIGEN_DONT_VECTORIZE
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef _MSC_VER
|
|
#include <malloc.h> // for _aligned_malloc -- need it regardless of whether vectorization is enabled
|
|
#if (_MSC_VER >= 1500) // 2008 or later
|
|
// Remember that usage of defined() in a #define is undefined by the standard.
|
|
// a user reported that in 64-bit mode, MSVC doesn't care to define _M_IX86_FP.
|
|
#if (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || defined(_M_X64)
|
|
#define EIGEN_SSE2_ON_MSVC_2008_OR_LATER
|
|
#endif
|
|
#endif
|
|
#else
|
|
// Remember that usage of defined() in a #define is undefined by the standard
|
|
#if (defined __SSE2__) && ( (!defined __GNUC__) || EIGEN_GNUC_AT_LEAST(4,2) )
|
|
#define EIGEN_SSE2_ON_NON_MSVC_BUT_NOT_OLD_GCC
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef EIGEN_DONT_VECTORIZE
|
|
|
|
#if defined (EIGEN_SSE2_ON_NON_MSVC_BUT_NOT_OLD_GCC) || defined(EIGEN_SSE2_ON_MSVC_2008_OR_LATER)
|
|
|
|
// Defines symbols for compile-time detection of which instructions are
|
|
// used.
|
|
// EIGEN_VECTORIZE_YY is defined if and only if the instruction set YY is used
|
|
#define EIGEN_VECTORIZE
|
|
#define EIGEN_VECTORIZE_SSE
|
|
#define EIGEN_VECTORIZE_SSE2
|
|
|
|
// Detect sse3/ssse3/sse4:
|
|
// gcc and icc defines __SSE3__, ...
|
|
// there is no way to know about this on msvc. You can define EIGEN_VECTORIZE_SSE* if you
|
|
// want to force the use of those instructions with msvc.
|
|
#ifdef __SSE3__
|
|
#define EIGEN_VECTORIZE_SSE3
|
|
#endif
|
|
#ifdef __SSSE3__
|
|
#define EIGEN_VECTORIZE_SSSE3
|
|
#endif
|
|
#ifdef __SSE4_1__
|
|
#define EIGEN_VECTORIZE_SSE4_1
|
|
#endif
|
|
#ifdef __SSE4_2__
|
|
#define EIGEN_VECTORIZE_SSE4_2
|
|
#endif
|
|
|
|
// include files
|
|
|
|
// This extern "C" works around a MINGW-w64 compilation issue
|
|
// https://sourceforge.net/tracker/index.php?func=detail&aid=3018394&group_id=202880&atid=983354
|
|
// In essence, intrin.h is included by windows.h and also declares intrinsics (just as emmintrin.h etc. below do).
|
|
// However, intrin.h uses an extern "C" declaration, and g++ thus complains of duplicate declarations
|
|
// with conflicting linkage. The linkage for intrinsics doesn't matter, but at that stage the compiler doesn't know;
|
|
// so, to avoid compile errors when windows.h is included after Eigen/Core, ensure intrinsics are extern "C" here too.
|
|
// notice that since these are C headers, the extern "C" is theoretically needed anyways.
|
|
extern "C" {
|
|
#include <emmintrin.h>
|
|
#include <xmmintrin.h>
|
|
#ifdef EIGEN_VECTORIZE_SSE3
|
|
#include <pmmintrin.h>
|
|
#endif
|
|
#ifdef EIGEN_VECTORIZE_SSSE3
|
|
#include <tmmintrin.h>
|
|
#endif
|
|
#ifdef EIGEN_VECTORIZE_SSE4_1
|
|
#include <smmintrin.h>
|
|
#endif
|
|
#ifdef EIGEN_VECTORIZE_SSE4_2
|
|
#include <nmmintrin.h>
|
|
#endif
|
|
} // end extern "C"
|
|
#elif defined __ALTIVEC__
|
|
#define EIGEN_VECTORIZE
|
|
#define EIGEN_VECTORIZE_ALTIVEC
|
|
#include <altivec.h>
|
|
// We need to #undef all these ugly tokens defined in <altivec.h>
|
|
// => use __vector instead of vector
|
|
#undef bool
|
|
#undef vector
|
|
#undef pixel
|
|
#elif defined __ARM_NEON__
|
|
#define EIGEN_VECTORIZE
|
|
#define EIGEN_VECTORIZE_NEON
|
|
#include <arm_neon.h>
|
|
#endif
|
|
#endif
|
|
|
|
#if (defined _OPENMP) && (!defined EIGEN_DONT_PARALLELIZE)
|
|
#define EIGEN_HAS_OPENMP
|
|
#endif
|
|
|
|
#ifdef EIGEN_HAS_OPENMP
|
|
#include <omp.h>
|
|
#endif
|
|
|
|
// MSVC for windows mobile does not have the errno.h file
|
|
#if !(defined(_MSC_VER) && defined(_WIN32_WCE))
|
|
#define EIGEN_HAS_ERRNO
|
|
#endif
|
|
|
|
#ifdef EIGEN_HAS_ERRNO
|
|
#include <cerrno>
|
|
#endif
|
|
#include <cstddef>
|
|
#include <cstdlib>
|
|
#include <cmath>
|
|
#include <complex>
|
|
#include <cassert>
|
|
#include <functional>
|
|
#include <iosfwd>
|
|
#include <cstring>
|
|
#include <string>
|
|
#include <limits>
|
|
#include <climits> // for CHAR_BIT
|
|
// for min/max:
|
|
#include <algorithm>
|
|
|
|
// for outputting debug info
|
|
#ifdef EIGEN_DEBUG_ASSIGN
|
|
#include <iostream>
|
|
#endif
|
|
|
|
// required for __cpuid, needs to be included after cmath
|
|
#if defined(_MSC_VER) && (defined(_M_IX86)||defined(_M_X64))
|
|
#include <intrin.h>
|
|
#endif
|
|
|
|
#if (defined(_CPPUNWIND) || defined(__EXCEPTIONS)) && !defined(EIGEN_NO_EXCEPTIONS)
|
|
#define EIGEN_EXCEPTIONS
|
|
#endif
|
|
|
|
#ifdef EIGEN_EXCEPTIONS
|
|
#include <new>
|
|
#endif
|
|
|
|
// this needs to be done after all possible windows C header includes and before any Eigen source includes
|
|
// (system C++ includes are supposed to be able to deal with this already):
|
|
// windows.h defines min and max macros which would make Eigen fail to compile.
|
|
#if defined(min) || defined(max)
|
|
#error The preprocessor symbols 'min' or 'max' are defined. If you are compiling on Windows, do #define NOMINMAX to prevent windows.h from defining these symbols.
|
|
#endif
|
|
|
|
// defined in bits/termios.h
|
|
#undef B0
|
|
|
|
/** \brief Namespace containing all symbols from the %Eigen library. */
|
|
namespace Eigen {
|
|
|
|
inline static const char *SimdInstructionSetsInUse(void) {
|
|
#if defined(EIGEN_VECTORIZE_SSE4_2)
|
|
return "SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2";
|
|
#elif defined(EIGEN_VECTORIZE_SSE4_1)
|
|
return "SSE, SSE2, SSE3, SSSE3, SSE4.1";
|
|
#elif defined(EIGEN_VECTORIZE_SSSE3)
|
|
return "SSE, SSE2, SSE3, SSSE3";
|
|
#elif defined(EIGEN_VECTORIZE_SSE3)
|
|
return "SSE, SSE2, SSE3";
|
|
#elif defined(EIGEN_VECTORIZE_SSE2)
|
|
return "SSE, SSE2";
|
|
#elif defined(EIGEN_VECTORIZE_ALTIVEC)
|
|
return "AltiVec";
|
|
#elif defined(EIGEN_VECTORIZE_NEON)
|
|
return "ARM NEON";
|
|
#else
|
|
return "None";
|
|
#endif
|
|
}
|
|
|
|
#define STAGE10_FULL_EIGEN2_API 10
|
|
#define STAGE20_RESOLVE_API_CONFLICTS 20
|
|
#define STAGE30_FULL_EIGEN3_API 30
|
|
#define STAGE40_FULL_EIGEN3_STRICTNESS 40
|
|
#define STAGE99_NO_EIGEN2_SUPPORT 99
|
|
|
|
#if defined EIGEN2_SUPPORT_STAGE40_FULL_EIGEN3_STRICTNESS
|
|
#define EIGEN2_SUPPORT
|
|
#define EIGEN2_SUPPORT_STAGE STAGE40_FULL_EIGEN3_STRICTNESS
|
|
#elif defined EIGEN2_SUPPORT_STAGE30_FULL_EIGEN3_API
|
|
#define EIGEN2_SUPPORT
|
|
#define EIGEN2_SUPPORT_STAGE STAGE30_FULL_EIGEN3_API
|
|
#elif defined EIGEN2_SUPPORT_STAGE20_RESOLVE_API_CONFLICTS
|
|
#define EIGEN2_SUPPORT
|
|
#define EIGEN2_SUPPORT_STAGE STAGE20_RESOLVE_API_CONFLICTS
|
|
#elif defined EIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API
|
|
#define EIGEN2_SUPPORT
|
|
#define EIGEN2_SUPPORT_STAGE STAGE10_FULL_EIGEN2_API
|
|
#elif defined EIGEN2_SUPPORT
|
|
// default to stage 3, that's what it's always meant
|
|
#define EIGEN2_SUPPORT_STAGE30_FULL_EIGEN3_API
|
|
#define EIGEN2_SUPPORT_STAGE STAGE30_FULL_EIGEN3_API
|
|
#else
|
|
#define EIGEN2_SUPPORT_STAGE STAGE99_NO_EIGEN2_SUPPORT
|
|
#endif
|
|
|
|
#ifdef EIGEN2_SUPPORT
|
|
#undef minor
|
|
#endif
|
|
|
|
// we use size_t frequently and we'll never remember to prepend it with std:: everytime just to
|
|
// ensure QNX/QCC support
|
|
using std::size_t;
|
|
|
|
/** \defgroup Core_Module Core module
|
|
* This is the main module of Eigen providing dense matrix and vector support
|
|
* (both fixed and dynamic size) with all the features corresponding to a BLAS library
|
|
* and much more...
|
|
*
|
|
* \code
|
|
* #include <Eigen/Core>
|
|
* \endcode
|
|
*/
|
|
|
|
#include "src/Core/util/Constants.h"
|
|
#include "src/Core/util/ForwardDeclarations.h"
|
|
#include "src/Core/util/Meta.h"
|
|
#include "src/Core/util/XprHelper.h"
|
|
#include "src/Core/util/StaticAssert.h"
|
|
#include "src/Core/util/Memory.h"
|
|
|
|
#include "src/Core/NumTraits.h"
|
|
#include "src/Core/MathFunctions.h"
|
|
#include "src/Core/GenericPacketMath.h"
|
|
|
|
#if defined EIGEN_VECTORIZE_SSE
|
|
#include "src/Core/arch/SSE/PacketMath.h"
|
|
#include "src/Core/arch/SSE/MathFunctions.h"
|
|
#include "src/Core/arch/SSE/Complex.h"
|
|
#elif defined EIGEN_VECTORIZE_ALTIVEC
|
|
#include "src/Core/arch/AltiVec/PacketMath.h"
|
|
#include "src/Core/arch/AltiVec/Complex.h"
|
|
#elif defined EIGEN_VECTORIZE_NEON
|
|
#include "src/Core/arch/NEON/PacketMath.h"
|
|
#include "src/Core/arch/NEON/Complex.h"
|
|
#endif
|
|
|
|
#include "src/Core/arch/Default/Settings.h"
|
|
|
|
#include "src/Core/Functors.h"
|
|
#include "src/Core/DenseCoeffsBase.h"
|
|
#include "src/Core/DenseBase.h"
|
|
#include "src/Core/MatrixBase.h"
|
|
#include "src/Core/EigenBase.h"
|
|
|
|
#ifndef EIGEN_PARSED_BY_DOXYGEN // work around Doxygen bug triggered by Assign.h r814874
|
|
// at least confirmed with Doxygen 1.5.5 and 1.5.6
|
|
#include "src/Core/Assign.h"
|
|
#endif
|
|
|
|
#include "src/Core/util/BlasUtil.h"
|
|
#include "src/Core/DenseStorage.h"
|
|
#include "src/Core/NestByValue.h"
|
|
#include "src/Core/ForceAlignedAccess.h"
|
|
#include "src/Core/ReturnByValue.h"
|
|
#include "src/Core/NoAlias.h"
|
|
#include "src/Core/PlainObjectBase.h"
|
|
#include "src/Core/Matrix.h"
|
|
#include "src/Core/Array.h"
|
|
#include "src/Core/CwiseBinaryOp.h"
|
|
#include "src/Core/CwiseUnaryOp.h"
|
|
#include "src/Core/CwiseNullaryOp.h"
|
|
#include "src/Core/CwiseUnaryView.h"
|
|
#include "src/Core/SelfCwiseBinaryOp.h"
|
|
#include "src/Core/Dot.h"
|
|
#include "src/Core/StableNorm.h"
|
|
#include "src/Core/MapBase.h"
|
|
#include "src/Core/Stride.h"
|
|
#include "src/Core/Map.h"
|
|
#include "src/Core/Block.h"
|
|
#include "src/Core/VectorBlock.h"
|
|
#include "src/Core/Transpose.h"
|
|
#include "src/Core/DiagonalMatrix.h"
|
|
#include "src/Core/Diagonal.h"
|
|
#include "src/Core/DiagonalProduct.h"
|
|
#include "src/Core/PermutationMatrix.h"
|
|
#include "src/Core/Transpositions.h"
|
|
#include "src/Core/Redux.h"
|
|
#include "src/Core/Visitor.h"
|
|
#include "src/Core/Fuzzy.h"
|
|
#include "src/Core/IO.h"
|
|
#include "src/Core/Swap.h"
|
|
#include "src/Core/CommaInitializer.h"
|
|
#include "src/Core/Flagged.h"
|
|
#include "src/Core/ProductBase.h"
|
|
#include "src/Core/GeneralProduct.h"
|
|
#include "src/Core/TriangularMatrix.h"
|
|
#include "src/Core/SelfAdjointView.h"
|
|
#include "src/Core/SolveTriangular.h"
|
|
#include "src/Core/products/Parallelizer.h"
|
|
#include "src/Core/products/CoeffBasedProduct.h"
|
|
#include "src/Core/products/GeneralBlockPanelKernel.h"
|
|
#include "src/Core/products/GeneralMatrixVector.h"
|
|
#include "src/Core/products/GeneralMatrixMatrix.h"
|
|
#include "src/Core/products/GeneralMatrixMatrixTriangular.h"
|
|
#include "src/Core/products/SelfadjointMatrixVector.h"
|
|
#include "src/Core/products/SelfadjointMatrixMatrix.h"
|
|
#include "src/Core/products/SelfadjointProduct.h"
|
|
#include "src/Core/products/SelfadjointRank2Update.h"
|
|
#include "src/Core/products/TriangularMatrixVector.h"
|
|
#include "src/Core/products/TriangularMatrixMatrix.h"
|
|
#include "src/Core/products/TriangularSolverMatrix.h"
|
|
#include "src/Core/products/TriangularSolverVector.h"
|
|
#include "src/Core/BandMatrix.h"
|
|
|
|
#include "src/Core/BooleanRedux.h"
|
|
#include "src/Core/Select.h"
|
|
#include "src/Core/VectorwiseOp.h"
|
|
#include "src/Core/Random.h"
|
|
#include "src/Core/Replicate.h"
|
|
#include "src/Core/Reverse.h"
|
|
#include "src/Core/ArrayBase.h"
|
|
#include "src/Core/ArrayWrapper.h"
|
|
|
|
#ifdef EIGEN_ENABLE_EVALUATORS
|
|
#include "src/Core/Product.h"
|
|
#include "src/Core/CoreEvaluators.h"
|
|
#include "src/Core/AssignEvaluator.h"
|
|
#endif
|
|
|
|
} // namespace Eigen
|
|
|
|
#include "src/Core/GlobalFunctions.h"
|
|
|
|
#include "src/Core/util/ReenableStupidWarnings.h"
|
|
|
|
#ifdef EIGEN2_SUPPORT
|
|
#include "Eigen2Support"
|
|
#endif
|
|
|
|
#endif // EIGEN_CORE_H
|