All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DMatScalarMultExpr.h
Go to the documentation of this file.
1 //=================================================================================================
20 //=================================================================================================
21 
22 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATSCALARMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DMATSCALARMULTEXPR_H_
24 
25 
26 //*************************************************************************************************
27 // Includes
28 //*************************************************************************************************
29 
37 #include <blaze/math/Intrinsics.h>
53 #include <blaze/util/Assert.h>
57 #include <blaze/util/EnableIf.h>
58 #include <blaze/util/InvalidType.h>
59 #include <blaze/util/SelectType.h>
60 #include <blaze/util/Types.h>
63 
64 
65 namespace blaze {
66 
67 //=================================================================================================
68 //
69 // CLASS DMATSCALARMULTEXPR
70 //
71 //=================================================================================================
72 
73 //*************************************************************************************************
80 template< typename MT // Type of the left-hand side dense matrix
81  , typename ST // Type of the right-hand side scalar value
82  , bool SO > // Storage order
83 class DMatScalarMultExpr : public DenseMatrix< DMatScalarMultExpr<MT,ST,SO>, SO >
84  , private Expression
85  , private Computation
86 {
87  private:
88  //**Type definitions****************************************************************************
89  typedef typename MT::ResultType RT;
90  typedef typename MT::ReturnType RN;
91  typedef typename MT::ElementType ET;
92  typedef typename MT::CompositeType CT;
93  //**********************************************************************************************
94 
95  //**Return type evaluation**********************************************************************
97 
102  enum { returnExpr = !IsTemporary<RN>::value };
103 
106  //**********************************************************************************************
107 
108  //**Evaluation strategy*************************************************************************
110 
116  enum { useAssign = RequiresEvaluation<MT>::value };
117 
119 
120  template< typename MT2 >
121  struct UseAssign {
122  enum { value = useAssign };
123  };
125  //**********************************************************************************************
126 
127  public:
128  //**Type definitions****************************************************************************
131  typedef typename ResultType::OppositeType OppositeType;
132  typedef typename ResultType::TransposeType TransposeType;
133  typedef typename ResultType::ElementType ElementType;
135 
138 
141 
143  typedef typename SelectType< IsExpression<MT>::value, const MT, const MT& >::Type LeftOperand;
144 
147  //**********************************************************************************************
148 
149  //**Compilation flags***************************************************************************
151  enum { vectorizable = MT::vectorizable &&
154 
156  enum { canAlias = CanAlias<MT>::value };
157  //**********************************************************************************************
158 
159  //**Constructor*********************************************************************************
165  explicit inline DMatScalarMultExpr( const MT& matrix, ST scalar )
166  : matrix_( matrix ) // Left-hand side dense matrix of the multiplication expression
167  , scalar_( scalar ) // Right-hand side scalar of the multiplication expression
168  {}
169  //**********************************************************************************************
170 
171  //**Access operator*****************************************************************************
178  inline ReturnType operator()( size_t i, size_t j ) const {
179  BLAZE_INTERNAL_ASSERT( i < matrix_.rows() , "Invalid row access index" );
180  BLAZE_INTERNAL_ASSERT( j < matrix_.columns(), "Invalid column access index" );
181  return matrix_(i,j) * scalar_;
182  }
183  //**********************************************************************************************
184 
185  //**Get function********************************************************************************
192  inline IntrinsicType get( size_t i, size_t j ) const {
193  typedef IntrinsicTrait<ElementType> IT;
194  BLAZE_INTERNAL_ASSERT( i < matrix_.rows() , "Invalid row access index" );
195  BLAZE_INTERNAL_ASSERT( j < matrix_.columns(), "Invalid column access index" );
196  BLAZE_INTERNAL_ASSERT( SO || ( j % IT::size == 0UL ), "Invalid column access index" );
197  BLAZE_INTERNAL_ASSERT( !SO || ( i % IT::size == 0UL ), "Invalid column access index" );
198  const IntrinsicType xmm1( matrix_.get(i,j) );
199  const IntrinsicType xmm2( set( scalar_ ) );
200  return xmm1 * xmm2;
201  }
202  //**********************************************************************************************
203 
204  //**Rows function*******************************************************************************
209  inline size_t rows() const {
210  return matrix_.rows();
211  }
212  //**********************************************************************************************
213 
214  //**Columns function****************************************************************************
219  inline size_t columns() const {
220  return matrix_.columns();
221  }
222  //**********************************************************************************************
223 
224  //**Left operand access*************************************************************************
229  inline LeftOperand leftOperand() const {
230  return matrix_;
231  }
232  //**********************************************************************************************
233 
234  //**Right operand access************************************************************************
239  inline RightOperand rightOperand() const {
240  return scalar_;
241  }
242  //**********************************************************************************************
243 
244  //**********************************************************************************************
250  template< typename T >
251  inline bool isAliased( const T* alias ) const {
252  return matrix_.isAliased( alias );
253  }
254  //**********************************************************************************************
255 
256  private:
257  //**Member variables****************************************************************************
260  //**********************************************************************************************
261 
262  //**Assignment to row-major dense matrices******************************************************
276  template< typename MT2 > // Type of the target dense matrix
277  friend inline typename EnableIf< UseAssign<MT2> >::Type
279  {
280  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
281  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
282 
283  assign( ~lhs, rhs.matrix_ );
284 
285  const size_t m( (~lhs).rows() );
286  const size_t n( (~lhs).columns() );
287  for( size_t i=0UL; i<m; ++i ) {
288  for( size_t j=0UL; j<n; ++j ) {
289  (~lhs)(i,j) *= rhs.scalar_;
290  }
291  }
292  }
294  //**********************************************************************************************
295 
296  //**Assignment to column-major dense matrices***************************************************
310  template< typename MT2 > // Type of the target dense matrix
311  friend inline typename EnableIf< UseAssign<MT2> >::Type
313  {
314  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
315  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
316 
317  assign( ~lhs, rhs.matrix_ );
318 
319  const size_t m( (~lhs).rows() );
320  const size_t n( (~lhs).columns() );
321  for( size_t j=0UL; j<n; ++j ) {
322  for( size_t i=0UL; i<m; ++i ) {
323  (~lhs)(i,j) *= rhs.scalar_;
324  }
325  }
326  }
328  //**********************************************************************************************
329 
330  //**Assignment to row-major sparse matrices*****************************************************
344  template< typename MT2 > // Type of the target sparse matrix
345  friend inline typename EnableIf< UseAssign<MT2> >::Type
347  {
348  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
349  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
350 
351  assign( ~lhs, rhs.matrix_ );
352 
353  for( size_t i=0UL; i<(~lhs).rows(); ++i )
354  {
355  typename MT2::Iterator element( (~lhs).begin(i) );
356  const typename MT2::Iterator end( (~lhs).end(i) );
357 
358  for( ; element!=end; ++element )
359  element->value() *= rhs.scalar_;
360  }
361  }
363  //**********************************************************************************************
364 
365  //**Assignment to column-major sparse matrices**************************************************
379  template< typename MT2 > // Type of the target sparse matrix
380  friend inline typename EnableIf< UseAssign<MT2> >::Type
382  {
383  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
384  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
385 
386  assign( ~lhs, rhs.matrix_ );
387 
388  for( size_t j=0UL; j<(~lhs).columns(); ++j )
389  {
390  typename MT2::Iterator element( (~lhs).begin(j) );
391  const typename MT2::Iterator end( (~lhs).end(j) );
392 
393  for( ; element!=end; ++element )
394  element->value() *= rhs.scalar_;
395  }
396  }
398  //**********************************************************************************************
399 
400  //**Addition assignment to dense matrices*******************************************************
414  template< typename MT2 // Type of the target dense matrix
415  , bool SO2 > // Storage order of the target dense matrix
416  friend inline typename EnableIf< UseAssign<MT2> >::Type
417  addAssign( DenseMatrix<MT2,SO2>& lhs, const DMatScalarMultExpr& rhs )
418  {
421  BLAZE_CONSTRAINT_MUST_BE_REFERENCE_TYPE( typename ResultType::CompositeType );
422 
423  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
424  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
425 
426  const ResultType tmp( rhs );
427  addAssign( ~lhs, tmp );
428  }
430  //**********************************************************************************************
431 
432  //**Addition assignment to sparse matrices******************************************************
433  // No special implementation for the addition assignment to sparse matrices.
434  //**********************************************************************************************
435 
436  //**Subtraction assignment to dense matrices****************************************************
450  template< typename MT2 // Type of the target dense matrix
451  , bool SO2 > // Storage order of the target dense matrix
452  friend inline typename EnableIf< UseAssign<MT2> >::Type
453  subAssign( DenseMatrix<MT2,SO2>& lhs, const DMatScalarMultExpr& rhs )
454  {
457  BLAZE_CONSTRAINT_MUST_BE_REFERENCE_TYPE( typename ResultType::CompositeType );
458 
459  BLAZE_INTERNAL_ASSERT( (~lhs).rows() == rhs.rows() , "Invalid number of rows" );
460  BLAZE_INTERNAL_ASSERT( (~lhs).columns() == rhs.columns(), "Invalid number of columns" );
461 
462  const ResultType tmp( rhs );
463  subAssign( ~lhs, tmp );
464  }
466  //**********************************************************************************************
467 
468  //**Subtraction assignment to sparse matrices***************************************************
469  // No special implementation for the subtraction assignment to sparse matrices.
470  //**********************************************************************************************
471 
472  //**Multiplication assignment to dense matrices*************************************************
473  // No special implementation for the multiplication assignment to dense matrices.
474  //**********************************************************************************************
475 
476  //**Multiplication assignment to sparse matrices************************************************
477  // No special implementation for the multiplication assignment to sparse matrices.
478  //**********************************************************************************************
479 
480  //**Compile time checks*************************************************************************
487  //**********************************************************************************************
488 };
489 //*************************************************************************************************
490 
491 
492 
493 
494 //=================================================================================================
495 //
496 // GLOBAL UNARY ARITHMETIC OPERATORS
497 //
498 //=================================================================================================
499 
500 //*************************************************************************************************
517 template< typename MT // Type of the dense matrix
518  , bool SO > // Storage order
519 inline const DMatScalarMultExpr<MT,typename BaseElementType<MT>::Type,SO>
521 {
522  typedef typename BaseElementType<MT>::Type ElementType;
523  return DMatScalarMultExpr<MT,ElementType,SO>( ~dm, ElementType(-1) );
524 }
525 //*************************************************************************************************
526 
527 
528 
529 
530 //=================================================================================================
531 //
532 // GLOBAL BINARY ARITHMETIC OPERATORS
533 //
534 //=================================================================================================
535 
536 //*************************************************************************************************
557 template< typename T1 // Type of the left-hand side dense matrix
558  , bool SO // Storage order of the left-hand side dense matrix
559  , typename T2 > // Type of the right-hand side scalar
560 inline const typename EnableIf< IsNumeric<T2>, typename MultExprTrait<T1,T2>::Type >::Type
561  operator*( const DenseMatrix<T1,SO>& mat, T2 scalar )
562 {
563  typedef typename MultExprTrait<T1,T2>::Type Type;
564  return Type( ~mat, scalar );
565 }
566 //*************************************************************************************************
567 
568 
569 //*************************************************************************************************
590 template< typename T1 // Type of the left-hand side scalar
591  , typename T2 // Type of the right-hand side dense matrix
592  , bool SO > // Storage order of the right-hand side dense matrix
593 inline const typename EnableIf< IsNumeric<T1>, typename MultExprTrait<T1,T2>::Type >::Type
594  operator*( T1 scalar, const DenseMatrix<T2,SO>& mat )
595 {
596  typedef typename MultExprTrait<T1,T2>::Type Type;
597  return Type( ~mat, scalar );
598 }
599 //*************************************************************************************************
600 
601 
602 
603 
604 //=================================================================================================
605 //
606 // GLOBAL RESTRUCTURING UNARY ARITHMETIC OPERATORS
607 //
608 //=================================================================================================
609 
610 //*************************************************************************************************
622 template< typename VT // Type of the dense matrix
623  , typename ST // Type of the scalar
624  , bool TF > // Transpose flag
625 inline const DMatScalarMultExpr<VT,ST,TF>
626  operator-( const DMatScalarMultExpr<VT,ST,TF>& dm )
627 {
628  return DMatScalarMultExpr<VT,ST,TF>( dm.leftOperand(), -dm.rightOperand() );
629 }
631 //*************************************************************************************************
632 
633 
634 
635 
636 //=================================================================================================
637 //
638 // GLOBAL RESTRUCTURING BINARY ARITHMETIC OPERATORS
639 //
640 //=================================================================================================
641 
642 //*************************************************************************************************
655 template< typename MT // Type of the dense matrix of the left-hand side expression
656  , typename ST1 // Type of the scalar of the left-hand side expression
657  , bool SO // Storage order of the dense matrix
658  , typename ST2 > // Type of the right-hand side scalar
659 inline const typename EnableIf< IsNumeric<ST2>
660  , typename MultExprTrait< DMatScalarMultExpr<MT,ST1,SO>, ST2 >::Type >::Type
661  operator*( const DMatScalarMultExpr<MT,ST1,SO>& mat, ST2 scalar )
662 {
663  return mat.leftOperand() * ( mat.rightOperand() * scalar );
664 }
666 //*************************************************************************************************
667 
668 
669 //*************************************************************************************************
682 template< typename ST1 // Type of the left-hand side scalar
683  , typename MT // Type of the dense matrix of the right-hand side expression
684  , typename ST2 // Type of the scalar of the right-hand side expression
685  , bool SO > // Storage order of the dense matrix
686 inline const typename EnableIf< IsNumeric<ST1>
687  , typename MultExprTrait< ST1, DMatScalarMultExpr<MT,ST2,SO> >::Type >::Type
688  operator*( ST1 scalar, const DMatScalarMultExpr<MT,ST2,SO>& mat )
689 {
690  return mat.leftOperand() * ( scalar * mat.rightOperand() );
691 }
693 //*************************************************************************************************
694 
695 
696 //*************************************************************************************************
709 template< typename MT // Type of the dense matrix of the left-hand side expression
710  , typename ST1 // Type of the scalar of the left-hand side expression
711  , bool SO // Storage order of the dense matrix
712  , typename ST2 > // Type of the right-hand side scalar
713 inline const typename EnableIf< IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>
714  , typename DivExprTrait< DMatScalarMultExpr<MT,ST1,SO>, ST2 >::Type >::Type
715  operator/( const DMatScalarMultExpr<MT,ST1,SO>& mat, ST2 scalar )
716 {
717  return mat.leftOperand() * ( mat.rightOperand() / scalar );
718 }
720 //*************************************************************************************************
721 
722 
723 //*************************************************************************************************
737 template< typename MT // Type of the dense matrix of the left-hand side expression
738  , typename ST // Type of the scalar of the left-hand side expression
739  , bool SO // Storage order of the left-hand side expression
740  , typename VT > // Type of the right-hand side dense vector
741 inline const typename MultExprTrait< DMatScalarMultExpr<MT,ST,SO>, VT >::Type
742  operator*( const DMatScalarMultExpr<MT,ST,SO>& mat, const DenseVector<VT,false>& vec )
743 {
744  return ( mat.leftOperand() * (~vec) ) * mat.rightOperand();
745 }
747 //*************************************************************************************************
748 
749 
750 //*************************************************************************************************
764 template< typename VT // Type of the left-hand side dense vector
765  , typename MT // Type of the dense matrix of the right-hand side expression
766  , typename ST // Type of the scalar of the right-hand side expression
767  , bool SO > // Storage order of the right-hand side expression
768 inline const typename MultExprTrait< VT, DMatScalarMultExpr<MT,ST,SO> >::Type
769  operator*( const DenseVector<VT,true>& vec, const DMatScalarMultExpr<MT,ST,SO>& mat )
770 {
771  return ( (~vec) * mat.leftOperand() ) * mat.rightOperand();
772 }
774 //*************************************************************************************************
775 
776 
777 //*************************************************************************************************
793 template< typename MT // Type of the dense matrix of the left-hand side expression
794  , typename ST1 // Type of the scalar of the left-hand side expression
795  , bool SO // Storage order of the left-hand side expression
796  , typename VT // Type of the dense vector of the right-hand side expression
797  , typename ST2 > // Type of the scalar of the right-hand side expression
798 inline const DVecScalarMultExpr<typename MultExprTrait<MT,VT>::Type,typename MultTrait<ST1,ST2>::Type,false>
799  operator*( const DMatScalarMultExpr<MT,ST1,SO>& mat, const DVecScalarMultExpr<VT,ST2,false>& vec )
800 {
801  return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
802 }
804 //*************************************************************************************************
805 
806 
807 //*************************************************************************************************
823 template< typename VT // Type of the dense vector of the left-hand side expression
824  , typename ST1 // Type of the scalar of the left-hand side expression
825  , typename MT // Type of the dense matrix of the right-hand side expression
826  , typename ST2 // Type of the scalar of the right-hand side expression
827  , bool SO > // Storage order of the right-hand side expression
828 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,SO> >::Type
829  operator*( const DVecScalarMultExpr<VT,ST1,true>& vec, const DMatScalarMultExpr<MT,ST2,SO>& mat )
830 {
831  return ( vec.leftOperand() * mat.leftOperand() ) * ( vec.rightOperand() * mat.rightOperand() );
832 }
834 //*************************************************************************************************
835 
836 
837 //*************************************************************************************************
851 template< typename MT // Type of the dense matrix of the left-hand side expression
852  , typename ST // Type of the scalar of the left-hand side expression
853  , bool SO // Storage order of the left-hand side expression
854  , typename VT > // Type of the right-hand side sparse vector
855 inline const typename MultExprTrait< DMatScalarMultExpr<MT,ST,SO>, VT >::Type
856  operator*( const DMatScalarMultExpr<MT,ST,SO>& mat, const SparseVector<VT,false>& vec )
857 {
858  return ( mat.leftOperand() * (~vec) ) * mat.rightOperand();
859 }
861 //*************************************************************************************************
862 
863 
864 //*************************************************************************************************
878 template< typename VT // Type of the left-hand side sparse vector
879  , typename MT // Type of the dense matrix of the right-hand side expression
880  , typename ST // Type of the scalar of the right-hand side expression
881  , bool SO > // Storage order of the right-hand side expression
882 inline const typename MultExprTrait< VT, DMatScalarMultExpr<MT,ST,SO> >::Type
883  operator*( const SparseVector<VT,true>& vec, const DMatScalarMultExpr<MT,ST,SO>& mat )
884 {
885  return ( (~vec) * mat.leftOperand() ) * mat.rightOperand();
886 }
888 //*************************************************************************************************
889 
890 
891 //*************************************************************************************************
907 template< typename MT // Type of the dense matrix of the left-hand side expression
908  , typename ST1 // Type of the scalar of the left-hand side expression
909  , bool SO // Storage order of the left-hand side expression
910  , typename VT // Type of the sparse vector of the right-hand side expression
911  , typename ST2 > // Type of the scalar of the right-hand side expression
912 inline const typename MultExprTrait< DMatScalarMultExpr<MT,ST1,SO>, SVecScalarMultExpr<VT,ST2,false> >::Type
913  operator*( const DMatScalarMultExpr<MT,ST1,SO>& mat, const SVecScalarMultExpr<VT,ST2,false>& vec )
914 {
915  return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
916 }
918 //*************************************************************************************************
919 
920 
921 //*************************************************************************************************
937 template< typename VT // Type of the sparse vector of the left-hand side expression
938  , typename ST1 // Type of the scalar of the left-hand side expression
939  , typename MT // Type of the dense matrix of the right-hand side expression
940  , typename ST2 // Type of the scalar of the right-hand side expression
941  , bool SO > // Storage order of the right-hand side expression
942 inline const typename MultExprTrait< SVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,SO> >::Type
943  operator*( const SVecScalarMultExpr<VT,ST1,true>& vec, const DMatScalarMultExpr<MT,ST2,SO>& mat )
944 {
945  return ( vec.leftOperand() * mat.leftOperand() ) * ( vec.rightOperand() * mat.rightOperand() );
946 }
948 //*************************************************************************************************
949 
950 
951 //*************************************************************************************************
965 template< typename MT1 // Type of the dense matrix of the left-hand side expression
966  , typename ST // Type of the scalar of the left-hand side expression
967  , bool SO1 // Storage order of the left-hand side expression
968  , typename MT2 // Type of the right-hand side dense matrix
969  , bool SO2 > // Storage order of the right-hand side dense matrix
970 inline const typename MultExprTrait< DMatScalarMultExpr<MT1,ST,SO1>, MT2 >::Type
971  operator*( const DMatScalarMultExpr<MT1,ST,SO1>& lhs, const DenseMatrix<MT2,SO2>& rhs )
972 {
973  return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
974 }
976 //*************************************************************************************************
977 
978 
979 //*************************************************************************************************
993 template< typename MT1 // Type of the left-hand side dense matrix
994  , bool SO1 // Storage order of the left-hand side dense matrix
995  , typename MT2 // Type of the dense matrix of the right-hand side expression
996  , typename ST // Type of the scalar of the right-hand side expression
997  , bool SO2 > // Storage order of the right-hand side expression
998 inline const typename MultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,SO2> >::Type
999  operator*( const DenseMatrix<MT1,SO1>& lhs, const DMatScalarMultExpr<MT2,ST,SO2>& rhs )
1000 {
1001  return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1002 }
1004 //*************************************************************************************************
1005 
1006 
1007 //*************************************************************************************************
1021 template< typename MT1 // Type of the dense matrix of the left-hand side expression
1022  , typename ST1 // Type of the scalar of the left-hand side expression
1023  , bool SO1 // Storage order of the left-hand side expression
1024  , typename MT2 // Type of the right-hand side dense matrix
1025  , typename ST2 // Type of the scalar of the right-hand side expression
1026  , bool SO2 > // Storage order of the right-hand side expression
1027 inline const typename MultExprTrait< DMatScalarMultExpr<MT1,ST1,SO1>, DMatScalarMultExpr<MT2,ST2,SO2> >::Type
1028  operator*( const DMatScalarMultExpr<MT1,ST1,SO1>& lhs, const DMatScalarMultExpr<MT2,ST2,SO2>& rhs )
1029 {
1030  return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1031 }
1033 //*************************************************************************************************
1034 
1035 
1036 //*************************************************************************************************
1050 template< typename MT1 // Type of the dense matrix of the left-hand side expression
1051  , typename ST // Type of the scalar of the left-hand side expression
1052  , bool SO1 // Storage order of the left-hand side expression
1053  , typename MT2 // Type of the right-hand side sparse matrix
1054  , bool SO2 > // Storage order of the right-hand side sparse matrix
1055 inline const typename MultExprTrait< DMatScalarMultExpr<MT1,ST,SO1>, MT2 >::Type
1056  operator*( const DMatScalarMultExpr<MT1,ST,SO1>& lhs, const SparseMatrix<MT2,SO2>& rhs )
1057 {
1058  return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1059 }
1061 //*************************************************************************************************
1062 
1063 
1064 //*************************************************************************************************
1078 template< typename MT1 // Type of the left-hand side sparse matrix
1079  , bool SO1 // Storage order of the left-hand side sparse matrix
1080  , typename MT2 // Type of the dense matrix of the right-hand side expression
1081  , typename ST // Type of the scalar of the right-hand side expression
1082  , bool SO2 > // Storage order of the right-hand side expression
1083 inline const typename MultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,SO2> >::Type
1084  operator*( const SparseMatrix<MT1,SO1>& lhs, const DMatScalarMultExpr<MT2,ST,SO2>& rhs )
1085 {
1086  return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1087 }
1089 //*************************************************************************************************
1090 
1091 
1092 //*************************************************************************************************
1107 template< typename MT1 // Type of the dense matrix of the left-hand side expression
1108  , typename ST1 // Type of the scalar of the left-hand side expression
1109  , bool SO1 // Storage order of the left-hand side expression
1110  , typename MT2 // Type of the sparse matrix of the right-hand side expression
1111  , typename ST2 // Type of the scalar of the right-hand side expression
1112  , bool SO2 > // Storage order of the right-hand side expression
1113 inline const typename MultExprTrait< DMatScalarMultExpr<MT1,ST1,SO1>, SMatScalarMultExpr<MT2,ST2,SO2> >::Type
1114  operator*( const DMatScalarMultExpr<MT1,ST1,SO1>& mat, const SMatScalarMultExpr<MT2,ST2,SO2>& vec )
1115 {
1116  return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
1117 }
1119 //*************************************************************************************************
1120 
1121 
1122 //*************************************************************************************************
1137 template< typename MT1 // Type of the sparse matrix of the left-hand side expression
1138  , typename ST1 // Type of the scalar of the left-hand side expression
1139  , bool SO1 // Storage order of the left-hand side expression
1140  , typename MT2 // Type of the dense matrix of the right-hand side expression
1141  , typename ST2 // Type of the scalar of the right-hand side expression
1142  , bool SO2 > // Storage order of the right-hand side expression
1143 inline const typename MultExprTrait< SMatScalarMultExpr<MT1,ST1,SO1>, DMatScalarMultExpr<MT2,ST2,SO2> >::Type
1144  operator*( const SMatScalarMultExpr<MT1,ST1,SO1>& mat, const DMatScalarMultExpr<MT2,ST2,SO2>& vec )
1145 {
1146  return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
1147 }
1149 //*************************************************************************************************
1150 
1151 
1152 
1153 
1154 //=================================================================================================
1155 //
1156 // DMATSCALARMULTEXPRTRAIT SPECIALIZATIONS
1157 //
1158 //=================================================================================================
1159 
1160 //*************************************************************************************************
1162 template< typename MT, typename ST1, typename ST2 >
1163 struct DMatScalarMultExprTrait< DMatScalarMultExpr<MT,ST1,false>, ST2 >
1164 {
1165  public:
1166  //**********************************************************************************************
1167  typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1168  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1169  , typename DMatScalarMultExprTrait<MT,typename MultTrait<ST1,ST2>::Type>::Type
1170  , INVALID_TYPE >::Type Type;
1171  //**********************************************************************************************
1172 };
1174 //*************************************************************************************************
1175 
1176 
1177 
1178 
1179 //=================================================================================================
1180 //
1181 // TDMATSCALARMULTEXPRTRAIT SPECIALIZATIONS
1182 //
1183 //=================================================================================================
1184 
1185 //*************************************************************************************************
1187 template< typename MT, typename ST1, typename ST2 >
1188 struct TDMatScalarMultExprTrait< DMatScalarMultExpr<MT,ST1,true>, ST2 >
1189 {
1190  public:
1191  //**********************************************************************************************
1192  typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1193  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1194  , typename TDMatScalarMultExprTrait<MT,typename MultTrait<ST1,ST2>::Type>::Type
1195  , INVALID_TYPE >::Type Type;
1196  //**********************************************************************************************
1197 };
1199 //*************************************************************************************************
1200 
1201 
1202 
1203 
1204 //=================================================================================================
1205 //
1206 // DMATSCALARDIVEXPRTRAIT SPECIALIZATIONS
1207 //
1208 //=================================================================================================
1209 
1210 //*************************************************************************************************
1212 template< typename MT, typename ST1, typename ST2 >
1213 struct DMatScalarDivExprTrait< DMatScalarMultExpr<MT,ST1,false>, ST2 >
1214 {
1215  private:
1216  //**********************************************************************************************
1217  enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1218  //**********************************************************************************************
1219 
1220  //**********************************************************************************************
1221  typedef typename DMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1222  typedef typename DMatScalarDivExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1223  //**********************************************************************************************
1224 
1225  public:
1226  //**********************************************************************************************
1227  typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1228  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1229  , typename SelectType<condition,T1,T2>::Type
1230  , INVALID_TYPE >::Type Type;
1231  //**********************************************************************************************
1232 };
1234 //*************************************************************************************************
1235 
1236 
1237 
1238 
1239 //=================================================================================================
1240 //
1241 // TDMATSCALARDIVEXPRTRAIT SPECIALIZATIONS
1242 //
1243 //=================================================================================================
1244 
1245 //*************************************************************************************************
1247 template< typename MT, typename ST1, typename ST2 >
1248 struct TDMatScalarDivExprTrait< DMatScalarMultExpr<MT,ST1,true>, ST2 >
1249 {
1250  private:
1251  //**********************************************************************************************
1252  enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1253  //**********************************************************************************************
1254 
1255  //**********************************************************************************************
1256  typedef typename TDMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1257  typedef typename TDMatScalarDivExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1258  //**********************************************************************************************
1259 
1260  public:
1261  //**********************************************************************************************
1262  typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1263  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1264  , typename SelectType<condition,T1,T2>::Type
1265  , INVALID_TYPE >::Type Type;
1266  //**********************************************************************************************
1267 };
1269 //*************************************************************************************************
1270 
1271 
1272 
1273 
1274 //=================================================================================================
1275 //
1276 // DMATDVECMULTEXPRTRAIT SPECIALIZATIONS
1277 //
1278 //=================================================================================================
1279 
1280 //*************************************************************************************************
1282 template< typename MT, typename ST, typename VT >
1283 struct DMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST,false>, VT >
1284 {
1285  public:
1286  //**********************************************************************************************
1287  typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1288  IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1289  IsNumeric<ST>::value
1290  , typename DVecScalarMultExprTrait<typename DMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1291  , INVALID_TYPE >::Type Type;
1292  //**********************************************************************************************
1293 };
1295 //*************************************************************************************************
1296 
1297 
1298 //*************************************************************************************************
1300 template< typename MT, typename ST1, typename VT, typename ST2 >
1301 struct DMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST1,false>, DVecScalarMultExpr<VT,ST2,false> >
1302 {
1303  public:
1304  //**********************************************************************************************
1305  typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1306  IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1307  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1308  , typename DVecScalarMultExprTrait<typename DMatDVecMultExprTrait<MT,VT>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1309  , INVALID_TYPE >::Type Type;
1310  //**********************************************************************************************
1311 };
1313 //*************************************************************************************************
1314 
1315 
1316 
1317 
1318 //=================================================================================================
1319 //
1320 // TDMATDVECMULTEXPRTRAIT SPECIALIZATIONS
1321 //
1322 //=================================================================================================
1323 
1324 //*************************************************************************************************
1326 template< typename MT, typename ST, typename VT >
1327 struct TDMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST,true>, VT >
1328 {
1329  public:
1330  //**********************************************************************************************
1331  typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1332  IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1333  IsNumeric<ST>::value
1334  , typename DVecScalarMultExprTrait<typename TDMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1335  , INVALID_TYPE >::Type Type;
1336  //**********************************************************************************************
1337 };
1339 //*************************************************************************************************
1340 
1341 
1342 //*************************************************************************************************
1344 template< typename MT, typename ST1, typename VT, typename ST2 >
1345 struct TDMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST1,true>, DVecScalarMultExpr<VT,ST2,false> >
1346 {
1347  public:
1348  //**********************************************************************************************
1349  typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1350  IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1351  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1352  , typename DVecScalarMultExprTrait<typename TDMatDVecMultExprTrait<MT,VT>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1353  , INVALID_TYPE >::Type Type;
1354  //**********************************************************************************************
1355 };
1357 //*************************************************************************************************
1358 
1359 
1360 
1361 
1362 //=================================================================================================
1363 //
1364 // TDVECDMATMULTEXPRTRAIT SPECIALIZATIONS
1365 //
1366 //=================================================================================================
1367 
1368 //*************************************************************************************************
1370 template< typename VT, typename MT, typename ST >
1371 struct TDVecDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,false> >
1372 {
1373  public:
1374  //**********************************************************************************************
1375  typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1376  IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1377  IsNumeric<ST>::value
1378  , typename TDVecScalarMultExprTrait<typename TDVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
1379  , INVALID_TYPE >::Type Type;
1380  //**********************************************************************************************
1381 };
1383 //*************************************************************************************************
1384 
1385 
1386 //*************************************************************************************************
1388 template< typename VT, typename ST1, typename MT, typename ST2 >
1389 struct TDVecDMatMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,false> >
1390 {
1391  public:
1392  //**********************************************************************************************
1393  typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1394  IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1395  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1396  , typename TDVecScalarMultExprTrait<typename TDVecDMatMultExprTrait<VT,MT>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1397  , INVALID_TYPE >::Type Type;
1398  //**********************************************************************************************
1399 };
1401 //*************************************************************************************************
1402 
1403 
1404 
1405 
1406 //=================================================================================================
1407 //
1408 // TDVECTDMATMULTEXPRTRAIT SPECIALIZATIONS
1409 //
1410 //=================================================================================================
1411 
1412 //*************************************************************************************************
1414 template< typename VT, typename MT, typename ST >
1415 struct TDVecTDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,true> >
1416 {
1417  public:
1418  //**********************************************************************************************
1419  typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1420  IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1421  IsNumeric<ST>::value
1422  , typename TDVecScalarMultExprTrait<typename TDVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
1423  , INVALID_TYPE >::Type Type;
1424  //**********************************************************************************************
1425 };
1427 //*************************************************************************************************
1428 
1429 
1430 //*************************************************************************************************
1432 template< typename VT, typename ST1, typename MT, typename ST2 >
1433 struct TDVecTDMatMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,true> >
1434 {
1435  public:
1436  //**********************************************************************************************
1437  typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1438  IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1439  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1440  , typename TDVecScalarMultExprTrait<typename TDVecTDMatMultExprTrait<VT,MT>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1441  , INVALID_TYPE >::Type Type;
1442  //**********************************************************************************************
1443 };
1445 //*************************************************************************************************
1446 
1447 
1448 
1449 
1450 //=================================================================================================
1451 //
1452 // DMATSVECMULTEXPRTRAIT SPECIALIZATIONS
1453 //
1454 //=================================================================================================
1455 
1456 //*************************************************************************************************
1458 template< typename MT, typename ST, typename VT >
1459 struct DMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST,false>, VT >
1460 {
1461  public:
1462  //**********************************************************************************************
1463  typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1464  IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1465  IsNumeric<ST>::value
1466  , typename DVecScalarMultExprTrait<typename DMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1467  , INVALID_TYPE >::Type Type;
1468  //**********************************************************************************************
1469 };
1471 //*************************************************************************************************
1472 
1473 
1474 //*************************************************************************************************
1476 template< typename MT, typename ST1, typename VT, typename ST2 >
1477 struct DMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST1,false>, SVecScalarMultExpr<VT,ST2,false> >
1478 {
1479  public:
1480  //**********************************************************************************************
1481  typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1482  IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1483  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1484  , typename DVecScalarMultExprTrait<typename DMatSVecMultExprTrait<MT,VT>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1485  , INVALID_TYPE >::Type Type;
1486  //**********************************************************************************************
1487 };
1489 //*************************************************************************************************
1490 
1491 
1492 
1493 
1494 //=================================================================================================
1495 //
1496 // TDMATSVECMULTEXPRTRAIT SPECIALIZATIONS
1497 //
1498 //=================================================================================================
1499 
1500 //*************************************************************************************************
1502 template< typename MT, typename ST, typename VT >
1503 struct TDMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST,true>, VT >
1504 {
1505  public:
1506  //**********************************************************************************************
1507  typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1508  IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1509  IsNumeric<ST>::value
1510  , typename DVecScalarMultExprTrait<typename TDMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1511  , INVALID_TYPE >::Type Type;
1512  //**********************************************************************************************
1513 };
1515 //*************************************************************************************************
1516 
1517 
1518 //*************************************************************************************************
1520 template< typename MT, typename ST1, typename VT, typename ST2 >
1521 struct TDMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST1,true>, SVecScalarMultExpr<VT,ST2,false> >
1522 {
1523  public:
1524  //**********************************************************************************************
1525  typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1526  IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1527  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1528  , typename DVecScalarMultExprTrait<typename TDMatSVecMultExprTrait<MT,VT>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1529  , INVALID_TYPE >::Type Type;
1530  //**********************************************************************************************
1531 };
1533 //*************************************************************************************************
1534 
1535 
1536 
1537 
1538 //=================================================================================================
1539 //
1540 // TSVECDMATMULTEXPRTRAIT SPECIALIZATIONS
1541 //
1542 //=================================================================================================
1543 
1544 //*************************************************************************************************
1546 template< typename VT, typename MT, typename ST >
1547 struct TSVecDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,false> >
1548 {
1549  public:
1550  //**********************************************************************************************
1551  typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1552  IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1553  IsNumeric<ST>::value
1554  , typename TDVecScalarMultExprTrait<typename TSVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
1555  , INVALID_TYPE >::Type Type;
1556  //**********************************************************************************************
1557 };
1559 //*************************************************************************************************
1560 
1561 
1562 //*************************************************************************************************
1564 template< typename VT, typename ST1, typename MT, typename ST2 >
1565 struct TSVecDMatMultExprTrait< SVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,false> >
1566 {
1567  public:
1568  //**********************************************************************************************
1569  typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1570  IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1571  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1572  , typename TDVecScalarMultExprTrait<typename TSVecDMatMultExprTrait<VT,MT>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1573  , INVALID_TYPE >::Type Type;
1574  //**********************************************************************************************
1575 };
1577 //*************************************************************************************************
1578 
1579 
1580 
1581 
1582 //=================================================================================================
1583 //
1584 // TSVECTDMATMULTEXPRTRAIT SPECIALIZATIONS
1585 //
1586 //=================================================================================================
1587 
1588 //*************************************************************************************************
1590 template< typename VT, typename MT, typename ST >
1591 struct TSVecTDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,true> >
1592 {
1593  public:
1594  //**********************************************************************************************
1595  typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1596  IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1597  IsNumeric<ST>::value
1598  , typename TDVecScalarMultExprTrait<typename TSVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
1599  , INVALID_TYPE >::Type Type;
1600  //**********************************************************************************************
1601 };
1603 //*************************************************************************************************
1604 
1605 
1606 //*************************************************************************************************
1608 template< typename VT, typename ST1, typename MT, typename ST2 >
1609 struct TSVecTDMatMultExprTrait< SVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,true> >
1610 {
1611  public:
1612  //**********************************************************************************************
1613  typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1614  IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1615  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1616  , typename TDVecScalarMultExprTrait<typename TSVecTDMatMultExprTrait<VT,MT>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1617  , INVALID_TYPE >::Type Type;
1618  //**********************************************************************************************
1619 };
1621 //*************************************************************************************************
1622 
1623 
1624 
1625 
1626 //=================================================================================================
1627 //
1628 // DMATDMATMULTEXPRTRAIT SPECIALIZATIONS
1629 //
1630 //=================================================================================================
1631 
1632 //*************************************************************************************************
1634 template< typename MT1, typename ST, typename MT2 >
1635 struct DMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
1636 {
1637  public:
1638  //**********************************************************************************************
1639  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1640  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1641  IsNumeric<ST>::value
1642  , typename DMatScalarMultExprTrait<typename DMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1643  , INVALID_TYPE >::Type Type;
1644  //**********************************************************************************************
1645 };
1647 //*************************************************************************************************
1648 
1649 
1650 //*************************************************************************************************
1652 template< typename MT1, typename MT2, typename ST >
1653 struct DMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
1654 {
1655  public:
1656  //**********************************************************************************************
1657  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1658  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1659  IsNumeric<ST>::value
1660  , typename DMatScalarMultExprTrait<typename DMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1661  , INVALID_TYPE >::Type Type;
1662  //**********************************************************************************************
1663 };
1665 //*************************************************************************************************
1666 
1667 
1668 //*************************************************************************************************
1670 template< typename MT1, typename ST1, typename MT2, typename ST2 >
1671 struct DMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,false> >
1672 {
1673  public:
1674  //**********************************************************************************************
1675  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1676  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1677  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1678  , typename DMatScalarMultExprTrait<typename DMatDMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1679  , INVALID_TYPE >::Type Type;
1680  //**********************************************************************************************
1681 };
1683 //*************************************************************************************************
1684 
1685 
1686 
1687 
1688 //=================================================================================================
1689 //
1690 // DMATTDMATMULTEXPRTRAIT SPECIALIZATIONS
1691 //
1692 //=================================================================================================
1693 
1694 //*************************************************************************************************
1696 template< typename MT1, typename ST, typename MT2 >
1697 struct DMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
1698 {
1699  public:
1700  //**********************************************************************************************
1701  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1702  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1703  IsNumeric<ST>::value
1704  , typename DMatScalarMultExprTrait<typename DMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1705  , INVALID_TYPE >::Type Type;
1706  //**********************************************************************************************
1707 };
1709 //*************************************************************************************************
1710 
1711 
1712 //*************************************************************************************************
1714 template< typename MT1, typename MT2, typename ST >
1715 struct DMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
1716 {
1717  public:
1718  //**********************************************************************************************
1719  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1720  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1721  IsNumeric<ST>::value
1722  , typename DMatScalarMultExprTrait<typename DMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1723  , INVALID_TYPE >::Type Type;
1724  //**********************************************************************************************
1725 };
1727 //*************************************************************************************************
1728 
1729 
1730 //*************************************************************************************************
1732 template< typename MT1, typename ST1, typename MT2, typename ST2 >
1733 struct DMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,true> >
1734 {
1735  public:
1736  //**********************************************************************************************
1737  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1738  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1739  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1740  , typename DMatScalarMultExprTrait<typename DMatTDMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1741  , INVALID_TYPE >::Type Type;
1742  //**********************************************************************************************
1743 };
1745 //*************************************************************************************************
1746 
1747 
1748 
1749 
1750 //=================================================================================================
1751 //
1752 // TDMATDMATMULTEXPRTRAIT SPECIALIZATIONS
1753 //
1754 //=================================================================================================
1755 
1756 //*************************************************************************************************
1758 template< typename MT1, typename ST, typename MT2 >
1759 struct TDMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
1760 {
1761  public:
1762  //**********************************************************************************************
1763  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1764  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1765  IsNumeric<ST>::value
1766  , typename TDMatScalarMultExprTrait<typename TDMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1767  , INVALID_TYPE >::Type Type;
1768  //**********************************************************************************************
1769 };
1771 //*************************************************************************************************
1772 
1773 
1774 //*************************************************************************************************
1776 template< typename MT1, typename MT2, typename ST >
1777 struct TDMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
1778 {
1779  public:
1780  //**********************************************************************************************
1781  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1782  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1783  IsNumeric<ST>::value
1784  , typename TDMatScalarMultExprTrait<typename TDMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1785  , INVALID_TYPE >::Type Type;
1786  //**********************************************************************************************
1787 };
1789 //*************************************************************************************************
1790 
1791 
1792 //*************************************************************************************************
1794 template< typename MT1, typename ST1, typename MT2, typename ST2 >
1795 struct TDMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,false> >
1796 {
1797  public:
1798  //**********************************************************************************************
1799  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1800  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1801  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1802  , typename TDMatScalarMultExprTrait<typename TDMatDMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1803  , INVALID_TYPE >::Type Type;
1804  //**********************************************************************************************
1805 };
1807 //*************************************************************************************************
1808 
1809 
1810 
1811 
1812 //=================================================================================================
1813 //
1814 // TDMATTDMATMULTEXPRTRAIT SPECIALIZATIONS
1815 //
1816 //=================================================================================================
1817 
1818 //*************************************************************************************************
1820 template< typename MT1, typename ST, typename MT2 >
1821 struct TDMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
1822 {
1823  public:
1824  //**********************************************************************************************
1825  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1826  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1827  IsNumeric<ST>::value
1828  , typename TDMatScalarMultExprTrait<typename TDMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1829  , INVALID_TYPE >::Type Type;
1830  //**********************************************************************************************
1831 };
1833 //*************************************************************************************************
1834 
1835 
1836 //*************************************************************************************************
1838 template< typename MT1, typename MT2, typename ST >
1839 struct TDMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
1840 {
1841  public:
1842  //**********************************************************************************************
1843  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1844  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1845  IsNumeric<ST>::value
1846  , typename TDMatScalarMultExprTrait<typename TDMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1847  , INVALID_TYPE >::Type Type;
1848  //**********************************************************************************************
1849 };
1851 //*************************************************************************************************
1852 
1853 
1854 //*************************************************************************************************
1856 template< typename MT1, typename ST1, typename MT2, typename ST2 >
1857 struct TDMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,true> >
1858 {
1859  public:
1860  //**********************************************************************************************
1861  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1862  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1863  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1864  , typename TDMatScalarMultExprTrait<typename TDMatTDMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1865  , INVALID_TYPE >::Type Type;
1866  //**********************************************************************************************
1867 };
1869 //*************************************************************************************************
1870 
1871 
1872 
1873 
1874 //=================================================================================================
1875 //
1876 // DMATSMATMULTEXPRTRAIT SPECIALIZATIONS
1877 //
1878 //=================================================================================================
1879 
1880 //*************************************************************************************************
1882 template< typename MT1, typename ST, typename MT2 >
1883 struct DMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
1884 {
1885  public:
1886  //**********************************************************************************************
1887  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1888  IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1889  IsNumeric<ST>::value
1890  , typename DMatScalarMultExprTrait<typename DMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1891  , INVALID_TYPE >::Type Type;
1892  //**********************************************************************************************
1893 };
1895 //*************************************************************************************************
1896 
1897 
1898 //*************************************************************************************************
1900 template< typename MT1, typename ST1, typename MT2, typename ST2 >
1901 struct DMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, SMatScalarMultExpr<MT2,ST2,false> >
1902 {
1903  public:
1904  //**********************************************************************************************
1905  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1906  IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1907  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1908  , typename DMatScalarMultExprTrait<typename DMatSMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1909  , INVALID_TYPE >::Type Type;
1910  //**********************************************************************************************
1911 };
1913 //*************************************************************************************************
1914 
1915 
1916 
1917 
1918 //=================================================================================================
1919 //
1920 // DMATTSMATMULTEXPRTRAIT SPECIALIZATIONS
1921 //
1922 //=================================================================================================
1923 
1924 //*************************************************************************************************
1926 template< typename MT1, typename ST, typename MT2 >
1927 struct DMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
1928 {
1929  public:
1930  //**********************************************************************************************
1931  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1932  IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1933  IsNumeric<ST>::value
1934  , typename DMatScalarMultExprTrait<typename DMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1935  , INVALID_TYPE >::Type Type;
1936  //**********************************************************************************************
1937 };
1939 //*************************************************************************************************
1940 
1941 
1942 //*************************************************************************************************
1944 template< typename MT1, typename ST1, typename MT2, typename ST2 >
1945 struct DMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, SMatScalarMultExpr<MT2,ST2,true> >
1946 {
1947  public:
1948  //**********************************************************************************************
1949  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1950  IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1951  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1952  , typename DMatScalarMultExprTrait<typename DMatTSMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1953  , INVALID_TYPE >::Type Type;
1954  //**********************************************************************************************
1955 };
1957 //*************************************************************************************************
1958 
1959 
1960 
1961 
1962 //=================================================================================================
1963 //
1964 // TDMATSMATMULTEXPRTRAIT SPECIALIZATIONS
1965 //
1966 //=================================================================================================
1967 
1968 //*************************************************************************************************
1970 template< typename MT1, typename ST, typename MT2 >
1971 struct TDMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
1972 {
1973  public:
1974  //**********************************************************************************************
1975  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1976  IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1977  IsNumeric<ST>::value
1978  , typename TDMatScalarMultExprTrait<typename TDMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1979  , INVALID_TYPE >::Type Type;
1980  //**********************************************************************************************
1981 };
1983 //*************************************************************************************************
1984 
1985 
1986 //*************************************************************************************************
1988 template< typename MT1, typename ST1, typename MT2, typename ST2 >
1989 struct TDMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, SMatScalarMultExpr<MT2,ST2,false> >
1990 {
1991  public:
1992  //**********************************************************************************************
1993  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1994  IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1995  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1996  , typename TDMatScalarMultExprTrait<typename TDMatSMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1997  , INVALID_TYPE >::Type Type;
1998  //**********************************************************************************************
1999 };
2001 //*************************************************************************************************
2002 
2003 
2004 
2005 
2006 //=================================================================================================
2007 //
2008 // TDMATTSMATMULTEXPRTRAIT SPECIALIZATIONS
2009 //
2010 //=================================================================================================
2011 
2012 //*************************************************************************************************
2014 template< typename MT1, typename ST, typename MT2 >
2015 struct TDMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
2016 {
2017  public:
2018  //**********************************************************************************************
2019  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2020  IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2021  IsNumeric<ST>::value
2022  , typename TDMatScalarMultExprTrait<typename TDMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2023  , INVALID_TYPE >::Type Type;
2024  //**********************************************************************************************
2025 };
2027 //*************************************************************************************************
2028 
2029 
2030 //*************************************************************************************************
2032 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2033 struct TDMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, SMatScalarMultExpr<MT2,ST2,true> >
2034 {
2035  public:
2036  //**********************************************************************************************
2037  typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2038  IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2039  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2040  , typename TDMatScalarMultExprTrait<typename TDMatTSMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2041  , INVALID_TYPE >::Type Type;
2042  //**********************************************************************************************
2043 };
2045 //*************************************************************************************************
2046 
2047 
2048 
2049 
2050 //=================================================================================================
2051 //
2052 // SMATDMATMULTEXPRTRAIT SPECIALIZATIONS
2053 //
2054 //=================================================================================================
2055 
2056 //*************************************************************************************************
2058 template< typename MT1, typename ST, typename MT2 >
2059 struct SMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
2060 {
2061  public:
2062  //**********************************************************************************************
2063  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2064  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2065  IsNumeric<ST>::value
2066  , typename DMatScalarMultExprTrait<typename SMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2067  , INVALID_TYPE >::Type Type;
2068  //**********************************************************************************************
2069 };
2071 //*************************************************************************************************
2072 
2073 
2074 //*************************************************************************************************
2076 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2077 struct SMatDMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,false> >
2078 {
2079  public:
2080  //**********************************************************************************************
2081  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2082  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2083  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2084  , typename DMatScalarMultExprTrait<typename SMatDMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2085  , INVALID_TYPE >::Type Type;
2086  //**********************************************************************************************
2087 };
2089 //*************************************************************************************************
2090 
2091 
2092 
2093 
2094 //=================================================================================================
2095 //
2096 // SMATTDMATMULTEXPRTRAIT SPECIALIZATIONS
2097 //
2098 //=================================================================================================
2099 
2100 //*************************************************************************************************
2102 template< typename MT1, typename ST, typename MT2 >
2103 struct SMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
2104 {
2105  public:
2106  //**********************************************************************************************
2107  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2108  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2109  IsNumeric<ST>::value
2110  , typename DMatScalarMultExprTrait<typename SMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2111  , INVALID_TYPE >::Type Type;
2112  //**********************************************************************************************
2113 };
2115 //*************************************************************************************************
2116 
2117 
2118 //*************************************************************************************************
2120 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2121 struct SMatTDMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,true> >
2122 {
2123  public:
2124  //**********************************************************************************************
2125  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2126  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2127  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2128  , typename DMatScalarMultExprTrait<typename SMatTDMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2129  , INVALID_TYPE >::Type Type;
2130  //**********************************************************************************************
2131 };
2133 //*************************************************************************************************
2134 
2135 
2136 
2137 
2138 //=================================================================================================
2139 //
2140 // TSMATDMATMULTEXPRTRAIT SPECIALIZATIONS
2141 //
2142 //=================================================================================================
2143 
2144 //*************************************************************************************************
2146 template< typename MT1, typename ST, typename MT2 >
2147 struct TSMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
2148 {
2149  public:
2150  //**********************************************************************************************
2151  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2152  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2153  IsNumeric<ST>::value
2154  , typename TDMatScalarMultExprTrait<typename TSMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2155  , INVALID_TYPE >::Type Type;
2156  //**********************************************************************************************
2157 };
2159 //*************************************************************************************************
2160 
2161 
2162 //*************************************************************************************************
2164 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2165 struct TSMatDMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,false> >
2166 {
2167  public:
2168  //**********************************************************************************************
2169  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2170  IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2171  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2172  , typename TDMatScalarMultExprTrait<typename TSMatDMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2173  , INVALID_TYPE >::Type Type;
2174  //**********************************************************************************************
2175 };
2177 //*************************************************************************************************
2178 
2179 
2180 
2181 
2182 //=================================================================================================
2183 //
2184 // TSMATTDMATMULTEXPRTRAIT SPECIALIZATIONS
2185 //
2186 //=================================================================================================
2187 
2188 //*************************************************************************************************
2190 template< typename MT1, typename ST, typename MT2 >
2191 struct TSMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
2192 {
2193  public:
2194  //**********************************************************************************************
2195  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2196  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2197  IsNumeric<ST>::value
2198  , typename TDMatScalarMultExprTrait<typename TSMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2199  , INVALID_TYPE >::Type Type;
2200  //**********************************************************************************************
2201 };
2203 //*************************************************************************************************
2204 
2205 
2206 //*************************************************************************************************
2208 template< typename MT1, typename ST1, typename MT2, typename ST2 >
2209 struct TSMatTDMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,true> >
2210 {
2211  public:
2212  //**********************************************************************************************
2213  typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2214  IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2215  IsNumeric<ST1>::value && IsNumeric<ST2>::value
2216  , typename TDMatScalarMultExprTrait<typename TSMatTDMatMultExprTrait<MT1,MT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
2217  , INVALID_TYPE >::Type Type;
2218  //**********************************************************************************************
2219 };
2221 //*************************************************************************************************
2222 
2223 } // namespace blaze
2224 
2225 #endif