27namespace lapack_detail
31template <uni20::LapackReal Scalar, uni20::MutableRankedStr
idedMdspanLike<2> EigenvectorMdspan>
34 using vector_scalar = std::remove_cv_t<typename EigenvectorMdspan::element_type>;
46template <
class Scalar, uni20::MutableRankedStr
idedMdspanLike<2> EigenvectorMdspan>
48 std::span<Scalar> subdiagonal, EigenvectorMdspan& eigenvectors)
50 std::size_t
const n = diagonal.size();
51 CHECK(subdiagonal.size() + 1 == n || (n == 0 && subdiagonal.empty()));
53 static_cast<std::size_t
>(eigenvectors.extent(1)) == n));
66 Scalar* e = subdiagonal.empty() ? &dummy : subdiagonal.data();
86 std::size_t
const work_size = std::max<std::size_t>(1, *twice_order - 2);
87 std::vector<Scalar> work(work_size,
Scalar{});
88 uni20::lapack::steqr(
'I', order, diagonal.data(), e, matrix->data, matrix->leading_dimension, work.data());
94template <uni20::LapackReal Scalar, uni20::MutableRankedStr
idedMdspecLike<2> EigenvectorMdspan>
97 std::span<Scalar>&, EigenvectorMdspan&)
100 constexpr auto acceptance = lapack_detail::tridiagonal_eigen_acceptance<Scalar, vector_span>();
108template <uni20::LapackReal Scalar, uni20::MutableRankedStr
idedMdspecLike<2> EigenvectorMdspan>
111 std::span<Scalar> subdiagonal, EigenvectorMdspan& eigenvectors)
114 auto span = access.mdspan();
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
Concept for numeric scalar types (integer, real, or complex).
Definition scalar_concepts.hpp:81
Operation-tag backend dispatch over tensor-view operands.
Checked LAPACK wrappers over provider-specific unchecked overloads.
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 steqr(char compz, blas_int n, Scalar *d, Scalar *e, Scalar *z, blas_int ldz, Scalar *work)
Compute a real symmetric tridiagonal eigensystem by QR iteration.
Definition lapack.hpp:1598
void sterf(blas_int n, Scalar *d, Scalar *e)
Compute eigenvalues of a real symmetric tridiagonal matrix.
Definition lapack.hpp:1590
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
KernelAttempt try_tridiagonal_eigen(symmetric_tridiagonal_eigen_op const &op, std::span< Scalar > diagonal, std::span< Scalar > subdiagonal, EigenvectorMdspan &eigenvectors)
Compute a real symmetric tridiagonal eigensystem through sterf or steqr.
Definition backends/lapack/tridiagonal_eigen.hpp:47
consteval auto tridiagonal_eigen_acceptance()
Report compile-time eligibility for resolved LAPACK tridiagonal eigensystem dispatch.
Definition backends/lapack/tridiagonal_eigen.hpp:32
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
auto acquire_host_write_access_sync(Mdspan &mdspan)
Acquire a directly host-accessible writable mdspan.
Definition access.hpp:626
std::size_t span
Definition presentation.cpp:2017
Backend family for configured dense LAPACK kernels, including MPLAPACK scalar adapters.
Definition backend_selector.hpp:20
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.
#define CHECK(cond,...)
Definition trace.hpp:299
#define CHECK_EQUAL(a, b,...)
Definition trace.hpp:309