22 #ifndef _BLAZE_MATH_EXPRESSIONS_SMATSCALARMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_SMATSCALARMULTEXPR_H_
88 class SMatScalarMultExpr :
public SparseMatrix< SMatScalarMultExpr<MT,ST,SO>, SO >
89 ,
private MatScalarMultExpr
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 };
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() );
1223 template<
typename MT,
typename ST1,
typename ST2 >
1224 struct SMatScalarMultExprTrait< SMatScalarMultExpr<MT,ST1,false>, ST2 >
1228 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1229 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1230 ,
typename SMatScalarMultExprTrait<MT,typename MultTrait<ST1,ST2>::Type>::Type
1231 , INVALID_TYPE >::Type Type;
1248 template<
typename MT,
typename ST1,
typename ST2 >
1249 struct TSMatScalarMultExprTrait< SMatScalarMultExpr<MT,ST1,true>, ST2 >
1253 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1254 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1255 ,
typename TSMatScalarMultExprTrait<MT,typename MultTrait<ST1,ST2>::Type>::Type
1256 , INVALID_TYPE >::Type Type;
1273 template<
typename MT,
typename ST1,
typename ST2 >
1274 struct SMatScalarDivExprTrait< SMatScalarMultExpr<MT,ST1,false>, ST2 >
1278 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1282 typedef typename SMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1283 typedef typename SMatScalarDivExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1288 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1289 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1290 ,
typename SelectType<condition,T1,T2>::Type
1291 , INVALID_TYPE >::Type Type;
1308 template<
typename MT,
typename ST1,
typename ST2 >
1309 struct TSMatScalarDivExprTrait< SMatScalarMultExpr<MT,ST1,true>, ST2 >
1313 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1317 typedef typename TSMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1318 typedef typename TSMatScalarDivExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1323 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1324 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1325 ,
typename SelectType<condition,T1,T2>::Type
1326 , INVALID_TYPE >::Type Type;
1343 template<
typename MT,
typename ST,
typename VT >
1344 struct SMatDVecMultExprTrait< SMatScalarMultExpr<MT,ST,false>, VT >
1348 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1349 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1350 IsNumeric<ST>::value
1351 ,
typename DVecScalarMultExprTrait<typename SMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1352 , INVALID_TYPE >::Type Type;
1361 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1362 struct SMatDVecMultExprTrait< SMatScalarMultExpr<MT,ST1,false>, DVecScalarMultExpr<VT,ST2,false> >
1366 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1367 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1368 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1369 ,
typename DVecScalarMultExprTrait<typename SMatDVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1370 , INVALID_TYPE >::Type Type;
1387 template<
typename MT,
typename ST,
typename VT >
1388 struct TSMatDVecMultExprTrait< SMatScalarMultExpr<MT,ST,true>, VT >
1392 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1393 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1394 IsNumeric<ST>::value
1395 ,
typename DVecScalarMultExprTrait<typename TSMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1396 , INVALID_TYPE >::Type Type;
1405 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1406 struct TSMatDVecMultExprTrait< SMatScalarMultExpr<MT,ST1,true>, DVecScalarMultExpr<VT,ST2,false> >
1410 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1411 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1412 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1413 ,
typename DVecScalarMultExprTrait<typename TSMatDVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1414 , INVALID_TYPE >::Type Type;
1431 template<
typename VT,
typename MT,
typename ST >
1432 struct TDVecSMatMultExprTrait< VT, SMatScalarMultExpr<MT,ST,false> >
1436 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1437 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1438 IsNumeric<ST>::value
1439 ,
typename TDVecScalarMultExprTrait<typename TDVecSMatMultExprTrait<VT,MT>::Type,ST>::Type
1440 , INVALID_TYPE >::Type Type;
1449 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1450 struct TDVecSMatMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, SMatScalarMultExpr<MT,ST2,false> >
1454 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1455 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1456 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1457 ,
typename TDVecScalarMultExprTrait<typename TDVecSMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1458 , INVALID_TYPE >::Type Type;
1475 template<
typename VT,
typename MT,
typename ST >
1476 struct TDVecTSMatMultExprTrait< VT, SMatScalarMultExpr<MT,ST,true> >
1480 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1481 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1482 IsNumeric<ST>::value
1483 ,
typename TDVecScalarMultExprTrait<typename TDVecTSMatMultExprTrait<VT,MT>::Type,ST>::Type
1484 , INVALID_TYPE >::Type Type;
1493 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1494 struct TDVecTSMatMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, SMatScalarMultExpr<MT,ST2,true> >
1498 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1499 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1500 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1501 ,
typename TDVecScalarMultExprTrait<typename TDVecTSMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1502 , INVALID_TYPE >::Type Type;
1519 template<
typename MT,
typename ST,
typename VT >
1520 struct SMatSVecMultExprTrait< SMatScalarMultExpr<MT,ST,false>, VT >
1524 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1525 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1526 IsNumeric<ST>::value
1527 ,
typename SVecScalarMultExprTrait<typename SMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1528 , INVALID_TYPE >::Type Type;
1537 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1538 struct SMatSVecMultExprTrait< SMatScalarMultExpr<MT,ST1,false>, SVecScalarMultExpr<VT,ST2,false> >
1542 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1543 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1544 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1545 ,
typename SVecScalarMultExprTrait<typename SMatSVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1546 , INVALID_TYPE >::Type Type;
1563 template<
typename MT,
typename ST,
typename VT >
1564 struct TSMatSVecMultExprTrait< SMatScalarMultExpr<MT,ST,true>, VT >
1568 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1569 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1570 IsNumeric<ST>::value
1571 ,
typename SVecScalarMultExprTrait<typename TSMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1572 , INVALID_TYPE >::Type Type;
1581 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1582 struct TSMatSVecMultExprTrait< SMatScalarMultExpr<MT,ST1,true>, SVecScalarMultExpr<VT,ST2,false> >
1586 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1587 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1588 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1589 ,
typename SVecScalarMultExprTrait<typename TSMatSVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1590 , INVALID_TYPE >::Type Type;
1607 template<
typename VT,
typename MT,
typename ST >
1608 struct TSVecSMatMultExprTrait< VT, SMatScalarMultExpr<MT,ST,false> >
1612 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1613 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1614 IsNumeric<ST>::value
1615 ,
typename TSVecScalarMultExprTrait<typename TSVecSMatMultExprTrait<VT,MT>::Type,ST>::Type
1616 , INVALID_TYPE >::Type Type;
1625 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1626 struct TSVecSMatMultExprTrait< SVecScalarMultExpr<VT,ST1,true>, SMatScalarMultExpr<MT,ST2,false> >
1630 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1631 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1632 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1633 ,
typename TSVecScalarMultExprTrait<typename TSVecSMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1634 , INVALID_TYPE >::Type Type;
1651 template<
typename VT,
typename MT,
typename ST >
1652 struct TSVecTSMatMultExprTrait< VT, SMatScalarMultExpr<MT,ST,true> >
1656 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1657 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1658 IsNumeric<ST>::value
1659 ,
typename TSVecScalarMultExprTrait<typename TSVecTSMatMultExprTrait<VT,MT>::Type,ST>::Type
1660 , INVALID_TYPE >::Type Type;
1669 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1670 struct TSVecTSMatMultExprTrait< SVecScalarMultExpr<VT,ST1,true>, SMatScalarMultExpr<MT,ST2,true> >
1674 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1675 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1676 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1677 ,
typename TSVecScalarMultExprTrait<typename TSVecTSMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1678 , INVALID_TYPE >::Type Type;
1695 template<
typename MT1,
typename MT2,
typename ST >
1696 struct DMatSMatMultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,false> >
1700 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1701 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1702 IsNumeric<ST>::value
1703 ,
typename DMatScalarMultExprTrait<typename DMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1704 , INVALID_TYPE >::Type Type;
1721 template<
typename MT1,
typename MT2,
typename ST >
1722 struct DMatTSMatMultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,true> >
1726 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1727 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1728 IsNumeric<ST>::value
1729 ,
typename DMatScalarMultExprTrait<typename DMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1730 , INVALID_TYPE >::Type Type;
1747 template<
typename MT1,
typename MT2,
typename ST >
1748 struct TDMatSMatMultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,false> >
1752 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1753 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1754 IsNumeric<ST>::value
1755 ,
typename TDMatScalarMultExprTrait<typename TDMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1756 , INVALID_TYPE >::Type Type;
1773 template<
typename MT1,
typename MT2,
typename ST >
1774 struct TDMatTSMatMultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,true> >
1778 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1779 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1780 IsNumeric<ST>::value
1781 ,
typename TDMatScalarMultExprTrait<typename TDMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1782 , INVALID_TYPE >::Type Type;
1799 template<
typename MT1,
typename ST,
typename MT2 >
1800 struct SMatDMatMultExprTrait< SMatScalarMultExpr<MT1,ST,false>, MT2 >
1804 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1805 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1806 IsNumeric<ST>::value
1807 ,
typename DMatScalarMultExprTrait<typename SMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1808 , INVALID_TYPE >::Type Type;
1825 template<
typename MT1,
typename ST,
typename MT2 >
1826 struct SMatTDMatMultExprTrait< SMatScalarMultExpr<MT1,ST,false>, MT2 >
1830 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1831 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1832 IsNumeric<ST>::value
1833 ,
typename DMatScalarMultExprTrait<typename SMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1834 , INVALID_TYPE >::Type Type;
1851 template<
typename MT1,
typename ST,
typename MT2 >
1852 struct TSMatDMatMultExprTrait< SMatScalarMultExpr<MT1,ST,true>, MT2 >
1856 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1857 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1858 IsNumeric<ST>::value
1859 ,
typename TDMatScalarMultExprTrait<typename TSMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1860 , INVALID_TYPE >::Type Type;
1877 template<
typename MT1,
typename ST,
typename MT2 >
1878 struct TSMatTDMatMultExprTrait< SMatScalarMultExpr<MT1,ST,true>, MT2 >
1882 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1883 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1884 IsNumeric<ST>::value
1885 ,
typename TDMatScalarMultExprTrait<typename TSMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1886 , INVALID_TYPE >::Type Type;
1903 template<
typename MT1,
typename ST,
typename MT2 >
1904 struct SMatSMatMultExprTrait< SMatScalarMultExpr<MT1,ST,false>, MT2 >
1908 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1909 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1910 IsNumeric<ST>::value
1911 ,
typename SMatScalarMultExprTrait<typename SMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1912 , INVALID_TYPE >::Type Type;
1921 template<
typename MT1,
typename MT2,
typename ST >
1922 struct SMatSMatMultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,false> >
1926 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1927 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1928 IsNumeric<ST>::value
1929 ,
typename SMatScalarMultExprTrait<typename SMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1930 , INVALID_TYPE >::Type Type;
1939 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1940 struct SMatSMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,false>, SMatScalarMultExpr<MT2,ST2,false> >
1944 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1945 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1946 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1947 ,
typename SMatScalarMultExprTrait<typename SMatSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1948 , INVALID_TYPE >::Type Type;
1965 template<
typename MT1,
typename ST,
typename MT2 >
1966 struct SMatTSMatMultExprTrait< SMatScalarMultExpr<MT1,ST,false>, MT2 >
1970 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1971 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1972 IsNumeric<ST>::value
1973 ,
typename SMatScalarMultExprTrait<typename SMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1974 , INVALID_TYPE >::Type Type;
1983 template<
typename MT1,
typename MT2,
typename ST >
1984 struct SMatTSMatMultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,true> >
1988 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1989 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1990 IsNumeric<ST>::value
1991 ,
typename SMatScalarMultExprTrait<typename SMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1992 , INVALID_TYPE >::Type Type;
2001 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2002 struct SMatTSMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,false>, SMatScalarMultExpr<MT2,ST2,true> >
2006 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2007 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2008 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2009 ,
typename SMatScalarMultExprTrait<typename SMatTSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2010 , INVALID_TYPE >::Type Type;
2027 template<
typename MT1,
typename ST,
typename MT2 >
2028 struct TSMatSMatMultExprTrait< SMatScalarMultExpr<MT1,ST,true>, MT2 >
2032 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2033 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2034 IsNumeric<ST>::value
2035 ,
typename TSMatScalarMultExprTrait<typename TSMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2036 , INVALID_TYPE >::Type Type;
2045 template<
typename MT1,
typename MT2,
typename ST >
2046 struct TSMatSMatMultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,false> >
2050 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2051 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2052 IsNumeric<ST>::value
2053 ,
typename TSMatScalarMultExprTrait<typename TSMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2054 , INVALID_TYPE >::Type Type;
2063 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2064 struct TSMatSMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,true>, SMatScalarMultExpr<MT2,ST2,false> >
2068 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2069 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2070 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2071 ,
typename TSMatScalarMultExprTrait<typename TSMatSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2072 , INVALID_TYPE >::Type Type;
2089 template<
typename MT1,
typename ST,
typename MT2 >
2090 struct TSMatTSMatMultExprTrait< SMatScalarMultExpr<MT1,ST,true>, MT2 >
2094 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2095 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2096 IsNumeric<ST>::value
2097 ,
typename TSMatScalarMultExprTrait<typename TSMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2098 , INVALID_TYPE >::Type Type;
2107 template<
typename MT1,
typename MT2,
typename ST >
2108 struct TSMatTSMatMultExprTrait< MT1, SMatScalarMultExpr<MT2,ST,true> >
2112 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2113 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2114 IsNumeric<ST>::value
2115 ,
typename TSMatScalarMultExprTrait<typename TSMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2116 , INVALID_TYPE >::Type Type;
2125 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2126 struct TSMatTSMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,true>, SMatScalarMultExpr<MT2,ST2,true> >
2130 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2131 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2132 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2133 ,
typename TSMatScalarMultExprTrait<typename TSMatTSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2134 , INVALID_TYPE >::Type Type;
2151 template<
typename MT,
typename ST,
bool SO >
2152 struct RowExprTrait< SMatScalarMultExpr<MT,ST,SO> >
2156 typedef typename MultExprTrait< typename RowExprTrait<const MT>::Type, ST >::Type Type;
2173 template<
typename MT,
typename ST,
bool SO >
2174 struct ColumnExprTrait< SMatScalarMultExpr<MT,ST,SO> >
2178 typedef typename MultExprTrait< typename ColumnExprTrait<const MT>::Type, ST >::Type Type;