Path Tracer
Reshaped.h
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008-2017 Gael Guennebaud <gael.guennebaud@inria.fr>
5 // Copyright (C) 2014 yoco <peter.xiau@gmail.com>
6 //
7 // This Source Code Form is subject to the terms of the Mozilla
8 // Public License v. 2.0. If a copy of the MPL was not distributed
9 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 
11 #ifndef EIGEN_RESHAPED_H
12 #define EIGEN_RESHAPED_H
13 
14 namespace Eigen {
15 
46 namespace internal {
47 
48 template<typename XprType, int Rows, int Cols, int Order>
49 struct traits<Reshaped<XprType, Rows, Cols, Order> > : traits<XprType>
50 {
51  typedef typename traits<XprType>::Scalar Scalar;
52  typedef typename traits<XprType>::StorageKind StorageKind;
53  typedef typename traits<XprType>::XprKind XprKind;
54  enum{
57  RowsAtCompileTime = Rows,
58  ColsAtCompileTime = Cols,
59  MaxRowsAtCompileTime = Rows,
60  MaxColsAtCompileTime = Cols,
61  XpxStorageOrder = ((int(traits<XprType>::Flags) & RowMajorBit) == RowMajorBit) ? RowMajor : ColMajor,
62  ReshapedStorageOrder = (RowsAtCompileTime == 1 && ColsAtCompileTime != 1) ? RowMajor
63  : (ColsAtCompileTime == 1 && RowsAtCompileTime != 1) ? ColMajor
64  : XpxStorageOrder,
65  HasSameStorageOrderAsXprType = (ReshapedStorageOrder == XpxStorageOrder),
66  InnerSize = (ReshapedStorageOrder==int(RowMajor)) ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
67  InnerStrideAtCompileTime = HasSameStorageOrderAsXprType
69  : Dynamic,
70  OuterStrideAtCompileTime = Dynamic,
71 
73  && (Order==int(XpxStorageOrder))
75 
76  MaskPacketAccessBit = (InnerSize == Dynamic || (InnerSize % packet_traits<Scalar>::size) == 0)
77  && (InnerStrideAtCompileTime == 1)
78  ? PacketAccessBit : 0,
79  //MaskAlignedBit = ((OuterStrideAtCompileTime!=Dynamic) && (((OuterStrideAtCompileTime * int(sizeof(Scalar))) % 16) == 0)) ? AlignedBit : 0,
80  FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1) ? LinearAccessBit : 0,
81  FlagsLvalueBit = is_lvalue<XprType>::value ? LvalueBit : 0,
82  FlagsRowMajorBit = (ReshapedStorageOrder==int(RowMajor)) ? RowMajorBit : 0,
83  FlagsDirectAccessBit = HasDirectAccess ? DirectAccessBit : 0,
84  Flags0 = traits<XprType>::Flags & ( (HereditaryBits & ~RowMajorBit) | MaskPacketAccessBit),
85 
86  Flags = (Flags0 | FlagsLinearAccessBit | FlagsLvalueBit | FlagsRowMajorBit | FlagsDirectAccessBit)
87  };
88 };
89 
90 template<typename XprType, int Rows, int Cols, int Order, bool HasDirectAccess> class ReshapedImpl_dense;
91 
92 } // end namespace internal
93 
94 template<typename XprType, int Rows, int Cols, int Order, typename StorageKind> class ReshapedImpl;
95 
96 template<typename XprType, int Rows, int Cols, int Order> class Reshaped
97  : public ReshapedImpl<XprType, Rows, Cols, Order, typename internal::traits<XprType>::StorageKind>
98 {
100  public:
101  //typedef typename Impl::Base Base;
102  typedef Impl Base;
103  EIGEN_GENERIC_PUBLIC_INTERFACE(Reshaped)
104  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Reshaped)
105 
106 
108  EIGEN_DEVICE_FUNC
109  inline Reshaped(XprType& xpr)
110  : Impl(xpr)
111  {
112  EIGEN_STATIC_ASSERT(RowsAtCompileTime!=Dynamic && ColsAtCompileTime!=Dynamic,THIS_METHOD_IS_ONLY_FOR_FIXED_SIZE)
113  eigen_assert(Rows * Cols == xpr.rows() * xpr.cols());
114  }
115 
118  EIGEN_DEVICE_FUNC
119  inline Reshaped(XprType& xpr,
120  Index reshapeRows, Index reshapeCols)
121  : Impl(xpr, reshapeRows, reshapeCols)
122  {
123  eigen_assert((RowsAtCompileTime==Dynamic || RowsAtCompileTime==reshapeRows)
124  && (ColsAtCompileTime==Dynamic || ColsAtCompileTime==reshapeCols));
125  eigen_assert(reshapeRows * reshapeCols == xpr.rows() * xpr.cols());
126  }
127 };
128 
129 // The generic default implementation for dense reshape simply forward to the internal::ReshapedImpl_dense
130 // that must be specialized for direct and non-direct access...
131 template<typename XprType, int Rows, int Cols, int Order>
132 class ReshapedImpl<XprType, Rows, Cols, Order, Dense>
133  : public internal::ReshapedImpl_dense<XprType, Rows, Cols, Order,internal::traits<Reshaped<XprType,Rows,Cols,Order> >::HasDirectAccess>
134 {
136  public:
137  typedef Impl Base;
138  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ReshapedImpl)
139  EIGEN_DEVICE_FUNC inline ReshapedImpl(XprType& xpr) : Impl(xpr) {}
140  EIGEN_DEVICE_FUNC inline ReshapedImpl(XprType& xpr, Index reshapeRows, Index reshapeCols)
141  : Impl(xpr, reshapeRows, reshapeCols) {}
142 };
143 
144 namespace internal {
145 
147 template<typename XprType, int Rows, int Cols, int Order>
148 class ReshapedImpl_dense<XprType,Rows,Cols,Order,false>
149  : public internal::dense_xpr_base<Reshaped<XprType, Rows, Cols, Order> >::type
150 {
152  public:
153 
154  typedef typename internal::dense_xpr_base<ReshapedType>::type Base;
155  EIGEN_DENSE_PUBLIC_INTERFACE(ReshapedType)
156  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ReshapedImpl_dense)
157 
159  typedef typename internal::remove_all<XprType>::type NestedExpression;
160 
161  class InnerIterator;
162 
165  EIGEN_DEVICE_FUNC
166  inline ReshapedImpl_dense(XprType& xpr)
167  : m_xpr(xpr), m_rows(Rows), m_cols(Cols)
168  {}
169 
172  EIGEN_DEVICE_FUNC
173  inline ReshapedImpl_dense(XprType& xpr, Index nRows, Index nCols)
174  : m_xpr(xpr), m_rows(nRows), m_cols(nCols)
175  {}
176 
177  EIGEN_DEVICE_FUNC Index rows() const { return m_rows; }
178  EIGEN_DEVICE_FUNC Index cols() const { return m_cols; }
179 
180  #ifdef EIGEN_PARSED_BY_DOXYGEN
181 
182  EIGEN_DEVICE_FUNC inline const Scalar* data() const;
183  EIGEN_DEVICE_FUNC inline Index innerStride() const;
184  EIGEN_DEVICE_FUNC inline Index outerStride() const;
185  #endif
186 
188  EIGEN_DEVICE_FUNC
189  const typename internal::remove_all<XprType>::type&
190  nestedExpression() const { return m_xpr; }
191 
193  EIGEN_DEVICE_FUNC
194  typename internal::remove_reference<XprType>::type&
195  nestedExpression() { return m_xpr; }
196 
197  protected:
198 
199  MatrixTypeNested m_xpr;
202 };
203 
204 
206 template<typename XprType, int Rows, int Cols, int Order>
207 class ReshapedImpl_dense<XprType, Rows, Cols, Order, true>
208  : public MapBase<Reshaped<XprType, Rows, Cols, Order> >
209 {
212  public:
213 
214  typedef MapBase<ReshapedType> Base;
215  EIGEN_DENSE_PUBLIC_INTERFACE(ReshapedType)
216  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ReshapedImpl_dense)
217 
218 
220  EIGEN_DEVICE_FUNC
221  inline ReshapedImpl_dense(XprType& xpr)
222  : Base(xpr.data()), m_xpr(xpr)
223  {}
224 
227  EIGEN_DEVICE_FUNC
228  inline ReshapedImpl_dense(XprType& xpr, Index nRows, Index nCols)
229  : Base(xpr.data(), nRows, nCols),
230  m_xpr(xpr)
231  {}
232 
233  EIGEN_DEVICE_FUNC
234  const typename internal::remove_all<XprTypeNested>::type& nestedExpression() const
235  {
236  return m_xpr;
237  }
238 
239  EIGEN_DEVICE_FUNC
240  XprType& nestedExpression() { return m_xpr; }
241 
243  EIGEN_DEVICE_FUNC
244  inline Index innerStride() const
245  {
246  return m_xpr.innerStride();
247  }
248 
250  EIGEN_DEVICE_FUNC
251  inline Index outerStride() const
252  {
253  return ((Flags&RowMajorBit)==RowMajorBit) ? this->cols() : this->rows();
254  }
255 
256  protected:
257 
258  XprTypeNested m_xpr;
259 };
260 
261 // Evaluators
262 template<typename ArgType, int Rows, int Cols, int Order, bool HasDirectAccess> struct reshaped_evaluator;
263 
264 template<typename ArgType, int Rows, int Cols, int Order>
265 struct evaluator<Reshaped<ArgType, Rows, Cols, Order> >
266  : reshaped_evaluator<ArgType, Rows, Cols, Order, traits<Reshaped<ArgType,Rows,Cols,Order> >::HasDirectAccess>
267 {
269  typedef typename XprType::Scalar Scalar;
270  // TODO: should check for smaller packet types
271  typedef typename packet_traits<Scalar>::type PacketScalar;
272 
273  enum {
274  CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
275  HasDirectAccess = traits<XprType>::HasDirectAccess,
276 
277 // RowsAtCompileTime = traits<XprType>::RowsAtCompileTime,
278 // ColsAtCompileTime = traits<XprType>::ColsAtCompileTime,
279 // MaxRowsAtCompileTime = traits<XprType>::MaxRowsAtCompileTime,
280 // MaxColsAtCompileTime = traits<XprType>::MaxColsAtCompileTime,
281 //
282 // InnerStrideAtCompileTime = traits<XprType>::HasSameStorageOrderAsXprType
283 // ? int(inner_stride_at_compile_time<ArgType>::ret)
284 // : Dynamic,
285 // OuterStrideAtCompileTime = Dynamic,
286 
287  FlagsLinearAccessBit = (traits<XprType>::RowsAtCompileTime == 1 || traits<XprType>::ColsAtCompileTime == 1 || HasDirectAccess) ? LinearAccessBit : 0,
288  FlagsRowMajorBit = (traits<XprType>::ReshapedStorageOrder==int(RowMajor)) ? RowMajorBit : 0,
289  FlagsDirectAccessBit = HasDirectAccess ? DirectAccessBit : 0,
290  Flags0 = evaluator<ArgType>::Flags & (HereditaryBits & ~RowMajorBit),
291  Flags = Flags0 | FlagsLinearAccessBit | FlagsRowMajorBit | FlagsDirectAccessBit,
292 
295  };
297  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) : reshaped_evaluator_type(xpr)
298  {
299  EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
300  }
301 };
302 
303 template<typename ArgType, int Rows, int Cols, int Order>
304 struct reshaped_evaluator<ArgType, Rows, Cols, Order, /* HasDirectAccess */ false>
305  : evaluator_base<Reshaped<ArgType, Rows, Cols, Order> >
306 {
308 
309  enum {
310  CoeffReadCost = evaluator<ArgType>::CoeffReadCost /* TODO + cost of index computations */,
311 
312  Flags = (evaluator<ArgType>::Flags & (HereditaryBits /*| LinearAccessBit | DirectAccessBit*/)),
313 
314  Alignment = 0
315  };
316 
317  EIGEN_DEVICE_FUNC explicit reshaped_evaluator(const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_xpr(xpr)
318  {
319  EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
320  }
321 
322  typedef typename XprType::Scalar Scalar;
323  typedef typename XprType::CoeffReturnType CoeffReturnType;
324 
325  typedef std::pair<Index, Index> RowCol;
326 
327  inline RowCol index_remap(Index rowId, Index colId) const
328  {
329  if(Order==ColMajor)
330  {
331  const Index nth_elem_idx = colId * m_xpr.rows() + rowId;
332  return RowCol(nth_elem_idx % m_xpr.nestedExpression().rows(),
333  nth_elem_idx / m_xpr.nestedExpression().rows());
334  }
335  else
336  {
337  const Index nth_elem_idx = colId + rowId * m_xpr.cols();
338  return RowCol(nth_elem_idx / m_xpr.nestedExpression().cols(),
339  nth_elem_idx % m_xpr.nestedExpression().cols());
340  }
341  }
342 
343  EIGEN_DEVICE_FUNC
344  inline Scalar& coeffRef(Index rowId, Index colId)
345  {
346  EIGEN_STATIC_ASSERT_LVALUE(XprType)
347  const RowCol row_col = index_remap(rowId, colId);
348  return m_argImpl.coeffRef(row_col.first, row_col.second);
349  }
350 
351  EIGEN_DEVICE_FUNC
352  inline const Scalar& coeffRef(Index rowId, Index colId) const
353  {
354  const RowCol row_col = index_remap(rowId, colId);
355  return m_argImpl.coeffRef(row_col.first, row_col.second);
356  }
357 
358  EIGEN_DEVICE_FUNC
359  EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index rowId, Index colId) const
360  {
361  const RowCol row_col = index_remap(rowId, colId);
362  return m_argImpl.coeff(row_col.first, row_col.second);
363  }
364 
365  EIGEN_DEVICE_FUNC
366  inline Scalar& coeffRef(Index index)
367  {
368  EIGEN_STATIC_ASSERT_LVALUE(XprType)
369  const RowCol row_col = index_remap(Rows == 1 ? 0 : index,
370  Rows == 1 ? index : 0);
371  return m_argImpl.coeffRef(row_col.first, row_col.second);
372 
373  }
374 
375  EIGEN_DEVICE_FUNC
376  inline const Scalar& coeffRef(Index index) const
377  {
378  const RowCol row_col = index_remap(Rows == 1 ? 0 : index,
379  Rows == 1 ? index : 0);
380  return m_argImpl.coeffRef(row_col.first, row_col.second);
381  }
382 
383  EIGEN_DEVICE_FUNC
384  inline const CoeffReturnType coeff(Index index) const
385  {
386  const RowCol row_col = index_remap(Rows == 1 ? 0 : index,
387  Rows == 1 ? index : 0);
388  return m_argImpl.coeff(row_col.first, row_col.second);
389  }
390 #if 0
391  EIGEN_DEVICE_FUNC
392  template<int LoadMode>
393  inline PacketScalar packet(Index rowId, Index colId) const
394  {
395  const RowCol row_col = index_remap(rowId, colId);
396  return m_argImpl.template packet<Unaligned>(row_col.first, row_col.second);
397 
398  }
399 
400  template<int LoadMode>
401  EIGEN_DEVICE_FUNC
402  inline void writePacket(Index rowId, Index colId, const PacketScalar& val)
403  {
404  const RowCol row_col = index_remap(rowId, colId);
405  m_argImpl.const_cast_derived().template writePacket<Unaligned>
406  (row_col.first, row_col.second, val);
407  }
408 
409  template<int LoadMode>
410  EIGEN_DEVICE_FUNC
411  inline PacketScalar packet(Index index) const
412  {
413  const RowCol row_col = index_remap(RowsAtCompileTime == 1 ? 0 : index,
414  RowsAtCompileTime == 1 ? index : 0);
415  return m_argImpl.template packet<Unaligned>(row_col.first, row_col.second);
416  }
417 
418  template<int LoadMode>
419  EIGEN_DEVICE_FUNC
420  inline void writePacket(Index index, const PacketScalar& val)
421  {
422  const RowCol row_col = index_remap(RowsAtCompileTime == 1 ? 0 : index,
423  RowsAtCompileTime == 1 ? index : 0);
424  return m_argImpl.template packet<Unaligned>(row_col.first, row_col.second, val);
425  }
426 #endif
427 protected:
428 
429  evaluator<ArgType> m_argImpl;
430  const XprType& m_xpr;
431 
432 };
433 
434 template<typename ArgType, int Rows, int Cols, int Order>
435 struct reshaped_evaluator<ArgType, Rows, Cols, Order, /* HasDirectAccess */ true>
436 : mapbase_evaluator<Reshaped<ArgType, Rows, Cols, Order>,
437  typename Reshaped<ArgType, Rows, Cols, Order>::PlainObject>
438 {
440  typedef typename XprType::Scalar Scalar;
441 
442  EIGEN_DEVICE_FUNC explicit reshaped_evaluator(const XprType& xpr)
444  {
445  // TODO: for the 3.4 release, this should be turned to an internal assertion, but let's keep it as is for the beta lifetime
446  eigen_assert(((internal::UIntPtr(xpr.data()) % EIGEN_PLAIN_ENUM_MAX(1,evaluator<XprType>::Alignment)) == 0) && "data is not aligned");
447  }
448 };
449 
450 } // end namespace internal
451 
452 } // end namespace Eigen
453 
454 #endif // EIGEN_RESHAPED_H
Eigen::internal::mapbase_evaluator
Definition: CoreEvaluators.h:882
Eigen::internal::variable_if_dynamic< Index, Rows >
Eigen::internal::ReshapedImpl_dense< XprType, Rows, Cols, Order, false >::nestedExpression
EIGEN_DEVICE_FUNC const internal::remove_all< XprType >::type & nestedExpression() const
Definition: Reshaped.h:190
Eigen::internal::ReshapedImpl_dense
Definition: Reshaped.h:90
Eigen::internal::ReshapedImpl_dense< XprType, Rows, Cols, Order, true >::outerStride
EIGEN_DEVICE_FUNC Index outerStride() const
Definition: Reshaped.h:251
Eigen
Namespace containing all symbols from the Eigen library.
Definition: LDLT.h:16
Eigen::ReshapedImpl
Definition: Reshaped.h:94
Eigen::Reshaped::Reshaped
EIGEN_DEVICE_FUNC Reshaped(XprType &xpr)
Definition: Reshaped.h:109
Eigen::internal::dense_xpr_base
Definition: XprHelper.h:492
Eigen::internal::ReshapedImpl_dense< XprType, Rows, Cols, Order, false >::nestedExpression
EIGEN_DEVICE_FUNC internal::remove_reference< XprType >::type & nestedExpression()
Definition: Reshaped.h:195
Eigen::internal::is_lvalue
Definition: XprHelper.h:668
Eigen::RowMajorBit
const unsigned int RowMajorBit
Definition: Constants.h:65
Eigen::internal::packet_traits
Definition: GenericPacketMath.h:107
Eigen::internal::ReshapedImpl_dense< XprType, Rows, Cols, Order, false >::ReshapedImpl_dense
EIGEN_DEVICE_FUNC ReshapedImpl_dense(XprType &xpr, Index nRows, Index nCols)
Definition: Reshaped.h:173
Eigen::RowMajor
@ RowMajor
Definition: Constants.h:320
Eigen::internal::evaluator_base
Definition: CoreEvaluators.h:111
Eigen::DirectAccessBit
const unsigned int DirectAccessBit
Definition: Constants.h:154
Eigen::PacketAccessBit
const unsigned int PacketAccessBit
Definition: Constants.h:93
Eigen::Reshaped::Reshaped
EIGEN_DEVICE_FUNC Reshaped(XprType &xpr, Index reshapeRows, Index reshapeCols)
Definition: Reshaped.h:119
Eigen::internal::ReshapedImpl_dense< XprType, Rows, Cols, Order, true >::ReshapedImpl_dense
EIGEN_DEVICE_FUNC ReshapedImpl_dense(XprType &xpr)
Definition: Reshaped.h:221
Eigen::internal::true_type
Definition: Meta.h:63
Eigen::LvalueBit
const unsigned int LvalueBit
Definition: Constants.h:143
Eigen::MapBase
Definition: ForwardDeclarations.h:112
Eigen::Dynamic
const int Dynamic
Definition: Constants.h:21
Eigen::internal::unpacket_traits
Definition: XprHelper.h:184
Eigen::internal::evaluator
Definition: CoreEvaluators.h:91
Eigen::internal::ReshapedImpl_dense< XprType, Rows, Cols, Order, false >::ReshapedImpl_dense
EIGEN_DEVICE_FUNC ReshapedImpl_dense(XprType &xpr)
Definition: Reshaped.h:166
Eigen::InnerIterator
An InnerIterator allows to loop over the element of any matrix expression.
Definition: CoreIterators.h:34
Eigen::internal::inner_stride_at_compile_time
Definition: DenseCoeffsBase.h:659
Eigen::LinearAccessBit
const unsigned int LinearAccessBit
Definition: Constants.h:129
Eigen::internal::traits
Definition: ForwardDeclarations.h:17
Eigen::internal::reshaped_evaluator
Definition: Reshaped.h:262
Eigen::internal::ReshapedImpl_dense< XprType, Rows, Cols, Order, true >::innerStride
EIGEN_DEVICE_FUNC Index innerStride() const
Definition: Reshaped.h:244
Eigen::internal::ReshapedImpl_dense< XprType, Rows, Cols, Order, true >::ReshapedImpl_dense
EIGEN_DEVICE_FUNC ReshapedImpl_dense(XprType &xpr, Index nRows, Index nCols)
Definition: Reshaped.h:228
Eigen::ColMajor
@ ColMajor
Definition: Constants.h:318
Eigen::Reshaped
Expression of a fixed-size or dynamic-size reshape.
Definition: Reshaped.h:98
Eigen::internal::has_direct_access
Definition: ForwardDeclarations.h:26
Eigen::Index
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:42
Eigen::Dense
Definition: Constants.h:503