35 #ifndef _BLAZE_MATH_EXPRESSIONS_DVECSCALARMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_DVECSCALARMULTEXPR_H_
105 template<
typename VT
144 template<
typename VT2 >
147 enum { value = useAssign };
418 enum { vectorizable = VT::vectorizable &&
423 enum { smpAssignable = VT::smpAssignable };
522 template<
typename T >
534 template<
typename T >
536 return vector_.isAliased( alias );
580 template<
typename VT2 >
608 template<
typename VT2 >
636 template<
typename VT2 >
637 friend inline typename EnableIf< UseAssign<VT2> >::Type
672 template<
typename VT2 >
673 friend inline typename EnableIf< UseAssign<VT2> >::Type
708 template<
typename VT2 >
709 friend inline typename EnableIf< UseAssign<VT2> >::Type
767 template<
typename VT
769 inline const DVecScalarMultExpr<VT,typename BaseElementType<VT>::Type,TF>
810 template<
typename T1
813 inline const typename EnableIf< IsNumeric<T2>,
typename MultExprTrait<T1,T2>::Type >::Type
819 return Type( ~vec, scalar );
846 template<
typename T1
849 inline const typename EnableIf< IsNumeric<T1>,
typename MultExprTrait<T1,T2>::Type >::Type
855 return Type( ~vec, scalar );
886 template<
typename VT
888 inline const DVecScalarMultExpr<VT,typename VT::ElementType,TF>
895 const ElementType len (
length( ~vec ) );
923 template<
typename VT
926 inline const DVecScalarMultExpr<VT,ST,TF>
927 operator-(
const DVecScalarMultExpr<VT,ST,TF>& dv )
931 return DVecScalarMultExpr<VT,ST,TF>( dv.leftOperand(), -dv.rightOperand() );
958 template<
typename VT
962 inline const typename EnableIf< IsNumeric<ST2>
963 ,
typename MultExprTrait< DVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
964 operator*(
const DVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
968 return vec.leftOperand() * ( vec.rightOperand() * scalar );
987 template<
typename ST1
991 inline const typename EnableIf< IsNumeric<ST1>
992 ,
typename MultExprTrait< ST1, DVecScalarMultExpr<VT,ST2,TF> >::Type >::Type
993 operator*( ST1 scalar,
const DVecScalarMultExpr<VT,ST2,TF>& vec )
997 return vec.leftOperand() * ( scalar * vec.rightOperand() );
1016 template<
typename VT
1020 inline const typename EnableIf< IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>
1021 ,
typename DivExprTrait< DVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
1022 operator/(
const DVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
1026 return vec.leftOperand() * ( vec.rightOperand() / scalar );
1046 template<
typename VT1
1050 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
1051 operator*(
const DVecScalarMultExpr<VT1,ST,TF>& lhs,
const DenseVector<VT2,TF>& rhs )
1055 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1075 template<
typename VT1
1079 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,TF> >::Type
1080 operator*(
const DenseVector<VT1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST,TF>& rhs )
1084 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1104 template<
typename VT1
1109 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,TF>, DVecScalarMultExpr<VT2,ST2,TF> >::Type
1110 operator*(
const DVecScalarMultExpr<VT1,ST1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST2,TF>& rhs )
1114 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1134 template<
typename VT1
1137 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
1138 operator*(
const DVecScalarMultExpr<VT1,ST,false>& lhs,
const DenseVector<VT2,true>& rhs )
1142 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1162 template<
typename VT1
1165 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >::Type
1166 operator*(
const DenseVector<VT1,false>& lhs,
const DVecScalarMultExpr<VT2,ST,true>& rhs )
1170 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1190 template<
typename VT1
1194 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >::Type
1195 operator*(
const DVecScalarMultExpr<VT1,ST1,false>& lhs,
const DVecScalarMultExpr<VT2,ST2,true>& rhs )
1199 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1219 template<
typename VT1
1223 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
1224 operator*(
const DVecScalarMultExpr<VT1,ST,TF>& lhs,
const SparseVector<VT2,TF>& rhs )
1228 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1248 template<
typename VT1
1252 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,TF> >::Type
1253 operator*(
const SparseVector<VT1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST,TF>& rhs )
1257 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1278 template<
typename VT1
1283 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,TF>, SVecScalarMultExpr<VT2,ST2,TF> >::Type
1284 operator*(
const DVecScalarMultExpr<VT1,ST1,TF>& lhs,
const SVecScalarMultExpr<VT2,ST2,TF>& rhs )
1288 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1309 template<
typename VT1
1314 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,TF>, DVecScalarMultExpr<VT2,ST2,TF> >::Type
1315 operator*(
const SVecScalarMultExpr<VT1,ST1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST2,TF>& rhs )
1319 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1339 template<
typename VT1
1342 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
1343 operator*(
const DVecScalarMultExpr<VT1,ST,false>& lhs,
const SparseVector<VT2,true>& rhs )
1347 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1367 template<
typename VT1
1370 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >::Type
1371 operator*(
const SparseVector<VT1,false>& lhs,
const DVecScalarMultExpr<VT2,ST,true>& rhs )
1375 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1396 template<
typename VT1
1400 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >::Type
1401 operator*(
const DVecScalarMultExpr<VT1,ST1,false>& lhs,
const SVecScalarMultExpr<VT2,ST2,true>& rhs )
1405 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1426 template<
typename VT1
1430 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >::Type
1431 operator*(
const SVecScalarMultExpr<VT1,ST1,false>& lhs,
const DVecScalarMultExpr<VT2,ST2,true>& rhs )
1435 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1455 template<
typename MT
1459 inline const typename MultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >::Type
1460 operator*(
const DenseMatrix<MT,SO>& mat,
const DVecScalarMultExpr<VT,ST,false>& vec )
1464 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1484 template<
typename VT
1488 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >::Type
1489 operator*(
const DVecScalarMultExpr<VT,ST,true>& vec,
const DenseMatrix<MT,SO>& mat )
1493 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1513 template<
typename MT
1517 inline const typename MultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >::Type
1518 operator*(
const SparseMatrix<MT,SO>& mat,
const DVecScalarMultExpr<VT,ST,false>& vec )
1522 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1542 template<
typename VT
1546 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >::Type
1547 operator*(
const DVecScalarMultExpr<VT,ST,true>& vec,
const SparseMatrix<MT,SO>& mat )
1551 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1567 template<
typename VT,
typename ST1,
typename ST2 >
1568 struct DVecScalarMultExprTrait< DVecScalarMultExpr<VT,ST1,false>, ST2 >
1572 typedef typename SelectType< IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
1573 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1574 ,
typename DVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1575 , INVALID_TYPE >::Type Type;
1592 template<
typename VT,
typename ST1,
typename ST2 >
1593 struct TDVecScalarMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, ST2 >
1597 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
1598 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1599 ,
typename TDVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1600 , INVALID_TYPE >::Type Type;
1617 template<
typename VT,
typename ST1,
typename ST2 >
1618 struct DVecScalarDivExprTrait< DVecScalarMultExpr<VT,ST1,false>, ST2 >
1622 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1626 typedef typename DVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1627 typedef typename DVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1632 typedef typename SelectType< IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
1633 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1634 ,
typename SelectType<condition,T1,T2>::Type
1635 , INVALID_TYPE >::Type Type;
1652 template<
typename VT,
typename ST1,
typename ST2 >
1653 struct TDVecScalarDivExprTrait< DVecScalarMultExpr<VT,ST1,true>, ST2 >
1657 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1661 typedef typename TDVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1662 typedef typename TDVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1667 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
1668 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1669 ,
typename SelectType<condition,T1,T2>::Type
1670 , INVALID_TYPE >::Type Type;
1687 template<
typename VT1,
typename ST,
typename VT2 >
1688 struct DVecDVecMultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >
1692 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1693 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
1694 IsNumeric<ST>::value
1695 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1696 , INVALID_TYPE >::Type Type;
1705 template<
typename VT1,
typename VT2,
typename ST >
1706 struct DVecDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,false> >
1710 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1711 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
1712 IsNumeric<ST>::value
1713 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1714 , INVALID_TYPE >::Type Type;
1723 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1724 struct DVecDVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,false> >
1728 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1729 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
1730 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1731 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1732 , INVALID_TYPE >::Type Type;
1749 template<
typename VT1,
typename ST,
typename VT2 >
1750 struct DVecTDVecMultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >
1754 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1755 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1756 IsNumeric<ST>::value
1757 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1758 , INVALID_TYPE >::Type Type;
1767 template<
typename VT1,
typename VT2,
typename ST >
1768 struct DVecTDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >
1772 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1773 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1774 IsNumeric<ST>::value
1775 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1776 , INVALID_TYPE >::Type Type;
1785 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1786 struct DVecTDVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >
1790 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1791 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1792 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1793 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1794 , INVALID_TYPE >::Type Type;
1811 template<
typename VT1,
typename ST,
typename VT2 >
1812 struct TDVecTDVecMultExprTrait< DVecScalarMultExpr<VT1,ST,true>, VT2 >
1816 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
1817 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1818 IsNumeric<ST>::value
1819 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1820 , INVALID_TYPE >::Type Type;
1829 template<
typename VT1,
typename VT2,
typename ST >
1830 struct TDVecTDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >
1834 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
1835 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1836 IsNumeric<ST>::value
1837 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1838 , INVALID_TYPE >::Type Type;
1847 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1848 struct TDVecTDVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,true>, DVecScalarMultExpr<VT2,ST2,true> >
1852 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
1853 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1854 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1855 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1856 , INVALID_TYPE >::Type Type;
1873 template<
typename VT1,
typename VT2,
typename ST >
1874 struct DVecSVecMultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >
1878 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1879 IsSparseVector<VT2>::value && IsColumnVector<VT2>::value &&
1880 IsNumeric<ST>::value
1881 ,
typename SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1882 , INVALID_TYPE >::Type Type;
1891 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1892 struct DVecSVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,false> >
1896 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1897 IsSparseVector<VT2>::value && IsColumnVector<VT2>::value &&
1898 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1899 ,
typename SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1900 , INVALID_TYPE >::Type Type;
1917 template<
typename VT1,
typename ST,
typename VT2 >
1918 struct DVecTSVecMultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >
1922 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1923 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
1924 IsNumeric<ST>::value
1925 ,
typename SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1926 , INVALID_TYPE >::Type Type;
1935 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1936 struct DVecTSVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >
1940 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1941 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
1942 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1943 ,
typename SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1944 , INVALID_TYPE >::Type Type;
1961 template<
typename VT1,
typename ST,
typename VT2 >
1962 struct TDVecTSVecMultExprTrait< DVecScalarMultExpr<VT1,ST,true>, VT2 >
1966 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
1967 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
1968 IsNumeric<ST>::value
1969 ,
typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1970 , INVALID_TYPE >::Type Type;
1979 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1980 struct TDVecTSVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,true>, SVecScalarMultExpr<VT2,ST2,true> >
1984 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
1985 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
1986 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1987 ,
typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1988 , INVALID_TYPE >::Type Type;
2005 template<
typename VT1,
typename VT2,
typename ST >
2006 struct SVecDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,false> >
2010 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
2011 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
2012 IsNumeric<ST>::value
2013 ,
typename SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2014 , INVALID_TYPE >::Type Type;
2023 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2024 struct SVecDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,false> >
2028 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
2029 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
2030 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2031 ,
typename SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2032 , INVALID_TYPE >::Type Type;
2049 template<
typename VT1,
typename VT2,
typename ST >
2050 struct SVecTDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >
2054 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
2055 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2056 IsNumeric<ST>::value
2057 ,
typename TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2058 , INVALID_TYPE >::Type Type;
2067 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2068 struct SVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >
2072 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
2073 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2074 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2075 ,
typename TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2076 , INVALID_TYPE >::Type Type;
2093 template<
typename VT1,
typename VT2,
typename ST >
2094 struct TSVecTDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >
2098 typedef typename SelectType< IsSparseVector<VT1>::value && IsRowVector<VT1>::value &&
2099 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2100 IsNumeric<ST>::value
2101 ,
typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2102 , INVALID_TYPE >::Type Type;
2111 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2112 struct TSVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,true>, DVecScalarMultExpr<VT2,ST2,true> >
2116 typedef typename SelectType< IsSparseVector<VT1>::value && IsRowVector<VT1>::value &&
2117 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2118 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2119 ,
typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2120 , INVALID_TYPE >::Type Type;
2137 template<
typename MT,
typename VT,
typename ST >
2138 struct DMatDVecMultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >
2142 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2143 IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
2144 IsNumeric<ST>::value
2145 ,
typename DVecScalarMultExprTrait<typename DMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
2146 , INVALID_TYPE >::Type Type;
2163 template<
typename MT,
typename VT,
typename ST >
2164 struct TDMatDVecMultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >
2168 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2169 IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
2170 IsNumeric<ST>::value
2171 ,
typename DVecScalarMultExprTrait<typename TDMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
2172 , INVALID_TYPE >::Type Type;
2189 template<
typename VT,
typename MT,
typename ST >
2190 struct TDVecDMatMultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >
2194 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
2195 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2196 IsNumeric<ST>::value
2197 ,
typename TDVecScalarMultExprTrait<typename TDVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
2198 , INVALID_TYPE >::Type Type;
2215 template<
typename VT,
typename MT,
typename ST >
2216 struct TDVecTDMatMultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >
2220 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
2221 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2222 IsNumeric<ST>::value
2223 ,
typename TDVecScalarMultExprTrait<typename TDVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
2224 , INVALID_TYPE >::Type Type;
2241 template<
typename MT,
typename VT,
typename ST >
2242 struct SMatDVecMultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >
2246 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2247 IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
2248 IsNumeric<ST>::value
2249 ,
typename DVecScalarMultExprTrait<typename SMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
2250 , INVALID_TYPE >::Type Type;
2267 template<
typename MT,
typename VT,
typename ST >
2268 struct TSMatDVecMultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >
2272 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2273 IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
2274 IsNumeric<ST>::value
2275 ,
typename DVecScalarMultExprTrait<typename TSMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
2276 , INVALID_TYPE >::Type Type;
2293 template<
typename VT,
typename MT,
typename ST >
2294 struct TDVecSMatMultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >
2298 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
2299 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2300 IsNumeric<ST>::value
2301 ,
typename TDVecScalarMultExprTrait<typename TDVecSMatMultExprTrait<VT,MT>::Type,ST>::Type
2302 , INVALID_TYPE >::Type Type;
2319 template<
typename VT,
typename MT,
typename ST >
2320 struct TDVecTSMatMultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >
2324 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
2325 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2326 IsNumeric<ST>::value
2327 ,
typename TDVecScalarMultExprTrait<typename TDVecTSMatMultExprTrait<VT,MT>::Type,ST>::Type
2328 , INVALID_TYPE >::Type Type;
2345 template<
typename VT,
typename ST,
bool TF,
bool AF >
2346 struct SubvectorExprTrait< DVecScalarMultExpr<VT,ST,TF>, AF >
2350 typedef typename MultExprTrait< typename SubvectorExprTrait<const VT,AF>::Type, ST >::Type Type;
Pointer difference type of the Blaze library.
Compile time check whether the given type is a computational expression template.This type trait clas...
Definition: IsComputation.h:89
Constraint on the data type.
Compile time check whether the given type is a temporary vector or matrix type.This type trait class ...
Definition: IsTemporary.h:87
const DMatDMatMultExpr< T1, T2 > operator*(const DenseMatrix< T1, false > &lhs, const DenseMatrix< T2, false > &rhs)
Multiplication operator for the multiplication of two row-major dense matrices ( ).
Definition: DMatDMatMultExpr.h:4075
const EnableIf< IsNumeric< T2 >, typename DivExprTrait< T1, T2 >::Type >::Type operator/(const DenseMatrix< T1, SO > &mat, T2 scalar)
Division operator for the division of a dense matrix by a scalar value ( ).
Definition: DMatScalarDivExpr.h:772
Header file for the SparseVector base class.
IntrinsicTrait< ElementType >::Type IntrinsicType
Resulting intrinsic element type.
Definition: DVecScalarMultExpr.h:158
ReturnType operator*() const
Direct access to the element at the current iterator position.
Definition: DVecScalarMultExpr.h:280
void smpSubAssign(DenseMatrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP subtraction assignment of a matrix to dense matrix.
Definition: DenseMatrix.h:151
Header file for the IsSparseMatrix type trait.
ConstIterator end() const
Returns an iterator just past the last non-zero element of the dense vector.
Definition: DVecScalarMultExpr.h:481
Efficient implementation of a compressed matrix.The CompressedMatrix class template is the represent...
Definition: CompressedMatrix.h:197
const ConstIterator operator++(int)
Post-increment operator.
Definition: DVecScalarMultExpr.h:249
void smpMultAssign(DenseVector< VT1, TF1 > &lhs, const Vector< VT2, TF2 > &rhs)
Default implementation of the SMP multiplication assignment of a vector to a dense vector...
Definition: DenseVector.h:178
Header file for the IsSame and IsStrictlySame type traits.
Header file for the IsColumnMajorMatrix type trait.
const This & CompositeType
Data type for composite expression templates.
Definition: CompressedMatrix.h:2384
Header file for the IsRowVector type trait.
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:249
Header file for the DenseVector base class.
ReturnType operator[](size_t index) const
Subscript operator for the direct access to the vector elements.
Definition: DVecScalarMultExpr.h:444
Header file for the Computation base class.
Type relationship analysis.This class tests if the two data types A and B are equal. For this type comparison, the cv-qualifiers of both data types are ignored. If A and B are the same data type (ignoring the cv-qualifiers), then the value member enumeration is set to 1, the nested type definition Type is TrueType, and the class derives from TrueType. Otherwise value is set to 0, Type is FalseType, and the class derives from FalseType.
Definition: IsSame.h:158
Header file for the RequiresEvaluation type trait.
MultExprTrait< RN, ST >::Type ExprReturnType
Expression return type for the subscript operator.
Definition: DVecScalarMultExpr.h:130
bool operator!=(const ConstIterator &rhs) const
Inequality comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:312
ConstIterator(IteratorType iterator, RightOperand scalar)
Constructor for the ConstIterator class.
Definition: DVecScalarMultExpr.h:203
Header file for the VecScalarMultExpr base class.
LeftOperand leftOperand() const
Returns the left-hand side dense vector operand.
Definition: DVecScalarMultExpr.h:501
ResultType::ElementType ElementType
Resulting element type.
Definition: DVecScalarMultExpr.h:157
Constraint on the data type.
ValueType value_type
Type of the underlying elements.
Definition: DVecScalarMultExpr.h:188
bool operator<=(const ConstIterator &rhs) const
Less-than comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:345
Header file for the SparseMatrix base class.
Header file for the DivExprTrait class template.
bool isAligned() const
Returns whether the operands of the expression are properly aligned in memory.
Definition: DVecScalarMultExpr.h:545
PointerType pointer
Pointer return type.
Definition: DVecScalarMultExpr.h:189
VT::ConstIterator IteratorType
ConstIterator type of the dense vector expression.
Definition: DVecScalarMultExpr.h:194
IntrinsicType load(size_t index) const
Access to the intrinsic elements of the vector.
Definition: DVecScalarMultExpr.h:456
SelectType< IsExpression< VT >::value, const VT, const VT & >::Type LeftOperand
Composite type of the left-hand side dense vector expression.
Definition: DVecScalarMultExpr.h:167
Header file for the MultExprTrait class template.
void smpAddAssign(DenseMatrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP addition assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:121
Compile time check to query the requirement to evaluate an expression.Via this type trait it is possi...
Definition: RequiresEvaluation.h:90
const This & CompositeType
Data type for composite expression templates.
Definition: CompressedMatrix.h:251
DVecScalarMultExpr(const VT &vector, ST scalar)
Constructor for the DVecScalarMultExpr class.
Definition: DVecScalarMultExpr.h:432
ptrdiff_t DifferenceType
Difference between two iterators.
Definition: DVecScalarMultExpr.h:184
Compile time type selection.The SelectType class template selects one of the two given types T1 and T...
Definition: SelectType.h:59
Header file for the IsTemporary type trait class.
Header file for the multiplication trait.
Header file for the dense vector SMP implementation.
Header file for the IsFloatingPoint type trait.
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:2388
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: DVecScalarMultExpr.h:523
Iterator over the elements of the dense vector.
Definition: DVecScalarMultExpr.h:176
Header file for the DenseMatrix base class.
const SelectType< returnExpr, ExprReturnType, ElementType >::Type ReturnType
Return type for expression template evaluations.
Definition: DVecScalarMultExpr.h:161
bool operator>(const ConstIterator &rhs) const
Greater-than comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:334
ResultType::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: DVecScalarMultExpr.h:156
void assign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the assignment of a matrix to a matrix.
Definition: Matrix.h:179
bool operator>=(const ConstIterator &rhs) const
Greater-than comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:356
ST RightOperand
Composite type of the right-hand side scalar value.
Definition: DVecScalarMultExpr.h:170
VT::ResultType RT
Result type of the dense vector expression.
Definition: DVecScalarMultExpr.h:114
Base class for N-dimensional dense vectors.The DenseVector class is a base class for all arbitrarily ...
Definition: DenseVector.h:70
#define BLAZE_CONSTRAINT_MUST_BE_SAME_TYPE(A, B)
Data type constraint.In case the two types A and B are not the same (ignoring all cv-qualifiers of bo...
Definition: SameType.h:89
Constraint on the data type.
#define BLAZE_CONSTRAINT_MUST_BE_REFERENCE_TYPE(T)
Constraint on the data type.In case the given data type T is not a reference type, a compilation error is created.
Definition: Reference.h:78
std::random_access_iterator_tag IteratorCategory
The iterator category.
Definition: DVecScalarMultExpr.h:180
Constraint on the data type.
DVecScalarMultExpr< VT, ST, TF > This
Type of this DVecScalarMultExpr instance.
Definition: DVecScalarMultExpr.h:154
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:2382
void multAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the multiplication assignment of a matrix to a matrix.
Definition: Matrix.h:269
bool operator<(const ConstIterator &rhs) const
Less-than comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:323
Header file for the SelectType class template.
LeftOperand vector_
Left-hand side dense vector of the multiplication expression.
Definition: DVecScalarMultExpr.h:562
Header file for all forward declarations for expression class templates.
CMathTrait< typename VT::ElementType >::Type length(const DenseVector< VT, TF > &dv)
Calculation of the dense vector length .
Definition: DenseVector.h:480
Header file for the IsDenseMatrix type trait.
size_t size() const
Returns the current size/dimension of the vector.
Definition: DVecScalarMultExpr.h:491
Header file for the EnableIf class template.
ReferenceType reference
Reference return type.
Definition: DVecScalarMultExpr.h:190
ConstIterator & operator++()
Pre-increment operator.
Definition: DVecScalarMultExpr.h:238
Header file for the BaseElementType type trait.
bool canSMPAssign() const
Returns whether the expression can be used in SMP assignments.
Definition: DVecScalarMultExpr.h:555
friend const ConstIterator operator+(const ConstIterator &it, size_t inc)
Addition between a ConstIterator and an integral value.
Definition: DVecScalarMultExpr.h:379
Header file for the IsNumeric type trait.
RightOperand scalar_
Right-hand side scalar of the multiplication expression.
Definition: DVecScalarMultExpr.h:563
ElementType ValueType
Type of the underlying elements.
Definition: DVecScalarMultExpr.h:181
bool operator==(const ConstIterator &rhs) const
Equality comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:301
Base class for all vector/scalar multiplication expression templates.The VecScalarMultExpr class serv...
Definition: VecScalarMultExpr.h:66
Header file for the IsSparseVector type trait.
const Type & ReturnType
Return type for expression template evaluations.
Definition: CompressedMatrix.h:2383
Intrinsic characteristics of data types.The IntrinsicTrait class template provides the intrinsic char...
Definition: IntrinsicTrait.h:748
Header file for run time assertion macros.
Utility type for generic codes.
Base template for the MultTrait class.
Definition: MultTrait.h:141
Header file for the division trait.
IteratorType iterator_
Iterator to the current element.
Definition: DVecScalarMultExpr.h:410
void addAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the addition assignment of a matrix to a matrix.
Definition: Matrix.h:209
bool isAliased(const T *alias) const
Returns whether the expression is aliased with the given address alias.
Definition: DVecScalarMultExpr.h:535
const DenseIterator< Type > operator-(const DenseIterator< Type > &it, ptrdiff_t inc)
Subtraction between a DenseIterator and an integral value.
Definition: DenseIterator.h:585
Substitution Failure Is Not An Error (SFINAE) class.The EnableIf class template is an auxiliary tool ...
Definition: EnableIf.h:184
Constraint on the data type.
#define BLAZE_CONSTRAINT_MUST_BE_NUMERIC_TYPE(T)
Constraint on the data type.In case the given data type T is not a numeric (integral or floating poin...
Definition: Numeric.h:79
RightOperand rightOperand() const
Returns the right-hand side scalar operand.
Definition: DVecScalarMultExpr.h:511
void subAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the subtraction assignment of a matrix to matrix.
Definition: Matrix.h:239
VT::ElementType ET
Element type of the dense vector expression.
Definition: DVecScalarMultExpr.h:116
friend const ConstIterator operator+(size_t inc, const ConstIterator &it)
Addition between an integral value and a ConstIterator.
Definition: DVecScalarMultExpr.h:391
ElementType * PointerType
Pointer return type.
Definition: DVecScalarMultExpr.h:182
Evaluation of the base element type of a given data type.Via this type trait it is possible to evalua...
Definition: BaseElementType.h:75
VT::ReturnType RN
Return type of the dense vector expression.
Definition: DVecScalarMultExpr.h:115
Header file for the IsDenseVector type trait.
friend const ConstIterator operator-(const ConstIterator &it, size_t dec)
Subtraction between a ConstIterator and an integral value.
Definition: DVecScalarMultExpr.h:403
Header file for all intrinsic functionality.
#define BLAZE_CONSTRAINT_MUST_BE_DENSE_VECTOR_TYPE(T)
Constraint on the data type.In case the given data type T is not a dense, N-dimensional vector type...
Definition: DenseVector.h:79
ElementType & ReferenceType
Reference return type.
Definition: DVecScalarMultExpr.h:183
ConstIterator begin() const
Returns an iterator to the first non-zero element of the dense vector.
Definition: DVecScalarMultExpr.h:471
IntrinsicType load() const
Access to the intrinsic elements of the vector.
Definition: DVecScalarMultExpr.h:290
Header file for the IsRowMajorMatrix type trait.
Header file for the IsComputation type trait class.
const ConstIterator operator--(int)
Post-decrement operator.
Definition: DVecScalarMultExpr.h:270
Expression object for dense vector-scalar multiplications.The DVecScalarMultExpr class represents the...
Definition: DVecScalarMultExpr.h:108
const size_t SMP_DVECSCALARMULT_THRESHOLD
SMP dense vector/scalar multiplication/division threshold.This threshold represents the system-specif...
Definition: Thresholds.h:126
ConstIterator & operator+=(size_t inc)
Addition assignment operator.
Definition: DVecScalarMultExpr.h:215
Base class for all compute expression templates.The Computation class serves as a tag for all computa...
Definition: Computation.h:59
Header file for the sparse vector SMP implementation.
Base class for sparse vectors.The SparseVector class is a base class for all arbitrarily sized (N-dim...
Definition: Forward.h:105
#define BLAZE_FUNCTION_TRACE
Function trace macro.This macro can be used to reliably trace function calls. In case function tracin...
Definition: FunctionTrace.h:157
ConstIterator & operator-=(size_t dec)
Subtraction assignment operator.
Definition: DVecScalarMultExpr.h:227
This ResultType
Result type for expression template evaluations.
Definition: CompressedMatrix.h:2379
Header file for basic type definitions.
Header file for the SubvectorExprTrait class template.
SelectType< useAssign, const ResultType, const DVecScalarMultExpr & >::Type CompositeType
Data type for composite expression templates.
Definition: DVecScalarMultExpr.h:164
const DVecScalarMultExpr< VT, typename VT::ElementType, TF > normalize(const DenseVector< VT, TF > &vec)
Normalization of the dense vector ( ).
Definition: DVecScalarMultExpr.h:889
MultTrait< RT, ST >::Type ResultType
Result type for expression template evaluations.
Definition: DVecScalarMultExpr.h:155
Header file for the IsColumnVector type trait.
IteratorCategory iterator_category
The iterator category.
Definition: DVecScalarMultExpr.h:187
VT::CompositeType CT
Composite type of the dense vector expression.
Definition: DVecScalarMultExpr.h:117
Evaluation of the resulting expression type of a multiplication.Via this type trait it is possible to...
Definition: MultExprTrait.h:137
RightOperand scalar_
Scalar of the multiplication expression.
Definition: DVecScalarMultExpr.h:411
#define BLAZE_CONSTRAINT_MUST_BE_VECTOR_WITH_TRANSPOSE_FLAG(T, TF)
Constraint on the data type.In case the given data type T is not a dense or sparse vector type and in...
Definition: TransposeFlag.h:238
Header file for the thresholds for matrix/vector and matrix/matrix multiplications.
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.In case of an invalid run time expression, the program execution is terminated. The BLAZE_INTERNAL_ASSERT macro can be disabled by setting the BLAZE_USER_ASSERTION flag to zero or by defining NDEBUG during the compilation.
Definition: Assert.h:101
EnableIf< IsIntegral< T >, Set< T, sizeof(T)> >::Type::Type set(T value)
Sets all values in the vector to the given integral value.
Definition: Set.h:209
#define BLAZE_CONSTRAINT_MUST_BE_FLOATING_POINT_TYPE(T)
Constraint on the data type.In case the given data type T is not a floating point data type...
Definition: FloatingPoint.h:79
Header file for the IsExpression type trait class.
Header file for the FunctionTrace class.
DifferenceType difference_type
Difference between two iterators.
Definition: DVecScalarMultExpr.h:191
DifferenceType operator-(const ConstIterator &rhs) const
Calculating the number of elements between two iterators.
Definition: DVecScalarMultExpr.h:367
ConstIterator & operator--()
Pre-decrement operator.
Definition: DVecScalarMultExpr.h:259