0
0
mirror of https://gitlab.com/libeigen/eigen.git synced 2026-01-18 17:31:19 +01:00

Merge branch eigen:master into master

This commit is contained in:
Rasmus Munk Larsen
2025-10-10 06:04:09 +00:00
27 changed files with 1450 additions and 570 deletions

View File

@@ -63,13 +63,8 @@ option(EIGEN_LEAVE_TEST_IN_ALL_TARGET "Leaves tests in the all target, needed by
option(EIGEN_BUILD_BLAS "Toggles the building of the Eigen Blas library" ${PROJECT_IS_TOP_LEVEL})
option(EIGEN_BUILD_LAPACK "Toggles the building of the included Eigen LAPACK library" ${PROJECT_IS_TOP_LEVEL})
if (EIGEN_BUILD_BLAS OR EIGEN_BUILD_LAPACK)
# BLAS and LAPACK currently need a fortran compiler.
include(CMakeDetermineFortranCompiler)
if (NOT CMAKE_Fortran_COMPILER)
set(EIGEN_BUILD_BLAS OFF)
set(EIGEN_BUILD_LAPACK OFF)
else()
# Determine if we should build shared libraries for BLAS/LAPACK on this platform.
# Determine if we should build shared libraries for BLAS/LAPACK on this platform.
if (NOT EIGEN_BUILD_SHARED_LIBS)
get_cmake_property(EIGEN_BUILD_SHARED_LIBS TARGET_SUPPORTS_SHARED_LIBS)
endif()
endif()

View File

@@ -65,7 +65,8 @@ struct plain_array {
template <typename T, int Size, int MatrixOrArrayOptions>
struct plain_array<T, Size, MatrixOrArrayOptions, 0> {
T array[Size];
// on some 32-bit platforms, stack-allocated arrays are aligned to 4 bytes, not the preferred alignment of T
EIGEN_ALIGN_TO_BOUNDARY(alignof(T)) T array[Size];
#if defined(EIGEN_NO_DEBUG) || defined(EIGEN_TESTING_PLAINOBJECT_CTOR)
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr plain_array() = default;
#else
@@ -73,12 +74,6 @@ struct plain_array<T, Size, MatrixOrArrayOptions, 0> {
#endif
};
template <typename T, int MatrixOrArrayOptions, int Alignment>
struct plain_array<T, 0, MatrixOrArrayOptions, Alignment> {
T array[1];
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr plain_array() = default;
};
template <typename T, int Size, int Options, int Alignment>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr void swap_plain_array(plain_array<T, Size, Options, Alignment>& a,
plain_array<T, Size, Options, Alignment>& b,

View File

@@ -211,8 +211,14 @@ struct scalar_inner_product_op {
static constexpr bool PacketAccess = false;
};
// Partial specialization for packet access if and only if
// LhsScalar == RhsScalar == ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType.
template <typename Scalar, bool Conj>
struct scalar_inner_product_op<Scalar, Scalar, Conj> {
struct scalar_inner_product_op<
Scalar,
typename std::enable_if<internal::is_same<typename ScalarBinaryOpTraits<Scalar, Scalar>::ReturnType, Scalar>::value,
Scalar>::type,
Conj> {
using result_type = Scalar;
using conj_helper = conditional_conj<Scalar, Conj>;
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar coeff(const Scalar& a, const Scalar& b) const {

View File

@@ -1004,8 +1004,7 @@ struct madd_impl {
}
};
// Use FMA if there is a single CPU instruction.
#ifdef EIGEN_VECTORIZE_FMA
#if EIGEN_SCALAR_MADD_USE_FMA
template <typename Scalar>
struct madd_impl<Scalar, std::enable_if_t<has_fma<Scalar>::value>> {
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run(const Scalar& x, const Scalar& y, const Scalar& z) {
@@ -1927,7 +1926,6 @@ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar arithmetic_shift_right(const Scalar
return bit_cast<Scalar, SignedScalar>(bit_cast<SignedScalar, Scalar>(a) >> n);
}
// Otherwise, rely on template implementation.
template <typename Scalar>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar fma(const Scalar& x, const Scalar& y, const Scalar& z) {
return internal::fma_impl<Scalar>::run(x, y, z);

View File

@@ -240,8 +240,8 @@ EIGEN_STRONG_INLINE Packet4d pcast<Packet4l, Packet4d>(const Packet4l& a) {
#if defined(EIGEN_VECTORIZE_AVX512DQ) && defined(EIGEN_VECTORIZE_AVS512VL)
return _mm256_cvtepi64_pd(a);
#else
EIGEN_ALIGN16 int64_t aux[4];
pstore(aux, a);
int64_t aux[4];
pstoreu(aux, a);
return _mm256_set_pd(static_cast<double>(aux[3]), static_cast<double>(aux[2]), static_cast<double>(aux[1]),
static_cast<double>(aux[0]));
#endif

View File

@@ -1679,9 +1679,9 @@ EIGEN_STRONG_INLINE Packet16b pgather<bool, Packet16b>(const bool* from, Index s
template <>
EIGEN_STRONG_INLINE void pscatter<float, Packet4f>(float* to, const Packet4f& from, Index stride) {
to[stride * 0] = pfirst(from);
to[stride * 1] = pfirst(_mm_shuffle_ps(from, from, 1));
to[stride * 2] = pfirst(_mm_shuffle_ps(from, from, 2));
to[stride * 3] = pfirst(_mm_shuffle_ps(from, from, 3));
to[stride * 1] = pfirst(Packet4f(_mm_shuffle_ps(from, from, 1)));
to[stride * 2] = pfirst(Packet4f(_mm_shuffle_ps(from, from, 2)));
to[stride * 3] = pfirst(Packet4f(_mm_shuffle_ps(from, from, 3)));
}
template <>
EIGEN_STRONG_INLINE void pscatter<double, Packet2d>(double* to, const Packet2d& from, Index stride) {

View File

@@ -52,6 +52,26 @@
#define EIGEN_STACK_ALLOCATION_LIMIT 131072
#endif
/* Specify whether to use std::fma for scalar multiply-add instructions.
*
* On machines that have FMA as a single instruction, this will generally
* improve precision without significant performance implications.
*
* Without a single instruction, performance has been found to be reduced 2-3x
* on Intel CPUs, and up to 30x for WASM.
*
* If unspecified, defaults to using FMA if hardware support is available.
* The default should be used in most cases to ensure consistency between
* vectorized and non-vectorized paths.
*/
#ifndef EIGEN_SCALAR_MADD_USE_FMA
#ifdef EIGEN_VECTORIZE_FMA
#define EIGEN_SCALAR_MADD_USE_FMA 1
#else
#define EIGEN_SCALAR_MADD_USE_FMA 0
#endif
#endif
//------------------------------------------------------------------------------------------
// Compiler identification, EIGEN_COMP_*
//------------------------------------------------------------------------------------------

View File

@@ -325,6 +325,22 @@ class SelfAdjointEigenSolver {
return m_eivec * m_eivalues.cwiseSqrt().asDiagonal() * m_eivec.adjoint();
}
/** \brief Computes the matrix exponential the matrix.
*
* \returns the matrix exponential the matrix.
*
* \pre The eigenvalues and eigenvectors of a positive-definite matrix
* have been computed before.
*
* \sa operatorInverseSqrt(), operatorSqrt(),
* <a href="unsupported/group__MatrixFunctions__Module.html">MatrixFunctions Module</a>
*/
EIGEN_DEVICE_FUNC MatrixType operatorExp() const {
eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
return m_eivec * m_eivalues.array().exp().matrix().asDiagonal() * m_eivec.adjoint();
}
/** \brief Computes the inverse square root of the matrix.
*
* \returns the inverse positive-definite square root of the matrix

View File

@@ -571,6 +571,11 @@ class JacobiSVD : public SVDBase<JacobiSVD<MatrixType_, Options_> > {
compute_impl(matrix, internal::get_computation_options(Options));
}
template <typename Derived>
explicit JacobiSVD(const TriangularBase<Derived>& matrix) {
compute_impl(matrix, internal::get_computation_options(Options));
}
/** \brief Constructor performing the decomposition of given matrix using specified options
* for computing unitaries.
*
@@ -601,6 +606,11 @@ class JacobiSVD : public SVDBase<JacobiSVD<MatrixType_, Options_> > {
return compute_impl(matrix, m_computationOptions);
}
template <typename Derived>
JacobiSVD& compute(const TriangularBase<Derived>& matrix) {
return compute_impl(matrix, m_computationOptions);
}
/** \brief Method performing the decomposition of given matrix, as specified by
* the `computationOptions` parameter.
*
@@ -638,6 +648,8 @@ class JacobiSVD : public SVDBase<JacobiSVD<MatrixType_, Options_> > {
}
private:
template <typename Derived>
JacobiSVD& compute_impl(const TriangularBase<Derived>& matrix, unsigned int computationOptions);
template <typename Derived>
JacobiSVD& compute_impl(const MatrixBase<Derived>& matrix, unsigned int computationOptions);
@@ -676,6 +688,13 @@ class JacobiSVD : public SVDBase<JacobiSVD<MatrixType_, Options_> > {
WorkMatrixType m_workMatrix;
};
template <typename MatrixType, int Options>
template <typename Derived>
JacobiSVD<MatrixType, Options>& JacobiSVD<MatrixType, Options>::compute_impl(const TriangularBase<Derived>& matrix,
unsigned int computationOptions) {
return compute_impl(matrix.toDenseMatrix(), computationOptions);
}
template <typename MatrixType, int Options>
template <typename Derived>
JacobiSVD<MatrixType, Options>& JacobiSVD<MatrixType, Options>::compute_impl(const MatrixBase<Derived>& matrix,

View File

@@ -21,6 +21,7 @@ list(APPEND EIGEN_BLAS_TARGETS eigen_blas_static)
if (EIGEN_BUILD_SHARED_LIBS)
add_library(eigen_blas SHARED ${EigenBlas_SRCS})
list(APPEND EIGEN_BLAS_TARGETS eigen_blas)
target_compile_definitions(eigen_blas PUBLIC "EIGEN_BUILD_DLL")
endif()
foreach(target IN LISTS EIGEN_BLAS_TARGETS)

View File

@@ -1,6 +1,18 @@
#ifndef BLAS_H
#define BLAS_H
#if defined(_WIN32)
#if defined(EIGEN_BUILD_DLL)
#define EIGEN_BLAS_API __declspec(dllexport)
#elif defined(EIGEN_LINK_DLL)
#define EIGEN_BLAS_API __declspec(dllimport)
#else
#define EIGEN_BLAS_API
#endif
#else
#define EIGEN_BLAS_API
#endif
#ifdef __cplusplus
extern "C" {
#endif
@@ -15,467 +27,508 @@ typedef long BLASLONG;
typedef unsigned long BLASULONG;
#endif
void BLASFUNC(xerbla)(const char *, int *info);
EIGEN_BLAS_API void BLASFUNC(xerbla)(const char *, int *info);
float BLASFUNC(sdot)(int *, float *, int *, float *, int *);
float BLASFUNC(sdsdot)(int *, float *, float *, int *, float *, int *);
EIGEN_BLAS_API float BLASFUNC(sdot)(int *, float *, int *, float *, int *);
EIGEN_BLAS_API float BLASFUNC(sdsdot)(int *, float *, float *, int *, float *, int *);
double BLASFUNC(dsdot)(int *, float *, int *, float *, int *);
double BLASFUNC(ddot)(int *, double *, int *, double *, int *);
double BLASFUNC(qdot)(int *, double *, int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(dsdot)(int *, float *, int *, float *, int *);
EIGEN_BLAS_API double BLASFUNC(ddot)(int *, double *, int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(qdot)(int *, double *, int *, double *, int *);
void BLASFUNC(cdotuw)(int *, float *, int *, float *, int *, float *);
void BLASFUNC(cdotcw)(int *, float *, int *, float *, int *, float *);
void BLASFUNC(zdotuw)(int *, double *, int *, double *, int *, double *);
void BLASFUNC(zdotcw)(int *, double *, int *, double *, int *, double *);
EIGEN_BLAS_API void BLASFUNC(cdotuw)(int *, float *, int *, float *, int *, float *);
EIGEN_BLAS_API void BLASFUNC(cdotcw)(int *, float *, int *, float *, int *, float *);
EIGEN_BLAS_API void BLASFUNC(zdotuw)(int *, double *, int *, double *, int *, double *);
EIGEN_BLAS_API void BLASFUNC(zdotcw)(int *, double *, int *, double *, int *, double *);
void BLASFUNC(saxpy)(const int *, const float *, const float *, const int *, float *, const int *);
void BLASFUNC(daxpy)(const int *, const double *, const double *, const int *, double *, const int *);
void BLASFUNC(qaxpy)(const int *, const double *, const double *, const int *, double *, const int *);
void BLASFUNC(caxpy)(const int *, const float *, const float *, const int *, float *, const int *);
void BLASFUNC(zaxpy)(const int *, const double *, const double *, const int *, double *, const int *);
void BLASFUNC(xaxpy)(const int *, const double *, const double *, const int *, double *, const int *);
void BLASFUNC(caxpyc)(const int *, const float *, const float *, const int *, float *, const int *);
void BLASFUNC(zaxpyc)(const int *, const double *, const double *, const int *, double *, const int *);
void BLASFUNC(xaxpyc)(const int *, const double *, const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(saxpy)(const int *, const float *, const float *, const int *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(daxpy)(const int *, const double *, const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(qaxpy)(const int *, const double *, const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(caxpy)(const int *, const float *, const float *, const int *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(zaxpy)(const int *, const double *, const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(xaxpy)(const int *, const double *, const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(caxpyc)(const int *, const float *, const float *, const int *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(zaxpyc)(const int *, const double *, const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(xaxpyc)(const int *, const double *, const double *, const int *, double *, const int *);
void BLASFUNC(scopy)(int *, float *, int *, float *, int *);
void BLASFUNC(dcopy)(int *, double *, int *, double *, int *);
void BLASFUNC(qcopy)(int *, double *, int *, double *, int *);
void BLASFUNC(ccopy)(int *, float *, int *, float *, int *);
void BLASFUNC(zcopy)(int *, double *, int *, double *, int *);
void BLASFUNC(xcopy)(int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(scopy)(int *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(dcopy)(int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(qcopy)(int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(ccopy)(int *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(zcopy)(int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xcopy)(int *, double *, int *, double *, int *);
void BLASFUNC(sswap)(int *, float *, int *, float *, int *);
void BLASFUNC(dswap)(int *, double *, int *, double *, int *);
void BLASFUNC(qswap)(int *, double *, int *, double *, int *);
void BLASFUNC(cswap)(int *, float *, int *, float *, int *);
void BLASFUNC(zswap)(int *, double *, int *, double *, int *);
void BLASFUNC(xswap)(int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(sswap)(int *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(dswap)(int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(qswap)(int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(cswap)(int *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(zswap)(int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xswap)(int *, double *, int *, double *, int *);
float BLASFUNC(sasum)(int *, float *, int *);
float BLASFUNC(scasum)(int *, float *, int *);
double BLASFUNC(dasum)(int *, double *, int *);
double BLASFUNC(qasum)(int *, double *, int *);
double BLASFUNC(dzasum)(int *, double *, int *);
double BLASFUNC(qxasum)(int *, double *, int *);
EIGEN_BLAS_API float BLASFUNC(sasum)(int *, float *, int *);
EIGEN_BLAS_API float BLASFUNC(scasum)(int *, float *, int *);
EIGEN_BLAS_API double BLASFUNC(dasum)(int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(qasum)(int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(dzasum)(int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(qxasum)(int *, double *, int *);
int BLASFUNC(isamax)(int *, float *, int *);
int BLASFUNC(idamax)(int *, double *, int *);
int BLASFUNC(iqamax)(int *, double *, int *);
int BLASFUNC(icamax)(int *, float *, int *);
int BLASFUNC(izamax)(int *, double *, int *);
int BLASFUNC(ixamax)(int *, double *, int *);
EIGEN_BLAS_API int BLASFUNC(isamax)(int *, float *, int *);
EIGEN_BLAS_API int BLASFUNC(idamax)(int *, double *, int *);
EIGEN_BLAS_API int BLASFUNC(iqamax)(int *, double *, int *);
EIGEN_BLAS_API int BLASFUNC(icamax)(int *, float *, int *);
EIGEN_BLAS_API int BLASFUNC(izamax)(int *, double *, int *);
EIGEN_BLAS_API int BLASFUNC(ixamax)(int *, double *, int *);
int BLASFUNC(ismax)(int *, float *, int *);
int BLASFUNC(idmax)(int *, double *, int *);
int BLASFUNC(iqmax)(int *, double *, int *);
int BLASFUNC(icmax)(int *, float *, int *);
int BLASFUNC(izmax)(int *, double *, int *);
int BLASFUNC(ixmax)(int *, double *, int *);
EIGEN_BLAS_API int BLASFUNC(ismax)(int *, float *, int *);
EIGEN_BLAS_API int BLASFUNC(idmax)(int *, double *, int *);
EIGEN_BLAS_API int BLASFUNC(iqmax)(int *, double *, int *);
EIGEN_BLAS_API int BLASFUNC(icmax)(int *, float *, int *);
EIGEN_BLAS_API int BLASFUNC(izmax)(int *, double *, int *);
EIGEN_BLAS_API int BLASFUNC(ixmax)(int *, double *, int *);
int BLASFUNC(isamin)(int *, float *, int *);
int BLASFUNC(idamin)(int *, double *, int *);
int BLASFUNC(iqamin)(int *, double *, int *);
int BLASFUNC(icamin)(int *, float *, int *);
int BLASFUNC(izamin)(int *, double *, int *);
int BLASFUNC(ixamin)(int *, double *, int *);
EIGEN_BLAS_API int BLASFUNC(isamin)(int *, float *, int *);
EIGEN_BLAS_API int BLASFUNC(idamin)(int *, double *, int *);
EIGEN_BLAS_API int BLASFUNC(iqamin)(int *, double *, int *);
EIGEN_BLAS_API int BLASFUNC(icamin)(int *, float *, int *);
EIGEN_BLAS_API int BLASFUNC(izamin)(int *, double *, int *);
EIGEN_BLAS_API int BLASFUNC(ixamin)(int *, double *, int *);
int BLASFUNC(ismin)(int *, float *, int *);
int BLASFUNC(idmin)(int *, double *, int *);
int BLASFUNC(iqmin)(int *, double *, int *);
int BLASFUNC(icmin)(int *, float *, int *);
int BLASFUNC(izmin)(int *, double *, int *);
int BLASFUNC(ixmin)(int *, double *, int *);
EIGEN_BLAS_API int BLASFUNC(ismin)(int *, float *, int *);
EIGEN_BLAS_API int BLASFUNC(idmin)(int *, double *, int *);
EIGEN_BLAS_API int BLASFUNC(iqmin)(int *, double *, int *);
EIGEN_BLAS_API int BLASFUNC(icmin)(int *, float *, int *);
EIGEN_BLAS_API int BLASFUNC(izmin)(int *, double *, int *);
EIGEN_BLAS_API int BLASFUNC(ixmin)(int *, double *, int *);
float BLASFUNC(samax)(int *, float *, int *);
double BLASFUNC(damax)(int *, double *, int *);
double BLASFUNC(qamax)(int *, double *, int *);
float BLASFUNC(scamax)(int *, float *, int *);
double BLASFUNC(dzamax)(int *, double *, int *);
double BLASFUNC(qxamax)(int *, double *, int *);
EIGEN_BLAS_API float BLASFUNC(samax)(int *, float *, int *);
EIGEN_BLAS_API double BLASFUNC(damax)(int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(qamax)(int *, double *, int *);
EIGEN_BLAS_API float BLASFUNC(scamax)(int *, float *, int *);
EIGEN_BLAS_API double BLASFUNC(dzamax)(int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(qxamax)(int *, double *, int *);
float BLASFUNC(samin)(int *, float *, int *);
double BLASFUNC(damin)(int *, double *, int *);
double BLASFUNC(qamin)(int *, double *, int *);
float BLASFUNC(scamin)(int *, float *, int *);
double BLASFUNC(dzamin)(int *, double *, int *);
double BLASFUNC(qxamin)(int *, double *, int *);
EIGEN_BLAS_API float BLASFUNC(samin)(int *, float *, int *);
EIGEN_BLAS_API double BLASFUNC(damin)(int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(qamin)(int *, double *, int *);
EIGEN_BLAS_API float BLASFUNC(scamin)(int *, float *, int *);
EIGEN_BLAS_API double BLASFUNC(dzamin)(int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(qxamin)(int *, double *, int *);
float BLASFUNC(smax)(int *, float *, int *);
double BLASFUNC(dmax)(int *, double *, int *);
double BLASFUNC(qmax)(int *, double *, int *);
float BLASFUNC(scmax)(int *, float *, int *);
double BLASFUNC(dzmax)(int *, double *, int *);
double BLASFUNC(qxmax)(int *, double *, int *);
EIGEN_BLAS_API float BLASFUNC(smax)(int *, float *, int *);
EIGEN_BLAS_API double BLASFUNC(dmax)(int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(qmax)(int *, double *, int *);
EIGEN_BLAS_API float BLASFUNC(scmax)(int *, float *, int *);
EIGEN_BLAS_API double BLASFUNC(dzmax)(int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(qxmax)(int *, double *, int *);
float BLASFUNC(smin)(int *, float *, int *);
double BLASFUNC(dmin)(int *, double *, int *);
double BLASFUNC(qmin)(int *, double *, int *);
float BLASFUNC(scmin)(int *, float *, int *);
double BLASFUNC(dzmin)(int *, double *, int *);
double BLASFUNC(qxmin)(int *, double *, int *);
EIGEN_BLAS_API float BLASFUNC(smin)(int *, float *, int *);
EIGEN_BLAS_API double BLASFUNC(dmin)(int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(qmin)(int *, double *, int *);
EIGEN_BLAS_API float BLASFUNC(scmin)(int *, float *, int *);
EIGEN_BLAS_API double BLASFUNC(dzmin)(int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(qxmin)(int *, double *, int *);
void BLASFUNC(sscal)(int *, float *, float *, int *);
void BLASFUNC(dscal)(int *, double *, double *, int *);
void BLASFUNC(qscal)(int *, double *, double *, int *);
void BLASFUNC(cscal)(int *, float *, float *, int *);
void BLASFUNC(zscal)(int *, double *, double *, int *);
void BLASFUNC(xscal)(int *, double *, double *, int *);
void BLASFUNC(csscal)(int *, float *, float *, int *);
void BLASFUNC(zdscal)(int *, double *, double *, int *);
void BLASFUNC(xqscal)(int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(sscal)(int *, float *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(dscal)(int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(qscal)(int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(cscal)(int *, float *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(zscal)(int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xscal)(int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(csscal)(int *, float *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(zdscal)(int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xqscal)(int *, double *, double *, int *);
float BLASFUNC(snrm2)(int *, float *, int *);
float BLASFUNC(scnrm2)(int *, float *, int *);
EIGEN_BLAS_API float BLASFUNC(snrm2)(int *, float *, int *);
EIGEN_BLAS_API float BLASFUNC(scnrm2)(int *, float *, int *);
double BLASFUNC(dnrm2)(int *, double *, int *);
double BLASFUNC(qnrm2)(int *, double *, int *);
double BLASFUNC(dznrm2)(int *, double *, int *);
double BLASFUNC(qxnrm2)(int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(dnrm2)(int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(qnrm2)(int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(dznrm2)(int *, double *, int *);
EIGEN_BLAS_API double BLASFUNC(qxnrm2)(int *, double *, int *);
void BLASFUNC(srot)(int *, float *, int *, float *, int *, float *, float *);
void BLASFUNC(drot)(int *, double *, int *, double *, int *, double *, double *);
void BLASFUNC(qrot)(int *, double *, int *, double *, int *, double *, double *);
void BLASFUNC(csrot)(int *, float *, int *, float *, int *, float *, float *);
void BLASFUNC(zdrot)(int *, double *, int *, double *, int *, double *, double *);
void BLASFUNC(xqrot)(int *, double *, int *, double *, int *, double *, double *);
EIGEN_BLAS_API void BLASFUNC(srot)(int *, float *, int *, float *, int *, float *, float *);
EIGEN_BLAS_API void BLASFUNC(drot)(int *, double *, int *, double *, int *, double *, double *);
EIGEN_BLAS_API void BLASFUNC(qrot)(int *, double *, int *, double *, int *, double *, double *);
EIGEN_BLAS_API void BLASFUNC(csrot)(int *, float *, int *, float *, int *, float *, float *);
EIGEN_BLAS_API void BLASFUNC(zdrot)(int *, double *, int *, double *, int *, double *, double *);
EIGEN_BLAS_API void BLASFUNC(xqrot)(int *, double *, int *, double *, int *, double *, double *);
void BLASFUNC(srotg)(float *, float *, float *, float *);
void BLASFUNC(drotg)(double *, double *, double *, double *);
void BLASFUNC(qrotg)(double *, double *, double *, double *);
void BLASFUNC(crotg)(float *, float *, float *, float *);
void BLASFUNC(zrotg)(double *, double *, double *, double *);
void BLASFUNC(xrotg)(double *, double *, double *, double *);
EIGEN_BLAS_API void BLASFUNC(srotg)(float *, float *, float *, float *);
EIGEN_BLAS_API void BLASFUNC(drotg)(double *, double *, double *, double *);
EIGEN_BLAS_API void BLASFUNC(qrotg)(double *, double *, double *, double *);
EIGEN_BLAS_API void BLASFUNC(crotg)(float *, float *, float *, float *);
EIGEN_BLAS_API void BLASFUNC(zrotg)(double *, double *, double *, double *);
EIGEN_BLAS_API void BLASFUNC(xrotg)(double *, double *, double *, double *);
void BLASFUNC(srotmg)(float *, float *, float *, float *, float *);
void BLASFUNC(drotmg)(double *, double *, double *, double *, double *);
EIGEN_BLAS_API void BLASFUNC(srotmg)(float *, float *, float *, float *, float *);
EIGEN_BLAS_API void BLASFUNC(drotmg)(double *, double *, double *, double *, double *);
void BLASFUNC(srotm)(int *, float *, int *, float *, int *, float *);
void BLASFUNC(drotm)(int *, double *, int *, double *, int *, double *);
void BLASFUNC(qrotm)(int *, double *, int *, double *, int *, double *);
EIGEN_BLAS_API void BLASFUNC(srotm)(int *, float *, int *, float *, int *, float *);
EIGEN_BLAS_API void BLASFUNC(drotm)(int *, double *, int *, double *, int *, double *);
EIGEN_BLAS_API void BLASFUNC(qrotm)(int *, double *, int *, double *, int *, double *);
/* Level 2 routines */
void BLASFUNC(sger)(int *, int *, float *, float *, int *, float *, int *, float *, int *);
void BLASFUNC(dger)(int *, int *, double *, double *, int *, double *, int *, double *, int *);
void BLASFUNC(qger)(int *, int *, double *, double *, int *, double *, int *, double *, int *);
void BLASFUNC(cgeru)(int *, int *, float *, float *, int *, float *, int *, float *, int *);
void BLASFUNC(cgerc)(int *, int *, float *, float *, int *, float *, int *, float *, int *);
void BLASFUNC(zgeru)(int *, int *, double *, double *, int *, double *, int *, double *, int *);
void BLASFUNC(zgerc)(int *, int *, double *, double *, int *, double *, int *, double *, int *);
void BLASFUNC(xgeru)(int *, int *, double *, double *, int *, double *, int *, double *, int *);
void BLASFUNC(xgerc)(int *, int *, double *, double *, int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(sger)(int *, int *, float *, float *, int *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(dger)(int *, int *, double *, double *, int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(qger)(int *, int *, double *, double *, int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(cgeru)(int *, int *, float *, float *, int *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(cgerc)(int *, int *, float *, float *, int *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(zgeru)(int *, int *, double *, double *, int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(zgerc)(int *, int *, double *, double *, int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xgeru)(int *, int *, double *, double *, int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xgerc)(int *, int *, double *, double *, int *, double *, int *, double *, int *);
void BLASFUNC(sgemv)(const char *, const int *, const int *, const float *, const float *, const int *, const float *,
const int *, const float *, float *, const int *);
void BLASFUNC(dgemv)(const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(qgemv)(const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(cgemv)(const char *, const int *, const int *, const float *, const float *, const int *, const float *,
const int *, const float *, float *, const int *);
void BLASFUNC(zgemv)(const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(xgemv)(const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(sgemv)(const char *, const int *, const int *, const float *, const float *, const int *,
const float *, const int *, const float *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(dgemv)(const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(qgemv)(const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(cgemv)(const char *, const int *, const int *, const float *, const float *, const int *,
const float *, const int *, const float *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(zgemv)(const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(xgemv)(const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(strsv)(const char *, const char *, const char *, const int *, const float *, const int *, float *,
const int *);
void BLASFUNC(dtrsv)(const char *, const char *, const char *, const int *, const double *, const int *, double *,
const int *);
void BLASFUNC(qtrsv)(const char *, const char *, const char *, const int *, const double *, const int *, double *,
const int *);
void BLASFUNC(ctrsv)(const char *, const char *, const char *, const int *, const float *, const int *, float *,
const int *);
void BLASFUNC(ztrsv)(const char *, const char *, const char *, const int *, const double *, const int *, double *,
const int *);
void BLASFUNC(xtrsv)(const char *, const char *, const char *, const int *, const double *, const int *, double *,
const int *);
EIGEN_BLAS_API void BLASFUNC(strsv)(const char *, const char *, const char *, const int *, const float *, const int *,
float *, const int *);
EIGEN_BLAS_API void BLASFUNC(dtrsv)(const char *, const char *, const char *, const int *, const double *, const int *,
double *, const int *);
EIGEN_BLAS_API void BLASFUNC(qtrsv)(const char *, const char *, const char *, const int *, const double *, const int *,
double *, const int *);
EIGEN_BLAS_API void BLASFUNC(ctrsv)(const char *, const char *, const char *, const int *, const float *, const int *,
float *, const int *);
EIGEN_BLAS_API void BLASFUNC(ztrsv)(const char *, const char *, const char *, const int *, const double *, const int *,
double *, const int *);
EIGEN_BLAS_API void BLASFUNC(xtrsv)(const char *, const char *, const char *, const int *, const double *, const int *,
double *, const int *);
void BLASFUNC(stpsv)(char *, char *, char *, int *, float *, float *, int *);
void BLASFUNC(dtpsv)(char *, char *, char *, int *, double *, double *, int *);
void BLASFUNC(qtpsv)(char *, char *, char *, int *, double *, double *, int *);
void BLASFUNC(ctpsv)(char *, char *, char *, int *, float *, float *, int *);
void BLASFUNC(ztpsv)(char *, char *, char *, int *, double *, double *, int *);
void BLASFUNC(xtpsv)(char *, char *, char *, int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(stpsv)(char *, char *, char *, int *, float *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(dtpsv)(char *, char *, char *, int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(qtpsv)(char *, char *, char *, int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(ctpsv)(char *, char *, char *, int *, float *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(ztpsv)(char *, char *, char *, int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xtpsv)(char *, char *, char *, int *, double *, double *, int *);
void BLASFUNC(strmv)(const char *, const char *, const char *, const int *, const float *, const int *, float *,
const int *);
void BLASFUNC(dtrmv)(const char *, const char *, const char *, const int *, const double *, const int *, double *,
const int *);
void BLASFUNC(qtrmv)(const char *, const char *, const char *, const int *, const double *, const int *, double *,
const int *);
void BLASFUNC(ctrmv)(const char *, const char *, const char *, const int *, const float *, const int *, float *,
const int *);
void BLASFUNC(ztrmv)(const char *, const char *, const char *, const int *, const double *, const int *, double *,
const int *);
void BLASFUNC(xtrmv)(const char *, const char *, const char *, const int *, const double *, const int *, double *,
const int *);
EIGEN_BLAS_API void BLASFUNC(strmv)(const char *, const char *, const char *, const int *, const float *, const int *,
float *, const int *);
EIGEN_BLAS_API void BLASFUNC(dtrmv)(const char *, const char *, const char *, const int *, const double *, const int *,
double *, const int *);
EIGEN_BLAS_API void BLASFUNC(qtrmv)(const char *, const char *, const char *, const int *, const double *, const int *,
double *, const int *);
EIGEN_BLAS_API void BLASFUNC(ctrmv)(const char *, const char *, const char *, const int *, const float *, const int *,
float *, const int *);
EIGEN_BLAS_API void BLASFUNC(ztrmv)(const char *, const char *, const char *, const int *, const double *, const int *,
double *, const int *);
EIGEN_BLAS_API void BLASFUNC(xtrmv)(const char *, const char *, const char *, const int *, const double *, const int *,
double *, const int *);
void BLASFUNC(stpmv)(char *, char *, char *, int *, float *, float *, int *);
void BLASFUNC(dtpmv)(char *, char *, char *, int *, double *, double *, int *);
void BLASFUNC(qtpmv)(char *, char *, char *, int *, double *, double *, int *);
void BLASFUNC(ctpmv)(char *, char *, char *, int *, float *, float *, int *);
void BLASFUNC(ztpmv)(char *, char *, char *, int *, double *, double *, int *);
void BLASFUNC(xtpmv)(char *, char *, char *, int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(stpmv)(char *, char *, char *, int *, float *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(dtpmv)(char *, char *, char *, int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(qtpmv)(char *, char *, char *, int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(ctpmv)(char *, char *, char *, int *, float *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(ztpmv)(char *, char *, char *, int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xtpmv)(char *, char *, char *, int *, double *, double *, int *);
void BLASFUNC(stbmv)(char *, char *, char *, int *, int *, float *, int *, float *, int *);
void BLASFUNC(dtbmv)(char *, char *, char *, int *, int *, double *, int *, double *, int *);
void BLASFUNC(qtbmv)(char *, char *, char *, int *, int *, double *, int *, double *, int *);
void BLASFUNC(ctbmv)(char *, char *, char *, int *, int *, float *, int *, float *, int *);
void BLASFUNC(ztbmv)(char *, char *, char *, int *, int *, double *, int *, double *, int *);
void BLASFUNC(xtbmv)(char *, char *, char *, int *, int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(stbmv)(char *, char *, char *, int *, int *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(dtbmv)(char *, char *, char *, int *, int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(qtbmv)(char *, char *, char *, int *, int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(ctbmv)(char *, char *, char *, int *, int *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(ztbmv)(char *, char *, char *, int *, int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xtbmv)(char *, char *, char *, int *, int *, double *, int *, double *, int *);
void BLASFUNC(stbsv)(char *, char *, char *, int *, int *, float *, int *, float *, int *);
void BLASFUNC(dtbsv)(char *, char *, char *, int *, int *, double *, int *, double *, int *);
void BLASFUNC(qtbsv)(char *, char *, char *, int *, int *, double *, int *, double *, int *);
void BLASFUNC(ctbsv)(char *, char *, char *, int *, int *, float *, int *, float *, int *);
void BLASFUNC(ztbsv)(char *, char *, char *, int *, int *, double *, int *, double *, int *);
void BLASFUNC(xtbsv)(char *, char *, char *, int *, int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(stbsv)(char *, char *, char *, int *, int *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(dtbsv)(char *, char *, char *, int *, int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(qtbsv)(char *, char *, char *, int *, int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(ctbsv)(char *, char *, char *, int *, int *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(ztbsv)(char *, char *, char *, int *, int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xtbsv)(char *, char *, char *, int *, int *, double *, int *, double *, int *);
void BLASFUNC(ssymv)(const char *, const int *, const float *, const float *, const int *, const float *, const int *,
const float *, float *, const int *);
void BLASFUNC(dsymv)(const char *, const int *, const double *, const double *, const int *, const double *,
const int *, const double *, double *, const int *);
void BLASFUNC(qsymv)(const char *, const int *, const double *, const double *, const int *, const double *,
const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(ssymv)(const char *, const int *, const float *, const float *, const int *, const float *,
const int *, const float *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(dsymv)(const char *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(qsymv)(const char *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(sspmv)(char *, int *, float *, float *, float *, int *, float *, float *, int *);
void BLASFUNC(dspmv)(char *, int *, double *, double *, double *, int *, double *, double *, int *);
void BLASFUNC(qspmv)(char *, int *, double *, double *, double *, int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(sspmv)(char *, int *, float *, float *, float *, int *, float *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(dspmv)(char *, int *, double *, double *, double *, int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(qspmv)(char *, int *, double *, double *, double *, int *, double *, double *, int *);
void BLASFUNC(ssyr)(const char *, const int *, const float *, const float *, const int *, float *, const int *);
void BLASFUNC(dsyr)(const char *, const int *, const double *, const double *, const int *, double *, const int *);
void BLASFUNC(qsyr)(const char *, const int *, const double *, const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(ssyr)(const char *, const int *, const float *, const float *, const int *, float *,
const int *);
EIGEN_BLAS_API void BLASFUNC(dsyr)(const char *, const int *, const double *, const double *, const int *, double *,
const int *);
EIGEN_BLAS_API void BLASFUNC(qsyr)(const char *, const int *, const double *, const double *, const int *, double *,
const int *);
void BLASFUNC(ssyr2)(const char *, const int *, const float *, const float *, const int *, const float *, const int *,
float *, const int *);
void BLASFUNC(dsyr2)(const char *, const int *, const double *, const double *, const int *, const double *,
const int *, double *, const int *);
void BLASFUNC(qsyr2)(const char *, const int *, const double *, const double *, const int *, const double *,
const int *, double *, const int *);
void BLASFUNC(csyr2)(const char *, const int *, const float *, const float *, const int *, const float *, const int *,
float *, const int *);
void BLASFUNC(zsyr2)(const char *, const int *, const double *, const double *, const int *, const double *,
const int *, double *, const int *);
void BLASFUNC(xsyr2)(const char *, const int *, const double *, const double *, const int *, const double *,
const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(ssyr2)(const char *, const int *, const float *, const float *, const int *, const float *,
const int *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(dsyr2)(const char *, const int *, const double *, const double *, const int *,
const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(qsyr2)(const char *, const int *, const double *, const double *, const int *,
const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(csyr2)(const char *, const int *, const float *, const float *, const int *, const float *,
const int *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(zsyr2)(const char *, const int *, const double *, const double *, const int *,
const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(xsyr2)(const char *, const int *, const double *, const double *, const int *,
const double *, const int *, double *, const int *);
void BLASFUNC(sspr)(char *, int *, float *, float *, int *, float *);
void BLASFUNC(dspr)(char *, int *, double *, double *, int *, double *);
void BLASFUNC(qspr)(char *, int *, double *, double *, int *, double *);
EIGEN_BLAS_API void BLASFUNC(sspr)(char *, int *, float *, float *, int *, float *);
EIGEN_BLAS_API void BLASFUNC(dspr)(char *, int *, double *, double *, int *, double *);
EIGEN_BLAS_API void BLASFUNC(qspr)(char *, int *, double *, double *, int *, double *);
void BLASFUNC(sspr2)(char *, int *, float *, float *, int *, float *, int *, float *);
void BLASFUNC(dspr2)(char *, int *, double *, double *, int *, double *, int *, double *);
void BLASFUNC(qspr2)(char *, int *, double *, double *, int *, double *, int *, double *);
void BLASFUNC(cspr2)(char *, int *, float *, float *, int *, float *, int *, float *);
void BLASFUNC(zspr2)(char *, int *, double *, double *, int *, double *, int *, double *);
void BLASFUNC(xspr2)(char *, int *, double *, double *, int *, double *, int *, double *);
EIGEN_BLAS_API void BLASFUNC(sspr2)(char *, int *, float *, float *, int *, float *, int *, float *);
EIGEN_BLAS_API void BLASFUNC(dspr2)(char *, int *, double *, double *, int *, double *, int *, double *);
EIGEN_BLAS_API void BLASFUNC(qspr2)(char *, int *, double *, double *, int *, double *, int *, double *);
EIGEN_BLAS_API void BLASFUNC(cspr2)(char *, int *, float *, float *, int *, float *, int *, float *);
EIGEN_BLAS_API void BLASFUNC(zspr2)(char *, int *, double *, double *, int *, double *, int *, double *);
EIGEN_BLAS_API void BLASFUNC(xspr2)(char *, int *, double *, double *, int *, double *, int *, double *);
void BLASFUNC(cher)(char *, int *, float *, float *, int *, float *, int *);
void BLASFUNC(zher)(char *, int *, double *, double *, int *, double *, int *);
void BLASFUNC(xher)(char *, int *, double *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(cher)(char *, int *, float *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(zher)(char *, int *, double *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xher)(char *, int *, double *, double *, int *, double *, int *);
void BLASFUNC(chpr)(char *, int *, float *, float *, int *, float *);
void BLASFUNC(zhpr)(char *, int *, double *, double *, int *, double *);
void BLASFUNC(xhpr)(char *, int *, double *, double *, int *, double *);
EIGEN_BLAS_API void BLASFUNC(chpr)(char *, int *, float *, float *, int *, float *);
EIGEN_BLAS_API void BLASFUNC(zhpr)(char *, int *, double *, double *, int *, double *);
EIGEN_BLAS_API void BLASFUNC(xhpr)(char *, int *, double *, double *, int *, double *);
void BLASFUNC(cher2)(char *, int *, float *, float *, int *, float *, int *, float *, int *);
void BLASFUNC(zher2)(char *, int *, double *, double *, int *, double *, int *, double *, int *);
void BLASFUNC(xher2)(char *, int *, double *, double *, int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(cher2)(char *, int *, float *, float *, int *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(zher2)(char *, int *, double *, double *, int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xher2)(char *, int *, double *, double *, int *, double *, int *, double *, int *);
void BLASFUNC(chpr2)(char *, int *, float *, float *, int *, float *, int *, float *);
void BLASFUNC(zhpr2)(char *, int *, double *, double *, int *, double *, int *, double *);
void BLASFUNC(xhpr2)(char *, int *, double *, double *, int *, double *, int *, double *);
EIGEN_BLAS_API void BLASFUNC(chpr2)(char *, int *, float *, float *, int *, float *, int *, float *);
EIGEN_BLAS_API void BLASFUNC(zhpr2)(char *, int *, double *, double *, int *, double *, int *, double *);
EIGEN_BLAS_API void BLASFUNC(xhpr2)(char *, int *, double *, double *, int *, double *, int *, double *);
void BLASFUNC(chemv)(const char *, const int *, const float *, const float *, const int *, const float *, const int *,
const float *, float *, const int *);
void BLASFUNC(zhemv)(const char *, const int *, const double *, const double *, const int *, const double *,
const int *, const double *, double *, const int *);
void BLASFUNC(xhemv)(const char *, const int *, const double *, const double *, const int *, const double *,
const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(chemv)(const char *, const int *, const float *, const float *, const int *, const float *,
const int *, const float *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(zhemv)(const char *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(xhemv)(const char *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(chpmv)(char *, int *, float *, float *, float *, int *, float *, float *, int *);
void BLASFUNC(zhpmv)(char *, int *, double *, double *, double *, int *, double *, double *, int *);
void BLASFUNC(xhpmv)(char *, int *, double *, double *, double *, int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(chpmv)(char *, int *, float *, float *, float *, int *, float *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(zhpmv)(char *, int *, double *, double *, double *, int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xhpmv)(char *, int *, double *, double *, double *, int *, double *, double *, int *);
void BLASFUNC(snorm)(char *, int *, int *, float *, int *);
void BLASFUNC(dnorm)(char *, int *, int *, double *, int *);
void BLASFUNC(cnorm)(char *, int *, int *, float *, int *);
void BLASFUNC(znorm)(char *, int *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(snorm)(char *, int *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(dnorm)(char *, int *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(cnorm)(char *, int *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(znorm)(char *, int *, int *, double *, int *);
void BLASFUNC(sgbmv)(char *, int *, int *, int *, int *, float *, float *, int *, float *, int *, float *, float *,
int *);
void BLASFUNC(dgbmv)(char *, int *, int *, int *, int *, double *, double *, int *, double *, int *, double *, double *,
int *);
void BLASFUNC(qgbmv)(char *, int *, int *, int *, int *, double *, double *, int *, double *, int *, double *, double *,
int *);
void BLASFUNC(cgbmv)(char *, int *, int *, int *, int *, float *, float *, int *, float *, int *, float *, float *,
int *);
void BLASFUNC(zgbmv)(char *, int *, int *, int *, int *, double *, double *, int *, double *, int *, double *, double *,
int *);
void BLASFUNC(xgbmv)(char *, int *, int *, int *, int *, double *, double *, int *, double *, int *, double *, double *,
int *);
EIGEN_BLAS_API void BLASFUNC(sgbmv)(char *, int *, int *, int *, int *, float *, float *, int *, float *, int *,
float *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(dgbmv)(char *, int *, int *, int *, int *, double *, double *, int *, double *, int *,
double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(qgbmv)(char *, int *, int *, int *, int *, double *, double *, int *, double *, int *,
double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(cgbmv)(char *, int *, int *, int *, int *, float *, float *, int *, float *, int *,
float *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(zgbmv)(char *, int *, int *, int *, int *, double *, double *, int *, double *, int *,
double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xgbmv)(char *, int *, int *, int *, int *, double *, double *, int *, double *, int *,
double *, double *, int *);
void BLASFUNC(ssbmv)(char *, int *, int *, float *, float *, int *, float *, int *, float *, float *, int *);
void BLASFUNC(dsbmv)(char *, int *, int *, double *, double *, int *, double *, int *, double *, double *, int *);
void BLASFUNC(qsbmv)(char *, int *, int *, double *, double *, int *, double *, int *, double *, double *, int *);
void BLASFUNC(csbmv)(char *, int *, int *, float *, float *, int *, float *, int *, float *, float *, int *);
void BLASFUNC(zsbmv)(char *, int *, int *, double *, double *, int *, double *, int *, double *, double *, int *);
void BLASFUNC(xsbmv)(char *, int *, int *, double *, double *, int *, double *, int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(ssbmv)(char *, int *, int *, float *, float *, int *, float *, int *, float *, float *,
int *);
EIGEN_BLAS_API void BLASFUNC(dsbmv)(char *, int *, int *, double *, double *, int *, double *, int *, double *,
double *, int *);
EIGEN_BLAS_API void BLASFUNC(qsbmv)(char *, int *, int *, double *, double *, int *, double *, int *, double *,
double *, int *);
EIGEN_BLAS_API void BLASFUNC(csbmv)(char *, int *, int *, float *, float *, int *, float *, int *, float *, float *,
int *);
EIGEN_BLAS_API void BLASFUNC(zsbmv)(char *, int *, int *, double *, double *, int *, double *, int *, double *,
double *, int *);
EIGEN_BLAS_API void BLASFUNC(xsbmv)(char *, int *, int *, double *, double *, int *, double *, int *, double *,
double *, int *);
void BLASFUNC(chbmv)(char *, int *, int *, float *, float *, int *, float *, int *, float *, float *, int *);
void BLASFUNC(zhbmv)(char *, int *, int *, double *, double *, int *, double *, int *, double *, double *, int *);
void BLASFUNC(xhbmv)(char *, int *, int *, double *, double *, int *, double *, int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(chbmv)(char *, int *, int *, float *, float *, int *, float *, int *, float *, float *,
int *);
EIGEN_BLAS_API void BLASFUNC(zhbmv)(char *, int *, int *, double *, double *, int *, double *, int *, double *,
double *, int *);
EIGEN_BLAS_API void BLASFUNC(xhbmv)(char *, int *, int *, double *, double *, int *, double *, int *, double *,
double *, int *);
/* Level 3 routines */
void BLASFUNC(sgemm)(const char *, const char *, const int *, const int *, const int *, const float *, const float *,
const int *, const float *, const int *, const float *, float *, const int *);
void BLASFUNC(dgemm)(const char *, const char *, const int *, const int *, const int *, const double *, const double *,
const int *, const double *, const int *, const double *, double *, const int *);
void BLASFUNC(qgemm)(const char *, const char *, const int *, const int *, const int *, const double *, const double *,
const int *, const double *, const int *, const double *, double *, const int *);
void BLASFUNC(cgemm)(const char *, const char *, const int *, const int *, const int *, const float *, const float *,
const int *, const float *, const int *, const float *, float *, const int *);
void BLASFUNC(zgemm)(const char *, const char *, const int *, const int *, const int *, const double *, const double *,
const int *, const double *, const int *, const double *, double *, const int *);
void BLASFUNC(xgemm)(const char *, const char *, const int *, const int *, const int *, const double *, const double *,
const int *, const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(sgemm)(const char *, const char *, const int *, const int *, const int *, const float *,
const float *, const int *, const float *, const int *, const float *, float *,
const int *);
EIGEN_BLAS_API void BLASFUNC(dgemm)(const char *, const char *, const int *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
EIGEN_BLAS_API void BLASFUNC(qgemm)(const char *, const char *, const int *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
EIGEN_BLAS_API void BLASFUNC(cgemm)(const char *, const char *, const int *, const int *, const int *, const float *,
const float *, const int *, const float *, const int *, const float *, float *,
const int *);
EIGEN_BLAS_API void BLASFUNC(zgemm)(const char *, const char *, const int *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
EIGEN_BLAS_API void BLASFUNC(xgemm)(const char *, const char *, const int *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
void BLASFUNC(cgemm3m)(char *, char *, int *, int *, int *, float *, float *, int *, float *, int *, float *, float *,
int *);
void BLASFUNC(zgemm3m)(char *, char *, int *, int *, int *, double *, double *, int *, double *, int *, double *,
double *, int *);
void BLASFUNC(xgemm3m)(char *, char *, int *, int *, int *, double *, double *, int *, double *, int *, double *,
double *, int *);
EIGEN_BLAS_API void BLASFUNC(cgemm3m)(char *, char *, int *, int *, int *, float *, float *, int *, float *, int *,
float *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(zgemm3m)(char *, char *, int *, int *, int *, double *, double *, int *, double *, int *,
double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xgemm3m)(char *, char *, int *, int *, int *, double *, double *, int *, double *, int *,
double *, double *, int *);
void BLASFUNC(sge2mm)(char *, char *, char *, int *, int *, float *, float *, int *, float *, int *, float *, float *,
int *);
void BLASFUNC(dge2mm)(char *, char *, char *, int *, int *, double *, double *, int *, double *, int *, double *,
double *, int *);
void BLASFUNC(cge2mm)(char *, char *, char *, int *, int *, float *, float *, int *, float *, int *, float *, float *,
int *);
void BLASFUNC(zge2mm)(char *, char *, char *, int *, int *, double *, double *, int *, double *, int *, double *,
double *, int *);
EIGEN_BLAS_API void BLASFUNC(sge2mm)(char *, char *, char *, int *, int *, float *, float *, int *, float *, int *,
float *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(dge2mm)(char *, char *, char *, int *, int *, double *, double *, int *, double *, int *,
double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(cge2mm)(char *, char *, char *, int *, int *, float *, float *, int *, float *, int *,
float *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(zge2mm)(char *, char *, char *, int *, int *, double *, double *, int *, double *, int *,
double *, double *, int *);
void BLASFUNC(strsm)(const char *, const char *, const char *, const char *, const int *, const int *, const float *,
const float *, const int *, float *, const int *);
void BLASFUNC(dtrsm)(const char *, const char *, const char *, const char *, const int *, const int *, const double *,
const double *, const int *, double *, const int *);
void BLASFUNC(qtrsm)(const char *, const char *, const char *, const char *, const int *, const int *, const double *,
const double *, const int *, double *, const int *);
void BLASFUNC(ctrsm)(const char *, const char *, const char *, const char *, const int *, const int *, const float *,
const float *, const int *, float *, const int *);
void BLASFUNC(ztrsm)(const char *, const char *, const char *, const char *, const int *, const int *, const double *,
const double *, const int *, double *, const int *);
void BLASFUNC(xtrsm)(const char *, const char *, const char *, const char *, const int *, const int *, const double *,
const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(strsm)(const char *, const char *, const char *, const char *, const int *, const int *,
const float *, const float *, const int *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(dtrsm)(const char *, const char *, const char *, const char *, const int *, const int *,
const double *, const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(qtrsm)(const char *, const char *, const char *, const char *, const int *, const int *,
const double *, const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(ctrsm)(const char *, const char *, const char *, const char *, const int *, const int *,
const float *, const float *, const int *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(ztrsm)(const char *, const char *, const char *, const char *, const int *, const int *,
const double *, const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(xtrsm)(const char *, const char *, const char *, const char *, const int *, const int *,
const double *, const double *, const int *, double *, const int *);
void BLASFUNC(strmm)(const char *, const char *, const char *, const char *, const int *, const int *, const float *,
const float *, const int *, float *, const int *);
void BLASFUNC(dtrmm)(const char *, const char *, const char *, const char *, const int *, const int *, const double *,
const double *, const int *, double *, const int *);
void BLASFUNC(qtrmm)(const char *, const char *, const char *, const char *, const int *, const int *, const double *,
const double *, const int *, double *, const int *);
void BLASFUNC(ctrmm)(const char *, const char *, const char *, const char *, const int *, const int *, const float *,
const float *, const int *, float *, const int *);
void BLASFUNC(ztrmm)(const char *, const char *, const char *, const char *, const int *, const int *, const double *,
const double *, const int *, double *, const int *);
void BLASFUNC(xtrmm)(const char *, const char *, const char *, const char *, const int *, const int *, const double *,
const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(strmm)(const char *, const char *, const char *, const char *, const int *, const int *,
const float *, const float *, const int *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(dtrmm)(const char *, const char *, const char *, const char *, const int *, const int *,
const double *, const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(qtrmm)(const char *, const char *, const char *, const char *, const int *, const int *,
const double *, const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(ctrmm)(const char *, const char *, const char *, const char *, const int *, const int *,
const float *, const float *, const int *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(ztrmm)(const char *, const char *, const char *, const char *, const int *, const int *,
const double *, const double *, const int *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(xtrmm)(const char *, const char *, const char *, const char *, const int *, const int *,
const double *, const double *, const int *, double *, const int *);
void BLASFUNC(ssymm)(const char *, const char *, const int *, const int *, const float *, const float *, const int *,
const float *, const int *, const float *, float *, const int *);
void BLASFUNC(dsymm)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(qsymm)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(csymm)(const char *, const char *, const int *, const int *, const float *, const float *, const int *,
const float *, const int *, const float *, float *, const int *);
void BLASFUNC(zsymm)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(xsymm)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(ssymm)(const char *, const char *, const int *, const int *, const float *, const float *,
const int *, const float *, const int *, const float *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(dsymm)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
EIGEN_BLAS_API void BLASFUNC(qsymm)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
EIGEN_BLAS_API void BLASFUNC(csymm)(const char *, const char *, const int *, const int *, const float *, const float *,
const int *, const float *, const int *, const float *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(zsymm)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
EIGEN_BLAS_API void BLASFUNC(xsymm)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
void BLASFUNC(csymm3m)(char *, char *, int *, int *, float *, float *, int *, float *, int *, float *, float *, int *);
void BLASFUNC(zsymm3m)(char *, char *, int *, int *, double *, double *, int *, double *, int *, double *, double *,
int *);
void BLASFUNC(xsymm3m)(char *, char *, int *, int *, double *, double *, int *, double *, int *, double *, double *,
int *);
EIGEN_BLAS_API void BLASFUNC(csymm3m)(char *, char *, int *, int *, float *, float *, int *, float *, int *, float *,
float *, int *);
EIGEN_BLAS_API void BLASFUNC(zsymm3m)(char *, char *, int *, int *, double *, double *, int *, double *, int *,
double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xsymm3m)(char *, char *, int *, int *, double *, double *, int *, double *, int *,
double *, double *, int *);
void BLASFUNC(ssyrk)(const char *, const char *, const int *, const int *, const float *, const float *, const int *,
const float *, float *, const int *);
void BLASFUNC(dsyrk)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, double *, const int *);
void BLASFUNC(qsyrk)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, double *, const int *);
void BLASFUNC(csyrk)(const char *, const char *, const int *, const int *, const float *, const float *, const int *,
const float *, float *, const int *);
void BLASFUNC(zsyrk)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, double *, const int *);
void BLASFUNC(xsyrk)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(ssyrk)(const char *, const char *, const int *, const int *, const float *, const float *,
const int *, const float *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(dsyrk)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(qsyrk)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(csyrk)(const char *, const char *, const int *, const int *, const float *, const float *,
const int *, const float *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(zsyrk)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(xsyrk)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(ssyr2k)(const char *, const char *, const int *, const int *, const float *, const float *, const int *,
const float *, const int *, const float *, float *, const int *);
void BLASFUNC(dsyr2k)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(qsyr2k)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(csyr2k)(const char *, const char *, const int *, const int *, const float *, const float *, const int *,
const float *, const int *, const float *, float *, const int *);
void BLASFUNC(zsyr2k)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(xsyr2k)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(ssyr2k)(const char *, const char *, const int *, const int *, const float *, const float *,
const int *, const float *, const int *, const float *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(dsyr2k)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
EIGEN_BLAS_API void BLASFUNC(qsyr2k)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
EIGEN_BLAS_API void BLASFUNC(csyr2k)(const char *, const char *, const int *, const int *, const float *, const float *,
const int *, const float *, const int *, const float *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(zsyr2k)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
EIGEN_BLAS_API void BLASFUNC(xsyr2k)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
void BLASFUNC(chemm)(const char *, const char *, const int *, const int *, const float *, const float *, const int *,
const float *, const int *, const float *, float *, const int *);
void BLASFUNC(zhemm)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(xhemm)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(chemm)(const char *, const char *, const int *, const int *, const float *, const float *,
const int *, const float *, const int *, const float *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(zhemm)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
EIGEN_BLAS_API void BLASFUNC(xhemm)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
void BLASFUNC(chemm3m)(char *, char *, int *, int *, float *, float *, int *, float *, int *, float *, float *, int *);
void BLASFUNC(zhemm3m)(char *, char *, int *, int *, double *, double *, int *, double *, int *, double *, double *,
int *);
void BLASFUNC(xhemm3m)(char *, char *, int *, int *, double *, double *, int *, double *, int *, double *, double *,
int *);
EIGEN_BLAS_API void BLASFUNC(chemm3m)(char *, char *, int *, int *, float *, float *, int *, float *, int *, float *,
float *, int *);
EIGEN_BLAS_API void BLASFUNC(zhemm3m)(char *, char *, int *, int *, double *, double *, int *, double *, int *,
double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xhemm3m)(char *, char *, int *, int *, double *, double *, int *, double *, int *,
double *, double *, int *);
void BLASFUNC(cherk)(const char *, const char *, const int *, const int *, const float *, const float *, const int *,
const float *, float *, const int *);
void BLASFUNC(zherk)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, double *, const int *);
void BLASFUNC(xherk)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(cherk)(const char *, const char *, const int *, const int *, const float *, const float *,
const int *, const float *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(zherk)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(xherk)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(cher2k)(const char *, const char *, const int *, const int *, const float *, const float *, const int *,
const float *, const int *, const float *, float *, const int *);
void BLASFUNC(zher2k)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(xher2k)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(cher2m)(const char *, const char *, const char *, const int *, const int *, const float *, const float *,
const int *, const float *, const int *, const float *, float *, const int *);
void BLASFUNC(zher2m)(const char *, const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *, const int *);
void BLASFUNC(xher2m)(const char *, const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(cher2k)(const char *, const char *, const int *, const int *, const float *, const float *,
const int *, const float *, const int *, const float *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(zher2k)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
EIGEN_BLAS_API void BLASFUNC(xher2k)(const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
EIGEN_BLAS_API void BLASFUNC(cher2m)(const char *, const char *, const char *, const int *, const int *, const float *,
const float *, const int *, const float *, const int *, const float *, float *,
const int *);
EIGEN_BLAS_API void BLASFUNC(zher2m)(const char *, const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
EIGEN_BLAS_API void BLASFUNC(xher2m)(const char *, const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *,
const int *);
void BLASFUNC(sgemmtr)(const char *, const char *, const char *, const int *, const int *, const float *, const float *,
const int *, const float *, const int *, const float *, float *, const int *);
void BLASFUNC(dgemmtr)(const char *, const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *, const int *);
void BLASFUNC(qgemmtr)(const char *, const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *, const int *);
void BLASFUNC(cgemmtr)(const char *, const char *, const char *, const int *, const int *, const float *, const float *,
const int *, const float *, const int *, const float *, float *, const int *);
void BLASFUNC(zgemmtr)(const char *, const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *, const int *);
void BLASFUNC(xgemmtr)(const char *, const char *, const char *, const int *, const int *, const double *,
const double *, const int *, const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(sgemmtr)(const char *, const char *, const char *, const int *, const int *, const float *,
const float *, const int *, const float *, const int *, const float *, float *,
const int *);
EIGEN_BLAS_API void BLASFUNC(dgemmtr)(const char *, const char *, const char *, const int *, const int *,
const double *, const double *, const int *, const double *, const int *,
const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(qgemmtr)(const char *, const char *, const char *, const int *, const int *,
const double *, const double *, const int *, const double *, const int *,
const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(cgemmtr)(const char *, const char *, const char *, const int *, const int *, const float *,
const float *, const int *, const float *, const int *, const float *, float *,
const int *);
EIGEN_BLAS_API void BLASFUNC(zgemmtr)(const char *, const char *, const char *, const int *, const int *,
const double *, const double *, const int *, const double *, const int *,
const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(xgemmtr)(const char *, const char *, const char *, const int *, const int *,
const double *, const double *, const int *, const double *, const int *,
const double *, double *, const int *);
#ifdef __cplusplus
}

View File

@@ -31,23 +31,20 @@
build:windows:x86:msvc-14.29:default:
extends: .build:windows
variables:
EIGEN_CI_MSVC_VER: "14.29"
EIGEN_CI_MSVC_ARCH: "x86"
EIGEN_CI_MSVC_ARCH: "x64_x86"
# MSVC 14.29 (VS 2019) 64 bit
build:windows:x86-64:msvc-14.29:default:
extends: .build:windows
variables:
EIGEN_CI_MSVC_VER: "14.29"
build:windows:x86-64:msvc-14.29:avx2:
extends: build:windows:x86-64:msvc-14.29:default
extends: .build:windows
variables:
EIGEN_CI_ADDITIONAL_ARGS: "-DEIGEN_TEST_AVX2=on"
build:windows:x86-64:msvc-14.29:avx512dq:
extends: build:windows:x86-64:msvc-14.29:default
extends: .build:windows
variables:
EIGEN_CI_ADDITIONAL_ARGS: "-DEIGEN_TEST_AVX512DQ=on"
@@ -73,5 +70,4 @@ build:windows:x86-64:msvc-14.29:avx512dq:
build:windows:x86-64:cuda-11.4:msvc-14.29:
extends: .build:windows:cuda
variables:
EIGEN_CI_MSVC_VER: "14.29"
EIGEN_CI_BEFORE_SCRIPT: $$env:CUDA_PATH=$$env:CUDA_PATH_V11_4

View File

@@ -19,35 +19,29 @@
# MSVC 14.29 (VS 2019) 64 bit
.test:windows:x86-64:msvc-14.29:default:
test:windows:x86-64:msvc-14.29:default:official:
extends: .test:windows
needs: [ build:windows:x86-64:msvc-14.29:default ]
test:windows:x86-64:msvc-14.29:default:official:
extends: .test:windows:x86-64:msvc-14.29:default
variables:
EIGEN_CI_CTEST_LABEL: Official
test:windows:x86-64:msvc-14.29:default:unsupported:
extends: .test:windows:x86-64:msvc-14.29:default
extends: test:windows:x86-64:msvc-14.29:default:official
variables:
EIGEN_CI_CTEST_LABEL: Unsupported
.test:windows:x86-64:msvc-14.29:avx2:
test:windows:x86-64:msvc-14.29:avx2:official:
extends: .test:windows
needs: [ build:windows:x86-64:msvc-14.29:avx2 ]
test:windows:x86-64:msvc-14.29:avx2:official:
extends: .test:windows:x86-64:msvc-14.29:avx2
variables:
EIGEN_CI_CTEST_LABEL: Official
test:windows:x86-64:msvc-14.29:avx2:unsupported:
extends: .test:windows:x86-64:msvc-14.29:avx2
extends: test:windows:x86-64:msvc-14.29:avx2:official
variables:
EIGEN_CI_CTEST_LABEL: Unsupported
.test:windows:x86-64:msvc-14.29:avx512dq:
test:windows:x86-64:msvc-14.29:avx512dq:official:
extends: .test:windows
needs: [ build:windows:x86-64:msvc-14.29:avx512dq ]
tags:
@@ -55,14 +49,11 @@ test:windows:x86-64:msvc-14.29:avx2:unsupported:
- windows
- x86-64
- avx512
test:windows:x86-64:msvc-14.29:avx512dq:official:
extends: .test:windows:x86-64:msvc-14.29:avx512dq
variables:
EIGEN_CI_CTEST_LABEL: Official
test:windows:x86-64:msvc-14.29:avx512dq:unsupported:
extends: .test:windows:x86-64:msvc-14.29:avx512dq
extends: test:windows:x86-64:msvc-14.29:avx512dq:official
variables:
EIGEN_CI_CTEST_LABEL: Unsupported

View File

@@ -18,9 +18,6 @@ one option, and other parts (or libraries that you use) are compiled with anothe
fail to link or exhibit subtle bugs. Nevertheless, these options can be useful for people who know what they
are doing.
- \b EIGEN2_SUPPORT and \b EIGEN2_SUPPORT_STAGEnn_xxx are disabled starting from the 3.3 release.
Defining one of these will raise a compile-error. If you need to compile Eigen2 code,
<a href="http://eigen.tuxfamily.org/index.php?title=Eigen2">check this site</a>.
- \b EIGEN_DEFAULT_DENSE_INDEX_TYPE - the type for column and row indices in matrices, vectors and array
(DenseBase::Index). Set to \c std::ptrdiff_t by default.
- \b EIGEN_DEFAULT_IO_FORMAT - the IOFormat to use when printing a matrix if no %IOFormat is specified.
@@ -44,7 +41,7 @@ are doing.
preferable. Not defined by default.
\warning See the documentation of \c EIGEN_INITIALIZE_MATRICES_BY_ZERO for a discussion on a limitations
of these macros when applied to \c 1x1, \c 1x2, and \c 2x1 fixed-size matrices.
- \b EIGEN_NO_AUTOMATIC_RESIZING - if defined, the matrices (or arrays) on both sides of an assignment
- \b EIGEN_NO_AUTOMATIC_RESIZING - if defined, the matrices (or arrays) on both sides of an assignment
<tt>a = b</tt> have to be of the same size; otherwise, %Eigen automatically resizes \c a so that it is of
the correct size. Not defined by default.
@@ -72,8 +69,8 @@ The %Eigen library contains many assertions to guard against programming errors,
run time. However, these assertions do cost time and can thus be turned off.
- \b EIGEN_NO_DEBUG - disables %Eigen's assertions if defined. Not defined by default, unless the
\c NDEBUG macro is defined (this is a standard C++ macro which disables all asserts).
- \b EIGEN_NO_STATIC_ASSERT - if defined, compile-time static assertions are replaced by runtime assertions;
\c NDEBUG macro is defined (this is a standard C++ macro which disables all asserts).
- \b EIGEN_NO_STATIC_ASSERT - if defined, compile-time static assertions are replaced by runtime assertions;
this saves compilation time. Not defined by default.
- \b eigen_assert - macro with one argument that is used inside %Eigen for assertions. By default, it is
basically defined to be \c assert, which aborts the program if the assertion is violated. Redefine this
@@ -90,7 +87,7 @@ run time. However, these assertions do cost time and can thus be turned off.
Let us emphasize that \c EIGEN_MAX_*_ALIGN_BYTES define only a desirable upper bound. In practice data is aligned to largest power-of-two common divisor of \c EIGEN_MAX_STATIC_ALIGN_BYTES and the size of the data, such that memory is not wasted.
- \b \c EIGEN_DONT_PARALLELIZE - if defined, this disables multi-threading. This is only relevant if you enabled OpenMP.
See \ref TopicMultiThreading for details.
- \b \c EIGEN_DONT_VECTORIZE - disables explicit vectorization when defined. Not defined by default, unless
- \b \c EIGEN_DONT_VECTORIZE - disables explicit vectorization when defined. Not defined by default, unless
alignment is disabled by %Eigen's platform test or the user defining \c EIGEN_DONT_ALIGN.
- \b \c EIGEN_UNALIGNED_VECTORIZE - disables/enables vectorization with unaligned stores. Default is 1 (enabled).
If set to 0 (disabled), then expression for which the destination cannot be aligned are not vectorized (e.g., unaligned

View File

@@ -102,6 +102,7 @@ list(APPEND EIGEN_LAPACK_TARGETS eigen_lapack_static)
if (EIGEN_BUILD_SHARED_LIBS)
add_library(eigen_lapack SHARED ${EigenLapack_SRCS})
target_compile_definitions(eigen_lapack PUBLIC "EIGEN_BUILD_DLL")
list(APPEND EIGEN_LAPACK_TARGETS eigen_lapack)
target_link_libraries(eigen_lapack eigen_blas)
endif()

View File

@@ -7,127 +7,131 @@
extern "C" {
#endif
void BLASFUNC(csymv)(const char *, const int *, const float *, const float *, const int *, const float *, const int *,
const float *, float *, const int *);
void BLASFUNC(zsymv)(const char *, const int *, const double *, const double *, const int *, const double *,
const int *, const double *, double *, const int *);
void BLASFUNC(xsymv)(const char *, const int *, const double *, const double *, const int *, const double *,
const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(csymv)(const char *, const int *, const float *, const float *, const int *, const float *,
const int *, const float *, float *, const int *);
EIGEN_BLAS_API void BLASFUNC(zsymv)(const char *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
EIGEN_BLAS_API void BLASFUNC(xsymv)(const char *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
void BLASFUNC(cspmv)(char *, int *, float *, float *, float *, int *, float *, float *, int *);
void BLASFUNC(zspmv)(char *, int *, double *, double *, double *, int *, double *, double *, int *);
void BLASFUNC(xspmv)(char *, int *, double *, double *, double *, int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(cspmv)(char *, int *, float *, float *, float *, int *, float *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(zspmv)(char *, int *, double *, double *, double *, int *, double *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xspmv)(char *, int *, double *, double *, double *, int *, double *, double *, int *);
void BLASFUNC(csyr)(char *, int *, float *, float *, int *, float *, int *);
void BLASFUNC(zsyr)(char *, int *, double *, double *, int *, double *, int *);
void BLASFUNC(xsyr)(char *, int *, double *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(csyr)(char *, int *, float *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(zsyr)(char *, int *, double *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(xsyr)(char *, int *, double *, double *, int *, double *, int *);
void BLASFUNC(cspr)(char *, int *, float *, float *, int *, float *);
void BLASFUNC(zspr)(char *, int *, double *, double *, int *, double *);
void BLASFUNC(xspr)(char *, int *, double *, double *, int *, double *);
EIGEN_BLAS_API void BLASFUNC(cspr)(char *, int *, float *, float *, int *, float *);
EIGEN_BLAS_API void BLASFUNC(zspr)(char *, int *, double *, double *, int *, double *);
EIGEN_BLAS_API void BLASFUNC(xspr)(char *, int *, double *, double *, int *, double *);
void BLASFUNC(sgemt)(char *, int *, int *, float *, float *, int *, float *, int *);
void BLASFUNC(dgemt)(char *, int *, int *, double *, double *, int *, double *, int *);
void BLASFUNC(cgemt)(char *, int *, int *, float *, float *, int *, float *, int *);
void BLASFUNC(zgemt)(char *, int *, int *, double *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(sgemt)(char *, int *, int *, float *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(dgemt)(char *, int *, int *, double *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(cgemt)(char *, int *, int *, float *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(zgemt)(char *, int *, int *, double *, double *, int *, double *, int *);
void BLASFUNC(sgema)(char *, char *, int *, int *, float *, float *, int *, float *, float *, int *, float *, int *);
void BLASFUNC(dgema)(char *, char *, int *, int *, double *, double *, int *, double *, double *, int *, double *,
int *);
void BLASFUNC(cgema)(char *, char *, int *, int *, float *, float *, int *, float *, float *, int *, float *, int *);
void BLASFUNC(zgema)(char *, char *, int *, int *, double *, double *, int *, double *, double *, int *, double *,
int *);
EIGEN_BLAS_API void BLASFUNC(sgema)(char *, char *, int *, int *, float *, float *, int *, float *, float *, int *,
float *, int *);
EIGEN_BLAS_API void BLASFUNC(dgema)(char *, char *, int *, int *, double *, double *, int *, double *, double *, int *,
double *, int *);
EIGEN_BLAS_API void BLASFUNC(cgema)(char *, char *, int *, int *, float *, float *, int *, float *, float *, int *,
float *, int *);
EIGEN_BLAS_API void BLASFUNC(zgema)(char *, char *, int *, int *, double *, double *, int *, double *, double *, int *,
double *, int *);
void BLASFUNC(sgems)(char *, char *, int *, int *, float *, float *, int *, float *, float *, int *, float *, int *);
void BLASFUNC(dgems)(char *, char *, int *, int *, double *, double *, int *, double *, double *, int *, double *,
int *);
void BLASFUNC(cgems)(char *, char *, int *, int *, float *, float *, int *, float *, float *, int *, float *, int *);
void BLASFUNC(zgems)(char *, char *, int *, int *, double *, double *, int *, double *, double *, int *, double *,
int *);
EIGEN_BLAS_API void BLASFUNC(sgems)(char *, char *, int *, int *, float *, float *, int *, float *, float *, int *,
float *, int *);
EIGEN_BLAS_API void BLASFUNC(dgems)(char *, char *, int *, int *, double *, double *, int *, double *, double *, int *,
double *, int *);
EIGEN_BLAS_API void BLASFUNC(cgems)(char *, char *, int *, int *, float *, float *, int *, float *, float *, int *,
float *, int *);
EIGEN_BLAS_API void BLASFUNC(zgems)(char *, char *, int *, int *, double *, double *, int *, double *, double *, int *,
double *, int *);
void BLASFUNC(sgetf2)(int *, int *, float *, int *, int *, int *);
void BLASFUNC(dgetf2)(int *, int *, double *, int *, int *, int *);
void BLASFUNC(qgetf2)(int *, int *, double *, int *, int *, int *);
void BLASFUNC(cgetf2)(int *, int *, float *, int *, int *, int *);
void BLASFUNC(zgetf2)(int *, int *, double *, int *, int *, int *);
void BLASFUNC(xgetf2)(int *, int *, double *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(sgetf2)(int *, int *, float *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(dgetf2)(int *, int *, double *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(qgetf2)(int *, int *, double *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(cgetf2)(int *, int *, float *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(zgetf2)(int *, int *, double *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(xgetf2)(int *, int *, double *, int *, int *, int *);
void BLASFUNC(sgetrf)(int *, int *, float *, int *, int *, int *);
void BLASFUNC(dgetrf)(int *, int *, double *, int *, int *, int *);
void BLASFUNC(qgetrf)(int *, int *, double *, int *, int *, int *);
void BLASFUNC(cgetrf)(int *, int *, float *, int *, int *, int *);
void BLASFUNC(zgetrf)(int *, int *, double *, int *, int *, int *);
void BLASFUNC(xgetrf)(int *, int *, double *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(sgetrf)(int *, int *, float *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(dgetrf)(int *, int *, double *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(qgetrf)(int *, int *, double *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(cgetrf)(int *, int *, float *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(zgetrf)(int *, int *, double *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(xgetrf)(int *, int *, double *, int *, int *, int *);
void BLASFUNC(slaswp)(int *, float *, int *, int *, int *, int *, int *);
void BLASFUNC(dlaswp)(int *, double *, int *, int *, int *, int *, int *);
void BLASFUNC(qlaswp)(int *, double *, int *, int *, int *, int *, int *);
void BLASFUNC(claswp)(int *, float *, int *, int *, int *, int *, int *);
void BLASFUNC(zlaswp)(int *, double *, int *, int *, int *, int *, int *);
void BLASFUNC(xlaswp)(int *, double *, int *, int *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(slaswp)(int *, float *, int *, int *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(dlaswp)(int *, double *, int *, int *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(qlaswp)(int *, double *, int *, int *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(claswp)(int *, float *, int *, int *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(zlaswp)(int *, double *, int *, int *, int *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(xlaswp)(int *, double *, int *, int *, int *, int *, int *);
void BLASFUNC(sgetrs)(char *, int *, int *, float *, int *, int *, float *, int *, int *);
void BLASFUNC(dgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);
void BLASFUNC(qgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);
void BLASFUNC(cgetrs)(char *, int *, int *, float *, int *, int *, float *, int *, int *);
void BLASFUNC(zgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);
void BLASFUNC(xgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(sgetrs)(char *, int *, int *, float *, int *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(dgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(qgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(cgetrs)(char *, int *, int *, float *, int *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(zgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(xgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);
void BLASFUNC(sgesv)(int *, int *, float *, int *, int *, float *, int *, int *);
void BLASFUNC(dgesv)(int *, int *, double *, int *, int *, double *, int *, int *);
void BLASFUNC(qgesv)(int *, int *, double *, int *, int *, double *, int *, int *);
void BLASFUNC(cgesv)(int *, int *, float *, int *, int *, float *, int *, int *);
void BLASFUNC(zgesv)(int *, int *, double *, int *, int *, double *, int *, int *);
void BLASFUNC(xgesv)(int *, int *, double *, int *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(sgesv)(int *, int *, float *, int *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(dgesv)(int *, int *, double *, int *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(qgesv)(int *, int *, double *, int *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(cgesv)(int *, int *, float *, int *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(zgesv)(int *, int *, double *, int *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(xgesv)(int *, int *, double *, int *, int *, double *, int *, int *);
void BLASFUNC(spotf2)(char *, int *, float *, int *, int *);
void BLASFUNC(dpotf2)(char *, int *, double *, int *, int *);
void BLASFUNC(qpotf2)(char *, int *, double *, int *, int *);
void BLASFUNC(cpotf2)(char *, int *, float *, int *, int *);
void BLASFUNC(zpotf2)(char *, int *, double *, int *, int *);
void BLASFUNC(xpotf2)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(spotf2)(char *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(dpotf2)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(qpotf2)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(cpotf2)(char *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(zpotf2)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(xpotf2)(char *, int *, double *, int *, int *);
void BLASFUNC(spotrf)(char *, int *, float *, int *, int *);
void BLASFUNC(dpotrf)(char *, int *, double *, int *, int *);
void BLASFUNC(qpotrf)(char *, int *, double *, int *, int *);
void BLASFUNC(cpotrf)(char *, int *, float *, int *, int *);
void BLASFUNC(zpotrf)(char *, int *, double *, int *, int *);
void BLASFUNC(xpotrf)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(spotrf)(char *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(dpotrf)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(qpotrf)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(cpotrf)(char *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(zpotrf)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(xpotrf)(char *, int *, double *, int *, int *);
void BLASFUNC(slauu2)(char *, int *, float *, int *, int *);
void BLASFUNC(dlauu2)(char *, int *, double *, int *, int *);
void BLASFUNC(qlauu2)(char *, int *, double *, int *, int *);
void BLASFUNC(clauu2)(char *, int *, float *, int *, int *);
void BLASFUNC(zlauu2)(char *, int *, double *, int *, int *);
void BLASFUNC(xlauu2)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(slauu2)(char *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(dlauu2)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(qlauu2)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(clauu2)(char *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(zlauu2)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(xlauu2)(char *, int *, double *, int *, int *);
void BLASFUNC(slauum)(char *, int *, float *, int *, int *);
void BLASFUNC(dlauum)(char *, int *, double *, int *, int *);
void BLASFUNC(qlauum)(char *, int *, double *, int *, int *);
void BLASFUNC(clauum)(char *, int *, float *, int *, int *);
void BLASFUNC(zlauum)(char *, int *, double *, int *, int *);
void BLASFUNC(xlauum)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(slauum)(char *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(dlauum)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(qlauum)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(clauum)(char *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(zlauum)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(xlauum)(char *, int *, double *, int *, int *);
void BLASFUNC(strti2)(char *, char *, int *, float *, int *, int *);
void BLASFUNC(dtrti2)(char *, char *, int *, double *, int *, int *);
void BLASFUNC(qtrti2)(char *, char *, int *, double *, int *, int *);
void BLASFUNC(ctrti2)(char *, char *, int *, float *, int *, int *);
void BLASFUNC(ztrti2)(char *, char *, int *, double *, int *, int *);
void BLASFUNC(xtrti2)(char *, char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(strti2)(char *, char *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(dtrti2)(char *, char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(qtrti2)(char *, char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(ctrti2)(char *, char *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(ztrti2)(char *, char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(xtrti2)(char *, char *, int *, double *, int *, int *);
void BLASFUNC(strtri)(char *, char *, int *, float *, int *, int *);
void BLASFUNC(dtrtri)(char *, char *, int *, double *, int *, int *);
void BLASFUNC(qtrtri)(char *, char *, int *, double *, int *, int *);
void BLASFUNC(ctrtri)(char *, char *, int *, float *, int *, int *);
void BLASFUNC(ztrtri)(char *, char *, int *, double *, int *, int *);
void BLASFUNC(xtrtri)(char *, char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(strtri)(char *, char *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(dtrtri)(char *, char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(qtrtri)(char *, char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(ctrtri)(char *, char *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(ztrtri)(char *, char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(xtrtri)(char *, char *, int *, double *, int *, int *);
void BLASFUNC(spotri)(char *, int *, float *, int *, int *);
void BLASFUNC(dpotri)(char *, int *, double *, int *, int *);
void BLASFUNC(qpotri)(char *, int *, double *, int *, int *);
void BLASFUNC(cpotri)(char *, int *, float *, int *, int *);
void BLASFUNC(zpotri)(char *, int *, double *, int *, int *);
void BLASFUNC(xpotri)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(spotri)(char *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(dpotri)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(qpotri)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(cpotri)(char *, int *, float *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(zpotri)(char *, int *, double *, int *, int *);
EIGEN_BLAS_API void BLASFUNC(xpotri)(char *, int *, double *, int *, int *);
#ifdef __cplusplus
}

View File

@@ -56,27 +56,29 @@ EIGEN_LAPACK_FUNC(gesdd)
PlainMatrixType mat(*m, *n);
mat = matrix(a, *m, *n, *lda);
int option = *jobz == 'A' ? Eigen::ComputeFullU | Eigen::ComputeFullV
: *jobz == 'S' ? Eigen::ComputeThinU | Eigen::ComputeThinV
: *jobz == 'O' ? Eigen::ComputeThinU | Eigen::ComputeThinV
: 0;
Eigen::BDCSVD<PlainMatrixType> svd(mat, option);
make_vector(s, diag_size) = svd.singularValues().head(diag_size);
if (*jobz == 'A') {
Eigen::BDCSVD<PlainMatrixType, Eigen::ComputeFullU | Eigen::ComputeFullV> svd(mat);
make_vector(s, diag_size) = svd.singularValues().head(diag_size);
matrix(u, *m, *m, *ldu) = svd.matrixU();
matrix(vt, *n, *n, *ldvt) = svd.matrixV().adjoint();
} else if (*jobz == 'S') {
Eigen::BDCSVD<PlainMatrixType, Eigen::ComputeThinU | Eigen::ComputeThinV> svd(mat);
make_vector(s, diag_size) = svd.singularValues().head(diag_size);
matrix(u, *m, diag_size, *ldu) = svd.matrixU();
matrix(vt, diag_size, *n, *ldvt) = svd.matrixV().adjoint();
} else if (*jobz == 'O' && *m >= *n) {
Eigen::BDCSVD<PlainMatrixType, Eigen::ComputeThinU | Eigen::ComputeThinV> svd(mat);
make_vector(s, diag_size) = svd.singularValues().head(diag_size);
matrix(a, *m, *n, *lda) = svd.matrixU();
matrix(vt, *n, *n, *ldvt) = svd.matrixV().adjoint();
} else if (*jobz == 'O') {
Eigen::BDCSVD<PlainMatrixType, Eigen::ComputeThinU | Eigen::ComputeThinV> svd(mat);
make_vector(s, diag_size) = svd.singularValues().head(diag_size);
matrix(u, *m, *m, *ldu) = svd.matrixU();
matrix(a, diag_size, *n, *lda) = svd.matrixV().adjoint();
} else {
Eigen::BDCSVD<PlainMatrixType> svd(mat);
make_vector(s, diag_size) = svd.singularValues().head(diag_size);
}
}

View File

@@ -0,0 +1,128 @@
"""Search for MRs and issues related to a list of commits."""
import argparse
import json
import sys
import subprocess
import re
def find_cherry_pick_source(commit_hash: str):
"""
For a given commit hash, find the original commit it was cherry-picked from.
Args:
commit_hash: The commit hash to inspect.
Returns:
The full hash of the original commit if found, otherwise None.
"""
try:
# Use 'git show' to get the full commit message for the given hash.
# The '-s' flag suppresses the diff output.
# The '--format=%B' flag prints only the raw commit body/message.
commit_message = subprocess.check_output(
["git", "show", "-s", "--format=%B", commit_hash.strip()],
text=True,
stderr=subprocess.PIPE,
).strip()
# This regex looks for the specific line Git adds during a cherry-pick.
# It captures the full 40-character SHA-1 hash.
cherry_pick_pattern = re.compile(
r"\(cherry picked from commit ([a-f0-9]{40})\)"
)
# Search the entire commit message for the pattern.
match = cherry_pick_pattern.search(commit_message)
if match:
# If a match is found, return the captured group (the original commit hash).
return match.group(1)
else:
return None
except subprocess.CalledProcessError as e:
# This error occurs if the git command fails, e.g., for an invalid hash.
print(
f"Error processing commit '{commit_hash.strip()}': {e.stderr.strip()}",
file=sys.stderr,
)
return None
except FileNotFoundError:
# This error occurs if the 'git' command itself isn't found.
print(
"Error: 'git' command not found. Please ensure Git is installed and in your PATH.",
file=sys.stderr,
)
sys.exit(1)
def main():
"""
Main function to read commit hashes from stdin and process them.
"""
parser = argparse.ArgumentParser(
description="A script to download all MRs from GitLab matching specified criteria."
)
parser.add_argument(
"--merge_requests_file",
type=str,
required=True,
help="JSON file containing all the merge request information extracted via the GitLab API.",
)
# E.g. git log --pretty=%H 3e819d83bf52abda16bb53565f6801df40d071f1..3.4.1
parser.add_argument(
"--commits",
required=True,
help="List of commits, '-' for stdin.",
)
args = parser.parse_args()
mrs = []
with open(args.merge_requests_file, "r") as file:
mrs = json.load(file)
mrs_by_commit = {}
if args.commits == "-":
commit_hashes = sys.stdin.readlines()
else:
with open(args.commits, "r") as file:
commit_hashes = file.readlines()
# Arrange commits by SHA.
for mr in mrs:
for key in ["sha", "merge_commit_sha", "squash_commit_sha"]:
sha = mr[key]
if sha:
mrs_by_commit[sha] = mr
# Find the MRs and issues related to each commit.
info = {}
for sha in commit_hashes:
sha = sha.strip()
if not sha:
continue
# If a cherry-pick, extract the original hash.
sha = find_cherry_pick_source(sha) or sha
mr = mrs_by_commit.get(sha)
commit_info = {}
if mr:
commit_info["merge_request"] = mr["iid"]
commit_info["related_issues"] = [
issue["iid"] for issue in mr["related_issues"]
]
commit_info["closes_issues"] = [
issue["iid"] for issue in mr["closes_issues"]
]
info[sha] = commit_info
print(json.dumps(info, indent=2))
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,136 @@
"""Helper script to download source archives and upload them to the Eigen GitLab generic package registry."""
import os
import requests
import hashlib
import argparse
import sys
import tempfile
EIGEN_PROJECT_ID = 15462818 # Taken from the gitlab project page.
def calculate_sha256(filepath: str):
"""Calculates the SHA256 checksum of a file."""
sha256_hash = hashlib.sha256()
with open(filepath, "rb") as f:
# Read and update hash in chunks of 4K
for byte_block in iter(lambda: f.read(4096), b""):
sha256_hash.update(byte_block)
return sha256_hash.hexdigest()
def upload_to_generic_registry(
gitlab_private_token: str, package_name: str, package_version: str, filepath: str
):
"""Uploads a file to the GitLab generic package registry."""
headers = {"PRIVATE-TOKEN": gitlab_private_token}
filename = os.path.basename(filepath)
upload_url = f"https://gitlab.com/api/v4/projects/{EIGEN_PROJECT_ID}/packages/generic/{package_name}/{package_version}/{filename}"
print(f"Uploading {filename} to {upload_url}...")
try:
with open(filepath, "rb") as f:
response = requests.put(upload_url, headers=headers, data=f)
response.raise_for_status()
print(f"Successfully uploaded {filename}.")
return True
except requests.exceptions.RequestException as e:
print(f"Error uploading {filename}: {e}")
if e.response is not None:
print(f"Response content: {e.response.text}")
return False
def main():
"""Main function to download archives and upload them to the registry."""
parser = argparse.ArgumentParser(
description="Download GitLab release archives for Eigen and upload them to the generic package registry."
)
parser.add_argument(
"--gitlab_private_token",
type=str,
help="GitLab private API token. Defaults to the GITLAB_PRIVATE_TOKEN environment variable if set.",
)
parser.add_argument(
"--version",
required=True,
help="Specify a single version (tag name) to process.",
)
parser.add_argument(
"--download-dir", help=f"Directory to store temporary downloads (optional)."
)
args = parser.parse_args()
if not args.gitlab_private_token:
args.gitlab_private_token = os.getenv("GITLAB_PRIVATE_TOKEN")
if not args.gitlab_private_token:
print("Could not determine GITLAB_PRIVATE_TOKEN.", file=sys.stderr)
parser.print_usage()
sys.exit(1)
# Create download directory if it doesn't exist.
cleanup_download_dir = False
if args.download_dir:
if not os.path.exists(args.download_dir):
cleanup_download_dir = True
os.makedirs(args.download_dir)
else:
args.download_dir = tempfile.mkdtemp()
cleanup_download_dir = True
for ext in ["tar.gz", "tar.bz2", "tar", "zip"]:
archive_filename = f"eigen-{args.version}.{ext}"
archive_url = f"https://gitlab.com/libeigen/eigen/-/archive/{args.version}/{archive_filename}"
archive_filepath = os.path.join(args.download_dir, archive_filename)
# Download the archive
print(f"Downloading {archive_url}...")
try:
response = requests.get(archive_url, stream=True)
response.raise_for_status()
with open(archive_filepath, "wb") as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
print(f"Downloaded to {archive_filepath}")
except requests.exceptions.RequestException as e:
print(f"Error downloading {archive_url}: {e}. Skipping.")
continue
# Calculate SHA256 sum
sha256_sum = calculate_sha256(archive_filepath)
print(f"SHA256 sum: {sha256_sum}")
# Create SHA256 sum file
sha_filename = f"{archive_filename}.sha256"
sha_filepath = os.path.join(args.download_dir, sha_filename)
with open(sha_filepath, "w") as f:
f.write(f"{sha256_sum} {archive_filename}\n")
print(f"Created SHA256 file: {sha_filepath}")
# Upload archive to generic registry
if not upload_to_generic_registry(
args.gitlab_private_token, "eigen", args.version, archive_filepath
):
# If upload fails, clean up and move to the next release
os.remove(archive_filepath)
os.remove(sha_filepath)
continue
# Upload SHA256 sum file to generic registry
upload_to_generic_registry(
args.gitlab_private_token, "eigen", args.version, sha_filepath
)
# Clean up downloaded files
print("Cleaning up local files...")
os.remove(archive_filepath)
os.remove(sha_filepath)
# Clean up the download directory if it's empty
if cleanup_download_dir and not os.listdir(args.download_dir):
os.rmdir(args.download_dir)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,174 @@
"""Downloads all issues from GitLab matching specified criteria."""
import argparse
import datetime
import json
import os
import requests
import sys
EIGEN_PROJECT_ID = 15462818 # Taken from the gitlab project page.
def date(date_string: str):
"""Convert a date YY-MM-DD string to a datetime object."""
try:
return datetime.strptime(date_string, "%Y-%m-%d")
except ValueError:
msg = f"Not a valid date: '{date_string}'. Expected format is YYYY-MM-DD."
raise argparse.ArgumentTypeError(msg)
def _get_api_query(
gitlab_private_token: str, url: str, params: dict[str, str] | None = None
):
next_page = "1"
if not params:
params = dict()
params["per_page"] = "100"
headers = {"PRIVATE-TOKEN": gitlab_private_token}
out = []
while next_page:
params["page"] = next_page
try:
resp = requests.head(url=url, params=params, headers=headers)
if resp.status_code != 200:
print("Request failed: ", resp, file=sys.stderr)
break
next_next_page = resp.headers["x-next-page"]
resp = requests.get(url=url, params=params, headers=headers)
if resp.status_code != 200:
# Try again.
continue
out.extend(resp.json())
# Advance at the end, in case an exception occurs above so we can retry
next_page = next_next_page
except:
# Keep same next_page
continue
return out
def get_issues(
gitlab_private_token: str,
author_username: str | None = None,
state: str | None = None,
created_before: datetime.datetime | None = None,
created_after: datetime.datetime | None = None,
updated_after: datetime.datetime | None = None,
updated_before: datetime.datetime | None = None,
):
"""Return list of merge requests.
Args:
gitlab_token: GitLab API token.
author_username: issue author username.
state: issue state (opened, closed).
created_after: datetime start of period.
created_before: datetime end of period.
updated_after: datetime start of period.
updated_before: datetime end of period.
Returns:
List of merge requests.
"""
url = f"https://gitlab.com/api/v4/projects/{str(EIGEN_PROJECT_ID)}/issues"
params = dict()
if author_username:
params["author_username"] = author_username
if state:
params["state"] = state
if created_before:
params["created_before"] = created_before.isoformat()
if created_after:
params["created_after"] = created_after.isoformat()
if updated_before:
params["updated_before"] = updated_before.isoformat()
if updated_after:
params["updated_after"] = updated_after.isoformat()
params["order_by"] = "created_at"
params["sort"] = "asc"
issues = _get_api_query(gitlab_private_token, url, params)
for issue in issues:
if int(issue["merge_requests_count"]) > 0:
issue_iid = issue["iid"]
issue["related_merge_requests"] = _get_api_query(
gitlab_private_token, f"{url}/{issue_iid}/related_merge_requests"
)
issue["closed_by_merge_requests"] = _get_api_query(
gitlab_private_token, f"{url}/{issue_iid}/closed_by"
)
return issues
def main(_):
parser = argparse.ArgumentParser(
description="A script to download all issues from GitLab matching specified criteria."
)
parser.add_argument(
"--gitlab_private_token",
type=str,
help="GitLab private API token. Defaults to the GITLAB_PRIVATE_TOKEN environment variable if set.",
)
parser.add_argument("--author", type=str, help="The name of the author.")
parser.add_argument(
"--state",
type=str,
choices=["opened", "closed"],
help="The state of the issue.",
)
parser.add_argument(
"--created_before",
type=date,
help="The created-before date in YYYY-MM-DD format.",
)
parser.add_argument(
"--created_after",
type=date,
help="The created-after date in YYYY-MM-DD format.",
)
parser.add_argument(
"--updated_before",
type=date,
help="The updated-before date in YYYY-MM-DD format.",
)
parser.add_argument(
"--updated_after",
type=date,
help="The updated-after date in YYYY-MM-DD format.",
)
args = parser.parse_args()
if not args.gitlab_private_token:
args.gitlab_private_token = os.getenv("GITLAB_PRIVATE_TOKEN")
if not args.gitlab_private_token:
print("Could not determine GITLAB_PRIVATE_TOKEN.", file=sys.stderr)
parser.print_usage()
sys.exit(1)
# Parse the arguments from the command line
issues = get_issues(
gitlab_private_token=args.gitlab_private_token,
author_username=args.author,
state=args.state,
created_before=args.created_before,
created_after=args.created_after,
updated_before=args.updated_before,
updated_after=args.updated_after,
)
issue_str = json.dumps(issues, indent=2)
print(issue_str)
if __name__ == "__main__":
main(sys.argv)

View File

@@ -0,0 +1,122 @@
"""Adds a label to a GitLab merge requests or issues."""
import os
import sys
import argparse
import requests
EIGEN_PROJECT_ID = 15462818 # Taken from the gitlab project page.
def add_label_to_mr(private_token: str, mr_iid: int, label: str):
"""
Adds a label to a specific merge request in a GitLab project.
Args:
private_token: The user's private GitLab API token.
mr_iid: The internal ID (IID) of the merge request.
label: The label to add.
"""
api_url = (
f"https://gitlab.com/api/v4/projects/{EIGEN_PROJECT_ID}/merge_requests/{mr_iid}"
)
headers = {"PRIVATE-TOKEN": private_token}
# Using 'add_labels' ensures we don't overwrite existing labels.
payload = {"add_labels": label}
try:
response = requests.put(api_url, headers=headers, json=payload)
response.raise_for_status() # Raises an HTTPError for bad responses (4xx or 5xx)
print(f"✅ Successfully added label '{label}' to Merge Request !{mr_iid}.")
except requests.exceptions.RequestException as e:
print(f"❌ Error updating Merge Request !{mr_iid}: {e}", file=sys.stderr)
if hasattr(e, "response") and e.response is not None:
print(f" Response: {e.response.text}", file=sys.stderr)
def add_label_to_issue(private_token: str, issue_iid: int, label: str):
"""
Adds a label to a specific issue in a GitLab project.
Args:
private_token: The user's private GitLab API token.
issue_iid: The internal ID (IID) of the issue.
label: The label to add.
"""
api_url = (
f"https://gitlab.com/api/v4/projects/{EIGEN_PROJECT_ID}/issues/{issue_iid}"
)
headers = {"PRIVATE-TOKEN": private_token}
payload = {"add_labels": label}
try:
response = requests.put(api_url, headers=headers, json=payload)
response.raise_for_status()
print(f"✅ Successfully added label '{label}' to Issue #{issue_iid}.")
except requests.exceptions.RequestException as e:
print(f"❌ Error updating Issue #{issue_iid}: {e}", file=sys.stderr)
if hasattr(e, "response") and e.response is not None:
print(f" Response: {e.response.text}", file=sys.stderr)
def main():
"""
Main function to parse arguments and trigger the labelling process.
"""
parser = argparse.ArgumentParser(
description="Add a label to GitLab merge requests and issues.",
formatter_class=argparse.RawTextHelpFormatter,
)
parser.add_argument("label", help="The label to add.")
parser.add_argument(
"--mrs",
nargs="+",
type=int,
help="A space-separated list of Merge Request IIDs.",
)
parser.add_argument(
"--issues", nargs="+", type=int, help="A space-separated list of Issue IIDs."
)
parser.add_argument(
"--gitlab_private_token",
help="Your GitLab private access token. \n(Best practice is to use the GITLAB_PRIVATE_TOKEN environment variable instead.)",
)
args = parser.parse_args()
# Prefer environment variable for the token for better security.
gitlab_private_token = args.gitlab_private_token or os.environ.get(
"GITLAB_PRIVATE_TOKEN"
)
if not gitlab_private_token:
print("Error: GitLab private token not found.", file=sys.stderr)
print(
"Please provide it using the --token argument or by setting the GITLAB_PRIVATE_TOKEN environment variable.",
file=sys.stderr,
)
sys.exit(1)
if not args.mrs and not args.issues:
print(
"Error: You must provide at least one merge request (--mrs) or issue (--issues) ID.",
file=sys.stderr,
)
sys.exit(1)
print("-" * 30)
if args.mrs:
print(f"Processing {len(args.mrs)} merge request(s)...")
for mr_iid in args.mrs:
add_label_to_mr(gitlab_private_token, mr_iid, args.label)
if args.issues:
print(f"\nProcessing {len(args.issues)} issue(s)...")
for issue_iid in args.issues:
add_label_to_issue(gitlab_private_token, issue_iid, args.label)
print("-" * 30)
print("Script finished.")
if __name__ == "__main__":
main()

200
scripts/gitlab_api_mrs.py Normal file
View File

@@ -0,0 +1,200 @@
"""Downloads all MRs from GitLab matching specified criteria."""
import argparse
import datetime
import json
import os
import requests
import sys
EIGEN_PROJECT_ID = 15462818 # Taken from the gitlab project page.
def date(date_string: str):
"""Convert a date YY-MM-DD string to a datetime object."""
try:
return datetime.strptime(date_string, "%Y-%m-%d")
except ValueError:
msg = f"Not a valid date: '{date_string}'. Expected format is YYYY-MM-DD."
raise argparse.ArgumentTypeError(msg)
def _get_api_query(
gitlab_private_token: str, url: str, params: dict[str, str] | None = None
):
next_page = "1"
if not params:
params = dict()
params["per_page"] = "100"
headers = {"PRIVATE-TOKEN": gitlab_private_token}
out = []
while next_page:
params["page"] = next_page
try:
resp = requests.head(url=url, params=params, headers=headers)
if resp.status_code != 200:
print("Request failed: ", resp, file=sys.stderr)
break
next_next_page = resp.headers["x-next-page"]
resp = requests.get(url=url, params=params, headers=headers)
if resp.status_code != 200:
# Try again.
continue
out.extend(resp.json())
# Advance at the end, in case an exception occurs above so we can retry
next_page = next_next_page
except:
# Keep same next_page
continue
return out
def get_merge_requests(
gitlab_private_token: str,
author_username: str | None = None,
state: str | None = None,
created_before: datetime.datetime | None = None,
created_after: datetime.datetime | None = None,
updated_after: datetime.datetime | None = None,
updated_before: datetime.datetime | None = None,
related_issues: bool = False,
closes_issues: bool = False,
):
"""Return list of merge requests.
Args:
gitlab_token: GitLab API token.
author_username: MR author username.
state: MR state (merged, opened, closed, locked).
created_after: datetime start of period.
created_before: datetime end of period.
updated_after: datetime start of period.
updated_before: datetime end of period.
Returns:
List of merge requests.
"""
url = (
"https://gitlab.com/api/v4/projects/"
+ str(EIGEN_PROJECT_ID)
+ "/merge_requests"
)
params = dict()
if author_username:
params["author_username"] = author_username
if state:
params["state"] = state
if created_before:
params["created_before"] = created_before.isoformat()
if created_after:
params["created_after"] = created_after.isoformat()
if updated_before:
params["updated_before"] = updated_before.isoformat()
if updated_after:
params["updated_after"] = updated_after.isoformat()
params["order_by"] = "created_at"
params["sort"] = "asc"
next_page = "1"
params["per_page"] = "100"
headers = {"PRIVATE-TOKEN": gitlab_private_token}
mrs = _get_api_query(gitlab_private_token, url, params)
if related_issues:
for mr in mrs:
mr["related_issues"] = _get_api_query(
gitlab_private_token, f"{url}/{mr['iid']}/related_issues"
)
if closes_issues:
for mr in mrs:
mr["closes_issues"] = _get_api_query(
gitlab_private_token, f"{url}/{mr['iid']}/closes_issues"
)
return mrs
def main(_):
parser = argparse.ArgumentParser(
description="A script to download all MRs from GitLab matching specified criteria."
)
parser.add_argument(
"--gitlab_private_token",
type=str,
help="GitLab private API token. Defaults to the GITLAB_PRIVATE_TOKEN environment variable if set.",
)
parser.add_argument("--author", type=str, help="The name of the author.")
parser.add_argument(
"--state",
type=str,
choices=["merged", "opened", "closed", "locked"],
help="The state of the MR.",
)
parser.add_argument(
"--created_before",
type=date,
help="The created-before date in YYYY-MM-DD format.",
)
parser.add_argument(
"--created_after",
type=date,
help="The created-after date in YYYY-MM-DD format.",
)
parser.add_argument(
"--updated_before",
type=date,
help="The updated-before date in YYYY-MM-DD format.",
)
parser.add_argument(
"--updated_after",
type=date,
help="The updated-after date in YYYY-MM-DD format.",
)
parser.add_argument(
"--related_issues", action="store_true", help="Query for related issues."
)
parser.add_argument(
"--closes_issues",
action="store_true",
help="Query for issues closed by the MR.",
)
args = parser.parse_args()
if not args.gitlab_private_token:
args.gitlab_private_token = os.getenv("GITLAB_PRIVATE_TOKEN")
if not args.gitlab_private_token:
print("Could not determine GITLAB_PRIVATE_TOKEN.", file=sys.stderr)
parser.print_usage()
sys.exit(1)
# Parse the arguments from the command line
mrs = get_merge_requests(
gitlab_private_token=args.gitlab_private_token,
author_username=args.author,
state=args.state,
created_before=args.created_before,
created_after=args.created_after,
updated_before=args.updated_before,
updated_after=args.updated_after,
related_issues=args.related_issues,
closes_issues=args.closes_issues,
)
mr_str = json.dumps(mrs, indent=2)
print(mr_str)
if __name__ == "__main__":
main(sys.argv)

View File

@@ -1,9 +1,6 @@
# Powershell script to set up MSVC environment.
param ($EIGEN_CI_MSVC_ARCH, $EIGEN_CI_MSVC_VER)
Set-PSDebug -Trace 1
function Get-ScriptDirectory { Split-Path $MyInvocation.ScriptName }
# Set defaults if not already set.

View File

@@ -13,6 +13,7 @@
#include <limits>
#include <Eigen/Eigenvalues>
#include <Eigen/SparseCore>
#include <unsupported/Eigen/MatrixFunctions>
template <typename MatrixType>
void selfadjointeigensolver_essential_check(const MatrixType& m) {
@@ -135,11 +136,13 @@ void selfadjointeigensolver(const MatrixType& m) {
VERIFY_RAISES_ASSERT(eiSymmUninitialized.eigenvectors());
VERIFY_RAISES_ASSERT(eiSymmUninitialized.operatorSqrt());
VERIFY_RAISES_ASSERT(eiSymmUninitialized.operatorInverseSqrt());
VERIFY_RAISES_ASSERT(eiSymmUninitialized.operatorExp());
eiSymmUninitialized.compute(symmA, false);
VERIFY_RAISES_ASSERT(eiSymmUninitialized.eigenvectors());
VERIFY_RAISES_ASSERT(eiSymmUninitialized.operatorSqrt());
VERIFY_RAISES_ASSERT(eiSymmUninitialized.operatorInverseSqrt());
VERIFY_RAISES_ASSERT(eiSymmUninitialized.operatorExp());
// test Tridiagonalization's methods
Tridiagonalization<MatrixType> tridiag(symmC);
@@ -167,6 +170,14 @@ void selfadjointeigensolver(const MatrixType& m) {
eiSymmTridiag.eigenvectors().real().transpose());
}
// Test matrix expponential from eigendecomposition.
// First scale to avoid overflow.
symmB = symmB / symmB.norm();
eiSymm.compute(symmB);
MatrixType expSymmB = eiSymm.operatorExp();
symmB = symmB.template selfadjointView<Lower>();
VERIFY_IS_APPROX(expSymmB, symmB.exp());
if (rows > 1 && rows < 20) {
// Test matrix with NaN
symmC(0, 0) = std::numeric_limits<typename MatrixType::RealScalar>::quiet_NaN();

View File

@@ -126,12 +126,12 @@ void homogeneous(void) {
}
{
const Eigen::PermutationMatrix<Size> P{Eigen::Vector<int, Size>::EqualSpaced(0, 1)};
const auto right = Eigen::Vector<Scalar, Size - 1>::Random().eval().homogeneous();
const auto left = Eigen::RowVector<Scalar, Size - 1>::Random().eval().homogeneous();
PermutationMatrix<Size> P{Vector<int, Size>::EqualSpaced(0, 1).reverse()};
auto right = Vector<Scalar, Size - 1>::Random().eval().nestByValue().homogeneous();
auto left = RowVector<Scalar, Size - 1>::Random().eval().nestByValue().homogeneous();
VERIFY_IS_APPROX(P * right, P * right.eval());
VERIFY_IS_APPROX(left * P, left.eval() * P);
VERIFY_IS_APPROX(P * right, right.reverse());
VERIFY_IS_APPROX(left * P, left.reverse());
}
}

View File

@@ -94,6 +94,19 @@ void jacobisvd_verify_inputs(const MatrixType& input = MatrixType()) {
(int)ColPivHouseholderQRPreconditioner));
}
template <typename MatrixType>
void svd_triangular_matrix(const MatrixType& input = MatrixType()) {
MatrixType matrix(input.rows(), input.cols());
svd_fill_random(matrix);
// Make sure that we only consider the 'Lower' part of the matrix.
MatrixType matrix_self_adj = matrix.template selfadjointView<Lower>().toDenseMatrix();
JacobiSVD<MatrixType, ComputeFullV> svd_triangular(matrix.template selfadjointView<Lower>());
JacobiSVD<MatrixType, ComputeFullV> svd_full(matrix_self_adj);
VERIFY_IS_APPROX(svd_triangular.singularValues(), svd_full.singularValues());
}
namespace Foo {
// older compiler require a default constructor for Bar
// cf: https://stackoverflow.com/questions/7411515/
@@ -211,5 +224,10 @@ EIGEN_DECLARE_TEST(jacobisvd) {
CALL_SUBTEST_55(svd_underoverflow<void>());
// Check that the TriangularBase constructor works
CALL_SUBTEST_56((svd_triangular_matrix<Matrix3d>()));
CALL_SUBTEST_57((svd_triangular_matrix<Matrix4f>()));
CALL_SUBTEST_58((svd_triangular_matrix<Matrix<double, 10, 10>>()));
msvc_workaround();
}

View File

@@ -352,7 +352,7 @@ void test_cref_move_ctor(const DenseBase<Derived> &expr) {
const double *data1 = cref1.data(), *obj_data1 = static_cast<CRefDerived &>(cref1).m_object.data();
VERIFY(test_is_equal(data1, obj_data1, owns_data));
CRef cref2(std::move(cref1));
VERIFY_IS_EQUAL(data1, cref1.data());
VERIFY_IS_EQUAL(std::uintptr_t(data1), std::uintptr_t(cref1.data()));
const double *data2 = cref2.data(), *obj_data2 = static_cast<CRefDerived &>(cref2).m_object.data();
VERIFY(test_is_equal(data1, data2, MatrixType::MaxSizeAtCompileTime == Dynamic || !owns_data));
VERIFY(test_is_equal(data1, obj_data2, MatrixType::MaxSizeAtCompileTime == Dynamic && owns_data));