35 #ifndef _BLAZE_MATH_EXPRESSIONS_DVECSCALARMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_DVECSCALARMULTEXPR_H_
102 template<
typename VT
141 template<
typename VT2 >
144 enum { value = useAssign };
415 enum { vectorizable = VT::vectorizable &&
420 enum { smpAssignable = 0 };
519 template<
typename T >
531 template<
typename T >
533 return vector_.isAliased( alias );
557 template<
typename VT2 >
585 template<
typename VT2 >
613 template<
typename VT2 >
614 friend inline typename EnableIf< UseAssign<VT2> >::Type
649 template<
typename VT2 >
650 friend inline typename EnableIf< UseAssign<VT2> >::Type
685 template<
typename VT2 >
686 friend inline typename EnableIf< UseAssign<VT2> >::Type
744 template<
typename VT
746 inline const DVecScalarMultExpr<VT,typename BaseElementType<VT>::Type,TF>
787 template<
typename T1
790 inline const typename EnableIf< IsNumeric<T2>,
typename MultExprTrait<T1,T2>::Type >::Type
796 return Type( ~vec, scalar );
823 template<
typename T1
826 inline const typename EnableIf< IsNumeric<T1>,
typename MultExprTrait<T1,T2>::Type >::Type
832 return Type( ~vec, scalar );
863 template<
typename VT
865 inline const DVecScalarMultExpr<VT,typename VT::ElementType,TF>
872 const ElementType len (
length( ~vec ) );
900 template<
typename VT
903 inline const DVecScalarMultExpr<VT,ST,TF>
904 operator-(
const DVecScalarMultExpr<VT,ST,TF>& dv )
908 return DVecScalarMultExpr<VT,ST,TF>( dv.leftOperand(), -dv.rightOperand() );
935 template<
typename VT
939 inline const typename EnableIf< IsNumeric<ST2>
940 ,
typename MultExprTrait< DVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
941 operator*(
const DVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
945 return vec.leftOperand() * ( vec.rightOperand() * scalar );
964 template<
typename ST1
968 inline const typename EnableIf< IsNumeric<ST1>
969 ,
typename MultExprTrait< ST1, DVecScalarMultExpr<VT,ST2,TF> >::Type >::Type
970 operator*( ST1 scalar,
const DVecScalarMultExpr<VT,ST2,TF>& vec )
974 return vec.leftOperand() * ( scalar * vec.rightOperand() );
993 template<
typename VT
997 inline const typename EnableIf< IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>
998 ,
typename DivExprTrait< DVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
999 operator/(
const DVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
1003 return vec.leftOperand() * ( vec.rightOperand() / scalar );
1023 template<
typename VT1
1027 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
1028 operator*(
const DVecScalarMultExpr<VT1,ST,TF>& lhs,
const DenseVector<VT2,TF>& rhs )
1032 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1052 template<
typename VT1
1056 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,TF> >::Type
1057 operator*(
const DenseVector<VT1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST,TF>& rhs )
1061 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1081 template<
typename VT1
1086 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,TF>, DVecScalarMultExpr<VT2,ST2,TF> >::Type
1087 operator*(
const DVecScalarMultExpr<VT1,ST1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST2,TF>& rhs )
1091 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1111 template<
typename VT1
1114 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
1115 operator*(
const DVecScalarMultExpr<VT1,ST,false>& lhs,
const DenseVector<VT2,true>& rhs )
1119 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1139 template<
typename VT1
1142 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >::Type
1143 operator*(
const DenseVector<VT1,false>& lhs,
const DVecScalarMultExpr<VT2,ST,true>& rhs )
1147 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1167 template<
typename VT1
1171 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >::Type
1172 operator*(
const DVecScalarMultExpr<VT1,ST1,false>& lhs,
const DVecScalarMultExpr<VT2,ST2,true>& rhs )
1176 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1196 template<
typename VT1
1200 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
1201 operator*(
const DVecScalarMultExpr<VT1,ST,TF>& lhs,
const SparseVector<VT2,TF>& rhs )
1205 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1225 template<
typename VT1
1229 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,TF> >::Type
1230 operator*(
const SparseVector<VT1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST,TF>& rhs )
1234 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1255 template<
typename VT1
1260 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,TF>, SVecScalarMultExpr<VT2,ST2,TF> >::Type
1261 operator*(
const DVecScalarMultExpr<VT1,ST1,TF>& lhs,
const SVecScalarMultExpr<VT2,ST2,TF>& rhs )
1265 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1286 template<
typename VT1
1291 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,TF>, DVecScalarMultExpr<VT2,ST2,TF> >::Type
1292 operator*(
const SVecScalarMultExpr<VT1,ST1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST2,TF>& rhs )
1296 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1316 template<
typename VT1
1319 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
1320 operator*(
const DVecScalarMultExpr<VT1,ST,false>& lhs,
const SparseVector<VT2,true>& rhs )
1324 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1344 template<
typename VT1
1347 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >::Type
1348 operator*(
const SparseVector<VT1,false>& lhs,
const DVecScalarMultExpr<VT2,ST,true>& rhs )
1352 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1373 template<
typename VT1
1377 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >::Type
1378 operator*(
const DVecScalarMultExpr<VT1,ST1,false>& lhs,
const SVecScalarMultExpr<VT2,ST2,true>& rhs )
1382 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1403 template<
typename VT1
1407 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >::Type
1408 operator*(
const SVecScalarMultExpr<VT1,ST1,false>& lhs,
const DVecScalarMultExpr<VT2,ST2,true>& rhs )
1412 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1432 template<
typename MT
1436 inline const typename MultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >::Type
1437 operator*(
const DenseMatrix<MT,SO>& mat,
const DVecScalarMultExpr<VT,ST,false>& vec )
1441 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1461 template<
typename VT
1465 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >::Type
1466 operator*(
const DVecScalarMultExpr<VT,ST,true>& vec,
const DenseMatrix<MT,SO>& mat )
1470 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1490 template<
typename MT
1494 inline const typename MultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >::Type
1495 operator*(
const SparseMatrix<MT,SO>& mat,
const DVecScalarMultExpr<VT,ST,false>& vec )
1499 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1519 template<
typename VT
1523 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >::Type
1524 operator*(
const DVecScalarMultExpr<VT,ST,true>& vec,
const SparseMatrix<MT,SO>& mat )
1528 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1544 template<
typename VT,
typename ST1,
typename ST2 >
1545 struct DVecScalarMultExprTrait< DVecScalarMultExpr<VT,ST1,false>, ST2 >
1549 typedef typename SelectType< IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
1550 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1551 ,
typename DVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1552 , INVALID_TYPE >::Type Type;
1569 template<
typename VT,
typename ST1,
typename ST2 >
1570 struct TDVecScalarMultExprTrait< DVecScalarMultExpr<VT,ST1,true>, ST2 >
1574 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
1575 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1576 ,
typename TDVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1577 , INVALID_TYPE >::Type Type;
1594 template<
typename VT,
typename ST1,
typename ST2 >
1595 struct DVecScalarDivExprTrait< DVecScalarMultExpr<VT,ST1,false>, ST2 >
1599 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1603 typedef typename DVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1604 typedef typename DVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1609 typedef typename SelectType< IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
1610 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1611 ,
typename SelectType<condition,T1,T2>::Type
1612 , INVALID_TYPE >::Type Type;
1629 template<
typename VT,
typename ST1,
typename ST2 >
1630 struct TDVecScalarDivExprTrait< DVecScalarMultExpr<VT,ST1,true>, ST2 >
1634 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1638 typedef typename TDVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1639 typedef typename TDVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1644 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
1645 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1646 ,
typename SelectType<condition,T1,T2>::Type
1647 , INVALID_TYPE >::Type Type;
1664 template<
typename VT1,
typename ST,
typename VT2 >
1665 struct DVecDVecMultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >
1669 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1670 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
1671 IsNumeric<ST>::value
1672 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1673 , INVALID_TYPE >::Type Type;
1682 template<
typename VT1,
typename VT2,
typename ST >
1683 struct DVecDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,false> >
1687 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1688 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
1689 IsNumeric<ST>::value
1690 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1691 , INVALID_TYPE >::Type Type;
1700 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1701 struct DVecDVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,false> >
1705 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1706 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
1707 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1708 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1709 , INVALID_TYPE >::Type Type;
1726 template<
typename VT1,
typename ST,
typename VT2 >
1727 struct DVecTDVecMultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >
1731 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1732 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1733 IsNumeric<ST>::value
1734 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1735 , INVALID_TYPE >::Type Type;
1744 template<
typename VT1,
typename VT2,
typename ST >
1745 struct DVecTDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >
1749 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1750 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1751 IsNumeric<ST>::value
1752 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1753 , INVALID_TYPE >::Type Type;
1762 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1763 struct DVecTDVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >
1767 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1768 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1769 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1770 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1771 , INVALID_TYPE >::Type Type;
1788 template<
typename VT1,
typename ST,
typename VT2 >
1789 struct TDVecTDVecMultExprTrait< DVecScalarMultExpr<VT1,ST,true>, VT2 >
1793 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
1794 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1795 IsNumeric<ST>::value
1796 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1797 , INVALID_TYPE >::Type Type;
1806 template<
typename VT1,
typename VT2,
typename ST >
1807 struct TDVecTDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >
1811 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
1812 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1813 IsNumeric<ST>::value
1814 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1815 , INVALID_TYPE >::Type Type;
1824 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1825 struct TDVecTDVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,true>, DVecScalarMultExpr<VT2,ST2,true> >
1829 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
1830 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1831 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1832 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1833 , INVALID_TYPE >::Type Type;
1850 template<
typename VT1,
typename VT2,
typename ST >
1851 struct DVecSVecMultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >
1855 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1856 IsSparseVector<VT2>::value && IsColumnVector<VT2>::value &&
1857 IsNumeric<ST>::value
1858 ,
typename SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1859 , INVALID_TYPE >::Type Type;
1868 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1869 struct DVecSVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,false> >
1873 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1874 IsSparseVector<VT2>::value && IsColumnVector<VT2>::value &&
1875 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1876 ,
typename SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1877 , INVALID_TYPE >::Type Type;
1894 template<
typename VT1,
typename ST,
typename VT2 >
1895 struct DVecTSVecMultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >
1899 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1900 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
1901 IsNumeric<ST>::value
1902 ,
typename SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1903 , INVALID_TYPE >::Type Type;
1912 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1913 struct DVecTSVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >
1917 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1918 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
1919 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1920 ,
typename SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1921 , INVALID_TYPE >::Type Type;
1938 template<
typename VT1,
typename ST,
typename VT2 >
1939 struct TDVecTSVecMultExprTrait< DVecScalarMultExpr<VT1,ST,true>, VT2 >
1943 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
1944 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
1945 IsNumeric<ST>::value
1946 ,
typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1947 , INVALID_TYPE >::Type Type;
1956 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1957 struct TDVecTSVecMultExprTrait< DVecScalarMultExpr<VT1,ST1,true>, SVecScalarMultExpr<VT2,ST2,true> >
1961 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
1962 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
1963 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1964 ,
typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1965 , INVALID_TYPE >::Type Type;
1982 template<
typename VT1,
typename VT2,
typename ST >
1983 struct SVecDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,false> >
1987 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
1988 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
1989 IsNumeric<ST>::value
1990 ,
typename SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1991 , INVALID_TYPE >::Type Type;
2000 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2001 struct SVecDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,false> >
2005 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
2006 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
2007 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2008 ,
typename SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2009 , INVALID_TYPE >::Type Type;
2026 template<
typename VT1,
typename VT2,
typename ST >
2027 struct SVecTDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >
2031 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
2032 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2033 IsNumeric<ST>::value
2034 ,
typename TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2035 , INVALID_TYPE >::Type Type;
2044 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2045 struct SVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >
2049 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
2050 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2051 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2052 ,
typename TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2053 , INVALID_TYPE >::Type Type;
2070 template<
typename VT1,
typename VT2,
typename ST >
2071 struct TSVecTDVecMultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >
2075 typedef typename SelectType< IsSparseVector<VT1>::value && IsRowVector<VT1>::value &&
2076 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2077 IsNumeric<ST>::value
2078 ,
typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2079 , INVALID_TYPE >::Type Type;
2088 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2089 struct TSVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,true>, DVecScalarMultExpr<VT2,ST2,true> >
2093 typedef typename SelectType< IsSparseVector<VT1>::value && IsRowVector<VT1>::value &&
2094 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2095 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2096 ,
typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2097 , INVALID_TYPE >::Type Type;
2114 template<
typename MT,
typename VT,
typename ST >
2115 struct DMatDVecMultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >
2119 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2120 IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
2121 IsNumeric<ST>::value
2122 ,
typename DVecScalarMultExprTrait<typename DMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
2123 , INVALID_TYPE >::Type Type;
2140 template<
typename MT,
typename VT,
typename ST >
2141 struct TDMatDVecMultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >
2145 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2146 IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
2147 IsNumeric<ST>::value
2148 ,
typename DVecScalarMultExprTrait<typename TDMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
2149 , INVALID_TYPE >::Type Type;
2166 template<
typename VT,
typename MT,
typename ST >
2167 struct TDVecDMatMultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >
2171 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
2172 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2173 IsNumeric<ST>::value
2174 ,
typename TDVecScalarMultExprTrait<typename TDVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
2175 , INVALID_TYPE >::Type Type;
2192 template<
typename VT,
typename MT,
typename ST >
2193 struct TDVecTDMatMultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >
2197 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
2198 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2199 IsNumeric<ST>::value
2200 ,
typename TDVecScalarMultExprTrait<typename TDVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
2201 , INVALID_TYPE >::Type Type;
2218 template<
typename MT,
typename VT,
typename ST >
2219 struct SMatDVecMultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >
2223 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2224 IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
2225 IsNumeric<ST>::value
2226 ,
typename DVecScalarMultExprTrait<typename SMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
2227 , INVALID_TYPE >::Type Type;
2244 template<
typename MT,
typename VT,
typename ST >
2245 struct TSMatDVecMultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >
2249 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2250 IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
2251 IsNumeric<ST>::value
2252 ,
typename DVecScalarMultExprTrait<typename TSMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
2253 , INVALID_TYPE >::Type Type;
2270 template<
typename VT,
typename MT,
typename ST >
2271 struct TDVecSMatMultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >
2275 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
2276 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2277 IsNumeric<ST>::value
2278 ,
typename TDVecScalarMultExprTrait<typename TDVecSMatMultExprTrait<VT,MT>::Type,ST>::Type
2279 , INVALID_TYPE >::Type Type;
2296 template<
typename VT,
typename MT,
typename ST >
2297 struct TDVecTSMatMultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >
2301 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
2302 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2303 IsNumeric<ST>::value
2304 ,
typename TDVecScalarMultExprTrait<typename TDVecTSMatMultExprTrait<VT,MT>::Type,ST>::Type
2305 , INVALID_TYPE >::Type Type;
2322 template<
typename VT,
typename ST,
bool TF >
2323 struct SubvectorExprTrait< DVecScalarMultExpr<VT,ST,TF> >
2327 typedef typename MultExprTrait< typename SubvectorExprTrait<const VT>::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:3703
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:745
Header file for the SparseVector base class.
IntrinsicTrait< ElementType >::Type IntrinsicType
Resulting intrinsic element type.
Definition: DVecScalarMultExpr.h:155
ReturnType operator*() const
Direct access to the element at the current iterator position.
Definition: DVecScalarMultExpr.h:277
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:478
Efficient implementation of a compressed matrix.The CompressedMatrix class template is the represent...
Definition: CompressedMatrix.h:196
const ConstIterator operator++(int)
Post-increment operator.
Definition: DVecScalarMultExpr.h:246
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:2375
Header file for the IsRowVector type trait.
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:248
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:441
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:127
bool operator!=(const ConstIterator &rhs) const
Inequality comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:309
ConstIterator(IteratorType iterator, RightOperand scalar)
Constructor for the ConstIterator class.
Definition: DVecScalarMultExpr.h:200
Header file for the VecScalarMultExpr base class.
LeftOperand leftOperand() const
Returns the left-hand side dense vector operand.
Definition: DVecScalarMultExpr.h:498
ResultType::ElementType ElementType
Resulting element type.
Definition: DVecScalarMultExpr.h:154
Constraint on the data type.
ValueType value_type
Type of the underlying elements.
Definition: DVecScalarMultExpr.h:185
bool operator<=(const ConstIterator &rhs) const
Less-than comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:342
Header file for the SparseMatrix base class.
Header file for the DivExprTrait class template.
PointerType pointer
Pointer return type.
Definition: DVecScalarMultExpr.h:186
VT::ConstIterator IteratorType
ConstIterator type of the dense vector expression.
Definition: DVecScalarMultExpr.h:191
IntrinsicType load(size_t index) const
Access to the intrinsic elements of the vector.
Definition: DVecScalarMultExpr.h:453
SelectType< IsExpression< VT >::value, const VT, const VT & >::Type LeftOperand
Composite type of the left-hand side dense vector expression.
Definition: DVecScalarMultExpr.h:164
Header file for the MultExprTrait class template.
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:250
DVecScalarMultExpr(const VT &vector, ST scalar)
Constructor for the DVecScalarMultExpr class.
Definition: DVecScalarMultExpr.h:429
ptrdiff_t DifferenceType
Difference between two iterators.
Definition: DVecScalarMultExpr.h:181
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 IsFloatingPoint type trait.
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:2379
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: DVecScalarMultExpr.h:520
Iterator over the elements of the dense vector.
Definition: DVecScalarMultExpr.h:173
Header file for the DenseMatrix base class.
const SelectType< returnExpr, ExprReturnType, ElementType >::Type ReturnType
Return type for expression template evaluations.
Definition: DVecScalarMultExpr.h:158
bool operator>(const ConstIterator &rhs) const
Greater-than comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:331
ResultType::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: DVecScalarMultExpr.h:153
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:353
ST RightOperand
Composite type of the right-hand side scalar value.
Definition: DVecScalarMultExpr.h:167
VT::ResultType RT
Result type of the dense vector expression.
Definition: DVecScalarMultExpr.h:111
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:177
Constraint on the data type.
DVecScalarMultExpr< VT, ST, TF > This
Type of this DVecScalarMultExpr instance.
Definition: DVecScalarMultExpr.h:151
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:2373
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:320
Header file for the SelectType class template.
LeftOperand vector_
Left-hand side dense vector of the multiplication expression.
Definition: DVecScalarMultExpr.h:539
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:488
Header file for the EnableIf class template.
ReferenceType reference
Reference return type.
Definition: DVecScalarMultExpr.h:187
ConstIterator & operator++()
Pre-increment operator.
Definition: DVecScalarMultExpr.h:235
Header file for the BaseElementType type trait.
friend const ConstIterator operator+(const ConstIterator &it, size_t inc)
Addition between a ConstIterator and an integral value.
Definition: DVecScalarMultExpr.h:376
Header file for the IsNumeric type trait.
RightOperand scalar_
Right-hand side scalar of the multiplication expression.
Definition: DVecScalarMultExpr.h:540
ElementType ValueType
Type of the underlying elements.
Definition: DVecScalarMultExpr.h:178
bool operator==(const ConstIterator &rhs) const
Equality comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:298
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:2374
Intrinsic characteristics of data types.The IntrinsicTrait class template provides the intrinsic char...
Definition: IntrinsicTrait.h:648
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:407
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:532
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:508
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:113
friend const ConstIterator operator+(size_t inc, const ConstIterator &it)
Addition between an integral value and a ConstIterator.
Definition: DVecScalarMultExpr.h:388
ElementType * PointerType
Pointer return type.
Definition: DVecScalarMultExpr.h:179
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:112
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:400
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:180
ConstIterator begin() const
Returns an iterator to the first non-zero element of the dense vector.
Definition: DVecScalarMultExpr.h:468
IntrinsicType load() const
Access to the intrinsic elements of the vector.
Definition: DVecScalarMultExpr.h:287
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:267
Expression object for dense vector-scalar multiplications.The DVecScalarMultExpr class represents the...
Definition: DVecScalarMultExpr.h:105
ConstIterator & operator+=(size_t inc)
Addition assignment operator.
Definition: DVecScalarMultExpr.h:212
Base class for all compute expression templates.The Computation class serves as a tag for all computa...
Definition: Computation.h:59
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:224
This ResultType
Result type for expression template evaluations.
Definition: CompressedMatrix.h:2370
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:161
const DVecScalarMultExpr< VT, typename VT::ElementType, TF > normalize(const DenseVector< VT, TF > &vec)
Normalization of the dense vector ( ).
Definition: DVecScalarMultExpr.h:866
MultTrait< RT, ST >::Type ResultType
Result type for expression template evaluations.
Definition: DVecScalarMultExpr.h:152
Header file for the IsColumnVector type trait.
IteratorCategory iterator_category
The iterator category.
Definition: DVecScalarMultExpr.h:184
VT::CompositeType CT
Composite type of the dense vector expression.
Definition: DVecScalarMultExpr.h:114
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:408
#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
#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:188
DifferenceType operator-(const ConstIterator &rhs) const
Calculating the number of elements between two iterators.
Definition: DVecScalarMultExpr.h:364
ConstIterator & operator--()
Pre-decrement operator.
Definition: DVecScalarMultExpr.h:256