Eigen  5.0.1
 
Loading...
Searching...
No Matches
SparseCwiseUnaryOp.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2008-2015 Gael Guennebaud <gael.guennebaud@inria.fr>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9// SPDX-License-Identifier: MPL-2.0
10
11#ifndef EIGEN_SPARSE_CWISE_UNARY_OP_H
12#define EIGEN_SPARSE_CWISE_UNARY_OP_H
13
14// IWYU pragma: private
15#include "./InternalHeaderCheck.h"
16
17namespace Eigen {
18
19namespace internal {
20
21template <typename UnaryOp, typename ArgType>
22struct unary_evaluator<CwiseUnaryOp<UnaryOp, ArgType>, IteratorBased>
23 : public evaluator_base<CwiseUnaryOp<UnaryOp, ArgType> > {
24 public:
25 using XprType = CwiseUnaryOp<UnaryOp, ArgType>;
26
27 class InnerIterator;
28
29 enum {
30 CoeffReadCost = int(evaluator<ArgType>::CoeffReadCost) + int(functor_traits<UnaryOp>::Cost),
31 Flags = XprType::Flags
32 };
33
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);
37 }
38
39 inline Index nonZerosEstimate() const { return m_argImpl.nonZerosEstimate(); }
40
41 protected:
42 using EvalIterator = typename evaluator<ArgType>::InnerIterator;
43
44 const UnaryOp m_functor;
45 evaluator<ArgType> m_argImpl;
46};
47
48template <typename UnaryOp, typename ArgType>
49class unary_evaluator<CwiseUnaryOp<UnaryOp, ArgType>, IteratorBased>::InnerIterator
50 : public unary_evaluator<CwiseUnaryOp<UnaryOp, ArgType>, IteratorBased>::EvalIterator {
51 protected:
52 using Scalar = typename XprType::Scalar;
53 using Base = typename unary_evaluator<CwiseUnaryOp<UnaryOp, ArgType>, IteratorBased>::EvalIterator;
54
55 public:
56 EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator& unaryOp, Index outer)
57 : Base(unaryOp.m_argImpl, outer), m_functor(unaryOp.m_functor) {}
58
59 EIGEN_STRONG_INLINE InnerIterator& operator++() {
60 Base::operator++();
61 return *this;
62 }
63
64 EIGEN_STRONG_INLINE Scalar value() const { return m_functor(Base::value()); }
65
66 protected:
67 const UnaryOp m_functor;
68
69 private:
70 Scalar& valueRef();
71};
72
73template <typename ViewOp, typename ArgType>
74struct unary_evaluator<CwiseUnaryView<ViewOp, ArgType>, IteratorBased>
75 : public evaluator_base<CwiseUnaryView<ViewOp, ArgType> > {
76 public:
77 using XprType = CwiseUnaryView<ViewOp, ArgType>;
78
79 class InnerIterator;
80
81 enum {
82 CoeffReadCost = int(evaluator<ArgType>::CoeffReadCost) + int(functor_traits<ViewOp>::Cost),
83 Flags = XprType::Flags
84 };
85
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);
89 }
90
91 protected:
92 using EvalIterator = typename evaluator<ArgType>::InnerIterator;
93
94 const ViewOp m_functor;
95 evaluator<ArgType> m_argImpl;
96};
97
98template <typename ViewOp, typename ArgType>
99class unary_evaluator<CwiseUnaryView<ViewOp, ArgType>, IteratorBased>::InnerIterator
100 : public unary_evaluator<CwiseUnaryView<ViewOp, ArgType>, IteratorBased>::EvalIterator {
101 protected:
102 using Scalar = typename XprType::Scalar;
103 using Base = typename unary_evaluator<CwiseUnaryView<ViewOp, ArgType>, IteratorBased>::EvalIterator;
104
105 public:
106 EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator& unaryOp, Index outer)
107 : Base(unaryOp.m_argImpl, outer), m_functor(unaryOp.m_functor) {}
108
109 EIGEN_STRONG_INLINE InnerIterator& operator++() {
110 Base::operator++();
111 return *this;
112 }
113
114 EIGEN_STRONG_INLINE Scalar value() const { return m_functor(Base::value()); }
115 EIGEN_STRONG_INLINE Scalar& valueRef() { return m_functor(Base::valueRef()); }
116
117 protected:
118 const ViewOp m_functor;
119};
120
121} // end namespace internal
122
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;
129 return derived();
130}
131
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;
138 return derived();
139}
140
141} // end namespace Eigen
142
143#endif // EIGEN_SPARSE_CWISE_UNARY_OP_H