1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2015 Gael Guennebaud <gael.guennebaud@inria.fr>
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_SOLVERBASE_H
11 #define EIGEN_SOLVERBASE_H
12 
13 namespace Eigen {
14 
15 namespace internal {
16 
17 
18 
19 } // end namespace internal
20 
21 /** \class SolverBase
22   * \brief A base class for matrix decomposition and solvers
23   *
24   * \tparam Derived the actual type of the decomposition/solver.
25   *
26   * Any matrix decomposition inheriting this base class provide the following API:
27   *
28   * \code
29   * MatrixType A, b, x;
30   * DecompositionType dec(A);
31   * x = dec.solve(b);             // solve A   * x = b
32   * x = dec.transpose().solve(b); // solve A^T * x = b
33   * x = dec.adjoint().solve(b);   // solve A'  * x = b
34   * \endcode
35   *
36   * \warning Currently, any other usage of transpose() and adjoint() are not supported and will produce compilation errors.
37   *
38   * \sa class PartialPivLU, class FullPivLU
39   */
40 template<typename Derived>
41 class SolverBase : public EigenBase<Derived>
42 {
43   public:
44 
45     typedef EigenBase<Derived> Base;
46     typedef typename internal::traits<Derived>::Scalar Scalar;
47     typedef Scalar CoeffReturnType;
48 
49     enum {
50       RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
51       ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
52       SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime,
53                                                           internal::traits<Derived>::ColsAtCompileTime>::ret),
54       MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
55       MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
56       MaxSizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::MaxRowsAtCompileTime,
57                                                              internal::traits<Derived>::MaxColsAtCompileTime>::ret),
58       IsVectorAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime == 1
59                            || internal::traits<Derived>::MaxColsAtCompileTime == 1
60     };
61 
62     /** Default constructor */
SolverBase()63     SolverBase()
64     {}
65 
~SolverBase()66     ~SolverBase()
67     {}
68 
69     using Base::derived;
70 
71     /** \returns an expression of the solution x of \f$ A x = b \f$ using the current decomposition of A.
72       */
73     template<typename Rhs>
74     inline const Solve<Derived, Rhs>
solve(const MatrixBase<Rhs> & b)75     solve(const MatrixBase<Rhs>& b) const
76     {
77       eigen_assert(derived().rows()==b.rows() && "solve(): invalid number of rows of the right hand side matrix b");
78       return Solve<Derived, Rhs>(derived(), b.derived());
79     }
80 
81     /** \internal the return type of transpose() */
82     typedef typename internal::add_const<Transpose<const Derived> >::type ConstTransposeReturnType;
83     /** \returns an expression of the transposed of the factored matrix.
84       *
85       * A typical usage is to solve for the transposed problem A^T x = b:
86       * \code x = dec.transpose().solve(b); \endcode
87       *
88       * \sa adjoint(), solve()
89       */
transpose()90     inline ConstTransposeReturnType transpose() const
91     {
92       return ConstTransposeReturnType(derived());
93     }
94 
95     /** \internal the return type of adjoint() */
96     typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
97                         CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, ConstTransposeReturnType>,
98                         ConstTransposeReturnType
99                      >::type AdjointReturnType;
100     /** \returns an expression of the adjoint of the factored matrix
101       *
102       * A typical usage is to solve for the adjoint problem A' x = b:
103       * \code x = dec.adjoint().solve(b); \endcode
104       *
105       * For real scalar types, this function is equivalent to transpose().
106       *
107       * \sa transpose(), solve()
108       */
adjoint()109     inline AdjointReturnType adjoint() const
110     {
111       return AdjointReturnType(derived().transpose());
112     }
113 
114   protected:
115 };
116 
117 namespace internal {
118 
119 template<typename Derived>
120 struct generic_xpr_base<Derived, MatrixXpr, SolverStorage>
121 {
122   typedef SolverBase<Derived> type;
123 
124 };
125 
126 } // end namespace internal
127 
128 } // end namespace Eigen
129 
130 #endif // EIGEN_SOLVERBASE_H
131