cMHN 1.2
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
backward_substitution.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_ALGORITHMS_SOLVER_BACKWARD_SUBSTITUTION_H
4#define pRC_ALGORITHMS_SOLVER_BACKWARD_SUBSTITUTION_H
5
11
12namespace pRC::Solver
13{
15 {
16 public:
20 IsTensorish RA = RemoveReference<XA>, class XB,
22 requires(RA::Dimension == 2 &&
23 (RB::Dimension == 1 || RB::Dimension == 2)) &&
25 inline constexpr auto operator()(XA &&A, XB &&b) const
26 {
27 auto const U = transform<OT>(restrict<OR>(forward<XA>(A)));
28
29 if constexpr(cDebugLevel >= DebugLevel::High)
30 {
31 if(!isUpperTriangular(U))
32 {
33 Logging::error("U is not upper triangular");
34 }
35 }
36
37 decltype(auto) x = copy<!(!IsReference<XB> && !IsConst<RB> &&
39
41 [&U, &x](auto const p, auto const... indices)
42 {
43 Index const k = RB::size(0) - 1 - p;
44 if(x(k, indices...) != zero())
45 {
46 x(k, indices...) /= U(k, k);
47 for(Index i = 0; i < k; ++i)
48 {
49 x(i, indices...) -= x(k, indices...) * U(i, k);
50 }
51 }
52 });
53
54 if constexpr(cDebugLevel >= DebugLevel::High)
55 {
56 if(!isApprox(b, U * x))
57 {
58 Logging::error("Backward substitution failed.");
59 }
60 }
61
62 if constexpr(IsReference<decltype(x)>)
63 {
64 return forward<XB>(b);
65 }
66 else
67 {
68 return x;
69 }
70 }
71 };
72}
73#endif // pRC_ALGORITHMS_SOLVER_BACKWARD_SUBSTITUTION_H
Definition backward_substitution.hpp:15
constexpr auto operator()(XA &&A, XB &&b) const
Definition backward_substitution.hpp:25
Definition concepts.hpp:25
Definition concepts.hpp:31
Definition concepts.hpp:19
Definition declarations.hpp:45
int i
Definition gmock-matchers-comparisons_test.cc:603
int x
Definition gmock-matchers-containers_test.cc:376
const char * p
Definition gmock-matchers-containers_test.cc:379
static void error(Xs &&...args)
Definition log.hpp:14
Restrict
Definition restrict.hpp:9
Hint
Definition hint.hpp:9
Transform
Definition transform.hpp:9
Definition backward_substitution.hpp:13
static constexpr auto transform(X &&a)
Definition transform.hpp:15
static constexpr Conditional< C, RemoveConstReference< X >, RemoveConst< X > > copy(X &&a)
Definition copy.hpp:13
static constexpr auto restrict(X &&a)
Definition restrict.hpp:15
Size Index
Definition basics.hpp:32
std::remove_reference_t< T > RemoveReference
Definition basics.hpp:41
static constexpr auto isApprox(XE &&expected, XA &&approx, TT const &tolerance=NumericLimits< TT >::tolerance())
Definition is_approx.hpp:14
constexpr auto cDebugLevel
Definition config.hpp:48
static constexpr auto range(F &&f, Xs &&...args)
Definition range.hpp:18
static constexpr auto isUpperTriangular(X &&a, TT const &tolerance=NumericLimits< TT >::tolerance())
Definition is_upper_triangular.hpp:14
static constexpr auto zero()
Definition zero.hpp:12
static constexpr decltype(auto) eval(X &&a)
Definition eval.hpp:12