29namespace lapack_detail
33template <uni20::MutableRankedStr
idedMdspanLike<2> MatrixMdspan,
class EigenScalar,
34 uni20::MutableRankedMdspanLike<2> RightEigenvectorMdspan>
37 using matrix_scalar = std::remove_cv_t<typename MatrixMdspan::element_type>;
40 using vector_scalar = std::remove_cv_t<typename RightEigenvectorMdspan::element_type>;
54template <uni20::MutableRankedStr
idedMdspanLike<2> MatrixMdspan,
class EigenScalar,
55 uni20::MutableRankedMdspanLike<2> RightEigenvectorMdspan>
57 std::span<EigenScalar> eigenvalues, RightEigenvectorMdspan& right_eigenvectors)
59 using matrix_type = std::remove_cvref_t<MatrixMdspan>;
60 using matrix_scalar = std::remove_cv_t<typename matrix_type::element_type>;
63 using index_type =
typename std::remove_cvref_t<RightEigenvectorMdspan>::index_type;
65 CHECK_EQUAL(matrix_work.extent(0), matrix_work.extent(1));
66 std::size_t
const n =
static_cast<std::size_t
>(matrix_work.extent(0));
69 static_cast<std::size_t
>(right_eigenvectors.extent(1)) == n));
91 std::size_t vector_storage_size = 1;
99 vector_storage_size = *square_size;
104 std::vector<matrix_scalar> wr(n, matrix_scalar{});
105 std::vector<matrix_scalar> wi(n, matrix_scalar{});
106 std::vector<matrix_scalar> vl(1, matrix_scalar{});
107 std::vector<matrix_scalar> vr(vector_storage_size, matrix_scalar{});
109 matrix_scalar work_query{};
110 uni20::lapack::geev(
'N', jobvr, order, matrix->data, matrix->leading_dimension, wr.data(), wi.data(), vl.data(), 1,
111 vr.data(), ldvr, &work_query, -1);
113 std::vector<matrix_scalar> work(
static_cast<std::size_t
>(lwork), matrix_scalar{});
114 uni20::lapack::geev(
'N', jobvr, order, matrix->data, matrix->leading_dimension, wr.data(), wi.data(), vl.data(), 1,
115 vr.data(), ldvr, work.data(), lwork);
117 for (std::size_t col = 0; col < n; ++col)
119 eigenvalues[col] = complex_type{wr[col], wi[col]};
127 for (std::size_t col = 0; col < n; ++col)
129 if (wi[col] == real_type{})
131 for (std::size_t
row = 0;
row < n; ++
row)
134 complex_type{vr[
row + col * n], real_type{}};
137 else if (wi[col] > real_type{})
139 CHECK(col + 1 < n,
"LAPACK geev returned an incomplete conjugate eigenvector pair");
140 for (std::size_t
row = 0;
row < n; ++
row)
142 complex_type
const value{vr[
row + col * n], vr[
row + (col + 1) * n]};
150 PANIC(
"LAPACK geev returned an unpaired negative-imaginary eigenvalue", col, wi[col]);
161 std::vector<complex_type> values(n, complex_type{});
162 std::vector<complex_type> vl(1, complex_type{});
163 std::vector<complex_type> vr(vector_storage_size, complex_type{});
164 std::vector<real_type> rwork(std::max<std::size_t>(1, *twice_order), real_type{});
166 complex_type work_query{};
167 uni20::lapack::geev(
'N', jobvr, order, matrix->data, matrix->leading_dimension, values.data(), vl.data(), 1,
168 vr.data(), ldvr, &work_query, -1, rwork.data());
170 std::vector<complex_type> work(
static_cast<std::size_t
>(lwork), complex_type{});
171 uni20::lapack::geev(
'N', jobvr, order, matrix->data, matrix->leading_dimension, values.data(), vl.data(), 1,
172 vr.data(), ldvr, work.data(), lwork, rwork.data());
174 std::ranges::copy(values, eigenvalues.begin());
177 for (std::size_t col = 0; col < n; ++col)
179 for (std::size_t
row = 0;
row < n; ++
row)
192template <uni20::MutableRankedStr
idedMdspecLike<2> MatrixMdspan,
class EigenScalar,
193 uni20::MutableRankedMdspecLike<2> RightEigenvectorMdspan>
197 std::span<EigenScalar>&, RightEigenvectorMdspan&)
201 constexpr auto acceptance = lapack_detail::nonsymmetric_eigen_acceptance<matrix_span, EigenScalar, vector_span>();
209template <uni20::MutableRankedStr
idedMdspecLike<2> MatrixMdspan,
class EigenScalar,
210 uni20::MutableRankedMdspecLike<2> RightEigenvectorMdspan>
214 std::span<EigenScalar> eigenvalues, RightEigenvectorMdspan& right_eigenvectors)
217 [&](
auto& matrix_span,
auto& vector_span) {
220 matrix_work, right_eigenvectors);
225#if UNI20_HAS_MPLAPACK_MPREAL || UNI20_HAS_MPLAPACK_FLOAT80
RAII leases that resolve device descriptors and tensor views to mdspans.
Safe conversion helpers for the configured signed BLAS integer ABI.
An mdspan-like type whose accessor is stdex::default_accessor.
Definition mdspan/concepts.hpp:501
Mutable mdspec metadata supporting host write acquisition.
Definition access.hpp:694
Real scalar types supported by the configured raw-pointer LAPACK wrappers.
Definition scalar_concepts.hpp:115
Concept for scalar types with a configured dense LAPACK backend.
Definition scalar_concepts.hpp:147
locale_t value
Definition data_table.cpp:49
Logical host adapters for value-converting dense decompositions.
Operation-tag backend dispatch over tensor-view operands.
uni20::complex< T > conj(detail::standard_complex< T > x)
Returns the complex conjugate for complex-valued scalars.
Definition math.hpp:70
typename detail::complex_type< Real >::type complex
Project-level complex scalar spelling.
Definition types.hpp:66
typename make_real< T >::type make_real_t
Alias for the underlying real-valued type of T.
Definition scalar_traits.hpp:168
Checked LAPACK wrappers over provider-specific unchecked overloads.
Shared helpers for LAPACK operation-tag backend adapters.
Lower mdspan matrix views to provider-ready BLAS operands.
constexpr blas_int try_blas_int(Value value) noexcept
Convert a non-negative integer to blas_int, or return the negative invalid sentinel.
Definition blas_int.hpp:28
constexpr bool is_valid_blas_int(blas_int value) noexcept
Return whether a non-throwing BLAS integer conversion succeeded.
Definition blas_int.hpp:25
void geev(char jobvl, char jobvr, blas_int n, Scalar *a, blas_int lda, Scalar *wr, Scalar *wi, Scalar *vl, blas_int ldvl, Scalar *vr, blas_int ldvr, Scalar *work, blas_int lwork)
Compute eigenvalues and optionally eigenvectors of a real nonsymmetric matrix.
Definition lapack.hpp:790
auto try_lapack_writable_matrix(Mdspan const &span) -> std::optional< BlasWritableMatrix< std::remove_cv_t< typename Mdspan::element_type >, typename Mdspan::data_handle_type > >
Try to lower an mdspan to the strict column-major shape expected by LAPACK.
Definition mdspan_matrix.hpp:285
blas_int workspace_size(Scalar const &query)
Convert a provider workspace query result to the configured LAPACK integer type.
Definition linalg/backends/lapack/common.hpp:43
KernelAttempt with_host_write_mdspans(Function &&function, Mdspecs &... mdspecs)
Invoke a LAPACK attempt with host-writable mdspans under simultaneous leases.
Definition linalg/backends/lapack/common.hpp:29
KernelAttempt try_nonsymmetric_eigen(nonsymmetric_eigen_op const &op, MatrixMdspan &matrix_work, std::span< EigenScalar > eigenvalues, RightEigenvectorMdspan &right_eigenvectors)
Compute eigenvalues and optional right eigenvectors through LAPACK geev.
Definition backends/lapack/nonsymmetric_eigen.hpp:56
consteval auto nonsymmetric_eigen_acceptance()
Report compile-time eligibility for resolved LAPACK nonsymmetric eigenanalysis.
Definition backends/lapack/nonsymmetric_eigen.hpp:35
constexpr std::optional< std::size_t > try_size_product(std::size_t left, std::size_t right) noexcept
Multiply allocation extents without wrapping std::size_t.
Definition linalg/backends/lapack/common.hpp:69
Definition linalg/async.hpp:28
KernelAttempt try_kernel(BlasBackend, gemm_op const &, C &c, S const &alpha, A &a, B &b, S const &beta)
Pack logical host values and execute GEMM through value-preserving provider conversion.
Definition linalg/backends/blas/binary80.hpp:30
KernelAttempt
Result of one runtime kernel backend attempt.
Definition kernel_attempt.hpp:27
constexpr KernelAcceptance< KernelTypeAcceptance::no > kernel_types_no
Report that a backend rejects the argument types.
Definition dispatch_error.hpp:34
consteval auto kernel_accepts_types(BlasBackend, gemm_op const &, C &, S const &, A &, B &, S const &)
Accept host-readable native binary80 operands, including transforming accessors.
Definition linalg/backends/blas/binary80.hpp:19
constexpr KernelAcceptance< KernelTypeAcceptance::maybe > kernel_types_maybe
Report that runtime operand values determine backend acceptance.
Definition dispatch_error.hpp:37
std::remove_cvref_t< decltype(std::declval< detail::host_write_mdspan_lease_t< Mdspec > & >().mdspan())> host_write_mdspan_t
Writable mdspan type resolved by host descriptor acquisition.
Definition access.hpp:684
std::ptrdiff_t index_type
Definition types.hpp:19
Backend family for configured dense LAPACK kernels, including MPLAPACK scalar adapters.
Definition backend_selector.hpp:20
Dense nonsymmetric eigensystem operation tag.
Definition operation_tags.hpp:308
bool compute_right_vectors
Definition operation_tags.hpp:310
Concepts for tensor-level objects that resolve mdspan kernel operands.
#define CHECK(cond,...)
Definition trace.hpp:299
#define PANIC(...)
Definition trace.hpp:382
#define CHECK_EQUAL(a, b,...)
Definition trace.hpp:309