All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SMatDMatSubExpr.h
Go to the documentation of this file.
1 //=================================================================================================
33 //=================================================================================================
34 
35 #ifndef _BLAZE_MATH_EXPRESSIONS_SMATDMATSUBEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_SMATDMATSUBEXPR_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
43 #include <stdexcept>
70 #include <blaze/util/Assert.h>
72 #include <blaze/util/EnableIf.h>
74 #include <blaze/util/mpl/Max.h>
75 #include <blaze/util/SelectType.h>
76 #include <blaze/util/Types.h>
78 
79 
80 namespace blaze {
81 
82 //=================================================================================================
83 //
84 // CLASS SMATDMATSUBEXPR
85 //
86 //=================================================================================================
87 
88 //*************************************************************************************************
95 template< typename MT1 // Type of the left-hand side sparse matrix
96  , typename MT2 // Type of the right-hand side dense matrix
97  , bool SO > // Storage order
98 class SMatDMatSubExpr : public DenseMatrix< SMatDMatSubExpr<MT1,MT2,SO>, SO >
99  , private MatMatSubExpr
100  , private Computation
101 {
102  private:
103  //**Type definitions****************************************************************************
104  typedef typename MT1::ResultType RT1;
105  typedef typename MT2::ResultType RT2;
106  typedef typename MT1::ReturnType RN1;
107  typedef typename MT2::ReturnType RN2;
108  //**********************************************************************************************
109 
110  //**Return type evaluation**********************************************************************
112 
117  enum { returnExpr = !IsTemporary<RN1>::value && !IsTemporary<RN2>::value };
118 
121  //**********************************************************************************************
122 
123  //**Parallel evaluation strategy****************************************************************
125 
130  template< typename MT >
131  struct UseSMPAssign {
132  enum { value = ( !MT1::smpAssignable || !MT2::smpAssignable ) };
133  };
135  //**********************************************************************************************
136 
137  public:
138  //**Type definitions****************************************************************************
144 
147 
149  typedef const ResultType CompositeType;
150 
152  typedef typename SelectType< IsExpression<MT1>::value, const MT1, const MT1& >::Type LeftOperand;
153 
155  typedef typename SelectType< IsExpression<MT2>::value, const MT2, const MT2& >::Type RightOperand;
156  //**********************************************************************************************
157 
158  //**Compilation flags***************************************************************************
160  enum { vectorizable = 0 };
161 
163  enum { smpAssignable = 0 };
164  //**********************************************************************************************
165 
166  //**Constructor*********************************************************************************
172  explicit inline SMatDMatSubExpr( const MT1& lhs, const MT2& rhs )
173  : lhs_( lhs ) // Left-hand side sparse matrix of the subtraction expression
174  , rhs_( rhs ) // Right-hand side dense matrix of the subtraction expression
175  {
176  BLAZE_INTERNAL_ASSERT( lhs.rows() == rhs.rows() , "Invalid number of rows" );
177  BLAZE_INTERNAL_ASSERT( lhs.columns() == rhs.columns(), "Invalid number of columns" );
178  }
179  //**********************************************************************************************
180 
181  //**Access operator*****************************************************************************
188  inline ReturnType operator()( size_t i, size_t j ) const {
189  BLAZE_INTERNAL_ASSERT( i < lhs_.rows() , "Invalid row access index" );
190  BLAZE_INTERNAL_ASSERT( j < lhs_.columns(), "Invalid column access index" );
191  return lhs_(i,j) - rhs_(i,j);
192  }
193  //**********************************************************************************************
194 
195  //**Rows function*******************************************************************************
200  inline size_t rows() const {
201  return lhs_.rows();
202  }
203  //**********************************************************************************************
204 
205  //**Columns function****************************************************************************
210  inline size_t columns() const {
211  return lhs_.columns();
212  }
213  //**********************************************************************************************
214 
215  //**Left operand access*************************************************************************
220  inline LeftOperand leftOperand() const {
221  return lhs_;
222  }
223  //**********************************************************************************************
224 
225  //**Right operand access************************************************************************
230  inline RightOperand rightOperand() const {
231  return rhs_;
232  }
233  //**********************************************************************************************
234 
235  //**********************************************************************************************
241  template< typename T >
242  inline bool canAlias( const T* alias ) const {
243  return ( lhs_.canAlias( alias ) ) ||
244  ( IsExpression<MT2>::value && rhs_.canAlias( alias ) );
245  }
246  //**********************************************************************************************
247 
248  //**********************************************************************************************
254  template< typename T >
255  inline bool isAliased( const T* alias ) const {
256  return lhs_.isAliased( alias ) || rhs_.isAliased( alias );
257  }
258  //**********************************************************************************************
259 
260  private:
261  //**Member variables****************************************************************************
264  //**********************************************************************************************
265 
266  //**Assignment to dense matrices****************************************************************
278  template< typename MT // Type of the target dense matrix
279  , bool SO2 > // Storage order of the target dense matrix
280  friend inline void assign( DenseMatrix<MT,SO2>& lhs, const SMatDMatSubExpr& rhs )
281  {
283 
284  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
285  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
286 
287  assign ( ~lhs, -rhs.rhs_ );
288  addAssign( ~lhs, rhs.lhs_ );
289  }
291  //**********************************************************************************************
292 
293  //**Assignment to sparse matrices***************************************************************
305  template< typename MT // Type of the target sparse matrix
306  , bool SO2 > // Storage order of the target sparse matrix
307  friend inline void assign( SparseMatrix<MT,SO2>& lhs, const SMatDMatSubExpr& rhs )
308  {
310 
312 
319 
320  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
321  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
322 
323  const TmpType tmp( serial( rhs ) );
324  assign( ~lhs, tmp );
325  }
327  //**********************************************************************************************
328 
329  //**Addition assignment to dense matrices*******************************************************
341  template< typename MT // Type of the target dense matrix
342  , bool SO2 > // Storage order of the target dense matrix
343  friend inline void addAssign( DenseMatrix<MT,SO2>& lhs, const SMatDMatSubExpr& rhs )
344  {
346 
347  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
348  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
349 
350  subAssign( ~lhs, rhs.rhs_ );
351  addAssign( ~lhs, rhs.lhs_ );
352  }
354  //**********************************************************************************************
355 
356  //**Addition assignment to sparse matrices******************************************************
357  // No special implementation for the addition assignment to sparse matrices.
358  //**********************************************************************************************
359 
360  //**Subtraction assignment to dense matrices****************************************************
372  template< typename MT // Type of the target dense matrix
373  , bool SO2 > // Storage order of the target dense matrix
374  friend inline void subAssign( DenseMatrix<MT,SO2>& lhs, const SMatDMatSubExpr& rhs )
375  {
377 
378  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
379  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
380 
381  addAssign( ~lhs, rhs.rhs_ );
382  subAssign( ~lhs, rhs.lhs_ );
383  }
385  //**********************************************************************************************
386 
387  //**Subtraction assignment to sparse matrices***************************************************
388  // No special implementation for the subtraction assignment to sparse matrices.
389  //**********************************************************************************************
390 
391  //**Multiplication assignment to dense matrices*************************************************
392  // No special implementation for the multiplication assignment to dense matrices.
393  //**********************************************************************************************
394 
395  //**Multiplication assignment to sparse matrices************************************************
396  // No special implementation for the multiplication assignment to sparse matrices.
397  //**********************************************************************************************
398 
399  //**SMP assignment to dense matrices*************************************************************
413  template< typename MT // Type of the target dense matrix
414  , bool SO2 > // Storage order of the target dense matrix
415  friend inline typename EnableIf< UseSMPAssign<MT> >::Type
416  smpAssign( DenseMatrix<MT,SO2>& lhs, const SMatDMatSubExpr& rhs )
417  {
419 
420  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
421  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
422 
423  smpAssign ( ~lhs, -rhs.rhs_ );
424  smpAddAssign( ~lhs, rhs.lhs_ );
425  }
427  //**********************************************************************************************
428 
429  //**SMP assignment to sparse matrices***********************************************************
443  template< typename MT // Type of the target sparse matrix
444  , bool SO2 > // Storage order of the target sparse matrix
445  friend inline typename EnableIf< UseSMPAssign<MT> >::Type
446  smpAssign( SparseMatrix<MT,SO2>& lhs, const SMatDMatSubExpr& rhs )
447  {
449 
450  typedef typename SelectType< SO == SO2, ResultType, OppositeType >::Type TmpType;
451 
458 
459  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
460  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
461 
462  const TmpType tmp( rhs );
463  smpAssign( ~lhs, tmp );
464  }
466  //**********************************************************************************************
467 
468  //**SMP addition assignment to dense matrices***************************************************
482  template< typename MT // Type of the target dense matrix
483  , bool SO2 > // Storage order of the target dense matrix
484  friend inline typename EnableIf< UseSMPAssign<MT> >::Type
485  smpAddAssign( DenseMatrix<MT,SO2>& lhs, const SMatDMatSubExpr& rhs )
486  {
488 
489  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
490  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
491 
492  smpSubAssign( ~lhs, rhs.rhs_ );
493  smpAddAssign( ~lhs, rhs.lhs_ );
494  }
496  //**********************************************************************************************
497 
498  //**SMP addition assignment to sparse matrices**************************************************
499  // No special implementation for the SMP addition assignment to sparse matrices.
500  //**********************************************************************************************
501 
502  //**SMP subtraction assignment to dense matrices************************************************
516  template< typename MT // Type of the target dense matrix
517  , bool SO2 > // Storage order of the target dense matrix
518  friend inline typename EnableIf< UseSMPAssign<MT> >::Type
519  smpSubAssign( DenseMatrix<MT,SO2>& lhs, const SMatDMatSubExpr& rhs )
520  {
522 
523  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
524  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
525 
526  smpAddAssign( ~lhs, rhs.rhs_ );
527  smpSubAssign( ~lhs, rhs.lhs_ );
528  }
530  //**********************************************************************************************
531 
532  //**SMP subtraction assignment to sparse matrices***********************************************
533  // No special implementation for the SMP subtraction assignment to sparse matrices.
534  //**********************************************************************************************
535 
536  //**SMP multiplication assignment to dense matrices*********************************************
537  // No special implementation for the SMP multiplication assignment to dense matrices.
538  //**********************************************************************************************
539 
540  //**SMP multiplication assignment to sparse matrices********************************************
541  // No special implementation for the SMP multiplication assignment to sparse matrices.
542  //**********************************************************************************************
543 
544  //**Compile time checks*************************************************************************
551  //**********************************************************************************************
552 };
553 //*************************************************************************************************
554 
555 
556 
557 
558 //=================================================================================================
559 //
560 // GLOBAL BINARY ARITHMETIC OPERATORS
561 //
562 //=================================================================================================
563 
564 //*************************************************************************************************
593 template< typename T1 // Type of the left-hand side sparse matrix
594  , typename T2 // Type of the right-hand side dense matrix
595  , bool SO > // Storage order
596 inline const SMatDMatSubExpr<T1,T2,SO>
598 {
600 
601  if( (~lhs).rows() != (~rhs).rows() || (~lhs).columns() != (~rhs).columns() )
602  throw std::invalid_argument( "Matrix sizes do not match" );
603 
604  return SMatDMatSubExpr<T1,T2,SO>( ~lhs, ~rhs );
605 }
606 //*************************************************************************************************
607 
608 
609 
610 
611 //=================================================================================================
612 //
613 // GLOBAL RESTRUCTURING BINARY ARITHMETIC OPERATORS
614 //
615 //=================================================================================================
616 
617 //*************************************************************************************************
630 template< typename T1 // Type of the sparse matrix of the left-hand side expression
631  , typename T2 // Type of the dense matrix of the left-hand side expression
632  , bool SO1 // Storage order of the left-hand side expression
633  , typename T3 // Type of the right-hand side dense matrix
634  , bool SO2 > // Storage order of the right-hand side dense matrix
635 inline const typename AddExprTrait< SMatDMatSubExpr<T1,T2,SO1>, T3 >::Type
636  operator+( const SMatDMatSubExpr<T1,T2,SO1>& lhs, const DenseMatrix<T3,SO2>& rhs )
637 {
639 
640  return ( (~rhs) - lhs.rightOperand() ) + lhs.leftOperand();
641 }
643 //*************************************************************************************************
644 
645 
646 //*************************************************************************************************
659 template< typename T1 // Type of the sparse matrix of the left-hand side expression
660  , typename T2 // Type of the dense matrix of the left-hand side expression
661  , bool SO1 // Storage order of the left-hand side expression
662  , typename T3 // Type of the right-hand side dense matrix
663  , bool SO2 > // Storage order of the right-hand side dense matrix
664 inline const typename SubExprTrait< SMatDMatSubExpr<T1,T2,SO1>, T3 >::Type
665  operator-( const SMatDMatSubExpr<T1,T2,SO1>& lhs, const DenseMatrix<T3,SO2>& rhs )
666 {
668 
669  return lhs.leftOperand() - ( lhs.rightOperand() + (~rhs) );
670 }
672 //*************************************************************************************************
673 
674 
675 
676 
677 //=================================================================================================
678 //
679 // ROWS SPECIALIZATIONS
680 //
681 //=================================================================================================
682 
683 //*************************************************************************************************
685 template< typename MT1, typename MT2, bool SO >
686 struct Rows< SMatDMatSubExpr<MT1,MT2,SO> >
687  : public Max< Rows<MT1>, Rows<MT2> >::Type
688 {};
690 //*************************************************************************************************
691 
692 
693 
694 
695 //=================================================================================================
696 //
697 // COLUMNS SPECIALIZATIONS
698 //
699 //=================================================================================================
700 
701 //*************************************************************************************************
703 template< typename MT1, typename MT2, bool SO >
704 struct Columns< SMatDMatSubExpr<MT1,MT2,SO> >
705  : public Max< Columns<MT1>, Columns<MT2> >::Type
706 {};
708 //*************************************************************************************************
709 
710 
711 
712 
713 //=================================================================================================
714 //
715 // ISSYMMETRIC SPECIALIZATIONS
716 //
717 //=================================================================================================
718 
719 //*************************************************************************************************
721 template< typename MT1, typename MT2, bool SO >
722 struct IsSymmetric< SMatDMatSubExpr<MT1,MT2,SO> >
723  : public IsTrue< IsSymmetric<MT1>::value && IsSymmetric<MT2>::value >
724 {};
726 //*************************************************************************************************
727 
728 
729 
730 
731 //=================================================================================================
732 //
733 // ISLOWER SPECIALIZATIONS
734 //
735 //=================================================================================================
736 
737 //*************************************************************************************************
739 template< typename MT1, typename MT2, bool SO >
740 struct IsLower< SMatDMatSubExpr<MT1,MT2,SO> >
741  : public IsTrue< IsLower<MT1>::value && IsLower<MT2>::value >
742 {};
744 //*************************************************************************************************
745 
746 
747 
748 
749 //=================================================================================================
750 //
751 // ISUPPER SPECIALIZATIONS
752 //
753 //=================================================================================================
754 
755 //*************************************************************************************************
757 template< typename MT1, typename MT2, bool SO >
758 struct IsUpper< SMatDMatSubExpr<MT1,MT2,SO> >
759  : public IsTrue< IsUpper<MT1>::value && IsUpper<MT2>::value >
760 {};
762 //*************************************************************************************************
763 
764 
765 
766 
767 //=================================================================================================
768 //
769 // EXPRESSION TRAIT SPECIALIZATIONS
770 //
771 //=================================================================================================
772 
773 //*************************************************************************************************
775 template< typename MT1, typename MT2, typename MT3 >
776 struct DMatDMatAddExprTrait< SMatDMatSubExpr<MT1,MT2,false>, MT3 >
777 {
778  public:
779  //**********************************************************************************************
781  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
782  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
783  IsDenseMatrix<MT3>::value && IsRowMajorMatrix<MT3>::value
784  , typename DMatSMatAddExprTrait< typename DMatDMatSubExprTrait<MT3,MT2>::Type, MT1 >::Type
785  , INVALID_TYPE >::Type Type;
787  //**********************************************************************************************
788 };
790 //*************************************************************************************************
791 
792 
793 //*************************************************************************************************
795 template< typename MT1, typename MT2, typename MT3 >
796 struct DMatTDMatAddExprTrait< SMatDMatSubExpr<MT1,MT2,false>, MT3 >
797 {
798  public:
799  //**********************************************************************************************
801  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
802  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
803  IsDenseMatrix<MT3>::value && IsColumnMajorMatrix<MT3>::value
804  , typename DMatSMatAddExprTrait< typename TDMatDMatSubExprTrait<MT3,MT2>::Type, MT1 >::Type
805  , INVALID_TYPE >::Type Type;
807  //**********************************************************************************************
808 };
810 //*************************************************************************************************
811 
812 
813 //*************************************************************************************************
815 template< typename MT1, typename MT2, typename MT3 >
816 struct TDMatDMatAddExprTrait< SMatDMatSubExpr<MT1,MT2,true>, MT3 >
817 {
818  public:
819  //**********************************************************************************************
821  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
822  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
823  IsDenseMatrix<MT3>::value && IsRowMajorMatrix<MT3>::value
824  , typename DMatTSMatAddExprTrait< typename DMatTDMatSubExprTrait<MT3,MT2>::Type, MT1 >::Type
825  , INVALID_TYPE >::Type Type;
827  //**********************************************************************************************
828 };
830 //*************************************************************************************************
831 
832 
833 //*************************************************************************************************
835 template< typename MT1, typename MT2, typename MT3 >
836 struct TDMatTDMatAddExprTrait< SMatDMatSubExpr<MT1,MT2,true>, MT3 >
837 {
838  public:
839  //**********************************************************************************************
841  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
842  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
843  IsDenseMatrix<MT3>::value && IsColumnMajorMatrix<MT3>::value
844  , typename TDMatTSMatAddExprTrait< typename TDMatTDMatSubExprTrait<MT3,MT2>::Type, MT1 >::Type
845  , INVALID_TYPE >::Type Type;
847  //**********************************************************************************************
848 };
850 //*************************************************************************************************
851 
852 
853 //*************************************************************************************************
855 template< typename MT1, typename MT2, typename MT3 >
856 struct DMatDMatSubExprTrait< SMatDMatSubExpr<MT1,MT2,false>, MT3 >
857 {
858  public:
859  //**********************************************************************************************
861  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
862  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
863  IsDenseMatrix<MT3>::value && IsRowMajorMatrix<MT3>::value
864  , typename SMatDMatSubExprTrait< MT1, typename DMatDMatAddExprTrait<MT2,MT3>::Type >::Type
865  , INVALID_TYPE >::Type Type;
867  //**********************************************************************************************
868 };
870 //*************************************************************************************************
871 
872 
873 //*************************************************************************************************
875 template< typename MT1, typename MT2, typename MT3 >
876 struct DMatTDMatSubExprTrait< SMatDMatSubExpr<MT1,MT2,false>, MT3 >
877 {
878  public:
879  //**********************************************************************************************
881  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
882  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
883  IsDenseMatrix<MT3>::value && IsColumnMajorMatrix<MT3>::value
884  , typename SMatDMatSubExprTrait< MT1, typename DMatTDMatAddExprTrait<MT2,MT3>::Type >::Type
885  , INVALID_TYPE >::Type Type;
887  //**********************************************************************************************
888 };
890 //*************************************************************************************************
891 
892 
893 //*************************************************************************************************
895 template< typename MT1, typename MT2, typename MT3 >
896 struct TDMatDMatSubExprTrait< SMatDMatSubExpr<MT1,MT2,true>, MT3 >
897 {
898  public:
899  //**********************************************************************************************
901  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
902  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
903  IsDenseMatrix<MT3>::value && IsRowMajorMatrix<MT3>::value
904  , typename TSMatDMatSubExprTrait< MT1, typename TDMatDMatAddExprTrait<MT2,MT3>::Type >::Type
905  , INVALID_TYPE >::Type Type;
907  //**********************************************************************************************
908 };
910 //*************************************************************************************************
911 
912 
913 //*************************************************************************************************
915 template< typename MT1, typename MT2, typename MT3 >
916 struct TDMatTDMatSubExprTrait< SMatDMatSubExpr<MT1,MT2,true>, MT3 >
917 {
918  public:
919  //**********************************************************************************************
921  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
922  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
923  IsDenseMatrix<MT3>::value && IsColumnMajorMatrix<MT3>::value
924  , typename TSMatTDMatSubExprTrait< MT1, typename TDMatTDMatAddExprTrait<MT2,MT3>::Type >::Type
925  , INVALID_TYPE >::Type Type;
927  //**********************************************************************************************
928 };
930 //*************************************************************************************************
931 
932 
933 //*************************************************************************************************
935 template< typename MT1, typename MT2, bool SO, bool AF >
936 struct SubmatrixExprTrait< SMatDMatSubExpr<MT1,MT2,SO>, AF >
937 {
938  public:
939  //**********************************************************************************************
940  typedef typename SubExprTrait< typename SubmatrixExprTrait<const MT1,AF>::Type
941  , typename SubmatrixExprTrait<const MT2,AF>::Type >::Type Type;
942  //**********************************************************************************************
943 };
945 //*************************************************************************************************
946 
947 
948 //*************************************************************************************************
950 template< typename MT1, typename MT2, bool SO >
951 struct RowExprTrait< SMatDMatSubExpr<MT1,MT2,SO> >
952 {
953  public:
954  //**********************************************************************************************
955  typedef typename SubExprTrait< typename RowExprTrait<const MT1>::Type
956  , typename RowExprTrait<const MT2>::Type >::Type Type;
957  //**********************************************************************************************
958 };
960 //*************************************************************************************************
961 
962 
963 //*************************************************************************************************
965 template< typename MT1, typename MT2, bool SO >
966 struct ColumnExprTrait< SMatDMatSubExpr<MT1,MT2,SO> >
967 {
968  public:
969  //**********************************************************************************************
970  typedef typename SubExprTrait< typename ColumnExprTrait<const MT1>::Type
971  , typename ColumnExprTrait<const MT2>::Type >::Type Type;
972  //**********************************************************************************************
973 };
975 //*************************************************************************************************
976 
977 } // namespace blaze
978 
979 #endif
Constraint on the data type.
Header file for the Max class template.
MT1::ReturnType RN1
Return type of the left-hand side sparse matrix expression.
Definition: SMatDMatSubExpr.h:106
Compile time check whether the given type is a temporary vector or matrix type.This type trait class ...
Definition: IsTemporary.h:87
Header file for the Rows type trait.
Header file for the subtraction trait.
LeftOperand leftOperand() const
Returns the left-hand side sparse matrix operand.
Definition: SMatDMatSubExpr.h:220
Header file for the IsSparseMatrix type trait.
RightOperand rightOperand() const
Returns the right-hand side dense matrix operand.
Definition: SMatDMatSubExpr.h:230
#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
Efficient implementation of a compressed matrix.The CompressedMatrix class template is the represent...
Definition: CompressedMatrix.h:205
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: SMatDMatSubExpr.h:188
#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
bool isAliased(const T *alias) const
Returns whether the expression is aliased with the given address alias.
Definition: SMatDMatSubExpr.h:255
SubExprTrait< RN1, RN2 >::Type ExprReturnType
Expression return type for the subscript operator.
Definition: SMatDMatSubExpr.h:120
Header file for the ColumnExprTrait class template.
Header file for the IsColumnMajorMatrix type trait.
const This & CompositeType
Data type for composite expression templates.
Definition: CompressedMatrix.h:2478
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:257
Header file for the AddExprTrait class template.
SMatDMatSubExpr(const MT1 &lhs, const MT2 &rhs)
Constructor for the SMatDMatSubExpr class.
Definition: SMatDMatSubExpr.h:172
const DMatSerialExpr< MT, SO > serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:695
Header file for the Computation base class.
MT2::ReturnType RN2
Return type of the right-hand side dense matrix expression.
Definition: SMatDMatSubExpr.h:107
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:107
Constraint on the data type.
SubTrait< RT1, RT2 >::Type ResultType
Result type for expression template evaluations.
Definition: SMatDMatSubExpr.h:140
Constraint on the data type.
Constraint on the data type.
SelectType< IsExpression< MT1 >::value, const MT1, const MT1 & >::Type LeftOperand
Composite type of the left-hand side dense matrix expression.
Definition: SMatDMatSubExpr.h:152
Expression object for sparse matrix-dense matrix subtractions.The SMatDMatSubExpr class represents th...
Definition: Forward.h:90
const ResultType CompositeType
Data type for composite expression templates.
Definition: SMatDMatSubExpr.h:149
Compile time type selection.The SelectType class template selects one of the two given types T1 and T...
Definition: SelectType.h:59
Header file for the IsTemporary type trait class.
Header file for the IsSymmetric type trait.
SelectType< IsExpression< MT2 >::value, const MT2, const MT2 & >::Type RightOperand
Composite type of the right-hand side sparse matrix expression.
Definition: SMatDMatSubExpr.h:155
const SelectType< returnExpr, ExprReturnType, ElementType >::Type ReturnType
Return type for expression template evaluations.
Definition: SMatDMatSubExpr.h:146
Header file for the DenseMatrix base class.
BLAZE_ALWAYS_INLINE 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:635
Header file for the Columns type trait.
ResultType::ElementType ElementType
Resulting element type.
Definition: SMatDMatSubExpr.h:143
Header file for the MatMatSubExpr base class.
const DenseIterator< Type > operator+(const DenseIterator< Type > &it, ptrdiff_t inc)
Addition between a DenseIterator and an integral value.
Definition: DenseIterator.h:556
size_t columns() const
Returns the current number of columns of the matrix.
Definition: SMatDMatSubExpr.h:210
Header file for the IsLower type trait.
RightOperand rhs_
Right-hand side dense matrix of the subtraction expression.
Definition: SMatDMatSubExpr.h:263
#define BLAZE_CONSTRAINT_MUST_BE_REFERENCE_TYPE(T)
Constraint on the data type.In case the given data type T is not a reference type, a compilation error is created.
Definition: Reference.h:78
Constraints on the storage order of matrix types.
Evaluation of the return type of a subtraction expression.Via this type trait it is possible to evalu...
Definition: SubExprTrait.h:104
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.
Header file for the serial shim.
ResultType::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: SMatDMatSubExpr.h:142
SMatDMatSubExpr< MT1, MT2, SO > This
Type of this SMatDMatSubExpr instance.
Definition: SMatDMatSubExpr.h:139
EnableIf< IsDenseMatrix< MT1 > >::Type smpSubAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP subtraction assignment of a matrix to dense matrix.
Definition: DenseMatrix.h:160
Header file for the SubmatrixExprTrait class template.
const Type & ReturnType
Return type for expression template evaluations.
Definition: CompressedMatrix.h:2477
MT1::ResultType RT1
Result type of the left-hand side sparse matrix expression.
Definition: SMatDMatSubExpr.h:104
Header file for run time assertion macros.
EnableIf< IsDenseMatrix< MT1 > >::Type smpAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:98
BLAZE_ALWAYS_INLINE 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:742
const DenseIterator< Type > operator-(const DenseIterator< Type > &it, ptrdiff_t inc)
Subtraction between a DenseIterator and an integral value.
Definition: DenseIterator.h:585
size_t rows() const
Returns the current number of rows of the matrix.
Definition: SMatDMatSubExpr.h:200
LeftOperand lhs_
Left-hand side sparse matrix of the subtraction expression.
Definition: SMatDMatSubExpr.h:262
#define BLAZE_CONSTRAINT_MATRICES_MUST_HAVE_SAME_STORAGE_ORDER(T1, T2)
Constraint on the data type.In case either of the two given data types T1 or T2 is not a matrix type ...
Definition: StorageOrder.h:283
Header file for the IsRowMajorMatrix type trait.
MT2::ResultType RT2
Result type of the right-hand side dense matrix expression.
Definition: SMatDMatSubExpr.h:105
EnableIf< IsDenseMatrix< MT1 > >::Type smpAddAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP addition assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:129
#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
This ResultType
Result type for expression template evaluations.
Definition: CompressedMatrix.h:2473
Header file for the IsTrue value trait.
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: SMatDMatSubExpr.h:242
Header file for basic type definitions.
#define BLAZE_CONSTRAINT_MUST_FORM_VALID_MATMATSUBEXPR(T1, T2)
Constraint on the data type.In case the given data types T1 and T2 do not form a valid matrix/matrix ...
Definition: MatMatSubExpr.h:165
Base template for the SubTrait class.
Definition: SubTrait.h:142
Header file for the IsUpper type trait.
ResultType::OppositeType OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: SMatDMatSubExpr.h:141
Header file for the SubExprTrait class template.
#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
#define BLAZE_CONSTRAINT_MUST_BE_SPARSE_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is not a sparse, N-dimensional matrix type...
Definition: SparseMatrix.h:79
Compile time check whether the given type is an expression template.This type trait class tests wheth...
Definition: IsExpression.h:87
Header file for the IsExpression type trait class.
Header file for the FunctionTrace class.
BLAZE_ALWAYS_INLINE 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:849