common.h (4672B)
1 // This file is part of Eigen, a lightweight C++ template library 2 // for linear algebra. 3 // 4 // Copyright (C) 2009-2015 Gael Guennebaud <gael.guennebaud@inria.fr> 5 // 6 // This Source Code Form is subject to the terms of the Mozilla 7 // Public License v. 2.0. If a copy of the MPL was not distributed 8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9 10 #ifndef EIGEN_BLAS_COMMON_H 11 #define EIGEN_BLAS_COMMON_H 12 13 #ifdef __GNUC__ 14 # if __GNUC__<5 15 // GCC < 5.0 does not like the global Scalar typedef 16 // we just keep shadow-warnings disabled permanently 17 # define EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS 18 # endif 19 #endif 20 21 #include "../Eigen/Core" 22 #include "../Eigen/Jacobi" 23 24 #include <complex> 25 26 #ifndef SCALAR 27 #error the token SCALAR must be defined to compile this file 28 #endif 29 30 #include "../Eigen/src/misc/blas.h" 31 32 #define NOTR 0 33 #define TR 1 34 #define ADJ 2 35 36 #define LEFT 0 37 #define RIGHT 1 38 39 #define UP 0 40 #define LO 1 41 42 #define NUNIT 0 43 #define UNIT 1 44 45 #define INVALID 0xff 46 47 #define OP(X) ( ((X)=='N' || (X)=='n') ? NOTR \ 48 : ((X)=='T' || (X)=='t') ? TR \ 49 : ((X)=='C' || (X)=='c') ? ADJ \ 50 : INVALID) 51 52 #define SIDE(X) ( ((X)=='L' || (X)=='l') ? LEFT \ 53 : ((X)=='R' || (X)=='r') ? RIGHT \ 54 : INVALID) 55 56 #define UPLO(X) ( ((X)=='U' || (X)=='u') ? UP \ 57 : ((X)=='L' || (X)=='l') ? LO \ 58 : INVALID) 59 60 #define DIAG(X) ( ((X)=='N' || (X)=='n') ? NUNIT \ 61 : ((X)=='U' || (X)=='u') ? UNIT \ 62 : INVALID) 63 64 65 inline bool check_op(const char* op) 66 { 67 return OP(*op)!=0xff; 68 } 69 70 inline bool check_side(const char* side) 71 { 72 return SIDE(*side)!=0xff; 73 } 74 75 inline bool check_uplo(const char* uplo) 76 { 77 return UPLO(*uplo)!=0xff; 78 } 79 80 81 namespace Eigen { 82 #include "BandTriangularSolver.h" 83 #include "GeneralRank1Update.h" 84 #include "PackedSelfadjointProduct.h" 85 #include "PackedTriangularMatrixVector.h" 86 #include "PackedTriangularSolverVector.h" 87 #include "Rank2Update.h" 88 } 89 90 using namespace Eigen; 91 92 typedef SCALAR Scalar; 93 typedef NumTraits<Scalar>::Real RealScalar; 94 typedef std::complex<RealScalar> Complex; 95 96 enum 97 { 98 IsComplex = Eigen::NumTraits<SCALAR>::IsComplex, 99 Conj = IsComplex 100 }; 101 102 typedef Matrix<Scalar,Dynamic,Dynamic,ColMajor> PlainMatrixType; 103 typedef Map<Matrix<Scalar,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> > MatrixType; 104 typedef Map<const Matrix<Scalar,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> > ConstMatrixType; 105 typedef Map<Matrix<Scalar,Dynamic,1>, 0, InnerStride<Dynamic> > StridedVectorType; 106 typedef Map<Matrix<Scalar,Dynamic,1> > CompactVectorType; 107 108 template<typename T> 109 Map<Matrix<T,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> > 110 matrix(T* data, int rows, int cols, int stride) 111 { 112 return Map<Matrix<T,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> >(data, rows, cols, OuterStride<>(stride)); 113 } 114 115 template<typename T> 116 Map<const Matrix<T,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> > 117 matrix(const T* data, int rows, int cols, int stride) 118 { 119 return Map<const Matrix<T,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> >(data, rows, cols, OuterStride<>(stride)); 120 } 121 122 template<typename T> 123 Map<Matrix<T,Dynamic,1>, 0, InnerStride<Dynamic> > make_vector(T* data, int size, int incr) 124 { 125 return Map<Matrix<T,Dynamic,1>, 0, InnerStride<Dynamic> >(data, size, InnerStride<Dynamic>(incr)); 126 } 127 128 template<typename T> 129 Map<const Matrix<T,Dynamic,1>, 0, InnerStride<Dynamic> > make_vector(const T* data, int size, int incr) 130 { 131 return Map<const Matrix<T,Dynamic,1>, 0, InnerStride<Dynamic> >(data, size, InnerStride<Dynamic>(incr)); 132 } 133 134 template<typename T> 135 Map<Matrix<T,Dynamic,1> > make_vector(T* data, int size) 136 { 137 return Map<Matrix<T,Dynamic,1> >(data, size); 138 } 139 140 template<typename T> 141 Map<const Matrix<T,Dynamic,1> > make_vector(const T* data, int size) 142 { 143 return Map<const Matrix<T,Dynamic,1> >(data, size); 144 } 145 146 template<typename T> 147 T* get_compact_vector(T* x, int n, int incx) 148 { 149 if(incx==1) 150 return x; 151 152 typename Eigen::internal::remove_const<T>::type* ret = new Scalar[n]; 153 if(incx<0) make_vector(ret,n) = make_vector(x,n,-incx).reverse(); 154 else make_vector(ret,n) = make_vector(x,n, incx); 155 return ret; 156 } 157 158 template<typename T> 159 T* copy_back(T* x_cpy, T* x, int n, int incx) 160 { 161 if(x_cpy==x) 162 return 0; 163 164 if(incx<0) make_vector(x,n,-incx).reverse() = make_vector(x_cpy,n); 165 else make_vector(x,n, incx) = make_vector(x_cpy,n); 166 return x_cpy; 167 } 168 169 #ifndef EIGEN_BLAS_FUNC_SUFFIX 170 #define EIGEN_BLAS_FUNC_SUFFIX _ 171 #endif 172 173 #define EIGEN_BLAS_FUNC(X) EIGEN_CAT(SCALAR_SUFFIX, EIGEN_CAT(X, EIGEN_BLAS_FUNC_SUFFIX)) 174 175 #endif // EIGEN_BLAS_COMMON_H