22 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATSCALARMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DMATSCALARMULTEXPR_H_
91 typedef typename MT::ResultType
RT;
92 typedef typename MT::ReturnType
RN;
93 typedef typename MT::ElementType
ET;
94 typedef typename MT::CompositeType
CT;
122 template<
typename MT2 >
124 enum { value = useAssign };
153 enum { vectorizable = MT::vectorizable &&
249 template<
typename T >
251 return matrix_.canAlias( alias );
261 template<
typename T >
263 return matrix_.isAliased( alias );
287 template<
typename MT2 >
298 const size_t m( (~lhs).
rows() );
299 const size_t n( (~lhs).
columns() );
300 for(
size_t i=0UL; i<m; ++i ) {
301 for(
size_t j=0UL; j<n; ++j ) {
323 template<
typename MT2 >
334 const size_t m( (~lhs).
rows() );
335 const size_t n( (~lhs).
columns() );
336 for(
size_t j=0UL; j<n; ++j ) {
337 for(
size_t i=0UL; i<m; ++i ) {
359 template<
typename MT2 >
360 friend inline typename EnableIf< UseAssign<MT2> >::Type
368 assign( ~lhs, rhs.matrix_ );
370 for(
size_t i=0UL; i<(~lhs).
rows(); ++i )
372 typename MT2::Iterator element( (~lhs).begin(i) );
373 const typename MT2::Iterator end( (~lhs).end(i) );
375 for( ; element!=end; ++element )
376 element->value() *= rhs.scalar_;
396 template<
typename MT2 >
397 friend inline typename EnableIf< UseAssign<MT2> >::Type
405 assign( ~lhs, rhs.matrix_ );
407 for(
size_t j=0UL; j<(~lhs).
columns(); ++j )
409 typename MT2::Iterator element( (~lhs).begin(j) );
410 const typename MT2::Iterator end( (~lhs).end(j) );
412 for( ; element!=end; ++element )
413 element->value() *= rhs.scalar_;
433 template<
typename MT2
435 friend inline typename EnableIf< UseAssign<MT2> >::Type
471 template<
typename MT2
473 friend inline typename EnableIf< UseAssign<MT2> >::Type
540 template<
typename MT
542 inline const DMatScalarMultExpr<MT,typename BaseElementType<MT>::Type,SO>
582 template<
typename T1
585 inline const typename EnableIf< IsNumeric<T2>,
typename MultExprTrait<T1,T2>::Type >::Type
591 return Type( ~mat, scalar );
617 template<
typename T1
620 inline const typename EnableIf< IsNumeric<T1>,
typename MultExprTrait<T1,T2>::Type >::Type
626 return Type( ~mat, scalar );
651 template<
typename VT
654 inline const DMatScalarMultExpr<VT,ST,TF>
655 operator-(
const DMatScalarMultExpr<VT,ST,TF>& dm )
659 return DMatScalarMultExpr<VT,ST,TF>( dm.leftOperand(), -dm.rightOperand() );
686 template<
typename MT
690 inline const typename EnableIf< IsNumeric<ST2>
691 ,
typename MultExprTrait< DMatScalarMultExpr<MT,ST1,SO>, ST2 >::Type >::Type
692 operator*(
const DMatScalarMultExpr<MT,ST1,SO>& mat, ST2 scalar )
696 return mat.leftOperand() * ( mat.rightOperand() * scalar );
715 template<
typename ST1
719 inline const typename EnableIf< IsNumeric<ST1>
720 ,
typename MultExprTrait< ST1, DMatScalarMultExpr<MT,ST2,SO> >::Type >::Type
721 operator*( ST1 scalar,
const DMatScalarMultExpr<MT,ST2,SO>& mat )
725 return mat.leftOperand() * ( scalar * mat.rightOperand() );
744 template<
typename MT
748 inline const typename EnableIf< IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>
749 ,
typename DivExprTrait< DMatScalarMultExpr<MT,ST1,SO>, ST2 >::Type >::Type
750 operator/(
const DMatScalarMultExpr<MT,ST1,SO>& mat, ST2 scalar )
754 return mat.leftOperand() * ( mat.rightOperand() / scalar );
774 template<
typename MT
778 inline const typename MultExprTrait< DMatScalarMultExpr<MT,ST,SO>, VT >::Type
779 operator*(
const DMatScalarMultExpr<MT,ST,SO>& mat,
const DenseVector<VT,false>& vec )
783 return ( mat.leftOperand() * (~vec) ) * mat.rightOperand();
803 template<
typename VT
807 inline const typename MultExprTrait< VT, DMatScalarMultExpr<MT,ST,SO> >::Type
808 operator*(
const DenseVector<VT,true>& vec,
const DMatScalarMultExpr<MT,ST,SO>& mat )
812 return ( (~vec) * mat.leftOperand() ) * mat.rightOperand();
834 template<
typename MT
839 inline const DVecScalarMultExpr<typename MultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type,
false>
840 operator*(
const DMatScalarMultExpr<MT,ST1,SO>& mat,
const DVecScalarMultExpr<VT,ST2,false>& vec )
844 return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
866 template<
typename VT
871 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,SO> >::Type
872 operator*(
const DVecScalarMultExpr<VT,ST1,true>& vec,
const DMatScalarMultExpr<MT,ST2,SO>& mat )
876 return ( vec.leftOperand() * mat.leftOperand() ) * ( vec.rightOperand() * mat.rightOperand() );
896 template<
typename MT
900 inline const typename MultExprTrait< DMatScalarMultExpr<MT,ST,SO>, VT >::Type
901 operator*(
const DMatScalarMultExpr<MT,ST,SO>& mat,
const SparseVector<VT,false>& vec )
905 return ( mat.leftOperand() * (~vec) ) * mat.rightOperand();
925 template<
typename VT
929 inline const typename MultExprTrait< VT, DMatScalarMultExpr<MT,ST,SO> >::Type
930 operator*(
const SparseVector<VT,true>& vec,
const DMatScalarMultExpr<MT,ST,SO>& mat )
934 return ( (~vec) * mat.leftOperand() ) * mat.rightOperand();
956 template<
typename MT
961 inline const typename MultExprTrait< DMatScalarMultExpr<MT,ST1,SO>, SVecScalarMultExpr<VT,ST2,false> >::Type
962 operator*(
const DMatScalarMultExpr<MT,ST1,SO>& mat,
const SVecScalarMultExpr<VT,ST2,false>& vec )
966 return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
988 template<
typename VT
993 inline const typename MultExprTrait< SVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,SO> >::Type
994 operator*(
const SVecScalarMultExpr<VT,ST1,true>& vec,
const DMatScalarMultExpr<MT,ST2,SO>& mat )
998 return ( vec.leftOperand() * mat.leftOperand() ) * ( vec.rightOperand() * mat.rightOperand() );
1018 template<
typename MT1
1023 inline const typename MultExprTrait< DMatScalarMultExpr<MT1,ST,SO1>, MT2 >::Type
1024 operator*(
const DMatScalarMultExpr<MT1,ST,SO1>& lhs,
const DenseMatrix<MT2,SO2>& rhs )
1028 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1048 template<
typename MT1
1053 inline const typename MultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,SO2> >::Type
1054 operator*(
const DenseMatrix<MT1,SO1>& lhs,
const DMatScalarMultExpr<MT2,ST,SO2>& rhs )
1058 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1078 template<
typename MT1
1084 inline const typename MultExprTrait< DMatScalarMultExpr<MT1,ST1,SO1>, DMatScalarMultExpr<MT2,ST2,SO2> >::Type
1085 operator*(
const DMatScalarMultExpr<MT1,ST1,SO1>& lhs,
const DMatScalarMultExpr<MT2,ST2,SO2>& rhs )
1089 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1109 template<
typename MT1
1114 inline const typename MultExprTrait< DMatScalarMultExpr<MT1,ST,SO1>, MT2 >::Type
1115 operator*(
const DMatScalarMultExpr<MT1,ST,SO1>& lhs,
const SparseMatrix<MT2,SO2>& rhs )
1119 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1139 template<
typename MT1
1144 inline const typename MultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,SO2> >::Type
1145 operator*(
const SparseMatrix<MT1,SO1>& lhs,
const DMatScalarMultExpr<MT2,ST,SO2>& rhs )
1149 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1170 template<
typename MT1
1176 inline const typename MultExprTrait< DMatScalarMultExpr<MT1,ST1,SO1>, SMatScalarMultExpr<MT2,ST2,SO2> >::Type
1177 operator*(
const DMatScalarMultExpr<MT1,ST1,SO1>& mat,
const SMatScalarMultExpr<MT2,ST2,SO2>& vec )
1181 return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
1202 template<
typename MT1
1208 inline const typename MultExprTrait< SMatScalarMultExpr<MT1,ST1,SO1>, DMatScalarMultExpr<MT2,ST2,SO2> >::Type
1209 operator*(
const SMatScalarMultExpr<MT1,ST1,SO1>& mat,
const DMatScalarMultExpr<MT2,ST2,SO2>& vec )
1213 return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
1239 template<
typename MT
1242 inline typename RowExprTrait< DMatScalarMultExpr<MT,ST,SO> >::Type
1243 row(
const DMatScalarMultExpr<MT,ST,SO>& dm,
size_t index )
1247 return row( dm.leftOperand(), index ) * dm.rightOperand();
1265 template<
typename MT
1268 inline typename ColumnExprTrait< DMatScalarMultExpr<MT,ST,SO> >::Type
1269 column(
const DMatScalarMultExpr<MT,ST,SO>& dm,
size_t index )
1273 return column( dm.leftOperand(), index ) * dm.rightOperand();
1289 template<
typename MT,
typename ST1,
typename ST2 >
1290 struct DMatScalarMultExprTrait< DMatScalarMultExpr<MT,ST1,false>, ST2 >
1294 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1295 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1296 ,
typename DMatScalarMultExprTrait<MT,typename MultTrait<ST1,ST2>::Type>::Type
1297 , INVALID_TYPE >::Type Type;
1314 template<
typename MT,
typename ST1,
typename ST2 >
1315 struct TDMatScalarMultExprTrait< DMatScalarMultExpr<MT,ST1,true>, ST2 >
1319 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1320 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1321 ,
typename TDMatScalarMultExprTrait<MT,typename MultTrait<ST1,ST2>::Type>::Type
1322 , INVALID_TYPE >::Type Type;
1339 template<
typename MT,
typename ST1,
typename ST2 >
1340 struct DMatScalarDivExprTrait< DMatScalarMultExpr<MT,ST1,false>, ST2 >
1344 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1348 typedef typename DMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1349 typedef typename DMatScalarDivExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1354 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1355 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1356 ,
typename SelectType<condition,T1,T2>::Type
1357 , INVALID_TYPE >::Type Type;
1374 template<
typename MT,
typename ST1,
typename ST2 >
1375 struct TDMatScalarDivExprTrait< DMatScalarMultExpr<MT,ST1,true>, ST2 >
1379 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1383 typedef typename TDMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1384 typedef typename TDMatScalarDivExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1389 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1390 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1391 ,
typename SelectType<condition,T1,T2>::Type
1392 , INVALID_TYPE >::Type Type;
1409 template<
typename MT,
typename ST,
typename VT >
1410 struct DMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST,false>, VT >
1414 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1415 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1416 IsNumeric<ST>::value
1417 ,
typename DVecScalarMultExprTrait<typename DMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1418 , INVALID_TYPE >::Type Type;
1427 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1428 struct DMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST1,false>, DVecScalarMultExpr<VT,ST2,false> >
1432 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1433 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1434 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1435 ,
typename DVecScalarMultExprTrait<typename DMatDVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1436 , INVALID_TYPE >::Type Type;
1453 template<
typename MT,
typename ST,
typename VT >
1454 struct TDMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST,true>, VT >
1458 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1459 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1460 IsNumeric<ST>::value
1461 ,
typename DVecScalarMultExprTrait<typename TDMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1462 , INVALID_TYPE >::Type Type;
1471 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1472 struct TDMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST1,true>, DVecScalarMultExpr<VT,ST2,false> >
1476 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1477 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1478 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1479 ,
typename DVecScalarMultExprTrait<typename TDMatDVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1480 , INVALID_TYPE >::Type Type;
1497 template<
typename VT,
typename MT,
typename ST >
1498 struct TDVecDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,false> >
1502 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1503 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1504 IsNumeric<ST>::value
1505 ,
typename TDVecScalarMultExprTrait<typename TDVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
1506 , INVALID_TYPE >::Type Type;
1515 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1516 struct TDVecDMatMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,false> >
1520 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1521 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1522 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1523 ,
typename TDVecScalarMultExprTrait<typename TDVecDMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1524 , INVALID_TYPE >::Type Type;
1541 template<
typename VT,
typename MT,
typename ST >
1542 struct TDVecTDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,true> >
1546 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1547 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1548 IsNumeric<ST>::value
1549 ,
typename TDVecScalarMultExprTrait<typename TDVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
1550 , INVALID_TYPE >::Type Type;
1559 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1560 struct TDVecTDMatMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,true> >
1564 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1565 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1566 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1567 ,
typename TDVecScalarMultExprTrait<typename TDVecTDMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1568 , INVALID_TYPE >::Type Type;
1585 template<
typename MT,
typename ST,
typename VT >
1586 struct DMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST,false>, VT >
1590 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1591 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1592 IsNumeric<ST>::value
1593 ,
typename DVecScalarMultExprTrait<typename DMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1594 , INVALID_TYPE >::Type Type;
1603 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1604 struct DMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST1,false>, SVecScalarMultExpr<VT,ST2,false> >
1608 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1609 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1610 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1611 ,
typename DVecScalarMultExprTrait<typename DMatSVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1612 , INVALID_TYPE >::Type Type;
1629 template<
typename MT,
typename ST,
typename VT >
1630 struct TDMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST,true>, VT >
1634 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1635 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1636 IsNumeric<ST>::value
1637 ,
typename DVecScalarMultExprTrait<typename TDMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1638 , INVALID_TYPE >::Type Type;
1647 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1648 struct TDMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST1,true>, SVecScalarMultExpr<VT,ST2,false> >
1652 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1653 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1654 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1655 ,
typename DVecScalarMultExprTrait<typename TDMatSVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1656 , INVALID_TYPE >::Type Type;
1673 template<
typename VT,
typename MT,
typename ST >
1674 struct TSVecDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,false> >
1678 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1679 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1680 IsNumeric<ST>::value
1681 ,
typename TDVecScalarMultExprTrait<typename TSVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
1682 , INVALID_TYPE >::Type Type;
1691 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1692 struct TSVecDMatMultExprTrait< SVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,false> >
1696 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1697 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1698 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1699 ,
typename TDVecScalarMultExprTrait<typename TSVecDMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1700 , INVALID_TYPE >::Type Type;
1717 template<
typename VT,
typename MT,
typename ST >
1718 struct TSVecTDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,true> >
1722 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1723 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1724 IsNumeric<ST>::value
1725 ,
typename TDVecScalarMultExprTrait<typename TSVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
1726 , INVALID_TYPE >::Type Type;
1735 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1736 struct TSVecTDMatMultExprTrait< SVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,true> >
1740 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1741 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1742 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1743 ,
typename TDVecScalarMultExprTrait<typename TSVecTDMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1744 , INVALID_TYPE >::Type Type;
1761 template<
typename MT1,
typename ST,
typename MT2 >
1762 struct DMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
1766 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1767 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1768 IsNumeric<ST>::value
1769 ,
typename DMatScalarMultExprTrait<typename DMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1770 , INVALID_TYPE >::Type Type;
1779 template<
typename MT1,
typename MT2,
typename ST >
1780 struct DMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
1784 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1785 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1786 IsNumeric<ST>::value
1787 ,
typename DMatScalarMultExprTrait<typename DMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1788 , INVALID_TYPE >::Type Type;
1797 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1798 struct DMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,false> >
1802 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1803 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1804 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1805 ,
typename DMatScalarMultExprTrait<typename DMatDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1806 , INVALID_TYPE >::Type Type;
1823 template<
typename MT1,
typename ST,
typename MT2 >
1824 struct DMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
1828 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1829 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1830 IsNumeric<ST>::value
1831 ,
typename DMatScalarMultExprTrait<typename DMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1832 , INVALID_TYPE >::Type Type;
1841 template<
typename MT1,
typename MT2,
typename ST >
1842 struct DMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
1846 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1847 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1848 IsNumeric<ST>::value
1849 ,
typename DMatScalarMultExprTrait<typename DMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1850 , INVALID_TYPE >::Type Type;
1859 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1860 struct DMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,true> >
1864 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1865 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1866 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1867 ,
typename DMatScalarMultExprTrait<typename DMatTDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1868 , INVALID_TYPE >::Type Type;
1885 template<
typename MT1,
typename ST,
typename MT2 >
1886 struct TDMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
1890 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1891 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1892 IsNumeric<ST>::value
1893 ,
typename TDMatScalarMultExprTrait<typename TDMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1894 , INVALID_TYPE >::Type Type;
1903 template<
typename MT1,
typename MT2,
typename ST >
1904 struct TDMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
1908 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1909 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1910 IsNumeric<ST>::value
1911 ,
typename TDMatScalarMultExprTrait<typename TDMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1912 , INVALID_TYPE >::Type Type;
1921 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1922 struct TDMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,false> >
1926 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1927 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1928 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1929 ,
typename TDMatScalarMultExprTrait<typename TDMatDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1930 , INVALID_TYPE >::Type Type;
1947 template<
typename MT1,
typename ST,
typename MT2 >
1948 struct TDMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
1952 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1953 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1954 IsNumeric<ST>::value
1955 ,
typename TDMatScalarMultExprTrait<typename TDMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1956 , INVALID_TYPE >::Type Type;
1965 template<
typename MT1,
typename MT2,
typename ST >
1966 struct TDMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
1970 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1971 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1972 IsNumeric<ST>::value
1973 ,
typename TDMatScalarMultExprTrait<typename TDMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1974 , INVALID_TYPE >::Type Type;
1983 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1984 struct TDMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,true> >
1988 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1989 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1990 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1991 ,
typename TDMatScalarMultExprTrait<typename TDMatTDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1992 , INVALID_TYPE >::Type Type;
2009 template<
typename MT1,
typename ST,
typename MT2 >
2010 struct DMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
2014 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2015 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2016 IsNumeric<ST>::value
2017 ,
typename DMatScalarMultExprTrait<typename DMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2018 , INVALID_TYPE >::Type Type;
2027 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2028 struct DMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, SMatScalarMultExpr<MT2,ST2,false> >
2032 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2033 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2034 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2035 ,
typename DMatScalarMultExprTrait<typename DMatSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2036 , INVALID_TYPE >::Type Type;
2053 template<
typename MT1,
typename ST,
typename MT2 >
2054 struct DMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
2058 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2059 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2060 IsNumeric<ST>::value
2061 ,
typename DMatScalarMultExprTrait<typename DMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2062 , INVALID_TYPE >::Type Type;
2071 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2072 struct DMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, SMatScalarMultExpr<MT2,ST2,true> >
2076 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2077 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2078 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2079 ,
typename DMatScalarMultExprTrait<typename DMatTSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2080 , INVALID_TYPE >::Type Type;
2097 template<
typename MT1,
typename ST,
typename MT2 >
2098 struct TDMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
2102 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2103 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2104 IsNumeric<ST>::value
2105 ,
typename TDMatScalarMultExprTrait<typename TDMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2106 , INVALID_TYPE >::Type Type;
2115 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2116 struct TDMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, SMatScalarMultExpr<MT2,ST2,false> >
2120 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2121 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2122 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2123 ,
typename TDMatScalarMultExprTrait<typename TDMatSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2124 , INVALID_TYPE >::Type Type;
2141 template<
typename MT1,
typename ST,
typename MT2 >
2142 struct TDMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
2146 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2147 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2148 IsNumeric<ST>::value
2149 ,
typename TDMatScalarMultExprTrait<typename TDMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2150 , INVALID_TYPE >::Type Type;
2159 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2160 struct TDMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, SMatScalarMultExpr<MT2,ST2,true> >
2164 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2165 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2166 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2167 ,
typename TDMatScalarMultExprTrait<typename TDMatTSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2168 , INVALID_TYPE >::Type Type;
2185 template<
typename MT1,
typename ST,
typename MT2 >
2186 struct SMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
2190 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2191 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2192 IsNumeric<ST>::value
2193 ,
typename DMatScalarMultExprTrait<typename SMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2194 , INVALID_TYPE >::Type Type;
2203 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2204 struct SMatDMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,false> >
2208 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2209 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2210 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2211 ,
typename DMatScalarMultExprTrait<typename SMatDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2212 , INVALID_TYPE >::Type Type;
2229 template<
typename MT1,
typename ST,
typename MT2 >
2230 struct SMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
2234 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2235 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2236 IsNumeric<ST>::value
2237 ,
typename DMatScalarMultExprTrait<typename SMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2238 , INVALID_TYPE >::Type Type;
2247 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2248 struct SMatTDMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,true> >
2252 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2253 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2254 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2255 ,
typename DMatScalarMultExprTrait<typename SMatTDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2256 , INVALID_TYPE >::Type Type;
2273 template<
typename MT1,
typename ST,
typename MT2 >
2274 struct TSMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
2278 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2279 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2280 IsNumeric<ST>::value
2281 ,
typename TDMatScalarMultExprTrait<typename TSMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2282 , INVALID_TYPE >::Type Type;
2291 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2292 struct TSMatDMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,false> >
2296 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2297 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2298 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2299 ,
typename TDMatScalarMultExprTrait<typename TSMatDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2300 , INVALID_TYPE >::Type Type;
2317 template<
typename MT1,
typename ST,
typename MT2 >
2318 struct TSMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
2322 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2323 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2324 IsNumeric<ST>::value
2325 ,
typename TDMatScalarMultExprTrait<typename TSMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2326 , INVALID_TYPE >::Type Type;
2335 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2336 struct TSMatTDMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,true> >
2340 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2341 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2342 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2343 ,
typename TDMatScalarMultExprTrait<typename TSMatTDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2344 , INVALID_TYPE >::Type Type;
2361 template<
typename MT,
typename ST,
bool SO >
2362 struct RowExprTrait< DMatScalarMultExpr<MT,ST,SO> >
2366 typedef typename MultExprTrait< typename RowExprTrait<const MT>::Type, ST >::Type Type;
2383 template<
typename MT,
typename ST,
bool SO >
2384 struct ColumnExprTrait< DMatScalarMultExpr<MT,ST,SO> >
2388 typedef typename MultExprTrait< typename ColumnExprTrait<const MT>::Type, ST >::Type Type;