Uni20
Asynchronous tensor and runtime library.
Loading...
Searching...
No Matches
ops/nonsymmetric_eigen.hpp
Go to the documentation of this file.
1#pragma once
2
17
18#include <span>
19#include <utility>
20
21namespace uni20::linalg
22{
23
38template <KernelBackendSelector BackendSelector, uni20::MutableRankedTensorView<2> MatrixTensor, class EigenScalar,
39 uni20::MutableRankedTensorView<2> RightEigenvectorTensor>
40void nonsymmetric_eigen(BackendSelector&& selector, MatrixTensor&& matrix_work, std::span<EigenScalar> eigenvalues,
41 RightEigenvectorTensor&& right_eigenvectors, bool compute_right_vectors,
42 std::optional<Precision> requested = {})
43{
44 auto const p = detail::decomposition_precision(matrix_work, requested);
45 auto matrix_descriptor = uni20::mdspec_of(matrix_work);
46 auto right_eigenvector_descriptor = uni20::mdspec_of(right_eigenvectors);
47 detail::dispatch_at_precision<uni20::tensor_element_t<MatrixTensor>>(
48 std::forward<BackendSelector>(selector), nonsymmetric_eigen_op{.compute_right_vectors = compute_right_vectors}, p,
49 matrix_descriptor, eigenvalues, right_eigenvector_descriptor);
50
51 uni20::detail::record_output_precision(matrix_work, p);
52 if (compute_right_vectors) uni20::detail::record_output_precision(right_eigenvectors, p);
53}
54
56template <uni20::MutableRankedTensorView<2> MatrixTensor, class EigenScalar,
57 uni20::MutableRankedTensorView<2> RightEigenvectorTensor>
58void nonsymmetric_eigen(MatrixTensor&& matrix_work, std::span<EigenScalar> eigenvalues,
59 RightEigenvectorTensor&& right_eigenvectors, bool compute_right_vectors,
60 std::optional<Precision> requested = {})
61{
62 auto const p = detail::decomposition_precision(matrix_work, requested);
63 auto operation = nonsymmetric_eigen_op{.compute_right_vectors = compute_right_vectors};
64 auto selector = select_backend(operation, matrix_work, right_eigenvectors);
65 nonsymmetric_eigen(selector, std::forward<MatrixTensor>(matrix_work), eigenvalues,
66 std::forward<RightEigenvectorTensor>(right_eigenvectors), compute_right_vectors, p);
67}
68
69} // namespace uni20::linalg
LAPACK backend for dense nonsymmetric 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 nonsymmetric_eigen(BackendSelector &&selector, MatrixTensor &&matrix_work, std::span< EigenScalar > eigenvalues, RightEigenvectorTensor &&right_eigenvectors, bool compute_right_vectors, std::optional< Precision > requested={})
Compute eigenvalues and optional right eigenvectors, destroying the input matrix.
Definition ops/nonsymmetric_eigen.hpp:40
Definition data_table.cpp:8
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.
Concepts for tensor-level objects that resolve mdspan kernel operands.