All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SVecScalarMultExpr.h
Go to the documentation of this file.
1 //=================================================================================================
20 //=================================================================================================
21 
22 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECSCALARMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SVECSCALARMULTEXPR_H_
24 
25 
26 //*************************************************************************************************
27 // Includes
28 //*************************************************************************************************
29 
30 #include <iterator>
31 #include <boost/type_traits/remove_reference.hpp>
56 #include <blaze/util/Assert.h>
60 #include <blaze/util/EnableIf.h>
61 #include <blaze/util/InvalidType.h>
62 #include <blaze/util/SelectType.h>
63 #include <blaze/util/Types.h>
66 
67 
68 namespace blaze {
69 
70 //=================================================================================================
71 //
72 // CLASS SVECSCALARMULTEXPR
73 //
74 //=================================================================================================
75 
76 //*************************************************************************************************
83 template< typename VT // Type of the left-hand side sparse vector
84  , typename ST // Type of the right-hand side scalar value
85  , bool TF > // Transpose flag
86 class SVecScalarMultExpr : public SparseVector< SVecScalarMultExpr<VT,ST,TF>, TF >
87  , private Expression
88  , private Computation
89 {
90  private:
91  //**Type definitions****************************************************************************
92  typedef typename VT::ResultType RT;
93  typedef typename VT::ReturnType RN;
94  typedef typename VT::CompositeType CT;
95  //**********************************************************************************************
96 
97  //**Return type evaluation**********************************************************************
99 
104  enum { returnExpr = !IsTemporary<RN>::value };
105 
108  //**********************************************************************************************
109 
110  //**Evaluation strategy*************************************************************************
112 
118  enum { useAssign = RequiresEvaluation<VT>::value };
119 
121 
122  template< typename VT2 >
123  struct UseAssign {
124  enum { value = useAssign };
125  };
127  //**********************************************************************************************
128 
129  public:
130  //**Type definitions****************************************************************************
133  typedef typename ResultType::TransposeType TransposeType;
134  typedef typename ResultType::ElementType ElementType;
135 
138 
141 
143  typedef typename SelectType< IsExpression<VT>::value, const VT, const VT& >::Type LeftOperand;
144 
147  //**********************************************************************************************
148 
149  //**Compilation flags***************************************************************************
152  //**********************************************************************************************
153 
154  //**ConstIterator class definition**************************************************************
158  {
159  public:
160  //**Type definitions*************************************************************************
163 
165  typedef typename boost::remove_reference<LeftOperand>::type::ConstIterator IteratorType;
166 
167  typedef std::forward_iterator_tag IteratorCategory;
168  typedef Element ValueType;
172 
173  // STL iterator requirements
179  //*******************************************************************************************
180 
181  //**Constructor******************************************************************************
184  inline ConstIterator( IteratorType vector, RightOperand scalar )
185  : vector_( vector ) // Iterator over the elements of the left-hand side sparse vector expression
186  , scalar_( scalar ) // Right-hand side scalar of the multiplication expression
187  {}
188  //*******************************************************************************************
189 
190  //**Prefix increment operator****************************************************************
196  ++vector_;
197  return *this;
198  }
199  //*******************************************************************************************
200 
201  //**Element access operator******************************************************************
206  inline const Element operator*() const {
207  return Element( vector_->value() * scalar_, vector_->index() );
208  }
209  //*******************************************************************************************
210 
211  //**Element access operator******************************************************************
216  inline const ConstIterator* operator->() const {
217  return this;
218  }
219  //*******************************************************************************************
220 
221  //**Value function***************************************************************************
226  inline ReturnType value() const {
227  return vector_->value() * scalar_;
228  }
229  //*******************************************************************************************
230 
231  //**Index function***************************************************************************
236  inline size_t index() const {
237  return vector_->index();
238  }
239  //*******************************************************************************************
240 
241  //**Equality operator************************************************************************
247  inline bool operator==( const ConstIterator& rhs ) const {
248  return vector_ == rhs.vector_;
249  }
250  //*******************************************************************************************
251 
252  //**Inequality operator**********************************************************************
258  inline bool operator!=( const ConstIterator& rhs ) const {
259  return vector_ != rhs.vector_;
260  }
261  //*******************************************************************************************
262 
263  //**Subtraction operator*********************************************************************
269  inline DifferenceType operator-( const ConstIterator& rhs ) const {
270  return vector_ - rhs.vector_;
271  }
272  //*******************************************************************************************
273 
274  private:
275  //**Member variables*************************************************************************
278  //*******************************************************************************************
279  };
280  //**********************************************************************************************
281 
282  //**Constructor*********************************************************************************
288  explicit inline SVecScalarMultExpr( const VT& vector, ST scalar )
289  : vector_( vector ) // Left-hand side sparse vector of the multiplication expression
290  , scalar_( scalar ) // Right-hand side scalar of the multiplication expression
291  {}
292  //**********************************************************************************************
293 
294  //**Subscript operator**************************************************************************
300  inline ReturnType operator[]( size_t index ) const {
301  BLAZE_INTERNAL_ASSERT( index < vector_.size(), "Invalid vector access index" );
302  return vector_[index] * scalar_;
303  }
304  //**********************************************************************************************
305 
306  //**Begin function******************************************************************************
311  inline ConstIterator begin() const {
312  return ConstIterator( vector_.begin(), scalar_ );
313  }
314  //**********************************************************************************************
315 
316  //**End function********************************************************************************
321  inline ConstIterator end() const {
322  return ConstIterator( vector_.end(), scalar_ );
323  }
324  //**********************************************************************************************
325 
326  //**Size function*******************************************************************************
331  inline size_t size() const {
332  return vector_.size();
333  }
334  //**********************************************************************************************
335 
336  //**NonZeros function***************************************************************************
341  inline size_t nonZeros() const {
342  return vector_.nonZeros();
343  }
344  //**********************************************************************************************
345 
346  //**Left operand access*************************************************************************
351  inline LeftOperand leftOperand() const {
352  return vector_;
353  }
354  //**********************************************************************************************
355 
356  //**Right operand access************************************************************************
361  inline RightOperand rightOperand() const {
362  return scalar_;
363  }
364  //**********************************************************************************************
365 
366  //**********************************************************************************************
372  template< typename T >
373  inline bool isAliased( const T* alias ) const {
375  !RequiresEvaluation<VT>::value && vector_.isAliased( alias );
376  }
377  //**********************************************************************************************
378 
379  private:
380  //**Member variables****************************************************************************
383  //**********************************************************************************************
384 
385  //**Assignment to dense vectors*****************************************************************
399  template< typename VT2 > // Type of the target dense vector
400  friend inline typename EnableIf< UseAssign<VT2> >::Type
401  assign( DenseVector<VT2,TF>& lhs, const SVecScalarMultExpr& rhs )
402  {
403  BLAZE_INTERNAL_ASSERT( (~lhs).size() == rhs.size(), "Invalid vector sizes" );
404 
405  assign( ~lhs, rhs.vector_ );
406 
407  const size_t size( rhs.size() );
408  for( size_t i=0UL; i<size; ++i )
409  (~lhs)[i] *= rhs.scalar_;
410  }
412  //**********************************************************************************************
413 
414  //**Assignment to sparse vectors****************************************************************
428  template< typename VT2 > // Type of the target sparse vector
429  friend inline typename EnableIf< UseAssign<VT2> >::Type
431  {
432  BLAZE_INTERNAL_ASSERT( (~lhs).size() == rhs.size(), "Invalid vector sizes" );
433 
434  assign( ~lhs, rhs.vector_ );
435 
436  typename VT2::Iterator begin( (~lhs).begin() );
437  const typename VT2::Iterator end( (~lhs).end() );
438 
439  for( ; begin!=end; ++begin )
440  begin->value() *= rhs.scalar_;
441  }
443  //**********************************************************************************************
444 
445  //**Addition assignment to dense vectors********************************************************
459  template< typename VT2 > // Type of the target dense vector
460  friend inline typename EnableIf< UseAssign<VT2> >::Type
461  addAssign( DenseVector<VT2,TF>& lhs, const SVecScalarMultExpr& rhs )
462  {
465  BLAZE_CONSTRAINT_MUST_BE_REFERENCE_TYPE( typename ResultType::CompositeType );
466 
467  BLAZE_INTERNAL_ASSERT( (~lhs).size() == rhs.size(), "Invalid vector sizes" );
468 
469  const ResultType tmp( rhs );
470  addAssign( ~lhs, tmp );
471  }
473  //**********************************************************************************************
474 
475  //**Addition assignment to sparse vectors*******************************************************
476  // No special implementation for the addition assignment to sparse vectors.
477  //**********************************************************************************************
478 
479  //**Subtraction assignment to dense vectors*****************************************************
493  template< typename VT2 > // Type of the target dense vector
494  friend inline typename EnableIf< UseAssign<VT2> >::Type
495  subAssign( DenseVector<VT2,TF>& lhs, const SVecScalarMultExpr& rhs )
496  {
499  BLAZE_CONSTRAINT_MUST_BE_REFERENCE_TYPE( typename ResultType::CompositeType );
500 
501  BLAZE_INTERNAL_ASSERT( (~lhs).size() == rhs.size(), "Invalid vector sizes" );
502 
503  const ResultType tmp( rhs );
504  subAssign( ~lhs, tmp );
505  }
507  //**********************************************************************************************
508 
509  //**Subtraction assignment to sparse vectors****************************************************
510  // No special implementation for the subtraction assignment to sparse vectors.
511  //**********************************************************************************************
512 
513  //**Multiplication assignment to dense vectors**************************************************
527  template< typename VT2 > // Type of the target dense vector
528  friend inline typename EnableIf< UseAssign<VT2> >::Type
529  multAssign( DenseVector<VT2,TF>& lhs, const SVecScalarMultExpr& rhs )
530  {
533  BLAZE_CONSTRAINT_MUST_BE_REFERENCE_TYPE( typename ResultType::CompositeType );
534 
535  BLAZE_INTERNAL_ASSERT( (~lhs).size() == rhs.size(), "Invalid vector sizes" );
536 
537  const ResultType tmp( rhs );
538  multAssign( ~lhs, tmp );
539  }
541  //**********************************************************************************************
542 
543  //**Multiplication assignment to sparse vectors*************************************************
544  // No special implementation for the multiplication assignment to sparse vectors.
545  //**********************************************************************************************
546 
547  //**Compile time checks*************************************************************************
554  //**********************************************************************************************
555 };
556 //*************************************************************************************************
557 
558 
559 
560 
561 //=================================================================================================
562 //
563 // GLOBAL UNARY ARITHMETIC OPERATORS
564 //
565 //=================================================================================================
566 
567 //*************************************************************************************************
584 template< typename VT // Type of the sparse vector
585  , bool TF > // Transpose flag
588 {
589  typedef typename BaseElementType<VT>::Type ElementType;
591 }
592 //*************************************************************************************************
593 
594 
595 
596 
597 //=================================================================================================
598 //
599 // GLOBAL BINARY ARITHMETIC OPERATORS
600 //
601 //=================================================================================================
602 
603 //*************************************************************************************************
624 template< typename T1 // Type of the left-hand side sparse vector
625  , typename T2 // Type of the right-hand side scalar
626  , bool TF > // Transpose flag
627 inline const typename EnableIf< IsNumeric<T2>, typename MultExprTrait<T1,T2>::Type >::Type
628  operator*( const SparseVector<T1,TF>& vec, T2 scalar )
629 {
630  typedef typename MultExprTrait<T1,T2>::Type Type;
631  return Type( ~vec, scalar );
632 }
633 //*************************************************************************************************
634 
635 
636 //*************************************************************************************************
657 template< typename T1 // Type of the left-hand side scalar
658  , typename T2 // Type of the right-hand side sparse vector
659  , bool TF > // Transpose flag
660 inline const typename EnableIf< IsNumeric<T1>, typename MultExprTrait<T1,T2>::Type >::Type
661  operator*( T1 scalar, const SparseVector<T2,TF>& vec )
662 {
663  typedef typename MultExprTrait<T1,T2>::Type Type;
664  return Type( ~vec, scalar );
665 }
666 //*************************************************************************************************
667 
668 
669 
670 
671 //=================================================================================================
672 //
673 // GLOBAL RESTRUCTURING UNARY ARITHMETIC OPERATORS
674 //
675 //=================================================================================================
676 
677 //*************************************************************************************************
689 template< typename VT // Type of the sparse vector
690  , typename ST // Type of the scalar
691  , bool TF > // Transpose flag
692 inline const SVecScalarMultExpr<VT,ST,TF>
694 {
695  return SVecScalarMultExpr<VT,ST,TF>( sv.leftOperand(), -sv.rightOperand() );
696 }
698 //*************************************************************************************************
699 
700 
701 
702 
703 //=================================================================================================
704 //
705 // GLOBAL RESTRUCTURING BINARY ARITHMETIC OPERATORS
706 //
707 //=================================================================================================
708 
709 //*************************************************************************************************
722 template< typename VT // Type of the sparse vector of the left-hand side expression
723  , typename ST1 // Type of the scalar of the left-hand side expression
724  , bool TF // Transpose flag of the sparse vector
725  , typename ST2 > // Type of the right-hand side scalar
726 inline const typename EnableIf< IsNumeric<ST2>
727  , typename MultExprTrait< SVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
728  operator*( const SVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
729 {
730  return vec.leftOperand() * ( vec.rightOperand() * scalar );
731 }
733 //*************************************************************************************************
734 
735 
736 //*************************************************************************************************
749 template< typename ST1 // Type of the left-hand side scalar
750  , typename VT // Type of the sparse vector of the right-hand side expression
751  , typename ST2 // Type of the scalar of the right-hand side expression
752  , bool TF > // Transpose flag of the sparse vector
753 inline const typename EnableIf< IsNumeric<ST1>
754  , typename MultExprTrait< ST1, SVecScalarMultExpr<VT,ST2,TF> >::Type >::Type
755  operator*( ST1 scalar, const SVecScalarMultExpr<VT,ST2,TF>& vec )
756 {
757  return vec.leftOperand() * ( scalar * vec.rightOperand() );
758 }
760 //*************************************************************************************************
761 
762 
763 //*************************************************************************************************
776 template< typename VT // Type of the dense vector of the left-hand side expression
777  , typename ST1 // Type of the scalar of the left-hand side expression
778  , bool TF // Transpose flag of the dense vector
779  , typename ST2 > // Type of the right-hand side scalar
780 inline const typename EnableIf< IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>
781  , typename DivExprTrait< SVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
782  operator/( const SVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
783 {
784  return vec.leftOperand() * ( vec.rightOperand() / scalar );
785 }
787 //*************************************************************************************************
788 
789 
790 //*************************************************************************************************
804 template< typename VT1 // Type of the sparse vector of the left-hand side expression
805  , typename ST // Type of the scalar of the left-hand side expression
806  , bool TF // Transpose flag of the dense vectors
807  , typename VT2 > // Type of the right-hand side dense vector
808 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
809  operator*( const SVecScalarMultExpr<VT1,ST,TF>& lhs, const DenseVector<VT2,TF>& rhs )
810 {
811  return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
812 }
814 //*************************************************************************************************
815 
816 
817 //*************************************************************************************************
831 template< typename VT1 // Type of the left-hand side dense vector
832  , bool TF // Transpose flag of the dense vectors
833  , typename VT2 // Type of the sparse vector of the right-hand side expression
834  , typename ST > // Type of the scalar of the right-hand side expression
835 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,TF> >::Type
836  operator*( const DenseVector<VT1,TF>& lhs, const SVecScalarMultExpr<VT2,ST,TF>& rhs )
837 {
838  return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
839 }
841 //*************************************************************************************************
842 
843 
844 //*************************************************************************************************
858 template< typename VT1 // Type of the sparse vector of the left-hand side expression
859  , typename ST // Type of the scalar of the left-hand side expression
860  , typename VT2 > // Type of the right-hand side dense vector
861 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
862  operator*( const SVecScalarMultExpr<VT1,ST,false>& lhs, const DenseVector<VT2,true>& rhs )
863 {
864  return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
865 }
867 //*************************************************************************************************
868 
869 
870 //*************************************************************************************************
884 template< typename VT1 // Type of the left-hand side dense vector
885  , typename VT2 // Type of the sparse vector of the right-hand side expression
886  , typename ST > // Type of the scalar of the right-hand side expression
887 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >::Type
888  operator*( const DenseVector<VT1,false>& lhs, const SVecScalarMultExpr<VT2,ST,true>& rhs )
889 {
890  return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
891 }
893 //*************************************************************************************************
894 
895 
896 //*************************************************************************************************
910 template< typename VT1 // Type of the sparse vector of the left-hand side expression
911  , typename ST // Type of the scalar of the left-hand side expression
912  , bool TF // Transpose flag of the vectors
913  , typename VT2 > // Type of the right-hand side sparse vector
914 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
916 {
917  return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
918 }
920 //*************************************************************************************************
921 
922 
923 //*************************************************************************************************
937 template< typename VT1 // Type of the left-hand side sparse vector
938  , bool TF // Transpose flag of the vectors
939  , typename VT2 // Type of the sparse vector of the right-hand side expression
940  , typename ST > // Type of the scalar of the right-hand side expression
941 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,TF> >::Type
943 {
944  return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
945 }
947 //*************************************************************************************************
948 
949 
950 //*************************************************************************************************
964 template< typename VT1 // Type of the sparse vector of the left-hand side expression
965  , typename ST1 // Type of the scalar of the left-hand side expression
966  , bool TF // Transpose flag of the sparse vectors
967  , typename VT2 // Type of the sparse vector of the right-hand side expression
968  , typename ST2 > // Type of the scalar of the right-hand side expression
969 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,TF>, SVecScalarMultExpr<VT2,ST2,TF> >::Type
971 {
972  return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
973 }
975 //*************************************************************************************************
976 
977 
978 //*************************************************************************************************
992 template< typename VT1 // Type of the sparse vector of the left-hand side expression
993  , typename ST // Type of the scalar of the left-hand side expression
994  , typename VT2 > // Type of the right-hand side sparse vector
995 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
997 {
998  return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
999 }
1001 //*************************************************************************************************
1002 
1003 
1004 //*************************************************************************************************
1018 template< typename VT1 // Type of the left-hand side sparse vector
1019  , typename VT2 // Type of the sparse vector of the right-hand side expression
1020  , typename ST > // Type of the scalar of the right-hand side expression
1021 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >::Type
1023 {
1024  return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1025 }
1027 //*************************************************************************************************
1028 
1029 
1030 //*************************************************************************************************
1044 template< typename VT1 // Type of the sparse vector of the left-hand side expression
1045  , typename ST1 // Type of the scalar of the left-hand side expression
1046  , typename VT2 // Type of the sparse vector of the right-hand side expression
1047  , typename ST2 > // Type of the scalar of the right-hand side expression
1048 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >::Type
1050 {
1051  return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1052 }
1054 //*************************************************************************************************
1055 
1056 
1057 //*************************************************************************************************
1071 template< typename MT // Type of the left-hand side dense matrix
1072  , bool SO // Storage order of the left-hand side dense matrix
1073  , typename VT // Type of the sparse vector of the right-hand side expression
1074  , typename ST > // Type of the scalar of the right-hand side expression
1075 inline const typename MultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >::Type
1076  operator*( const DenseMatrix<MT,SO>& mat, const SVecScalarMultExpr<VT,ST,false>& vec )
1077 {
1078  return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1079 }
1081 //*************************************************************************************************
1082 
1083 
1084 //*************************************************************************************************
1098 template< typename VT // Type of the sparse vector of the left-hand side expression
1099  , typename ST // Type of the scalar of the left-hand side expression
1100  , typename MT // Type of the right-hand side dense matrix
1101  , bool SO > // Storage order of the right-hand side dense matrix
1102 inline const typename MultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >::Type
1103  operator*( const SVecScalarMultExpr<VT,ST,true>& vec, const DenseMatrix<MT,SO>& mat )
1104 {
1105  return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1106 }
1108 //*************************************************************************************************
1109 
1110 
1111 //*************************************************************************************************
1125 template< typename MT // Type of the left-hand side sparse matrix
1126  , bool SO // Storage order of the left-hand side sparse matrix
1127  , typename VT // Type of the sparse vector of the right-hand side expression
1128  , typename ST > // Type of the scalar of the right-hand side expression
1129 inline const typename MultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >::Type
1131 {
1132  return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1133 }
1135 //*************************************************************************************************
1136 
1137 
1138 //*************************************************************************************************
1152 template< typename VT // Type of the sparse vector of the left-hand side expression
1153  , typename ST // Type of the scalar of the left-hand side expression
1154  , typename MT // Type of the right-hand side sparse matrix
1155  , bool SO > // Storage order of the right-hand side sparse matrix
1156 inline const typename MultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >::Type
1158 {
1159  return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1160 }
1162 //*************************************************************************************************
1163 
1164 
1165 
1166 
1167 //=================================================================================================
1168 //
1169 // SVECSCALARMULTEXPRTRAIT SPECIALIZATIONS
1170 //
1171 //=================================================================================================
1172 
1173 //*************************************************************************************************
1175 template< typename VT, typename ST1, typename ST2 >
1176 struct SVecScalarMultExprTrait< SVecScalarMultExpr<VT,ST1,false>, ST2 >
1177 {
1178  public:
1179  //**********************************************************************************************
1180  typedef typename SelectType< IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1181  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1182  , typename SVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1183  , INVALID_TYPE >::Type Type;
1184  //**********************************************************************************************
1185 };
1187 //*************************************************************************************************
1188 
1189 
1190 
1191 
1192 //=================================================================================================
1193 //
1194 // TSVECSCALARMULTEXPRTRAIT SPECIALIZATIONS
1195 //
1196 //=================================================================================================
1197 
1198 //*************************************************************************************************
1200 template< typename VT, typename ST1, typename ST2 >
1201 struct TSVecScalarMultExprTrait< SVecScalarMultExpr<VT,ST1,true>, ST2 >
1202 {
1203  public:
1204  //**********************************************************************************************
1205  typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1206  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1207  , typename TSVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1208  , INVALID_TYPE >::Type Type;
1209  //**********************************************************************************************
1210 };
1212 //*************************************************************************************************
1213 
1214 
1215 
1216 
1217 //=================================================================================================
1218 //
1219 // SVECSCALARDIVEXPRTRAIT SPECIALIZATIONS
1220 //
1221 //=================================================================================================
1222 
1223 //*************************************************************************************************
1225 template< typename VT, typename ST1, typename ST2 >
1226 struct SVecScalarDivExprTrait< SVecScalarMultExpr<VT,ST1,false>, ST2 >
1227 {
1228  private:
1229  //**********************************************************************************************
1230  enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1231  //**********************************************************************************************
1232 
1233  //**********************************************************************************************
1234  typedef typename SVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1235  typedef typename SVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1236  //**********************************************************************************************
1237 
1238  public:
1239  //**********************************************************************************************
1240  typedef typename SelectType< IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1241  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1242  , typename SelectType<condition,T1,T2>::Type
1243  , INVALID_TYPE >::Type Type;
1244  //**********************************************************************************************
1245 };
1247 //*************************************************************************************************
1248 
1249 
1250 
1251 
1252 //=================================================================================================
1253 //
1254 // TSVECSCALARDIVEXPRTRAIT SPECIALIZATIONS
1255 //
1256 //=================================================================================================
1257 
1258 //*************************************************************************************************
1260 template< typename VT, typename ST1, typename ST2 >
1261 struct TSVecScalarDivExprTrait< SVecScalarMultExpr<VT,ST1,true>, ST2 >
1262 {
1263  private:
1264  //**********************************************************************************************
1265  enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1266  //**********************************************************************************************
1267 
1268  //**********************************************************************************************
1269  typedef typename TSVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1270  typedef typename TSVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1271  //**********************************************************************************************
1272 
1273  public:
1274  //**********************************************************************************************
1275  typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1276  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1277  , typename SelectType<condition,T1,T2>::Type
1278  , INVALID_TYPE >::Type Type;
1279  //**********************************************************************************************
1280 };
1282 //*************************************************************************************************
1283 
1284 
1285 
1286 
1287 //=================================================================================================
1288 //
1289 // DVECSVECMULTEXPRTRAIT SPECIALIZATIONS
1290 //
1291 //=================================================================================================
1292 
1293 //*************************************************************************************************
1295 template< typename VT1, typename VT2, typename ST >
1296 struct DVecSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,false> >
1297 {
1298  public:
1299  //**********************************************************************************************
1300  typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1301  IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1302  IsNumeric<ST>::value
1303  , typename SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1304  , INVALID_TYPE >::Type Type;
1305  //**********************************************************************************************
1306 };
1308 //*************************************************************************************************
1309 
1310 
1311 
1312 
1313 //=================================================================================================
1314 //
1315 // DVECTSVECMULTEXPRTRAIT SPECIALIZATIONS
1316 //
1317 //=================================================================================================
1318 
1319 //*************************************************************************************************
1321 template< typename VT1, typename VT2, typename ST >
1322 struct DVecTSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >
1323 {
1324  public:
1325  //**********************************************************************************************
1326  typedef typename SelectType< IsDenseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1327  IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1328  IsNumeric<ST>::value
1329  , typename SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1330  , INVALID_TYPE >::Type Type;
1331  //**********************************************************************************************
1332 };
1334 //*************************************************************************************************
1335 
1336 
1337 
1338 
1339 //=================================================================================================
1340 //
1341 // TDVECTSVECMULTEXPRTRAIT SPECIALIZATIONS
1342 //
1343 //=================================================================================================
1344 
1345 //*************************************************************************************************
1347 template< typename VT1, typename VT2, typename ST >
1348 struct TDVecTSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >
1349 {
1350  public:
1351  //**********************************************************************************************
1352  typedef typename SelectType< IsDenseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1353  IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1354  IsNumeric<ST>::value
1355  , typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1356  , INVALID_TYPE >::Type Type;
1357  //**********************************************************************************************
1358 };
1360 //*************************************************************************************************
1361 
1362 
1363 
1364 
1365 //=================================================================================================
1366 //
1367 // SVECDVECMULTEXPRTRAIT SPECIALIZATIONS
1368 //
1369 //=================================================================================================
1370 
1371 //*************************************************************************************************
1373 template< typename VT1, typename ST, typename VT2 >
1374 struct SVecDVecMultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >
1375 {
1376  public:
1377  //**********************************************************************************************
1378  typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1379  IsDenseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1380  IsNumeric<ST>::value
1381  , typename SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1382  , INVALID_TYPE >::Type Type;
1383  //**********************************************************************************************
1384 };
1386 //*************************************************************************************************
1387 
1388 
1389 
1390 
1391 //=================================================================================================
1392 //
1393 // SVECTDVECMULTEXPRTRAIT SPECIALIZATIONS
1394 //
1395 //=================================================================================================
1396 
1397 //*************************************************************************************************
1399 template< typename VT1, typename ST, typename VT2 >
1400 struct SVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >
1401 {
1402  public:
1403  //**********************************************************************************************
1404  typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1405  IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1406  IsNumeric<ST>::value
1407  , typename TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1408  , INVALID_TYPE >::Type Type;
1409  //**********************************************************************************************
1410 };
1412 //*************************************************************************************************
1413 
1414 
1415 
1416 
1417 //=================================================================================================
1418 //
1419 // TSVECTDVECMULTEXPRTRAIT SPECIALIZATIONS
1420 //
1421 //=================================================================================================
1422 
1423 //*************************************************************************************************
1425 template< typename VT1, typename ST, typename VT2 >
1426 struct TSVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST,true>, VT2 >
1427 {
1428  public:
1429  //**********************************************************************************************
1430  typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1431  IsDenseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1432  IsNumeric<ST>::value
1433  , typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1434  , INVALID_TYPE >::Type Type;
1435  //**********************************************************************************************
1436 };
1438 //*************************************************************************************************
1439 
1440 
1441 
1442 
1443 //=================================================================================================
1444 //
1445 // SVECSVECMULTEXPRTRAIT SPECIALIZATIONS
1446 //
1447 //=================================================================================================
1448 
1449 //*************************************************************************************************
1451 template< typename VT1, typename ST, typename VT2 >
1452 struct SVecSVecMultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >
1453 {
1454  public:
1455  //**********************************************************************************************
1456  typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1457  IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1458  IsNumeric<ST>::value
1459  , typename SVecScalarMultExprTrait<typename SVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1460  , INVALID_TYPE >::Type Type;
1461  //**********************************************************************************************
1462 };
1464 //*************************************************************************************************
1465 
1466 
1467 //*************************************************************************************************
1469 template< typename VT1, typename VT2, typename ST >
1470 struct SVecSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,false> >
1471 {
1472  public:
1473  //**********************************************************************************************
1474  typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1475  IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1476  IsNumeric<ST>::value
1477  , typename SVecScalarMultExprTrait<typename SVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1478  , INVALID_TYPE >::Type Type;
1479  //**********************************************************************************************
1480 };
1482 //*************************************************************************************************
1483 
1484 
1485 //*************************************************************************************************
1487 template< typename VT1, typename ST1, typename VT2, typename ST2 >
1488 struct SVecSVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,false> >
1489 {
1490  public:
1491  //**********************************************************************************************
1492  typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1493  IsSparseVector<VT2>::value && !IsTransposeVector<VT2>::value &&
1494  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1495  , typename SVecScalarMultExprTrait<typename SVecSVecMultExprTrait<VT1,VT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1496  , INVALID_TYPE >::Type Type;
1497  //**********************************************************************************************
1498 };
1500 //*************************************************************************************************
1501 
1502 
1503 
1504 
1505 //=================================================================================================
1506 //
1507 // SVECTSVECMULTEXPRTRAIT SPECIALIZATIONS
1508 //
1509 //=================================================================================================
1510 
1511 //*************************************************************************************************
1513 template< typename VT1, typename ST, typename VT2 >
1514 struct SVecTSVecMultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >
1515 {
1516  public:
1517  //**********************************************************************************************
1518  typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1519  IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1520  IsNumeric<ST>::value
1521  , typename SMatScalarMultExprTrait<typename SVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1522  , INVALID_TYPE >::Type Type;
1523  //**********************************************************************************************
1524 };
1526 //*************************************************************************************************
1527 
1528 
1529 //*************************************************************************************************
1531 template< typename VT1, typename VT2, typename ST >
1532 struct SVecTSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >
1533 {
1534  public:
1535  //**********************************************************************************************
1536  typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1537  IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1538  IsNumeric<ST>::value
1539  , typename SMatScalarMultExprTrait<typename SVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1540  , INVALID_TYPE >::Type Type;
1541  //**********************************************************************************************
1542 };
1544 //*************************************************************************************************
1545 
1546 
1547 //*************************************************************************************************
1549 template< typename VT1, typename ST1, typename VT2, typename ST2 >
1550 struct SVecTSVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >
1551 {
1552  public:
1553  //**********************************************************************************************
1554  typedef typename SelectType< IsSparseVector<VT1>::value && !IsTransposeVector<VT1>::value &&
1555  IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1556  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1557  , typename SMatScalarMultExprTrait<typename SVecTSVecMultExprTrait<VT1,VT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1558  , INVALID_TYPE >::Type Type;
1559  //**********************************************************************************************
1560 };
1562 //*************************************************************************************************
1563 
1564 
1565 
1566 
1567 //=================================================================================================
1568 //
1569 // TSVECTSVECMULTEXPRTRAIT SPECIALIZATIONS
1570 //
1571 //=================================================================================================
1572 
1573 //*************************************************************************************************
1575 template< typename VT1, typename ST, typename VT2 >
1576 struct TSVecTSVecMultExprTrait< SVecScalarMultExpr<VT1,ST,true>, VT2 >
1577 {
1578  public:
1579  //**********************************************************************************************
1580  typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1581  IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1582  IsNumeric<ST>::value
1583  , typename TSVecScalarMultExprTrait<typename TSVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1584  , INVALID_TYPE >::Type Type;
1585  //**********************************************************************************************
1586 };
1588 //*************************************************************************************************
1589 
1590 
1591 //*************************************************************************************************
1593 template< typename VT1, typename VT2, typename ST >
1594 struct TSVecTSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >
1595 {
1596  public:
1597  //**********************************************************************************************
1598  typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1599  IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1600  IsNumeric<ST>::value
1601  , typename TSVecScalarMultExprTrait<typename TSVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1602  , INVALID_TYPE >::Type Type;
1603  //**********************************************************************************************
1604 };
1606 //*************************************************************************************************
1607 
1608 
1609 //*************************************************************************************************
1611 template< typename VT1, typename ST1, typename VT2, typename ST2 >
1612 struct TSVecTSVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,true>, SVecScalarMultExpr<VT2,ST2,true> >
1613 {
1614  public:
1615  //**********************************************************************************************
1616  typedef typename SelectType< IsSparseVector<VT1>::value && IsTransposeVector<VT1>::value &&
1617  IsSparseVector<VT2>::value && IsTransposeVector<VT2>::value &&
1618  IsNumeric<ST1>::value && IsNumeric<ST2>::value
1619  , typename TSVecScalarMultExprTrait<typename TSVecTSVecMultExprTrait<VT1,VT2>::Type,typename MultTrait<ST1,ST2>::Type>::Type
1620  , INVALID_TYPE >::Type Type;
1621  //**********************************************************************************************
1622 };
1624 //*************************************************************************************************
1625 
1626 
1627 
1628 
1629 //=================================================================================================
1630 //
1631 // DMATSVECMULTEXPRTRAIT SPECIALIZATIONS
1632 //
1633 //=================================================================================================
1634 
1635 //*************************************************************************************************
1637 template< typename MT, typename VT, typename ST >
1638 struct DMatSVecMultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >
1639 {
1640  public:
1641  //**********************************************************************************************
1642  typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1643  IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1644  IsNumeric<ST>::value
1645  , typename DVecScalarMultExprTrait<typename DMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1646  , INVALID_TYPE >::Type Type;
1647  //**********************************************************************************************
1648 };
1650 //*************************************************************************************************
1651 
1652 
1653 
1654 
1655 //=================================================================================================
1656 //
1657 // TDMATSVECMULTEXPRTRAIT SPECIALIZATIONS
1658 //
1659 //=================================================================================================
1660 
1661 //*************************************************************************************************
1663 template< typename MT, typename VT, typename ST >
1664 struct TDMatSVecMultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >
1665 {
1666  public:
1667  //**********************************************************************************************
1668  typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1669  IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1670  IsNumeric<ST>::value
1671  , typename DVecScalarMultExprTrait<typename TDMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1672  , INVALID_TYPE >::Type Type;
1673  //**********************************************************************************************
1674 };
1676 //*************************************************************************************************
1677 
1678 
1679 
1680 
1681 //=================================================================================================
1682 //
1683 // TSVECDMATMULTEXPRTRAIT SPECIALIZATIONS
1684 //
1685 //=================================================================================================
1686 
1687 //*************************************************************************************************
1689 template< typename VT, typename ST, typename MT >
1690 struct TSVecDMatMultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >
1691 {
1692  public:
1693  //**********************************************************************************************
1694  typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1695  IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1696  IsNumeric<ST>::value
1697  , typename TDVecScalarMultExprTrait<typename TSVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
1698  , INVALID_TYPE >::Type Type;
1699  //**********************************************************************************************
1700 };
1702 //*************************************************************************************************
1703 
1704 
1705 
1706 
1707 //=================================================================================================
1708 //
1709 // TSVECTDMATMULTEXPRTRAIT SPECIALIZATIONS
1710 //
1711 //=================================================================================================
1712 
1713 //*************************************************************************************************
1715 template< typename VT, typename ST, typename MT >
1716 struct TSVecTDMatMultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >
1717 {
1718  public:
1719  //**********************************************************************************************
1720  typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1721  IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1722  IsNumeric<ST>::value
1723  , typename TDVecScalarMultExprTrait<typename TSVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
1724  , INVALID_TYPE >::Type Type;
1725  //**********************************************************************************************
1726 };
1728 //*************************************************************************************************
1729 
1730 
1731 
1732 
1733 //=================================================================================================
1734 //
1735 // SMATSVECMULTEXPRTRAIT SPECIALIZATIONS
1736 //
1737 //=================================================================================================
1738 
1739 //*************************************************************************************************
1741 template< typename MT, typename VT, typename ST >
1742 struct SMatSVecMultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >
1743 {
1744  public:
1745  //**********************************************************************************************
1746  typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1747  IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1748  IsNumeric<ST>::value
1749  , typename SVecScalarMultExprTrait<typename SMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1750  , INVALID_TYPE >::Type Type;
1751  //**********************************************************************************************
1752 };
1754 //*************************************************************************************************
1755 
1756 
1757 
1758 
1759 //=================================================================================================
1760 //
1761 // TSMATSVECMULTEXPRTRAIT SPECIALIZATIONS
1762 //
1763 //=================================================================================================
1764 
1765 //*************************************************************************************************
1767 template< typename MT, typename VT, typename ST >
1768 struct TSMatSVecMultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >
1769 {
1770  public:
1771  //**********************************************************************************************
1772  typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1773  IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1774  IsNumeric<ST>::value
1775  , typename SVecScalarMultExprTrait<typename TSMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1776  , INVALID_TYPE >::Type Type;
1777  //**********************************************************************************************
1778 };
1780 //*************************************************************************************************
1781 
1782 
1783 
1784 
1785 //=================================================================================================
1786 //
1787 // TSVECSMATMULTEXPRTRAIT SPECIALIZATIONS
1788 //
1789 //=================================================================================================
1790 
1791 //*************************************************************************************************
1793 template< typename VT, typename ST, typename MT >
1794 struct TSVecSMatMultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >
1795 {
1796  public:
1797  //**********************************************************************************************
1798  typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1799  IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1800  IsNumeric<ST>::value
1801  , typename TSVecScalarMultExprTrait<typename TSVecSMatMultExprTrait<VT,MT>::Type,ST>::Type
1802  , INVALID_TYPE >::Type Type;
1803  //**********************************************************************************************
1804 };
1806 //*************************************************************************************************
1807 
1808 
1809 
1810 
1811 //=================================================================================================
1812 //
1813 // TSVECTSMATMULTEXPRTRAIT SPECIALIZATIONS
1814 //
1815 //=================================================================================================
1816 
1817 //*************************************************************************************************
1819 template< typename VT, typename ST, typename MT >
1820 struct TSVecTSMatMultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >
1821 {
1822  public:
1823  //**********************************************************************************************
1824  typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1825  IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1826  IsNumeric<ST>::value
1827  , typename TSVecScalarMultExprTrait<typename TSVecTSMatMultExprTrait<VT,MT>::Type,ST>::Type
1828  , INVALID_TYPE >::Type Type;
1829  //**********************************************************************************************
1830 };
1832 //*************************************************************************************************
1833 
1834 } // namespace blaze
1835 
1836 #endif