12b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This file is part of Eigen, a lightweight C++ template library 22b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// for linear algebra. 32b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// 42b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Copyright (C) 2014 Gael Guennebaud <gael.guennebaud@inria.fr> 52b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// 62b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This Source Code Form is subject to the terms of the Mozilla 72b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Public License v. 2.0. If a copy of the MPL was not distributed 82b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 92b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#ifndef EIGEN_SOLVEWITHGUESS_H 112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define EIGEN_SOLVEWITHGUESS_H 122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace Eigen { 142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Decomposition, typename RhsType, typename GuessType> class SolveWithGuess; 162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/** \class SolveWithGuess 182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * \ingroup IterativeLinearSolvers_Module 192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * 202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * \brief Pseudo expression representing a solving operation 212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * 222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * \tparam Decomposition the type of the matrix or decomposion object 232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * \tparam Rhstype the type of the right-hand side 242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * 252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * This class represents an expression of A.solve(B) 262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * and most of the time this is the only way it is used. 272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang * 282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang */ 292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace internal { 302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Decomposition, typename RhsType, typename GuessType> 332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct traits<SolveWithGuess<Decomposition, RhsType, GuessType> > 342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang : traits<Solve<Decomposition,RhsType> > 352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{}; 362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} 382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Decomposition, typename RhsType, typename GuessType> 412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangclass SolveWithGuess : public internal::generic_xpr_base<SolveWithGuess<Decomposition,RhsType,GuessType>, MatrixXpr, typename internal::traits<RhsType>::StorageKind>::type 422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangpublic: 442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef typename internal::traits<SolveWithGuess>::Scalar Scalar; 452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef typename internal::traits<SolveWithGuess>::PlainObject PlainObject; 462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef typename internal::generic_xpr_base<SolveWithGuess<Decomposition,RhsType,GuessType>, MatrixXpr, typename internal::traits<RhsType>::StorageKind>::type Base; 472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef typename internal::ref_selector<SolveWithGuess>::type Nested; 482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang SolveWithGuess(const Decomposition &dec, const RhsType &rhs, const GuessType &guess) 502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang : m_dec(dec), m_rhs(rhs), m_guess(guess) 512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang {} 522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC Index rows() const { return m_dec.cols(); } 542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC Index cols() const { return m_rhs.cols(); } 552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC const Decomposition& dec() const { return m_dec; } 572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC const RhsType& rhs() const { return m_rhs; } 582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang EIGEN_DEVICE_FUNC const GuessType& guess() const { return m_guess; } 592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected: 612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const Decomposition &m_dec; 622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const RhsType &m_rhs; 632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang const GuessType &m_guess; 642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprivate: 662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Scalar coeff(Index row, Index col) const; 672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Scalar coeff(Index i) const; 682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace internal { 712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Evaluator of SolveWithGuess -> eval into a temporary 732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Decomposition, typename RhsType, typename GuessType> 742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<SolveWithGuess<Decomposition,RhsType, GuessType> > 752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang : public evaluator<typename SolveWithGuess<Decomposition,RhsType,GuessType>::PlainObject> 762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef SolveWithGuess<Decomposition,RhsType,GuessType> SolveType; 782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef typename SolveType::PlainObject PlainObject; 792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef evaluator<PlainObject> Base; 802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang evaluator(const SolveType& solve) 822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang : m_result(solve.rows(), solve.cols()) 832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang ::new (static_cast<Base*>(this)) Base(m_result); 852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang m_result = solve.guess(); 862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang solve.dec()._solve_with_guess_impl(solve.rhs(), m_result); 872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected: 902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang PlainObject m_result; 912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Specialization for "dst = dec.solveWithGuess(rhs)" 942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// NOTE we need to specialize it for Dense2Dense to avoid ambiguous specialization error and a Sparse2Sparse specialization must exist somewhere 952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename DstXprType, typename DecType, typename RhsType, typename GuessType, typename Scalar> 962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct Assignment<DstXprType, SolveWithGuess<DecType,RhsType,GuessType>, internal::assign_op<Scalar,Scalar>, Dense2Dense> 972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ 982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef SolveWithGuess<DecType,RhsType,GuessType> SrcXprType; 992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,Scalar> &) 1002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang { 1012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index dstRows = src.rows(); 1022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang Index dstCols = src.cols(); 1032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang if((dst.rows()!=dstRows) || (dst.cols()!=dstCols)) 1042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang dst.resize(dstRows, dstCols); 1052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang dst = src.guess(); 1072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang src.dec()._solve_with_guess_impl(src.rhs(), dst/*, src.guess()*/); 1082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang } 1092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}; 1102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // end namepsace internal 1122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // end namespace Eigen 1142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang 1152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif // EIGEN_SOLVEWITHGUESS_H 116