Uni20
Asynchronous tensor and runtime library.
Loading...
Searching...
No Matches
linear_solve_binary80.hpp
Go to the documentation of this file.
1#pragma once
2
8
9namespace uni20::linalg
10{
12template <MutableRankedMdspecLike<2> A, MutableRankedMdspecLike<2> B>
13 requires HostWritableMdspec<A> && HostWritableMdspec<B> &&
14 mplapack_binary80_detail::Binary80LuScalar<typename A::value_type> &&
15 std::same_as<typename A::value_type, typename B::value_type>
18{
19 return kernel_types_yes;
20}
21
23template <MutableRankedMdspecLike<2> A, MutableRankedMdspecLike<2> B>
25 mplapack_binary80_detail::Binary80LuScalar<typename A::value_type> &&
26 std::same_as<typename A::value_type, typename B::value_type>
28 SolveOptions<float80> const& options)
29{
30 ERROR_IF(a.extent(0) != a.extent(1) || a.extent(0) != b.extent(0), "solve operand shapes do not agree");
31 detail::require_solve_options(options);
32 info = {};
33 if (a.extent(0) == 0 || b.extent(1) == 0) return KernelAttempt::success;
36 auto as = aa.mdspan();
37 auto bs = ba.mdspan();
38 float80 scale{};
39 if (!detail::prepare_linear_solve(as, bs, scale, info)) return KernelAttempt::success;
41 auto tolerance = options.relative_pivot_tolerance;
42 std::vector<std::size_t> pivots;
43 auto singular = mplapack::getrf(a.extent(0), mplapack_binary80_detail::values(av), pivots);
44 mplapack_binary80_detail::unpack(av, as);
45 if (!detail::solve_matrix_is_finite(av.mdspan()))
47 else if (singular)
48 info = {.status = SolveStatus::singular, .pivot = singular - 1};
49 else
50 {
51 for (std::size_t i = 0; i < std::size_t(a.extent(0)); ++i)
52 {
53 auto magnitude = math::abs(av[i, i]);
54 if (!uni20::isfinite(magnitude))
55 {
57 break;
58 }
59 if (tolerance > 0 && magnitude / scale <= tolerance)
60 {
61 info = {.status = SolveStatus::small_pivot, .pivot = i};
62 break;
63 }
64 }
65 if (info.succeeded())
66 {
67 mplapack::getrs(a.extent(0), b.extent(1), mplapack_binary80_detail::values(av), pivots,
68 mplapack_binary80_detail::values(bv));
69 mplapack_binary80_detail::unpack(bv, bs);
70 if (!detail::solve_matrix_is_finite(bv.mdspan())) info.status = SolveStatus::nonfinite_result;
71 }
72 }
74}
75} // namespace uni20::linalg
RAII leases that resolve device descriptors and tensor views to mdspans.
Binary80 scalar eligibility and logical host packing for BLAS/LAPACK adapters.
Mutable mdspec metadata supporting host write acquisition.
Definition access.hpp:694
Operation-tag backend dispatch over tensor-view operands.
constexpr bool isfinite(I const &x) noexcept
Returns whether an integer scalar is finite.
Definition math.hpp:121
auto pack(Span const &span, bool read=true)
Definition binary80_common.hpp:23
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
@ singular
An exactly zero elimination pivot was found.
@ nonfinite_result
A factor, solution, reduction, or required magnitude became nonfinite.
@ small_pivot
A nonzero pivot failed the requested relative threshold.
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::yes > kernel_types_yes
Report that a backend accepts every instance of the argument types.
Definition dispatch_error.hpp:40
constexpr detail::scalar_math::abs_fn abs
Absolute value or complex magnitude, preserving the selected scalar implementation.
Definition math.hpp:459
std::size_t getrf(std::size_t n, std::span< float80 > a, std::vector< std::size_t > &pivots)
Factor a square binary80 matrix, returning zero or a one-based singular pivot.
Definition binary80.cpp:203
void getrs(std::size_t n, std::size_t nrhs, std::span< float80 const > a, std::span< std::size_t const > pivots, std::span< float80 > b)
Solve from read-only binary80 LU factors and zero-based pivots.
Definition binary80.cpp:213
auto acquire_host_write_access_sync(Mdspan &mdspan)
Acquire a directly host-accessible writable mdspan.
Definition access.hpp:626
Backend-independent operation values used with normalized kernel operands.
Backend family for configured dense LAPACK kernels, including MPLAPACK scalar adapters.
Definition backend_selector.hpp:20
Diagnostics written by a completed numerical attempt, independent of dispatch.
Definition solve_info.hpp:41
Real-scalar pivot policy for a square linear solve.
Definition solve_info.hpp:62
Real relative_pivot_tolerance
Reject nonzero pivots at or below this fraction of the original maximum entry magnitude.
Definition solve_info.hpp:64
Destructive dense general linear-system solve operation tag.
Definition operation_tags.hpp:155
Multiply one element value by a retained scalar factor.
Definition elementwise_functions.hpp:68
#define ERROR_IF(cond,...)
Definition trace.hpp:389