• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
10 #ifndef EIGEN_SPARSE_CWISE_UNARY_OP_H
11 #define EIGEN_SPARSE_CWISE_UNARY_OP_H
12 
13 namespace Eigen {
14 
15 namespace internal {
16 
17 template<typename UnaryOp, typename ArgType>
18 struct unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>
19   : public evaluator_base<CwiseUnaryOp<UnaryOp,ArgType> >
20 {
21   public:
22     typedef CwiseUnaryOp<UnaryOp, ArgType> XprType;
23 
24     class InnerIterator;
25 
26     enum {
27       CoeffReadCost = evaluator<ArgType>::CoeffReadCost + functor_traits<UnaryOp>::Cost,
28       Flags = XprType::Flags
29     };
30 
31     explicit unary_evaluator(const XprType& op) : m_functor(op.functor()), m_argImpl(op.nestedExpression())
32     {
33       EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<UnaryOp>::Cost);
34       EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
35     }
36 
37     inline Index nonZerosEstimate() const {
38       return m_argImpl.nonZerosEstimate();
39     }
40 
41   protected:
42     typedef typename evaluator<ArgType>::InnerIterator        EvalIterator;
43 
44     const UnaryOp m_functor;
45     evaluator<ArgType> m_argImpl;
46 };
47 
48 template<typename UnaryOp, typename ArgType>
49 class unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>::InnerIterator
50     : public unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>::EvalIterator
51 {
52     typedef typename XprType::Scalar Scalar;
53     typedef typename unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>::EvalIterator Base;
54   public:
55 
56     EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator& unaryOp, Index outer)
57       : Base(unaryOp.m_argImpl,outer), m_functor(unaryOp.m_functor)
58     {}
59 
60     EIGEN_STRONG_INLINE InnerIterator& operator++()
61     { Base::operator++(); return *this; }
62 
63     EIGEN_STRONG_INLINE Scalar value() const { return m_functor(Base::value()); }
64 
65   protected:
66     const UnaryOp m_functor;
67   private:
68     Scalar& valueRef();
69 };
70 
71 template<typename ViewOp, typename ArgType>
72 struct unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>
73   : public evaluator_base<CwiseUnaryView<ViewOp,ArgType> >
74 {
75   public:
76     typedef CwiseUnaryView<ViewOp, ArgType> XprType;
77 
78     class InnerIterator;
79 
80     enum {
81       CoeffReadCost = evaluator<ArgType>::CoeffReadCost + functor_traits<ViewOp>::Cost,
82       Flags = XprType::Flags
83     };
84 
85     explicit unary_evaluator(const XprType& op) : m_functor(op.functor()), m_argImpl(op.nestedExpression())
86     {
87       EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<ViewOp>::Cost);
88       EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
89     }
90 
91   protected:
92     typedef typename evaluator<ArgType>::InnerIterator        EvalIterator;
93 
94     const ViewOp m_functor;
95     evaluator<ArgType> m_argImpl;
96 };
97 
98 template<typename ViewOp, typename ArgType>
99 class unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>::InnerIterator
100     : public unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>::EvalIterator
101 {
102     typedef typename XprType::Scalar Scalar;
103     typedef typename unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>::EvalIterator Base;
104   public:
105 
106     EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator& unaryOp, Index outer)
107       : Base(unaryOp.m_argImpl,outer), m_functor(unaryOp.m_functor)
108     {}
109 
110     EIGEN_STRONG_INLINE InnerIterator& operator++()
111     { Base::operator++(); return *this; }
112 
113     EIGEN_STRONG_INLINE Scalar value() const { return m_functor(Base::value()); }
114     EIGEN_STRONG_INLINE Scalar& valueRef() { return m_functor(Base::valueRef()); }
115 
116   protected:
117     const ViewOp m_functor;
118 };
119 
120 } // end namespace internal
121 
122 template<typename Derived>
123 EIGEN_STRONG_INLINE Derived&
124 SparseMatrixBase<Derived>::operator*=(const Scalar& other)
125 {
126   typedef typename internal::evaluator<Derived>::InnerIterator EvalIterator;
127   internal::evaluator<Derived> thisEval(derived());
128   for (Index j=0; j<outerSize(); ++j)
129     for (EvalIterator i(thisEval,j); i; ++i)
130       i.valueRef() *= other;
131   return derived();
132 }
133 
134 template<typename Derived>
135 EIGEN_STRONG_INLINE Derived&
136 SparseMatrixBase<Derived>::operator/=(const Scalar& other)
137 {
138   typedef typename internal::evaluator<Derived>::InnerIterator EvalIterator;
139   internal::evaluator<Derived> thisEval(derived());
140   for (Index j=0; j<outerSize(); ++j)
141     for (EvalIterator i(thisEval,j); i; ++i)
142       i.valueRef() /= other;
143   return derived();
144 }
145 
146 } // end namespace Eigen
147 
148 #endif // EIGEN_SPARSE_CWISE_UNARY_OP_H
149