All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DMatEvalExpr.h
Go to the documentation of this file.
1 //=================================================================================================
33 //=================================================================================================
34 
35 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATEVALEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_DMATEVALEXPR_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
43 #include <cmath>
60 #include <blaze/util/Assert.h>
62 #include <blaze/util/EnableIf.h>
63 #include <blaze/util/InvalidType.h>
65 #include <blaze/util/SelectType.h>
66 #include <blaze/util/Types.h>
67 
68 
69 namespace blaze {
70 
71 //=================================================================================================
72 //
73 // CLASS DMATEVALEXPR
74 //
75 //=================================================================================================
76 
77 //*************************************************************************************************
84 template< typename MT // Type of the dense matrix
85  , bool SO > // Storage order
86 class DMatEvalExpr : public DenseMatrix< DMatEvalExpr<MT,SO>, SO >
87  , private MatEvalExpr
88  , private Computation
89 {
90  public:
91  //**Type definitions****************************************************************************
93  typedef typename MT::ResultType ResultType;
94  typedef typename MT::OppositeType OppositeType;
95  typedef typename MT::TransposeType TransposeType;
96  typedef typename MT::ElementType ElementType;
97  typedef typename MT::ReturnType ReturnType;
98 
100  typedef const ResultType CompositeType;
101 
103  typedef typename SelectType< IsExpression<MT>::value, const MT, const MT& >::Type Operand;
104  //**********************************************************************************************
105 
106  //**Compilation flags***************************************************************************
108  enum { vectorizable = 0 };
109  //**********************************************************************************************
110 
111  //**Constructor*********************************************************************************
116  explicit inline DMatEvalExpr( const MT& dm )
117  : dm_( dm ) // Dense matrix of the evaluation expression
118  {}
119  //**********************************************************************************************
120 
121  //**Access operator*****************************************************************************
128  inline ReturnType operator()( size_t i, size_t j ) const {
129  BLAZE_INTERNAL_ASSERT( i < dm_.rows() , "Invalid row access index" );
130  BLAZE_INTERNAL_ASSERT( j < dm_.columns(), "Invalid column access index" );
131  return dm_(i,j);
132  }
133  //**********************************************************************************************
134 
135  //**Rows function*******************************************************************************
140  inline size_t rows() const {
141  return dm_.rows();
142  }
143  //**********************************************************************************************
144 
145  //**Columns function****************************************************************************
150  inline size_t columns() const {
151  return dm_.columns();
152  }
153  //**********************************************************************************************
154 
155  //**Operand access******************************************************************************
160  inline Operand operand() const {
161  return dm_;
162  }
163  //**********************************************************************************************
164 
165  //**********************************************************************************************
171  template< typename T >
172  inline bool canAlias( const T* alias ) const {
173  return dm_.canAlias( alias );
174  }
175  //**********************************************************************************************
176 
177  //**********************************************************************************************
183  template< typename T >
184  inline bool isAliased( const T* alias ) const {
185  return dm_.isAliased( alias );
186  }
187  //**********************************************************************************************
188 
189  private:
190  //**Member variables****************************************************************************
192  //**********************************************************************************************
193 
194  //**Assignment to dense matrices****************************************************************
206  template< typename MT2 // Type of the target dense matrix
207  , bool SO2 > // Storage order of the target dense matrix
208  friend inline void assign( DenseMatrix<MT2,SO2>& lhs, const DMatEvalExpr& rhs )
209  {
211 
212  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
213  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
214 
215  assign( ~lhs, rhs.dm_ );
216  }
218  //**********************************************************************************************
219 
220  //**Assignment to sparse matrices***************************************************************
232  template< typename MT2 // Type of the target sparse matrix
233  , bool SO2 > // Storage order of the target dense matrix
234  friend inline void assign( SparseMatrix<MT2,SO2>& lhs, const DMatEvalExpr& rhs )
235  {
237 
238  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
239  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
240 
241  assign( ~lhs, rhs.dm_ );
242  }
244  //**********************************************************************************************
245 
246  //**Addition assignment to dense matrices*******************************************************
258  template< typename MT2 // Type of the target dense matrix
259  , bool SO2 > // Storage order of the target dense matrix
260  friend inline void addAssign( DenseMatrix<MT2,SO2>& lhs, const DMatEvalExpr& rhs )
261  {
263 
264  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
265  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
266 
267  addAssign( ~lhs, rhs.dm_ );
268  }
270  //**********************************************************************************************
271 
272  //**Addition assignment to sparse matrices******************************************************
284  template< typename MT2 // Type of the target sparse matrix
285  , bool SO2 > // Storage order of the target dense matrix
286  friend inline void addAssign( SparseMatrix<MT2,SO2>& lhs, const DMatEvalExpr& rhs )
287  {
289 
290  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
291  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
292 
293  addAssign( ~lhs, rhs.dm_ );
294  }
296  //**********************************************************************************************
297 
298  //**Subtraction assignment to dense matrices****************************************************
310  template< typename MT2 // Type of the target dense matrix
311  , bool SO2 > // Storage order of the target dense matrix
312  friend inline void subAssign( DenseMatrix<MT2,SO2>& lhs, const DMatEvalExpr& rhs )
313  {
315 
316  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
317  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
318 
319  subAssign( ~lhs, rhs.dm_ );
320  }
322  //**********************************************************************************************
323 
324  //**Subtraction assignment to sparse matrices***************************************************
336  template< typename MT2 // Type of the target sparse matrix
337  , bool SO2 > // Storage order of the target dense matrix
338  friend inline void subAssign( SparseMatrix<MT2,SO2>& lhs, const DMatEvalExpr& rhs )
339  {
341 
342  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
343  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
344 
345  subAssign( ~lhs, rhs.dm_ );
346  }
348  //**********************************************************************************************
349 
350  //**Multiplication assignment to dense matrices*************************************************
351  // No special implementation for the multiplication assignment to dense matrices.
352  //**********************************************************************************************
353 
354  //**Multiplication assignment to sparse matrices************************************************
355  // No special implementation for the multiplication assignment to sparse matrices.
356  //**********************************************************************************************
357 
358  //**Compile time checks*************************************************************************
363  //**********************************************************************************************
364 };
365 //*************************************************************************************************
366 
367 
368 
369 
370 //=================================================================================================
371 //
372 // GLOBAL FUNCTIONS
373 //
374 //=================================================================================================
375 
376 //*************************************************************************************************
393 template< typename MT // Type of the dense matrix
394  , bool SO > // Storage order
395 inline const DMatEvalExpr<MT,SO> eval( const DenseMatrix<MT,SO>& dm )
396 {
398 
399  return DMatEvalExpr<MT,SO>( ~dm );
400 }
401 //*************************************************************************************************
402 
403 
404 
405 
406 //=================================================================================================
407 //
408 // GLOBAL RESTRUCTURING FUNCTIONS
409 //
410 //=================================================================================================
411 
412 //*************************************************************************************************
423 template< typename MT // Type of the dense matrix
424  , bool SO > // Storage order
425 inline const DMatEvalExpr<MT,SO> eval( const DMatEvalExpr<MT,SO>& dm )
426 {
427  return dm;
428 }
430 //*************************************************************************************************
431 
432 
433 
434 
435 //=================================================================================================
436 //
437 // EXPRESSION TRAIT SPECIALIZATIONS
438 //
439 //=================================================================================================
440 
441 //*************************************************************************************************
443 template< typename MT >
444 struct DMatEvalExprTrait< DMatEvalExpr<MT,false> >
445 {
446  public:
447  //**********************************************************************************************
448  typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value
449  , DMatEvalExpr<MT,false>
450  , INVALID_TYPE >::Type Type;
451  //**********************************************************************************************
452 };
454 //*************************************************************************************************
455 
456 
457 //*************************************************************************************************
459 template< typename MT >
460 struct TDMatEvalExprTrait< DMatEvalExpr<MT,true> >
461 {
462  public:
463  //**********************************************************************************************
464  typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value
465  , DMatEvalExpr<MT,true>
466  , INVALID_TYPE >::Type Type;
467  //**********************************************************************************************
468 };
470 //*************************************************************************************************
471 
472 
473 //*************************************************************************************************
475 template< typename MT, bool SO >
476 struct SubmatrixExprTrait< DMatEvalExpr<MT,SO> >
477 {
478  public:
479  //**********************************************************************************************
480  typedef typename EvalExprTrait< typename SubmatrixExprTrait<const MT>::Type >::Type Type;
481  //**********************************************************************************************
482 };
484 //*************************************************************************************************
485 
486 
487 //*************************************************************************************************
489 template< typename MT, bool SO >
490 struct RowExprTrait< DMatEvalExpr<MT,SO> >
491 {
492  public:
493  //**********************************************************************************************
494  typedef typename EvalExprTrait< typename RowExprTrait<const MT>::Type >::Type Type;
495  //**********************************************************************************************
496 };
498 //*************************************************************************************************
499 
500 
501 //*************************************************************************************************
503 template< typename MT, bool SO >
504 struct ColumnExprTrait< DMatEvalExpr<MT,SO> >
505 {
506  public:
507  //**********************************************************************************************
508  typedef typename EvalExprTrait< typename ColumnExprTrait<const MT>::Type >::Type Type;
509  //**********************************************************************************************
510 };
512 //*************************************************************************************************
513 
514 } // namespace blaze
515 
516 #endif
Header file for the DMatEvalExprTrait class template.
#define BLAZE_CONSTRAINT_MUST_BE_MATRIX_WITH_STORAGE_ORDER(T, SO)
Constraint on the data type.In case the given data type T is not a dense or sparse matrix type and in...
Definition: StorageOrder.h:242
size_t rows() const
Returns the current number of rows of the matrix.
Definition: DMatEvalExpr.h:140
#define BLAZE_CONSTRAINT_MUST_BE_DENSE_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is not a dense, N-dimensional matrix type...
Definition: DenseMatrix.h:79
Header file for the ColumnExprTrait class template.
Header file for the IsColumnMajorMatrix type trait.
Header file for the MatEvalExpr base class.
Header file for the Computation base class.
CompressedMatrix< Type, false > OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: CompressedMatrix.h:2371
Base class for dense matrices.The DenseMatrix class is a base class for all dense matrix classes...
Definition: DenseMatrix.h:70
Base class for sparse matrices.The SparseMatrix class is a base class for all sparse matrix classes...
Definition: Forward.h:104
Constraint on the data type.
Operand operand() const
Returns the dense matrix operand.
Definition: DMatEvalExpr.h:160
Constraint on the data type.
DMatEvalExpr< MT, SO > This
Type of this DMatEvalExpr instance.
Definition: DMatEvalExpr.h:92
SelectType< IsExpression< MT >::value, const MT, const MT & >::Type Operand
Composite data type of the dense matrix expression.
Definition: DMatEvalExpr.h:103
Compile time type selection.The SelectType class template selects one of the two given types T1 and T...
Definition: SelectType.h:59
DMatEvalExpr(const MT &dm)
Constructor for the DMatEvalExpr class.
Definition: DMatEvalExpr.h:116
Header file for the DenseMatrix base class.
void assign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the assignment of a matrix to a matrix.
Definition: Matrix.h:179
MT::OppositeType OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: DMatEvalExpr.h:94
const ResultType CompositeType
Data type for composite expression templates.
Definition: DMatEvalExpr.h:100
CompressedMatrix< Type, false > TransposeType
Transpose type for expression template evaluations.
Definition: CompressedMatrix.h:2372
Constraints on the storage order of matrix types.
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:2373
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: DMatEvalExpr.h:172
Header file for the SelectType class template.
Header file for the RowExprTrait class template.
Header file for all forward declarations for expression class templates.
Header file for the IsDenseMatrix type trait.
Header file for the EnableIf class template.
Operand dm_
Dense matrix of the evaluation expression.
Definition: DMatEvalExpr.h:191
MT::ReturnType ReturnType
Return type for expression template evaluations.
Definition: DMatEvalExpr.h:97
MT::ElementType ElementType
Resulting element type.
Definition: DMatEvalExpr.h:96
Header file for the SubmatrixExprTrait class template.
const Type & ReturnType
Return type for expression template evaluations.
Definition: CompressedMatrix.h:2374
Header file for run time assertion macros.
Utility type for generic codes.
void addAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the addition assignment of a matrix to a matrix.
Definition: Matrix.h:209
Header file for the EvalExprTrait class template.
Base class for all matrix evaluation expression templates.The MatEvalExpr class serves as a tag for a...
Definition: MatEvalExpr.h:65
void subAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the subtraction assignment of a matrix to matrix.
Definition: Matrix.h:239
bool isAliased(const T *alias) const
Returns whether the expression is aliased with the given address alias.
Definition: DMatEvalExpr.h:184
const DMatEvalExpr< MT, SO > eval(const DenseMatrix< MT, SO > &dm)
Forces the evaluation of the given dense matrix expression dm.
Definition: DMatEvalExpr.h:395
Header file for the IsRowMajorMatrix type trait.
MT::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: DMatEvalExpr.h:95
Expression object for the forced evaluation of dense matrices.The DMatEvalExpr class represents the c...
Definition: DMatEvalExpr.h:86
Base class for all compute expression templates.The Computation class serves as a tag for all computa...
Definition: Computation.h:59
#define BLAZE_FUNCTION_TRACE
Function trace macro.This macro can be used to reliably trace function calls. In case function tracin...
Definition: FunctionTrace.h:157
Header file for the TDMatEvalExprTrait class template.
This ResultType
Result type for expression template evaluations.
Definition: CompressedMatrix.h:2370
Header file for basic type definitions.
size_t columns() const
Returns the current number of columns of the matrix.
Definition: DMatEvalExpr.h:150
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: DMatEvalExpr.h:128
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.In case of an invalid run time expression, the program execution is terminated. The BLAZE_INTERNAL_ASSERT macro can be disabled by setting the BLAZE_USER_ASSERTION flag to zero or by defining NDEBUG during the compilation.
Definition: Assert.h:101
MT::ResultType ResultType
Result type for expression template evaluations.
Definition: DMatEvalExpr.h:93
Header file for the IsExpression type trait class.
Header file for the FunctionTrace class.