Merge of itasc branch. Project files, scons and cmake should be working. Makefile...
[blender.git] / extern / Eigen2 / Eigen / src / Sparse / SparseCwiseUnaryOp.h
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra. Eigen itself is part of the KDE project.
3 //
4 // Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>
5 //
6 // Eigen is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 3 of the License, or (at your option) any later version.
10 //
11 // Alternatively, you can redistribute it and/or
12 // modify it under the terms of the GNU General Public License as
13 // published by the Free Software Foundation; either version 2 of
14 // the License, or (at your option) any later version.
15 //
16 // Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
17 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU Lesser General Public
22 // License and a copy of the GNU General Public License along with
23 // Eigen. If not, see <http://www.gnu.org/licenses/>.
24
25 #ifndef EIGEN_SPARSE_CWISE_UNARY_OP_H
26 #define EIGEN_SPARSE_CWISE_UNARY_OP_H
27
28 template<typename UnaryOp, typename MatrixType>
29 struct ei_traits<SparseCwiseUnaryOp<UnaryOp, MatrixType> > : ei_traits<MatrixType>
30 {
31   typedef typename ei_result_of<
32                      UnaryOp(typename MatrixType::Scalar)
33                    >::type Scalar;
34   typedef typename MatrixType::Nested MatrixTypeNested;
35   typedef typename ei_unref<MatrixTypeNested>::type _MatrixTypeNested;
36   enum {
37     CoeffReadCost = _MatrixTypeNested::CoeffReadCost + ei_functor_traits<UnaryOp>::Cost
38   };
39 };
40
41 template<typename UnaryOp, typename MatrixType>
42 class SparseCwiseUnaryOp : ei_no_assignment_operator,
43   public SparseMatrixBase<SparseCwiseUnaryOp<UnaryOp, MatrixType> >
44 {
45   public:
46
47     class InnerIterator;
48 //     typedef typename ei_unref<LhsNested>::type _LhsNested;
49
50     EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(SparseCwiseUnaryOp)
51
52     inline SparseCwiseUnaryOp(const MatrixType& mat, const UnaryOp& func = UnaryOp())
53       : m_matrix(mat), m_functor(func) {}
54
55     EIGEN_STRONG_INLINE int rows() const { return m_matrix.rows(); }
56     EIGEN_STRONG_INLINE int cols() const { return m_matrix.cols(); }
57
58 //     EIGEN_STRONG_INLINE const typename MatrixType::Nested& _matrix() const { return m_matrix; }
59 //     EIGEN_STRONG_INLINE const UnaryOp& _functor() const { return m_functor; }
60
61   protected:
62     const typename MatrixType::Nested m_matrix;
63     const UnaryOp m_functor;
64 };
65
66
67 template<typename UnaryOp, typename MatrixType>
68 class SparseCwiseUnaryOp<UnaryOp,MatrixType>::InnerIterator
69 {
70     typedef typename SparseCwiseUnaryOp::Scalar Scalar;
71     typedef typename ei_traits<SparseCwiseUnaryOp>::_MatrixTypeNested _MatrixTypeNested;
72     typedef typename _MatrixTypeNested::InnerIterator MatrixTypeIterator;
73   public:
74
75     EIGEN_STRONG_INLINE InnerIterator(const SparseCwiseUnaryOp& unaryOp, int outer)
76       : m_iter(unaryOp.m_matrix,outer), m_functor(unaryOp.m_functor)
77     {}
78
79     EIGEN_STRONG_INLINE InnerIterator& operator++()
80     { ++m_iter; return *this; }
81
82     EIGEN_STRONG_INLINE Scalar value() const { return m_functor(m_iter.value()); }
83
84     EIGEN_STRONG_INLINE int index() const { return m_iter.index(); }
85     EIGEN_STRONG_INLINE int row() const { return m_iter.row(); }
86     EIGEN_STRONG_INLINE int col() const { return m_iter.col(); }
87
88     EIGEN_STRONG_INLINE operator bool() const { return m_iter; }
89
90   protected:
91     MatrixTypeIterator m_iter;
92     const UnaryOp m_functor;
93 };
94
95 template<typename Derived>
96 template<typename CustomUnaryOp>
97 EIGEN_STRONG_INLINE const SparseCwiseUnaryOp<CustomUnaryOp, Derived>
98 SparseMatrixBase<Derived>::unaryExpr(const CustomUnaryOp& func) const
99 {
100   return SparseCwiseUnaryOp<CustomUnaryOp, Derived>(derived(), func);
101 }
102
103 template<typename Derived>
104 EIGEN_STRONG_INLINE const SparseCwiseUnaryOp<ei_scalar_opposite_op<typename ei_traits<Derived>::Scalar>,Derived>
105 SparseMatrixBase<Derived>::operator-() const
106 {
107   return derived();
108 }
109
110 template<typename ExpressionType>
111 EIGEN_STRONG_INLINE const EIGEN_SPARSE_CWISE_UNOP_RETURN_TYPE(ei_scalar_abs_op)
112 SparseCwise<ExpressionType>::abs() const
113 {
114   return _expression();
115 }
116
117 template<typename ExpressionType>
118 EIGEN_STRONG_INLINE const EIGEN_SPARSE_CWISE_UNOP_RETURN_TYPE(ei_scalar_abs2_op)
119 SparseCwise<ExpressionType>::abs2() const
120 {
121   return _expression();
122 }
123
124 template<typename Derived>
125 EIGEN_STRONG_INLINE typename SparseMatrixBase<Derived>::ConjugateReturnType
126 SparseMatrixBase<Derived>::conjugate() const
127 {
128   return ConjugateReturnType(derived());
129 }
130
131 template<typename Derived>
132 EIGEN_STRONG_INLINE const typename SparseMatrixBase<Derived>::RealReturnType
133 SparseMatrixBase<Derived>::real() const { return derived(); }
134
135 template<typename Derived>
136 EIGEN_STRONG_INLINE const typename SparseMatrixBase<Derived>::ImagReturnType
137 SparseMatrixBase<Derived>::imag() const { return derived(); }
138
139 template<typename Derived>
140 template<typename NewType>
141 EIGEN_STRONG_INLINE const SparseCwiseUnaryOp<ei_scalar_cast_op<typename ei_traits<Derived>::Scalar, NewType>, Derived>
142 SparseMatrixBase<Derived>::cast() const
143 {
144   return derived();
145 }
146
147 template<typename Derived>
148 EIGEN_STRONG_INLINE const SparseCwiseUnaryOp<ei_scalar_multiple_op<typename ei_traits<Derived>::Scalar>, Derived>
149 SparseMatrixBase<Derived>::operator*(const Scalar& scalar) const
150 {
151   return SparseCwiseUnaryOp<ei_scalar_multiple_op<Scalar>, Derived>
152     (derived(), ei_scalar_multiple_op<Scalar>(scalar));
153 }
154
155 template<typename Derived>
156 EIGEN_STRONG_INLINE const SparseCwiseUnaryOp<ei_scalar_quotient1_op<typename ei_traits<Derived>::Scalar>, Derived>
157 SparseMatrixBase<Derived>::operator/(const Scalar& scalar) const
158 {
159   return SparseCwiseUnaryOp<ei_scalar_quotient1_op<Scalar>, Derived>
160     (derived(), ei_scalar_quotient1_op<Scalar>(scalar));
161 }
162
163 template<typename Derived>
164 EIGEN_STRONG_INLINE Derived&
165 SparseMatrixBase<Derived>::operator*=(const Scalar& other)
166 {
167   for (int j=0; j<outerSize(); ++j)
168     for (typename Derived::InnerIterator i(derived(),j); i; ++i)
169       i.valueRef() *= other;
170   return derived();
171 }
172
173 template<typename Derived>
174 EIGEN_STRONG_INLINE Derived&
175 SparseMatrixBase<Derived>::operator/=(const Scalar& other)
176 {
177   for (int j=0; j<outerSize(); ++j)
178     for (typename Derived::InnerIterator i(derived(),j); i; ++i)
179       i.valueRef() /= other;
180   return derived();
181 }
182
183 #endif // EIGEN_SPARSE_CWISE_UNARY_OP_H