22 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATSCALARMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_DMATSCALARMULTEXPR_H_
89 typedef typename MT::ResultType
RT;
90 typedef typename MT::ReturnType
RN;
91 typedef typename MT::ElementType
ET;
92 typedef typename MT::CompositeType
CT;
120 template<
typename MT2 >
122 enum { value = useAssign };
151 enum { vectorizable = MT::vectorizable &&
250 template<
typename T >
252 return matrix_.isAliased( alias );
276 template<
typename MT2 >
285 const size_t m( (~lhs).
rows() );
286 const size_t n( (~lhs).
columns() );
287 for(
size_t i=0UL; i<m; ++i ) {
288 for(
size_t j=0UL; j<n; ++j ) {
310 template<
typename MT2 >
319 const size_t m( (~lhs).
rows() );
320 const size_t n( (~lhs).
columns() );
321 for(
size_t j=0UL; j<n; ++j ) {
322 for(
size_t i=0UL; i<m; ++i ) {
344 template<
typename MT2 >
345 friend inline typename EnableIf< UseAssign<MT2> >::Type
351 assign( ~lhs, rhs.matrix_ );
353 for(
size_t i=0UL; i<(~lhs).
rows(); ++i )
355 typename MT2::Iterator element( (~lhs).begin(i) );
356 const typename MT2::Iterator end( (~lhs).end(i) );
358 for( ; element!=end; ++element )
359 element->value() *= rhs.scalar_;
379 template<
typename MT2 >
380 friend inline typename EnableIf< UseAssign<MT2> >::Type
386 assign( ~lhs, rhs.matrix_ );
388 for(
size_t j=0UL; j<(~lhs).
columns(); ++j )
390 typename MT2::Iterator element( (~lhs).begin(j) );
391 const typename MT2::Iterator end( (~lhs).end(j) );
393 for( ; element!=end; ++element )
394 element->value() *= rhs.scalar_;
414 template<
typename MT2
416 friend inline typename EnableIf< UseAssign<MT2> >::Type
450 template<
typename MT2
452 friend inline typename EnableIf< UseAssign<MT2> >::Type
517 template<
typename MT
519 inline const DMatScalarMultExpr<MT,typename BaseElementType<MT>::Type,SO>
557 template<
typename T1
560 inline const typename EnableIf< IsNumeric<T2>,
typename MultExprTrait<T1,T2>::Type >::Type
564 return Type( ~mat, scalar );
590 template<
typename T1
593 inline const typename EnableIf< IsNumeric<T1>,
typename MultExprTrait<T1,T2>::Type >::Type
597 return Type( ~mat, scalar );
622 template<
typename VT
625 inline const DMatScalarMultExpr<VT,ST,TF>
626 operator-(
const DMatScalarMultExpr<VT,ST,TF>& dm )
628 return DMatScalarMultExpr<VT,ST,TF>( dm.leftOperand(), -dm.rightOperand() );
655 template<
typename MT
659 inline const typename EnableIf< IsNumeric<ST2>
660 ,
typename MultExprTrait< DMatScalarMultExpr<MT,ST1,SO>, ST2 >::Type >::Type
661 operator*(
const DMatScalarMultExpr<MT,ST1,SO>& mat, ST2 scalar )
663 return mat.leftOperand() * ( mat.rightOperand() * scalar );
682 template<
typename ST1
686 inline const typename EnableIf< IsNumeric<ST1>
687 ,
typename MultExprTrait< ST1, DMatScalarMultExpr<MT,ST2,SO> >::Type >::Type
688 operator*( ST1 scalar,
const DMatScalarMultExpr<MT,ST2,SO>& mat )
690 return mat.leftOperand() * ( scalar * mat.rightOperand() );
709 template<
typename MT
713 inline const typename EnableIf< IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>
714 ,
typename DivExprTrait< DMatScalarMultExpr<MT,ST1,SO>, ST2 >::Type >::Type
715 operator/(
const DMatScalarMultExpr<MT,ST1,SO>& mat, ST2 scalar )
717 return mat.leftOperand() * ( mat.rightOperand() / scalar );
737 template<
typename MT
741 inline const typename MultExprTrait< DMatScalarMultExpr<MT,ST,SO>, VT >::Type
742 operator*(
const DMatScalarMultExpr<MT,ST,SO>& mat,
const DenseVector<VT,false>& vec )
744 return ( mat.leftOperand() * (~vec) ) * mat.rightOperand();
764 template<
typename VT
768 inline const typename MultExprTrait< VT, DMatScalarMultExpr<MT,ST,SO> >::Type
769 operator*(
const DenseVector<VT,true>& vec,
const DMatScalarMultExpr<MT,ST,SO>& mat )
771 return ( (~vec) * mat.leftOperand() ) * mat.rightOperand();
793 template<
typename MT
798 inline const DVecScalarMultExpr<typename MultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type,
false>
799 operator*(
const DMatScalarMultExpr<MT,ST1,SO>& mat,
const DVecScalarMultExpr<VT,ST2,false>& vec )
801 return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
823 template<
typename VT
828 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,SO> >::Type
829 operator*(
const DVecScalarMultExpr<VT,ST1,true>& vec,
const DMatScalarMultExpr<MT,ST2,SO>& mat )
831 return ( vec.leftOperand() * mat.leftOperand() ) * ( vec.rightOperand() * mat.rightOperand() );
851 template<
typename MT
855 inline const typename MultExprTrait< DMatScalarMultExpr<MT,ST,SO>, VT >::Type
858 return ( mat.leftOperand() * (~vec) ) * mat.rightOperand();
878 template<
typename VT
882 inline const typename MultExprTrait< VT, DMatScalarMultExpr<MT,ST,SO> >::Type
885 return ( (~vec) * mat.leftOperand() ) * mat.rightOperand();
907 template<
typename MT
915 return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
937 template<
typename VT
942 inline const typename MultExprTrait< SVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,SO> >::Type
945 return ( vec.leftOperand() * mat.leftOperand() ) * ( vec.rightOperand() * mat.rightOperand() );
965 template<
typename MT1
970 inline const typename MultExprTrait< DMatScalarMultExpr<MT1,ST,SO1>, MT2 >::Type
971 operator*(
const DMatScalarMultExpr<MT1,ST,SO1>& lhs,
const DenseMatrix<MT2,SO2>& rhs )
973 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
993 template<
typename MT1
998 inline const typename MultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,SO2> >::Type
999 operator*(
const DenseMatrix<MT1,SO1>& lhs,
const DMatScalarMultExpr<MT2,ST,SO2>& rhs )
1001 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1021 template<
typename MT1
1027 inline const typename MultExprTrait< DMatScalarMultExpr<MT1,ST1,SO1>, DMatScalarMultExpr<MT2,ST2,SO2> >::Type
1028 operator*(
const DMatScalarMultExpr<MT1,ST1,SO1>& lhs,
const DMatScalarMultExpr<MT2,ST2,SO2>& rhs )
1030 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1050 template<
typename MT1
1055 inline const typename MultExprTrait< DMatScalarMultExpr<MT1,ST,SO1>, MT2 >::Type
1058 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1078 template<
typename MT1
1083 inline const typename MultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,SO2> >::Type
1086 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1107 template<
typename MT1
1116 return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
1137 template<
typename MT1
1143 inline const typename MultExprTrait< SMatScalarMultExpr<MT1,ST1,SO1>, DMatScalarMultExpr<MT2,ST2,SO2> >::Type
1146 return ( mat.leftOperand() * vec.leftOperand() ) * ( mat.rightOperand() * vec.rightOperand() );
1162 template<
typename MT,
typename ST1,
typename ST2 >
1163 struct DMatScalarMultExprTrait< DMatScalarMultExpr<MT,ST1,false>, ST2 >
1167 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1168 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1169 ,
typename DMatScalarMultExprTrait<MT,typename MultTrait<ST1,ST2>::Type>::Type
1170 , INVALID_TYPE >::Type Type;
1187 template<
typename MT,
typename ST1,
typename ST2 >
1188 struct TDMatScalarMultExprTrait< DMatScalarMultExpr<MT,ST1,true>, ST2 >
1192 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1193 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1194 ,
typename TDMatScalarMultExprTrait<MT,typename MultTrait<ST1,ST2>::Type>::Type
1195 , INVALID_TYPE >::Type Type;
1212 template<
typename MT,
typename ST1,
typename ST2 >
1213 struct DMatScalarDivExprTrait< DMatScalarMultExpr<MT,ST1,false>, ST2 >
1217 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1221 typedef typename DMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1222 typedef typename DMatScalarDivExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1227 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1228 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1229 ,
typename SelectType<condition,T1,T2>::Type
1230 , INVALID_TYPE >::Type Type;
1247 template<
typename MT,
typename ST1,
typename ST2 >
1248 struct TDMatScalarDivExprTrait< DMatScalarMultExpr<MT,ST1,true>, ST2 >
1252 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1256 typedef typename TDMatScalarMultExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1257 typedef typename TDMatScalarDivExprTrait<MT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1262 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1263 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1264 ,
typename SelectType<condition,T1,T2>::Type
1265 , INVALID_TYPE >::Type Type;
1282 template<
typename MT,
typename ST,
typename VT >
1283 struct DMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST,false>, VT >
1287 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1288 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1289 IsNumeric<ST>::value
1290 ,
typename DVecScalarMultExprTrait<typename DMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1291 , INVALID_TYPE >::Type Type;
1300 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1301 struct DMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST1,false>, DVecScalarMultExpr<VT,ST2,false> >
1305 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1306 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1307 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1308 ,
typename DVecScalarMultExprTrait<typename DMatDVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1309 , INVALID_TYPE >::Type Type;
1326 template<
typename MT,
typename ST,
typename VT >
1327 struct TDMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST,true>, VT >
1331 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1332 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1333 IsNumeric<ST>::value
1334 ,
typename DVecScalarMultExprTrait<typename TDMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
1335 , INVALID_TYPE >::Type Type;
1344 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1345 struct TDMatDVecMultExprTrait< DMatScalarMultExpr<MT,ST1,true>, DVecScalarMultExpr<VT,ST2,false> >
1349 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1350 IsDenseVector<VT>::value && !IsTransposeVector<VT>::value &&
1351 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1352 ,
typename DVecScalarMultExprTrait<typename TDMatDVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1353 , INVALID_TYPE >::Type Type;
1370 template<
typename VT,
typename MT,
typename ST >
1371 struct TDVecDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,false> >
1375 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1376 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1377 IsNumeric<ST>::value
1378 ,
typename TDVecScalarMultExprTrait<typename TDVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
1379 , INVALID_TYPE >::Type Type;
1388 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1389 struct TDVecDMatMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,false> >
1393 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1394 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1395 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1396 ,
typename TDVecScalarMultExprTrait<typename TDVecDMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1397 , INVALID_TYPE >::Type Type;
1414 template<
typename VT,
typename MT,
typename ST >
1415 struct TDVecTDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,true> >
1419 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1420 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1421 IsNumeric<ST>::value
1422 ,
typename TDVecScalarMultExprTrait<typename TDVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
1423 , INVALID_TYPE >::Type Type;
1432 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1433 struct TDVecTDMatMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,true> >
1437 typedef typename SelectType< IsDenseVector<VT>::value && IsTransposeVector<VT>::value &&
1438 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1439 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1440 ,
typename TDVecScalarMultExprTrait<typename TDVecTDMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1441 , INVALID_TYPE >::Type Type;
1458 template<
typename MT,
typename ST,
typename VT >
1459 struct DMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST,false>, VT >
1463 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1464 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1465 IsNumeric<ST>::value
1466 ,
typename DVecScalarMultExprTrait<typename DMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1467 , INVALID_TYPE >::Type Type;
1476 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1477 struct DMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST1,false>,
SVecScalarMultExpr<VT,ST2,false> >
1481 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1482 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1483 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1484 ,
typename DVecScalarMultExprTrait<typename DMatSVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1485 , INVALID_TYPE >::Type Type;
1502 template<
typename MT,
typename ST,
typename VT >
1503 struct TDMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST,true>, VT >
1507 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1508 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1509 IsNumeric<ST>::value
1510 ,
typename DVecScalarMultExprTrait<typename TDMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1511 , INVALID_TYPE >::Type Type;
1520 template<
typename MT,
typename ST1,
typename VT,
typename ST2 >
1521 struct TDMatSVecMultExprTrait< DMatScalarMultExpr<MT,ST1,true>,
SVecScalarMultExpr<VT,ST2,false> >
1525 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1526 IsSparseVector<VT>::value && !IsTransposeVector<VT>::value &&
1527 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1528 ,
typename DVecScalarMultExprTrait<typename TDMatSVecMultExprTrait<MT,VT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1529 , INVALID_TYPE >::Type Type;
1546 template<
typename VT,
typename MT,
typename ST >
1547 struct TSVecDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,false> >
1551 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1552 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1553 IsNumeric<ST>::value
1554 ,
typename TDVecScalarMultExprTrait<typename TSVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
1555 , INVALID_TYPE >::Type Type;
1564 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1565 struct TSVecDMatMultExprTrait<
SVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,false> >
1569 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1570 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1571 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1572 ,
typename TDVecScalarMultExprTrait<typename TSVecDMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1573 , INVALID_TYPE >::Type Type;
1590 template<
typename VT,
typename MT,
typename ST >
1591 struct TSVecTDMatMultExprTrait< VT, DMatScalarMultExpr<MT,ST,true> >
1595 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1596 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1597 IsNumeric<ST>::value
1598 ,
typename TDVecScalarMultExprTrait<typename TSVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
1599 , INVALID_TYPE >::Type Type;
1608 template<
typename VT,
typename ST1,
typename MT,
typename ST2 >
1609 struct TSVecTDMatMultExprTrait<
SVecScalarMultExpr<VT,ST1,true>, DMatScalarMultExpr<MT,ST2,true> >
1613 typedef typename SelectType< IsSparseVector<VT>::value && IsTransposeVector<VT>::value &&
1614 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1615 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1616 ,
typename TDVecScalarMultExprTrait<typename TSVecTDMatMultExprTrait<VT,MT>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1617 , INVALID_TYPE >::Type Type;
1634 template<
typename MT1,
typename ST,
typename MT2 >
1635 struct DMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
1639 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1640 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1641 IsNumeric<ST>::value
1642 ,
typename DMatScalarMultExprTrait<typename DMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1643 , INVALID_TYPE >::Type Type;
1652 template<
typename MT1,
typename MT2,
typename ST >
1653 struct DMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
1657 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1658 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1659 IsNumeric<ST>::value
1660 ,
typename DMatScalarMultExprTrait<typename DMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1661 , INVALID_TYPE >::Type Type;
1670 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1671 struct DMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,false> >
1675 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1676 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1677 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1678 ,
typename DMatScalarMultExprTrait<typename DMatDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1679 , INVALID_TYPE >::Type Type;
1696 template<
typename MT1,
typename ST,
typename MT2 >
1697 struct DMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
1701 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1702 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1703 IsNumeric<ST>::value
1704 ,
typename DMatScalarMultExprTrait<typename DMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1705 , INVALID_TYPE >::Type Type;
1714 template<
typename MT1,
typename MT2,
typename ST >
1715 struct DMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
1719 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1720 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1721 IsNumeric<ST>::value
1722 ,
typename DMatScalarMultExprTrait<typename DMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1723 , INVALID_TYPE >::Type Type;
1732 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1733 struct DMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,true> >
1737 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1738 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1739 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1740 ,
typename DMatScalarMultExprTrait<typename DMatTDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1741 , INVALID_TYPE >::Type Type;
1758 template<
typename MT1,
typename ST,
typename MT2 >
1759 struct TDMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
1763 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1764 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1765 IsNumeric<ST>::value
1766 ,
typename TDMatScalarMultExprTrait<typename TDMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1767 , INVALID_TYPE >::Type Type;
1776 template<
typename MT1,
typename MT2,
typename ST >
1777 struct TDMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
1781 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1782 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1783 IsNumeric<ST>::value
1784 ,
typename TDMatScalarMultExprTrait<typename TDMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1785 , INVALID_TYPE >::Type Type;
1794 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1795 struct TDMatDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,false> >
1799 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1800 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1801 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1802 ,
typename TDMatScalarMultExprTrait<typename TDMatDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1803 , INVALID_TYPE >::Type Type;
1820 template<
typename MT1,
typename ST,
typename MT2 >
1821 struct TDMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
1825 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1826 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1827 IsNumeric<ST>::value
1828 ,
typename TDMatScalarMultExprTrait<typename TDMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1829 , INVALID_TYPE >::Type Type;
1838 template<
typename MT1,
typename MT2,
typename ST >
1839 struct TDMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
1843 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1844 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1845 IsNumeric<ST>::value
1846 ,
typename TDMatScalarMultExprTrait<typename TDMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1847 , INVALID_TYPE >::Type Type;
1856 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1857 struct TDMatTDMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,true> >
1861 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1862 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1863 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1864 ,
typename TDMatScalarMultExprTrait<typename TDMatTDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1865 , INVALID_TYPE >::Type Type;
1882 template<
typename MT1,
typename ST,
typename MT2 >
1883 struct DMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
1887 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1888 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1889 IsNumeric<ST>::value
1890 ,
typename DMatScalarMultExprTrait<typename DMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1891 , INVALID_TYPE >::Type Type;
1900 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1901 struct DMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>,
SMatScalarMultExpr<MT2,ST2,false> >
1905 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1906 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1907 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1908 ,
typename DMatScalarMultExprTrait<typename DMatSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1909 , INVALID_TYPE >::Type Type;
1926 template<
typename MT1,
typename ST,
typename MT2 >
1927 struct DMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,false>, MT2 >
1931 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1932 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1933 IsNumeric<ST>::value
1934 ,
typename DMatScalarMultExprTrait<typename DMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1935 , INVALID_TYPE >::Type Type;
1944 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1945 struct DMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,false>,
SMatScalarMultExpr<MT2,ST2,true> >
1949 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
1950 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
1951 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1952 ,
typename DMatScalarMultExprTrait<typename DMatTSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1953 , INVALID_TYPE >::Type Type;
1970 template<
typename MT1,
typename ST,
typename MT2 >
1971 struct TDMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
1975 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1976 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1977 IsNumeric<ST>::value
1978 ,
typename TDMatScalarMultExprTrait<typename TDMatSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
1979 , INVALID_TYPE >::Type Type;
1988 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
1989 struct TDMatSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>,
SMatScalarMultExpr<MT2,ST2,false> >
1993 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
1994 IsSparseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
1995 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1996 ,
typename TDMatScalarMultExprTrait<typename TDMatSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1997 , INVALID_TYPE >::Type Type;
2014 template<
typename MT1,
typename ST,
typename MT2 >
2015 struct TDMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST,true>, MT2 >
2019 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2020 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2021 IsNumeric<ST>::value
2022 ,
typename TDMatScalarMultExprTrait<typename TDMatTSMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2023 , INVALID_TYPE >::Type Type;
2032 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2033 struct TDMatTSMatMultExprTrait< DMatScalarMultExpr<MT1,ST1,true>,
SMatScalarMultExpr<MT2,ST2,true> >
2037 typedef typename SelectType< IsDenseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2038 IsSparseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2039 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2040 ,
typename TDMatScalarMultExprTrait<typename TDMatTSMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2041 , INVALID_TYPE >::Type Type;
2058 template<
typename MT1,
typename ST,
typename MT2 >
2059 struct SMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
2063 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2064 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2065 IsNumeric<ST>::value
2066 ,
typename DMatScalarMultExprTrait<typename SMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2067 , INVALID_TYPE >::Type Type;
2076 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2077 struct SMatDMatMultExprTrait<
SMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,false> >
2081 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2082 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2083 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2084 ,
typename DMatScalarMultExprTrait<typename SMatDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2085 , INVALID_TYPE >::Type Type;
2102 template<
typename MT1,
typename ST,
typename MT2 >
2103 struct SMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
2107 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2108 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2109 IsNumeric<ST>::value
2110 ,
typename DMatScalarMultExprTrait<typename SMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2111 , INVALID_TYPE >::Type Type;
2120 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2121 struct SMatTDMatMultExprTrait<
SMatScalarMultExpr<MT1,ST1,false>, DMatScalarMultExpr<MT2,ST2,true> >
2125 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsRowMajorMatrix<MT1>::value &&
2126 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2127 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2128 ,
typename DMatScalarMultExprTrait<typename SMatTDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2129 , INVALID_TYPE >::Type Type;
2146 template<
typename MT1,
typename ST,
typename MT2 >
2147 struct TSMatDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,false> >
2151 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2152 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2153 IsNumeric<ST>::value
2154 ,
typename TDMatScalarMultExprTrait<typename TSMatDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2155 , INVALID_TYPE >::Type Type;
2164 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2165 struct TSMatDMatMultExprTrait<
SMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,false> >
2169 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2170 IsDenseMatrix<MT2>::value && IsRowMajorMatrix<MT2>::value &&
2171 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2172 ,
typename TDMatScalarMultExprTrait<typename TSMatDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2173 , INVALID_TYPE >::Type Type;
2190 template<
typename MT1,
typename ST,
typename MT2 >
2191 struct TSMatTDMatMultExprTrait< MT1, DMatScalarMultExpr<MT2,ST,true> >
2195 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2196 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2197 IsNumeric<ST>::value
2198 ,
typename TDMatScalarMultExprTrait<typename TSMatTDMatMultExprTrait<MT1,MT2>::Type,ST>::Type
2199 , INVALID_TYPE >::Type Type;
2208 template<
typename MT1,
typename ST1,
typename MT2,
typename ST2 >
2209 struct TSMatTDMatMultExprTrait<
SMatScalarMultExpr<MT1,ST1,true>, DMatScalarMultExpr<MT2,ST2,true> >
2213 typedef typename SelectType< IsSparseMatrix<MT1>::value && IsColumnMajorMatrix<MT1>::value &&
2214 IsDenseMatrix<MT2>::value && IsColumnMajorMatrix<MT2>::value &&
2215 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2216 ,
typename TDMatScalarMultExprTrait<typename TSMatTDMatMultExprTrait<MT1,MT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2217 , INVALID_TYPE >::Type Type;