Eigen  3.4.90 (git rev 5a9f66fb35d03a4da9ef8976e67a61b30aa16dcf)
 
Loading...
Searching...
No Matches
SolveWithGuess.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2014 Gael Guennebaud <[email protected]>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10#ifndef EIGEN_SOLVEWITHGUESS_H
11#define EIGEN_SOLVEWITHGUESS_H
12
13// IWYU pragma: private
14#include "./InternalHeaderCheck.h"
15
16namespace Eigen {
17
18template <typename Decomposition, typename RhsType, typename GuessType>
19class SolveWithGuess;
20
33namespace internal {
34
35template <typename Decomposition, typename RhsType, typename GuessType>
36struct traits<SolveWithGuess<Decomposition, RhsType, GuessType> > : traits<Solve<Decomposition, RhsType> > {};
37
38} // namespace internal
39
40template <typename Decomposition, typename RhsType, typename GuessType>
41class SolveWithGuess : public internal::generic_xpr_base<SolveWithGuess<Decomposition, RhsType, GuessType>, MatrixXpr,
42 typename internal::traits<RhsType>::StorageKind>::type {
43 public:
44 typedef typename internal::traits<SolveWithGuess>::Scalar Scalar;
45 typedef typename internal::traits<SolveWithGuess>::PlainObject PlainObject;
46 typedef typename internal::generic_xpr_base<SolveWithGuess<Decomposition, RhsType, GuessType>, MatrixXpr,
47 typename internal::traits<RhsType>::StorageKind>::type Base;
48 typedef typename internal::ref_selector<SolveWithGuess>::type Nested;
49
50 SolveWithGuess(const Decomposition &dec, const RhsType &rhs, const GuessType &guess)
51 : m_dec(dec), m_rhs(rhs), m_guess(guess) {}
52
53 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_dec.cols(); }
54 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_rhs.cols(); }
55
56 EIGEN_DEVICE_FUNC const Decomposition &dec() const { return m_dec; }
57 EIGEN_DEVICE_FUNC const RhsType &rhs() const { return m_rhs; }
58 EIGEN_DEVICE_FUNC const GuessType &guess() const { return m_guess; }
59
60 protected:
61 const Decomposition &m_dec;
62 const RhsType &m_rhs;
63 const GuessType &m_guess;
64
65 private:
66 Scalar coeff(Index row, Index col) const;
67 Scalar coeff(Index i) const;
68};
69
70namespace internal {
71
72// Evaluator of SolveWithGuess -> eval into a temporary
73template <typename Decomposition, typename RhsType, typename GuessType>
74struct evaluator<SolveWithGuess<Decomposition, RhsType, GuessType> >
75 : public evaluator<typename SolveWithGuess<Decomposition, RhsType, GuessType>::PlainObject> {
77 typedef typename SolveType::PlainObject PlainObject;
78 typedef evaluator<PlainObject> Base;
79
80 evaluator(const SolveType &solve) : m_result(solve.rows(), solve.cols()) {
81 internal::construct_at<Base>(this, m_result);
82 m_result = solve.guess();
83 solve.dec()._solve_with_guess_impl(solve.rhs(), m_result);
84 }
85
86 protected:
87 PlainObject m_result;
88};
89
90// Specialization for "dst = dec.solveWithGuess(rhs)"
91// NOTE we need to specialize it for Dense2Dense to avoid ambiguous specialization error and a Sparse2Sparse
92// specialization must exist somewhere
93template <typename DstXprType, typename DecType, typename RhsType, typename GuessType, typename Scalar>
94struct Assignment<DstXprType, SolveWithGuess<DecType, RhsType, GuessType>, internal::assign_op<Scalar, Scalar>,
95 Dense2Dense> {
96 typedef SolveWithGuess<DecType, RhsType, GuessType> SrcXprType;
97 static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar, Scalar> &) {
98 Index dstRows = src.rows();
99 Index dstCols = src.cols();
100 if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
101
102 dst = src.guess();
103 src.dec()._solve_with_guess_impl(src.rhs(), dst /*, src.guess()*/);
104 }
105};
106
107} // end namespace internal
108
109} // end namespace Eigen
110
111#endif // EIGEN_SOLVEWITHGUESS_H
Pseudo expression representing a solving operation.
Definition SolveWithGuess.h:42
Namespace containing all symbols from the Eigen library.
Definition Core:137
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:83
Definition Constants.h:531