cMHN 1.1
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
6#include <prc/config.hpp>
17
18namespace pRC::Solver
19{
21 {
22 public:
26 class RA = RemoveReference<XA>, class TA = typename RA::Type,
27 class VA = typename TA::Value, class XB,
28 class RB = RemoveReference<XB>, class TB = typename RB::Type,
29 class VB = typename TB::Value,
32 If<IsSatisfied<(typename RA::Dimension() == 2)>> = 0,
33 If<IsSatisfied<(typename RB::Dimension() == 1 ||
34 typename RB::Dimension() == 2)>> = 0,
35 If<IsSatisfied<(RA::size(0) == RA::size(1))>> = 0,
36 If<IsSatisfied<(RA::size(0) == RB::size(0))>> = 0>
37 inline constexpr auto operator()(XA &&A, XB &&b) const
38 {
39 auto const L = transform<OT>(restrict<OR>(forward<XA>(A)));
40
41 if constexpr(cDebugLevel >= DebugLevel::High)
42 {
43 if(!isLowerTriangular(L))
44 {
45 Logging::error("L is not lower triangular");
46 }
47 }
48
49 decltype(auto) x = copy<!(!IsReference<XB>() && !IsConst<RB>() &&
51
53 [&L, &x](auto const k, auto const... indices)
54 {
55 if(x(k, indices...) != zero())
56 {
57 x(k, indices...) /= L(k, k);
58 for(Index i = k + 1; i < RB::size(0); ++i)
59 {
60 x(i, indices...) -= x(k, indices...) * L(i, k);
61 }
62 }
63 });
64
65 if constexpr(cDebugLevel >= DebugLevel::High)
66 {
67 if(!isApprox(L * x, b))
68 {
69 Logging::error("Forward substitution failed.");
70 }
71 }
72
73 if constexpr(IsReference<decltype(x)>())
74 {
75 return forward<XB>(b);
76 }
77 else
78 {
79 return x;
80 }
81 }
82 };
83}
84#endif // pRC_ALGORITHMS_SOLVER_FORWARD_SUBSTITUTION_H
Definition forward_substitution.hpp:21
static void error(Xs &&...args)
Definition log.hpp:14
Restrict
Definition restrict.hpp:11
Hint
Definition hint.hpp:9
Transform
Definition transform.hpp:11
Definition backward_substitution.hpp:19
static constexpr X eval(X &&a)
Definition eval.hpp:11
static constexpr auto makeConstantSequence()
Definition sequence.hpp:402
Size Index
Definition type_traits.hpp:21
std::remove_reference_t< T > RemoveReference
Definition type_traits.hpp:56
static constexpr auto zero()
Definition zero.hpp:12
std::enable_if_t< B{}, int > If
Definition type_traits.hpp:68
Constant< Bool, B > IsSatisfied
Definition type_traits.hpp:71
std::is_reference< T > IsReference
Definition type_traits.hpp:47
static constexpr auto isApprox(XA &&a, XB &&b, TT const &tolerance=NumericLimits< TT >::tolerance())
Definition is_approx.hpp:24
static constexpr Conditional< IsSatisfied< C >, RemoveConstReference< X >, X > copy(X &&a)
Definition copy.hpp:13
constexpr auto cDebugLevel
Definition config.hpp:46
static constexpr auto isLowerTriangular(X &&a, TT const &tolerance=NumericLimits< TT >::tolerance())
Definition is_lower_triangular.hpp:18
Definition type_traits.hpp:16