All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DMatScalarMultExpr.h
Go to the documentation of this file.
1 //=================================================================================================
33 //=================================================================================================
34 
35 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATSCALARMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_DMATSCALARMULTEXPR_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
43 #include <iterator>
51 #include <blaze/math/Intrinsics.h>
77 #include <blaze/util/Assert.h>
81 #include <blaze/util/EnableIf.h>
82 #include <blaze/util/InvalidType.h>
84 #include <blaze/util/SelectType.h>
85 #include <blaze/util/Types.h>
90 
91 
92 namespace blaze {
93 
94 //=================================================================================================
95 //
96 // CLASS DMATSCALARMULTEXPR
97 //
98 //=================================================================================================
99 
100 //*************************************************************************************************
107 template< typename MT // Type of the left-hand side dense matrix
108  , typename ST // Type of the right-hand side scalar value
109  , bool SO > // Storage order
110 class DMatScalarMultExpr : public DenseMatrix< DMatScalarMultExpr<MT,ST,SO>, SO >
111  , private MatScalarMultExpr
112  , private Computation
113 {
114  private:
115  //**Type definitions****************************************************************************
116  typedef typename MT::ResultType RT;
117  typedef typename MT::ReturnType RN;
118  typedef typename MT::ElementType ET;
119  typedef typename MT::CompositeType CT;
120  //**********************************************************************************************
121 
122  //**Return type evaluation**********************************************************************
124 
129  enum { returnExpr = !IsTemporary<RN>::value };
130 
133  //**********************************************************************************************
134 
135  //**Serial evaluation strategy******************************************************************
137 
144 
146  template< typename MT2 >
148  struct UseAssign {
149  enum { value = useAssign };
150  };
152  //**********************************************************************************************
153 
154  //**Parallel evaluation strategy****************************************************************
156 
162  template< typename MT2 >
163  struct UseSMPAssign {
164  enum { value = ( !MT2::smpAssignable || !MT::smpAssignable ) && useAssign };
165  };
167  //**********************************************************************************************
168 
169  public:
170  //**Type definitions****************************************************************************
177 
180 
183 
185  typedef typename SelectType< IsExpression<MT>::value, const MT, const MT& >::Type LeftOperand;
186 
188  typedef ST RightOperand;
189  //**********************************************************************************************
190 
191  //**ConstIterator class definition**************************************************************
195  {
196  public:
197  //**Type definitions*************************************************************************
198  typedef std::random_access_iterator_tag IteratorCategory;
203 
204  // STL iterator requirements
210 
212  typedef typename MT::ConstIterator IteratorType;
213  //*******************************************************************************************
214 
215  //**Constructor******************************************************************************
221  explicit inline ConstIterator( IteratorType iterator, RightOperand scalar )
222  : iterator_( iterator ) // Iterator to the current element
223  , scalar_ ( scalar ) // Scalar of the multiplication expression
224  {}
225  //*******************************************************************************************
226 
227  //**Addition assignment operator*************************************************************
233  inline ConstIterator& operator+=( size_t inc ) {
234  iterator_ += inc;
235  return *this;
236  }
237  //*******************************************************************************************
238 
239  //**Subtraction assignment operator**********************************************************
245  inline ConstIterator& operator-=( size_t dec ) {
246  iterator_ -= dec;
247  return *this;
248  }
249  //*******************************************************************************************
250 
251  //**Prefix increment operator****************************************************************
257  ++iterator_;
258  return *this;
259  }
260  //*******************************************************************************************
261 
262  //**Postfix increment operator***************************************************************
267  inline const ConstIterator operator++( int ) {
268  return ConstIterator( iterator_++ );
269  }
270  //*******************************************************************************************
271 
272  //**Prefix decrement operator****************************************************************
278  --iterator_;
279  return *this;
280  }
281  //*******************************************************************************************
282 
283  //**Postfix decrement operator***************************************************************
288  inline const ConstIterator operator--( int ) {
289  return ConstIterator( iterator_-- );
290  }
291  //*******************************************************************************************
292 
293  //**Element access operator******************************************************************
298  inline ReturnType operator*() const {
299  return *iterator_ * scalar_;
300  }
301  //*******************************************************************************************
302 
303  //**Load function****************************************************************************
308  inline IntrinsicType load() const {
309  return iterator_.load() * set( scalar_ );
310  }
311  //*******************************************************************************************
312 
313  //**Equality operator************************************************************************
319  inline bool operator==( const ConstIterator& rhs ) const {
320  return iterator_ == rhs.iterator_;
321  }
322  //*******************************************************************************************
323 
324  //**Inequality operator**********************************************************************
330  inline bool operator!=( const ConstIterator& rhs ) const {
331  return iterator_ != rhs.iterator_;
332  }
333  //*******************************************************************************************
334 
335  //**Less-than operator***********************************************************************
341  inline bool operator<( const ConstIterator& rhs ) const {
342  return iterator_ < rhs.iterator_;
343  }
344  //*******************************************************************************************
345 
346  //**Greater-than operator********************************************************************
352  inline bool operator>( const ConstIterator& rhs ) const {
353  return iterator_ > rhs.iterator_;
354  }
355  //*******************************************************************************************
356 
357  //**Less-or-equal-than operator**************************************************************
363  inline bool operator<=( const ConstIterator& rhs ) const {
364  return iterator_ <= rhs.iterator_;
365  }
366  //*******************************************************************************************
367 
368  //**Greater-or-equal-than operator***********************************************************
374  inline bool operator>=( const ConstIterator& rhs ) const {
375  return iterator_ >= rhs.iterator_;
376  }
377  //*******************************************************************************************
378 
379  //**Subtraction operator*********************************************************************
385  inline DifferenceType operator-( const ConstIterator& rhs ) const {
386  return iterator_ - rhs.iterator_;
387  }
388  //*******************************************************************************************
389 
390  //**Addition operator************************************************************************
397  friend inline const ConstIterator operator+( const ConstIterator& it, size_t inc ) {
398  return ConstIterator( it.iterator_ + inc );
399  }
400  //*******************************************************************************************
401 
402  //**Addition operator************************************************************************
409  friend inline const ConstIterator operator+( size_t inc, const ConstIterator& it ) {
410  return ConstIterator( it.iterator_ + inc );
411  }
412  //*******************************************************************************************
413 
414  //**Subtraction operator*********************************************************************
421  friend inline const ConstIterator operator-( const ConstIterator& it, size_t dec ) {
422  return ConstIterator( it.iterator_ - dec );
423  }
424  //*******************************************************************************************
425 
426  private:
427  //**Member variables*************************************************************************
430  //*******************************************************************************************
431  };
432  //**********************************************************************************************
433 
434  //**Compilation flags***************************************************************************
436  enum { vectorizable = MT::vectorizable &&
439 
441  enum { smpAssignable = MT::smpAssignable };
442  //**********************************************************************************************
443 
444  //**Constructor*********************************************************************************
450  explicit inline DMatScalarMultExpr( const MT& matrix, ST scalar )
451  : matrix_( matrix ) // Left-hand side dense matrix of the multiplication expression
452  , scalar_( scalar ) // Right-hand side scalar of the multiplication expression
453  {}
454  //**********************************************************************************************
455 
456  //**Access operator*****************************************************************************
463  inline ReturnType operator()( size_t i, size_t j ) const {
464  BLAZE_INTERNAL_ASSERT( i < matrix_.rows() , "Invalid row access index" );
465  BLAZE_INTERNAL_ASSERT( j < matrix_.columns(), "Invalid column access index" );
466  return matrix_(i,j) * scalar_;
467  }
468  //**********************************************************************************************
469 
470  //**Load function*******************************************************************************
477  inline IntrinsicType load( size_t i, size_t j ) const {
478  typedef IntrinsicTrait<ElementType> IT;
479  BLAZE_INTERNAL_ASSERT( i < matrix_.rows() , "Invalid row access index" );
480  BLAZE_INTERNAL_ASSERT( j < matrix_.columns(), "Invalid column access index" );
481  BLAZE_INTERNAL_ASSERT( !SO || ( i % IT::size == 0UL ), "Invalid row access index" );
482  BLAZE_INTERNAL_ASSERT( SO || ( j % IT::size == 0UL ), "Invalid column access index" );
483  const IntrinsicType xmm1( matrix_.load(i,j) );
484  const IntrinsicType xmm2( set( scalar_ ) );
485  return xmm1 * xmm2;
486  }
487  //**********************************************************************************************
488 
489  //**Begin function******************************************************************************
495  inline ConstIterator begin( size_t i ) const {
496  return ConstIterator( matrix_.begin(i), scalar_ );
497  }
498  //**********************************************************************************************
499 
500  //**End function********************************************************************************
506  inline ConstIterator end( size_t i ) const {
507  return ConstIterator( matrix_.end(i), scalar_ );
508  }
509  //**********************************************************************************************
510 
511  //**Rows function*******************************************************************************
516  inline size_t rows() const {
517  return matrix_.rows();
518  }
519  //**********************************************************************************************
520 
521  //**Columns function****************************************************************************
526  inline size_t columns() const {
527  return matrix_.columns();
528  }
529  //**********************************************************************************************
530 
531  //**Left operand access*************************************************************************
536  inline LeftOperand leftOperand() const {
537  return matrix_;
538  }
539  //**********************************************************************************************
540 
541  //**Right operand access************************************************************************
546  inline RightOperand rightOperand() const {
547  return scalar_;
548  }
549  //**********************************************************************************************
550 
551  //**********************************************************************************************
557  template< typename T >
558  inline bool canAlias( const T* alias ) const {
559  return IsComputation<MT>::value && matrix_.canAlias( alias );
560  }
561  //**********************************************************************************************
562 
563  //**********************************************************************************************
569  template< typename T >
570  inline bool isAliased( const T* alias ) const {
571  return matrix_.isAliased( alias );
572  }
573  //**********************************************************************************************
574 
575  //**********************************************************************************************
580  inline bool isAligned() const {
581  return matrix_.isAligned();
582  }
583  //**********************************************************************************************
584 
585  //**********************************************************************************************
590  inline bool canSMPAssign() const {
591  return matrix_.canSMPAssign() ||
592  ( ( ( SO == rowMajor ) ? rows() : columns() ) > SMP_DMATSCALARMULT_THRESHOLD );
593  }
594  //**********************************************************************************************
595 
596  private:
597  //**Member variables****************************************************************************
600  //**********************************************************************************************
601 
602  //**Assignment to dense matrices****************************************************************
616  template< typename MT2 // Type of the target dense matrix
617  , bool SO2 > // Storage order of the target dense matrix
618  friend inline typename EnableIf< UseAssign<MT2> >::Type
620  {
622 
623  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
624  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
625 
626  assign( ~lhs, rhs.matrix_ );
627  assign( ~lhs, (~lhs) * rhs.scalar_ );
628  }
630  //**********************************************************************************************
631 
632  //**Assignment to sparse matrices***************************************************************
646  template< typename MT2 // Type of the target sparse matrix
647  , bool SO2 > // Storage order of the target sparse matrix
648  friend inline typename EnableIf< UseAssign<MT2> >::Type
650  {
652 
653  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
654  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
655 
656  assign( ~lhs, rhs.matrix_ );
657  (~lhs) *= rhs.scalar_;
658  }
660  //**********************************************************************************************
661 
662  //**Addition assignment to dense matrices*******************************************************
676  template< typename MT2 // Type of the target dense matrix
677  , bool SO2 > // Storage order of the target dense matrix
678  friend inline typename EnableIf< UseAssign<MT2> >::Type
679  addAssign( DenseMatrix<MT2,SO2>& lhs, const DMatScalarMultExpr& rhs )
680  {
682 
686 
687  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
688  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
689 
690  const ResultType tmp( serial( rhs ) );
691  addAssign( ~lhs, tmp );
692  }
694  //**********************************************************************************************
695 
696  //**Addition assignment to sparse matrices******************************************************
697  // No special implementation for the addition assignment to sparse matrices.
698  //**********************************************************************************************
699 
700  //**Subtraction assignment to dense matrices****************************************************
714  template< typename MT2 // Type of the target dense matrix
715  , bool SO2 > // Storage order of the target dense matrix
716  friend inline typename EnableIf< UseAssign<MT2> >::Type
717  subAssign( DenseMatrix<MT2,SO2>& lhs, const DMatScalarMultExpr& rhs )
718  {
720 
724 
725  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
726  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
727 
728  const ResultType tmp( serial( rhs ) );
729  subAssign( ~lhs, tmp );
730  }
732  //**********************************************************************************************
733 
734  //**Subtraction assignment to sparse matrices***************************************************
735  // No special implementation for the subtraction assignment to sparse matrices.
736  //**********************************************************************************************
737 
738  //**Multiplication assignment to dense matrices*************************************************
739  // No special implementation for the multiplication assignment to dense matrices.
740  //**********************************************************************************************
741 
742  //**Multiplication assignment to sparse matrices************************************************
743  // No special implementation for the multiplication assignment to sparse matrices.
744  //**********************************************************************************************
745 
746  //**SMP assignment to dense matrices************************************************************
760  template< typename MT2 // Type of the target dense matrix
761  , bool SO2 > // Storage order of the target dense matrix
762  friend inline typename EnableIf< UseSMPAssign<MT2> >::Type
763  smpAssign( DenseMatrix<MT2,SO2>& lhs, const DMatScalarMultExpr& rhs )
764  {
766 
767  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
768  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
769 
770  smpAssign( ~lhs, rhs.matrix_ );
771  smpAssign( ~lhs, (~lhs) * rhs.scalar_ );
772  }
774  //**********************************************************************************************
775 
776  //**SMP assignment to sparse matrices***********************************************************
790  template< typename MT2 // Type of the target sparse matrix
791  , bool SO2 > // Storage order of the target sparse matrix
792  friend inline typename EnableIf< UseSMPAssign<MT2> >::Type
793  smpAssign( SparseMatrix<MT2,SO2>& lhs, const DMatScalarMultExpr& rhs )
794  {
796 
797  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
798  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
799 
800  smpAssign( ~lhs, rhs.matrix_ );
801  (~lhs) *= rhs.scalar_;
802  }
804  //**********************************************************************************************
805 
806  //**SMP addition assignment to dense matrices***************************************************
820  template< typename MT2 // Type of the target dense matrix
821  , bool SO2 > // Storage order of the target dense matrix
822  friend inline typename EnableIf< UseSMPAssign<MT2> >::Type
823  smpAddAssign( DenseMatrix<MT2,SO2>& lhs, const DMatScalarMultExpr& rhs )
824  {
826 
830 
831  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
832  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
833 
834  const ResultType tmp( rhs );
835  smpAddAssign( ~lhs, tmp );
836  }
838  //**********************************************************************************************
839 
840  //**SMP addition assignment to sparse matrices**************************************************
841  // No special implementation for the SMP addition assignment to sparse matrices.
842  //**********************************************************************************************
843 
844  //**SMP subtraction assignment to dense matrices************************************************
858  template< typename MT2 // Type of the target dense matrix
859  , bool SO2 > // Storage order of the target dense matrix
860  friend inline typename EnableIf< UseSMPAssign<MT2> >::Type
861  smpSubAssign( DenseMatrix<MT2,SO2>& lhs, const DMatScalarMultExpr& rhs )
862  {
864 
868 
869  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
870  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
871 
872  const ResultType tmp( rhs );
873  smpSubAssign( ~lhs, tmp );
874  }
876  //**********************************************************************************************
877 
878  //**SMP subtraction assignment to sparse matrices***********************************************
879  // No special implementation for the SMP subtraction assignment to sparse matrices.
880  //**********************************************************************************************
881 
882  //**SMP multiplication assignment to dense matrices*********************************************
883  // No special implementation for the SMP multiplication assignment to dense matrices.
884  //**********************************************************************************************
885 
886  //**SMP multiplication assignment to sparse matrices********************************************
887  // No special implementation for the SMP multiplication assignment to sparse matrices.
888  //**********************************************************************************************
889 
890  //**Compile time checks*************************************************************************
897  //**********************************************************************************************
898 };
899 //*************************************************************************************************
900 
901 
902 
903 
904 //=================================================================================================
905 //
906 // GLOBAL UNARY ARITHMETIC OPERATORS
907 //
908 //=================================================================================================
909 
910 //*************************************************************************************************
927 template< typename MT // Type of the dense matrix
928  , bool SO > // Storage order
929 inline const DMatScalarMultExpr<MT,typename BaseElementType<MT>::Type,SO>
931 {
933 
934  typedef typename BaseElementType<MT>::Type ElementType;
936 }
937 //*************************************************************************************************
938 
939 
940 
941 
942 //=================================================================================================
943 //
944 // GLOBAL BINARY ARITHMETIC OPERATORS
945 //
946 //=================================================================================================
947 
948 //*************************************************************************************************
969 template< typename T1 // Type of the left-hand side dense matrix
970  , bool SO // Storage order of the left-hand side dense matrix
971  , typename T2 > // Type of the right-hand side scalar
972 inline const typename EnableIf< IsNumeric<T2>, typename MultExprTrait<T1,T2>::Type >::Type
973  operator*( const DenseMatrix<T1,SO>& mat, T2 scalar )
974 {
976 
977  typedef typename MultExprTrait<T1,T2>::Type Type;
978  return Type( ~mat, scalar );
979 }
980 //*************************************************************************************************
981 
982 
983 //*************************************************************************************************
1004 template< typename T1 // Type of the left-hand side scalar
1005  , typename T2 // Type of the right-hand side dense matrix
1006  , bool SO > // Storage order of the right-hand side dense matrix
1007 inline const typename EnableIf< IsNumeric<T1>, typename MultExprTrait<T1,T2>::Type >::Type
1008  operator*( T1 scalar, const DenseMatrix<T2,SO>& mat )
1009 {
1011 
1012  typedef typename MultExprTrait<T1,T2>::Type Type;
1013  return Type( ~mat, scalar );
1014 }
1015 //*************************************************************************************************
1016 
1017 
1018 
1019 
1020 //=================================================================================================
1021 //
1022 // GLOBAL RESTRUCTURING UNARY ARITHMETIC OPERATORS
1023 //
1024 //=================================================================================================
1025 
1026 //*************************************************************************************************
1038 template< typename VT // Type of the dense matrix
1039  , typename ST // Type of the scalar
1040  , bool TF > // Transpose flag
1041 inline const DMatScalarMultExpr<VT,ST,TF>
1042  operator-( const DMatScalarMultExpr<VT,ST,TF>& dm )
1043 {
1045 
1046  return DMatScalarMultExpr<VT,ST,TF>( dm.leftOperand(), -dm.rightOperand() );
1047 }
1049 //*************************************************************************************************
1050 
1051 
1052 
1053 
1054 //=================================================================================================
1055 //
1056 // GLOBAL RESTRUCTURING BINARY ARITHMETIC OPERATORS
1057 //
1058 //=================================================================================================
1059 
1060 //*************************************************************************************************
1073 template< typename MT // Type of the dense matrix of the left-hand side expression
1074  , typename ST1 // Type of the scalar of the left-hand side expression
1075  , bool SO // Storage order of the dense matrix
1076  , typename ST2 > // Type of the right-hand side scalar
1077 inline const typename EnableIf< IsNumeric<ST2>
1078  , typename MultExprTrait< DMatScalarMultExpr<MT,ST1,SO>, ST2 >::Type >::Type
1079  operator*( const DMatScalarMultExpr<MT,ST1,SO>& mat, ST2 scalar )
1080 {
1082 
1083  return mat.leftOperand() * ( mat.rightOperand() * scalar );
1084 }
1086 //*************************************************************************************************
1087 
1088 
1089 //*************************************************************************************************
1102 template< typename ST1 // Type of the left-hand side scalar
1103  , typename MT // Type of the dense matrix of the right-hand side expression
1104  , typename ST2 // Type of the scalar of the right-hand side expression
1105  , bool SO > // Storage order of the dense matrix
1106 inline const typename EnableIf< IsNumeric<ST1>
1107  , typename MultExprTrait< ST1, DMatScalarMultExpr<MT,ST2,SO> >::Type >::Type
1108  operator*( ST1 scalar, const DMatScalarMultExpr<MT,ST2,SO>& mat )
1109 {
1111 
1112  return mat.leftOperand() * ( scalar * mat.rightOperand() );
1113 }
1115 //*************************************************************************************************
1116 
1117 
1118 //*************************************************************************************************
1131 template< typename MT // Type of the dense matrix of the left-hand side expression
1132  , typename ST1 // Type of the scalar of the left-hand side expression
1133  , bool SO // Storage order of the dense matrix
1134  , typename ST2 > // Type of the right-hand side scalar
1135 inline const typename EnableIf< IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>
1136  , typename DivExprTrait< DMatScalarMultExpr<MT,ST1,SO>, ST2 >::Type >::Type
1137  operator/( const DMatScalarMultExpr<MT,ST1,SO>& mat, ST2 scalar )
1138 {
1140 
1141  return mat.leftOperand() * ( mat.rightOperand() / scalar );
1142 }
1144 //*************************************************************************************************
1145 
1146 
1147 //*************************************************************************************************
1161 template< typename MT // Type of the dense matrix of the left-hand side expression
1162  , typename ST // Type of the scalar of the left-hand side expression
1163  , bool SO // Storage order of the left-hand side expression
1164  , typename VT > // Type of the right-hand side dense vector
1165 inline const typename MultExprTrait< DMatScalarMultExpr<MT,ST,SO>, VT >::Type
1166  operator*( const DMatScalarMultExpr<MT,ST,SO>& mat, const DenseVector<VT,false>& vec )
1167 {
1169 
1170  return ( mat.leftOperand() * (~vec) ) * mat.rightOperand();
1171 }
1173 //*************************************************************************************************
1174 
1175 
1176 //*************************************************************************************************
1190 template< typename VT // Type of the left-hand side dense vector
1191  , typename MT // Type of the dense matrix of the right-hand side expression
1192  , typename ST // Type of the scalar of the right-hand side expression
1193  , bool SO > // Storage order of the right-hand side expression
1194 inline const typename MultExprTrait< VT, DMatScalarMultExpr<MT,ST,SO> >::Type
1195  operator*( const DenseVector<VT,true>& vec, const DMatScalarMultExpr<MT,ST,SO>& mat )
1196 {
1198 
1199  return ( (~vec) * mat.leftOperand() ) * mat.rightOperand();
1200 }
1202 //*************************************************************************************************
1203 
1204 
1205 //*************************************************************************************************
1221 template< typename MT // Type of the dense matrix of the left-hand side expression
1222  , typename ST1 // Type of the scalar of the left-hand side expression
1223  , bool SO // Storage order of the left-hand side expression
1224  , typename VT // Type of the dense vector of the right-hand side expression
1225  , typename ST2 > // Type of the scalar of the right-hand side expression
1226 inline const DVecScalarMultExpr<typename MultExprTrait<MT,VT>::Type,typename MultTrait<ST1,ST2>::Type,false>
1227  operator*( const DMatScalarMultExpr<MT,ST1,SO>& mat, const DVecScalarMultExpr<VT,ST2,false>& vec )
1228 {
1230 
1231  return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
1232 }
1234 //*************************************************************************************************
1235 
1236 
1237 //*************************************************************************************************
1253 template< typename VT // Type of the dense vector of the left-hand side expression
1254  , typename ST1 // Type of the scalar of the left-hand side expression
1255  , typename MT // Type of the dense matrix of the right-hand side expression
1256  , typename ST2 // Type of the scalar of the right-hand side expression
1257  , bool SO > // Storage order of the right-hand side expression
1258 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,SO> >::Type
1259  operator*( const DVecScalarMultExpr<VT,ST1,true>& vec, const DMatScalarMultExpr<MT,ST2,SO>& mat )
1260 {
1262 
1263  return ( vec.leftOperand() * mat.leftOperand() ) * ( vec.rightOperand() * mat.rightOperand() );
1264 }
1266 //*************************************************************************************************
1267 
1268 
1269 //*************************************************************************************************
1283 template< typename MT // Type of the dense matrix of the left-hand side expression
1284  , typename ST // Type of the scalar of the left-hand side expression
1285  , bool SO // Storage order of the left-hand side expression
1286  , typename VT > // Type of the right-hand side sparse vector
1287 inline const typename MultExprTrait< DMatScalarMultExpr<MT,ST,SO>, VT >::Type
1288  operator*( const DMatScalarMultExpr<MT,ST,SO>& mat, const SparseVector<VT,false>& vec )
1289 {
1291 
1292  return ( mat.leftOperand() * (~vec) ) * mat.rightOperand();
1293 }
1295 //*************************************************************************************************
1296 
1297 
1298 //*************************************************************************************************
1312 template< typename VT // Type of the left-hand side sparse vector
1313  , typename MT // Type of the dense matrix of the right-hand side expression
1314  , typename ST // Type of the scalar of the right-hand side expression
1315  , bool SO > // Storage order of the right-hand side expression
1316 inline const typename MultExprTrait< VT, DMatScalarMultExpr<MT,ST,SO> >::Type
1317  operator*( const SparseVector<VT,true>& vec, const DMatScalarMultExpr<MT,ST,SO>& mat )
1318 {
1320 
1321  return ( (~vec) * mat.leftOperand() ) * mat.rightOperand();
1322 }
1324 //*************************************************************************************************
1325 
1326 
1327 //*************************************************************************************************
1343 template< typename MT // Type of the dense matrix of the left-hand side expression
1344  , typename ST1 // Type of the scalar of the left-hand side expression
1345  , bool SO // Storage order of the left-hand side expression
1346  , typename VT // Type of the sparse vector of the right-hand side expression
1347  , typename ST2 > // Type of the scalar of the right-hand side expression
1348 inline const typename MultExprTrait< DMatScalarMultExpr<MT,ST1,SO>, SVecScalarMultExpr<VT,ST2,false> >::Type
1349  operator*( const DMatScalarMultExpr<MT,ST1,SO>& mat, const SVecScalarMultExpr<VT,ST2,false>& vec )
1350 {
1352 
1353  return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
1354 }
1356 //*************************************************************************************************
1357 
1358 
1359 //*************************************************************************************************
1375 template< typename VT // Type of the sparse vector of the left-hand side expression
1376  , typename ST1 // Type of the scalar of the left-hand side expression
1377  , typename MT // Type of the dense matrix of the right-hand side expression
1378  , typename ST2 // Type of the scalar of the right-hand side expression
1379  , bool SO > // Storage order of the right-hand side expression
1380 inline const typename MultExprTrait< SVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,SO> >::Type
1381  operator*( const SVecScalarMultExpr<VT,ST1,true>& vec, const DMatScalarMultExpr<MT,ST2,SO>& mat )
1382 {
1384 
1385  return ( vec.leftOperand() * mat.leftOperand() ) * ( vec.rightOperand() * mat.rightOperand() );
1386 }
1388 //*************************************************************************************************
1389 
1390 
1391 //*************************************************************************************************
1405 template< typename MT1 // Type of the dense matrix of the left-hand side expression
1406  , typename ST // Type of the scalar of the left-hand side expression
1407  , bool SO1 // Storage order of the left-hand side expression
1408  , typename MT2 // Type of the right-hand side dense matrix
1409  , bool SO2 > // Storage order of the right-hand side dense matrix
1410 inline const typename MultExprTrait< DMatScalarMultExpr<MT1,ST,SO1>, MT2 >::Type
1411  operator*( const DMatScalarMultExpr<MT1,ST,SO1>& lhs, const DenseMatrix<MT2,SO2>& rhs )
1412 {
1414 
1415  return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1416 }
1418 //*************************************************************************************************
1419 
1420 
1421 //*************************************************************************************************
1435 template< typename MT1 // Type of the left-hand side dense matrix
1436  , bool SO1 // Storage order of the left-hand side dense matrix
1437  , typename MT2 // Type of the dense matrix of the right-hand side expression
1438  , typename ST // Type of the scalar of the right-hand side expression
1439  , bool SO2 > // Storage order of the right-hand side expression
1440 inline const typename MultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,SO2> >::Type
1441  operator*( const DenseMatrix<MT1,SO1>& lhs, const DMatScalarMultExpr<MT2,ST,SO2>& rhs )
1442 {
1444 
1445  return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1446 }
1448 //*************************************************************************************************
1449 
1450 
1451 //*************************************************************************************************
1465 template< typename MT1 // Type of the dense matrix of the left-hand side expression
1466  , typename ST1 // Type of the scalar of the left-hand side expression
1467  , bool SO1 // Storage order of the left-hand side expression
1468  , typename MT2 // Type of the right-hand side dense matrix
1469  , typename ST2 // Type of the scalar of the right-hand side expression
1470  , bool SO2 > // Storage order of the right-hand side expression
1471 inline const typename MultExprTrait< DMatScalarMultExpr<MT1,ST1,SO1>, DMatScalarMultExpr<MT2,ST2,SO2> >::Type
1472  operator*( const DMatScalarMultExpr<MT1,ST1,SO1>& lhs, const DMatScalarMultExpr<MT2,ST2,SO2>& rhs )
1473 {
1475 
1476  return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1477 }
1479 //*************************************************************************************************
1480 
1481 
1482 //*************************************************************************************************
1496 template< typename MT1 // Type of the dense matrix of the left-hand side expression
1497  , typename ST // Type of the scalar of the left-hand side expression
1498  , bool SO1 // Storage order of the left-hand side expression
1499  , typename MT2 // Type of the right-hand side sparse matrix
1500  , bool SO2 > // Storage order of the right-hand side sparse matrix
1501 inline const typename MultExprTrait< DMatScalarMultExpr<MT1,ST,SO1>, MT2 >::Type
1502  operator*( const DMatScalarMultExpr<MT1,ST,SO1>& lhs, const SparseMatrix<MT2,SO2>& rhs )
1503 {
1505 
1506  return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1507 }
1509 //*************************************************************************************************
1510 
1511 
1512 //*************************************************************************************************
1526 template< typename MT1 // Type of the left-hand side sparse matrix
1527  , bool SO1 // Storage order of the left-hand side sparse matrix
1528  , typename MT2 // Type of the dense matrix of the right-hand side expression
1529  , typename ST // Type of the scalar of the right-hand side expression
1530  , bool SO2 > // Storage order of the right-hand side expression
1531 inline const typename MultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,SO2> >::Type
1532  operator*( const SparseMatrix<MT1,SO1>& lhs, const DMatScalarMultExpr<MT2,ST,SO2>& rhs )
1533 {
1535 
1536  return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1537 }
1539 //*************************************************************************************************
1540 
1541 
1542 //*************************************************************************************************
1557 template< typename MT1 // Type of the dense matrix of the left-hand side expression
1558  , typename ST1 // Type of the scalar of the left-hand side expression
1559  , bool SO1 // Storage order of the left-hand side expression
1560  , typename MT2 // Type of the sparse matrix of the right-hand side expression
1561  , typename ST2 // Type of the scalar of the right-hand side expression
1562  , bool SO2 > // Storage order of the right-hand side expression
1563 inline const typename MultExprTrait< DMatScalarMultExpr<MT1,ST1,SO1>, SMatScalarMultExpr<MT2,ST2,SO2> >::Type
1564  operator*( const DMatScalarMultExpr<MT1,ST1,SO1>& mat, const SMatScalarMultExpr<MT2,ST2,SO2>& vec )
1565 {
1567 
1568  return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
1569 }
1571 //*************************************************************************************************
1572 
1573 
1574 //*************************************************************************************************
1589 template< typename MT1 // Type of the sparse matrix of the left-hand side expression
1590  , typename ST1 // Type of the scalar of the left-hand side expression
1591  , bool SO1 // Storage order of the left-hand side expression
1592  , typename MT2 // Type of the dense matrix of the right-hand side expression
1593  , typename ST2 // Type of the scalar of the right-hand side expression
1594  , bool SO2 > // Storage order of the right-hand side expression
1595 inline const typename MultExprTrait< SMatScalarMultExpr<MT1,ST1,SO1>, DMatScalarMultExpr<MT2,ST2,SO2> >::Type
1596  operator*( const SMatScalarMultExpr<MT1,ST1,SO1>& mat, const DMatScalarMultExpr<MT2,ST2,SO2>& vec )
1597 {
1599 
1600  return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
1601 }
1603 //*************************************************************************************************
1604 
1605 
1606 
1607 
1608 //=================================================================================================
1609 //
1610 // ROWS SPECIALIZATIONS
1611 //
1612 //=================================================================================================
1613 
1614 //*************************************************************************************************
1616 template< typename MT, typename ST, bool SO >
1617 struct Rows< DMatScalarMultExpr<MT,ST,SO> > : public Columns<MT>
1618 {};
1620 //*************************************************************************************************
1621 
1622 
1623 
1624 
1625 //=================================================================================================
1626 //
1627 // COLUMNS SPECIALIZATIONS
1628 //
1629 //=================================================================================================
1630 
1631 //*************************************************************************************************
1633 template< typename MT, typename ST, bool SO >
1634 struct Columns< DMatScalarMultExpr<MT,ST,SO> > : public Rows<MT>
1635 {};
1637 //*************************************************************************************************
1638 
1639 
1640 
1641 
1642 //=================================================================================================
1643 //
1644 // ISSYMMETRIC SPECIALIZATIONS
1645 //
1646 //=================================================================================================
1647 
1648 //*************************************************************************************************
1650 template< typename MT, typename ST, bool SO >
1651 struct IsSymmetric< DMatScalarMultExpr<MT,ST,SO> > : public IsTrue< IsSymmetric<MT>::value >
1652 {};
1654 //*************************************************************************************************
1655 
1656 
1657 
1658 
1659 //=================================================================================================
1660 //
1661 // ISLOWER SPECIALIZATIONS
1662 //
1663 //=================================================================================================
1664 
1665 //*************************************************************************************************
1667 template< typename MT, typename ST, bool SO >
1668 struct IsLower< DMatScalarMultExpr<MT,ST,SO> > : public IsTrue< IsLower<MT>::value >
1669 {};
1671 //*************************************************************************************************
1672 
1673 
1674 
1675 
1676 //=================================================================================================
1677 //
1678 // ISUPPER SPECIALIZATIONS
1679 //
1680 //=================================================================================================
1681 
1682 //*************************************************************************************************
1684 template< typename MT, typename ST, bool SO >
1685 struct IsUpper< DMatScalarMultExpr<MT,ST,SO> > : public IsTrue< IsUpper<MT>::value >
1686 {};
1688 //*************************************************************************************************
1689 
1690 
1691 
1692 
1693 //=================================================================================================
1694 //
1695 // DMATSCALARMULTEXPRTRAIT SPECIALIZATIONS
1696 //
1697 //=================================================================================================
1698 
1699 //*************************************************************************************************
1701 template< typename MT, typename ST1, typename ST2 >
1702 struct DMatScalarMultExprTrait< DMatScalarMultExpr<MT,ST1,false>, ST2 >
1703 {
1704  public:
1705  //**********************************************************************************************
1706  typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1707  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1708  , typename DMatScalarMultExprTrait<MT,typename MultTrait<ST1,ST2>::Type>::Type
1709  , INVALID_TYPE >::Type Type;
1710  //**********************************************************************************************
1711 };
1713 //*************************************************************************************************
1714 
1715 
1716 
1717 
1718 //=================================================================================================
1719 //
1720 // TDMATSCALARMULTEXPRTRAIT SPECIALIZATIONS
1721 //
1722 //=================================================================================================
1723 
1724 //*************************************************************************************************
1726 template< typename MT, typename ST1, typename ST2 >
1727 struct TDMatScalarMultExprTrait< DMatScalarMultExpr<MT,ST1,true>, ST2 >
1728 {
1729  public:
1730  //**********************************************************************************************
1731  typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1732  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1733  , typename TDMatScalarMultExprTrait<MT,typename MultTrait<ST1,ST2>::Type>::Type
1734  , INVALID_TYPE >::Type Type;
1735  //**********************************************************************************************
1736 };
1738 //*************************************************************************************************
1739 
1740 
1741 
1742 
1743 //=================================================================================================
1744 //
1745 // DMATSCALARDIVEXPRTRAIT SPECIALIZATIONS
1746 //
1747 //=================================================================================================
1748 
1749 //*************************************************************************************************
1751 template< typename MT, typename ST1, typename ST2 >
1752 struct DMatScalarDivExprTrait< DMatScalarMultExpr<MT,ST1,false>, ST2 >
1753 {
1754  private:
1755  //**********************************************************************************************
1756  enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1757  //**********************************************************************************************
1758 
1759  //**********************************************************************************************
1760  typedef typename DMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1761  typedef typename DMatScalarDivExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1762  //**********************************************************************************************
1763 
1764  public:
1765  //**********************************************************************************************
1766  typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1767  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1768  , typename SelectType<condition,T1,T2>::Type
1769  , INVALID_TYPE >::Type Type;
1770  //**********************************************************************************************
1771 };
1773 //*************************************************************************************************
1774 
1775 
1776 
1777 
1778 //=================================================================================================
1779 //
1780 // TDMATSCALARDIVEXPRTRAIT SPECIALIZATIONS
1781 //
1782 //=================================================================================================
1783 
1784 //*************************************************************************************************
1786 template< typename MT, typename ST1, typename ST2 >
1787 struct TDMatScalarDivExprTrait< DMatScalarMultExpr<MT,ST1,true>, ST2 >
1788 {
1789  private:
1790  //**********************************************************************************************
1791  enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1792  //**********************************************************************************************
1793 
1794  //**********************************************************************************************
1795  typedef typename TDMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1796  typedef typename TDMatScalarDivExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1797  //**********************************************************************************************
1798 
1799  public:
1800  //**********************************************************************************************
1801  typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1802  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1803  , typename SelectType<condition,T1,T2>::Type
1804  , INVALID_TYPE >::Type Type;
1805  //**********************************************************************************************
1806 };
1808 //*************************************************************************************************
1809 
1810 
1811 
1812 
1813 //=================================================================================================
1814 //
1815 // DMATDVECMULTEXPRTRAIT SPECIALIZATIONS
1816 //
1817 //=================================================================================================
1818 
1819 //*************************************************************************************************
1821 template< typename MT, typename ST, typename VT >
1822 struct DMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST,false>, VT >
1823 {
1824  public:
1825  //**********************************************************************************************
1826  typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1827  IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
1828  IsNumeric<ST>::value
1829  , typename DVecScalarMultExprTrait<typename DMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1830  , INVALID_TYPE >::Type Type;
1831  //**********************************************************************************************
1832 };
1834 //*************************************************************************************************
1835 
1836 
1837 //*************************************************************************************************
1839 template< typename MT, typename ST1, typename VT, typename ST2 >
1840 struct DMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST1,false>, DVecScalarMultExpr<VT,ST2,false> >
1841 {
1842  public:
1843  //**********************************************************************************************
1844  typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1845  IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
1846  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1847  , typename DVecScalarMultExprTrait<typename DMatDVecMultExprTrait<MT,VT>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1848  , INVALID_TYPE >::Type Type;
1849  //**********************************************************************************************
1850 };
1852 //*************************************************************************************************
1853 
1854 
1855 
1856 
1857 //=================================================================================================
1858 //
1859 // TDMATDVECMULTEXPRTRAIT SPECIALIZATIONS
1860 //
1861 //=================================================================================================
1862 
1863 //*************************************************************************************************
1865 template< typename MT, typename ST, typename VT >
1866 struct TDMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST,true>, VT >
1867 {
1868  public:
1869  //**********************************************************************************************
1870  typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1871  IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
1872  IsNumeric<ST>::value
1873  , typename DVecScalarMultExprTrait<typename TDMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1874  , INVALID_TYPE >::Type Type;
1875  //**********************************************************************************************
1876 };
1878 //*************************************************************************************************
1879 
1880 
1881 //*************************************************************************************************
1883 template< typename MT, typename ST1, typename VT, typename ST2 >
1884 struct TDMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST1,true>, DVecScalarMultExpr<VT,ST2,false> >
1885 {
1886  public:
1887  //**********************************************************************************************
1888  typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1889  IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
1890  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1891  , typename DVecScalarMultExprTrait<typename TDMatDVecMultExprTrait<MT,VT>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1892  , INVALID_TYPE >::Type Type;
1893  //**********************************************************************************************
1894 };
1896 //*************************************************************************************************
1897 
1898 
1899 
1900 
1901 //=================================================================================================
1902 //
1903 // TDVECDMATMULTEXPRTRAIT SPECIALIZATIONS
1904 //
1905 //=================================================================================================
1906 
1907 //*************************************************************************************************
1909 template< typename VT, typename MT, typename ST >
1910 struct TDVecDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,false> >
1911 {
1912  public:
1913  //**********************************************************************************************
1914  typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
1915  IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1916  IsNumeric<ST>::value
1917  , typename TDVecScalarMultExprTrait<typename TDVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
1918  , INVALID_TYPE >::Type Type;
1919  //**********************************************************************************************
1920 };
1922 //*************************************************************************************************
1923 
1924 
1925 //*************************************************************************************************
1927 template< typename VT, typename ST1, typename MT, typename ST2 >
1928 struct TDVecDMatMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,false> >
1929 {
1930  public:
1931  //**********************************************************************************************
1932  typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
1933  IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1934  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1935  , typename TDVecScalarMultExprTrait<typename TDVecDMatMultExprTrait<VT,MT>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1936  , INVALID_TYPE >::Type Type;
1937  //**********************************************************************************************
1938 };
1940 //*************************************************************************************************
1941 
1942 
1943 
1944 
1945 //=================================================================================================
1946 //
1947 // TDVECTDMATMULTEXPRTRAIT SPECIALIZATIONS
1948 //
1949 //=================================================================================================
1950 
1951 //*************************************************************************************************
1953 template< typename VT, typename MT, typename ST >
1954 struct TDVecTDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,true> >
1955 {
1956  public:
1957  //**********************************************************************************************
1958  typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
1959  IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1960  IsNumeric<ST>::value
1961  , typename TDVecScalarMultExprTrait<typename TDVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
1962  , INVALID_TYPE >::Type Type;
1963  //**********************************************************************************************
1964 };
1966 //*************************************************************************************************
1967 
1968 
1969 //*************************************************************************************************
1971 template< typename VT, typename ST1, typename MT, typename ST2 >
1972 struct TDVecTDMatMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,true> >
1973 {
1974  public:
1975  //**********************************************************************************************
1976  typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
1977  IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1978  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1979  , typename TDVecScalarMultExprTrait<typename TDVecTDMatMultExprTrait<VT,MT>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1980  , INVALID_TYPE >::Type Type;
1981  //**********************************************************************************************
1982 };
1984 //*************************************************************************************************
1985 
1986 
1987 
1988 
1989 //=================================================================================================
1990 //
1991 // DMATSVECMULTEXPRTRAIT SPECIALIZATIONS
1992 //
1993 //=================================================================================================
1994 
1995 //*************************************************************************************************
1997 template< typename MT, typename ST, typename VT >
1998 struct DMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST,false>, VT >
1999 {
2000  public:
2001  //**********************************************************************************************
2002  typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2003  IsSparseVector<VT>::value && IsColumnVector<VT>::value &&
2004  IsNumeric<ST>::value
2005  , typename DVecScalarMultExprTrait<typename DMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
2006  , INVALID_TYPE >::Type Type;
2007  //**********************************************************************************************
2008 };
2010 //*************************************************************************************************
2011 
2012 
2013 //*************************************************************************************************
2015 template< typename MT, typename ST1, typename VT, typename ST2 >
2016 struct DMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST1,false>, SVecScalarMultExpr<VT,ST2,false> >
2017 {
2018  public:
2019  //**********************************************************************************************
2020  typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2021  IsSparseVector<VT>::value && IsColumnVector<VT>::value &&
2022  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2023  , typename DVecScalarMultExprTrait<typename DMatSVecMultExprTrait<MT,VT>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2024  , INVALID_TYPE >::Type Type;
2025  //**********************************************************************************************
2026 };
2028 //*************************************************************************************************
2029 
2030 
2031 
2032 
2033 //=================================================================================================
2034 //
2035 // TDMATSVECMULTEXPRTRAIT SPECIALIZATIONS
2036 //
2037 //=================================================================================================
2038 
2039 //*************************************************************************************************
2041 template< typename MT, typename ST, typename VT >
2042 struct TDMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST,true>, VT >
2043 {
2044  public:
2045  //**********************************************************************************************
2046  typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2047  IsSparseVector<VT>::value && IsColumnVector<VT>::value &&
2048  IsNumeric<ST>::value
2049  , typename DVecScalarMultExprTrait<typename TDMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
2050  , INVALID_TYPE >::Type Type;
2051  //**********************************************************************************************
2052 };
2054 //*************************************************************************************************
2055 
2056 
2057 //*************************************************************************************************
2059 template< typename MT, typename ST1, typename VT, typename ST2 >
2060 struct TDMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST1,true>, SVecScalarMultExpr<VT,ST2,false> >
2061 {
2062  public:
2063  //**********************************************************************************************
2064  typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2065  IsSparseVector<VT>::value && IsColumnVector<VT>::value &&
2066  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2067  , typename DVecScalarMultExprTrait<typename TDMatSVecMultExprTrait<MT,VT>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2068  , INVALID_TYPE >::Type Type;
2069  //**********************************************************************************************
2070 };
2072 //*************************************************************************************************
2073 
2074 
2075 
2076 
2077 //=================================================================================================
2078 //
2079 // TSVECDMATMULTEXPRTRAIT SPECIALIZATIONS
2080 //
2081 //=================================================================================================
2082 
2083 //*************************************************************************************************
2085 template< typename VT, typename MT, typename ST >
2086 struct TSVecDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,false> >
2087 {
2088  public:
2089  //**********************************************************************************************
2090  typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
2091  IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2092  IsNumeric<ST>::value
2093  , typename TDVecScalarMultExprTrait<typename TSVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
2094  , INVALID_TYPE >::Type Type;
2095  //**********************************************************************************************
2096 };
2098 //*************************************************************************************************
2099 
2100 
2101 //*************************************************************************************************
2103 template< typename VT, typename ST1, typename MT, typename ST2 >
2104 struct TSVecDMatMultExprTrait< SVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,false> >
2105 {
2106  public:
2107  //**********************************************************************************************
2108  typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
2109  IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2110  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2111  , typename TDVecScalarMultExprTrait<typename TSVecDMatMultExprTrait<VT,MT>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2112  , INVALID_TYPE >::Type Type;
2113  //**********************************************************************************************
2114 };
2116 //*************************************************************************************************
2117 
2118 
2119 
2120 
2121 //=================================================================================================
2122 //
2123 // TSVECTDMATMULTEXPRTRAIT SPECIALIZATIONS
2124 //
2125 //=================================================================================================
2126 
2127 //*************************************************************************************************
2129 template< typename VT, typename MT, typename ST >
2130 struct TSVecTDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,true> >
2131 {
2132  public:
2133  //**********************************************************************************************
2134  typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
2135  IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2136  IsNumeric<ST>::value
2137  , typename TDVecScalarMultExprTrait<typename TSVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
2138  , INVALID_TYPE >::Type Type;
2139  //**********************************************************************************************
2140 };
2142 //*************************************************************************************************
2143 
2144 
2145 //*************************************************************************************************
2147 template< typename VT, typename ST1, typename MT, typename ST2 >
2148 struct TSVecTDMatMultExprTrait< SVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,true> >
2149 {
2150  public:
2151  //**********************************************************************************************
2152  typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
2153  IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2154  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2155  , typename TDVecScalarMultExprTrait<typename TSVecTDMatMultExprTrait<VT,MT>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2156  , INVALID_TYPE >::Type Type;
2157  //**********************************************************************************************
2158 };
2160 //*************************************************************************************************
2161 
2162 
2163 
2164 
2165 //=================================================================================================
2166 //
2167 // DMATDMATMULTEXPRTRAIT SPECIALIZATIONS
2168 //
2169 //=================================================================================================
2170 
2171 //*************************************************************************************************
2173 template< typename MT1, typename ST, typename MT2 >
2174 struct DMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
2175 {
2176  public:
2177  //**********************************************************************************************
2178  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2179  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2180  IsNumeric<ST>::value
2181  , typename DMatScalarMultExprTrait<typename DMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2182  , INVALID_TYPE >::Type Type;
2183  //**********************************************************************************************
2184 };
2186 //*************************************************************************************************
2187 
2188 
2189 //*************************************************************************************************
2191 template< typename MT1, typename MT2, typename ST >
2192 struct DMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
2193 {
2194  public:
2195  //**********************************************************************************************
2196  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2197  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2198  IsNumeric<ST>::value
2199  , typename DMatScalarMultExprTrait<typename DMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2200  , INVALID_TYPE >::Type Type;
2201  //**********************************************************************************************
2202 };
2204 //*************************************************************************************************
2205 
2206 
2207 //*************************************************************************************************
2209 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2210 struct DMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,false> >
2211 {
2212  public:
2213  //**********************************************************************************************
2214  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2215  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2216  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2217  , typename DMatScalarMultExprTrait<typename DMatDMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2218  , INVALID_TYPE >::Type Type;
2219  //**********************************************************************************************
2220 };
2222 //*************************************************************************************************
2223 
2224 
2225 
2226 
2227 //=================================================================================================
2228 //
2229 // DMATTDMATMULTEXPRTRAIT SPECIALIZATIONS
2230 //
2231 //=================================================================================================
2232 
2233 //*************************************************************************************************
2235 template< typename MT1, typename ST, typename MT2 >
2236 struct DMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
2237 {
2238  public:
2239  //**********************************************************************************************
2240  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2241  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2242  IsNumeric<ST>::value
2243  , typename DMatScalarMultExprTrait<typename DMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2244  , INVALID_TYPE >::Type Type;
2245  //**********************************************************************************************
2246 };
2248 //*************************************************************************************************
2249 
2250 
2251 //*************************************************************************************************
2253 template< typename MT1, typename MT2, typename ST >
2254 struct DMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
2255 {
2256  public:
2257  //**********************************************************************************************
2258  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2259  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2260  IsNumeric<ST>::value
2261  , typename DMatScalarMultExprTrait<typename DMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2262  , INVALID_TYPE >::Type Type;
2263  //**********************************************************************************************
2264 };
2266 //*************************************************************************************************
2267 
2268 
2269 //*************************************************************************************************
2271 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2272 struct DMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,true> >
2273 {
2274  public:
2275  //**********************************************************************************************
2276  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2277  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2278  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2279  , typename DMatScalarMultExprTrait<typename DMatTDMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2280  , INVALID_TYPE >::Type Type;
2281  //**********************************************************************************************
2282 };
2284 //*************************************************************************************************
2285 
2286 
2287 
2288 
2289 //=================================================================================================
2290 //
2291 // TDMATDMATMULTEXPRTRAIT SPECIALIZATIONS
2292 //
2293 //=================================================================================================
2294 
2295 //*************************************************************************************************
2297 template< typename MT1, typename ST, typename MT2 >
2298 struct TDMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
2299 {
2300  public:
2301  //**********************************************************************************************
2302  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2303  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2304  IsNumeric<ST>::value
2305  , typename TDMatScalarMultExprTrait<typename TDMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2306  , INVALID_TYPE >::Type Type;
2307  //**********************************************************************************************
2308 };
2310 //*************************************************************************************************
2311 
2312 
2313 //*************************************************************************************************
2315 template< typename MT1, typename MT2, typename ST >
2316 struct TDMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
2317 {
2318  public:
2319  //**********************************************************************************************
2320  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2321  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2322  IsNumeric<ST>::value
2323  , typename TDMatScalarMultExprTrait<typename TDMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2324  , INVALID_TYPE >::Type Type;
2325  //**********************************************************************************************
2326 };
2328 //*************************************************************************************************
2329 
2330 
2331 //*************************************************************************************************
2333 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2334 struct TDMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,false> >
2335 {
2336  public:
2337  //**********************************************************************************************
2338  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2339  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2340  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2341  , typename TDMatScalarMultExprTrait<typename TDMatDMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2342  , INVALID_TYPE >::Type Type;
2343  //**********************************************************************************************
2344 };
2346 //*************************************************************************************************
2347 
2348 
2349 
2350 
2351 //=================================================================================================
2352 //
2353 // TDMATTDMATMULTEXPRTRAIT SPECIALIZATIONS
2354 //
2355 //=================================================================================================
2356 
2357 //*************************************************************************************************
2359 template< typename MT1, typename ST, typename MT2 >
2360 struct TDMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
2361 {
2362  public:
2363  //**********************************************************************************************
2364  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2365  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2366  IsNumeric<ST>::value
2367  , typename TDMatScalarMultExprTrait<typename TDMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2368  , INVALID_TYPE >::Type Type;
2369  //**********************************************************************************************
2370 };
2372 //*************************************************************************************************
2373 
2374 
2375 //*************************************************************************************************
2377 template< typename MT1, typename MT2, typename ST >
2378 struct TDMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
2379 {
2380  public:
2381  //**********************************************************************************************
2382  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2383  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2384  IsNumeric<ST>::value
2385  , typename TDMatScalarMultExprTrait<typename TDMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2386  , INVALID_TYPE >::Type Type;
2387  //**********************************************************************************************
2388 };
2390 //*************************************************************************************************
2391 
2392 
2393 //*************************************************************************************************
2395 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2396 struct TDMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,true> >
2397 {
2398  public:
2399  //**********************************************************************************************
2400  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2401  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2402  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2403  , typename TDMatScalarMultExprTrait<typename TDMatTDMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2404  , INVALID_TYPE >::Type Type;
2405  //**********************************************************************************************
2406 };
2408 //*************************************************************************************************
2409 
2410 
2411 
2412 
2413 //=================================================================================================
2414 //
2415 // DMATSMATMULTEXPRTRAIT SPECIALIZATIONS
2416 //
2417 //=================================================================================================
2418 
2419 //*************************************************************************************************
2421 template< typename MT1, typename ST, typename MT2 >
2422 struct DMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
2423 {
2424  public:
2425  //**********************************************************************************************
2426  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2427  IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2428  IsNumeric<ST>::value
2429  , typename DMatScalarMultExprTrait<typename DMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2430  , INVALID_TYPE >::Type Type;
2431  //**********************************************************************************************
2432 };
2434 //*************************************************************************************************
2435 
2436 
2437 //*************************************************************************************************
2439 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2440 struct DMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, SMatScalarMultExpr<MT2,ST2,false> >
2441 {
2442  public:
2443  //**********************************************************************************************
2444  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2445  IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2446  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2447  , typename DMatScalarMultExprTrait<typename DMatSMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2448  , INVALID_TYPE >::Type Type;
2449  //**********************************************************************************************
2450 };
2452 //*************************************************************************************************
2453 
2454 
2455 
2456 
2457 //=================================================================================================
2458 //
2459 // DMATTSMATMULTEXPRTRAIT SPECIALIZATIONS
2460 //
2461 //=================================================================================================
2462 
2463 //*************************************************************************************************
2465 template< typename MT1, typename ST, typename MT2 >
2466 struct DMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
2467 {
2468  public:
2469  //**********************************************************************************************
2470  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2471  IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2472  IsNumeric<ST>::value
2473  , typename DMatScalarMultExprTrait<typename DMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2474  , INVALID_TYPE >::Type Type;
2475  //**********************************************************************************************
2476 };
2478 //*************************************************************************************************
2479 
2480 
2481 //*************************************************************************************************
2483 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2484 struct DMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, SMatScalarMultExpr<MT2,ST2,true> >
2485 {
2486  public:
2487  //**********************************************************************************************
2488  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2489  IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2490  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2491  , typename DMatScalarMultExprTrait<typename DMatTSMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2492  , INVALID_TYPE >::Type Type;
2493  //**********************************************************************************************
2494 };
2496 //*************************************************************************************************
2497 
2498 
2499 
2500 
2501 //=================================================================================================
2502 //
2503 // TDMATSMATMULTEXPRTRAIT SPECIALIZATIONS
2504 //
2505 //=================================================================================================
2506 
2507 //*************************************************************************************************
2509 template< typename MT1, typename ST, typename MT2 >
2510 struct TDMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
2511 {
2512  public:
2513  //**********************************************************************************************
2514  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2515  IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2516  IsNumeric<ST>::value
2517  , typename TDMatScalarMultExprTrait<typename TDMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2518  , INVALID_TYPE >::Type Type;
2519  //**********************************************************************************************
2520 };
2522 //*************************************************************************************************
2523 
2524 
2525 //*************************************************************************************************
2527 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2528 struct TDMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, SMatScalarMultExpr<MT2,ST2,false> >
2529 {
2530  public:
2531  //**********************************************************************************************
2532  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2533  IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2534  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2535  , typename TDMatScalarMultExprTrait<typename TDMatSMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2536  , INVALID_TYPE >::Type Type;
2537  //**********************************************************************************************
2538 };
2540 //*************************************************************************************************
2541 
2542 
2543 
2544 
2545 //=================================================================================================
2546 //
2547 // TDMATTSMATMULTEXPRTRAIT SPECIALIZATIONS
2548 //
2549 //=================================================================================================
2550 
2551 //*************************************************************************************************
2553 template< typename MT1, typename ST, typename MT2 >
2554 struct TDMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
2555 {
2556  public:
2557  //**********************************************************************************************
2558  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2559  IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2560  IsNumeric<ST>::value
2561  , typename TDMatScalarMultExprTrait<typename TDMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2562  , INVALID_TYPE >::Type Type;
2563  //**********************************************************************************************
2564 };
2566 //*************************************************************************************************
2567 
2568 
2569 //*************************************************************************************************
2571 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2572 struct TDMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, SMatScalarMultExpr<MT2,ST2,true> >
2573 {
2574  public:
2575  //**********************************************************************************************
2576  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2577  IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2578  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2579  , typename TDMatScalarMultExprTrait<typename TDMatTSMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2580  , INVALID_TYPE >::Type Type;
2581  //**********************************************************************************************
2582 };
2584 //*************************************************************************************************
2585 
2586 
2587 
2588 
2589 //=================================================================================================
2590 //
2591 // SMATDMATMULTEXPRTRAIT SPECIALIZATIONS
2592 //
2593 //=================================================================================================
2594 
2595 //*************************************************************************************************
2597 template< typename MT1, typename ST, typename MT2 >
2598 struct SMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
2599 {
2600  public:
2601  //**********************************************************************************************
2602  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2603  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2604  IsNumeric<ST>::value
2605  , typename DMatScalarMultExprTrait<typename SMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2606  , INVALID_TYPE >::Type Type;
2607  //**********************************************************************************************
2608 };
2610 //*************************************************************************************************
2611 
2612 
2613 //*************************************************************************************************
2615 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2616 struct SMatDMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,false> >
2617 {
2618  public:
2619  //**********************************************************************************************
2620  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2621  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2622  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2623  , typename DMatScalarMultExprTrait<typename SMatDMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2624  , INVALID_TYPE >::Type Type;
2625  //**********************************************************************************************
2626 };
2628 //*************************************************************************************************
2629 
2630 
2631 
2632 
2633 //=================================================================================================
2634 //
2635 // SMATTDMATMULTEXPRTRAIT SPECIALIZATIONS
2636 //
2637 //=================================================================================================
2638 
2639 //*************************************************************************************************
2641 template< typename MT1, typename ST, typename MT2 >
2642 struct SMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
2643 {
2644  public:
2645  //**********************************************************************************************
2646  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2647  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2648  IsNumeric<ST>::value
2649  , typename DMatScalarMultExprTrait<typename SMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2650  , INVALID_TYPE >::Type Type;
2651  //**********************************************************************************************
2652 };
2654 //*************************************************************************************************
2655 
2656 
2657 //*************************************************************************************************
2659 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2660 struct SMatTDMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,true> >
2661 {
2662  public:
2663  //**********************************************************************************************
2664  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2665  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2666  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2667  , typename DMatScalarMultExprTrait<typename SMatTDMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2668  , INVALID_TYPE >::Type Type;
2669  //**********************************************************************************************
2670 };
2672 //*************************************************************************************************
2673 
2674 
2675 
2676 
2677 //=================================================================================================
2678 //
2679 // TSMATDMATMULTEXPRTRAIT SPECIALIZATIONS
2680 //
2681 //=================================================================================================
2682 
2683 //*************************************************************************************************
2685 template< typename MT1, typename ST, typename MT2 >
2686 struct TSMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
2687 {
2688  public:
2689  //**********************************************************************************************
2690  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2691  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2692  IsNumeric<ST>::value
2693  , typename TDMatScalarMultExprTrait<typename TSMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2694  , INVALID_TYPE >::Type Type;
2695  //**********************************************************************************************
2696 };
2698 //*************************************************************************************************
2699 
2700 
2701 //*************************************************************************************************
2703 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2704 struct TSMatDMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,false> >
2705 {
2706  public:
2707  //**********************************************************************************************
2708  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2709  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2710  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2711  , typename TDMatScalarMultExprTrait<typename TSMatDMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2712  , INVALID_TYPE >::Type Type;
2713  //**********************************************************************************************
2714 };
2716 //*************************************************************************************************
2717 
2718 
2719 
2720 
2721 //=================================================================================================
2722 //
2723 // TSMATTDMATMULTEXPRTRAIT SPECIALIZATIONS
2724 //
2725 //=================================================================================================
2726 
2727 //*************************************************************************************************
2729 template< typename MT1, typename ST, typename MT2 >
2730 struct TSMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
2731 {
2732  public:
2733  //**********************************************************************************************
2734  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2735  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2736  IsNumeric<ST>::value
2737  , typename TDMatScalarMultExprTrait<typename TSMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2738  , INVALID_TYPE >::Type Type;
2739  //**********************************************************************************************
2740 };
2742 //*************************************************************************************************
2743 
2744 
2745 //*************************************************************************************************
2747 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2748 struct TSMatTDMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,true> >
2749 {
2750  public:
2751  //**********************************************************************************************
2752  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2753  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2754  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2755  , typename TDMatScalarMultExprTrait<typename TSMatTDMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2756  , INVALID_TYPE >::Type Type;
2757  //**********************************************************************************************
2758 };
2760 //*************************************************************************************************
2761 
2762 
2763 
2764 
2765 //=================================================================================================
2766 //
2767 // SUBMATRIXEXPRTRAIT SPECIALIZATIONS
2768 //
2769 //=================================================================================================
2770 
2771 //*************************************************************************************************
2773 template< typename MT, typename ST, bool SO, bool AF >
2774 struct SubmatrixExprTrait< DMatScalarMultExpr<MT,ST,SO>, AF >
2775 {
2776  public:
2777  //**********************************************************************************************
2778  typedef typename MultExprTrait< typename SubmatrixExprTrait<const MT,AF>::Type, ST >::Type Type;
2779  //**********************************************************************************************
2780 };
2782 //*************************************************************************************************
2783 
2784 
2785 
2786 
2787 //=================================================================================================
2788 //
2789 // ROWEXPRTRAIT SPECIALIZATIONS
2790 //
2791 //=================================================================================================
2792 
2793 //*************************************************************************************************
2795 template< typename MT, typename ST, bool SO >
2796 struct RowExprTrait< DMatScalarMultExpr<MT,ST,SO> >
2797 {
2798  public:
2799  //**********************************************************************************************
2800  typedef typename MultExprTrait< typename RowExprTrait<const MT>::Type, ST >::Type Type;
2801  //**********************************************************************************************
2802 };
2804 //*************************************************************************************************
2805 
2806 
2807 
2808 
2809 //=================================================================================================
2810 //
2811 // COLUMNEXPRTRAIT SPECIALIZATIONS
2812 //
2813 //=================================================================================================
2814 
2815 //*************************************************************************************************
2817 template< typename MT, typename ST, bool SO >
2818 struct ColumnExprTrait< DMatScalarMultExpr<MT,ST,SO> >
2819 {
2820  public:
2821  //**********************************************************************************************
2822  typedef typename MultExprTrait< typename ColumnExprTrait<const MT>::Type, ST >::Type Type;
2823  //**********************************************************************************************
2824 };
2826 //*************************************************************************************************
2827 
2828 } // namespace blaze
2829 
2830 #endif
LeftOperand leftOperand() const
Returns the left-hand side dense matrix operand.
Definition: DMatScalarMultExpr.h:536
MT::ConstIterator IteratorType
ConstIterator type of the dense matrix expression.
Definition: DMatScalarMultExpr.h:212
IntrinsicType load() const
Access to the intrinsic elements of the matrix.
Definition: DMatScalarMultExpr.h:308
Pointer difference type of the Blaze library.
DifferenceType difference_type
Difference between two iterators.
Definition: DMatScalarMultExpr.h:209
Data type constraint.
Compile time check whether the given type is a computational expression template.This type trait clas...
Definition: IsComputation.h:89
Constraint on the data type.
Compile time check whether the given type is a temporary vector or matrix type.This type trait class ...
Definition: IsTemporary.h:87
RightOperand scalar_
Scalar of the multiplication expression.
Definition: DMatScalarMultExpr.h:429
Header file for the Rows type trait.
const DMatDMatMultExpr< T1, T2 > operator*(const DenseMatrix< T1, false > &lhs, const DenseMatrix< T2, false > &rhs)
Multiplication operator for the multiplication of two row-major dense matrices ( ).
Definition: DMatDMatMultExpr.h:4838
const EnableIf< IsNumeric< T2 >, typename DivExprTrait< T1, T2 >::Type >::Type operator/(const DenseMatrix< T1, SO > &mat, T2 scalar)
Division operator for the division of a dense matrix by a scalar value ( ).
Definition: DMatScalarDivExpr.h:936
MultExprTrait< RN, ST >::Type ExprReturnType
Expression return type for the subscript operator.
Definition: DMatScalarMultExpr.h:132
BLAZE_ALWAYS_INLINE size_t size(const Vector< VT, TF > &vector)
Returns the current size/dimension of the vector.
Definition: Vector.h:258
MT::ResultType RT
Result type of the dense matrix expression.
Definition: DMatScalarMultExpr.h:116
bool isAligned() const
Returns whether the operands of the expression are properly aligned in memory.
Definition: DMatScalarMultExpr.h:580
ReferenceType reference
Reference return type.
Definition: DMatScalarMultExpr.h:208
ConstIterator & operator++()
Pre-increment operator.
Definition: DMatScalarMultExpr.h:256
Header file for the IsSparseMatrix type trait.
const ConstIterator operator--(int)
Post-decrement operator.
Definition: DMatScalarMultExpr.h:288
#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
bool operator>=(const ConstIterator &rhs) const
Greater-than comparison between two ConstIterator objects.
Definition: DMatScalarMultExpr.h:374
#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 IsSame and IsStrictlySame type traits.
const size_t SMP_DMATSCALARMULT_THRESHOLD
SMP dense matrix/scalar multiplication/division threshold.This threshold specifies when a dense matri...
Definition: Thresholds.h:811
Header file for the IsColumnMajorMatrix type trait.
RightOperand scalar_
Right-hand side scalar of the multiplication expression.
Definition: DMatScalarMultExpr.h:599
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
IteratorCategory iterator_category
The iterator category.
Definition: DMatScalarMultExpr.h:205
SelectType< useAssign, const ResultType, const DMatScalarMultExpr & >::Type CompositeType
Data type for composite expression templates.
Definition: DMatScalarMultExpr.h:182
Base class for all matrix/scalar multiplication expression templates.The MatScalarMultExpr class serv...
Definition: MatScalarMultExpr.h:66
Header file for the DenseVector base class.
MT::ReturnType RN
Return type of the dense matrix expression.
Definition: DMatScalarMultExpr.h:117
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.
Type relationship analysis.This class tests if the two data types A and B are equal. For this type comparison, the cv-qualifiers of both data types are ignored. If A and B are the same data type (ignoring the cv-qualifiers), then the value member enumeration is set to 1, the nested type definition Type is TrueType, and the class derives from TrueType. Otherwise value is set to 0, Type is FalseType, and the class derives from FalseType.
Definition: IsSame.h:158
Header file for the RequiresEvaluation type trait.
DifferenceType operator-(const ConstIterator &rhs) const
Calculating the number of elements between two iterators.
Definition: DMatScalarMultExpr.h:385
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
ReturnType operator*() const
Direct access to the element at the current iterator position.
Definition: DMatScalarMultExpr.h:298
Constraint on the data type.
Header file for the DivExprTrait class template.
ElementType ValueType
Type of the underlying elements.
Definition: DMatScalarMultExpr.h:199
Constraint on the data type.
Header file for the MultExprTrait class template.
Compile time check to query the requirement to evaluate an expression.Via this type trait it is possi...
Definition: RequiresEvaluation.h:90
const This & CompositeType
Data type for composite expression templates.
Definition: CompressedMatrix.h:259
bool canSMPAssign() const
Returns whether the expression can be used in SMP assignments.
Definition: DMatScalarMultExpr.h:590
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.
ptrdiff_t DifferenceType
Difference between two iterators.
Definition: DMatScalarMultExpr.h:202
Header file for the multiplication trait.
size_t rows() const
Returns the current number of rows of the matrix.
Definition: DMatScalarMultExpr.h:516
Header file for the IsSymmetric type trait.
bool operator<(const ConstIterator &rhs) const
Less-than comparison between two ConstIterator objects.
Definition: DMatScalarMultExpr.h:341
Header file for the IsFloatingPoint type trait.
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: DMatScalarMultExpr.h:463
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:2482
Expression object for dense matrix-scalar multiplications.The DMatScalarMultExpr class represents the...
Definition: DMatScalarMultExpr.h:110
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: DMatScalarMultExpr.h:558
ConstIterator & operator+=(size_t inc)
Addition assignment operator.
Definition: DMatScalarMultExpr.h:233
IteratorType iterator_
Iterator to the current element.
Definition: DMatScalarMultExpr.h:428
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.
bool operator<=(const ConstIterator &rhs) const
Less-than comparison between two ConstIterator objects.
Definition: DMatScalarMultExpr.h:363
IntrinsicType load(size_t i, size_t j) const
Access to the intrinsic elements of the matrix.
Definition: DMatScalarMultExpr.h:477
const SelectType< returnExpr, ExprReturnType, ElementType >::Type ReturnType
Return type for expression template evaluations.
Definition: DMatScalarMultExpr.h:179
#define BLAZE_CONSTRAINT_MUST_BE_SAME_TYPE(A, B)
Data type constraint.In case the two types A and B are not the same (ignoring all cv-qualifiers of bo...
Definition: SameType.h:89
Header file for the IsLower type trait.
ElementType * PointerType
Pointer return type.
Definition: DMatScalarMultExpr.h:200
#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
bool operator==(const ConstIterator &rhs) const
Equality comparison between two ConstIterator objects.
Definition: DMatScalarMultExpr.h:319
SelectType< IsExpression< MT >::value, const MT, const MT & >::Type LeftOperand
Composite type of the left-hand side dense matrix expression.
Definition: DMatScalarMultExpr.h:185
Constraints on the storage order of matrix types.
LeftOperand matrix_
Left-hand side dense matrix of the multiplication expression.
Definition: DMatScalarMultExpr.h:598
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:2476
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.
ConstIterator end(size_t i) const
Returns an iterator just past the last non-zero element of row i.
Definition: DMatScalarMultExpr.h:506
Header file for the EnableIf class template.
friend const ConstIterator operator-(const ConstIterator &it, size_t dec)
Subtraction between a ConstIterator and an integral value.
Definition: DMatScalarMultExpr.h:421
Header file for the serial shim.
Header file for the BaseElementType type trait.
size_t columns() const
Returns the current number of columns of the matrix.
Definition: DMatScalarMultExpr.h:526
ConstIterator(IteratorType iterator, RightOperand scalar)
Constructor for the ConstIterator class.
Definition: DMatScalarMultExpr.h:221
friend const ConstIterator operator+(size_t inc, const ConstIterator &it)
Addition between an integral value and a ConstIterator.
Definition: DMatScalarMultExpr.h:409
Header file for the IsNumeric type trait.
ResultType::ElementType ElementType
Resulting element type.
Definition: DMatScalarMultExpr.h:175
ElementType & ReferenceType
Reference return type.
Definition: DMatScalarMultExpr.h:201
BLAZE_ALWAYS_INLINE EnableIf< IsIntegral< T >, Set< T, sizeof(T)> >::Type::Type set(T value)
Sets all values in the vector to the given integral value.
Definition: Set.h:211
RightOperand rightOperand() const
Returns the right-hand side scalar operand.
Definition: DMatScalarMultExpr.h:546
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 IsSparseVector type trait.
Header file for the SubmatrixExprTrait class template.
const Type & ReturnType
Return type for expression template evaluations.
Definition: CompressedMatrix.h:2477
Header file for the MatScalarMultExpr base class.
Intrinsic characteristics of data types.The IntrinsicTrait class template provides the intrinsic char...
Definition: IntrinsicTrait.h:749
MT::CompositeType CT
Composite type of the dense matrix expression.
Definition: DMatScalarMultExpr.h:119
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
Utility type for generic codes.
Base template for the MultTrait class.
Definition: MultTrait.h:142
DMatScalarMultExpr(const MT &matrix, ST scalar)
Constructor for the DMatScalarMultExpr class.
Definition: DMatScalarMultExpr.h:450
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
Header file for the division trait.
bool isAliased(const T *alias) const
Returns whether the expression is aliased with the given address alias.
Definition: DMatScalarMultExpr.h:570
const DenseIterator< Type > operator-(const DenseIterator< Type > &it, ptrdiff_t inc)
Subtraction between a DenseIterator and an integral value.
Definition: DenseIterator.h:585
Substitution Failure Is Not An Error (SFINAE) class.The EnableIf class template is an auxiliary tool ...
Definition: EnableIf.h:184
ConstIterator & operator-=(size_t dec)
Subtraction assignment operator.
Definition: DMatScalarMultExpr.h:245
#define BLAZE_CONSTRAINT_MUST_BE_NUMERIC_TYPE(T)
Constraint on the data type.In case the given data type T is not a numeric (integral or floating poin...
Definition: Numeric.h:79
ConstIterator begin(size_t i) const
Returns an iterator to the first non-zero element of row i.
Definition: DMatScalarMultExpr.h:495
bool operator!=(const ConstIterator &rhs) const
Inequality comparison between two ConstIterator objects.
Definition: DMatScalarMultExpr.h:330
bool operator>(const ConstIterator &rhs) const
Greater-than comparison between two ConstIterator objects.
Definition: DMatScalarMultExpr.h:352
const ConstIterator operator++(int)
Post-increment operator.
Definition: DMatScalarMultExpr.h:267
Evaluation of the base element type of a given data type.Via this type trait it is possible to evalua...
Definition: BaseElementType.h:80
friend const ConstIterator operator+(const ConstIterator &it, size_t inc)
Addition between a ConstIterator and an integral value.
Definition: DMatScalarMultExpr.h:397
Header file for the IsDenseVector type trait.
Header file for all intrinsic functionality.
ConstIterator & operator--()
Pre-decrement operator.
Definition: DMatScalarMultExpr.h:277
MT::ElementType ET
Element type of the dense matrix expression.
Definition: DMatScalarMultExpr.h:118
Header file for the IsRowMajorMatrix type trait.
const bool rowMajor
Storage order flag for row-major matrices.
Definition: StorageOrder.h:71
Header file for the IsComputation type trait class.
ST RightOperand
Composite type of the right-hand side scalar value.
Definition: DMatScalarMultExpr.h:188
Base class for all compute expression templates.The Computation class serves as a tag for all computa...
Definition: Computation.h:59
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
ResultType::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: DMatScalarMultExpr.h:174
#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
PointerType pointer
Pointer return type.
Definition: DMatScalarMultExpr.h:207
This ResultType
Result type for expression template evaluations.
Definition: CompressedMatrix.h:2473
Header file for the IsTrue value trait.
Header file for basic type definitions.
IntrinsicTrait< ElementType >::Type IntrinsicType
Resulting intrinsic element type.
Definition: DMatScalarMultExpr.h:176
Iterator over the elements of the dense matrix.
Definition: DMatScalarMultExpr.h:194
std::random_access_iterator_tag IteratorCategory
The iterator category.
Definition: DMatScalarMultExpr.h:198
Header file for the IsUpper type trait.
MultTrait< RT, ST >::Type ResultType
Result type for expression template evaluations.
Definition: DMatScalarMultExpr.h:172
ResultType::OppositeType OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: DMatScalarMultExpr.h:173
DMatScalarMultExpr< MT, ST, SO > This
Type of this DMatScalarMultExpr instance.
Definition: DMatScalarMultExpr.h:171
Evaluation of the resulting expression type of a multiplication.Via this type trait it is possible to...
Definition: MultExprTrait.h:137
Header file for the thresholds for matrix/vector and matrix/matrix multiplications.
#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
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
ValueType value_type
Type of the underlying elements.
Definition: DMatScalarMultExpr.h:206