cMHN 1.2
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
forward_substitution.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_ALGORITHMS_SOLVER_FORWARD_SUBSTITUTION_H
4#define pRC_ALGORITHMS_SOLVER_FORWARD_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 L = transform<OT>(restrict<OR>(forward<XA>(A)));
28
29 if constexpr(cDebugLevel >= DebugLevel::High)
30 {
31 if(!isLowerTriangular(L))
32 {
33 Logging::error("L is not lower triangular");
34 }
35 }
36
37 decltype(auto) x = copy<!(!IsReference<XB> && !IsConst<RB> &&
39
41 [&L, &x](auto const k, auto const... indices)
42 {
43 if(x(k, indices...) != zero())
44 {
45 x(k, indices...) /= L(k, k);
46 for(Index i = k + 1; i < RB::size(0); ++i)
47 {
48 x(i, indices...) -= x(k, indices...) * L(i, k);
49 }
50 }
51 });
52
53 if constexpr(cDebugLevel >= DebugLevel::High)
54 {
55 if(!isApprox(b, L * x))
56 {
57 Logging::error("Forward substitution failed.");
58 }
59 }
60
61 if constexpr(IsReference<decltype(x)>)
62 {
63 return forward<XB>(b);
64 }
65 else
66 {
67 return x;
68 }
69 }
70 };
71}
72#endif // pRC_ALGORITHMS_SOLVER_FORWARD_SUBSTITUTION_H
Definition forward_substitution.hpp:15
constexpr auto operator()(XA &&A, XB &&b) const
Definition forward_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
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 isLowerTriangular(X &&a, TT const &tolerance=NumericLimits< TT >::tolerance())
Definition is_lower_triangular.hpp:14
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 zero()
Definition zero.hpp:12
static constexpr decltype(auto) eval(X &&a)
Definition eval.hpp:12