Uni20
Asynchronous tensor and runtime library.
Loading...
Searching...
No Matches
ops/tridiagonal_eigen.hpp
Go to the documentation of this file.
1#pragma once
2
13
14#include <span>
15#include <utility>
16
17namespace uni20::linalg
18{
19
33template <class BackendSelector, uni20::LapackReal Scalar, uni20::MutableRankedTensorView<2> EigenvectorTensor>
34void symmetric_tridiagonal_eigen(BackendSelector&& selector, std::span<Scalar> diagonal, std::span<Scalar> subdiagonal,
35 EigenvectorTensor&& eigenvectors, bool compute_vectors)
36{
37 auto eigenvector_descriptor = uni20::mdspec_of(eigenvectors);
38 dispatch_kernel(std::forward<BackendSelector>(selector),
39 symmetric_tridiagonal_eigen_op{.compute_vectors = compute_vectors}, diagonal, subdiagonal,
40 eigenvector_descriptor);
41}
42
44template <uni20::LapackReal Scalar, uni20::MutableRankedTensorView<2> EigenvectorTensor>
45void symmetric_tridiagonal_eigen(std::span<Scalar> diagonal, std::span<Scalar> subdiagonal,
46 EigenvectorTensor&& eigenvectors, bool compute_vectors)
47{
48 auto selector = select_backend(symmetric_tridiagonal_eigen_op{.compute_vectors = compute_vectors}, eigenvectors);
49 symmetric_tridiagonal_eigen(selector, diagonal, subdiagonal, std::forward<EigenvectorTensor>(eigenvectors),
50 compute_vectors);
51}
52
53} // namespace uni20::linalg
LAPACK backend for real symmetric tridiagonal eigensystems.
Operation-tag backend dispatch over tensor-view operands.
Definition linalg/async.hpp:28
constexpr auto select_backend(Operation const &operation, FirstTensor const &, RestTensors const &...)
Select the default backend list for an operation on Tensor operands.
Definition backend_selector.hpp:252
void dispatch_kernel(BackendSelector &&selector, Op op, Args &&... args)
Normalize a selector and dispatch or report that every eligible backend declined.
Definition dispatch.hpp:374
void symmetric_tridiagonal_eigen(BackendSelector &&selector, std::span< Scalar > diagonal, std::span< Scalar > subdiagonal, EigenvectorTensor &&eigenvectors, bool compute_vectors)
Overwrite a real symmetric tridiagonal matrix with its eigensystem.
Definition ops/tridiagonal_eigen.hpp:34
constexpr decltype(auto) mdspec_of(Tensor &tensor) noexcept(noexcept(tensor.mdspec()))
Return a tensor's immediate or descriptor-backed multidimensional metadata.
Definition tensor/concepts.hpp:50
Backend-independent operation values used with normalized kernel operands.
Symmetric tridiagonal eigensystem operation tag.
Definition operation_tags.hpp:301
bool compute_vectors
Definition operation_tags.hpp:303
Concepts for tensor-level objects that resolve mdspan kernel operands.