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() );
1229 template<
typename MT,
typename ST1,
typename ST2 >
1230 struct DMatScalarMultExprTrait< DMatScalarMultExpr<MT,ST1,false>, ST2 >
1234 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1235 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1236 ,
typename DMatScalarMultExprTrait<MT,typename MultTrait<ST1,ST2>::Type>::Type
1237 , INVALID_TYPE >::Type Type;
1254 template<
typename MT,
typename ST1,
typename ST2 >
1255 struct TDMatScalarMultExprTrait< DMatScalarMultExpr<MT,ST1,true>, ST2 >
1259 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1260 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1261 ,
typename TDMatScalarMultExprTrait<MT,typename MultTrait<ST1,ST2>::Type>::Type
1262 , INVALID_TYPE >::Type Type;
1279 template<
typename MT,
typename ST1,
typename ST2 >
1280 struct DMatScalarDivExprTrait< DMatScalarMultExpr<MT,ST1,false>, ST2 >
1284 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1288 typedef typename DMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1289 typedef typename DMatScalarDivExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1294 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1295 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1296 ,
typename SelectType<condition,T1,T2>::Type
1297 , INVALID_TYPE >::Type Type;
1314 template<
typename MT,
typename ST1,
typename ST2 >
1315 struct TDMatScalarDivExprTrait< DMatScalarMultExpr<MT,ST1,true>, ST2 >
1319 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1323 typedef typename TDMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1324 typedef typename TDMatScalarDivExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1329 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1330 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1331 ,
typename SelectType<condition,T1,T2>::Type
1332 , INVALID_TYPE >::Type Type;
1349 template<
typename MT,
typename ST,
typename VT >
1350 struct DMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST,false>, VT >
1354 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1355 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1356 IsNumeric<ST>::value
1357 ,
typename DVecScalarMultExprTrait<typename DMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1358 , INVALID_TYPE >::Type Type;
1367 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1368 struct DMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST1,false>, DVecScalarMultExpr<VT,ST2,false> >
1372 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1373 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1374 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1375 ,
typename DVecScalarMultExprTrait<typename DMatDVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1376 , INVALID_TYPE >::Type Type;
1393 template<
typename MT,
typename ST,
typename VT >
1394 struct TDMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST,true>, VT >
1398 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1399 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1400 IsNumeric<ST>::value
1401 ,
typename DVecScalarMultExprTrait<typename TDMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1402 , INVALID_TYPE >::Type Type;
1411 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1412 struct TDMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST1,true>, DVecScalarMultExpr<VT,ST2,false> >
1416 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1417 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1418 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1419 ,
typename DVecScalarMultExprTrait<typename TDMatDVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1420 , INVALID_TYPE >::Type Type;
1437 template<
typename VT,
typename MT,
typename ST >
1438 struct TDVecDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,false> >
1442 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1443 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1444 IsNumeric<ST>::value
1445 ,
typename TDVecScalarMultExprTrait<typename TDVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
1446 , INVALID_TYPE >::Type Type;
1455 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1456 struct TDVecDMatMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,false> >
1460 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1461 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1462 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1463 ,
typename TDVecScalarMultExprTrait<typename TDVecDMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1464 , INVALID_TYPE >::Type Type;
1481 template<
typename VT,
typename MT,
typename ST >
1482 struct TDVecTDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,true> >
1486 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1487 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1488 IsNumeric<ST>::value
1489 ,
typename TDVecScalarMultExprTrait<typename TDVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
1490 , INVALID_TYPE >::Type Type;
1499 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1500 struct TDVecTDMatMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,true> >
1504 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1505 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1506 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1507 ,
typename TDVecScalarMultExprTrait<typename TDVecTDMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1508 , INVALID_TYPE >::Type Type;
1525 template<
typename MT,
typename ST,
typename VT >
1526 struct DMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST,false>, VT >
1530 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1531 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1532 IsNumeric<ST>::value
1533 ,
typename DVecScalarMultExprTrait<typename DMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1534 , INVALID_TYPE >::Type Type;
1543 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1544 struct DMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST1,false>, SVecScalarMultExpr<VT,ST2,false> >
1548 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1549 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1550 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1551 ,
typename DVecScalarMultExprTrait<typename DMatSVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1552 , INVALID_TYPE >::Type Type;
1569 template<
typename MT,
typename ST,
typename VT >
1570 struct TDMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST,true>, VT >
1574 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1575 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1576 IsNumeric<ST>::value
1577 ,
typename DVecScalarMultExprTrait<typename TDMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1578 , INVALID_TYPE >::Type Type;
1587 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1588 struct TDMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST1,true>, SVecScalarMultExpr<VT,ST2,false> >
1592 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1593 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1594 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1595 ,
typename DVecScalarMultExprTrait<typename TDMatSVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1596 , INVALID_TYPE >::Type Type;
1613 template<
typename VT,
typename MT,
typename ST >
1614 struct TSVecDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,false> >
1618 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1619 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1620 IsNumeric<ST>::value
1621 ,
typename TDVecScalarMultExprTrait<typename TSVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
1622 , INVALID_TYPE >::Type Type;
1631 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1632 struct TSVecDMatMultExprTrait< SVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,false> >
1636 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1637 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1638 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1639 ,
typename TDVecScalarMultExprTrait<typename TSVecDMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1640 , INVALID_TYPE >::Type Type;
1657 template<
typename VT,
typename MT,
typename ST >
1658 struct TSVecTDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,true> >
1662 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1663 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1664 IsNumeric<ST>::value
1665 ,
typename TDVecScalarMultExprTrait<typename TSVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
1666 , INVALID_TYPE >::Type Type;
1675 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1676 struct TSVecTDMatMultExprTrait< SVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,true> >
1680 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1681 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1682 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1683 ,
typename TDVecScalarMultExprTrait<typename TSVecTDMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1684 , INVALID_TYPE >::Type Type;
1701 template<
typename MT1,
typename ST,
typename MT2 >
1702 struct DMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
1706 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1707 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1708 IsNumeric<ST>::value
1709 ,
typename DMatScalarMultExprTrait<typename DMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1710 , INVALID_TYPE >::Type Type;
1719 template<
typename MT1,
typename MT2,
typename ST >
1720 struct DMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
1724 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1725 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1726 IsNumeric<ST>::value
1727 ,
typename DMatScalarMultExprTrait<typename DMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1728 , INVALID_TYPE >::Type Type;
1737 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1738 struct DMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,false> >
1742 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1743 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1744 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1745 ,
typename DMatScalarMultExprTrait<typename DMatDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1746 , INVALID_TYPE >::Type Type;
1763 template<
typename MT1,
typename ST,
typename MT2 >
1764 struct DMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
1768 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1769 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1770 IsNumeric<ST>::value
1771 ,
typename DMatScalarMultExprTrait<typename DMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1772 , INVALID_TYPE >::Type Type;
1781 template<
typename MT1,
typename MT2,
typename ST >
1782 struct DMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
1786 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1787 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1788 IsNumeric<ST>::value
1789 ,
typename DMatScalarMultExprTrait<typename DMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1790 , INVALID_TYPE >::Type Type;
1799 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1800 struct DMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,true> >
1804 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1805 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1806 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1807 ,
typename DMatScalarMultExprTrait<typename DMatTDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1808 , INVALID_TYPE >::Type Type;
1825 template<
typename MT1,
typename ST,
typename MT2 >
1826 struct TDMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
1830 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1831 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1832 IsNumeric<ST>::value
1833 ,
typename TDMatScalarMultExprTrait<typename TDMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1834 , INVALID_TYPE >::Type Type;
1843 template<
typename MT1,
typename MT2,
typename ST >
1844 struct TDMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
1848 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1849 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1850 IsNumeric<ST>::value
1851 ,
typename TDMatScalarMultExprTrait<typename TDMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1852 , INVALID_TYPE >::Type Type;
1861 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1862 struct TDMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,false> >
1866 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1867 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1868 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1869 ,
typename TDMatScalarMultExprTrait<typename TDMatDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1870 , INVALID_TYPE >::Type Type;
1887 template<
typename MT1,
typename ST,
typename MT2 >
1888 struct TDMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
1892 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1893 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1894 IsNumeric<ST>::value
1895 ,
typename TDMatScalarMultExprTrait<typename TDMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1896 , INVALID_TYPE >::Type Type;
1905 template<
typename MT1,
typename MT2,
typename ST >
1906 struct TDMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
1910 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1911 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1912 IsNumeric<ST>::value
1913 ,
typename TDMatScalarMultExprTrait<typename TDMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1914 , INVALID_TYPE >::Type Type;
1923 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1924 struct TDMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,true> >
1928 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1929 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1930 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1931 ,
typename TDMatScalarMultExprTrait<typename TDMatTDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1932 , INVALID_TYPE >::Type Type;
1949 template<
typename MT1,
typename ST,
typename MT2 >
1950 struct DMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
1954 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1955 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1956 IsNumeric<ST>::value
1957 ,
typename DMatScalarMultExprTrait<typename DMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1958 , INVALID_TYPE >::Type Type;
1967 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1968 struct DMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, SMatScalarMultExpr<MT2,ST2,false> >
1972 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1973 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1974 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1975 ,
typename DMatScalarMultExprTrait<typename DMatSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1976 , INVALID_TYPE >::Type Type;
1993 template<
typename MT1,
typename ST,
typename MT2 >
1994 struct DMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
1998 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1999 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2000 IsNumeric<ST>::value
2001 ,
typename DMatScalarMultExprTrait<typename DMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2002 , INVALID_TYPE >::Type Type;
2011 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2012 struct DMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, SMatScalarMultExpr<MT2,ST2,true> >
2016 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2017 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2018 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2019 ,
typename DMatScalarMultExprTrait<typename DMatTSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2020 , INVALID_TYPE >::Type Type;
2037 template<
typename MT1,
typename ST,
typename MT2 >
2038 struct TDMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
2042 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2043 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2044 IsNumeric<ST>::value
2045 ,
typename TDMatScalarMultExprTrait<typename TDMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2046 , INVALID_TYPE >::Type Type;
2055 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2056 struct TDMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, SMatScalarMultExpr<MT2,ST2,false> >
2060 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2061 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2062 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2063 ,
typename TDMatScalarMultExprTrait<typename TDMatSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2064 , INVALID_TYPE >::Type Type;
2081 template<
typename MT1,
typename ST,
typename MT2 >
2082 struct TDMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
2086 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2087 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2088 IsNumeric<ST>::value
2089 ,
typename TDMatScalarMultExprTrait<typename TDMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2090 , INVALID_TYPE >::Type Type;
2099 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2100 struct TDMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, SMatScalarMultExpr<MT2,ST2,true> >
2104 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2105 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2106 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2107 ,
typename TDMatScalarMultExprTrait<typename TDMatTSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2108 , INVALID_TYPE >::Type Type;
2125 template<
typename MT1,
typename ST,
typename MT2 >
2126 struct SMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
2130 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2131 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2132 IsNumeric<ST>::value
2133 ,
typename DMatScalarMultExprTrait<typename SMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2134 , INVALID_TYPE >::Type Type;
2143 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2144 struct SMatDMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,false> >
2148 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2149 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2150 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2151 ,
typename DMatScalarMultExprTrait<typename SMatDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2152 , INVALID_TYPE >::Type Type;
2169 template<
typename MT1,
typename ST,
typename MT2 >
2170 struct SMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
2174 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2175 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2176 IsNumeric<ST>::value
2177 ,
typename DMatScalarMultExprTrait<typename SMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2178 , INVALID_TYPE >::Type Type;
2187 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2188 struct SMatTDMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,true> >
2192 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2193 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2194 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2195 ,
typename DMatScalarMultExprTrait<typename SMatTDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2196 , INVALID_TYPE >::Type Type;
2213 template<
typename MT1,
typename ST,
typename MT2 >
2214 struct TSMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
2218 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2219 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2220 IsNumeric<ST>::value
2221 ,
typename TDMatScalarMultExprTrait<typename TSMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2222 , INVALID_TYPE >::Type Type;
2231 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2232 struct TSMatDMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,false> >
2236 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2237 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2238 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2239 ,
typename TDMatScalarMultExprTrait<typename TSMatDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2240 , INVALID_TYPE >::Type Type;
2257 template<
typename MT1,
typename ST,
typename MT2 >
2258 struct TSMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
2262 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2263 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2264 IsNumeric<ST>::value
2265 ,
typename TDMatScalarMultExprTrait<typename TSMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2266 , INVALID_TYPE >::Type Type;
2275 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2276 struct TSMatTDMatMultExprTrait< SMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,true> >
2280 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2281 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2282 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2283 ,
typename TDMatScalarMultExprTrait<typename TSMatTDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2284 , INVALID_TYPE >::Type Type;
2301 template<
typename MT,
typename ST,
bool SO >
2302 struct RowExprTrait< DMatScalarMultExpr<MT,ST,SO> >
2306 typedef typename MultExprTrait< typename RowExprTrait<const MT>::Type, ST >::Type Type;
2323 template<
typename MT,
typename ST,
bool SO >
2324 struct ColumnExprTrait< DMatScalarMultExpr<MT,ST,SO> >
2328 typedef typename MultExprTrait< typename ColumnExprTrait<const MT>::Type, ST >::Type Type;