11#ifndef EIGEN_SPARSE_CWISE_UNARY_OP_H
12#define EIGEN_SPARSE_CWISE_UNARY_OP_H
15#include "./InternalHeaderCheck.h"
21template <
typename UnaryOp,
typename ArgType>
22struct unary_evaluator<CwiseUnaryOp<UnaryOp, ArgType>, IteratorBased>
23 :
public evaluator_base<CwiseUnaryOp<UnaryOp, ArgType> > {
25 using XprType = CwiseUnaryOp<UnaryOp, ArgType>;
30 CoeffReadCost = int(evaluator<ArgType>::CoeffReadCost) + int(functor_traits<UnaryOp>::Cost),
31 Flags = XprType::Flags
34 explicit unary_evaluator(
const XprType& op) : m_functor(op.functor()), m_argImpl(op.nestedExpression()) {
35 EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<UnaryOp>::Cost);
36 EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
39 inline Index nonZerosEstimate()
const {
return m_argImpl.nonZerosEstimate(); }
42 using EvalIterator =
typename evaluator<ArgType>::InnerIterator;
44 const UnaryOp m_functor;
45 evaluator<ArgType> m_argImpl;
48template <
typename UnaryOp,
typename ArgType>
49class unary_evaluator<CwiseUnaryOp<UnaryOp, ArgType>, IteratorBased>::InnerIterator
50 :
public unary_evaluator<CwiseUnaryOp<UnaryOp, ArgType>, IteratorBased>::EvalIterator {
52 using Scalar =
typename XprType::Scalar;
53 using Base =
typename unary_evaluator<CwiseUnaryOp<UnaryOp, ArgType>, IteratorBased>::EvalIterator;
56 EIGEN_STRONG_INLINE InnerIterator(
const unary_evaluator& unaryOp, Index outer)
57 : Base(unaryOp.m_argImpl, outer), m_functor(unaryOp.m_functor) {}
59 EIGEN_STRONG_INLINE InnerIterator& operator++() {
64 EIGEN_STRONG_INLINE Scalar value()
const {
return m_functor(Base::value()); }
67 const UnaryOp m_functor;
73template <
typename ViewOp,
typename ArgType>
74struct unary_evaluator<CwiseUnaryView<ViewOp, ArgType>, IteratorBased>
75 :
public evaluator_base<CwiseUnaryView<ViewOp, ArgType> > {
77 using XprType = CwiseUnaryView<ViewOp, ArgType>;
82 CoeffReadCost = int(evaluator<ArgType>::CoeffReadCost) + int(functor_traits<ViewOp>::Cost),
83 Flags = XprType::Flags
86 explicit unary_evaluator(
const XprType& op) : m_functor(op.functor()), m_argImpl(op.nestedExpression()) {
87 EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<ViewOp>::Cost);
88 EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
92 using EvalIterator =
typename evaluator<ArgType>::InnerIterator;
94 const ViewOp m_functor;
95 evaluator<ArgType> m_argImpl;
98template <
typename ViewOp,
typename ArgType>
99class unary_evaluator<CwiseUnaryView<ViewOp, ArgType>, IteratorBased>::InnerIterator
100 :
public unary_evaluator<CwiseUnaryView<ViewOp, ArgType>, IteratorBased>::EvalIterator {
102 using Scalar =
typename XprType::Scalar;
103 using Base =
typename unary_evaluator<CwiseUnaryView<ViewOp, ArgType>, IteratorBased>::EvalIterator;
106 EIGEN_STRONG_INLINE InnerIterator(
const unary_evaluator& unaryOp, Index outer)
107 : Base(unaryOp.m_argImpl, outer), m_functor(unaryOp.m_functor) {}
109 EIGEN_STRONG_INLINE InnerIterator& operator++() {
114 EIGEN_STRONG_INLINE Scalar value()
const {
return m_functor(Base::value()); }
115 EIGEN_STRONG_INLINE Scalar& valueRef() {
return m_functor(Base::valueRef()); }
118 const ViewOp m_functor;
123template <
typename Derived>
124EIGEN_STRONG_INLINE Derived& SparseMatrixBase<Derived>::operator*=(
const Scalar& other) {
125 using EvalIterator =
typename internal::evaluator<Derived>::InnerIterator;
126 internal::evaluator<Derived> thisEval(derived());
127 for (Index j = 0; j < outerSize(); ++j)
128 for (EvalIterator i(thisEval, j); i; ++i) i.valueRef() *= other;
132template <
typename Derived>
133EIGEN_STRONG_INLINE Derived& SparseMatrixBase<Derived>::operator/=(
const Scalar& other) {
134 using EvalIterator =
typename internal::evaluator<Derived>::InnerIterator;
135 internal::evaluator<Derived> thisEval(derived());
136 for (Index j = 0; j < outerSize(); ++j)
137 for (EvalIterator i(thisEval, j); i; ++i) i.valueRef() /= other;