12b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This file is part of Eigen, a lightweight C++ template library
22b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// for linear algebra.
32b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//
42b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Copyright (C) 2008-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_SPARSEASSIGN_H
112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define EIGEN_SPARSEASSIGN_H
122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace Eigen {
142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived>
162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename OtherDerived>
172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangDerived& SparseMatrixBase<Derived>::operator=(const EigenBase<OtherDerived> &other)
182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  internal::call_assignment_no_alias(derived(), other.derived());
202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  return derived();
212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived>
242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename OtherDerived>
252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangDerived& SparseMatrixBase<Derived>::operator=(const ReturnByValue<OtherDerived>& other)
262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  // TODO use the evaluator mechanism
282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  other.evalTo(derived());
292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  return derived();
302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived>
332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename OtherDerived>
342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline Derived& SparseMatrixBase<Derived>::operator=(const SparseMatrixBase<OtherDerived>& other)
352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  // by default sparse evaluation do not alias, so we can safely bypass the generic call_assignment routine
372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  internal::Assignment<Derived,OtherDerived,internal::assign_op<Scalar,typename OtherDerived::Scalar> >
382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          ::run(derived(), other.derived(), internal::assign_op<Scalar,typename OtherDerived::Scalar>());
392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  return derived();
402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived>
432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline Derived& SparseMatrixBase<Derived>::operator=(const Derived& other)
442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  internal::call_assignment_no_alias(derived(), other.derived());
462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  return derived();
472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace internal {
502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<>
522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct storage_kind_to_evaluator_kind<Sparse> {
532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef IteratorBased Kind;
542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<>
572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct storage_kind_to_shape<Sparse> {
582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef SparseShape Shape;
592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct Sparse2Sparse {};
622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct Sparse2Dense  {};
632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<> struct AssignmentKind<SparseShape, SparseShape>           { typedef Sparse2Sparse Kind; };
652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<> struct AssignmentKind<SparseShape, SparseTriangularShape> { typedef Sparse2Sparse Kind; };
662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<> struct AssignmentKind<DenseShape,  SparseShape>           { typedef Sparse2Dense  Kind; };
672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<> struct AssignmentKind<DenseShape,  SparseTriangularShape> { typedef Sparse2Dense  Kind; };
682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename DstXprType, typename SrcXprType>
712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangvoid assign_sparse_to_sparse(DstXprType &dst, const SrcXprType &src)
722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename DstXprType::Scalar Scalar;
742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef internal::evaluator<DstXprType> DstEvaluatorType;
752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef internal::evaluator<SrcXprType> SrcEvaluatorType;
762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  SrcEvaluatorType srcEvaluator(src);
782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const bool transpose = (DstEvaluatorType::Flags & RowMajorBit) != (SrcEvaluatorType::Flags & RowMajorBit);
802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const Index outerEvaluationSize = (SrcEvaluatorType::Flags&RowMajorBit) ? src.rows() : src.cols();
812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  if ((!transpose) && src.isRValue())
822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // eval without temporary
842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    dst.resize(src.rows(), src.cols());
852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    dst.setZero();
862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    dst.reserve((std::max)(src.rows(),src.cols())*2);
872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    for (Index j=0; j<outerEvaluationSize; ++j)
882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    {
892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      dst.startVec(j);
902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      for (typename SrcEvaluatorType::InnerIterator it(srcEvaluator, j); it; ++it)
912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      {
922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        Scalar v = it.value();
932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        dst.insertBackByOuterInner(j,it.index()) = v;
942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      }
952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    dst.finalize();
972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  else
992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
1002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // eval through a temporary
1012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    eigen_assert(( ((internal::traits<DstXprType>::SupportedAccessPatterns & OuterRandomAccessPattern)==OuterRandomAccessPattern) ||
1022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang              (!((DstEvaluatorType::Flags & RowMajorBit) != (SrcEvaluatorType::Flags & RowMajorBit)))) &&
1032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang              "the transpose operation is supposed to be handled in SparseMatrix::operator=");
1042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    enum { Flip = (DstEvaluatorType::Flags & RowMajorBit) != (SrcEvaluatorType::Flags & RowMajorBit) };
1062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    DstXprType temp(src.rows(), src.cols());
1092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    temp.reserve((std::max)(src.rows(),src.cols())*2);
1112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    for (Index j=0; j<outerEvaluationSize; ++j)
1122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    {
1132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      temp.startVec(j);
1142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      for (typename SrcEvaluatorType::InnerIterator it(srcEvaluator, j); it; ++it)
1152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      {
1162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        Scalar v = it.value();
1172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        temp.insertBackByOuterInner(Flip?it.index():j,Flip?j:it.index()) = v;
1182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      }
1192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
1202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    temp.finalize();
1212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    dst = temp.markAsRValue();
1232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
1242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
1252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Generic Sparse to Sparse assignment
1272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate< typename DstXprType, typename SrcXprType, typename Functor>
1282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct Assignment<DstXprType, SrcXprType, Functor, Sparse2Sparse>
1292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
1302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
1312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
1322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    assign_sparse_to_sparse(dst.derived(), src.derived());
1332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
1342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
1352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Generic Sparse to Dense assignment
1372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate< typename DstXprType, typename SrcXprType, typename Functor>
1382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct Assignment<DstXprType, SrcXprType, Functor, Sparse2Dense>
1392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
1402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  static void run(DstXprType &dst, const SrcXprType &src, const Functor &func)
1412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
1422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    if(internal::is_same<Functor,internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> >::value)
1432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      dst.setZero();
1442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    internal::evaluator<SrcXprType> srcEval(src);
1462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    resize_if_allowed(dst, src, func);
1472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    internal::evaluator<DstXprType> dstEval(dst);
1482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const Index outerEvaluationSize = (internal::evaluator<SrcXprType>::Flags&RowMajorBit) ? src.rows() : src.cols();
1502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    for (Index j=0; j<outerEvaluationSize; ++j)
1512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      for (typename internal::evaluator<SrcXprType>::InnerIterator i(srcEval,j); i; ++i)
1522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        func.assignCoeff(dstEval.coeffRef(i.row(),i.col()), i.value());
1532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
1542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
1552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Specialization for "dst = dec.solve(rhs)"
1572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// NOTE we need to specialize it for Sparse2Sparse to avoid ambiguous specialization error
1582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename DstXprType, typename DecType, typename RhsType, typename Scalar>
1592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct Assignment<DstXprType, Solve<DecType,RhsType>, internal::assign_op<Scalar,Scalar>, Sparse2Sparse>
1602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
1612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Solve<DecType,RhsType> SrcXprType;
1622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,Scalar> &)
1632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
1642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Index dstRows = src.rows();
1652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Index dstCols = src.cols();
1662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
1672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      dst.resize(dstRows, dstCols);
1682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    src.dec()._solve_impl(src.rhs(), dst);
1702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
1712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
1722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct Diagonal2Sparse {};
1742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<> struct AssignmentKind<SparseShape,DiagonalShape> { typedef Diagonal2Sparse Kind; };
1762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate< typename DstXprType, typename SrcXprType, typename Functor>
1782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct Assignment<DstXprType, SrcXprType, Functor, Diagonal2Sparse>
1792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
1802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename DstXprType::StorageIndex StorageIndex;
1812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename DstXprType::Scalar Scalar;
1822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Array<StorageIndex,Dynamic,1> ArrayXI;
1832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Array<Scalar,Dynamic,1> ArrayXS;
1842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int Options>
1852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  static void run(SparseMatrix<Scalar,Options,StorageIndex> &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
1862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
1872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Index dstRows = src.rows();
1882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Index dstCols = src.cols();
1892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
1902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      dst.resize(dstRows, dstCols);
1912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Index size = src.diagonal().size();
1932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    dst.makeCompressed();
1942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    dst.resizeNonZeros(size);
1952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Map<ArrayXI>(dst.innerIndexPtr(), size).setLinSpaced(0,StorageIndex(size)-1);
1962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Map<ArrayXI>(dst.outerIndexPtr(), size+1).setLinSpaced(0,StorageIndex(size));
1972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Map<ArrayXS>(dst.valuePtr(), size) = src.diagonal();
1982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
1992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<typename DstDerived>
2012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  static void run(SparseMatrixBase<DstDerived> &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
2022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
2032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    dst.diagonal() = src.diagonal();
2042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
2052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  static void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
2072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  { dst.diagonal() += src.diagonal(); }
2082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  static void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
2102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  { dst.diagonal() -= src.diagonal(); }
2112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
2122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // end namespace internal
2132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // end namespace Eigen
2152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif // EIGEN_SPARSEASSIGN_H
217