10#ifndef EIGEN_SPARSE_SELFADJOINTVIEW_H
11#define EIGEN_SPARSE_SELFADJOINTVIEW_H
31template<
typename MatrixType,
unsigned int Mode>
35template<
int SrcMode,
int DstMode,
typename MatrixType,
int DestOrder>
38template<
int Mode,
typename MatrixType,
int DestOrder>
44 :
public EigenBase<SparseSelfAdjointView<MatrixType,_Mode> >
56 typedef typename MatrixType::Scalar
Scalar;
79 template<
typename OtherDerived>
91 template<
typename OtherDerived>
friend
99 template<
typename OtherDerived>
107 template<
typename OtherDerived>
friend
122 template<
typename DerivedU>
132 template<
typename SrcMatrixType,
int SrcMode>
148 template<
typename SrcMatrixType,
unsigned int SrcMode>
160 &&
"SparseSelfadjointView::resize() does not actually allow to resize.");
169 template<
typename Dest>
void evalTo(Dest &)
const;
176template<
typename Derived>
177template<
unsigned int UpLo>
183template<
typename Derived>
184template<
unsigned int UpLo>
194template<
typename MatrixType,
unsigned int Mode>
195template<
typename DerivedU>
201 m_matrix = tmp.template triangularView<Mode>();
203 m_matrix += alpha * tmp.template triangularView<Mode>();
213template<
typename MatrixType,
unsigned int Mode>
225template<
typename DstXprType,
typename SrcXprType,
typename Functor>
231 template<
typename DestScalar,
int StorageOrder>
234 internal::permute_symm_to_fullsymm<SrcXprType::Mode>(src.matrix(), dst);
238 template<
typename DestScalar,
int StorageOrder,
typename AssignFunc>
246 template<
typename DestScalar,
int StorageOrder>
255 template<
typename DestScalar,
int StorageOrder>
264 template<
typename DestScalar>
269 internal::permute_symm_to_fullsymm<SrcXprType::Mode>(src.matrix(), tmp);
282template<
int Mode,
typename SparseLhsType,
typename DenseRhsType,
typename DenseResType,
typename AlphaType>
290 typedef typename LhsEval::InnerIterator LhsIterator;
291 typedef typename SparseLhsType::Scalar LhsScalar;
297 || ( (Mode&
Upper) && !LhsIsRowMajor)
298 || ( (Mode&
Lower) && LhsIsRowMajor),
299 ProcessSecondHalf = !ProcessFirstHalf
302 SparseLhsTypeNested lhs_nested(lhs);
303 LhsEval lhsEval(lhs_nested);
306 for (
Index k=0; k<rhs.cols(); ++k)
308 for (
Index j=0; j<lhs.outerSize(); ++j)
310 LhsIterator i(lhsEval,j);
312 if (ProcessSecondHalf)
314 while (i && i.index()<j) ++i;
315 if(i && i.index()==j)
317 res.coeffRef(j,k) += alpha * i.value() * rhs.coeff(j,k);
325 typename DenseResType::Scalar res_j(0);
326 for(; (ProcessFirstHalf ? i && i.index() < j : i) ; ++i)
328 LhsScalar lhs_ij = i.value();
329 if(!LhsIsRowMajor) lhs_ij = numext::conj(lhs_ij);
330 res_j += lhs_ij * rhs.coeff(i.index(),k);
331 res(i.index(),k) += numext::conj(lhs_ij) * rhs_j;
333 res.coeffRef(j,k) += alpha * res_j;
336 if (ProcessFirstHalf && i && (i.index()==j))
337 res.coeffRef(j,k) += alpha * i.value() * rhs.coeff(j,k);
343template<
typename LhsView,
typename Rhs,
int ProductType>
345:
generic_product_impl_base<LhsView, Rhs, generic_product_impl<LhsView, Rhs, SparseSelfAdjointShape, DenseShape, ProductType> >
347 template<
typename Dest>
348 static void scaleAndAddTo(Dest& dst,
const LhsView& lhsView,
const Rhs& rhs,
const typename Dest::Scalar& alpha)
350 typedef typename LhsView::_MatrixTypeNested Lhs;
353 LhsNested lhsNested(lhsView.matrix());
354 RhsNested rhsNested(rhs);
356 internal::sparse_selfadjoint_time_dense_product<LhsView::Mode>(lhsNested, rhsNested, dst, alpha);
360template<
typename Lhs,
typename RhsView,
int ProductType>
362:
generic_product_impl_base<Lhs, RhsView, generic_product_impl<Lhs, RhsView, DenseShape, SparseSelfAdjointShape, ProductType> >
364 template<
typename Dest>
365 static void scaleAndAddTo(Dest& dst,
const Lhs& lhs,
const RhsView& rhsView,
const typename Dest::Scalar& alpha)
367 typedef typename RhsView::_MatrixTypeNested Rhs;
370 LhsNested lhsNested(lhs);
371 RhsNested rhsNested(rhsView.matrix());
375 internal::sparse_selfadjoint_time_dense_product<RhsView::TransposeMode>(rhsNested.transpose(), lhsNested.transpose(), dstT, alpha);
382template<
typename LhsView,
typename Rhs,
int ProductTag>
384 :
public evaluator<typename Product<typename Rhs::PlainObject, Rhs, DefaultProduct>::PlainObject>
391 : m_lhs(xpr.lhs()), m_result(xpr.rows(), xpr.cols())
393 ::new (
static_cast<Base*
>(
this))
Base(m_result);
402template<
typename Lhs,
typename RhsView,
int ProductTag>
404 :
public evaluator<typename Product<Lhs, typename Lhs::PlainObject, DefaultProduct>::PlainObject>
411 : m_rhs(xpr.rhs()), m_result(xpr.rows(), xpr.cols())
413 ::new (
static_cast<Base*
>(
this))
Base(m_result);
429template<
int Mode,
typename MatrixType,
int DestOrder>
432 typedef typename MatrixType::StorageIndex StorageIndex;
433 typedef typename MatrixType::Scalar Scalar;
439 MatEval matEval(mat);
442 StorageOrderMatch = int(Dest::IsRowMajor) == int(MatrixType::IsRowMajor)
452 Index jp = perm ? perm[j] : j;
453 for(MatIterator it(matEval,j); it; ++it)
455 Index i = it.index();
458 Index ip = perm ? perm[i] : i;
460 count[StorageOrderMatch ? jp : ip]++;
473 dest.resizeNonZeros(nnz);
474 dest.outerIndexPtr()[0] = 0;
476 dest.outerIndexPtr()[j+1] = dest.outerIndexPtr()[j] +
count[j];
478 count[j] = dest.outerIndexPtr()[j];
481 for(StorageIndex j = 0; j<
size; ++j)
483 for(MatIterator it(matEval,j); it; ++it)
485 StorageIndex i = internal::convert_index<StorageIndex>(it.index());
489 StorageIndex jp = perm ? perm[j] : j;
490 StorageIndex ip = perm ? perm[i] : i;
494 Index k =
count[StorageOrderMatch ? jp : ip]++;
495 dest.innerIndexPtr()[k] = StorageOrderMatch ? ip : jp;
496 dest.valuePtr()[k] = it.value();
501 dest.innerIndexPtr()[k] = ip;
502 dest.valuePtr()[k] = it.value();
506 if(!StorageOrderMatch)
509 dest.innerIndexPtr()[k] = ip;
510 dest.valuePtr()[k] = it.value();
512 dest.innerIndexPtr()[k] = jp;
513 dest.valuePtr()[k] = numext::conj(it.value());
519template<
int _SrcMode,
int _DstMode,
typename MatrixType,
int DstOrder>
522 typedef typename MatrixType::StorageIndex StorageIndex;
523 typedef typename MatrixType::Scalar Scalar;
531 StorageOrderMatch = int(SrcOrder) == int(DstOrder),
536 MatEval matEval(mat);
542 for(StorageIndex j = 0; j<
size; ++j)
544 StorageIndex jp = perm ? perm[j] : j;
545 for(MatIterator it(matEval,j); it; ++it)
547 StorageIndex i = it.index();
548 if((
int(SrcMode)==
int(
Lower) && i<j) || (
int(SrcMode)==
int(
Upper) && i>j))
551 StorageIndex ip = perm ? perm[i] : i;
562 for(StorageIndex j = 0; j<
size; ++j)
565 for(MatIterator it(matEval,j); it; ++it)
567 StorageIndex i = it.index();
568 if((
int(SrcMode)==int(
Lower) && i<j) || (
int(SrcMode)==int(
Upper) && i>j))
571 StorageIndex jp = perm ? perm[j] : j;
572 StorageIndex ip = perm? perm[i] : i;
578 if( ((
int(DstMode)==
int(
Lower) && ip<jp) || (
int(DstMode)==
int(
Upper) && ip>jp)))
579 dest.
valuePtr()[k] = numext::conj(it.value());
592template<
typename MatrixType,
int Mode>
598template<
typename MatrixType,
int Mode>
600 :
public EigenBase<SparseSymmetricPermutationProduct<MatrixType,Mode> >
603 typedef typename MatrixType::Scalar
Scalar;
634template<
typename DstXprType,
typename MatrixType,
int Mode,
typename Scalar>
638 typedef typename DstXprType::StorageIndex
DstIndex;
639 template<
int Options>
644 internal::permute_symm_to_fullsymm<Mode>(src.
matrix(),tmp,src.
perm().
indices().data());
648 template<
typename DestType,
unsigned int DestMode>
#define EIGEN_DEFAULT_COPY_CONSTRUCTOR(CLASS)
Definition: Macros.h:1231
#define EIGEN_ONLY_USED_FOR_DEBUG(x)
Definition: Macros.h:1059
#define eigen_assert(x)
Definition: Macros.h:1047
Definition: SparseUtil.h:53
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:50
const IndicesType & indices() const
const version of indices().
Definition: PermutationMatrix.h:360
Expression of the product of two arbitrary matrices or vectors.
Definition: Product.h:75
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const LhsNestedCleaned & lhs() const
Definition: Product.h:107
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const RhsNestedCleaned & rhs() const
Definition: Product.h:109
Base class of any sparse matrices or sparse expressions.
Definition: SparseMatrixBase.h:28
const Derived & derived() const
Definition: SparseMatrixBase.h:143
ConstSelfAdjointViewReturnType< UpLo >::Type selfadjointView() const
const AdjointReturnType adjoint() const
Definition: SparseMatrixBase.h:356
A versatible sparse matrix representation.
Definition: SparseMatrix.h:98
void resizeNonZeros(Index size)
Definition: SparseMatrix.h:649
const StorageIndex * innerIndexPtr() const
Definition: SparseMatrix.h:159
const StorageIndex * outerIndexPtr() const
Definition: SparseMatrix.h:168
const Scalar * valuePtr() const
Definition: SparseMatrix.h:150
void resize(Index rows, Index cols)
Resizes the matrix to a rows x cols matrix and initializes it to zero.
Definition: SparseMatrix.h:626
Pseudo expression to manipulate a triangular sparse matrix as a selfadjoint matrix.
Definition: SparseSelfAdjointView.h:45
Matrix< StorageIndex, Dynamic, 1 > VectorI
Definition: SparseSelfAdjointView.h:58
SparseSelfAdjointView & operator=(const SparseSelfAdjointView< SrcMatrixType, SrcMode > &src)
Definition: SparseSelfAdjointView.h:149
internal::remove_all< MatrixTypeNested >::type _MatrixTypeNested
Definition: SparseSelfAdjointView.h:60
MatrixType::StorageIndex StorageIndex
Definition: SparseSelfAdjointView.h:57
void resize(Index rows, Index cols)
Definition: SparseSelfAdjointView.h:155
friend Product< OtherDerived, SparseSelfAdjointView > operator*(const MatrixBase< OtherDerived > &lhs, const SparseSelfAdjointView &rhs)
Efficient dense vector/matrix times sparse self-adjoint matrix product.
Definition: SparseSelfAdjointView.h:109
SparseSelfAdjointView & rankUpdate(const SparseMatrixBase< DerivedU > &u, const Scalar &alpha=Scalar(1))
Perform a symmetric rank K update of the selfadjoint matrix *this: where u is a vector or matrix.
Product< SparseSelfAdjointView, OtherDerived > operator*(const MatrixBase< OtherDerived > &rhs) const
Efficient sparse self-adjoint matrix times dense vector/matrix product.
Definition: SparseSelfAdjointView.h:101
SparseSelfAdjointView & operator=(const SparseSymmetricPermutationProduct< SrcMatrixType, SrcMode > &permutedMatrix)
Definition: SparseSelfAdjointView.h:133
Product< SparseSelfAdjointView, OtherDerived > operator*(const SparseMatrixBase< OtherDerived > &rhs) const
Definition: SparseSelfAdjointView.h:81
const _MatrixTypeNested & matrix() const
Definition: SparseSelfAdjointView.h:71
MatrixType::Scalar Scalar
Definition: SparseSelfAdjointView.h:56
MatrixTypeNested m_matrix
Definition: SparseSelfAdjointView.h:165
EigenBase< SparseSelfAdjointView > Base
Definition: SparseSelfAdjointView.h:55
Index rows() const
Definition: SparseSelfAdjointView.h:67
SparseSelfAdjointView(MatrixType &matrix)
Definition: SparseSelfAdjointView.h:62
internal::ref_selector< MatrixType >::non_const_type MatrixTypeNested
Definition: SparseSelfAdjointView.h:59
friend Product< OtherDerived, SparseSelfAdjointView > operator*(const SparseMatrixBase< OtherDerived > &lhs, const SparseSelfAdjointView &rhs)
Definition: SparseSelfAdjointView.h:93
Index cols() const
Definition: SparseSelfAdjointView.h:68
@ Mode
Definition: SparseSelfAdjointView.h:49
@ TransposeMode
Definition: SparseSelfAdjointView.h:50
@ ColsAtCompileTime
Definition: SparseSelfAdjointView.h:52
@ RowsAtCompileTime
Definition: SparseSelfAdjointView.h:51
SparseSelfAdjointView & operator=(const SparseSelfAdjointView &src)
Definition: SparseSelfAdjointView.h:139
SparseSymmetricPermutationProduct< _MatrixTypeNested, Mode > twistedBy(const PermutationMatrix< Dynamic, Dynamic, StorageIndex > &perm) const
Definition: SparseSelfAdjointView.h:127
internal::remove_reference< MatrixTypeNested >::type & matrix()
Definition: SparseSelfAdjointView.h:72
Definition: SparseSelfAdjointView.h:601
MatrixType::Nested MatrixTypeNested
Definition: SparseSelfAdjointView.h:613
Matrix< StorageIndex, Dynamic, 1 > VectorI
Definition: SparseSelfAdjointView.h:612
MatrixType::StorageIndex StorageIndex
Definition: SparseSelfAdjointView.h:604
const NestedExpression & matrix() const
Definition: SparseSelfAdjointView.h:623
SparseSymmetricPermutationProduct(const MatrixType &mat, const Perm &perm)
Definition: SparseSelfAdjointView.h:616
MatrixType::Scalar Scalar
Definition: SparseSelfAdjointView.h:603
PermutationMatrix< Dynamic, Dynamic, StorageIndex > Perm
Definition: SparseSelfAdjointView.h:610
const Perm & perm() const
Definition: SparseSelfAdjointView.h:624
MatrixTypeNested m_matrix
Definition: SparseSelfAdjointView.h:627
Index cols() const
Definition: SparseSelfAdjointView.h:621
Index rows() const
Definition: SparseSelfAdjointView.h:620
@ RowsAtCompileTime
Definition: SparseSelfAdjointView.h:606
@ ColsAtCompileTime
Definition: SparseSelfAdjointView.h:607
const Perm & m_perm
Definition: SparseSelfAdjointView.h:628
internal::remove_all< MatrixTypeNested >::type NestedExpression
Definition: SparseSelfAdjointView.h:614
Expression of the transpose of a matrix.
Definition: Transpose.h:54
constexpr auto count() -> size_t
Definition: core.h:1204
@ Lower
View matrix as a lower triangular matrix.
Definition: Constants.h:209
@ Upper
View matrix as an upper triangular matrix.
Definition: Constants.h:211
@ ColMajor
Storage order is column major (see TopicStorageOrders).
Definition: Constants.h:319
@ RowMajor
Storage order is row major (see TopicStorageOrders).
Definition: Constants.h:321
const unsigned int RowMajorBit
for a matrix, this means that the storage order is row-major.
Definition: Constants.h:66
constexpr common_t< T1, T2 > max(const T1 x, const T2 y) noexcept
Compile-time pairwise maximum function.
Definition: max.hpp:35
constexpr common_t< T1, T2 > min(const T1 x, const T2 y) noexcept
Compile-time pairwise minimum function.
Definition: min.hpp:35
void sparse_selfadjoint_time_dense_product(const SparseLhsType &lhs, const DenseRhsType &rhs, DenseResType &res, const AlphaType &alpha)
Definition: SparseSelfAdjointView.h:283
void permute_symm_to_fullsymm(const MatrixType &mat, SparseMatrix< typename MatrixType::Scalar, DestOrder, typename MatrixType::StorageIndex > &_dest, const typename MatrixType::StorageIndex *perm=0)
Definition: SparseSelfAdjointView.h:430
void permute_symm_to_symm(const MatrixType &mat, SparseMatrix< typename MatrixType::Scalar, DestOrder, typename MatrixType::StorageIndex > &_dest, const typename MatrixType::StorageIndex *perm=0)
EIGEN_CONSTEXPR Index size(const T &x)
Definition: Meta.h:479
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_assignment_no_alias_no_transpose(Dst &dst, const Src &src, const Func &func)
Definition: AssignEvaluator.h:922
Namespace containing all symbols from the Eigen library.
Definition: Core:141
@ DefaultProduct
Definition: Constants.h:500
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
Definition: Eigen_Colamd.h:50
void swap(wpi::SmallPtrSet< T, N > &LHS, wpi::SmallPtrSet< T, N > &RHS)
Implement std::swap in terms of SmallPtrSet swap.
Definition: SmallPtrSet.h:512
static constexpr const velocity::meters_per_second_t c(299792458.0)
Speed of light in vacuum.
Definition: Constants.h:528
Common base class for all classes T such that MatrixBase has an operator=(T) and a constructor Matrix...
Definition: EigenBase.h:30
Eigen::Index Index
The interface type of indices.
Definition: EigenBase.h:39
Determines whether the given binary operation of two numeric types is allowed and what the scalar ret...
Definition: XprHelper.h:806
Definition: Constants.h:537
SparseSymmetricPermutationProduct< MatrixType, Mode > SrcXprType
Definition: SparseSelfAdjointView.h:637
static void run(SparseSelfAdjointView< DestType, DestMode > &dst, const SrcXprType &src, const internal::assign_op< Scalar, typename MatrixType::Scalar > &)
Definition: SparseSelfAdjointView.h:649
static void run(SparseMatrix< Scalar, Options, DstIndex > &dst, const SrcXprType &src, const internal::assign_op< Scalar, typename MatrixType::Scalar > &)
Definition: SparseSelfAdjointView.h:640
DstXprType::StorageIndex DstIndex
Definition: SparseSelfAdjointView.h:638
static void run(SparseMatrix< DestScalar, StorageOrder, StorageIndex > &dst, const SrcXprType &src, const internal::add_assign_op< typename DstXprType::Scalar, typename SrcXprType::Scalar > &)
Definition: SparseSelfAdjointView.h:247
DstXprType::StorageIndex StorageIndex
Definition: SparseSelfAdjointView.h:228
static void run(SparseMatrix< DestScalar, StorageOrder, StorageIndex > &dst, const SrcXprType &src, const AssignOpType &)
Definition: SparseSelfAdjointView.h:232
static void run(SparseMatrix< DestScalar, StorageOrder, StorageIndex > &dst, const SrcXprType &src, const AssignFunc &func)
Definition: SparseSelfAdjointView.h:239
static void run(DynamicSparseMatrix< DestScalar, ColMajor, StorageIndex > &dst, const SrcXprType &src, const AssignOpType &)
Definition: SparseSelfAdjointView.h:265
internal::assign_op< typename DstXprType::Scalar, typename SrcXprType::Scalar > AssignOpType
Definition: SparseSelfAdjointView.h:229
static void run(SparseMatrix< DestScalar, StorageOrder, StorageIndex > &dst, const SrcXprType &src, const internal::sub_assign_op< typename DstXprType::Scalar, typename SrcXprType::Scalar > &)
Definition: SparseSelfAdjointView.h:256
Definition: AssignEvaluator.h:824
Sparse2Sparse Kind
Definition: SparseSelfAdjointView.h:223
SparseSelfAdjoint2Sparse Kind
Definition: SparseSelfAdjointView.h:222
Definition: AssignEvaluator.h:817
Definition: Constants.h:542
Definition: SparseAssign.h:61
Definition: SparseSelfAdjointView.h:220
Definition: SparseUtil.h:138
Definition: AssignmentFunctors.h:46
Definition: AssignmentFunctors.h:21
SparseSelfAdjointShape Shape
Definition: SparseSelfAdjointView.h:217
storage_kind_to_evaluator_kind< typenameMatrixType::StorageKind >::Kind Kind
Definition: SparseSelfAdjointView.h:216
Definition: CoreEvaluators.h:80
Definition: CoreEvaluators.h:91
static void scaleAndAddTo(Dest &dst, const Lhs &lhs, const RhsView &rhsView, const typename Dest::Scalar &alpha)
Definition: SparseSelfAdjointView.h:365
static void scaleAndAddTo(Dest &dst, const LhsView &lhsView, const Rhs &rhs, const typename Dest::Scalar &alpha)
Definition: SparseSelfAdjointView.h:348
Definition: ProductEvaluators.h:344
Definition: ProductEvaluators.h:86
evaluator< PlainObject > Base
Definition: SparseSelfAdjointView.h:408
XprType::PlainObject PlainObject
Definition: SparseSelfAdjointView.h:407
Product< Lhs, RhsView, DefaultProduct > XprType
Definition: SparseSelfAdjointView.h:406
Lhs::PlainObject m_rhs
Definition: SparseSelfAdjointView.h:418
product_evaluator(const XprType &xpr)
Definition: SparseSelfAdjointView.h:410
PlainObject m_result
Definition: SparseSelfAdjointView.h:419
product_evaluator(const XprType &xpr)
Definition: SparseSelfAdjointView.h:390
XprType::PlainObject PlainObject
Definition: SparseSelfAdjointView.h:387
PlainObject m_result
Definition: SparseSelfAdjointView.h:399
evaluator< PlainObject > Base
Definition: SparseSelfAdjointView.h:388
Rhs::PlainObject m_lhs
Definition: SparseSelfAdjointView.h:398
Product< LhsView, Rhs, DefaultProduct > XprType
Definition: SparseSelfAdjointView.h:386
Definition: ForwardDeclarations.h:164
T type
Definition: Meta.h:126
T type
Definition: Meta.h:114
Definition: AssignmentFunctors.h:67
Definition: ForwardDeclarations.h:17