Compare commits

...

43 Commits

Author SHA1 Message Date
Antonio Sanchez
bc3b39870e Add 5.0.1 release notes and a few unreleased features.
(cherry picked from commit 91526464aef156bb0f847db6e00f0b971f9d9ac8)
2025-11-08 12:44:56 -08:00
Antonio Sanchez
c324ad2503 Enable tests on push 2025-11-06 09:31:16 -08:00
Antonio Sánchez
d6d4a3399f Fix MKL enum conversion warning.
<!--
Thanks for contributing a merge request!

We recommend that first-time contributors read our [contribution guidelines](https://eigen.tuxfamily.org/index.php?title=Contributing_to_Eigen).

Before submitting the MR, please complete the following checks:
- Create one PR per feature or bugfix,
- Run the test suite to verify your changes.
  See our [test guidelines](https://eigen.tuxfamily.org/index.php?title=Tests).
- Add tests to cover the bug addressed or any new feature.
- Document new features.  If it is a substantial change, add it to the [Changelog](https://gitlab.com/libeigen/eigen/-/blob/master/CHANGELOG.md).
- Leave the following box checked when submitting: `Allow commits from members who can merge to the target branch`.
  This allows us to rebase and merge your change.

Note that we are a team of volunteers; we appreciate your patience during the review process.
-->

### Description
<!--Please explain your changes.-->

Fix MKL enum conversion warning.

### Reference issue
<!--
You can link to a specific issue using the gitlab syntax #<issue number>.
If the MR fixes an issue, write "Fixes #<issue number>" to have the issue automatically closed on merge.
-->
Fixes #2999.

Closes #2999

See merge request libeigen/eigen!2061

(cherry picked from commit 142caf889c)
2025-11-05 13:34:05 -08:00
Antonio Sánchez
6d5a91dae2 Remove deprecated CUDA device properties.
<!--
Thanks for contributing a merge request!

We recommend that first-time contributors read our [contribution guidelines](https://eigen.tuxfamily.org/index.php?title=Contributing_to_Eigen).

Before submitting the MR, please complete the following checks:
- Create one PR per feature or bugfix,
- Run the test suite to verify your changes.
  See our [test guidelines](https://eigen.tuxfamily.org/index.php?title=Tests).
- Add tests to cover the bug addressed or any new feature.
- Document new features.  If it is a substantial change, add it to the [Changelog](https://gitlab.com/libeigen/eigen/-/blob/master/CHANGELOG.md).
- Leave the following box checked when submitting: `Allow commits from members who can merge to the target branch`.
  This allows us to rebase and merge your change.

Note that we are a team of volunteers; we appreciate your patience during the review process.
-->

### Description
<!--Please explain your changes.-->

Remove deprecated CUDA device properties.

### Reference issue
<!--
You can link to a specific issue using the gitlab syntax #<issue number>.
If the MR fixes an issue, write "Fixes #<issue number>" to have the issue automatically closed on merge.
-->
Fixes #3000.

Closes #3000

See merge request libeigen/eigen!2060

(cherry picked from commit 9e5714b93b)
2025-11-05 13:33:49 -08:00
Rasmus Munk Larsen
99e199f0eb Make assume_aligned a no-op on ARM & ARM64 when msan is used, to work around a missing linker symbol.
(cherry picked from commit 71703a9816)
2025-11-05 13:32:28 -08:00
Rasmus Munk Larsen
f471ebb8cc Fix more bugs in !2052
Fixes #2998

Closes #2998

See merge request libeigen/eigen!2057

Co-authored-by: Rasmus Munk Larsen <rmlarsen@google.com>
(cherry picked from commit ed9a0e59ba)
2025-11-05 13:32:02 -08:00
Rasmus Munk Larsen
f7ab506bd0 Fixes #2998.
(cherry picked from commit bfdbc031c2)
2025-11-05 13:31:45 -08:00
Antonio Sanchez
0db477863d Set 5.0.1 release version. 2025-11-05 13:31:12 -08:00
Antonio Sánchez
7a85735a1a Implement assume_aligned using the standard API
This implements `Eigen::internal::assume_aligned` to match the API for C++20 standard as best as possible using either `std::assume_aligned` or `__builtin_assume_aligned` if available. If neither is available, the function is a no-op.

The override macro `EIGEN_ASSUME_ALIGNED` was changed to a `EIGEN_DONT_ASSUME_ALIGNED`, which now forces the function to be a no-op.

See merge request libeigen/eigen!2052


(cherry picked from commit 8716f109e4)

f8191848 Fix pcmp_* for HVX to to comply with the new definition of true = Scalar(1).
7cc169d9 Revert "Fix pcmp_* for HVX to to comply with the new definition of true = Scalar(1)."
06999845 Merge branch eigen:master into master
b5fde61f Merge branch eigen:master into master
10d10d60 Merge branch eigen:master into master
9398d6ad Merge branch eigen:master into master
7804d5a4 Merge branch eigen:master into master
0068623c Merge branch eigen:master into master
b0ffc9cf Merge branch eigen:master into master
f3791c80 Merge branch eigen:master into master
74275f0c Merge branch eigen:master into master
b095614e Merge branch eigen:master into master
1312a696 Merge branch eigen:master into master
e6dd44d2 Merge branch eigen:master into master
8ac67769 Implement assume_aligned using the standard API if available.
97b299fa Format.
b31798be Fix typos.
04b3d312 Unformat.

Co-authored-by: Rasmus Munk Larsen <rmlarsen@google.com>
2025-11-05 21:26:22 +00:00
Antonio Sánchez
748962722c Fix SparseVector::insert(Index) assigning int to Scalar
Scalar doesn't necessarily support implicit construction from int or
assignment from int.

Here's the error message I got without this fix:
```
/home/tav/git/Sleipnir/build/_deps/eigen3-src/Eigen/src/SparseCore/SparseVector.h:180:25: error: no match for ‘operator=’ (operand types are ‘Eigen::internal::CompressedStorage<ExplicitDouble, int>::Scalar’ {aka ‘ExplicitDouble’} and ‘int’)
  180 |     m_data.value(p + 1) = 0;
      |     ~~~~~~~~~~~~~~~~~~~~^~~
```

See merge request libeigen/eigen!2046


(cherry picked from commit 9234883914)

48d2b101 Fix SparseVector::insert(Index) assigning int to Scalar

Co-authored-by: Tyler Veness <calcmogul@gmail.com>
2025-11-05 21:24:44 +00:00
Antonio Sánchez
284dcc122b Fix doc references for nullary expressions.
<!-- 
Thanks for contributing a merge request!

We recommend that first-time contributors read our [contribution guidelines](https://eigen.tuxfamily.org/index.php?title=Contributing_to_Eigen).

Before submitting the MR, please complete the following checks:
- Create one PR per feature or bugfix,
- Run the test suite to verify your changes.
  See our [test guidelines](https://eigen.tuxfamily.org/index.php?title=Tests).
- Add tests to cover the bug addressed or any new feature.
- Document new features.  If it is a substantial change, add it to the [Changelog](https://gitlab.com/libeigen/eigen/-/blob/master/CHANGELOG.md).
- Leave the following box checked when submitting: `Allow commits from members who can merge to the target branch`.
  This allows us to rebase and merge your change.

Note that we are a team of volunteers; we appreciate your patience during the review process.
-->

### Description
<!--Please explain your changes.-->

Fix doc references for nullary expressions.

### Reference issue
<!--
You can link to a specific issue using the gitlab syntax #<issue number>. 
If the MR fixes an issue, write "Fixes #<issue number>" to have the issue automatically closed on merge.
-->

Fixes #2997.

### Additional information
<!--Any additional information you think is important.-->

Closes #2997

See merge request libeigen/eigen!2054


(cherry picked from commit 04eb06b354)

31a2702e Fix doc references for nullary expressions.

Co-authored-by: Antonio Sánchez <cantonios@google.com>
2025-11-03 18:54:35 +00:00
Antonio Sánchez
691009cfa3 Allow user to configure if free is allowed at runtime.
<!--
Thanks for contributing a merge request!

We recommend that first-time contributors read our [contribution guidelines](https://eigen.tuxfamily.org/index.php?title=Contributing_to_Eigen).

Before submitting the MR, please complete the following checks:
- Create one PR per feature or bugfix,
- Run the test suite to verify your changes.
  See our [test guidelines](https://eigen.tuxfamily.org/index.php?title=Tests).
- Add tests to cover the bug addressed or any new feature.
- Document new features.  If it is a substantial change, add it to the [Changelog](https://gitlab.com/libeigen/eigen/-/blob/master/CHANGELOG.md).
- Leave the following box checked when submitting: `Allow commits from members who can merge to the target branch`.
  This allows us to rebase and merge your change.

Note that we are a team of volunteers; we appreciate your patience during the review process.
-->

### Description
<!--Please explain your changes.-->

Allow user to configure if `free` is allowed at runtime.

Reverts to Eigen 3.4 behavior by default, where `free(...)` is allowed if `EIGEN_RUNTIME_NO_MALLOC` is defined but `set_is_malloc_allowed(true)`.  Adds a separate `set_is_free_allowed(...)` to explicitly control use of `std::free`.

### Reference issue
<!--
You can link to a specific issue using the gitlab syntax #<issue number>.
If the MR fixes an issue, write "Fixes #<issue number>" to have the issue automatically closed on merge.
-->

Fixes #2983.

### Additional information
<!--Any additional information you think is important.-->

Closes #2983

See merge request libeigen/eigen!2047

(cherry picked from commit 60122df698)
2025-10-29 08:40:21 -07:00
Tyler Veness
a9110bfc87 Fix ambiguous sqrt() overload caused by ADL
Here's the compiler error:
```
/home/tav/git/Sleipnir/build/_deps/eigen3-src/Eigen/src/Householder/Householder.h:82:16: error: call of overloaded ‘sqrt(boost::decimal::decimal64_t)’ is ambiguous
   82 |     beta = sqrt(numext::abs2(c0) + tailSqNorm);
      |            ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/tav/git/Sleipnir/build/_deps/eigen3-src/Eigen/src/Householder/Householder.h:82:16: note: there are 2 candidates
In file included from /home/tav/git/Sleipnir/build/_deps/eigen3-src/Eigen/Core:198,
                 from /home/tav/git/Sleipnir/test/src/optimization/cart_pole_problem_test.cpp:8:
/home/tav/git/Sleipnir/build/_deps/eigen3-src/Eigen/src/Core/MathFunctions.h:1384:75: note: candidate 1: ‘typename Eigen::internal::sqrt_retval<typename Eigen::internal::global_math_functions_filtering_base<Scalar>::type>::type Eigen::numext::sqrt(const Scalar&) [with Scalar = boost::decimal::decimal64_t; typename Eigen::internal::sqrt_retval<typename Eigen::internal::global_math_functions_filtering_base<Scalar>::type>::type = boost::decimal::decimal64_t; typename Eigen::internal::global_math_functions_filtering_base<Scalar>::type = boost::decimal::decimal64_t]’
 1384 | EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE EIGEN_MATHFUNC_RETVAL(sqrt, Scalar) sqrt(const Scalar& x) {
      |                                                                           ^~~~
In file included from /home/tav/git/Sleipnir/build/_deps/decimal-src/include/boost/decimal/detail/cmath/ellint_1.hpp:16,
                 from /home/tav/git/Sleipnir/build/_deps/decimal-src/include/boost/decimal/cmath.hpp:18,
                 from /home/tav/git/Sleipnir/build/_deps/decimal-src/include/boost/decimal.hpp:33,
                 from /home/tav/git/Sleipnir/test/include/scalar_types_under_test.hpp:6,
                 from /home/tav/git/Sleipnir/test/src/optimization/cart_pole_problem_test.cpp:19:
/home/tav/git/Sleipnir/build/_deps/decimal-src/include/boost/decimal/detail/cmath/sqrt.hpp:167:16: note: candidate 2: ‘constexpr T boost::decimal::sqrt(T) requires  is_decimal_floating_point_v<T> [with T = decimal64_t]’
  167 | constexpr auto sqrt(const T val) noexcept
      |                ^~~~
```

Calling a function via its unqualified name invokes argument-dependent lookup. In this case, since `using numext::sqrt;` was used, both `numext::sqrt()` and `boost::decimal::sqrt()` participated in overload resolution. Since only `numext::sqrt()` was intended, the fix is to call that overload directly instead.

See merge request libeigen/eigen!2044

(cherry picked from commit be56fff1ff)
2025-10-27 09:49:29 -07:00
Antonio Sánchez
da889c88f9 Clarify range spanning major versions only works with 3.4.1.
<!--
Thanks for contributing a merge request!

We recommend that first-time contributors read our [contribution guidelines](https://eigen.tuxfamily.org/index.php?title=Contributing_to_Eigen).

Before submitting the MR, please complete the following checks:
- Create one PR per feature or bugfix,
- Run the test suite to verify your changes.
  See our [test guidelines](https://eigen.tuxfamily.org/index.php?title=Tests).
- Add tests to cover the bug addressed or any new feature.
- Document new features.  If it is a substantial change, add it to the [Changelog](https://gitlab.com/libeigen/eigen/-/blob/master/CHANGELOG.md).
- Leave the following box checked when submitting: `Allow commits from members who can merge to the target branch`.
  This allows us to rebase and merge your change.

Note that we are a team of volunteers; we appreciate your patience during the review process.
-->

### Description
<!--Please explain your changes.-->

Clarify range spanning major versions only works with 3.4.1.

### Reference issue
<!--
You can link to a specific issue using the gitlab syntax #<issue number>.
If the MR fixes an issue, write "Fixes #<issue number>" to have the issue automatically closed on merge.
-->

Fixes #2994.

Closes #2994

See merge request libeigen/eigen!2042

(cherry picked from commit 1a5eecd45e)
2025-10-27 09:49:14 -07:00
Antonio Sánchez
85e122408b Eliminate use of std::cout in ArpackSelfAdjointEigenSolver.
<!--
Thanks for contributing a merge request!

We recommend that first-time contributors read our [contribution guidelines](https://eigen.tuxfamily.org/index.php?title=Contributing_to_Eigen).

Before submitting the MR, please complete the following checks:
- Create one PR per feature or bugfix,
- Run the test suite to verify your changes.
  See our [test guidelines](https://eigen.tuxfamily.org/index.php?title=Tests).
- Add tests to cover the bug addressed or any new feature.
- Document new features.  If it is a substantial change, add it to the [Changelog](https://gitlab.com/libeigen/eigen/-/blob/master/CHANGELOG.md).
- Leave the following box checked when submitting: `Allow commits from members who can merge to the target branch`.
  This allows us to rebase and merge your change.

Note that we are a team of volunteers; we appreciate your patience during the review process.
-->

### Description
<!--Please explain your changes.-->

Eliminate use of std::cout in ArpackSelfAdjointEigenSolver.

Instead set the appropriate error status on failure.

### Reference issue
<!--
You can link to a specific issue using the gitlab syntax #<issue number>.
If the MR fixes an issue, write "Fixes #<issue number>" to have the issue automatically closed on merge.
-->

### Additional information
<!--Any additional information you think is important.-->

See merge request libeigen/eigen!2041

(cherry picked from commit b4209fe984)
2025-10-27 09:49:02 -07:00
Tyler Veness
5aec73ab06 Fix SparseVector::insertBack() with custom scalar types
It fixes this compiler error:
```
/home/tav/git/Sleipnir/build/_deps/eigen3-src/Eigen/src/SparseCore/SparseVector.h:143:19: error: cannot convert ‘int’ to ‘const Eigen::internal::CompressedStorage<boost::decimal::decimal64_t, int>::Scalar&’ {aka ‘const boost::decimal::decimal64_t&’}
  143 |     m_data.append(0, i);
      |                   ^
      |                   |
      |                   int
```

This change matches what SparseMatrix does:
https://gitlab.com/libeigen/eigen/-/blob/master/Eigen/src/SparseCore/SparseMatrix.h#L430-L438

See merge request libeigen/eigen!2040

(cherry picked from commit ac3ef16f30)
2025-10-27 09:48:45 -07:00
Charles Schlosser
9071c1cd07 CI enhancements: visual indication of flaky tests
<!--
Thanks for contributing a merge request! Please name and fully describe your MR as you would for a commit message.
If the MR fixes an issue, please include "Fixes #issue" in the commit message and the MR description.

In addition, we recommend that first-time contributors read our [contribution guidelines](https://eigen.tuxfamily.org/index.php?title=Contributing_to_Eigen) and [git page](https://eigen.tuxfamily.org/index.php?title=Git), which will help you submit a more standardized MR.

Before submitting the MR, you also need to complete the following checks:
- Make one PR per feature/bugfix (don't mix multiple changes into one PR). Avoid committing unrelated changes.
- Rebase before committing
- For code changes, run the test suite (at least the tests that are likely affected by the change).
  See our [test guidelines](https://eigen.tuxfamily.org/index.php?title=Tests).
- If possible, add a test (both for bug-fixes as well as new features)
- Make sure new features are documented

Note that we are a team of volunteers; we appreciate your patience during the review process.

Again, thanks for contributing! -->

### Reference issue
<!-- You can link to a specific issue using the gitlab syntax #<issue number>  -->

### What does this implement/fix?
<!--Please explain your changes.-->

Currently, we run each test 3 times to account for flaky tests. Sometimes, the test fails so quickly that the random seed is the same for the subsequent test, which fails the exact same way.

This MR uses a nanosecond seed which resolves the issue described above. Now, if the test does not pass on the first attempt but passes on the retries, the gitlab job status will be yellow but still be treated as a pass in the ci/cd pipeline. Hopefully, this means we will get more passes and help us identify room for improvement.

### Additional information
<!--Any additional information you think is important.-->

See merge request libeigen/eigen!2025

(cherry picked from commit 40da5b64ce)
2025-10-27 09:48:36 -07:00
Antonio Sánchez
41e848c558 Support AVX for i686.
<!--
Thanks for contributing a merge request!

We recommend that first-time contributors read our [contribution guidelines](https://eigen.tuxfamily.org/index.php?title=Contributing_to_Eigen).

Before submitting the MR, please complete the following checks:
- Create one PR per feature or bugfix,
- Run the test suite to verify your changes.
  See our [test guidelines](https://eigen.tuxfamily.org/index.php?title=Tests).
- Add tests to cover the bug addressed or any new feature.
- Document new features.  If it is a substantial change, add it to the [Changelog](https://gitlab.com/libeigen/eigen/-/blob/master/CHANGELOG.md).
- Leave the following box checked when submitting: `Allow commits from members who can merge to the target branch`.
  This allows us to rebase and merge your change.

Note that we are a team of volunteers; we appreciate your patience during the review process.
-->

### Description
<!--Please explain your changes.-->

Support AVX for i686.

There was an existing work-around for windows.  Added the more generic
architecture comparison to also apply for linux.

### Reference issue
<!--
You can link to a specific issue using the gitlab syntax #<issue number>.
If the MR fixes an issue, write "Fixes #<issue number>" to have the issue automatically closed on merge.
-->

Fixes #2991.

Closes #2991

See merge request libeigen/eigen!2037

(cherry picked from commit 8e60d4173c)
2025-10-27 09:48:15 -07:00
Antonio Sánchez
66375a8dc9 Fix commit references in changelog.
(cherry picked from commit f5907c5930)
2025-10-27 09:48:01 -07:00
Antonio Sanchez
076e524362 Try disabling the cache again for ROCm.
(cherry picked from commit 73da4623b1)
2025-10-27 09:47:47 -07:00
Saran Tunyasuvunakool
55d059108e Add a missing #include <version> to Core.
(cherry picked from commit db02f97850)
2025-10-27 09:47:32 -07:00
Antonio Sánchez
a5c3f697fa Fix DLL builds and c++ lapack declarations.
(cherry picked from commit e1f1a608be)
2025-10-27 09:47:17 -07:00
Antonio Sanchez
bdacccda15 Grammar fix "must has" --> "must have".
(cherry picked from commit 52358cb93b)
2025-10-27 09:47:04 -07:00
Antonio Sánchez
c9c2c1300a Disable ROCm job cache.
(cherry picked from commit 3bd0bfe0e0)
2025-10-27 09:46:47 -07:00
Charlie Schlosser
9ad6809b32 assume_aligned uses bytes not bits
(cherry picked from commit cd4f989f8f)
2025-10-27 09:46:30 -07:00
Antonio Sánchez
4f240eee3f Add a bunch of useful scripts for planning releases.
(cherry picked from commit ac7c192e1b)
2025-10-27 09:46:15 -07:00
Damiano Franzò
0f80c3d7e5 Fix jacobi svd for TriangularBase
(cherry picked from commit 5bc944a3ef)
2025-10-27 09:46:04 -07:00
Antonio Sánchez
e2e711aabe Fix BLAS/LAPACK DLL usage on Windows.
(cherry picked from commit dbe9e6961e)
2025-10-27 09:45:51 -07:00
Antonio Sánchez
6c1a886042 Add workaround for using std::fma for scalar multiply-add.
(cherry picked from commit ef3c5c1d1d)
2025-10-27 09:45:41 -07:00
Charles Schlosser
a34d8eee5c Fix alignment bug in avx pcast<Packet4l, Packet4d>
(cherry picked from commit 5996176b88)
2025-10-27 09:45:26 -07:00
Laurenz
92d5da40ac Fix SSE PacketMath Compilation Error on QNX
(cherry picked from commit 4bd382df56)
2025-10-27 09:45:08 -07:00
Charles Schlosser
b5848287be fix errors in windows builds and tests
(cherry picked from commit 13bd14974d)
2025-10-27 09:44:55 -07:00
Charles Schlosser
0ea30a44f3 get rid of a bunch of windows jobs
(cherry picked from commit f9f515fb55)
2025-10-27 09:43:13 -07:00
Antonio Sánchez
4abf3bd540 Update dev version number.
(cherry picked from commit ccde35bcd5)
2025-10-27 09:40:18 -07:00
Sergiu Deitsch
b89b549f96 Eliminate possible -Wstringop-overflow warning in .setZero()
(cherry picked from commit 32b0f386bc)
2025-10-27 09:39:01 -07:00
Antonio Sanchez
be7d8d37f2 Fix line-endings for MSVC files. 2025-10-27 09:37:58 -07:00
Jeremy Nimmer
b27f784ca5 Fix scalar_inner_product_op when binary ops return a different type 2025-10-06 18:19:59 +00:00
Guilhem Saurel
c08497ae1c tests: add missing link
(cherry picked from commit a67f9dabb0)
2025-10-02 10:10:05 -07:00
Antonio Sánchez
514221aee5 Update geo_homogeneous test, add eval() to PermutationMatrix.
(cherry picked from commit 4916887f2c)
2025-10-02 10:09:37 -07:00
Eugene Zhulenev
b60f763ec0 The 'CompressedStorageIterator<>' needs to satisfy the RandomAccessIterator
(cherry picked from commit 5c1029be1a)
2025-10-02 10:08:49 -07:00
Antonio Sanchez
63b5f63a6a Enable docs for the 5.0 branch on push. 2025-10-01 09:01:44 -07:00
Antonio Sanchez
549bf8c75b Add 5.0 changelog. 2025-09-28 00:24:17 -07:00
Charlie Schlosser
151b95d078 bump to 5.0.0 2025-09-28 00:24:17 -07:00
67 changed files with 3029 additions and 1786 deletions

View File

@@ -7,6 +7,10 @@
# Public License v. 2.0. If a copy of the MPL was not distributed
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
default:
# automatically cancels a job when a new pipeline for the same branch is triggered
interruptible: true
stages:
- checkformat
- build

View File

@@ -1,10 +1,51 @@
# Changelog
## [Unreleased]
## [5.0.1] - 2025-11-11
## [3.4.0]
A few bug-fixes from the master branch, including
- Dirty git state [#2995]
- Failing geo_homogeneous tests [#2977]
- Alignment issues [#2982, #2984]
- Missing C++20 `<version>` header [#2986]
- BLAS/LAPACK build on windows [#2980]
Released on August 18, 2021
See the full lists of [addressed bugs](https://gitlab.com/libeigen/eigen/-/issues?state=all&label_name%5B%5D=release%3A%3A5.0.1) and [merge requests](https://gitlab.com/libeigen/eigen/-/merge_requests?state=all&label_name%5B%5D=release%3A%3A5.0.1) for more details.
## [5.0.0] - 2025-09-30
Eigen 5.0 provides many new features, performance enhancements, and bugfixes throughout Eigens core template expression infrastructure and linear algebra facilities. The full set of changes and related issues are too large to list here, but can be accessed via the release milestone %"5.0".
This is the last major release to support the C++14 language standard. The master branch and subsequent releases will require support for C++17.
### Versioning
This release marks a transition to [Semantic Versioning](https://semver.org/). Previously, Eigen used a WORLD.MAJOR.MINOR scheme. From now on, version numbers will follow the MAJOR.MINOR.PATCH format, indicating breaking changes, new features, and bug fixes, respectively. The WORLD version will remain 3 for this and subsequent releases for posterity. See the table below:
```
╔═════════╦═════╦═════╗
║ Release ║ 3.4 ║ 5.0 ║
╠═════════╬═════╬═════╣
║ WORLD ║ 3 ║ 3 ║
║ MAJOR ║ 4 ║ 5 ║
║ MINOR ║ 0 ║ 0 ║
║ PATCH ║ - ║ 0 ║
╚═════════╩═════╩═════╝
```
### Breaking changes
* Eigen 5.X.X requires C++14. When building with GNU-compatible compilers, set `-std=c++14` or later. As part of this change, some macros such as `EIGEN_HAS_CXX11` have also been removed.
* The CMake build system has been modernized and older properties have been removed - projects relying on CMake may need to update their configurations [!485].
* All LGPL-licensed code has been removed (i.e. Constrained Conjugate Gradient) [!1197]. These were "unsupported" anyways, and weren't widely used.
* Due to name conflicts with other projects, `Eigen::all` and `Eigen::last` have been moved to `Eigen::placeholders::all` and `Eigen::placeholders::last` [!649].
* Any direct inclusion of an internal header (i.e. under a `../src/..` path) will result in a compilation error [!631].
* Runtime SVD options for computing thin/full U/V have been deprecated: use compile-time options instead [!826].
* Scalar (i.e. non-vectorized) comparisons now return masks with values of `Scalar(1)` rather than having all bits set to avoid undefined behavior [!1862].
* BLAS return types have been changed for Eigen BLAS to `void` instead of `int` for compatibility with other BLAS implementations [!1497].
* `Eigen::aligned_allocator` no longer inherits from `std::allocator` due to a change in the standard and the use of `allocate_at_least` [!1795].
* Euler angles are now returned in a more canonical form, potentially resulting in a change of behavior [!1301, !1314].
* Eigen's random number generation has changed, resulting in a change of behavior. Please do not rely on specific random numbers from Eigen - these were never guaranteed to be consistent across Eigen versions, nor are they generally consistent across platforms [!1437].
## [3.4.0] - 2021-08-18
**Notice:** 3.4.x will be the last major release series of Eigen that will support c++03.
@@ -160,9 +201,7 @@ Released on August 18, 2021
See the [announcement](https://www.eigen.tuxfamily.org/index.php?title=3.4) for more details.
## [3.3.9]
Released on December 4, 2020.
## [3.3.9] - 2020-12-04
Changes since 3.3.8:
@@ -175,9 +214,7 @@ Changes since 3.3.8:
* #2012: Define coeff-wise binary array operators for base class to fix an issue when using Eigen with C++20
* Commit bfdd4a990: Fix an issue with Intel® MKL PARDISO support.
## [3.3.8]
Released on October 5, 2020.
## [3.3.8] - 2020-10-05
Changes since 3.3.7:
@@ -243,9 +280,7 @@ Changes since 3.3.7:
* Commit 6c4d57dc9: Fix a gcc7 warning about bool * bool in abs2 default implementation.
* Commit 89a86ed42: Fix a warning in SparseSelfAdjointView about a branch statement always evaluation to false.
## [3.3.8-rc1]
Released on September 14, 2020.
## [3.3.8-rc1] - 2020-09-14
Changes since 3.3.7:
@@ -308,137 +343,129 @@ Changes since 3.3.7:
* Commit 89a86ed42: Fix a warning in SparseSelfAdjointView about a branch statement always evaluation to false.
* Commit dd6de618: Fix a bug with half-precision floats on GPUs.
## [3.3.7]
Released on December 11, 2018.
## [3.3.7] - 2018-12-11
¸¸¸¸
Changes since 3.3.6:
* #1643: Fix compilation with GCC>=6 and compiler optimization turned off.
## [3.3.6]
Released on December 10, 2018.
## [3.3.6] - 2018-12-10
Changes since 3.3.5:
* #1617: Fix triangular solve crashing for empty matrix.
* #785: Make dense Cholesky decomposition work for empty matrices.
* #1634: Remove double copy in move-ctor of non movable Matrix/Array.
* Changeset 588e1eb34eff: Workaround weird MSVC bug.
* Changeset a2d6c106a450: Workaround weird MSVC bug.
* #1637 Workaround performance regression in matrix products with gcc>=6 and clang>=6.0.
* Changeset bf0f100339c1: Fix some implicit 0 to Scalar conversions.
* Changeset 9ccbaaf3dd4c: Fix some implicit 0 to Scalar conversions.
* #1605: Workaround ABI issue with vector types (aka `__m128`) versus scalar types (aka float).
* Changeset d1421c479baa: Fix for gcc<4.6 regarding usage of #pragma GCC diagnostic push/pop.
* Changeset c20b83b9d736: Fix conjugate-gradient for right-hand-sides with a very small magnitude.
* Changeset 281a877a3bf7: Fix product of empty arrays (returned 0 instead of 1).
* Changeset 148e579cc004: Fix for gcc<4.6 regarding usage of #pragma GCC diagnostic push/pop.
* Changeset bc000deaae45: Fix conjugate-gradient for right-hand-sides with a very small magnitude.
* Changeset 5be00b0e2964: Fix product of empty arrays (returned 0 instead of 1).
* #1590: Fix collision with some system headers defining the macro FP32.
* #1584: Fix possible undefined behavior in random generation.
* Changeset d632d18db8ca: Fix fallback to BLAS for rankUpdate.
* Changeset e4127b0f7d3b: Fix fallback to BLAS for rankUpdate.
* Fixes for NVCC 9.
* Fix matrix-market IO.
* Various fixes in the doc.
* Various minor warning fixes/workarounds.
## [3.3.5]
Released on July 23, 2018.
## [3.3.5] - 2018-07-23
Changes since 3.3.4:
* General bug fixes:
* Fix GeneralizedEigenSolver when requesting for eigenvalues only (0d15855abb30)
* #1560 fix product with a 1x1 diagonal matrix (90d7654f4a59)
* Fix GeneralizedEigenSolver when requesting for eigenvalues only (ab3fa2e12308)
* #1560 fix product with a 1x1 diagonal matrix (483beabab9bf)
* #1543: fix linear indexing in generic block evaluation
* Fix compilation of product with inverse transpositions (e.g., `mat * Transpositions().inverse()`) (14a13748d761)
* #1509: fix `computeInverseWithCheck` for complexes (8be258ef0b6d)
* #1521: avoid signalling `NaN` in hypot and make it std::complex<> friendly (a9c06b854991).
* #1517: fix triangular product with unit diagonal and nested scaling factor: `(s*A).triangularView<UpperUnit>()*B` (a546d43bdd4f)
* Fix compilation of stableNorm for some odd expressions as input (499e982b9281)
* #1485: fix linking issue of non template functions (ae28c2aaeeda)
* Fix overflow issues in BDCSVD (92060f82e1de)
* #1468: add missing `std::` to `memcpy` (4565282592ae)
* #1453: fix Map with non-default inner-stride but no outer-stride (af00212cf3a4)
* Fix mixing types in sparse matrix products (7e5fcd0008bd)
* #1544: Generate correct Q matrix in complex case (c0c410b508a1)
* #1461: fix compilation of `Map<const Quaternion>::x()` (69652a06967d)
* Fix compilation of product with inverse transpositions (e.g., `mat * Transpositions().inverse()`) (170914dbbcc3)
* #1509: fix `computeInverseWithCheck` for complexes (a2a2c3c86507)
* #1521: avoid signalling `NaN` in hypot and make it std::complex<> friendly (b18e2d422b09).
* #1517: fix triangular product with unit diagonal and nested scaling factor: `(s*A).triangularView<UpperUnit>()*B` (c24844195d90)
* Fix compilation of stableNorm for some odd expressions as input (33b972d8b384)
* #1485: fix linking issue of non template functions (d18877f18d8e)
* Fix overflow issues in BDCSVD (7a875acfb05f)
* #1468: add missing `std::` to `memcpy` (32a6db0f8cd5)
* #1453: fix Map with non-default inner-stride but no outer-stride (1ca9072b51d8)
* Fix mixing types in sparse matrix products (4ead16cdd6c8)
* #1544: Generate correct Q matrix in complex case (39125654ce9e)
* #1461: fix compilation of `Map<const Quaternion>::x()` (9a266e5118cf)
* Backends:
* Fix MKL backend for symmetric eigenvalues on row-major matrices (4726d6a24f69)
* #1527: fix support for MKL's VML (972424860545)
* Fix incorrect ldvt in LAPACKE call from JacobiSVD (88c4604601b9)
* Fix support for MKL's BLAS when using `MKL_DIRECT_CALL` (205731b87e19, b88c70c6ced7, 46e2367262e1)
* Use MKL's lapacke.h header when using MKL (19bc9df6b726)
* Fix MKL backend for symmetric eigenvalues on row-major matrices (eab7afe25273)
* #1527: fix support for MKL's VML (86a939451c75)
* Fix incorrect ldvt in LAPACKE call from JacobiSVD (bfc66e8b9a3b)
* Fix support for MKL's BLAS when using `MKL_DIRECT_CALL` (9df7f3d8e9cd, 3108fbf76708, 292dea7922e7)
* Use MKL's lapacke.h header when using MKL (070b5958e0ae)
* Diagnostics:
* #1516: add assertion for out-of-range diagonal index in `MatrixBase::diagonal(i)` (783d38b3c78c)
* Add static assertion for fixed sizes `Ref<>` (e1203d5ceb8e)
* Add static assertion on selfadjoint-view's UpLo parameter. (b84db94c677e, 0ffe8a819801)
* #1479: fix failure detection in LDLT (67719139abc3)
* #1516: add assertion for out-of-range diagonal index in `MatrixBase::diagonal(i)` (273738ba6f6e)
* Add static assertion for fixed sizes `Ref<>` (1724dae8b834)
* Add static assertion on selfadjoint-view's UpLo parameter. (74daf12e525e, 190b46dd1f05)
* #1479: fix failure detection in LDLT (c20043c8fd64)
* Compiler support:
* #1555: compilation fix with XLC
* Workaround MSVC 2013 ambiguous calls (1c7b59b0b5f4)
* Adds missing `EIGEN_STRONG_INLINE` to help MSVC properly inlining small vector calculations (1ba3f10b91f2)
* Several minor warning fixes: 3c87fc0f1042, ad6bcf0e8efc, "used uninitialized" (20efc44c5500), Wint-in-bool-context (131da2cbc695, b4f969795d1b)
* #1428: make NEON vectorization compilable by MSVC. (* 3d1b3dbe5927, 4e1b7350182a)
* Fix compilation and SSE support with PGI compiler (faabf000855d 90d33b09040f)
* #1555: compilation fix with XLC (23eb37691f14)
* #1520: workaround some `-Wfloat-equal` warnings by calling `std::equal_to` (7d9a9456ed7c)
* Make the TensorStorage class compile with clang 3.9 (eff7001e1f0a)
* Misc: some old compiler fixes (493691b29be1)
* Fix MSVC warning C4290: C++ exception specification ignored except to indicate a function is not `__declspec(nothrow)` (524918622506)
* Workaround MSVC 2013 ambiguous calls (c92536d92647)
* Adds missing `EIGEN_STRONG_INLINE` to help MSVC properly inlining small vector calculations (01fb6217335b)
* Several minor warning fixes: f90d136c8445, 542fb03968c2, "used uninitialized" (7634a44bfe11), Wint-in-bool-context (3d1795da28c2, d1c2d6683c55)
* #1428: make NEON vectorization compilable by MSVC. (* 1e2d2693b911, 927d023ceaab)
* Fix compilation and SSE support with PGI compiler (bb87f618bfc3 450c5e5d2771)
* #1555: compilation fix with XLC (20ca86888e70)
* #1520: workaround some `-Wfloat-equal` warnings by calling `std::equal_to` (1c4fdad7bd6f)
* Make the TensorStorage class compile with clang 3.9 (a7144f8d6a94)
* Misc: some old compiler fixes (b60cbbef3791)
* Fix MSVC warning C4290: C++ exception specification ignored except to indicate a function is not `__declspec(nothrow)` (3df78d5afc1e)
* Architecture support:
* Several AVX512 fixes for `log`, `sqrt`, `rsqrt`, non `AVX512ER` CPUs, `apply_rotation_in_the_plane` b64275e912ba cab3d626a59e 7ce234652ab9, d89b9a754371.
* AltiVec fixes: 9450038e380d
* NEON fixes: const-cast (e8a69835ccda), compilation of Jacobi rotations (c06cfd545b15,#1436).
* Changeset d0658cc9d4a2: Define `pcast<>` for SSE types even when AVX is enabled. (otherwise float are silently reinterpreted as int instead of being converted)
* #1494: makes `pmin`/`pmax` behave on Altivec/VSX as on x86 regarding NaNs (d0af83f82b19)
* Several AVX512 fixes for `log`, `sqrt`, `rsqrt`, non `AVX512ER` CPUs, `apply_rotation_in_the_plane` 5c59564bfb92 1939c971a3db c2f9e6cb37e5, 609e425166f6.
* AltiVec fixes: 1641a6cdd5a4
* NEON fixes: const-cast (877a2b64c9ba), compilation of Jacobi rotations (bc837b797559,#1436).
* Changeset 971b32440c74: Define `pcast<>` for SSE types even when AVX is enabled. (otherwise float are silently reinterpreted as int instead of being converted)
* #1494: makes `pmin`/`pmax` behave on Altivec/VSX as on x86 regarding NaNs (892c0a79ce93)
* Documentation:
* Update manual pages regarding BDCSVD (#1538)
* Add aliasing in common pitfaffs (2a5a8408fdc5)
* Update `aligned_allocator` (21e03aef9f2b)
* #1456: add perf recommendation for LLT and storage format (c8c154ebf130, 9aef1e23dbe0)
* #1455: Cholesky module depends on Jacobi for rank-updates (2e6e26b851a8)
* #1458: fix documentation of LLT and LDLT `info()` method (2a4cf4f473dd)
* Warn about constness in `LLT::solveInPlace` (518f97b69bdf)
* Fix lazyness of `operator*` with CUDA (c4dbb556bd36)
* #336: improve doc for `PlainObjectBase::Map` (13dc446545fe)
* Add aliasing in common pitfaffs (656712d48f6b)
* Update `aligned_allocator` (6fc0f2be70a4)
* #1456: add perf recommendation for LLT and storage format (55fbf4fedd04, 9fd138e2b333)
* #1455: Cholesky module depends on Jacobi for rank-updates (b87875abf8dc)
* #1458: fix documentation of LLT and LDLT `info()` method (ac2c97edff07)
* Warn about constness in `LLT::solveInPlace` (51e1aa153957)
* Fix lazyness of `operator*` with CUDA (fa77d713359d)
* #336: improve doc for `PlainObjectBase::Map` (18868228adae)
* Other general improvements:
* Enable linear indexing in generic block evaluation (31537598bf83, 5967bc3c2cdb, #1543).
* Fix packet and alignment propagation logic of `Block<Xpr>` expressions. In particular, `(A+B).col(j)` now preserve vectorisation. (b323cc9c2c7f)
* Several fixes regarding custom scalar type support: hypot (f8d6c791791d), boost-multiprec (acb8ef9b2478), literal casts (6bbd97f17534, 39f65d65894f),
* LLT: avoid making a copy when decomposing in place (2f7e28920f4e), const the arg to `solveInPlace()` to allow passing `.transpose()`, `.block()`, etc. (c31c0090e998).
* Add possibility to overwrite `EIGEN_STRONG_INLINE` (7094bbdf3f4d)
* #1528: use `numeric_limits::min()` instead of `1/highest()` that might underflow (dd823c64ade7)
* #1532: disable `stl::*_negate` in C++17 (they are deprecated) (88e9452099d5)
* Add C++11 `max_digits10` for half (faf74dde8ed1)
* Make sparse QR result sizes consistent with dense QR (4638bc4d0f96)
* Enable linear indexing in generic block evaluation (15752027ec2f, 80af7d6a47c1, #1543).
* Fix packet and alignment propagation logic of `Block<Xpr>` expressions. In particular, `(A+B).col(j)` now preserve vectorisation. (9c9e90f6db7e)
* Several fixes regarding custom scalar type support: hypot (385d8b5e42c2), boost-multiprec (5f71579a2d3f), literal casts (e6577f3c3049, fbb0c510c52f),
* LLT: avoid making a copy when decomposing in place (9d03711df8bc), const the arg to `solveInPlace()` to allow passing `.transpose()`, `.block()`, etc. (0137ed4f19b6).
* Add possibility to overwrite `EIGEN_STRONG_INLINE` (6d6e5fcd4356)
* #1528: use `numeric_limits::min()` instead of `1/highest()` that might underflow (9ff315024335)
* #1532: disable `stl::*_negate` in C++17 (they are deprecated) (3fb42ff7b278)
* Add C++11 `max_digits10` for half (70ac6c923001)
* Make sparse QR result sizes consistent with dense QR (2136cfa17e28)
* Unsupported/unit-tests/cmake/unvisible internals/etc.
* #1484: restore deleted line for 128 bits long doubles, and improve dispatching logic. (dffc0f957f19)
* #1462: remove all occurences of the deprecated `__CUDACC_VER__` macro by introducing `EIGEN_CUDACC_VER` (a201b8438d36)
* Changeset 2722aa8eb93f: Fix oversharding bug in parallelFor.
* Changeset ea1db80eab46: commit 45e9c9996da790b55ed9c4b0dfeae49492ac5c46 (HEAD -> memory_fix)
* Changeset 350957be012c: Fix int versus Index
* Changeset 424038431015: fix linking issue
* Changeset 3f938790b7e0: Fix short vs long
* Changeset ba14974d054a: Fix cmake scripts with no fortran compiler
* Changeset 2ac088501976: add cmake-option to enable/disable creation of tests
* Changeset 56996c54158b: Use col method for column-major matrix
* Changeset 762373ca9793: #1449: fix `redux_3` unit test
* Changeset eda96fd2fa30: Fix uninitialized output argument.
* Changeset 75a12dff8ca4: Handle min/max/inf/etc issue in `cuda_fp16.h` directly in `test/main.h`
* Changeset 568614bf79b8: Add tests for sparseQR results (value and size) covering bugs 1522 and 1544
* Changeset 12c9ece47d14: `SelfAdjointView<...,Mode>` causes a static assert since commit c73a77e47db8
* Changeset 899fd2ef704f: weird compilation issue in `mapped_matrix.cpp`
* #1484: restore deleted line for 128 bits long doubles, and improve dispatching logic. (c8e663fe87ec)
* #1462: remove all occurences of the deprecated `__CUDACC_VER__` macro by introducing `EIGEN_CUDACC_VER` (e7c065ec717b)
* Changeset fea50d40ea79: Fix oversharding bug in parallelFor.
* Changeset 866d222d6065: commit 45e9c9996da790b55ed9c4b0dfeae49492ac5c46 (HEAD -> memory_fix)
* Changeset 48048172e5aa: Fix int versus Index
* Changeset 906a98fe39c3: fix linking issue
* Changeset 352489edbe36: Fix short vs long
* Changeset 81e94eea024c: Fix cmake scripts with no fortran compiler
* Changeset 8bd392ca0e3f: add cmake-option to enable/disable creation of tests
* Changeset 02c0cef97fb5: Use col method for column-major matrix
* Changeset a8d2459f8e1f: #1449: fix `redux_3` unit test
* Changeset e90a14609a56: Fix uninitialized output argument.
* Changeset 5d40715db6a7: Handle min/max/inf/etc issue in `cuda_fp16.h` directly in `test/main.h`
* Changeset 2f9de522457b: Add tests for sparseQR results (value and size) covering bugs 1522 and 1544
* Changeset 4662c610c13c: `SelfAdjointView<...,Mode>` causes a static assert since commit d820ab9edc0b
* Changeset 96134409fc91: weird compilation issue in `mapped_matrix.cpp`
## [3.3.4]
Released on June 15, 2017.
## [3.3.4] - 2017-06-15
Changes since 3.3.3:
@@ -469,9 +496,7 @@ Changes since 3.3.3:
* Add specializations of `std::numeric_limits` for `Eigen::half` and and `AutoDiffScalar`
* Fix compilation of streaming nested Array, i.e., `std::cout << Array<Array<...>>`
## [3.3.3]
Released on February 21, 2017.
## [3.3.3] - 2017-02-21
Changes since 3.3.2:
@@ -502,10 +527,7 @@ Changes since 3.3.2:
* Fix usage of `size_t` instead of Index in sefl-adjoint `matrix * vector`
* #1378: fix doc (`DiagonalIndex` vs `Diagonal`).
## [3.3.2]
Released on January 18, 2017.
## [3.3.2] - 2017-01-18
Changes since 3.3.1:
* General:
@@ -535,9 +557,7 @@ Changes since 3.3.1:
* Fix some warnings with ICC, Power8, etc.
* Fix compilation with MSVC 2017
## [3.3.1]
Released on December 06, 2016.
## [3.3.1] - 2016-12-06
Changes since 3.3.0:
@@ -558,9 +578,7 @@ Changes since 3.3.0:
* Bugs #1346,#1347: make Eigen's installation relocatable.
* Fix some harmless compilation warnings.
## [3.3]
Released on November 10, 2016
## [3.3] - 2016-11-10
For a comprehensive list of change since the 3.2 series, see this [page](https://www.eigen.tuxfamily.org/index.php?title=3.3).
@@ -569,9 +587,7 @@ Main changes since 3.3-rc2:
* Fix regression in printing sparse expressions.
* Fix sparse solvers when using a SparseVector as the result and/or right-hand-side.
## [3.3-rc2]
Released on November 04, 2016
## [3.3-rc2] - 2016-11-04
For a comprehensive list of change since the 3.2 series, see this [page](https://www.eigen.tuxfamily.org/index.php?title=3.3).
@@ -600,9 +616,7 @@ Main changes since 3.3-rc1:
* SuiteSparse, fix SPQR for rectangular matrices
* Fix compilation of `qr.inverse()` for column and full pivoting variants
## [3.2.10]
Released on October 04, 2016
## [3.2.10] - 2016-10-04
Changes since 3.2.9:
@@ -621,9 +635,7 @@ Main fixes and improvements:
* #1249: disable the use of `__builtin_prefetch` for compilers other than GCC, clang, and ICC.
* #1265: fix doc of QR decompositions
## [3.3-rc1]
Released on September 22, 2016
## [3.3-rc1] - 2016-09-22
For a comprehensive list of change since the 3.2 series, see this [page](https://www.eigen.tuxfamily.org/index.php?title=3.3).
@@ -662,9 +674,7 @@ Main changes since 3.3-beta2:
* Fix vectorization logic for coeff-based product for some corner cases
* Bugs #1260, #1261, #1264: several fixes in AutoDiffScalar.
## [3.3-beta2]
Released on July 26, 2016
## [3.3-beta2] - 2016-08-26
For a comprehensive list of change since the 3.2 series, see this [page](https://www.eigen.tuxfamily.org/index.php?title=3.3).
@@ -687,7 +697,7 @@ Main changes since 3.3-beta1:
* #779: in `Map`, allows non aligned buffers for buffers smaller than the requested alignment.
* Add a complete orthogonal decomposition class: [CompleteOrthogonalDecomposition](http://eigen.tuxfamily.org/dox-devel/classEigen_1_1CompleteOrthogonalDecomposition.html)
* Improve robustness of JacoviSVD with complexes (underflow, noise amplification in complex to real conversion, compare off-diagonal entries to the current biggest diagonal entry instead of the global biggest, null inputs).
* Change Eigen's ColPivHouseholderQR to use a numerically stable norm downdate formula (changeset 9da6c621d055)
* Change Eigen's ColPivHouseholderQR to use a numerically stable norm downdate formula (changeset acce4dd0500f)
* #1214: consider denormals as zero in D&C SVD. This also workaround infinite binary search when compiling with ICC's unsafe optimizations.
* Add log1p for arrays.
* #1193: now `lpNorm<Infinity>` supports empty inputs.
@@ -710,7 +720,7 @@ Main changes since 3.3-beta1:
* Performance improvements:
* #256: enable vectorization with unaligned loads/stores. This concerns all architectures and all sizes. This new behavior can be disabled by defining `EIGEN_UNALIGNED_VECTORIZE=0`
* Add support for s390x(zEC13) ZVECTOR instruction set.
* Optimize mixing of real with complex matrices by avoiding a conversion from real to complex when the real types do not match exactly. (see bccae23d7018)
* Optimize mixing of real with complex matrices by avoiding a conversion from real to complex when the real types do not match exactly. (see 76faf4a9657e)
* Speedup square roots in performance critical methods such as norm, normalize(d).
* #1154: use dynamic scheduling for spmv products.
* #667, #1181: improve perf with MSVC and ICC through `FORCE_INLINE`
@@ -800,9 +810,7 @@ Main changes since 3.3-beta1:
* #1249: fix compilation with compilers that do not support `__builtin_prefetch` .
* #1250: fix `pow()` for `AutoDiffScalar` with custom nested scalar type.
## [3.2.9]
Released on July 18, 2016
## [3.2.9] - 2016-08-18
Changes since 3.2.8:
@@ -836,10 +844,7 @@ Changes since 3.2.8:
* #1221: shutdown some GCC6's warnings.
* #1175: fix index type conversion warnings in sparse to dense conversion.
## [3.2.8]
Released on February 16, 2016
## [3.2.8] - 2016-02-16
Changes since 3.2.7:
* Main fixes and improvements:
@@ -869,9 +874,7 @@ Changes since 3.2.7:
* Some warning fixes.
* Several other documentation clarifications.
## [3.3-beta1]
Released on December 16, 2015
## [3.3-beta1] - 2015-12-16
For a comprehensive list of change since the 3.2 series, see this [page](https://www.eigen.tuxfamily.org/index.php?title=3.3).
@@ -906,7 +909,7 @@ Main changes since 3.3-alpha1:
* Add temporary-free evaluation of `D.nolias() *= C + A*B`.
* Add vectorization of round, ceil and floor for SSE4.1/AVX.
* Optimize assignment into a `Block<SparseMatrix>` by using Ref and avoiding useless updates in non-compressed mode. This make row-by-row filling of a row-major sparse matrix very efficient.
* Improve internal cost model leading to faster code in some cases (see changeset 1bcb41187a45).
* Improve internal cost model leading to faster code in some cases (see changeset 77ff3386b7d2).
* #1090: improve redux evaluation logic.
* Enable unaligned vectorization of small fixed size matrix products.
@@ -938,9 +941,7 @@ Main changes since 3.3-alpha1:
* Fix ICE with VC2015 Update1.
* Improve cmake install scripts.
## [3.2.7]
Released on November 5, 2015
## [3.2.7] - 2015-11-05
Changes since 3.2.6:
@@ -966,9 +967,7 @@ Changes since 3.2.6:
* unsupported/ArpackSupport is now properly installed by make install.
* #1080: warning fixes
## [3.2.6]
Released on October 1, 2015
## [3.2.6] - 2015-10-01
Changes since 3.2.5:
@@ -984,15 +983,11 @@ Changes since 3.2.5:
* MKL: fix support for the 11.2 version, and fix a naming conflict (#1067)
* #1033: explicit type conversion from 0 to RealScalar
## [3.3-alpha1]
Released on September 4, 2015
## [3.3-alpha1] - 2015-09-04
See the [announcement](https://www.eigen.tuxfamily.org/index.php?title=3.3).
## [3.2.5]
Released on June 16, 2015
## [3.2.5] - 2015-06-16
Changes since 3.2.4:
@@ -1036,9 +1031,7 @@ Changes since 3.2.4:
* #1012: enable alloca on Mac OS or if alloca is defined as macro
* Doc and build system: #733, #914, #952, #961, #999
## [3.2.4]
Released on January 21, 2015
## [3.2.4] - 2015-01-21
Changes since 3.2.3:
@@ -1047,9 +1040,7 @@ Changes since 3.2.3:
* #921: fix utilization of bitwise operation on enums in `first_aligned`.
* Fix compilation with NEON on some platforms.
## [3.2.3]
Released on December 16, 2014
## [3.2.3] - 2014-12-16
Changes since 3.2.2:
@@ -1088,9 +1079,7 @@ Changes since 3.2.2:
* #861: enable posix_memalign with PGI.
* Fix BiCGSTAB doc example.
## [3.2.2]
Released on August 4, 2014
## [3.2.2] - 2014-08-04
Changes since 3.2.1:
@@ -1134,9 +1123,7 @@ Changes since 3.2.1:
* #632: doc: Note that `dm2 = sm1 + dm1` is not possible
* Extend AsciiQuickReference (real, imag, conjugate, rot90)
## [3.2.1]
Released on February 26, 2014
## [3.2.1] - 2014-02-26
Changes since 3.2.0:
@@ -1181,9 +1168,7 @@ Changes since 3.2.0:
* Fix a few compiler warnings (bug #317 and more).
* Documentation fixes (bugs #609, #638 and #739 and more).
## [3.1.4]
Released on August 02, 2013
## [3.1.4] - 2013-08-02
Changes since 3.1.3:
@@ -1196,18 +1181,14 @@ Changes since 3.1.3:
* Fix a few warnings and compilation issues with recent compiler versions.
* Documentation fixes.
## [3.0.7]
Released on August 02, 2013
## [3.0.7] - 2013-08-02
Changes since 3.0.6:
* Fix traits of `Map<Quaternion>`.
* Fix a few warnings (#507) and documentation (#531).
## [3.2.0]
Released on July 24, 2013.
## [3.2.0] - 2013-07-24
Major new features and optimizations since 3.1:
@@ -1234,18 +1215,14 @@ Major new features and optimizations since 3.1:
Eigen 3.2 represents about 600 commits since Eigen 3.1.
## [3.2-rc2]
Released on July 19, 2013.
## [3.2-rc2] - 2013-07-19
Changes since 3.2-rc1:
* Rename `DenseBase::isFinite()` to `allFinite()` to avoid a future naming collision.
* Fix an ICE with ICC 11.1.
## [3.2-rc1]
Released on July 17, 2013.
## [3.2-rc1] - 2013-07-17
Main changes since 3.2-beta1:
* New features:
@@ -1290,10 +1267,7 @@ Main changes since 3.2-beta1:
* Fix many warnings and compilation issues with recent compiler versions.
* Many other fixes including #230, #482, #542, #561, #564, #565, #566, #578, #581, #595, #597, #598, #599, #605, #606, #615.
## [3.1.3]
Released on April 16, 2013
## [3.1.3] - 2013-04-16
Changes since 3.1.2:
* #526 - Fix linear vectorized transversal in linspace.
@@ -1310,9 +1284,7 @@ Changes since 3.1.2:
* Enable SSE with ICC even when it mimics a gcc version lower than 4.2
* Workaround [gcc-4.7 bug #53900](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53900) (too aggressive optimization in our alignment check)
## [3.2-beta1]
Released on March 07, 2013
## [3.2-beta1] - 2013-03-07
Main changes since 3.1:
@@ -1338,9 +1310,7 @@ Main changes since 3.1:
* New compilation token `EIGEN_INITIALIZE_MATRICES_BY_NAN` to help debugging.
* All bug fixes of the 3.1 branch, plus a couple of other fixes (including 211, 479, 496, 508, 552)
## [3.1.2]
Released on Nov 05, 2012
## [3.1.2] - 2012-11-05
Changes since 3.1.1:
@@ -1364,9 +1334,7 @@ Changes since 3.1.1:
* Remove stupid assert in blue norm.
* Workaround a weird compilation error with MSVC.
## [3.1.1]
Released on July 22, 2012
## [3.1.1] - 2012-07-22
Changes since 3.1.0:
* [relicense to MPL2](https://www.eigen.tuxfamily.org/index.php?title=Main_Page#License)
@@ -1382,10 +1350,7 @@ Changes since 3.1.0:
* Fixed Geometry module compilation under MSVC
* Fixed Sparse module compilation under MSVC 2005
## [3.0.6]
Released on July 9, 2012
## [3.0.6] - 2012-07-09
Changes since 3.0.5:
* #447 - fix infinite recursion in `ProductBase::coeff()`
* #478 - fix RealSchur on a zero matrix
@@ -1404,9 +1369,7 @@ Changes since 3.0.5:
* Fix typo in NumericalDiff (unsupported module)
* Fix LevenbergMarquart for non double scalar type (unsupported module)
## [3.1.0]
Released on June 24, 2012.
## [3.1.0] - 2012-06-24
Major changes between Eigen 3.0 and Eigen 3.1:
* New features
@@ -1429,9 +1392,7 @@ Major changes between Eigen 3.0 and Eigen 3.1:
Eigen 3.1 represents about 600 commits since Eigen 3.0.
## [3.1.0-rc2]
Released on June 21, 2012.
## [3.1.0-rc2] - 2012-06-21
Changes since 3.1.0-rc1:
* Fix a couple of compilation warnings
@@ -1440,9 +1401,7 @@ Changes since 3.1.0-rc1:
* #466: `RealSchur` failed on a zero matrix
* Update Adolc and MPReal support modules
## [3.1.0-rc1]
Released on June 14, 2012
## [3.1.0-rc1] - 2012-06-14
Main changes since 3.1.0-beta1:
* #466: fix a possible race condition issue. from now, multithreaded applications that call Eigen from multiple thread must initialize Eigen by calling `initParallel()`.
@@ -1454,9 +1413,7 @@ Main changes since 3.1.0-beta1:
* Fix ambiguous calls in the math functors
* Fix BTL interface.
## [3.1.0-beta1]
Released on June 7, 2012
## [3.1.0-beta1] - 2012-06-07
Main changes since 3.1.0-alpha2:
* **API changes**
@@ -1487,9 +1444,7 @@ Main changes since 3.1.0-alpha2:
* New tutorial page on Map
* and many other bug fixes such as: #417, #419, #450
## [3.0.5]
Released February 10, 2012
## [3.0.5] - 2012-02-10
Changes since 3.0.4:
* #417 - fix nesting of `Map` expressions
@@ -1503,9 +1458,7 @@ Changes since 3.0.4:
* Changeset 4432 - fix asserts in eigenvalue decompositions
* Changeset 4416 - fix MSVC integer overflow warning
## [3.1.0-alpha2]
Released February 6, 2012
## [3.1.0-alpha2] - 2012-02-06
Main changes since 3.0.1-alpha1:
* New optional support for Intel MKL and other BLAS including: ([details](http://eigen.tuxfamily.org/dox-devel/TopicUsingIntelMKL.html))
@@ -1532,9 +1485,7 @@ Main changes since 3.0.1-alpha1:
* and many other bug fixes such as: #406, #410, #398, #396, #394, #354, #352, #301,
## [3.1.0-alpha1]
Released December 6, 2011
## [3.1.0-alpha1] - 2011-12-06
Main changes since 3.0:
* Officially supported set of sparse modules. See this [page](http://eigen.tuxfamily.org/dox-devel/TutorialSparse.html) for an overview of the features. Main changes:
@@ -1555,11 +1506,7 @@ Main changes since 3.0:
* All the fixes and improvements of the 3.0 branch up to the 3.0.4 release (see below)
## [3.0.4]
Released December 6, 2011
## [3.0.4] - 2011-12-06
Changes since 3.0.3:
* #363 - check for integer overflow in size computations
@@ -1572,9 +1519,7 @@ Changes since 3.0.3:
* Fix compilation issue with `QuaternionBase::cast`
## [2.0.17]
Released December 6, 2011
## [2.0.17] - 2011-12-06
Changes since 2.0.16:
@@ -1582,9 +1527,7 @@ Changes since 2.0.16:
* Fix a typo in ParametrizedLine documentation
## [3.0.3]
Released October 6, 2011
## [3.0.3] - 2011-10-06
Changes since 3.0.2:
@@ -1596,9 +1539,7 @@ Changes since 3.0.2:
* Several improvements to the documentation.
## [3.0.2]
Released August 26, 2011
## [3.0.2] - 2011-08-26
Changes since 3.0.1:
@@ -1615,9 +1556,7 @@ Changes since 3.0.1:
* fix a few documentation issues.
## [3.0.1]
Released May 30, 2011
## [3.0.1] - 2011-05-30
Changes since 3.0.0:
@@ -1634,9 +1573,7 @@ Changes since 3.0.0:
* Fix Qt support in Transform.
* Improved documentation.
## [2.0.16]
Released May 28, 2011
## [2.0.16] - 2011-05-28
Changes since 2.0.15:
@@ -1647,18 +1584,16 @@ Changes since 2.0.15:
* New feature: support for `part<SelfAdjoint>`.
* Fix bug in SparseLU::setOrderingMethod.
## [3.0.0]
## [3.0.0] - 2011-03-19
Released March 19, 2011, at the [meeting](https://www.eigen.tuxfamily.org/index.php?title=Paris_2011_Meeting).
Released at the [meeting](https://www.eigen.tuxfamily.org/index.php?title=Paris_2011_Meeting).
See the [Eigen 3.0 release notes](https://www.eigen.tuxfamily.org/index.php?title=3.0).
Only change since 3.0-rc1:
* Fixed compilation of the unsupported 'openglsupport' test.
## [3.0-rc1]
Released March 14, 2011.
## [3.0-rc1] - 2011-03-14
Main changes since 3.0-beta4:
@@ -1677,9 +1612,7 @@ Main changes since 3.0-beta4:
* more compiler warnings fixes
* fixed GDB pretty-printer for dynamic-size matrices (#210)
## [3.0-beta4]
Released February 28, 2011.
## [3.0-beta4] - 2011-02-28
Main changes since 3.0-beta3:
@@ -1715,9 +1648,7 @@ Main changes since 3.0-beta3:
* misc documentation improvements
* improve documentation of plugins
## [3.0-beta3]
Released February 12, 2011.
## [3.0-beta3] - 2011-02-12
The biggest news is that the API is now **100% stable**.
@@ -1763,9 +1694,7 @@ Main changes since 3.0-beta2:
* imported a copy of the Eigen 2 test suite, made sure that Eigen 3 passes it. That also allowed to fix several issues.
## [3.0-beta2]
Released October 15, 2010.
## [3.0-beta2] - 2010-10-15
Main changes since 3.0-beta1:
@@ -1790,9 +1719,7 @@ Main changes since 3.0-beta1:
* Remove the Taucs backend (obsolete).
* Remove the old SVD class (was causing too much troubles, a new decompozition based on bidiagonalisation/householder should come back soon, `JacobiSVD` can be used meanwhile).
## [2.0.15]
Released July 16, 2010
## [2.0.15] - 2010-07-16
Changes since 2.0.14:
@@ -1803,15 +1730,11 @@ Changes since 2.0.14:
* Fix for ICC in SSE code.
* Fix some C++ issues found by Clang (patch by Nick Lewycky).
## [3.0-beta1]
Released July 5, 2010
## [3.0-beta1] - 2010-07-05
See the [announcement](https://www.eigen.tuxfamily.org/index.php?title=3.0).
## [2.0.14]
Released June 22, 2010
## [2.0.14] - 2010-06-22
Changes since 2.0.13:
@@ -1819,9 +1742,7 @@ Changes since 2.0.13:
* Fix #142: LU of fixed-size matrices was causing dynamic memory allocation (patch by Stuart Glaser).
* Fix #127: remove useless static keywords (also fixes warnings with clang++).
## [2.0.13]
Released June 10, 2010
## [2.0.13] - 2010-06-10
Changes since 2.0.12:
@@ -1836,9 +1757,7 @@ Changes since 2.0.12:
* Fix compilation of the BTL benchmarks.
* Some dox updates.
## [2.0.12]
Released February 12, 2010
## [2.0.12] - 2010-02-12
Changes since 2.0.11:
@@ -1854,9 +1773,7 @@ Changes since 2.0.11:
* Backport improvements to benchmarking code.
* Documentation fixes
## [2.0.11]
Released January 10, 2010
## [2.0.11] - 2010-01-10
Changes since 2.0.10:
@@ -1869,9 +1786,7 @@ Changes since 2.0.10:
* Fix MSVC 2010 compatibility.
* Some documentation improvements.
## [2.0.10]
Released November 25, 2009
## [2.0.10] - 2009-11-25
Changes since 2.0.9:
@@ -1887,27 +1802,21 @@ Changes since 2.0.9:
* fix compilation with MSVC 2010
* adjust to repository name change
## [2.0.9]
Released October 24, 2009
## [2.0.9] - 2009-10-24
Changes since 2.0.8:
* Really fix installation and the pkg-config file.
* Install the `NewStdVector` header that was introduced in 2.0.6.
## [2.0.8]
Released October 23, 2009
## [2.0.8] - 2009-10-23
Changes since 2.0.7:
* fix installation error introduced in 2.0.7: it was choking on the pkg-config file eigen2.pc not being found. The fix had been proposed long ago by Ingmar Vanhassel for the development branch, and when recently the pkg-config support was back-ported to the 2.0 branch, nobody thought of backporting this fix too, and apparently nobody tested "make install" !
* SVD: add default constructor. Users were relying on the compiler to generate one, and apparenty 2.0.7 triggered a little MSVC 2008 subtlety in this respect. Also added an assert.
## [2.0.7]
Released October 22, 2009
## [2.0.7] - 2009-10-22
Changes since 2.0.6:
@@ -1922,9 +1831,7 @@ Changes since 2.0.6:
* add pkg-config support by Rhys Ulerich.
* documentation fix and doc-generation-script updates by Thomas Capricelli
## [2.0.6]
Released September 23, 2009
## [2.0.6] - 2009-09-23
Changes since 2.0.5:
@@ -1938,9 +1845,7 @@ Changes since 2.0.5:
* fix a warning in `ei_aligned_malloc`; fixed by backporting the body from the devel branch; may result in a different choice of system aligned malloc function.
* update the documentation.
## [2.0.5]
Released August 22, 2009
## [2.0.5] - 2009-08-22
Changes since 2.0.4:
@@ -1959,9 +1864,7 @@ Changes since 2.0.4:
* fix the option to build a binary library, although it's not very useful and will be removed
* add basic .hgignore file and script to build the docs (thanks to Thomas Capricelli)
## [2.0.4]
Released August 1, 2009
## [2.0.4] - 2009-08-01
Changes since 2.0.3:
* Several fixes in the overloaded new and delete operators. Thanks to Hauke Heibel.
@@ -1975,9 +1878,7 @@ Changes since 2.0.3:
* several ctest improvements: use our own dashboard, use a separate project for the 2.0 branch.
* documentation: improvement on the pages on unaligned arrays (the online copies have been updated immediately).
## [2.0.3]
Released June 21, 2009
## [2.0.3] - 2009-06-21
Changes since 2.0.2:
* precision and reliability fixes in various algorithms, especially LLT, QR, Tridiagonalization, and also a precision improvement in LU.
@@ -1987,9 +1888,7 @@ Changes since 2.0.2:
* backport documentation improvements on transpose() and adjoint()
* updates in the Sparse module (was needed to support KDE 4.3)
## [2.0.2]
Released May 22, 2009
## [2.0.2] - 2009-05-22
Changes since 2.0.1:
* Fix `linearRegression()` compilation, actually it is reimplemented using the better fitHyperplane() which does total least-squares.
@@ -1999,9 +1898,7 @@ Changes since 2.0.1:
* Fix compatibility with the old GCC 3.3: it is now fully supported again.
* Fix warnings with recent GCC (4.4.0 and 4.3.3).
## [2.0.1]
Released April 14, 2009
## [2.0.1] - 2009-04-14
Changes since 2.0.0:
* disable alignment altogether on exotic platforms on which we don't vectorize anyway. This allows e.g. to use Eigen on ARM platforms.
@@ -2014,6 +1911,6 @@ Changes since 2.0.0:
* fix wrong static assertion (patch by Markus Moll)
* add missing operators in `aligned_allocator` (thanks to Hauke Heibel)
## [2.0.0]
## [2.0.0] - 2009-02-02
Released February 2, 2009
First public release.

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

@@ -106,6 +106,11 @@
#include <thread>
#endif
// for __cpp_lib feature test macros
#if defined(__has_include) && __has_include(<version>)
#include <version>
#endif
// for std::bit_cast()
#if defined(__cpp_lib_bit_cast) && __cpp_lib_bit_cast >= 201806L
#include <bit>

View File

@@ -6,9 +6,9 @@
// As of Eigen3 5.0.0, we have moved to Semantic Versioning (semver.org).
#define EIGEN_MAJOR_VERSION 5
#define EIGEN_MINOR_VERSION 0
#define EIGEN_PATCH_VERSION 0
#define EIGEN_PRERELEASE_VERSION "dev"
#define EIGEN_BUILD_VERSION "master"
#define EIGEN_VERSION_STRING "5.0.0-dev+master"
#define EIGEN_PATCH_VERSION 1
#define EIGEN_PRERELEASE_VERSION ""
#define EIGEN_BUILD_VERSION ""
#define EIGEN_VERSION_STRING "5.0.1"
#endif // EIGEN_VERSION_H

View File

@@ -56,11 +56,11 @@ class vml_assign_traits {
: int(Dst::MaxRowsAtCompileTime),
MaxSizeAtCompileTime = Dst::SizeAtCompileTime,
MightEnableVml = StorageOrdersAgree && DstHasDirectAccess && SrcHasDirectAccess &&
MightEnableVml = bool(StorageOrdersAgree) && bool(DstHasDirectAccess) && bool(SrcHasDirectAccess) &&
Src::InnerStrideAtCompileTime == 1 && Dst::InnerStrideAtCompileTime == 1,
MightLinearize = MightEnableVml && (int(Dst::Flags) & int(Src::Flags) & LinearAccessBit),
VmlSize = MightLinearize ? MaxSizeAtCompileTime : InnerMaxSize,
LargeEnough = VmlSize == Dynamic || VmlSize >= EIGEN_MKL_VML_THRESHOLD
MightLinearize = bool(MightEnableVml) && (int(Dst::Flags) & int(Src::Flags) & LinearAccessBit),
VmlSize = bool(MightLinearize) ? MaxSizeAtCompileTime : InnerMaxSize,
LargeEnough = (VmlSize == Dynamic) || VmlSize >= EIGEN_MKL_VML_THRESHOLD
};
public:

View File

@@ -94,7 +94,7 @@ class CwiseNullaryOp : public internal::dense_xpr_base<CwiseNullaryOp<NullaryOp,
* the returned matrix. Must be compatible with this MatrixBase type.
*
* This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
* it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
* it is redundant to pass \a rows and \a cols as arguments, so NullaryExpr(const CustomNullaryOp&) should be used
* instead.
*
* The template parameter \a CustomNullaryOp is the type of the functor.
@@ -121,7 +121,7 @@ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
* \only_for_vectors
*
* This variant is meant to be used for dynamic-size vector types. For fixed-size types,
* it is redundant to pass \a size as argument, so Zero() should be used
* it is redundant to pass \a size as argument, so NullaryExpr(const CustomNullaryOp&) should be used
* instead.
*
* The template parameter \a CustomNullaryOp is the type of the functor.
@@ -174,7 +174,7 @@ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
* the returned matrix. Must be compatible with this DenseBase type.
*
* This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
* it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
* it is redundant to pass \a rows and \a cols as arguments, so Constant(const Scalar&) should be used
* instead.
*
* The template parameter \a CustomNullaryOp is the type of the functor.
@@ -195,7 +195,7 @@ DenseBase<Derived>::Constant(Index rows, Index cols, const Scalar& value) {
* \only_for_vectors
*
* This variant is meant to be used for dynamic-size vector types. For fixed-size types,
* it is redundant to pass \a size as argument, so Zero() should be used
* it is redundant to pass \a size as argument, so Constant(const Scalar&) should be used
* instead.
*
* The template parameter \a CustomNullaryOp is the type of the functor.

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

@@ -115,17 +115,15 @@ struct eigen_zero_impl<Xpr, /*use_memset*/ false> {
template <typename Xpr>
struct eigen_zero_impl<Xpr, /*use_memset*/ true> {
using Scalar = typename Xpr::Scalar;
static constexpr size_t max_bytes = (std::numeric_limits<std::ptrdiff_t>::max)();
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Xpr& dst) {
const size_t num_bytes = dst.size() * sizeof(Scalar);
if (num_bytes == 0) return;
const std::ptrdiff_t num_bytes = dst.size() * static_cast<std::ptrdiff_t>(sizeof(Scalar));
if (num_bytes <= 0) return;
void* dst_ptr = static_cast<void*>(dst.data());
#ifndef EIGEN_NO_DEBUG
if (num_bytes > max_bytes) throw_std_bad_alloc();
eigen_assert((dst_ptr != nullptr) && "null pointer dereference error!");
#endif
EIGEN_USING_STD(memset);
memset(dst_ptr, 0, num_bytes);
memset(dst_ptr, 0, static_cast<std::size_t>(num_bytes));
}
template <typename SrcXpr>
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Xpr& dst, const SrcXpr& src) {

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

@@ -109,6 +109,9 @@ class PermutationBase : public EigenBase<Derived> {
*/
DenseMatrixType toDenseMatrix() const { return derived(); }
/** \returns the plain matrix representation of the permutation. */
DenseMatrixType eval() const { return toDenseMatrix(); }
/** const version of indices(). */
const IndicesType& indices() const { return derived().indices(); }
/** \returns a reference to the stored array representing the permutation. */

View File

@@ -2831,7 +2831,7 @@ inline __m128i segment_mask_4x8(Index begin, Index count) {
mask <<= CHAR_BIT * count;
mask--;
mask <<= CHAR_BIT * begin;
#if defined(_WIN32) && !defined(_WIN64)
#if !EIGEN_ARCH_x86_64
return _mm_loadl_epi64(reinterpret_cast<const __m128i*>(&mask));
#else
return _mm_cvtsi64_si128(mask);
@@ -2847,7 +2847,7 @@ inline __m128i segment_mask_8x8(Index begin, Index count) {
mask <<= (CHAR_BIT / 2) * count;
mask--;
mask <<= CHAR_BIT * begin;
#if defined(_WIN32) && !defined(_WIN64)
#if !EIGEN_ARCH_x86_64
return _mm_loadl_epi64(reinterpret_cast<const __m128i*>(&mask));
#else
return _mm_cvtsi64_si128(mask);

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

@@ -48,7 +48,7 @@ struct Packet2cf {
};
template <>
struct packet_traits<std::complex<float> > : default_packet_traits {
struct packet_traits<std::complex<float>> : default_packet_traits {
typedef Packet2cf type;
typedef Packet1cf half;
enum {
@@ -280,13 +280,13 @@ EIGEN_STRONG_INLINE Packet2cf pandnot<Packet2cf>(const Packet2cf& a, const Packe
template <>
EIGEN_STRONG_INLINE Packet1cf pload<Packet1cf>(const std::complex<float>* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet1cf>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return Packet1cf(pload<Packet2f>((const float*)from));
EIGEN_DEBUG_ALIGNED_LOAD return Packet1cf(
pload<Packet2f>(assume_aligned<unpacket_traits<Packet1cf>::alignment>(reinterpret_cast<const float*>(from))));
}
template <>
EIGEN_STRONG_INLINE Packet2cf pload<Packet2cf>(const std::complex<float>* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet2cf>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return Packet2cf(pload<Packet4f>(reinterpret_cast<const float*>(from)));
EIGEN_DEBUG_ALIGNED_LOAD return Packet2cf(
pload<Packet4f>(assume_aligned<unpacket_traits<Packet2cf>::alignment>(reinterpret_cast<const float*>(from))));
}
template <>
@@ -308,22 +308,22 @@ EIGEN_STRONG_INLINE Packet2cf ploaddup<Packet2cf>(const std::complex<float>* fro
}
template <>
EIGEN_STRONG_INLINE void pstore<std::complex<float> >(std::complex<float>* to, const Packet1cf& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet1cf>::alignment);
EIGEN_DEBUG_ALIGNED_STORE pstore((float*)to, from.v);
EIGEN_STRONG_INLINE void pstore<std::complex<float>>(std::complex<float>* to, const Packet1cf& from) {
EIGEN_DEBUG_ALIGNED_STORE pstore(assume_aligned<unpacket_traits<Packet1cf>::alignment>(reinterpret_cast<float*>(to)),
from.v);
}
template <>
EIGEN_STRONG_INLINE void pstore<std::complex<float> >(std::complex<float>* to, const Packet2cf& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet2cf>::alignment);
EIGEN_DEBUG_ALIGNED_STORE pstore(reinterpret_cast<float*>(to), from.v);
EIGEN_STRONG_INLINE void pstore<std::complex<float>>(std::complex<float>* to, const Packet2cf& from) {
EIGEN_DEBUG_ALIGNED_STORE pstore(assume_aligned<unpacket_traits<Packet2cf>::alignment>(reinterpret_cast<float*>(to)),
from.v);
}
template <>
EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float>* to, const Packet1cf& from) {
EIGEN_STRONG_INLINE void pstoreu<std::complex<float>>(std::complex<float>* to, const Packet1cf& from) {
EIGEN_DEBUG_UNALIGNED_STORE pstoreu((float*)to, from.v);
}
template <>
EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float>* to, const Packet2cf& from) {
EIGEN_STRONG_INLINE void pstoreu<std::complex<float>>(std::complex<float>* to, const Packet2cf& from) {
EIGEN_DEBUG_UNALIGNED_STORE pstoreu(reinterpret_cast<float*>(to), from.v);
}
@@ -356,7 +356,7 @@ EIGEN_DEVICE_FUNC inline void pscatter<std::complex<float>, Packet2cf>(std::comp
}
template <>
EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float>* addr) {
EIGEN_STRONG_INLINE void prefetch<std::complex<float>>(const std::complex<float>* addr) {
EIGEN_ARM_PREFETCH(reinterpret_cast<const float*>(addr));
}
@@ -501,7 +501,7 @@ struct Packet1cd {
};
template <>
struct packet_traits<std::complex<double> > : default_packet_traits {
struct packet_traits<std::complex<double>> : default_packet_traits {
typedef Packet1cd type;
typedef Packet1cd half;
enum {
@@ -531,8 +531,8 @@ struct unpacket_traits<Packet1cd> : neon_unpacket_default<Packet1cd, std::comple
template <>
EIGEN_STRONG_INLINE Packet1cd pload<Packet1cd>(const std::complex<double>* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet1cd>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return Packet1cd(pload<Packet2d>(reinterpret_cast<const double*>(from)));
EIGEN_DEBUG_ALIGNED_LOAD return Packet1cd(
pload<Packet2d>(assume_aligned<unpacket_traits<Packet1cd>::alignment>(reinterpret_cast<const double*>(from))));
}
template <>
@@ -644,18 +644,18 @@ EIGEN_STRONG_INLINE Packet1cd ploaddup<Packet1cd>(const std::complex<double>* fr
}
template <>
EIGEN_STRONG_INLINE void pstore<std::complex<double> >(std::complex<double>* to, const Packet1cd& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet1cd>::alignment);
EIGEN_DEBUG_ALIGNED_STORE pstore(reinterpret_cast<double*>(to), from.v);
EIGEN_STRONG_INLINE void pstore<std::complex<double>>(std::complex<double>* to, const Packet1cd& from) {
EIGEN_DEBUG_ALIGNED_STORE pstore(assume_aligned<unpacket_traits<Packet1cd>::alignment>(reinterpret_cast<double*>(to)),
from.v);
}
template <>
EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double>* to, const Packet1cd& from) {
EIGEN_STRONG_INLINE void pstoreu<std::complex<double>>(std::complex<double>* to, const Packet1cd& from) {
EIGEN_DEBUG_UNALIGNED_STORE pstoreu(reinterpret_cast<double*>(to), from.v);
}
template <>
EIGEN_STRONG_INLINE void prefetch<std::complex<double> >(const std::complex<double>* addr) {
EIGEN_STRONG_INLINE void prefetch<std::complex<double>>(const std::complex<double>* addr) {
EIGEN_ARM_PREFETCH(reinterpret_cast<const double*>(addr));
}
@@ -677,7 +677,7 @@ EIGEN_DEVICE_FUNC inline void pscatter<std::complex<double>, Packet1cd>(std::com
template <>
EIGEN_STRONG_INLINE std::complex<double> pfirst<Packet1cd>(const Packet1cd& a) {
EIGEN_ALIGN16 std::complex<double> res;
pstore<std::complex<double> >(&res, a);
pstore<std::complex<double>>(&res, a);
return res;
}

View File

@@ -2268,13 +2268,11 @@ EIGEN_STRONG_INLINE Packet2ul plogical_shift_left(Packet2ul a) {
template <>
EIGEN_STRONG_INLINE Packet2f pload<Packet2f>(const float* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet2f>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1_f32(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1_f32(assume_aligned<unpacket_traits<Packet2f>::alignment>(from));
}
template <>
EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet4f>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_f32(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_f32(assume_aligned<unpacket_traits<Packet4f>::alignment>(from));
}
template <>
EIGEN_STRONG_INLINE Packet4c pload<Packet4c>(const int8_t* from) {
@@ -2284,13 +2282,11 @@ EIGEN_STRONG_INLINE Packet4c pload<Packet4c>(const int8_t* from) {
}
template <>
EIGEN_STRONG_INLINE Packet8c pload<Packet8c>(const int8_t* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet8c>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1_s8(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1_s8(assume_aligned<unpacket_traits<Packet8c>::alignment>(from));
}
template <>
EIGEN_STRONG_INLINE Packet16c pload<Packet16c>(const int8_t* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet16c>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s8(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s8(assume_aligned<unpacket_traits<Packet16c>::alignment>(from));
}
template <>
EIGEN_STRONG_INLINE Packet4uc pload<Packet4uc>(const uint8_t* from) {
@@ -2300,63 +2296,51 @@ EIGEN_STRONG_INLINE Packet4uc pload<Packet4uc>(const uint8_t* from) {
}
template <>
EIGEN_STRONG_INLINE Packet8uc pload<Packet8uc>(const uint8_t* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet8uc>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1_u8(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1_u8(assume_aligned<unpacket_traits<Packet8uc>::alignment>(from));
}
template <>
EIGEN_STRONG_INLINE Packet16uc pload<Packet16uc>(const uint8_t* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet16uc>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_u8(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_u8(assume_aligned<unpacket_traits<Packet16uc>::alignment>(from));
}
template <>
EIGEN_STRONG_INLINE Packet4s pload<Packet4s>(const int16_t* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet4s>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1_s16(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1_s16(assume_aligned<unpacket_traits<Packet4s>::alignment>(from));
}
template <>
EIGEN_STRONG_INLINE Packet8s pload<Packet8s>(const int16_t* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet8s>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s16(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s16(assume_aligned<unpacket_traits<Packet8s>::alignment>(from));
}
template <>
EIGEN_STRONG_INLINE Packet4us pload<Packet4us>(const uint16_t* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet4us>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1_u16(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1_u16(assume_aligned<unpacket_traits<Packet4us>::alignment>(from));
}
template <>
EIGEN_STRONG_INLINE Packet8us pload<Packet8us>(const uint16_t* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet8us>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_u16(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_u16(assume_aligned<unpacket_traits<Packet8us>::alignment>(from));
}
template <>
EIGEN_STRONG_INLINE Packet2i pload<Packet2i>(const int32_t* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet2i>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1_s32(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1_s32(assume_aligned<unpacket_traits<Packet2i>::alignment>(from));
}
template <>
EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int32_t* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet4i>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s32(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s32(assume_aligned<unpacket_traits<Packet4i>::alignment>(from));
}
template <>
EIGEN_STRONG_INLINE Packet2ui pload<Packet2ui>(const uint32_t* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet2ui>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1_u32(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1_u32(assume_aligned<unpacket_traits<Packet2ui>::alignment>(from));
}
template <>
EIGEN_STRONG_INLINE Packet4ui pload<Packet4ui>(const uint32_t* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet4ui>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_u32(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_u32(assume_aligned<unpacket_traits<Packet4ui>::alignment>(from));
}
template <>
EIGEN_STRONG_INLINE Packet2l pload<Packet2l>(const int64_t* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet2l>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s64(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s64(assume_aligned<unpacket_traits<Packet2l>::alignment>(from));
}
template <>
EIGEN_STRONG_INLINE Packet2ul pload<Packet2ul>(const uint64_t* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet2ul>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_u64(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_u64(assume_aligned<unpacket_traits<Packet2ul>::alignment>(from));
}
template <>
@@ -2580,13 +2564,11 @@ EIGEN_STRONG_INLINE Packet4ui ploadquad<Packet4ui>(const uint32_t* from) {
template <>
EIGEN_STRONG_INLINE void pstore<float>(float* to, const Packet2f& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet2f>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1_f32(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1_f32(assume_aligned<unpacket_traits<Packet2f>::alignment>(to), from);
}
template <>
EIGEN_STRONG_INLINE void pstore<float>(float* to, const Packet4f& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet4f>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1q_f32(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1q_f32(assume_aligned<unpacket_traits<Packet4f>::alignment>(to), from);
}
template <>
EIGEN_STRONG_INLINE void pstore<int8_t>(int8_t* to, const Packet4c& from) {
@@ -2594,13 +2576,11 @@ EIGEN_STRONG_INLINE void pstore<int8_t>(int8_t* to, const Packet4c& from) {
}
template <>
EIGEN_STRONG_INLINE void pstore<int8_t>(int8_t* to, const Packet8c& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet8c>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1_s8(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1_s8(assume_aligned<unpacket_traits<Packet8c>::alignment>(to), from);
}
template <>
EIGEN_STRONG_INLINE void pstore<int8_t>(int8_t* to, const Packet16c& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet16c>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1q_s8(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1q_s8(assume_aligned<unpacket_traits<Packet16c>::alignment>(to), from);
}
template <>
EIGEN_STRONG_INLINE void pstore<uint8_t>(uint8_t* to, const Packet4uc& from) {
@@ -2608,63 +2588,51 @@ EIGEN_STRONG_INLINE void pstore<uint8_t>(uint8_t* to, const Packet4uc& from) {
}
template <>
EIGEN_STRONG_INLINE void pstore<uint8_t>(uint8_t* to, const Packet8uc& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet8uc>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1_u8(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1_u8(assume_aligned<unpacket_traits<Packet8uc>::alignment>(to), from);
}
template <>
EIGEN_STRONG_INLINE void pstore<uint8_t>(uint8_t* to, const Packet16uc& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet16uc>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1q_u8(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1q_u8(assume_aligned<unpacket_traits<Packet16uc>::alignment>(to), from);
}
template <>
EIGEN_STRONG_INLINE void pstore<int16_t>(int16_t* to, const Packet4s& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet4s>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1_s16(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1_s16(assume_aligned<unpacket_traits<Packet4s>::alignment>(to), from);
}
template <>
EIGEN_STRONG_INLINE void pstore<int16_t>(int16_t* to, const Packet8s& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet8s>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1q_s16(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1q_s16(assume_aligned<unpacket_traits<Packet8s>::alignment>(to), from);
}
template <>
EIGEN_STRONG_INLINE void pstore<uint16_t>(uint16_t* to, const Packet4us& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet4us>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1_u16(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1_u16(assume_aligned<unpacket_traits<Packet4us>::alignment>(to), from);
}
template <>
EIGEN_STRONG_INLINE void pstore<uint16_t>(uint16_t* to, const Packet8us& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet8us>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1q_u16(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1q_u16(assume_aligned<unpacket_traits<Packet8us>::alignment>(to), from);
}
template <>
EIGEN_STRONG_INLINE void pstore<int32_t>(int32_t* to, const Packet2i& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet2i>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1_s32(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1_s32(assume_aligned<unpacket_traits<Packet2i>::alignment>(to), from);
}
template <>
EIGEN_STRONG_INLINE void pstore<int32_t>(int32_t* to, const Packet4i& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet4i>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1q_s32(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1q_s32(assume_aligned<unpacket_traits<Packet4i>::alignment>(to), from);
}
template <>
EIGEN_STRONG_INLINE void pstore<uint32_t>(uint32_t* to, const Packet2ui& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet2ui>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1_u32(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1_u32(assume_aligned<unpacket_traits<Packet2ui>::alignment>(to), from);
}
template <>
EIGEN_STRONG_INLINE void pstore<uint32_t>(uint32_t* to, const Packet4ui& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet4ui>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1q_u32(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1q_u32(assume_aligned<unpacket_traits<Packet4ui>::alignment>(to), from);
}
template <>
EIGEN_STRONG_INLINE void pstore<int64_t>(int64_t* to, const Packet2l& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet2l>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1q_s64(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1q_s64(assume_aligned<unpacket_traits<Packet2l>::alignment>(to), from);
}
template <>
EIGEN_STRONG_INLINE void pstore<uint64_t>(uint64_t* to, const Packet2ul& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet2ul>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1q_u64(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1q_u64(assume_aligned<unpacket_traits<Packet2ul>::alignment>(to), from);
}
template <>
@@ -4739,8 +4707,8 @@ EIGEN_STRONG_INLINE bfloat16 pfirst<Packet4bf>(const Packet4bf& from) {
template <>
EIGEN_STRONG_INLINE Packet4bf pload<Packet4bf>(const bfloat16* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet4bf>::alignment);
return Packet4bf(pload<Packet4us>(reinterpret_cast<const uint16_t*>(from)));
return Packet4bf(
pload<Packet4us>(reinterpret_cast<const uint16_t*>(assume_aligned<unpacket_traits<Packet4bf>::alignment>(from))));
}
template <>
@@ -4750,8 +4718,8 @@ EIGEN_STRONG_INLINE Packet4bf ploadu<Packet4bf>(const bfloat16* from) {
template <>
EIGEN_STRONG_INLINE void pstore<bfloat16>(bfloat16* to, const Packet4bf& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet4bf>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1_u16(reinterpret_cast<uint16_t*>(to), from);
EIGEN_DEBUG_ALIGNED_STORE vst1_u16(
reinterpret_cast<uint16_t*>(assume_aligned<unpacket_traits<Packet4bf>::alignment>(to)), from);
}
template <>
@@ -5240,8 +5208,7 @@ EIGEN_STRONG_INLINE Packet2d pcmp_eq(const Packet2d& a, const Packet2d& b) {
template <>
EIGEN_STRONG_INLINE Packet2d pload<Packet2d>(const double* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet2d>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_f64(from);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_f64(assume_aligned<unpacket_traits<Packet2d>::alignment>(from));
}
template <>
@@ -5255,8 +5222,7 @@ EIGEN_STRONG_INLINE Packet2d ploaddup<Packet2d>(const double* from) {
}
template <>
EIGEN_STRONG_INLINE void pstore<double>(double* to, const Packet2d& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet2d>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1q_f64(to, from);
EIGEN_DEBUG_ALIGNED_STORE vst1q_f64(assume_aligned<unpacket_traits<Packet2d>::alignment>(to), from);
}
template <>
@@ -5784,14 +5750,14 @@ EIGEN_STRONG_INLINE Packet4hf pandnot<Packet4hf>(const Packet4hf& a, const Packe
template <>
EIGEN_STRONG_INLINE Packet8hf pload<Packet8hf>(const Eigen::half* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet8hf>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_f16(reinterpret_cast<const float16_t*>(from));
EIGEN_DEBUG_ALIGNED_LOAD return vld1q_f16(
reinterpret_cast<const float16_t*>(assume_aligned<unpacket_traits<Packet8hf>::alignment>(from)));
}
template <>
EIGEN_STRONG_INLINE Packet4hf pload<Packet4hf>(const Eigen::half* from) {
EIGEN_ASSUME_ALIGNED(from, unpacket_traits<Packet4hf>::alignment);
EIGEN_DEBUG_ALIGNED_LOAD return vld1_f16(reinterpret_cast<const float16_t*>(from));
EIGEN_DEBUG_ALIGNED_LOAD return vld1_f16(
reinterpret_cast<const float16_t*>(assume_aligned<unpacket_traits<Packet4hf>::alignment>(from)));
}
template <>
@@ -5866,14 +5832,14 @@ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4hf pinsertlast(const Packet4hf& a,
template <>
EIGEN_STRONG_INLINE void pstore<Eigen::half>(Eigen::half* to, const Packet8hf& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet8hf>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1q_f16(reinterpret_cast<float16_t*>(to), from);
EIGEN_DEBUG_ALIGNED_STORE vst1q_f16(
reinterpret_cast<float16_t*>(assume_aligned<unpacket_traits<Packet8hf>::alignment>(to)), from);
}
template <>
EIGEN_STRONG_INLINE void pstore<Eigen::half>(Eigen::half* to, const Packet4hf& from) {
EIGEN_ASSUME_ALIGNED(to, unpacket_traits<Packet4hf>::alignment);
EIGEN_DEBUG_ALIGNED_STORE vst1_f16(reinterpret_cast<float16_t*>(to), from);
EIGEN_DEBUG_ALIGNED_STORE vst1_f16(
reinterpret_cast<float16_t*>(assume_aligned<unpacket_traits<Packet4hf>::alignment>(to)), from);
}
template <>

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

@@ -91,6 +91,9 @@ namespace internal {
EIGEN_DEVICE_FUNC inline void check_that_malloc_is_allowed() {
eigen_assert(false && "heap allocation is forbidden (EIGEN_NO_MALLOC is defined)");
}
EIGEN_DEVICE_FUNC inline void check_that_free_is_allowed() {
eigen_assert(false && "heap deallocation is forbidden (EIGEN_NO_MALLOC is defined)");
}
#elif defined EIGEN_RUNTIME_NO_MALLOC
EIGEN_DEVICE_FUNC inline bool is_malloc_allowed_impl(bool update, bool new_value = false) {
EIGEN_MALLOC_CHECK_THREAD_LOCAL static bool value = true;
@@ -101,10 +104,22 @@ EIGEN_DEVICE_FUNC inline bool is_malloc_allowed() { return is_malloc_allowed_imp
EIGEN_DEVICE_FUNC inline bool set_is_malloc_allowed(bool new_value) { return is_malloc_allowed_impl(true, new_value); }
EIGEN_DEVICE_FUNC inline void check_that_malloc_is_allowed() {
eigen_assert(is_malloc_allowed() &&
"heap allocation is forbidden (EIGEN_RUNTIME_NO_MALLOC is defined and g_is_malloc_allowed is false)");
"heap allocation is forbidden (EIGEN_RUNTIME_NO_MALLOC is defined and set_is_malloc_allowed is false)");
}
EIGEN_DEVICE_FUNC inline bool is_free_allowed_impl(bool update, bool new_value = false) {
EIGEN_MALLOC_CHECK_THREAD_LOCAL static bool value = true;
if (update == 1) value = new_value;
return value;
}
EIGEN_DEVICE_FUNC inline bool is_free_allowed() { return is_free_allowed_impl(false); }
EIGEN_DEVICE_FUNC inline bool set_is_free_allowed(bool new_value) { return is_free_allowed_impl(true, new_value); }
EIGEN_DEVICE_FUNC inline void check_that_free_is_allowed() {
eigen_assert(is_malloc_allowed() &&
"heap deallocation is forbidden (EIGEN_RUNTIME_NO_MALLOC is defined and set_is_free_allowed is false)");
}
#else
EIGEN_DEVICE_FUNC inline void check_that_malloc_is_allowed() {}
EIGEN_DEVICE_FUNC inline void check_that_free_is_allowed() {}
#endif
EIGEN_DEVICE_FUNC inline void throw_std_bad_alloc() {
@@ -161,7 +176,7 @@ EIGEN_DEVICE_FUNC inline void handmade_aligned_free(void* ptr) {
std::size_t offset = static_cast<std::size_t>(*(static_cast<uint8_t*>(ptr) - 1)) + 1;
void* original = static_cast<void*>(static_cast<uint8_t*>(ptr) - offset);
check_that_malloc_is_allowed();
check_that_free_is_allowed();
EIGEN_USING_STD(free)
free(original);
}
@@ -227,7 +242,7 @@ EIGEN_DEVICE_FUNC inline void aligned_free(void* ptr) {
#if (EIGEN_DEFAULT_ALIGN_BYTES == 0) || EIGEN_MALLOC_ALREADY_ALIGNED
if (ptr != nullptr) {
check_that_malloc_is_allowed();
check_that_free_is_allowed();
EIGEN_USING_STD(free)
free(ptr);
}
@@ -299,7 +314,7 @@ EIGEN_DEVICE_FUNC inline void conditional_aligned_free(void* ptr) {
template <>
EIGEN_DEVICE_FUNC inline void conditional_aligned_free<false>(void* ptr) {
if (ptr != nullptr) {
check_that_malloc_is_allowed();
check_that_free_is_allowed();
EIGEN_USING_STD(free)
free(ptr);
}
@@ -1339,19 +1354,28 @@ EIGEN_DEVICE_FUNC void destroy_at(T* p) {
}
#endif
/** \internal
* This informs the implementation that PTR is aligned to at least ALIGN_BYTES
*/
#ifndef EIGEN_ASSUME_ALIGNED
#if defined(__cpp_lib_assume_aligned) && (__cpp_lib_assume_aligned >= 201811L)
#define EIGEN_ASSUME_ALIGNED(PTR, ALIGN_BYTES) \
{ PTR = std::assume_aligned<8 * (ALIGN_BYTES)>(PTR); }
#elif EIGEN_HAS_BUILTIN(__builtin_assume_aligned)
#define EIGEN_ASSUME_ALIGNED(PTR, ALIGN_BYTES) \
{ PTR = static_cast<decltype(PTR)>(__builtin_assume_aligned(PTR, (ALIGN_BYTES))); }
#else
#define EIGEN_ASSUME_ALIGNED(PTR, ALIGN_BYTES) /* do nothing */
// FIXME(rmlarsen): Work around missing linker symbol with msan on ARM.
#if !defined(EIGEN_DONT_ASSUME_ALIGNED) && __has_feature(memory_sanitizer) && \
(EIGEN_ARCH_ARM || EIGEN_ARCH_ARM64)
#define EIGEN_DONT_ASSUME_ALIGNED
#endif
#if !defined(EIGEN_DONT_ASSUME_ALIGNED) && defined(__cpp_lib_assume_aligned) && (__cpp_lib_assume_aligned >= 201811L)
template <std::size_t N, typename T>
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr T* assume_aligned(T* ptr) {
return std::assume_aligned<N, T>(ptr);
}
#elif !defined(EIGEN_DONT_ASSUME_ALIGNED) && EIGEN_HAS_BUILTIN(__builtin_assume_aligned)
template <std::size_t N, typename T>
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC T* assume_aligned(T* ptr) {
return static_cast<T*>(__builtin_assume_aligned(ptr, N));
}
#else
template <std::size_t N, typename T>
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr T* assume_aligned(T* ptr) {
return ptr;
}
#endif
} // end namespace internal

View File

@@ -65,7 +65,6 @@ template <typename EssentialPart>
EIGEN_DEVICE_FUNC void MatrixBase<Derived>::makeHouseholder(EssentialPart& essential, Scalar& tau,
RealScalar& beta) const {
using numext::conj;
using numext::sqrt;
EIGEN_STATIC_ASSERT_VECTOR_ONLY(EssentialPart)
VectorBlock<const Derived, EssentialPart::SizeAtCompileTime> tail(derived(), 1, size() - 1);
@@ -79,7 +78,7 @@ EIGEN_DEVICE_FUNC void MatrixBase<Derived>::makeHouseholder(EssentialPart& essen
beta = numext::real(c0);
essential.setZero();
} else {
beta = sqrt(numext::abs2(c0) + tailSqNorm);
beta = numext::sqrt(numext::abs2(c0) + tailSqNorm);
if (numext::real(c0) >= RealScalar(0)) beta = -beta;
essential = tail / (c0 - beta);
tau = conj((beta - c0) / beta);

View File

@@ -182,7 +182,7 @@ class KLU : public SparseSolverBase<KLU<MatrixType_> > {
/** Performs a numeric decomposition of \a matrix
*
* The given matrix must has the same sparsity than the matrix on which the pattern anylysis has been performed.
* The given matrix must have the same sparsity than the matrix on which the pattern anylysis has been performed.
*
* \sa analyzePattern(), compute()
*/

View File

@@ -157,7 +157,8 @@ class PardisoImpl : public SparseSolverBase<Derived> {
/** Performs a numeric decomposition of \a matrix
*
* The given matrix must has the same sparsity than the matrix on which the symbolic decomposition has been performed.
* The given matrix must have the same sparsity than the matrix on which the symbolic decomposition has been
* performed.
*
* \sa analyzePattern()
*/

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

@@ -416,7 +416,8 @@ class SimplicialLLT : public SimplicialCholeskyBase<SimplicialLLT<MatrixType_, U
/** Performs a numeric decomposition of \a matrix
*
* The given matrix must has the same sparsity than the matrix on which the symbolic decomposition has been performed.
* The given matrix must have the same sparsity than the matrix on which the symbolic decomposition has been
* performed.
*
* \sa analyzePattern()
*/
@@ -504,7 +505,8 @@ class SimplicialLDLT : public SimplicialCholeskyBase<SimplicialLDLT<MatrixType_,
/** Performs a numeric decomposition of \a matrix
*
* The given matrix must has the same sparsity than the matrix on which the symbolic decomposition has been performed.
* The given matrix must have the same sparsity than the matrix on which the symbolic decomposition has been
* performed.
*
* \sa analyzePattern()
*/
@@ -585,7 +587,8 @@ class SimplicialNonHermitianLLT
/** Performs a numeric decomposition of \a matrix
*
* The given matrix must has the same sparsity than the matrix on which the symbolic decomposition has been performed.
* The given matrix must have the same sparsity than the matrix on which the symbolic decomposition has been
* performed.
*
* \sa analyzePattern()
*/
@@ -674,7 +677,8 @@ class SimplicialNonHermitianLDLT
/** Performs a numeric decomposition of \a matrix
*
* The given matrix must has the same sparsity than the matrix on which the symbolic decomposition has been performed.
* The given matrix must have the same sparsity than the matrix on which the symbolic decomposition has been
* performed.
*
* \sa analyzePattern()
*/
@@ -757,7 +761,8 @@ class SimplicialCholesky : public SimplicialCholeskyBase<SimplicialCholesky<Matr
/** Performs a numeric decomposition of \a matrix
*
* The given matrix must has the same sparsity than the matrix on which the symbolic decomposition has been performed.
* The given matrix must have the same sparsity than the matrix on which the symbolic decomposition has been
* performed.
*
* \sa analyzePattern()
*/

View File

@@ -480,6 +480,7 @@ class CompressedStorageIterator {
return *this;
}
inline reference operator*() const { return reference(m_data.keyPtr() + m_index, m_data.valuePtr() + m_index); }
inline reference operator[](int index) { return *(*this + index); }
#define MAKE_COMP(OP) \
inline bool operator OP(const CompressedStorageIterator& other) const { return m_index OP other.m_index; }

View File

@@ -140,7 +140,7 @@ class SparseVector : public SparseCompressedBase<SparseVector<Scalar_, Options_,
return insertBack(inner);
}
inline Scalar& insertBack(Index i) {
m_data.append(0, i);
m_data.append(Scalar(0), i);
return m_data.value(m_data.size() - 1);
}
@@ -150,7 +150,7 @@ class SparseVector : public SparseCompressedBase<SparseVector<Scalar_, Options_,
return insertBackUnordered(inner);
}
inline Scalar& insertBackUnordered(Index i) {
m_data.append(0, i);
m_data.append(Scalar(0), i);
return m_data.value(m_data.size() - 1);
}
@@ -177,7 +177,7 @@ class SparseVector : public SparseCompressedBase<SparseVector<Scalar_, Options_,
--p;
}
m_data.index(p + 1) = convert_index(i);
m_data.value(p + 1) = 0;
m_data.value(p + 1) = Scalar(0);
return m_data.value(p + 1);
}
@@ -367,7 +367,7 @@ class SparseVector : public SparseCompressedBase<SparseVector<Scalar_, Options_,
/** \internal \deprecated use insertBack(Index) */
EIGEN_DEPRECATED_WITH_REASON("Use .insertBack() instead.") Scalar& fill(Index i) {
m_data.append(0, i);
m_data.append(Scalar(0), i);
return m_data.value(m_data.size() - 1);
}

View File

@@ -487,7 +487,8 @@ class SuperLU : public SuperLUBase<MatrixType_, SuperLU<MatrixType_> > {
/** Performs a numeric decomposition of \a matrix
*
* The given matrix must has the same sparsity than the matrix on which the symbolic decomposition has been performed.
* The given matrix must have the same sparsity than the matrix on which the symbolic decomposition has been
* performed.
*
* \sa analyzePattern()
*/
@@ -791,7 +792,8 @@ class SuperILU : public SuperLUBase<MatrixType_, SuperILU<MatrixType_> > {
/** Performs a numeric decomposition of \a matrix
*
* The given matrix must has the same sparsity than the matrix on which the symbolic decomposition has been performed.
* The given matrix must have the same sparsity than the matrix on which the symbolic decomposition has been
* performed.
*
* \sa analyzePattern()
*/

View File

@@ -425,7 +425,7 @@ class UmfPackLU : public SparseSolverBase<UmfPackLU<MatrixType_> > {
/** Performs a numeric decomposition of \a matrix
*
* The given matrix must has the same sparsity than the matrix on which the pattern anylysis has been performed.
* The given matrix must have the same sparsity than the matrix on which the pattern anylysis has been performed.
*
* \sa analyzePattern(), compute()
*/

View File

@@ -19,7 +19,9 @@ add_library(eigen_blas_static STATIC ${EigenBlas_SRCS})
list(APPEND EIGEN_BLAS_TARGETS eigen_blas_static)
if (EIGEN_BUILD_SHARED_LIBS)
add_library(eigen_blas SHARED ${EigenBlas_SRCS})
add_library(eigen_blas SHARED ${EigenBlas_SRCS} "eigen_blas.def")
target_compile_definitions(eigen_blas PUBLIC "EIGEN_BLAS_BUILD_DLL")
set_target_properties(eigen_blas PROPERTIES CXX_VISIBILITY_PRESET hidden)
list(APPEND EIGEN_BLAS_TARGETS eigen_blas)
endif()

View File

@@ -1,6 +1,20 @@
#ifndef BLAS_H
#define BLAS_H
#if defined(_WIN32)
#if defined(EIGEN_BLAS_BUILD_DLL)
#define EIGEN_BLAS_API __declspec(dllexport)
#elif defined(EIGEN_BLAS_LINK_DLL)
#define EIGEN_BLAS_API __declspec(dllimport)
#else
#define EIGEN_BLAS_API
#endif
#elif ((defined(__GNUC__) && __GNUC__ >= 4) || defined(__clang__)) && defined(EIGEN_BLAS_BUILD_DLL)
#define EIGEN_BLAS_API __attribute__((visibility("default")))
#else
#define EIGEN_BLAS_API
#endif
#ifdef __cplusplus
extern "C" {
#endif
@@ -15,467 +29,514 @@ typedef long BLASLONG;
typedef unsigned long BLASULONG;
#endif
void BLASFUNC(xerbla)(const char *, int *info);
EIGEN_BLAS_API int BLASFUNC(lsame)(const char *, const char *);
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(cdotu)(int *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(cdotc)(int *, float *, int *, float *, int *);
EIGEN_BLAS_API void BLASFUNC(zdotu)(int *, double *, int *, double *, int *);
EIGEN_BLAS_API void BLASFUNC(zdotc)(int *, double *, int *, double *, int *);
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(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(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(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(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(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 *);
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 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 *);
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 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(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(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(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(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(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(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 *);
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 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(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(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(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(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(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(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 *);
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 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 *);
float BLASFUNC(snrm2)(int *, float *, int *);
float BLASFUNC(scnrm2)(int *, float *, 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 *);
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 float BLASFUNC(snrm2)(int *, float *, int *);
EIGEN_BLAS_API float BLASFUNC(scnrm2)(int *, float *, 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 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(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(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(srotmg)(float *, float *, float *, float *, float *);
void BLASFUNC(drotmg)(double *, 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(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(srotmg)(float *, float *, float *, float *, float *);
EIGEN_BLAS_API void BLASFUNC(drotmg)(double *, double *, double *, double *, 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
}

222
blas/eigen_blas.def Normal file
View File

@@ -0,0 +1,222 @@
; Definition file for eigen_blas.dll.
LIBRARY eigen_blas
EXPORTS
; Utilities
lsame_
xerbla_
; Level 1
saxpy_
daxpy_
caxpy_
zaxpy_
; caxpyc_
; zaxpyc_
scopy_
dcopy_
ccopy_
zcopy_
sdot_
sdsdot_
dsdot_
ddot_
cdotc_
zdotc_
cdotu_
zdotu_
cdotcw_
zdotcw_
cdotuw_
zdotuw_
snrm2_
dnrm2_
scnrm2_
dznrm2_
srot_
drot_
csrot_
zdrot_
srotg_
drotg_
crotg_
zrotg_
srotm_
drotm_
srotmg_
drotmg_
sscal_
dscal_
cscal_
zscal_
csscal_
zdscal_
sswap_
dswap_
cswap_
zswap_
sasum_
scasum_
dasum_
dzasum_
; ismax_
; idmax_
; icmax_
; izmax_
isamax_
idamax_
icamax_
izamax_
isamin_
idamin_
icamin_
izamin_
; ismin_
; idmin_
; icmin_
; izmin_
; samax_
; damax_
; scamax_
; dzamax_
; samin_
; damin_
; scamin_
; dzamin_
; smax_
; dmax_
; cmax_
; zmax_
; smin_
; dmin_
; cmin_
; zmin_
; Level 2
sgemv_
dgemv_
cgemv_
zgemv_
sger_
dger_
cgerc_
zgerc_
cgeru_
zgeru_
ssymv_
dsymv_
ssyr_
dsyr_
ssyr2_
dsyr2_
; csyr2_
; zsyr2_
strmv_
dtrmv_
ctrmv_
ztrmv_
strsv_
dtrsv_
ctrsv_
ztrsv_
stpsv_
dtpsv_
ctpsv_
ztpsv_
stpmv_
dtpmv_
ctpmv_
ztpmv_
stbmv_
dtbmv_
ctbmv_
ztbmv_
stbsv_
dtbsv_
ctbsv_
ztbsv_
sspmv_
dspmv_
sspr_
dspr_
; cspr_
; zspr_
sspr2_
dspr2_
; cspr2_
; zspr2_
cher_
zher_
chpr_
zhpr_
cher2_
zher2_
chpr2_
zhpr2_
chemv_
zhemv_
chpmv_
zhpmv_
; snorm_
; dnorm_
; cnorm_
; znorm_
sgbmv_
dgbmv_
cgbmv_
zgbmv_
ssbmv_
dsbmv_
; csbmv_
; zsbmv_
chbmv_
zhbmv_
; Level 3 BLAS
sgemm_
dgemm_
cgemm_
zgemm_
; cgemm3m_
; zgemm3m_
; sge2mm_
; dge2mm_
; cge2mm_
; zge2mm_
ssymm_
dsymm_
csymm_
zsymm_
; csymm3m_
; zsymm3m_
ssyrk_
dsyrk_
csyrk_
zsyrk_
ssyr2k_
dsyr2k_
csyr2k_
zsyr2k_
strmm_
dtrmm_
ctrmm_
ztrmm_
strsm_
dtrsm_
ctrsm_
ztrsm_
chemm_
zhemm_
; chemm3m_
; zhemm3m_
cherk_
zherk_
cher2k_
zher2k_
; cher2m_
; zher2m_
sgemmtr_
dgemmtr_
cgemmtr_
zgemmtr_

View File

@@ -1,6 +1,8 @@
#include <stdio.h>
#include "blas.h"
#if (defined __GNUC__) && (!defined __MINGW32__) && (!defined __CYGWIN__)
#define EIGEN_WEAK_LINKING __attribute__((weak))
#else

View File

@@ -1,5 +1,6 @@
# Base configuration for linux cross-compilation.
.build:linux:cross:
needs: []
extends: .common:linux:cross
stage: build
variables:
@@ -11,6 +12,7 @@
rules:
- if: $CI_PIPELINE_SOURCE == "schedule" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "web" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "push" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_PROJECT_NAMESPACE == "libeigen" && $CI_MERGE_REQUEST_LABELS =~ "/all-tests/"
cache:
key: "$CI_JOB_NAME_SLUG-$CI_COMMIT_REF_SLUG-BUILD"
@@ -108,7 +110,7 @@ build:linux:docs:
rules:
- if: $CI_PIPELINE_SOURCE == "schedule" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "web" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "push" && $CI_PROJECT_NAMESPACE == "libeigen" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_PIPELINE_SOURCE == "push" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_PROJECT_NAMESPACE == "libeigen" && $CI_MERGE_REQUEST_LABELS =~ "/all-tests/"
@@ -147,57 +149,6 @@ build:linux:docs:
# Build on regular linux to limit GPU cost.
- saas-linux-2xlarge-amd64
# NVidia no longer provides docker images < CUDA 11.0.3.
# # GCC-7, CUDA-9.2
# build:linux:cuda-9.2:gcc-7:
# extends: .build:linux:cuda
# image: nvidia/cuda:9.2-devel-ubuntu18.04
# variables:
# # cuda 9.2 doesn't support sm_75, so lower to 70.
# EIGEN_CI_CUDA_COMPUTE_ARCH: "50;70"
# EIGEN_CI_C_COMPILER: gcc-7
# EIGEN_CI_CXX_COMPILER: g++-7
# # Clang-10, CUDA-9.2
# build:linux:cuda-9.2:clang-10:
# extends: build:linux:cuda-9.2:gcc-7
# variables:
# EIGEN_CI_C_COMPILER: clang-10
# EIGEN_CI_CXX_COMPILER: clang++-10
# EIGEN_CI_TEST_CUDA_CLANG: "on"
# # GCC-8, CUDA-10.2
# build:linux:cuda-10.2:gcc-8:
# extends: .build:linux:cuda
# image: nvidia/cuda:10.2-devel-ubuntu18.04
# variables:
# EIGEN_CI_C_COMPILER: gcc-8
# EIGEN_CI_CXX_COMPILER: g++-8
# # Clang-10, CUDA-10.2
# build:linux:cuda-10.2:clang-10:
# extends: build:linux:cuda-10.2:gcc-8
# variables:
# EIGEN_CI_C_COMPILER: clang-10
# EIGEN_CI_CXX_COMPILER: clang++-10
# EIGEN_CI_TEST_CUDA_CLANG: "on"
# GCC-10, CUDA-11.4
build:linux:cuda-11.4:gcc-10:
extends: .build:linux:cuda
image: nvidia/cuda:11.4.3-devel-ubuntu20.04
variables:
EIGEN_CI_C_COMPILER: gcc-10
EIGEN_CI_CXX_COMPILER: g++-10
# Clang-12, CUDA-11.4
build:linux:cuda-11.4:clang-12:
extends: build:linux:cuda-11.4:gcc-10
variables:
EIGEN_CI_C_COMPILER: clang-12
EIGEN_CI_CXX_COMPILER: clang++-12
EIGEN_CI_TEST_CUDA_CLANG: "on"
# GCC-10, CUDA-12.2
build:linux:cuda-12.2:gcc-10:
extends: .build:linux:cuda
@@ -214,7 +165,7 @@ build:linux:cuda-12.2:clang-12:
EIGEN_CI_CXX_COMPILER: clang++-12
EIGEN_CI_TEST_CUDA_CLANG: "on"
# ######## HIP ###################################################################
######### HIP ##################################################################
# Note: these are currently build-only, until we get an AMD-supported runner.
# ROCm HIP
@@ -226,6 +177,8 @@ build:linux:rocm-latest:gcc-10:
EIGEN_CI_CXX_COMPILER: g++-10
EIGEN_CI_BUILD_TARGET: buildtests_gpu
EIGEN_CI_ADDITIONAL_ARGS: -DEIGEN_TEST_HIP=on
cache: [] # Disable cache for ROCm, since it fails whenever the image updates.
######## Arm ###################################################################
@@ -338,7 +291,7 @@ build:linux:cross:x86-64:gcc-10:default:smoketest:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
tags:
- saas-linux-small-amd64
- saas-linux-medium-amd64
build:linux:cross:x86-64:clang-12:default:smoketest:
extends: build:linux:cross:x86-64:clang-12:default
@@ -347,4 +300,4 @@ build:linux:cross:x86-64:clang-12:default:smoketest:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
tags:
- saas-linux-small-amd64
- saas-linux-medium-amd64

View File

@@ -1,5 +1,6 @@
# Base configuration for windows builds.
.build:windows:
needs: []
extends: .common:windows
stage: build
variables:
@@ -16,6 +17,7 @@
rules:
- if: $CI_PIPELINE_SOURCE == "schedule" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "web" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "push" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_PROJECT_NAMESPACE == "libeigen" && $CI_MERGE_REQUEST_LABELS =~ "/all-tests/"
cache:
@@ -25,31 +27,31 @@
######### MSVC #################################################################
# MSVC 14.16 (VS 2017)
build:windows:x86-64:msvc-14.16:default:
# MSVC 14.29 (VS 2019) 32 bit
build:windows:x86:msvc-14.29:default:
extends: .build:windows
variables:
EIGEN_CI_MSVC_VER: "14.16"
# Override to remove unsupported /d2ReducedOptimizeHugeFunctions.
EIGEN_CI_TEST_CUSTOM_CXX_FLAGS: "/DEIGEN_STRONG_INLINE=inline;/Os"
EIGEN_CI_MSVC_ARCH: "x64_x86"
# MSVC 14.29 (VS 2019) 64 bit
# MSVC 14.29 (VS 2019)
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"
######### MSVC + CUDA ##########################################################
# MSVC 14.29 (VS 2019) + CUDA
.build:windows:cuda:
extends: .build:windows
variables:
@@ -65,46 +67,8 @@ build:windows:x86-64:msvc-14.29:avx512dq:
- x86-64
- cuda
# The CUDA 9.2 compiler crashes with an internal error.
# # MSVC 14.16 + CUDA 9.2
# build:windows:x86-64:cuda-9.2:msvc-14.16:
# extends: .build:windows:cuda
# variables:
# # CUDA 9.2 doesn't support sm_75.
# EIGEN_CI_CUDA_COMPUTE_ARCH: "50;70"
# # CUDA 9.2 only supports up to VS 2017.
# EIGEN_CI_MSVC_VER: "14.16"
# EIGEN_CI_TEST_CUSTOM_CXX_FLAGS: "/DEIGEN_STRONG_INLINE=inline;/Os"
# EIGEN_CI_BEFORE_SCRIPT: $$env:CUDA_PATH=$$env:CUDA_PATH_V9_2
# MSVC 14.29 + CUDA 10.2
build:windows:x86-64:cuda-10.2:msvc-14.29:
extends: .build:windows:cuda
variables:
EIGEN_CI_MSVC_VER: "14.29"
EIGEN_CI_BEFORE_SCRIPT: $$env:CUDA_PATH=$$env:CUDA_PATH_V10_2
# MSVC 14.29 + CUDA 11.4
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
######## MR Smoke Tests ########################################################
# MSVC 14.29 64-bit (VS 2019)
build:windows:x86-64:msvc-14.29:avx512dq:smoketest:
extends: build:windows:x86-64:msvc-14.29:avx512dq
variables:
EIGEN_CI_BUILD_TARGET: buildsmoketests
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
# MSVC 14.29 32-bit (VS 2019)
build:windows:x86:msvc-14.29:avx512dq:smoketest:
extends: build:windows:x86-64:msvc-14.29:avx512dq:smoketest
variables:
EIGEN_CI_MSVC_ARCH: "x86"
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
EIGEN_CI_BEFORE_SCRIPT: $$env:CUDA_PATH=$$env:CUDA_PATH_V11_4

View File

@@ -36,6 +36,6 @@ deploy:docs:
rules:
- if: $CI_PIPELINE_SOURCE == "schedule" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "web" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "push" && $CI_PROJECT_NAMESPACE == "libeigen" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_PIPELINE_SOURCE == "push" && $CI_PROJECT_NAMESPACE == "libeigen"
variables:
PAGES_PREFIX: docs-$CI_COMMIT_REF_NAME

View File

@@ -13,19 +13,29 @@ elif [[ ${EIGEN_CI_CTEST_LABEL} ]]; then
target="-L ${EIGEN_CI_CTEST_LABEL}"
fi
# Repeat tests up to three times to ignore flakes. Do not re-run with -T test,
# otherwise we lose test results for those that passed.
# Note: starting with CMake 3.17, we can use --repeat until-pass:3, but we have
# no way of easily installing this on ppc64le.
ctest ${EIGEN_CI_CTEST_ARGS} --parallel ${NPROC} \
--output-on-failure --no-compress-output \
--build-no-clean -T test ${target} || \
ctest ${EIGEN_CI_CTEST_ARGS} --parallel ${NPROC} \
--output-on-failure --no-compress-output --rerun-failed || \
ctest ${EIGEN_CI_CTEST_ARGS} --parallel ${NPROC} \
--output-on-failure --no-compress-output --rerun-failed
set +x
ctest_cmd="ctest ${EIGEN_CI_CTEST_ARGS} --parallel ${NPROC} --output-on-failure --no-compress-output --build-noclean ${target}"
echo "Running initial tests..."
if ${ctest_cmd} -T test; then
echo "Tests passed on the first attempt."
exit_code=$?
else
echo "Initial tests failed with exit code $?. Retrying up to ${EIGEN_CI_CTEST_REPEAT} times..."
if ${ctest_cmd} --rerun-failed --repeat until-pass:${EIGEN_CI_CTEST_REPEAT}; then
echo "Tests passed on retry."
exit_code=42
else
exit_code=$?
fi
fi
set -x
# Return to root directory.
cd ${rootdir}
set +x
exit $exit_code

View File

@@ -13,18 +13,32 @@ if (${EIGEN_CI_CTEST_REGEX}) {
$target = "-L","${EIGEN_CI_CTEST_LABEL}"
}
# Repeat tests up to three times to ignore flakes. Do not re-run with -T test,
# otherwise we lose test results for those that passed.
# Note: starting with CMake 3.17, we can use --repeat until-pass:3, but we have
# no way of easily installing this on ppc64le.
ctest $EIGEN_CI_CTEST_ARGS -j$NPROC --output-on-failure --no-compress-output --build-no-clean -T test $target || `
ctest $EIGEN_CI_CTEST_ARGS -j$NPROC --output-on-failure --no-compress-output --rerun-failed || `
ctest $EIGEN_CI_CTEST_ARGS -j$NPROC --output-on-failure --no-compress-output --rerun-failed
$ctest_cmd = { ctest ${EIGEN_CI_CTEST_ARGS} --parallel ${NPROC} --output-on-failure --no-compress-output --build-noclean ${target} }
$success = $LASTEXITCODE
Write-Host "Running initial tests..."
& $ctest_cmd "-T test"
$exit_code = $LASTEXITCODE
if ($exit_code -eq 0) {
Write-Host "Tests passed on the first attempt."
}
else {
Write-Host "Initial tests failed with exit code $exit_code. Retrying up to $EIGEN_CI_CTEST_REPEAT times..."
# TODO: figure out how to use --repeat until-pass
for ($i = 1; $i -le $EIGEN_CI_CTEST_REPEAT; $i++) {
& $ctest_cmd "--rerun-failed"
$exit_code = $LASTEXITCODE
if ($exit_code -eq 0) {
Write-Host "Tests passed on retry."
$exit_code = 42
break
}
}
}
# Return to root directory.
cd ${rootdir}
# Explicitly propagate exit code to indicate pass/failure of test command.
if($success -ne 0) { Exit $success }
Exit $exit_code

View File

@@ -8,9 +8,12 @@
rules:
- if: $CI_PIPELINE_SOURCE == "schedule" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "web" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "push" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_PROJECT_NAMESPACE == "libeigen" && $CI_MERGE_REQUEST_LABELS =~ "/all-tests/"
tags:
- saas-linux-2xlarge-amd64
allow_failure:
exit_codes: 42
##### x86-64 ###################################################################
.test:linux:x86-64:
@@ -204,61 +207,6 @@ test:linux:x86-64:clang-12:avx512dq:unsupported:
tags:
- saas-linux-medium-amd64-gpu-standard
# NVidia no longer provides docker images < CUDA 11.0.3.
# # GCC-7, CUDA-9.2
# test:linux:cuda-9.2:gcc-7:
# extends: .test:linux:cuda
# image: nvidia/cuda:9.2-devel-ubuntu18.04
# needs: [ build:linux:cuda-9.2:gcc-7 ]
# variables:
# EIGEN_CI_CXX_COMPILER: g++-7
# EIGEN_CI_CC_COMPILER: gcc-7
# # Clang-10, CUDA-9.2
# test:linux:cuda-9.2:clang-10:
# extends: .test:linux:cuda
# image: nvidia/cuda:9.2-devel-ubuntu18.04
# needs: [ build:linux:cuda-9.2:clang-10 ]
# variables:
# EIGEN_CI_CXX_COMPILER: clang++-10
# EIGEN_CI_CC_COMPILER: clang-10
# # GCC-8, CUDA-10.2
# test:linux:cuda-10.2:gcc-8:
# extends: .test:linux:cuda
# image: nvidia/cuda:10.2-devel-ubuntu18.04
# needs: [ build:linux:cuda-10.2:gcc-8 ]
# variables:
# EIGEN_CI_CXX_COMPILER: g++-8
# EIGEN_CI_CC_COMPILER: gcc-8
# # Clang-10, CUDA-10.2
# test:linux:cuda-10.2:clang-10:
# extends: .test:linux:cuda
# image: nvidia/cuda:10.2-devel-ubuntu18.04
# needs: [ build:linux:cuda-10.2:clang-10 ]
# variables:
# EIGEN_CI_CXX_COMPILER: clang++-10
# EIGEN_CI_CC_COMPILER: clang-10
# GCC-10, CUDA-11.4
test:linux:cuda-11.4:gcc-10:
extends: .test:linux:cuda
image: nvidia/cuda:11.4.3-devel-ubuntu20.04
needs: [ build:linux:cuda-11.4:gcc-10 ]
variables:
EIGEN_CI_CXX_COMPILER: g++-10
EIGEN_CI_CC_COMPILER: gcc-10
# Clang-12, CUDA-11.4
test:linux:cuda-11.4:clang-12:
extends: .test:linux:cuda
image: nvidia/cuda:11.4.3-devel-ubuntu20.04
needs: [ build:linux:cuda-11.4:clang-12 ]
variables:
EIGEN_CI_CXX_COMPILER: clang++-12
EIGEN_CI_CC_COMPILER: clang-12
# GCC-10, CUDA-12.2
test:linux:cuda-12.2:gcc-10:
extends: .test:linux:cuda
@@ -439,7 +387,7 @@ test:linux:x86-64:gcc-10:default:smoketest:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
tags:
- saas-linux-small-amd64
- saas-linux-medium-amd64
test:linux:x86-64:clang-12:default:smoketest:
extends: .test:linux:x86-64:clang-12:default
@@ -449,4 +397,4 @@ test:linux:x86-64:clang-12:default:smoketest:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
tags:
- saas-linux-small-amd64
- saas-linux-medium-amd64

View File

@@ -8,60 +8,42 @@
rules:
- if: $CI_PIPELINE_SOURCE == "schedule" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "web" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "push" && $CI_PROJECT_NAMESPACE == "libeigen"
- if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_PROJECT_NAMESPACE == "libeigen" && $CI_MERGE_REQUEST_LABELS =~ "/all-tests/"
tags:
- eigen-runner
- windows
- x86-64
allow_failure:
exit_codes: 42
##### MSVC #####################################################################
# MSVC 14.16 (VS 2017)
.test:windows:x86-64:msvc-14.16:default:
extends: .test:windows
needs: [ build:windows:x86-64:msvc-14.16:default ]
test:windows:x86-64:msvc-14.16:default:official:
extends: .test:windows:x86-64:msvc-14.16:default
variables:
EIGEN_CI_CTEST_LABEL: Official
test:windows:x86-64:msvc-14.16:default:unsupported:
extends: .test:windows:x86-64:msvc-14.16:default
variables:
EIGEN_CI_CTEST_LABEL: Unsupported
# MSVC 14.29 (VS 2019)
.test:windows:x86-64:msvc-14.29:default:
extends: .test:windows
needs: [ build:windows:x86-64:msvc-14.29:default ]
# MSVC 14.29 (VS 2019) 64 bit
test:windows:x86-64:msvc-14.29:default:official:
extends: .test:windows:x86-64:msvc-14.29:default
extends: .test:windows
needs: [ build: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:
@@ -69,18 +51,16 @@ 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
##### MSVC + CUDA ##############################################################
# MSVC 14.29 (VS 2019) + CUDA
.test:windows:cuda:
extends: .test:windows
allow_failure: true
@@ -92,18 +72,7 @@ test:windows:x86-64:msvc-14.29:avx512dq:unsupported:
- x86-64
- cuda
# The CUDA 9.2 compiler crashes with an internal error.
# # MSVC 14.16 + CUDA 9.2
# test:windows:x86-64:cuda-9.2:msvc-14.16:
# extends: .test:windows:cuda
# needs: [ build:windows:x86-64:cuda-9.2:msvc-14.16 ]
# MSVC 14.29 + CUDA 10.2
test:windows:x86-64:cuda-10.2:msvc-14.29:
extends: .test:windows:cuda
needs: [ build:windows:x86-64:cuda-10.2:msvc-14.29 ]
# MSVC 14.29 + CUDA 11.4
test:windows:x86-64:cuda-11.4:msvc-14.29:
extends: .test:windows:cuda
needs: [ build:windows:x86-64:cuda-11.4:msvc-14.29 ]
needs: [ build:windows:x86-64:cuda-11.4:msvc-14.29 ]

View File

@@ -91,7 +91,7 @@ set(ei_smoke_test_list
qr_1
qr_colpivoting_7
qr_fullpivoting_4
rand
rand_1
real_qz_1
redux_1
ref_1

View File

@@ -1,235 +1,235 @@
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<!-- Fixed x Fixed Matrix -->
<Type Name="Eigen::Matrix&lt;*,*,*,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,-1,-1,*,*,*&gt;"/>
<DisplayString>[{$T2}, {$T3}] (fixed matrix)</DisplayString>
<Expand>
<ArrayItems Condition="Flags%2"> <!-- row major layout -->
<Rank>2</Rank>
<Size>$i==0 ? $T2 : $T3</Size>
<ValuePointer>m_storage.m_data.array</ValuePointer>
</ArrayItems>
<ArrayItems Condition="!(Flags%2)"> <!-- column major layout -->
<Direction>Backward</Direction>
<Rank>2</Rank>
<Size>$i==0 ? $T2 : $T3</Size>
<ValuePointer>m_storage.m_data.array</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<!-- 2 x 2 Matrix -->
<Type Name="Eigen::Matrix&lt;*,2,2,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,2,2,*,*,*&gt;"/>
<DisplayString>[2, 2] (fixed matrix)</DisplayString>
<Expand>
<Synthetic Name="[row 0]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 0]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[2]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 1]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[2]}, {m_storage.m_data.array[3]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 1]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[1]}, {m_storage.m_data.array[3]})</DisplayString>
</Synthetic>
</Expand>
</Type>
<!-- 3 x 3 Matrix -->
<Type Name="Eigen::Matrix&lt;*,3,3,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,3,3,*,*,*&gt;"/>
<DisplayString>[3, 3] (fixed matrix)</DisplayString>
<Expand>
<Synthetic Name="[row 0]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]}, {m_storage.m_data.array[2]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 0]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[3]}, {m_storage.m_data.array[6]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 1]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[3]}, {m_storage.m_data.array[4]}, {m_storage.m_data.array[5]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 1]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[1]}, {m_storage.m_data.array[4]}, {m_storage.m_data.array[7]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 2]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[6]}, {m_storage.m_data.array[7]}, {m_storage.m_data.array[8]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 2]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[2]}, {m_storage.m_data.array[5]}, {m_storage.m_data.array[8]})</DisplayString>
</Synthetic>
</Expand>
</Type>
<!-- 4 x 4 Matrix -->
<Type Name="Eigen::Matrix&lt;*,4,4,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,4,4,*,*,*&gt;"/>
<DisplayString>[4, 4] (fixed matrix)</DisplayString>
<Expand>
<Synthetic Name="[row 0]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]}, {m_storage.m_data.array[2]}, {m_storage.m_data.array[3]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 0]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[4]}, {m_storage.m_data.array[8]}, {m_storage.m_data.array[12]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 1]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[4]}, {m_storage.m_data.array[5]}, {m_storage.m_data.array[6]}, {m_storage.m_data.array[7]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 1]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[1]}, {m_storage.m_data.array[5]}, {m_storage.m_data.array[9]}, {m_storage.m_data.array[13]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 2]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[8]}, {m_storage.m_data.array[9]}, {m_storage.m_data.array[10]}, {m_storage.m_data.array[11]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 2]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[2]}, {m_storage.m_data.array[6]}, {m_storage.m_data.array[10]}, {m_storage.m_data.array[14]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 3]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[12]}, {m_storage.m_data.array[13]}, {m_storage.m_data.array[14]}, {m_storage.m_data.array[15]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 3]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[3]}, {m_storage.m_data.array[7]}, {m_storage.m_data.array[11]}, {m_storage.m_data.array[15]})</DisplayString>
</Synthetic>
</Expand>
</Type>
<!-- Dynamic x Dynamic Matrix -->
<Type Name="Eigen::Matrix&lt;*,-1,-1,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,-1,-1,*,*,*&gt;"/>
<DisplayString Condition="m_storage.m_data == 0">empty</DisplayString>
<DisplayString Condition="m_storage.m_data != 0">[{m_storage.m_rows}, {m_storage.m_cols}] (dynamic matrix)</DisplayString>
<Expand>
<ArrayItems Condition="Flags%2"> <!-- row major layout -->
<Rank>2</Rank>
<Size>$i==0 ? m_storage.m_rows : m_storage.m_cols</Size>
<ValuePointer>m_storage.m_data</ValuePointer>
</ArrayItems>
<ArrayItems Condition="!(Flags%2)"> <!-- column major layout -->
<Direction>Backward</Direction>
<Rank>2</Rank>
<Size>$i==0 ? m_storage.m_rows : m_storage.m_cols</Size>
<ValuePointer>m_storage.m_data</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<!-- Fixed x Dynamic Matrix -->
<Type Name="Eigen::Matrix&lt;*,*,-1,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,*,-1,*,*,*&gt;"/>
<DisplayString Condition="m_storage.m_data == 0">empty</DisplayString>
<DisplayString Condition="m_storage.m_data != 0">[{$T2}, {m_storage.m_cols}] (dynamic column matrix)</DisplayString>
<Expand>
<ArrayItems Condition="Flags%2"> <!-- row major layout -->
<Rank>2</Rank>
<Size>$i==0 ? $T2 : m_storage.m_cols</Size>
<ValuePointer>m_storage.m_data</ValuePointer>
</ArrayItems>
<ArrayItems Condition="!(Flags%2)"> <!-- column major layout -->
<Direction>Backward</Direction>
<Rank>2</Rank>
<Size>$i==0 ? $T2 : m_storage.m_cols</Size>
<ValuePointer>m_storage.m_data</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<!-- Dynamic x Fixed Matrix -->
<Type Name="Eigen::Matrix&lt;*,-1,*,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,-1,*,*,*,*&gt;"/>
<DisplayString Condition="m_storage.m_data == 0">empty</DisplayString>
<DisplayString Condition="m_storage.m_data != 0">[{m_storage.m_rows}, {$T2}] (dynamic row matrix)</DisplayString>
<Expand>
<ArrayItems Condition="Flags%2"> <!-- row major layout -->
<Rank>2</Rank>
<Size>$i==0 ? m_storage.m_rows : $T2</Size>
<ValuePointer>m_storage.m_data</ValuePointer>
</ArrayItems>
<ArrayItems Condition="!(Flags%2)"> <!-- column major layout -->
<Direction>Backward</Direction>
<Rank>2</Rank>
<Size>$i==0 ? m_storage.m_rows : $T2</Size>
<ValuePointer>m_storage.m_data</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<!-- Dynamic Column Vector -->
<Type Name="Eigen::Matrix&lt;*,1,-1,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,1,-1,*,*,*&gt;"/>
<DisplayString Condition="m_storage.m_data == 0">empty</DisplayString>
<DisplayString Condition="m_storage.m_data != 0">[{m_storage.m_cols}] (dynamic column vector)</DisplayString>
<Expand>
<Item Name="[size]">m_storage.m_cols</Item>
<ArrayItems>
<Size>m_storage.m_cols</Size>
<ValuePointer>m_storage.m_data</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<!-- Dynamic Row Vector -->
<Type Name="Eigen::Matrix&lt;*,-1,1,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,-1,1,*,*,*&gt;"/>
<DisplayString Condition="m_storage.m_data == 0">empty</DisplayString>
<DisplayString Condition="m_storage.m_data != 0">[{m_storage.m_rows}] (dynamic row vector)</DisplayString>
<Expand>
<Item Name="[size]">m_storage.m_rows</Item>
<ArrayItems>
<Size>m_storage.m_rows</Size>
<ValuePointer>m_storage.m_data</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<!-- Fixed Vector -->
<Type Name="Eigen::Matrix&lt;*,1,1,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,1,1,*,*,*&gt;"/>
<DisplayString>[1] ({m_storage.m_data.array[0]})</DisplayString>
<Expand>
<Item Name="[x]">m_storage.m_data.array[0]</Item>
</Expand>
</Type>
<Type Name="Eigen::Matrix&lt;*,2,1,*,*,*&gt;">
<AlternativeType Name="Eigen::Matrix&lt;*,1,2,*,*,*&gt;"/>
<AlternativeType Name="Eigen::Array&lt;*,2,1,*,*,*&gt;"/>
<AlternativeType Name="Eigen::Array&lt;*,1,2,*,*,*&gt;"/>
<DisplayString>[2] ({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]})</DisplayString>
<Expand>
<Item Name="[x]">m_storage.m_data.array[0]</Item>
<Item Name="[y]">m_storage.m_data.array[1]</Item>
</Expand>
</Type>
<Type Name="Eigen::Matrix&lt;*,3,1,*,*,*&gt;">
<AlternativeType Name="Eigen::Matrix&lt;*,1,3,*,*,*&gt;"/>
<AlternativeType Name="Eigen::Array&lt;*,3,1,*,*,*&gt;"/>
<AlternativeType Name="Eigen::Array&lt;*,1,3,*,*,*&gt;"/>
<DisplayString>[3] ({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]}, {m_storage.m_data.array[2]})</DisplayString>
<Expand>
<Item Name="[x]">m_storage.m_data.array[0]</Item>
<Item Name="[y]">m_storage.m_data.array[1]</Item>
<Item Name="[z]">m_storage.m_data.array[2]</Item>
</Expand>
</Type>
<Type Name="Eigen::Matrix&lt;*,4,1,*,*,*&gt;">
<AlternativeType Name="Eigen::Matrix&lt;*,1,4,*,*,*&gt;"/>
<AlternativeType Name="Eigen::Array&lt;*,4,1,*,*,*&gt;"/>
<AlternativeType Name="Eigen::Array&lt;*,1,4,*,*,*&gt;"/>
<DisplayString>[4] ({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]}, {m_storage.m_data.array[2]}, {m_storage.m_data.array[3]})</DisplayString>
<Expand>
<Item Name="[x]">m_storage.m_data.array[0]</Item>
<Item Name="[y]">m_storage.m_data.array[1]</Item>
<Item Name="[z]">m_storage.m_data.array[2]</Item>
<Item Name="[w]">m_storage.m_data.array[3]</Item>
</Expand>
</Type>
</AutoVisualizer>
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<!-- Fixed x Fixed Matrix -->
<Type Name="Eigen::Matrix&lt;*,*,*,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,-1,-1,*,*,*&gt;"/>
<DisplayString>[{$T2}, {$T3}] (fixed matrix)</DisplayString>
<Expand>
<ArrayItems Condition="Flags%2"> <!-- row major layout -->
<Rank>2</Rank>
<Size>$i==0 ? $T2 : $T3</Size>
<ValuePointer>m_storage.m_data.array</ValuePointer>
</ArrayItems>
<ArrayItems Condition="!(Flags%2)"> <!-- column major layout -->
<Direction>Backward</Direction>
<Rank>2</Rank>
<Size>$i==0 ? $T2 : $T3</Size>
<ValuePointer>m_storage.m_data.array</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<!-- 2 x 2 Matrix -->
<Type Name="Eigen::Matrix&lt;*,2,2,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,2,2,*,*,*&gt;"/>
<DisplayString>[2, 2] (fixed matrix)</DisplayString>
<Expand>
<Synthetic Name="[row 0]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 0]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[2]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 1]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[2]}, {m_storage.m_data.array[3]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 1]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[1]}, {m_storage.m_data.array[3]})</DisplayString>
</Synthetic>
</Expand>
</Type>
<!-- 3 x 3 Matrix -->
<Type Name="Eigen::Matrix&lt;*,3,3,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,3,3,*,*,*&gt;"/>
<DisplayString>[3, 3] (fixed matrix)</DisplayString>
<Expand>
<Synthetic Name="[row 0]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]}, {m_storage.m_data.array[2]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 0]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[3]}, {m_storage.m_data.array[6]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 1]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[3]}, {m_storage.m_data.array[4]}, {m_storage.m_data.array[5]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 1]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[1]}, {m_storage.m_data.array[4]}, {m_storage.m_data.array[7]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 2]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[6]}, {m_storage.m_data.array[7]}, {m_storage.m_data.array[8]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 2]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[2]}, {m_storage.m_data.array[5]}, {m_storage.m_data.array[8]})</DisplayString>
</Synthetic>
</Expand>
</Type>
<!-- 4 x 4 Matrix -->
<Type Name="Eigen::Matrix&lt;*,4,4,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,4,4,*,*,*&gt;"/>
<DisplayString>[4, 4] (fixed matrix)</DisplayString>
<Expand>
<Synthetic Name="[row 0]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]}, {m_storage.m_data.array[2]}, {m_storage.m_data.array[3]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 0]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[0]}, {m_storage.m_data.array[4]}, {m_storage.m_data.array[8]}, {m_storage.m_data.array[12]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 1]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[4]}, {m_storage.m_data.array[5]}, {m_storage.m_data.array[6]}, {m_storage.m_data.array[7]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 1]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[1]}, {m_storage.m_data.array[5]}, {m_storage.m_data.array[9]}, {m_storage.m_data.array[13]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 2]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[8]}, {m_storage.m_data.array[9]}, {m_storage.m_data.array[10]}, {m_storage.m_data.array[11]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 2]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[2]}, {m_storage.m_data.array[6]}, {m_storage.m_data.array[10]}, {m_storage.m_data.array[14]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 3]" Condition="Flags%2">
<DisplayString>({m_storage.m_data.array[12]}, {m_storage.m_data.array[13]}, {m_storage.m_data.array[14]}, {m_storage.m_data.array[15]})</DisplayString>
</Synthetic>
<Synthetic Name="[row 3]" Condition="!(Flags%2)">
<DisplayString>({m_storage.m_data.array[3]}, {m_storage.m_data.array[7]}, {m_storage.m_data.array[11]}, {m_storage.m_data.array[15]})</DisplayString>
</Synthetic>
</Expand>
</Type>
<!-- Dynamic x Dynamic Matrix -->
<Type Name="Eigen::Matrix&lt;*,-1,-1,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,-1,-1,*,*,*&gt;"/>
<DisplayString Condition="m_storage.m_data == 0">empty</DisplayString>
<DisplayString Condition="m_storage.m_data != 0">[{m_storage.m_rows}, {m_storage.m_cols}] (dynamic matrix)</DisplayString>
<Expand>
<ArrayItems Condition="Flags%2"> <!-- row major layout -->
<Rank>2</Rank>
<Size>$i==0 ? m_storage.m_rows : m_storage.m_cols</Size>
<ValuePointer>m_storage.m_data</ValuePointer>
</ArrayItems>
<ArrayItems Condition="!(Flags%2)"> <!-- column major layout -->
<Direction>Backward</Direction>
<Rank>2</Rank>
<Size>$i==0 ? m_storage.m_rows : m_storage.m_cols</Size>
<ValuePointer>m_storage.m_data</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<!-- Fixed x Dynamic Matrix -->
<Type Name="Eigen::Matrix&lt;*,*,-1,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,*,-1,*,*,*&gt;"/>
<DisplayString Condition="m_storage.m_data == 0">empty</DisplayString>
<DisplayString Condition="m_storage.m_data != 0">[{$T2}, {m_storage.m_cols}] (dynamic column matrix)</DisplayString>
<Expand>
<ArrayItems Condition="Flags%2"> <!-- row major layout -->
<Rank>2</Rank>
<Size>$i==0 ? $T2 : m_storage.m_cols</Size>
<ValuePointer>m_storage.m_data</ValuePointer>
</ArrayItems>
<ArrayItems Condition="!(Flags%2)"> <!-- column major layout -->
<Direction>Backward</Direction>
<Rank>2</Rank>
<Size>$i==0 ? $T2 : m_storage.m_cols</Size>
<ValuePointer>m_storage.m_data</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<!-- Dynamic x Fixed Matrix -->
<Type Name="Eigen::Matrix&lt;*,-1,*,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,-1,*,*,*,*&gt;"/>
<DisplayString Condition="m_storage.m_data == 0">empty</DisplayString>
<DisplayString Condition="m_storage.m_data != 0">[{m_storage.m_rows}, {$T2}] (dynamic row matrix)</DisplayString>
<Expand>
<ArrayItems Condition="Flags%2"> <!-- row major layout -->
<Rank>2</Rank>
<Size>$i==0 ? m_storage.m_rows : $T2</Size>
<ValuePointer>m_storage.m_data</ValuePointer>
</ArrayItems>
<ArrayItems Condition="!(Flags%2)"> <!-- column major layout -->
<Direction>Backward</Direction>
<Rank>2</Rank>
<Size>$i==0 ? m_storage.m_rows : $T2</Size>
<ValuePointer>m_storage.m_data</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<!-- Dynamic Column Vector -->
<Type Name="Eigen::Matrix&lt;*,1,-1,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,1,-1,*,*,*&gt;"/>
<DisplayString Condition="m_storage.m_data == 0">empty</DisplayString>
<DisplayString Condition="m_storage.m_data != 0">[{m_storage.m_cols}] (dynamic column vector)</DisplayString>
<Expand>
<Item Name="[size]">m_storage.m_cols</Item>
<ArrayItems>
<Size>m_storage.m_cols</Size>
<ValuePointer>m_storage.m_data</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<!-- Dynamic Row Vector -->
<Type Name="Eigen::Matrix&lt;*,-1,1,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,-1,1,*,*,*&gt;"/>
<DisplayString Condition="m_storage.m_data == 0">empty</DisplayString>
<DisplayString Condition="m_storage.m_data != 0">[{m_storage.m_rows}] (dynamic row vector)</DisplayString>
<Expand>
<Item Name="[size]">m_storage.m_rows</Item>
<ArrayItems>
<Size>m_storage.m_rows</Size>
<ValuePointer>m_storage.m_data</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<!-- Fixed Vector -->
<Type Name="Eigen::Matrix&lt;*,1,1,*,*,*&gt;">
<AlternativeType Name="Eigen::Array&lt;*,1,1,*,*,*&gt;"/>
<DisplayString>[1] ({m_storage.m_data.array[0]})</DisplayString>
<Expand>
<Item Name="[x]">m_storage.m_data.array[0]</Item>
</Expand>
</Type>
<Type Name="Eigen::Matrix&lt;*,2,1,*,*,*&gt;">
<AlternativeType Name="Eigen::Matrix&lt;*,1,2,*,*,*&gt;"/>
<AlternativeType Name="Eigen::Array&lt;*,2,1,*,*,*&gt;"/>
<AlternativeType Name="Eigen::Array&lt;*,1,2,*,*,*&gt;"/>
<DisplayString>[2] ({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]})</DisplayString>
<Expand>
<Item Name="[x]">m_storage.m_data.array[0]</Item>
<Item Name="[y]">m_storage.m_data.array[1]</Item>
</Expand>
</Type>
<Type Name="Eigen::Matrix&lt;*,3,1,*,*,*&gt;">
<AlternativeType Name="Eigen::Matrix&lt;*,1,3,*,*,*&gt;"/>
<AlternativeType Name="Eigen::Array&lt;*,3,1,*,*,*&gt;"/>
<AlternativeType Name="Eigen::Array&lt;*,1,3,*,*,*&gt;"/>
<DisplayString>[3] ({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]}, {m_storage.m_data.array[2]})</DisplayString>
<Expand>
<Item Name="[x]">m_storage.m_data.array[0]</Item>
<Item Name="[y]">m_storage.m_data.array[1]</Item>
<Item Name="[z]">m_storage.m_data.array[2]</Item>
</Expand>
</Type>
<Type Name="Eigen::Matrix&lt;*,4,1,*,*,*&gt;">
<AlternativeType Name="Eigen::Matrix&lt;*,1,4,*,*,*&gt;"/>
<AlternativeType Name="Eigen::Array&lt;*,4,1,*,*,*&gt;"/>
<AlternativeType Name="Eigen::Array&lt;*,1,4,*,*,*&gt;"/>
<DisplayString>[4] ({m_storage.m_data.array[0]}, {m_storage.m_data.array[1]}, {m_storage.m_data.array[2]}, {m_storage.m_data.array[3]})</DisplayString>
<Expand>
<Item Name="[x]">m_storage.m_data.array[0]</Item>
<Item Name="[y]">m_storage.m_data.array[1]</Item>
<Item Name="[z]">m_storage.m_data.array[2]</Item>
<Item Name="[w]">m_storage.m_data.array[3]</Item>
</Expand>
</Type>
</AutoVisualizer>

View File

@@ -1,295 +1,295 @@
; ***************************************************************
; * Eigen Visualizer
; *
; * Author: Hauke Heibel <hauke.heibel@gmail.com>
; *
; * Support the enhanced debugging of the following Eigen
; * types (*: any, +:fixed dimension) :
; *
; * - Eigen::Matrix<*,4,1,*,*,*> and Eigen::Matrix<*,1,4,*,*,*>
; * - Eigen::Matrix<*,3,1,*,*,*> and Eigen::Matrix<*,1,3,*,*,*>
; * - Eigen::Matrix<*,2,1,*,*,*> and Eigen::Matrix<*,1,2,*,*,*>
; * - Eigen::Matrix<*,-1,-1,*,*,*>
; * - Eigen::Matrix<*,+,-1,*,*,*>
; * - Eigen::Matrix<*,-1,+,*,*,*>
; * - Eigen::Matrix<*,+,+,*,*,*>
; *
; * Matrices are displayed properly independently of the memory
; * alignment (RowMajor vs. ColMajor).
; *
; * This file is distributed WITHOUT ANY WARRANTY. Please ensure
; * that your original autoexp.dat file is copied to a safe
; * place before proceeding with its modification.
; ***************************************************************
[Visualizer]
; Fixed size 4-vectors
Eigen::Matrix<*,4,1,*,*,*>|Eigen::Matrix<*,1,4,*,*,*>{
children
(
#(
[internals]: [$c,!],
x : ($c.m_storage.m_data.array)[0],
y : ($c.m_storage.m_data.array)[1],
z : ($c.m_storage.m_data.array)[2],
w : ($c.m_storage.m_data.array)[3]
)
)
preview
(
#(
"[",
4,
"](",
#array(expr: $e.m_storage.m_data.array[$i], size: 4),
")"
)
)
}
; Fixed size 3-vectors
Eigen::Matrix<*,3,1,*,*,*>|Eigen::Matrix<*,1,3,*,*,*>{
children
(
#(
[internals]: [$c,!],
x : ($c.m_storage.m_data.array)[0],
y : ($c.m_storage.m_data.array)[1],
z : ($c.m_storage.m_data.array)[2]
)
)
preview
(
#(
"[",
3,
"](",
#array(expr: $e.m_storage.m_data.array[$i], size: 3),
")"
)
)
}
; Fixed size 2-vectors
Eigen::Matrix<*,2,1,*,*,*>|Eigen::Matrix<*,1,2,*,*,*>{
children
(
#(
[internals]: [$c,!],
x : ($c.m_storage.m_data.array)[0],
y : ($c.m_storage.m_data.array)[1]
)
)
preview
(
#(
"[",
2,
"](",
#array(expr: $e.m_storage.m_data.array[$i], size: 2),
")"
)
)
}
; Fixed size 1-vectors
Eigen::Matrix<*,1,1,*,*,*>|Eigen::Matrix<*,1,1,*,*,*>{
children
(
#(
[internals]: [$c,!],
x : ($c.m_storage.m_data.array)[0]
)
)
preview
(
#(
"[",
1,
"](",
#array(expr: $e.m_storage.m_data.array[$i], size: 1),
")"
)
)
}
; Dynamic matrices (ColMajor and RowMajor support)
Eigen::Matrix<*,-1,-1,*,*,*>{
children
(
#(
[internals]: [$c,!],
rows: $c.m_storage.m_rows,
cols: $c.m_storage.m_cols,
; Check for RowMajorBit
#if ($c.Flags & 0x1) (
#array(
rank: 2,
base: 0,
expr: ($c.m_storage.m_data)[($i % $c.m_storage.m_rows)*$c.m_storage.m_cols + (($i- $i % $c.m_storage.m_rows)/$c.m_storage.m_rows)],
size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.m_storage.m_cols
)
) #else (
#array(
rank: 2,
base: 0,
expr: ($c.m_storage.m_data)[$i],
size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.m_storage.m_cols
)
)
)
)
preview
(
#(
"[",
$c.m_storage.m_rows,
",",
$c.m_storage.m_cols,
"](",
#array(
expr : [($c.m_storage.m_data)[$i],g],
size : $c.m_storage.m_rows*$c.m_storage.m_cols
),
")"
)
)
}
; Fixed rows, dynamic columns matrix (ColMajor and RowMajor support)
Eigen::Matrix<*,*,-1,*,*,*>{
children
(
#(
[internals]: [$c,!],
rows: $c.RowsAtCompileTime,
cols: $c.m_storage.m_cols,
; Check for RowMajorBit
#if ($c.Flags & 0x1) (
#array(
rank: 2,
base: 0,
expr: ($c.m_storage.m_data)[($i % $c.RowsAtCompileTime)*$c.m_storage.m_cols + (($i- $i % $c.RowsAtCompileTime)/$c.RowsAtCompileTime)],
size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.m_storage.m_cols
)
) #else (
#array(
rank: 2,
base: 0,
expr: ($c.m_storage.m_data)[$i],
size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.m_storage.m_cols
)
)
)
)
preview
(
#(
"[",
$c.RowsAtCompileTime,
",",
$c.m_storage.m_cols,
"](",
#array(
expr : [($c.m_storage.m_data)[$i],g],
size : $c.RowsAtCompileTime*$c.m_storage.m_cols
),
")"
)
)
}
; Dynamic rows, fixed columns matrix (ColMajor and RowMajor support)
Eigen::Matrix<*,-1,*,*,*,*>{
children
(
#(
[internals]: [$c,!],
rows: $c.m_storage.m_rows,
cols: $c.ColsAtCompileTime,
; Check for RowMajorBit
#if ($c.Flags & 0x1) (
#array(
rank: 2,
base: 0,
expr: ($c.m_storage.m_data)[($i % $c.m_storage.m_rows)*$c.ColsAtCompileTime + (($i- $i % $c.m_storage.m_rows)/$c.m_storage.m_rows)],
size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.ColsAtCompileTime
)
) #else (
#array(
rank: 2,
base: 0,
expr: ($c.m_storage.m_data)[$i],
size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.ColsAtCompileTime
)
)
)
)
preview
(
#(
"[",
$c.m_storage.m_rows,
",",
$c.ColsAtCompileTime,
"](",
#array(
expr : [($c.m_storage.m_data)[$i],g],
size : $c.m_storage.m_rows*$c.ColsAtCompileTime
),
")"
)
)
}
; Fixed size matrix (ColMajor and RowMajor support)
Eigen::Matrix<*,*,*,*,*,*>{
children
(
#(
[internals]: [$c,!],
rows: $c.RowsAtCompileTime,
cols: $c.ColsAtCompileTime,
; Check for RowMajorBit
#if ($c.Flags & 0x1) (
#array(
rank: 2,
base: 0,
expr: ($c.m_storage.m_data.array)[($i % $c.RowsAtCompileTime)*$c.ColsAtCompileTime + (($i- $i % $c.RowsAtCompileTime)/$c.RowsAtCompileTime)],
size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.ColsAtCompileTime
)
) #else (
#array(
rank: 2,
base: 0,
expr: ($c.m_storage.m_data.array)[$i],
size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.ColsAtCompileTime
)
)
)
)
preview
(
#(
"[",
$c.RowsAtCompileTime,
",",
$c.ColsAtCompileTime,
"](",
#array(
expr : [($c.m_storage.m_data.array)[$i],g],
size : $c.RowsAtCompileTime*$c.ColsAtCompileTime
),
")"
)
)
}
; ***************************************************************
; * Eigen Visualizer
; *
; * Author: Hauke Heibel <hauke.heibel@gmail.com>
; *
; * Support the enhanced debugging of the following Eigen
; * types (*: any, +:fixed dimension) :
; *
; * - Eigen::Matrix<*,4,1,*,*,*> and Eigen::Matrix<*,1,4,*,*,*>
; * - Eigen::Matrix<*,3,1,*,*,*> and Eigen::Matrix<*,1,3,*,*,*>
; * - Eigen::Matrix<*,2,1,*,*,*> and Eigen::Matrix<*,1,2,*,*,*>
; * - Eigen::Matrix<*,-1,-1,*,*,*>
; * - Eigen::Matrix<*,+,-1,*,*,*>
; * - Eigen::Matrix<*,-1,+,*,*,*>
; * - Eigen::Matrix<*,+,+,*,*,*>
; *
; * Matrices are displayed properly independently of the memory
; * alignment (RowMajor vs. ColMajor).
; *
; * This file is distributed WITHOUT ANY WARRANTY. Please ensure
; * that your original autoexp.dat file is copied to a safe
; * place before proceeding with its modification.
; ***************************************************************
[Visualizer]
; Fixed size 4-vectors
Eigen::Matrix<*,4,1,*,*,*>|Eigen::Matrix<*,1,4,*,*,*>{
children
(
#(
[internals]: [$c,!],
x : ($c.m_storage.m_data.array)[0],
y : ($c.m_storage.m_data.array)[1],
z : ($c.m_storage.m_data.array)[2],
w : ($c.m_storage.m_data.array)[3]
)
)
preview
(
#(
"[",
4,
"](",
#array(expr: $e.m_storage.m_data.array[$i], size: 4),
")"
)
)
}
; Fixed size 3-vectors
Eigen::Matrix<*,3,1,*,*,*>|Eigen::Matrix<*,1,3,*,*,*>{
children
(
#(
[internals]: [$c,!],
x : ($c.m_storage.m_data.array)[0],
y : ($c.m_storage.m_data.array)[1],
z : ($c.m_storage.m_data.array)[2]
)
)
preview
(
#(
"[",
3,
"](",
#array(expr: $e.m_storage.m_data.array[$i], size: 3),
")"
)
)
}
; Fixed size 2-vectors
Eigen::Matrix<*,2,1,*,*,*>|Eigen::Matrix<*,1,2,*,*,*>{
children
(
#(
[internals]: [$c,!],
x : ($c.m_storage.m_data.array)[0],
y : ($c.m_storage.m_data.array)[1]
)
)
preview
(
#(
"[",
2,
"](",
#array(expr: $e.m_storage.m_data.array[$i], size: 2),
")"
)
)
}
; Fixed size 1-vectors
Eigen::Matrix<*,1,1,*,*,*>|Eigen::Matrix<*,1,1,*,*,*>{
children
(
#(
[internals]: [$c,!],
x : ($c.m_storage.m_data.array)[0]
)
)
preview
(
#(
"[",
1,
"](",
#array(expr: $e.m_storage.m_data.array[$i], size: 1),
")"
)
)
}
; Dynamic matrices (ColMajor and RowMajor support)
Eigen::Matrix<*,-1,-1,*,*,*>{
children
(
#(
[internals]: [$c,!],
rows: $c.m_storage.m_rows,
cols: $c.m_storage.m_cols,
; Check for RowMajorBit
#if ($c.Flags & 0x1) (
#array(
rank: 2,
base: 0,
expr: ($c.m_storage.m_data)[($i % $c.m_storage.m_rows)*$c.m_storage.m_cols + (($i- $i % $c.m_storage.m_rows)/$c.m_storage.m_rows)],
size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.m_storage.m_cols
)
) #else (
#array(
rank: 2,
base: 0,
expr: ($c.m_storage.m_data)[$i],
size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.m_storage.m_cols
)
)
)
)
preview
(
#(
"[",
$c.m_storage.m_rows,
",",
$c.m_storage.m_cols,
"](",
#array(
expr : [($c.m_storage.m_data)[$i],g],
size : $c.m_storage.m_rows*$c.m_storage.m_cols
),
")"
)
)
}
; Fixed rows, dynamic columns matrix (ColMajor and RowMajor support)
Eigen::Matrix<*,*,-1,*,*,*>{
children
(
#(
[internals]: [$c,!],
rows: $c.RowsAtCompileTime,
cols: $c.m_storage.m_cols,
; Check for RowMajorBit
#if ($c.Flags & 0x1) (
#array(
rank: 2,
base: 0,
expr: ($c.m_storage.m_data)[($i % $c.RowsAtCompileTime)*$c.m_storage.m_cols + (($i- $i % $c.RowsAtCompileTime)/$c.RowsAtCompileTime)],
size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.m_storage.m_cols
)
) #else (
#array(
rank: 2,
base: 0,
expr: ($c.m_storage.m_data)[$i],
size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.m_storage.m_cols
)
)
)
)
preview
(
#(
"[",
$c.RowsAtCompileTime,
",",
$c.m_storage.m_cols,
"](",
#array(
expr : [($c.m_storage.m_data)[$i],g],
size : $c.RowsAtCompileTime*$c.m_storage.m_cols
),
")"
)
)
}
; Dynamic rows, fixed columns matrix (ColMajor and RowMajor support)
Eigen::Matrix<*,-1,*,*,*,*>{
children
(
#(
[internals]: [$c,!],
rows: $c.m_storage.m_rows,
cols: $c.ColsAtCompileTime,
; Check for RowMajorBit
#if ($c.Flags & 0x1) (
#array(
rank: 2,
base: 0,
expr: ($c.m_storage.m_data)[($i % $c.m_storage.m_rows)*$c.ColsAtCompileTime + (($i- $i % $c.m_storage.m_rows)/$c.m_storage.m_rows)],
size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.ColsAtCompileTime
)
) #else (
#array(
rank: 2,
base: 0,
expr: ($c.m_storage.m_data)[$i],
size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.ColsAtCompileTime
)
)
)
)
preview
(
#(
"[",
$c.m_storage.m_rows,
",",
$c.ColsAtCompileTime,
"](",
#array(
expr : [($c.m_storage.m_data)[$i],g],
size : $c.m_storage.m_rows*$c.ColsAtCompileTime
),
")"
)
)
}
; Fixed size matrix (ColMajor and RowMajor support)
Eigen::Matrix<*,*,*,*,*,*>{
children
(
#(
[internals]: [$c,!],
rows: $c.RowsAtCompileTime,
cols: $c.ColsAtCompileTime,
; Check for RowMajorBit
#if ($c.Flags & 0x1) (
#array(
rank: 2,
base: 0,
expr: ($c.m_storage.m_data.array)[($i % $c.RowsAtCompileTime)*$c.ColsAtCompileTime + (($i- $i % $c.RowsAtCompileTime)/$c.RowsAtCompileTime)],
size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.ColsAtCompileTime
)
) #else (
#array(
rank: 2,
base: 0,
expr: ($c.m_storage.m_data.array)[$i],
size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.ColsAtCompileTime
)
)
)
)
preview
(
#(
"[",
$c.RowsAtCompileTime,
",",
$c.ColsAtCompileTime,
"](",
#array(
expr : [($c.m_storage.m_data.array)[$i],g],
size : $c.RowsAtCompileTime*$c.ColsAtCompileTime
),
")"
)
)
}

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

@@ -36,9 +36,9 @@ option in `find_package`:
```
find_package(Eigen3 3.4 REQUIRED NO_MODULE) # Restricts to 3.4.z
```
or to support a range of versions:
Starting with Eigen 3.4.1, we also support a range spanning major versions:
```
find_package(Eigen3 3.4...5 REQUIRED NO_MODULE) # Any version >=3.4.0 but <6.0.0.
find_package(Eigen3 3.4...5 REQUIRED NO_MODULE) # Any version >=3.4.1 but <6.0.0.
```
Do not forget to set the <a href="https://cmake.org/cmake/help/v3.7/variable/CMAKE_PREFIX_PATH.html">\c CMAKE_PREFIX_PATH </a> variable if Eigen is not installed in a default location or if you want to pick a specific version. For instance:

View File

@@ -22,9 +22,11 @@ add_custom_target(lapack)
include_directories(../blas)
set(EigenLapack_SRCS
dsecnd_INT_CPU_TIME.cpp second_INT_CPU_TIME.cpp single.cpp double.cpp complex_single.cpp complex_double.cpp ../blas/xerbla.cpp
dsecnd_INT_CPU_TIME.cpp second_INT_CPU_TIME.cpp single.cpp double.cpp complex_single.cpp complex_double.cpp
)
set(EIGEN_LAPACK_DEF "eigen_lapack_cpp.def")
if(EIGEN_Fortran_COMPILER_WORKS)
set(EigenLapack_SRCS ${EigenLapack_SRCS}
@@ -40,6 +42,8 @@ set(EigenLapack_SRCS ${EigenLapack_SRCS}
slamch.f dlamch.f
)
set(EIGEN_LAPACK_DEF "eigen_lapack.def")
option(EIGEN_ENABLE_LAPACK_TESTS OFF "Enable the Lapack unit tests")
if(EIGEN_ENABLE_LAPACK_TESTS)
@@ -98,12 +102,16 @@ endif()
set(EIGEN_LAPACK_TARGETS "")
add_library(eigen_lapack_static STATIC ${EigenLapack_SRCS} ${ReferenceLapack_SRCS})
target_link_libraries(eigen_lapack_static eigen_blas_static)
list(APPEND EIGEN_LAPACK_TARGETS eigen_lapack_static)
if (EIGEN_BUILD_SHARED_LIBS)
add_library(eigen_lapack SHARED ${EigenLapack_SRCS})
list(APPEND EIGEN_LAPACK_TARGETS eigen_lapack)
add_library(eigen_lapack SHARED ${EigenLapack_SRCS} ${EIGEN_LAPACK_DEF})
# Build LAPACK but link BLAS.
target_compile_definitions(eigen_lapack PUBLIC "EIGEN_BLAS_LINK_DLL" "EIGEN_LAPACK_BUILD_DLL")
target_link_libraries(eigen_lapack eigen_blas)
set_target_properties(eigen_lapack PROPERTIES CXX_VISIBILITY_PRESET hidden)
list(APPEND EIGEN_LAPACK_TARGETS eigen_lapack)
endif()
foreach(target IN LISTS EIGEN_LAPACK_TARGETS)

View File

@@ -11,7 +11,7 @@
#include <Eigen/Cholesky>
// POTRF computes the Cholesky factorization of a real symmetric positive definite matrix A.
EIGEN_LAPACK_FUNC(potrf)(char *uplo, int *n, RealScalar *pa, int *lda, int *info) {
EIGEN_LAPACK_FUNC(potrf)(const char *uplo, int *n, RealScalar *pa, int *lda, int *info) {
*info = 0;
if (UPLO(*uplo) == INVALID)
*info = -1;
@@ -38,7 +38,8 @@ EIGEN_LAPACK_FUNC(potrf)(char *uplo, int *n, RealScalar *pa, int *lda, int *info
// POTRS solves a system of linear equations A*X = B with a symmetric
// positive definite matrix A using the Cholesky factorization
// A = U**T*U or A = L*L**T computed by DPOTRF.
EIGEN_LAPACK_FUNC(potrs)(char *uplo, int *n, int *nrhs, RealScalar *pa, int *lda, RealScalar *pb, int *ldb, int *info) {
EIGEN_LAPACK_FUNC(potrs)
(const char *uplo, int *n, int *nrhs, RealScalar *pa, int *lda, RealScalar *pb, int *ldb, int *info) {
*info = 0;
if (UPLO(*uplo) == INVALID)
*info = -1;

View File

@@ -15,6 +15,8 @@
#include <ctime>
#endif
#include "lapack.h"
extern "C" {
double dsecnd_();
}

143
lapack/eigen_lapack.def Normal file
View File

@@ -0,0 +1,143 @@
; Definition file for eigen_lapack.dll.
LIBRARY eigen_lapack
EXPORTS
; Eigen C/C++ implementations
; Utilities
xerbla_
; Eigenvalues
ssyev_
dsyev_
; LU
sgetrf_
sgetrs_
dgetrf_
dgetrs_
cgetrf_
cgetrs_
zgetrf_
zgetrs_
; QR
spotrf_
spotrs_
dpotrf_
dpotrs_
cpotrf_
cpotrs_
zpotrf_
zpotrs_
; SVD
sgesdd_
sgesvd_
dgesdd_
dgesvd_
cgesdd_
cgesvd_
zgesdd_
zgesvd_
; Time
second_
dsecnd_
; Fortran implementations
clacgv_
zlacgv_
sladiv_
dladiv_
cladiv_
zladiv_
slamch_
dlamch_
slamc3_
dlamc3_
slapy2_
dlapy2_
slapy3_
dlapy3_
slarf_
dlarf_
clarf_
zlarf_
slarfb_
dlarfb_
clarfb_
zlarfb_
slarfg_
dlarfg_
clarfg_
zlarfg_
slarft_
dlarft_
clarft_
zlarft_
ilaclc_
ilaclr_
iladlc_
iladlr_
ilaslc_
ilaslr_
ilazlc_
ilazlr_
; Missing
; csymv_
; zsymv_
; cspmv_
; zspmv_
; csyr_
; zsyr_
; cspr_
; zspr_
; sgemt_
; dgemt_
; cgemt_
; zgemt_
; sgema_
; dgema_
; cgema_
; zgema_
; sgems_
; dgems_
; cgems_
; zgems_
; sgetf2_
; dgetf2_
; cgetf2_
; zgetf2_
; slaswp_
; dlaswp_
; claswp_
; zlaswp_
; sgesv_
; dgesv_
; cgesv_
; zgesv_
; spotf2_
; dpotf2_
; cpotf2_
; zpotf2_
; slauu2_
; dlauu2_
; clauu2_
; zlauu2_
; slauum_
; dlauum_
; clauum_
; zlauum_
; strti2_
; dtrti2_
; ctrti2_
; ztrti2_
; strtri_
; dtrtri_
; ctrtri_
; ztrtri_
; spotri_
; dpotri_
; cpotri_
; zpotri_

143
lapack/eigen_lapack_cpp.def Normal file
View File

@@ -0,0 +1,143 @@
; Definition file for eigen_lapack.dll, containing only the C++ implementations.
LIBRARY eigen_lapack
EXPORTS
; Eigen C/C++ implementations
; Utilities
xerbla_
; Eigenvalues
ssyev_
dsyev_
; LU
sgetrf_
sgetrs_
dgetrf_
dgetrs_
cgetrf_
cgetrs_
zgetrf_
zgetrs_
; QR
spotrf_
spotrs_
dpotrf_
dpotrs_
cpotrf_
cpotrs_
zpotrf_
zpotrs_
; SVD
sgesdd_
sgesvd_
dgesdd_
dgesvd_
cgesdd_
cgesvd_
zgesdd_
zgesvd_
; Time
second_
dsecnd_
; Fortran implementations
; clacgv_
; zlacgv_
; sladiv_
; dladiv_
; cladiv_
; zladiv_
; slamch_
; dlamch_
; slamc3_
; dlamc3_
; slapy2_
; dlapy2_
; slapy3_
; dlapy3_
; slarf_
; dlarf_
; clarf_
; zlarf_
; slarfb_
; dlarfb_
; clarfb_
; zlarfb_
; slarfg_
; dlarfg_
; clarfg_
; zlarfg_
; slarft_
; dlarft_
; clarft_
; zlarft_
; ilaclc_
; ilaclr_
; iladlc_
; iladlr_
; ilaslc_
; ilaslr_
; ilazlc_
; ilazlr_
; Missing
; csymv_
; zsymv_
; cspmv_
; zspmv_
; csyr_
; zsyr_
; cspr_
; zspr_
; sgemt_
; dgemt_
; cgemt_
; zgemt_
; sgema_
; dgema_
; cgema_
; zgema_
; sgems_
; dgems_
; cgems_
; zgems_
; sgetf2_
; dgetf2_
; cgetf2_
; zgetf2_
; slaswp_
; dlaswp_
; claswp_
; zlaswp_
; sgesv_
; dgesv_
; cgesv_
; zgesv_
; spotf2_
; dpotf2_
; cpotf2_
; zpotf2_
; slauu2_
; dlauu2_
; clauu2_
; zlauu2_
; slauum_
; dlauum_
; clauum_
; zlauum_
; strti2_
; dtrti2_
; ctrti2_
; ztrti2_
; strtri_
; dtrtri_
; ctrtri_
; ztrtri_
; spotri_
; dpotri_
; cpotri_
; zpotri_

View File

@@ -12,7 +12,8 @@
// computes eigen values and vectors of a general N-by-N matrix A
EIGEN_LAPACK_FUNC(syev)
(char* jobz, char* uplo, int* n, Scalar* a, int* lda, Scalar* w, Scalar* /*work*/, int* lwork, int* info) {
(const char* jobz, const char* uplo, int* n, RealScalar* ra, int* lda, RealScalar* rw, RealScalar* /*work*/, int* lwork,
int* info) {
// TODO exploit the work buffer
bool query_size = *lwork == -1;
@@ -40,6 +41,9 @@ EIGEN_LAPACK_FUNC(syev)
if (*n == 0) return;
Scalar* a = reinterpret_cast<Scalar*>(ra);
Scalar* w = reinterpret_cast<Scalar*>(rw);
PlainMatrixType mat(*n, *n);
if (UPLO(*uplo) == UP)
mat = matrix(a, *n, *n, *lda).adjoint();

View File

@@ -3,131 +3,192 @@
#include "../blas/blas.h"
#if defined(_WIN32)
#if defined(EIGEN_LAPACK_BUILD_DLL)
#define EIGEN_LAPACK_API __declspec(dllexport)
#elif defined(EIGEN_LAPACK_LINK_DLL)
#define EIGEN_LAPACK_API __declspec(dllimport)
#else
#define EIGEN_LAPACK_API
#endif
#elif ((defined(__GNUC__) && __GNUC__ >= 4) || defined(__clang__)) && defined(EIGEN_LAPACK_BUILD_DLL)
#define EIGEN_LAPACK_API __attribute__((visibility("default")))
#else
#define EIGEN_LAPACK_API
#endif
#ifdef __cplusplus
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_LAPACK_API void BLASFUNC(csymv)(const char *, const int *, const float *, const float *, const int *,
const float *, const int *, const float *, float *, const int *);
EIGEN_LAPACK_API void BLASFUNC(zsymv)(const char *, const int *, const double *, const double *, const int *,
const double *, const int *, const double *, double *, const int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(cspmv)(char *, int *, float *, float *, float *, int *, float *, float *, int *);
EIGEN_LAPACK_API void BLASFUNC(zspmv)(char *, int *, double *, double *, double *, int *, double *, double *, int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(csyr)(char *, int *, float *, float *, int *, float *, int *);
EIGEN_LAPACK_API void BLASFUNC(zsyr)(char *, int *, double *, double *, int *, double *, int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(cspr)(char *, int *, float *, float *, int *, float *);
EIGEN_LAPACK_API void BLASFUNC(zspr)(char *, int *, double *, double *, int *, double *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(sgemt)(char *, int *, int *, float *, float *, int *, float *, int *);
EIGEN_LAPACK_API void BLASFUNC(dgemt)(char *, int *, int *, double *, double *, int *, double *, int *);
EIGEN_LAPACK_API void BLASFUNC(cgemt)(char *, int *, int *, float *, float *, int *, float *, int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(sgema)(char *, char *, int *, int *, float *, float *, int *, float *, float *, int *,
float *, int *);
EIGEN_LAPACK_API void BLASFUNC(dgema)(char *, char *, int *, int *, double *, double *, int *, double *, double *,
int *, double *, int *);
EIGEN_LAPACK_API void BLASFUNC(cgema)(char *, char *, int *, int *, float *, float *, int *, float *, float *, int *,
float *, int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(sgems)(char *, char *, int *, int *, float *, float *, int *, float *, float *, int *,
float *, int *);
EIGEN_LAPACK_API void BLASFUNC(dgems)(char *, char *, int *, int *, double *, double *, int *, double *, double *,
int *, double *, int *);
EIGEN_LAPACK_API void BLASFUNC(cgems)(char *, char *, int *, int *, float *, float *, int *, float *, float *, int *,
float *, int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(sgetf2)(int *, int *, float *, int *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(dgetf2)(int *, int *, double *, int *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(qgetf2)(int *, int *, double *, int *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(cgetf2)(int *, int *, float *, int *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(zgetf2)(int *, int *, double *, int *, int *, int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(qgetrf)(int *, int *, double *, int *, int *, int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(slaswp)(int *, float *, int *, int *, int *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(dlaswp)(int *, double *, int *, int *, int *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(qlaswp)(int *, double *, int *, int *, int *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(claswp)(int *, float *, int *, int *, int *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(zlaswp)(int *, double *, int *, int *, int *, int *, int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(qgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(sgesv)(int *, int *, float *, int *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(dgesv)(int *, int *, double *, int *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(qgesv)(int *, int *, double *, int *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(cgesv)(int *, int *, float *, int *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(zgesv)(int *, int *, double *, int *, int *, double *, int *, int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(spotf2)(char *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(dpotf2)(char *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(qpotf2)(char *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(cpotf2)(char *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(zpotf2)(char *, int *, double *, int *, int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(qpotrf)(char *, int *, double *, int *, int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(slauu2)(char *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(dlauu2)(char *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(qlauu2)(char *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(clauu2)(char *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(zlauu2)(char *, int *, double *, int *, int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(slauum)(char *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(dlauum)(char *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(qlauum)(char *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(clauum)(char *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(zlauum)(char *, int *, double *, int *, int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(strti2)(char *, char *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(dtrti2)(char *, char *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(qtrti2)(char *, char *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(ctrti2)(char *, char *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(ztrti2)(char *, char *, int *, double *, int *, int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(strtri)(char *, char *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(dtrtri)(char *, char *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(qtrtri)(char *, char *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(ctrtri)(char *, char *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(ztrtri)(char *, char *, int *, double *, int *, int *);
EIGEN_LAPACK_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_LAPACK_API void BLASFUNC(spotri)(char *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(dpotri)(char *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(qpotri)(char *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(cpotri)(char *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(zpotri)(char *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(xpotri)(char *, int *, double *, int *, int *);
//-----------------------------------------------------------------------------
// Eigen C++ implementations.
//-----------------------------------------------------------------------------
// Cholesky.
EIGEN_LAPACK_API void BLASFUNC(spotrf)(const char *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(dpotrf)(const char *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(cpotrf)(const char *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(zpotrf)(const char *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(spotrs)(const char *, int *, int *, float *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(dpotrs)(const char *, int *, int *, double *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(cpotrs)(const char *, int *, int *, float *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(zpotrs)(const char *, int *, int *, double *, int *, double *, int *, int *);
// Eigenvalues.
EIGEN_LAPACK_API void BLASFUNC(ssyev)(const char *, const char *, int *, float *, int *, float *, float *, int *,
int *);
EIGEN_LAPACK_API void BLASFUNC(dsyev)(const char *, const char *, int *, double *, int *, double *, double *, int *,
int *);
// LU.
EIGEN_LAPACK_API void BLASFUNC(sgetrf)(int *, int *, float *, int *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(dgetrf)(int *, int *, double *, int *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(cgetrf)(int *, int *, float *, int *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(zgetrf)(int *, int *, double *, int *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(sgetrs)(const char *, int *, int *, float *, int *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(dgetrs)(const char *, int *, int *, double *, int *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(cgetrs)(const char *, int *, int *, float *, int *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(zgetrs)(const char *, int *, int *, double *, int *, int *, double *, int *, int *);
// SVD.
EIGEN_LAPACK_API void BLASFUNC(sgesdd)(const char *, int *, int *, float *, int *, float *, float *, int *, float *,
int *, float *, int *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(dgesdd)(const char *, int *, int *, double *, int *, double *, double *, int *, double *,
int *, double *, int *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(cgesdd)(const char *, int *, int *, float *, int *, float *, float *, int *, float *,
int *, float *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(zgesdd)(const char *, int *, int *, double *, int *, double *, double *, int *, double *,
int *, double *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(sgesvd)(const char *, const char *, int *, int *, float *, int *, float *, float *,
int *, float *, int *, float *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(dgesvd)(const char *, const char *, int *, int *, double *, int *, double *, double *,
int *, double *, int *, double *, int *, int *);
EIGEN_LAPACK_API void BLASFUNC(cgesvd)(const char *, const char *, int *, int *, float *, int *, float *, float *,
int *, float *, int *, float *, int *, float *, int *);
EIGEN_LAPACK_API void BLASFUNC(zgesvd)(const char *, const char *, int *, int *, double *, int *, double *, double *,
int *, double *, int *, double *, int *, double *, int *);
// Time.
EIGEN_LAPACK_API float BLASFUNC(second)();
EIGEN_LAPACK_API double BLASFUNC(dsecnd)();
#ifdef __cplusplus
}

View File

@@ -40,7 +40,7 @@ EIGEN_LAPACK_FUNC(getrf)(int *m, int *n, RealScalar *pa, int *lda, int *ipiv, in
// A * X = B or A' * X = B
// with a general N-by-N matrix A using the LU factorization computed by GETRF
EIGEN_LAPACK_FUNC(getrs)
(char *trans, int *n, int *nrhs, RealScalar *pa, int *lda, int *ipiv, RealScalar *pb, int *ldb, int *info) {
(const char *trans, int *n, int *nrhs, RealScalar *pa, int *lda, int *ipiv, RealScalar *pb, int *ldb, int *info) {
*info = 0;
if (OP(*trans) == INVALID)
*info = -1;

View File

@@ -15,6 +15,8 @@
#include <ctime>
#endif
#include "lapack.h"
extern "C" {
float second_();
}

View File

@@ -18,8 +18,9 @@
// computes the singular values/vectors a general M-by-N matrix A using divide-and-conquer
EIGEN_LAPACK_FUNC(gesdd)
(char *jobz, int *m, int *n, Scalar *a, int *lda, RealScalar *s, Scalar *u, int *ldu, Scalar *vt, int *ldvt,
Scalar * /*work*/, int *lwork, EIGEN_LAPACK_ARG_IF_COMPLEX(RealScalar * /*rwork*/) int * /*iwork*/, int *info) {
(const char *jobz, int *m, int *n, RealScalar *ra, int *lda, RealScalar *s, RealScalar *ru, int *ldu, RealScalar *rvt,
int *ldvt, RealScalar * /*work*/, int *lwork, EIGEN_LAPACK_ARG_IF_COMPLEX(RealScalar * /*rwork*/) int * /*iwork*/,
int *info) {
// TODO exploit the work buffer
bool query_size = *lwork == -1;
int diag_size = (std::min)(*m, *n);
@@ -53,37 +54,44 @@ EIGEN_LAPACK_FUNC(gesdd)
if (*n == 0 || *m == 0) return;
Scalar *a = reinterpret_cast<Scalar *>(ra);
Scalar *u = reinterpret_cast<Scalar *>(ru);
Scalar *vt = reinterpret_cast<Scalar *>(rvt);
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);
}
}
// computes the singular values/vectors a general M-by-N matrix A using two sided jacobi algorithm
EIGEN_LAPACK_FUNC(gesvd)
(char *jobu, char *jobv, int *m, int *n, Scalar *a, int *lda, RealScalar *s, Scalar *u, int *ldu, Scalar *vt, int *ldvt,
Scalar * /*work*/, int *lwork, EIGEN_LAPACK_ARG_IF_COMPLEX(RealScalar * /*rwork*/) int *info) {
(const char *jobu, const char *jobv, int *m, int *n, RealScalar *ra, int *lda, RealScalar *s, RealScalar *ru, int *ldu,
RealScalar *rvt, int *ldvt, RealScalar * /*work*/, int *lwork,
EIGEN_LAPACK_ARG_IF_COMPLEX(RealScalar * /*rwork*/) int *info) {
// TODO exploit the work buffer
bool query_size = *lwork == -1;
int diag_size = (std::min)(*m, *n);
@@ -116,6 +124,10 @@ EIGEN_LAPACK_FUNC(gesvd)
if (*n == 0 || *m == 0) return;
Scalar *a = reinterpret_cast<Scalar *>(ra);
Scalar *u = reinterpret_cast<Scalar *>(ru);
Scalar *vt = reinterpret_cast<Scalar *>(rvt);
PlainMatrixType mat(*m, *n);
mat = matrix(a, *m, *n, *lda);

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

@@ -323,6 +323,7 @@ ei_add_test(threads_runqueue "-pthread" "${CMAKE_THREAD_LIBS_INIT}")
ei_add_test(threads_non_blocking_thread_pool "-pthread" "${CMAKE_THREAD_LIBS_INIT}")
ei_add_test(threads_fork_join "-pthread" "${CMAKE_THREAD_LIBS_INIT}")
add_executable(bug1213 bug1213.cpp bug1213_main.cpp)
target_link_libraries(bug1213 Eigen3::Eigen)
check_cxx_compiler_flag("-ffast-math" COMPILER_SUPPORT_FASTMATH)
if(COMPILER_SUPPORT_FASTMATH)

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().homogeneous();
const auto left = Eigen::RowVector<Scalar, Size - 1>::Random().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

@@ -389,9 +389,6 @@ void print_gpu_device_info() {
std::cout << " warpSize: " << deviceProp.warpSize << std::endl;
std::cout << " regsPerBlock: " << deviceProp.regsPerBlock << std::endl;
std::cout << " concurrentKernels: " << deviceProp.concurrentKernels << std::endl;
std::cout << " clockRate: " << deviceProp.clockRate << std::endl;
std::cout << " canMapHostMemory: " << deviceProp.canMapHostMemory << std::endl;
std::cout << " computeMode: " << deviceProp.computeMode << std::endl;
}
#endif // EIGEN_GPUCC

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

@@ -186,7 +186,7 @@ inline void on_temporary_creation(long int size, int) {
namespace Eigen {
static std::vector<std::string> g_test_stack;
// level == 0 <=> abort if test fail
// level == 0 <=> return 1 if test fail
// level >= 1 <=> warning message to std::cerr if test fail
static int g_test_level = 0;
static int g_repeat = 1;
@@ -356,7 +356,7 @@ inline void verify_impl(bool condition, const char* testname, const char* file,
const int test_stack_size = static_cast<int>(Eigen::g_test_stack.size());
for (int i = test_stack_size - 1; i >= 0; --i) std::cerr << " - " << Eigen::g_test_stack[i] << "\n";
std::cerr << "\n";
if (Eigen::g_test_level == 0) abort();
if (Eigen::g_test_level == 0) exit(1);
}
}
@@ -858,6 +858,12 @@ inline void set_seed_from_string(const char* str) {
g_has_set_seed = true;
}
inline void set_seed_from_time() {
using namespace std::chrono;
long long ns = duration_cast<nanoseconds>(high_resolution_clock::now().time_since_epoch()).count();
g_seed = static_cast<decltype(g_seed)>(ns);
}
int main(int argc, char* argv[]) {
g_has_set_repeat = false;
g_has_set_seed = false;
@@ -896,7 +902,7 @@ int main(int argc, char* argv[]) {
char* env_EIGEN_SEED = getenv("EIGEN_SEED");
if (!g_has_set_seed && env_EIGEN_SEED) set_seed_from_string(env_EIGEN_SEED);
if (!g_has_set_seed) g_seed = (unsigned int)time(NULL);
if (!g_has_set_seed) set_seed_from_time();
if (!g_has_set_repeat) g_repeat = DEFAULT_REPEAT;
std::cout << "Initializing random number generator with seed " << g_seed << std::endl;

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));

View File

@@ -454,8 +454,16 @@ ArpackGeneralizedSelfAdjointEigenSolver<MatrixType, MatrixSolver, BisSPD>::compu
}
}
if (!(mode == 1 && isBempty) && !(mode == 2 && isBempty) && OP.info() != Success)
std::cout << "Error factoring matrix" << std::endl;
if (!(mode == 1 && isBempty) && !(mode == 2 && isBempty) && OP.info() != Success) {
m_info = OP.info() delete[] v;
delete[] iparam;
delete[] ipntr;
delete[] workd;
delete[] workl;
delete[] resid;
m_isInitialized = false;
return *this;
}
do {
internal::arpack_wrapper<Scalar, RealScalar>::saupd(&ido, bmat, &n, whch, &nev, &tol, resid, &ncv, v, &ldv, iparam,
@@ -572,7 +580,7 @@ ArpackGeneralizedSelfAdjointEigenSolver<MatrixType, MatrixSolver, BisSPD>::compu
delete[] workl;
delete[] resid;
m_isInitialized = true;
m_isInitialized = (m_info == Success);
return *this;
}