27 #ifndef CDPL_MATH_LINEARSOLVE_HPP
28 #define CDPL_MATH_LINEARSOLVE_HPP
40 class VectorExpression;
42 class MatrixExpression;
52 template <
typename E1,
typename E2>
59 if (l().getSize1() != l().getSize2())
62 if (SizeType(l().getSize2()) != SizeType(bv().getSize()))
65 SizeType size = bv().getSize();
67 for (SizeType n = 0; n < size; n++) {
68 if (l()(n, n) ==
typename E1::ValueType(0))
71 ValueType t = bv()(n) /= l()(n, n);
73 if (t != ValueType(0))
74 for (SizeType
m = n + 1;
m < size;
m++)
75 bv()(
m) -= l()(
m, n) * t;
89 template <
typename E1,
typename E2>
96 if (l().getSize1() != l().getSize2())
99 if (SizeType(l().getSize2()) != SizeType(bv().getSize()))
102 SizeType size = bv().getSize();
104 for (SizeType n = 0; n < size; n++) {
105 ValueType t = bv()(n);
107 if (t != ValueType(0))
108 for (SizeType
m = n + 1;
m < size;
m++)
109 bv()(
m) -= l()(
m, n) * t;
123 template <
typename E1,
typename E2>
130 if (l().getSize1() != l().getSize2())
133 if (SizeType(l().getSize2()) != SizeType(bm().getSize1()))
136 SizeType size1 = bm().getSize1();
137 SizeType size2 = bm().getSize2();
139 for (SizeType n = 0; n < size1; n++) {
140 if (l()(n, n) ==
typename E1::ValueType(0))
143 for (SizeType o = 0; o < size2; o++) {
144 ValueType t = bm()(n, o) /= l()(n, n);
146 if (t != ValueType(0))
147 for (SizeType
m = n + 1;
m < size1;
m++)
148 bm()(
m, o) -= l()(
m, n) * t;
163 template <
typename E1,
typename E2>
170 if (l().getSize1() != l().getSize2())
173 if (SizeType(l().getSize2()) != SizeType(bm().getSize1()))
176 SizeType size1 = bm().getSize1();
177 SizeType size2 = bm().getSize2();
179 for (SizeType n = 0; n < size1; n++) {
180 for (SizeType o = 0; o < size2; o++) {
181 ValueType t = bm()(n, o);
183 if (t != ValueType(0))
184 for (SizeType
m = n + 1;
m < size1;
m++)
185 bm()(
m, o) -= l()(
m, n) * t;
200 template <
typename E1,
typename E2>
208 if (u().getSize1() != u().getSize2())
211 if (SizeType(u().getSize2()) != SizeType(bv().getSize()))
214 SizeType size = bv().getSize();
216 for (DifferenceType n = size - 1; n >= 0; n--) {
217 if (u()(n, n) ==
typename E1::ValueType(0))
220 ValueType t = bv()(n) /= u()(n, n);
222 if (t != ValueType(0))
223 for (DifferenceType
m = n - 1;
m >= 0;
m--)
224 bv()(
m) -= u()(
m, n) * t;
238 template <
typename E1,
typename E2>
246 if (u().getSize1() != u().getSize2())
249 if (SizeType(u().getSize2()) != SizeType(bv().getSize()))
252 SizeType size = bv().getSize();
254 for (DifferenceType n = size - 1; n >= 0; n--) {
255 ValueType t = bv()(n);
257 if (t != ValueType(0))
258 for (DifferenceType
m = n - 1;
m >= 0;
m--)
259 bv()(
m) -= u()(
m, n) * t;
273 template <
typename E1,
typename E2>
281 if (u().getSize1() != u().getSize2())
284 if (SizeType(u().getSize2()) != SizeType(bm().getSize1()))
287 SizeType size1 = bm().getSize1();
288 SizeType size2 = bm().getSize2();
290 for (DifferenceType n = size1 - 1; n >= 0; n--) {
291 if (u()(n, n) ==
typename E1::ValueType(0))
294 for (DifferenceType o = size2 - 1; o >= 0; o--) {
295 ValueType t = bm()(n, o) /= u()(n, n);
297 if (t != ValueType(0))
298 for (DifferenceType
m = n - 1;
m >= 0;
m--)
299 bm()(
m, o) -= u()(
m, n) * t;
314 template <
typename E1,
typename E2>
322 if (u().getSize1() != u().getSize2())
325 if (SizeType(u().getSize2()) != SizeType(bm().getSize1()))
328 SizeType size1 = bm().getSize1();
329 SizeType size2 = bm().getSize2();
331 for (DifferenceType n = size1 - 1; n >= 0; n--) {
332 for (DifferenceType o = size2 - 1; o >= 0; o--) {
333 ValueType t = bm()(n, o);
335 if (t != ValueType(0))
336 for (DifferenceType
m = n - 1;
m >= 0;
m--)
337 bm()(
m, o) -= u()(
m, n) * t;
CRTP base class of all matrix expression types.
Definition: Expression.hpp:108
CRTP base class of all vector expression types.
Definition: Expression.hpp:68
constexpr unsigned int m
Specifies that the stereocenter has m configuration.
Definition: CIPDescriptor.hpp:116
bool solveLower(const MatrixExpression< E1 > &l, VectorExpression< E2 > &bv)
Solves in place by forward-substitution, where l is a lower-triangular matrix.
Definition: LinearSolve.hpp:54
bool solveUnitLower(const MatrixExpression< E1 > &l, VectorExpression< E2 > &bv)
Solves in place by forward-substitution, where l is a unit lower-triangular matrix (1 on the diagona...
Definition: LinearSolve.hpp:91
bool solveUpper(const MatrixExpression< E1 > &u, VectorExpression< E2 > &bv)
Solves in place by back-substitution, where u is an upper-triangular matrix.
Definition: LinearSolve.hpp:202
bool solveUnitUpper(const MatrixExpression< E1 > &u, VectorExpression< E2 > &bv)
Solves in place by back-substitution, where u is a unit upper-triangular matrix (1 on the diagonal).
Definition: LinearSolve.hpp:240
The namespace of the Chemical Data Processing Library.
std::common_type< T1, T2 >::type Type
The common type.
Definition: CommonType.hpp:51