1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_SPARSE_SOLVE_H 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_SPARSE_SOLVE_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _DecompositionType, typename Rhs> struct sparse_solve_retval_base; 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _DecompositionType, typename Rhs> struct sparse_solve_retval; 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DecompositionType, typename Rhs> 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<sparse_solve_retval_base<DecompositionType, Rhs> > 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename DecompositionType::MatrixType MatrixType; 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef SparseMatrix<typename Rhs::Scalar, Rhs::Options, typename Rhs::Index> ReturnType; 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _DecompositionType, typename Rhs> struct sparse_solve_retval_base 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public ReturnByValue<sparse_solve_retval_base<_DecompositionType, Rhs> > 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename remove_all<typename Rhs::Nested>::type RhsNestedCleaned; 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef _DecompositionType DecompositionType; 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef ReturnByValue<sparse_solve_retval_base> Base; 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename Base::Index Index; 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath sparse_solve_retval_base(const DecompositionType& dec, const Rhs& rhs) 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_dec(dec), m_rhs(rhs) 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath {} 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index rows() const { return m_dec.cols(); } 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index cols() const { return m_rhs.cols(); } 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const DecompositionType& dec() const { return m_dec; } 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const RhsNestedCleaned& rhs() const { return m_rhs; } 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Dest> inline void evalTo(Dest& dst) const 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static_cast<const sparse_solve_retval<DecompositionType,Rhs>*>(this)->evalTo(dst); 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const DecompositionType& m_dec; 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename Rhs::Nested m_rhs; 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_MAKE_SPARSE_SOLVE_HELPERS(DecompositionType,Rhs) \ 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename DecompositionType::MatrixType MatrixType; \ 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::Scalar Scalar; \ 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::RealScalar RealScalar; \ 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::Index Index; \ 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Eigen::internal::sparse_solve_retval_base<DecompositionType,Rhs> Base; \ 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::dec; \ 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::rhs; \ 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::rows; \ 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::cols; \ 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath sparse_solve_retval(const DecompositionType& dec, const Rhs& rhs) \ 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : Base(dec, rhs) {} 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DecompositionType, typename Rhs, typename Guess> struct solve_retval_with_guess; 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DecompositionType, typename Rhs, typename Guess> 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<solve_retval_with_guess<DecompositionType, Rhs, Guess> > 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename DecompositionType::MatrixType MatrixType; 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<typename Rhs::Scalar, 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType::ColsAtCompileTime, 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Rhs::ColsAtCompileTime, 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Rhs::PlainObject::Options, 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType::MaxColsAtCompileTime, 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Rhs::MaxColsAtCompileTime> ReturnType; 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DecompositionType, typename Rhs, typename Guess> struct solve_retval_with_guess 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public ReturnByValue<solve_retval_with_guess<DecompositionType, Rhs, Guess> > 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename DecompositionType::Index Index; 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath solve_retval_with_guess(const DecompositionType& dec, const Rhs& rhs, const Guess& guess) 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_dec(dec), m_rhs(rhs), m_guess(guess) 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath {} 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index rows() const { return m_dec.cols(); } 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index cols() const { return m_rhs.cols(); } 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Dest> inline void evalTo(Dest& dst) const 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath dst = m_guess; 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_dec._solveWithGuess(m_rhs,dst); 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const DecompositionType& m_dec; 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const typename Rhs::Nested m_rhs; 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const typename Guess::Nested m_guess; 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // namepsace internal 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_SPARSE_SOLVE_H 112