22 #ifndef _BLAZE_MATH_EXPRESSIONS_SMATSCALARMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SMATSCALARMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
88 class SMatScalarMultExpr :
public SparseMatrix< SMatScalarMultExpr<MT,ST,SO>, SO >
94 typedef typename MT::ResultType
RT;
95 typedef typename MT::ReturnType
RN;
96 typedef typename MT::CompositeType
CT;
124 template<
typename MT2 >
126 enum { value = useAssign };
163 typedef typename boost::remove_reference<LeftOperand>::type::ConstIterator
IteratorType;
395 template<
typename T >
397 return matrix_.canAlias( alias );
407 template<
typename T >
409 return matrix_.isAliased( alias );
433 template<
typename MT2
443 assign( ~lhs, rhs.matrix_ );
444 (~lhs) *= rhs.scalar_;
463 template<
typename MT2
473 assign( ~lhs, rhs.matrix_ );
474 (~lhs) *= rhs.scalar_;
493 template<
typename MT2
495 friend inline typename EnableIf< UseAssign<MT2> >::Type
530 template<
typename MT2
532 friend inline typename EnableIf< UseAssign<MT2> >::Type
598 template<
typename MT
600 inline const SMatScalarMultExpr<MT,typename BaseElementType<MT>::Type,SO>
640 template<
typename T1
643 inline const typename EnableIf< IsNumeric<T2>,
typename MultExprTrait<T1,T2>::Type >::Type
649 return Type( ~mat, scalar );
675 template<
typename T1
678 inline const typename EnableIf< IsNumeric<T1>,
typename MultExprTrait<T1,T2>::Type >::Type
684 return Type( ~mat, scalar );
709 template<
typename VT
712 inline const SMatScalarMultExpr<VT,ST,TF>
713 operator-(
const SMatScalarMultExpr<VT,ST,TF>& sm )
717 return SMatScalarMultExpr<VT,ST,TF>( sm.leftOperand(), -sm.rightOperand() );
744 template<
typename MT
748 inline const typename EnableIf< IsNumeric<ST2>
749 ,
typename MultExprTrait< SMatScalarMultExpr<MT,ST1,SO>, ST2 >::Type >::Type
750 operator*(
const SMatScalarMultExpr<MT,ST1,SO>& mat, ST2 scalar )
754 return mat.leftOperand() * ( mat.rightOperand() * scalar );
773 template<
typename ST1
777 inline const typename EnableIf< IsNumeric<ST1>
778 ,
typename MultExprTrait< ST1, SMatScalarMultExpr<MT,ST2,SO> >::Type >::Type
779 operator*( ST1 scalar,
const SMatScalarMultExpr<MT,ST2,SO>& mat )
783 return mat.leftOperand() * ( scalar * mat.rightOperand() );
802 template<
typename MT
806 inline const typename EnableIf< IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>
807 ,
typename DivExprTrait< SMatScalarMultExpr<MT,ST1,SO>, ST2 >::Type >::Type
808 operator/(
const SMatScalarMultExpr<MT,ST1,SO>& mat, ST2 scalar )
812 return mat.leftOperand() * ( mat.rightOperand() / scalar );
832 template<
typename MT
836 inline const typename MultExprTrait< SMatScalarMultExpr<MT,ST,SO>, VT >::Type
837 operator*(
const SMatScalarMultExpr<MT,ST,SO>& mat,
const DenseVector<VT,false>& vec )
841 return ( mat.leftOperand() * (~vec) ) * mat.rightOperand();
861 template<
typename VT
865 inline const typename MultExprTrait< VT, SMatScalarMultExpr<MT,ST,SO> >::Type
866 operator*(
const DenseVector<VT,true>& vec,
const SMatScalarMultExpr<MT,ST,SO>& mat )
870 return ( (~vec) * mat.leftOperand() ) * mat.rightOperand();
892 template<
typename MT
897 inline const typename MultExprTrait< SMatScalarMultExpr<MT,ST1,SO>, DVecScalarMultExpr<VT,ST2,false> >::Type
898 operator*(
const SMatScalarMultExpr<MT,ST1,SO>& mat,
const DVecScalarMultExpr<VT,ST2,false>& vec )
902 return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
924 template<
typename VT
929 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST1,true>, SMatScalarMultExpr<MT,ST2,SO> >::Type
930 operator*(
const DVecScalarMultExpr<VT,ST1,true>& vec,
const SMatScalarMultExpr<MT,ST2,SO>& mat )
934 return ( vec.leftOperand() * mat.leftOperand() ) * ( vec.rightOperand() * mat.rightOperand() );
954 template<
typename MT
958 inline const typename MultExprTrait< SMatScalarMultExpr<MT,ST,SO>, VT >::Type
959 operator*(
const SMatScalarMultExpr<MT,ST,SO>& mat,
const SparseVector<VT,false>& vec )
963 return ( mat.leftOperand() * (~vec) ) * mat.rightOperand();
983 template<
typename VT
987 inline const typename MultExprTrait< VT, SMatScalarMultExpr<MT,ST,SO> >::Type
988 operator*(
const SparseVector<VT,true>& vec,
const SMatScalarMultExpr<MT,ST,SO>& mat )
992 return ( (~vec) * mat.leftOperand() ) * mat.rightOperand();
1014 template<
typename MT
1019 inline const typename MultExprTrait< SMatScalarMultExpr<MT,ST1,SO>, SVecScalarMultExpr<VT,ST2,false> >::Type
1020 operator*(
const SMatScalarMultExpr<MT,ST1,SO>& mat,
const SVecScalarMultExpr<VT,ST2,false>& vec )
1024 return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
1046 template<
typename VT
1051 inline const typename MultExprTrait< SVecScalarMultExpr<VT,ST1,true>, SMatScalarMultExpr<MT,ST2,SO> >::Type
1052 operator*(
const SVecScalarMultExpr<VT,ST1,true>& vec,
const SMatScalarMultExpr<MT,ST2,SO>& mat )
1056 return ( vec.leftOperand() * mat.leftOperand() ) * ( vec.rightOperand() * mat.rightOperand() );
1076 template<
typename MT1
1081 inline const typename MultExprTrait< SMatScalarMultExpr<MT1,ST,SO1>, MT2 >::Type
1082 operator*(
const SMatScalarMultExpr<MT1,ST,SO1>& lhs,
const DenseMatrix<MT2,SO2>& rhs )
1086 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1106 template<
typename MT1
1111 inline const typename MultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,SO2> >::Type
1112 operator*(
const DenseMatrix<MT1,SO1>& lhs,
const SMatScalarMultExpr<MT2,ST,SO2>& rhs )
1116 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1136 template<
typename MT1
1141 inline const typename MultExprTrait< SMatScalarMultExpr<MT1,ST,SO1>, MT2 >::Type
1142 operator*(
const SMatScalarMultExpr<MT1,ST,SO1>& lhs,
const SparseMatrix<MT2,SO2>& rhs )
1146 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1166 template<
typename MT1
1171 inline const typename MultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,SO2> >::Type
1172 operator*(
const SparseMatrix<MT1,SO1>& lhs,
const SMatScalarMultExpr<MT2,ST,SO2>& rhs )
1176 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1196 template<
typename MT1
1202 inline const typename MultExprTrait< SMatScalarMultExpr<MT1,ST1,SO1>, SMatScalarMultExpr<MT2,ST2,SO2> >::Type
1203 operator*(
const SMatScalarMultExpr<MT1,ST1,SO1>& lhs,
const SMatScalarMultExpr<MT2,ST2,SO2>& rhs )
1207 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1233 template<
typename MT
1236 inline typename RowExprTrait< SMatScalarMultExpr<MT,ST,SO> >::Type
1237 row(
const SMatScalarMultExpr<MT,ST,SO>& sm,
size_t index )
1241 return row( sm.leftOperand(), index ) * sm.rightOperand();
1259 template<
typename MT
1262 inline typename ColumnExprTrait< SMatScalarMultExpr<MT,ST,SO> >::Type
1263 column(
const SMatScalarMultExpr<MT,ST,SO>& sm,
size_t index )
1267 return column( sm.leftOperand(), index ) * sm.rightOperand();
1283 template<
typename MT,
typename ST1,
typename ST2 >
1284 struct SMatScalarMultExprTrait< SMatScalarMultExpr<MT,ST1,false>, ST2 >
1288 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1289 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1290 ,
typename SMatScalarMultExprTrait<MT,typename MultTrait<ST1,ST2>::Type>::Type
1291 , INVALID_TYPE >::Type Type;
1308 template<
typename MT,
typename ST1,
typename ST2 >
1309 struct TSMatScalarMultExprTrait< SMatScalarMultExpr<MT,ST1,true>, ST2 >
1313 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1314 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1315 ,
typename TSMatScalarMultExprTrait<MT,typename MultTrait<ST1,ST2>::Type>::Type
1316 , INVALID_TYPE >::Type Type;
1333 template<
typename MT,
typename ST1,
typename ST2 >
1334 struct SMatScalarDivExprTrait< SMatScalarMultExpr<MT,ST1,false>, ST2 >
1338 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1342 typedef typename SMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1343 typedef typename SMatScalarDivExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1348 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1349 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1350 ,
typename SelectType<condition,T1,T2>::Type
1351 , INVALID_TYPE >::Type Type;
1368 template<
typename MT,
typename ST1,
typename ST2 >
1369 struct TSMatScalarDivExprTrait< SMatScalarMultExpr<MT,ST1,true>, ST2 >
1373 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1377 typedef typename TSMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1378 typedef typename TSMatScalarDivExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1383 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1384 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1385 ,
typename SelectType<condition,T1,T2>::Type
1386 , INVALID_TYPE >::Type Type;
1403 template<
typename MT,
typename ST,
typename VT >
1404 struct SMatDVecMultExprTrait< SMatScalarMultExpr<MT,ST,false>, VT >
1408 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1409 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1410 IsNumeric<ST>::value
1411 ,
typename DVecScalarMultExprTrait<typename SMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1412 , INVALID_TYPE >::Type Type;
1421 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1422 struct SMatDVecMultExprTrait< SMatScalarMultExpr<MT,ST1,false>, DVecScalarMultExpr<VT,ST2,false> >
1426 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1427 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1428 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1429 ,
typename DVecScalarMultExprTrait<typename SMatDVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1430 , INVALID_TYPE >::Type Type;
1447 template<
typename MT,
typename ST,
typename VT >
1448 struct TSMatDVecMultExprTrait< SMatScalarMultExpr<MT,ST,true>, VT >
1452 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1453 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1454 IsNumeric<ST>::value
1455 ,
typename DVecScalarMultExprTrait<typename TSMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1456 , INVALID_TYPE >::Type Type;
1465 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1466 struct TSMatDVecMultExprTrait< SMatScalarMultExpr<MT,ST1,true>, DVecScalarMultExpr<VT,ST2,false> >
1470 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1471 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1472 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1473 ,
typename DVecScalarMultExprTrait<typename TSMatDVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1474 , INVALID_TYPE >::Type Type;
1491 template<
typename VT,
typename MT,
typename ST >
1492 struct TDVecSMatMultExprTrait< VT, SMatScalarMultExpr<MT,ST,false> >
1496 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1497 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1498 IsNumeric<ST>::value
1499 ,
typename TDVecScalarMultExprTrait<typename TDVecSMatMultExprTrait<VT,MT>::Type,ST>::Type
1500 , INVALID_TYPE >::Type Type;
1509 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1510 struct TDVecSMatMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, SMatScalarMultExpr<MT,ST2,false> >
1514 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1515 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1516 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1517 ,
typename TDVecScalarMultExprTrait<typename TDVecSMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1518 , INVALID_TYPE >::Type Type;
1535 template<
typename VT,
typename MT,
typename ST >
1536 struct TDVecTSMatMultExprTrait< VT, SMatScalarMultExpr<MT,ST,true> >
1540 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1541 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1542 IsNumeric<ST>::value
1543 ,
typename TDVecScalarMultExprTrait<typename TDVecTSMatMultExprTrait<VT,MT>::Type,ST>::Type
1544 , INVALID_TYPE >::Type Type;
1553 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1554 struct TDVecTSMatMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, SMatScalarMultExpr<MT,ST2,true> >
1558 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1559 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1560 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1561 ,
typename TDVecScalarMultExprTrait<typename TDVecTSMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1562 , INVALID_TYPE >::Type Type;
1579 template<
typename MT,
typename ST,
typename VT >
1580 struct SMatSVecMultExprTrait< SMatScalarMultExpr<MT,ST,false>, VT >
1584 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1585 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1586 IsNumeric<ST>::value
1587 ,
typename SVecScalarMultExprTrait<typename SMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1588 , INVALID_TYPE >::Type Type;
1597 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1598 struct SMatSVecMultExprTrait< SMatScalarMultExpr<MT,ST1,false>, SVecScalarMultExpr<VT,ST2,false> >
1602 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1603 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1604 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1605 ,
typename SVecScalarMultExprTrait<typename SMatSVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1606 , INVALID_TYPE >::Type Type;
1623 template<
typename MT,
typename ST,
typename VT >
1624 struct TSMatSVecMultExprTrait< SMatScalarMultExpr<MT,ST,true>, VT >
1628 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1629 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1630 IsNumeric<ST>::value
1631 ,
typename SVecScalarMultExprTrait<typename TSMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1632 , INVALID_TYPE >::Type Type;
1641 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1642 struct TSMatSVecMultExprTrait< SMatScalarMultExpr<MT,ST1,true>, SVecScalarMultExpr<VT,ST2,false> >
1646 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1647 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1648 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1649 ,
typename SVecScalarMultExprTrait<typename TSMatSVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1650 , INVALID_TYPE >::Type Type;
1667 template<
typename VT,
typename MT,
typename ST >
1668 struct TSVecSMatMultExprTrait< VT, SMatScalarMultExpr<MT,ST,false> >
1672 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1673 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1674 IsNumeric<ST>::value
1675 ,
typename TSVecScalarMultExprTrait<typename TSVecSMatMultExprTrait<VT,MT>::Type,ST>::Type
1676 , INVALID_TYPE >::Type Type;
1685 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1686 struct TSVecSMatMultExprTrait< SVecScalarMultExpr<VT,ST1,true>, SMatScalarMultExpr<MT,ST2,false> >
1690 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1691 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1692 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1693 ,
typename TSVecScalarMultExprTrait<typename TSVecSMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1694 , INVALID_TYPE >::Type Type;
1711 template<
typename VT,
typename MT,
typename ST >
1712 struct TSVecTSMatMultExprTrait< VT, SMatScalarMultExpr<MT,ST,true> >
1716 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1717 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1718 IsNumeric<ST>::value
1719 ,
typename TSVecScalarMultExprTrait<typename TSVecTSMatMultExprTrait<VT,MT>::Type,ST>::Type
1720 , INVALID_TYPE >::Type Type;
1729 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1730 struct TSVecTSMatMultExprTrait< SVecScalarMultExpr<VT,ST1,true>, SMatScalarMultExpr<MT,ST2,true> >
1734 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1735 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1736 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1737 ,
typename TSVecScalarMultExprTrait<typename TSVecTSMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1738 , INVALID_TYPE >::Type Type;
1755 template<
typename MT1,
typename MT2,
typename ST >
1756 struct DMatSMatMultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,false> >
1760 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1761 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1762 IsNumeric<ST>::value
1763 ,
typename DMatScalarMultExprTrait<typename DMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1764 , INVALID_TYPE >::Type Type;
1781 template<
typename MT1,
typename MT2,
typename ST >
1782 struct DMatTSMatMultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,true> >
1786 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1787 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1788 IsNumeric<ST>::value
1789 ,
typename DMatScalarMultExprTrait<typename DMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1790 , INVALID_TYPE >::Type Type;
1807 template<
typename MT1,
typename MT2,
typename ST >
1808 struct TDMatSMatMultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,false> >
1812 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1813 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1814 IsNumeric<ST>::value
1815 ,
typename TDMatScalarMultExprTrait<typename TDMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1816 , INVALID_TYPE >::Type Type;
1833 template<
typename MT1,
typename MT2,
typename ST >
1834 struct TDMatTSMatMultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,true> >
1838 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1839 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1840 IsNumeric<ST>::value
1841 ,
typename TDMatScalarMultExprTrait<typename TDMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1842 , INVALID_TYPE >::Type Type;
1859 template<
typename MT1,
typename ST,
typename MT2 >
1860 struct SMatDMatMultExprTrait< SMatScalarMultExpr<MT1,ST,false>, MT2 >
1864 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1865 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1866 IsNumeric<ST>::value
1867 ,
typename DMatScalarMultExprTrait<typename SMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1868 , INVALID_TYPE >::Type Type;
1885 template<
typename MT1,
typename ST,
typename MT2 >
1886 struct SMatTDMatMultExprTrait< SMatScalarMultExpr<MT1,ST,false>, MT2 >
1890 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1891 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1892 IsNumeric<ST>::value
1893 ,
typename DMatScalarMultExprTrait<typename SMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1894 , INVALID_TYPE >::Type Type;
1911 template<
typename MT1,
typename ST,
typename MT2 >
1912 struct TSMatDMatMultExprTrait< SMatScalarMultExpr<MT1,ST,true>, MT2 >
1916 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1917 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1918 IsNumeric<ST>::value
1919 ,
typename TDMatScalarMultExprTrait<typename TSMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1920 , INVALID_TYPE >::Type Type;
1937 template<
typename MT1,
typename ST,
typename MT2 >
1938 struct TSMatTDMatMultExprTrait< SMatScalarMultExpr<MT1,ST,true>, MT2 >
1942 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1943 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1944 IsNumeric<ST>::value
1945 ,
typename TDMatScalarMultExprTrait<typename TSMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1946 , INVALID_TYPE >::Type Type;
1963 template<
typename MT1,
typename ST,
typename MT2 >
1964 struct SMatSMatMultExprTrait< SMatScalarMultExpr<MT1,ST,false>, MT2 >
1968 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1969 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1970 IsNumeric<ST>::value
1971 ,
typename SMatScalarMultExprTrait<typename SMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1972 , INVALID_TYPE >::Type Type;
1981 template<
typename MT1,
typename MT2,
typename ST >
1982 struct SMatSMatMultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,false> >
1986 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1987 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1988 IsNumeric<ST>::value
1989 ,
typename SMatScalarMultExprTrait<typename SMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1990 , INVALID_TYPE >::Type Type;
1999 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2000 struct SMatSMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,false>, SMatScalarMultExpr<MT2,ST2,false> >
2004 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2005 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2006 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2007 ,
typename SMatScalarMultExprTrait<typename SMatSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2008 , INVALID_TYPE >::Type Type;
2025 template<
typename MT1,
typename ST,
typename MT2 >
2026 struct SMatTSMatMultExprTrait< SMatScalarMultExpr<MT1,ST,false>, MT2 >
2030 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2031 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2032 IsNumeric<ST>::value
2033 ,
typename SMatScalarMultExprTrait<typename SMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2034 , INVALID_TYPE >::Type Type;
2043 template<
typename MT1,
typename MT2,
typename ST >
2044 struct SMatTSMatMultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,true> >
2048 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2049 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2050 IsNumeric<ST>::value
2051 ,
typename SMatScalarMultExprTrait<typename SMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2052 , INVALID_TYPE >::Type Type;
2061 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2062 struct SMatTSMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,false>, SMatScalarMultExpr<MT2,ST2,true> >
2066 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2067 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2068 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2069 ,
typename SMatScalarMultExprTrait<typename SMatTSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2070 , INVALID_TYPE >::Type Type;
2087 template<
typename MT1,
typename ST,
typename MT2 >
2088 struct TSMatSMatMultExprTrait< SMatScalarMultExpr<MT1,ST,true>, MT2 >
2092 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2093 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2094 IsNumeric<ST>::value
2095 ,
typename TSMatScalarMultExprTrait<typename TSMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2096 , INVALID_TYPE >::Type Type;
2105 template<
typename MT1,
typename MT2,
typename ST >
2106 struct TSMatSMatMultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,false> >
2110 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2111 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2112 IsNumeric<ST>::value
2113 ,
typename TSMatScalarMultExprTrait<typename TSMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2114 , INVALID_TYPE >::Type Type;
2123 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2124 struct TSMatSMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,true>, SMatScalarMultExpr<MT2,ST2,false> >
2128 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2129 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2130 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2131 ,
typename TSMatScalarMultExprTrait<typename TSMatSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2132 , INVALID_TYPE >::Type Type;
2149 template<
typename MT1,
typename ST,
typename MT2 >
2150 struct TSMatTSMatMultExprTrait< SMatScalarMultExpr<MT1,ST,true>, MT2 >
2154 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2155 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2156 IsNumeric<ST>::value
2157 ,
typename TSMatScalarMultExprTrait<typename TSMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2158 , INVALID_TYPE >::Type Type;
2167 template<
typename MT1,
typename MT2,
typename ST >
2168 struct TSMatTSMatMultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,true> >
2172 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2173 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2174 IsNumeric<ST>::value
2175 ,
typename TSMatScalarMultExprTrait<typename TSMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2176 , INVALID_TYPE >::Type Type;
2185 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2186 struct TSMatTSMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,true>, SMatScalarMultExpr<MT2,ST2,true> >
2190 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2191 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2192 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2193 ,
typename TSMatScalarMultExprTrait<typename TSMatTSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2194 , INVALID_TYPE >::Type Type;
2211 template<
typename MT,
typename ST,
bool SO >
2212 struct RowExprTrait< SMatScalarMultExpr<MT,ST,SO> >
2216 typedef typename MultExprTrait< typename RowExprTrait<const MT>::Type, ST >::Type Type;
2233 template<
typename MT,
typename ST,
bool SO >
2234 struct ColumnExprTrait< SMatScalarMultExpr<MT,ST,SO> >
2238 typedef typename MultExprTrait< typename ColumnExprTrait<const MT>::Type, ST >::Type Type;