35 #ifndef _BLAZE_MATH_EXPRESSIONS_DVECSCALARMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_DVECSCALARMULTEXPR_H_
106 template<
typename VT
145 template<
typename VT2 >
148 enum { value = useAssign };
161 template<
typename VT2 >
162 struct UseSMPAssign {
163 enum { value = ( !VT2::smpAssignable || !VT::smpAssignable ) && useAssign };
220 : iterator_( iterator )
306 inline IntrinsicType
load()
const {
434 enum { vectorizable = VT::vectorizable &&
439 enum { smpAssignable = VT::smpAssignable };
476 const IntrinsicType xmm1(
vector_.load( index ) );
538 template<
typename T >
550 template<
typename T >
552 return vector_.isAliased( alias );
596 template<
typename VT2 >
624 template<
typename VT2 >
652 template<
typename VT2 >
653 friend inline typename EnableIf< UseAssign<VT2> >::Type
664 const ResultType tmp(
serial( rhs ) );
688 template<
typename VT2 >
689 friend inline typename EnableIf< UseAssign<VT2> >::Type
700 const ResultType tmp(
serial( rhs ) );
724 template<
typename VT2 >
725 friend inline typename EnableIf< UseAssign<VT2> >::Type
736 const ResultType tmp(
serial( rhs ) );
760 template<
typename VT2 >
761 friend inline typename EnableIf< UseSMPAssign<VT2> >::Type
788 template<
typename VT2 >
789 friend inline typename EnableIf< UseSMPAssign<VT2> >::Type
797 (~lhs) *= rhs.scalar_;
816 template<
typename VT2 >
817 friend inline typename EnableIf< UseSMPAssign<VT2> >::Type
828 const ResultType tmp( rhs );
852 template<
typename VT2 >
853 friend inline typename EnableIf< UseSMPAssign<VT2> >::Type
864 const ResultType tmp( rhs );
888 template<
typename VT2 >
889 friend inline typename EnableIf< UseSMPAssign<VT2> >::Type
900 const ResultType tmp( rhs );
947 template<
typename VT
949 inline const DVecScalarMultExpr<VT,typename BaseElementType<VT>::Type,TF>
990 template<
typename T1
993 inline const typename EnableIf< IsNumeric<T2>,
typename MultExprTrait<T1,T2>::Type >::Type
999 return Type( ~vec, scalar );
1026 template<
typename T1
1029 inline const typename EnableIf< IsNumeric<T1>,
typename MultExprTrait<T1,T2>::Type >::Type
1035 return Type( ~vec, scalar );
1066 template<
typename VT
1068 inline const DVecScalarMultExpr<VT,typename VT::ElementType,TF>
1075 const ElementType len (
length( ~vec ) );
1103 template<
typename VT
1106 inline const DVecScalarMultExpr<VT,ST,TF>
1107 operator-(
const DVecScalarMultExpr<VT,ST,TF>& dv )
1111 return DVecScalarMultExpr<VT,ST,TF>( dv.leftOperand(), -dv.rightOperand() );
1138 template<
typename VT
1142 inline const typename EnableIf< IsNumeric<ST2>
1143 ,
typename MultExprTrait< DVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
1144 operator*(
const DVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
1148 return vec.leftOperand() * ( vec.rightOperand() * scalar );
1167 template<
typename ST1
1171 inline const typename EnableIf< IsNumeric<ST1>
1172 ,
typename MultExprTrait< ST1, DVecScalarMultExpr<VT,ST2,TF> >::Type >::Type
1173 operator*( ST1 scalar,
const DVecScalarMultExpr<VT,ST2,TF>& vec )
1177 return vec.leftOperand() * ( scalar * vec.rightOperand() );
1196 template<
typename VT
1200 inline const typename EnableIf< IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>
1201 ,
typename DivExprTrait< DVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
1202 operator/(
const DVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
1206 return vec.leftOperand() * ( vec.rightOperand() / scalar );
1226 template<
typename VT1
1230 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
1231 operator*(
const DVecScalarMultExpr<VT1,ST,TF>& lhs,
const DenseVector<VT2,TF>& rhs )
1235 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1255 template<
typename VT1
1259 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,TF> >::Type
1260 operator*(
const DenseVector<VT1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST,TF>& rhs )
1264 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1284 template<
typename VT1
1289 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,TF>, DVecScalarMultExpr<VT2,ST2,TF> >::Type
1290 operator*(
const DVecScalarMultExpr<VT1,ST1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST2,TF>& rhs )
1294 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1314 template<
typename VT1
1317 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
1318 operator*(
const DVecScalarMultExpr<VT1,ST,false>& lhs,
const DenseVector<VT2,true>& rhs )
1322 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1342 template<
typename VT1
1345 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >::Type
1346 operator*(
const DenseVector<VT1,false>& lhs,
const DVecScalarMultExpr<VT2,ST,true>& rhs )
1350 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1370 template<
typename VT1
1374 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >::Type
1375 operator*(
const DVecScalarMultExpr<VT1,ST1,false>& lhs,
const DVecScalarMultExpr<VT2,ST2,true>& rhs )
1379 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1399 template<
typename VT1
1403 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
1404 operator*(
const DVecScalarMultExpr<VT1,ST,TF>& lhs,
const SparseVector<VT2,TF>& rhs )
1408 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1428 template<
typename VT1
1432 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,TF> >::Type
1433 operator*(
const SparseVector<VT1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST,TF>& rhs )
1437 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1458 template<
typename VT1
1463 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,TF>, SVecScalarMultExpr<VT2,ST2,TF> >::Type
1464 operator*(
const DVecScalarMultExpr<VT1,ST1,TF>& lhs,
const SVecScalarMultExpr<VT2,ST2,TF>& rhs )
1468 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1489 template<
typename VT1
1494 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,TF>, DVecScalarMultExpr<VT2,ST2,TF> >::Type
1495 operator*(
const SVecScalarMultExpr<VT1,ST1,TF>& lhs,
const DVecScalarMultExpr<VT2,ST2,TF>& rhs )
1499 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1519 template<
typename VT1
1522 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
1523 operator*(
const DVecScalarMultExpr<VT1,ST,false>& lhs,
const SparseVector<VT2,true>& rhs )
1527 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1547 template<
typename VT1
1550 inline const typename MultExprTrait< VT1, DVecScalarMultExpr<VT2,ST,true> >::Type
1551 operator*(
const SparseVector<VT1,false>& lhs,
const DVecScalarMultExpr<VT2,ST,true>& rhs )
1555 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1576 template<
typename VT1
1580 inline const typename MultExprTrait< DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >::Type
1581 operator*(
const DVecScalarMultExpr<VT1,ST1,false>& lhs,
const SVecScalarMultExpr<VT2,ST2,true>& rhs )
1585 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1606 template<
typename VT1
1610 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, DVecScalarMultExpr<VT2,ST2,true> >::Type
1611 operator*(
const SVecScalarMultExpr<VT1,ST1,false>& lhs,
const DVecScalarMultExpr<VT2,ST2,true>& rhs )
1615 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1635 template<
typename MT
1639 inline const typename MultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >::Type
1640 operator*(
const DenseMatrix<MT,SO>& mat,
const DVecScalarMultExpr<VT,ST,false>& vec )
1644 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1664 template<
typename VT
1668 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >::Type
1669 operator*(
const DVecScalarMultExpr<VT,ST,true>& vec,
const DenseMatrix<MT,SO>& mat )
1673 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1693 template<
typename MT
1697 inline const typename MultExprTrait< MT, DVecScalarMultExpr<VT,ST,false> >::Type
1698 operator*(
const SparseMatrix<MT,SO>& mat,
const DVecScalarMultExpr<VT,ST,false>& vec )
1702 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1722 template<
typename VT
1726 inline const typename MultExprTrait< DVecScalarMultExpr<VT,ST,true>, MT >::Type
1727 operator*(
const DVecScalarMultExpr<VT,ST,true>& vec,
const SparseMatrix<MT,SO>& mat )
1731 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1747 template<
typename VT,
typename ST,
bool TF >
1765 template<
typename VT,
typename ST1,
typename ST2 >
1770 typedef typename SelectType< IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
1771 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1772 ,
typename DVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1773 , INVALID_TYPE >::Type Type;
1790 template<
typename VT,
typename ST1,
typename ST2 >
1795 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
1796 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1797 ,
typename TDVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1798 , INVALID_TYPE >::Type Type;
1815 template<
typename VT,
typename ST1,
typename ST2 >
1820 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1824 typedef typename DVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1825 typedef typename DVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1830 typedef typename SelectType< IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
1831 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1832 ,
typename SelectType<condition,T1,T2>::Type
1833 , INVALID_TYPE >::Type Type;
1850 template<
typename VT,
typename ST1,
typename ST2 >
1855 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1859 typedef typename TDVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1860 typedef typename TDVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1865 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
1866 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1867 ,
typename SelectType<condition,T1,T2>::Type
1868 , INVALID_TYPE >::Type Type;
1885 template<
typename VT1,
typename ST,
typename VT2 >
1890 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1891 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
1892 IsNumeric<ST>::value
1893 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1894 , INVALID_TYPE >::Type Type;
1903 template<
typename VT1,
typename VT2,
typename ST >
1908 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1909 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
1910 IsNumeric<ST>::value
1911 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1912 , INVALID_TYPE >::Type Type;
1921 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1926 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1927 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
1928 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1929 ,
typename DVecScalarMultExprTrait<typename DVecDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1930 , INVALID_TYPE >::Type Type;
1947 template<
typename VT1,
typename ST,
typename VT2 >
1952 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1953 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1954 IsNumeric<ST>::value
1955 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1956 , INVALID_TYPE >::Type Type;
1965 template<
typename VT1,
typename VT2,
typename ST >
1970 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1971 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1972 IsNumeric<ST>::value
1973 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1974 , INVALID_TYPE >::Type Type;
1983 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1988 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1989 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1990 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1991 ,
typename DMatScalarMultExprTrait<typename DVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1992 , INVALID_TYPE >::Type Type;
2009 template<
typename VT1,
typename ST,
typename VT2 >
2014 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
2015 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2016 IsNumeric<ST>::value
2017 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2018 , INVALID_TYPE >::Type Type;
2027 template<
typename VT1,
typename VT2,
typename ST >
2032 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
2033 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2034 IsNumeric<ST>::value
2035 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2036 , INVALID_TYPE >::Type Type;
2045 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2050 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
2051 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2052 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2053 ,
typename TDVecScalarMultExprTrait<typename TDVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2054 , INVALID_TYPE >::Type Type;
2071 template<
typename VT1,
typename VT2,
typename ST >
2076 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
2077 IsSparseVector<VT2>::value && IsColumnVector<VT2>::value &&
2078 IsNumeric<ST>::value
2079 ,
typename SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2080 , INVALID_TYPE >::Type Type;
2089 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2090 struct DVecSVecMultExprTrait<
DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,false> >
2094 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
2095 IsSparseVector<VT2>::value && IsColumnVector<VT2>::value &&
2096 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2097 ,
typename SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2098 , INVALID_TYPE >::Type Type;
2115 template<
typename VT1,
typename ST,
typename VT2 >
2120 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
2121 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
2122 IsNumeric<ST>::value
2123 ,
typename SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2124 , INVALID_TYPE >::Type Type;
2133 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2134 struct DVecTSVecMultExprTrait<
DVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >
2138 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
2139 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
2140 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2141 ,
typename SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2142 , INVALID_TYPE >::Type Type;
2159 template<
typename VT1,
typename ST,
typename VT2 >
2164 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
2165 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
2166 IsNumeric<ST>::value
2167 ,
typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2168 , INVALID_TYPE >::Type Type;
2177 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2178 struct TDVecTSVecMultExprTrait<
DVecScalarMultExpr<VT1,ST1,true>, SVecScalarMultExpr<VT2,ST2,true> >
2182 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
2183 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
2184 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2185 ,
typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2186 , INVALID_TYPE >::Type Type;
2203 template<
typename VT1,
typename VT2,
typename ST >
2208 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
2209 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
2210 IsNumeric<ST>::value
2211 ,
typename SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2212 , INVALID_TYPE >::Type Type;
2221 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2222 struct SVecDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>,
DVecScalarMultExpr<VT2,ST2,false> >
2226 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
2227 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
2228 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2229 ,
typename SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2230 , INVALID_TYPE >::Type Type;
2247 template<
typename VT1,
typename VT2,
typename ST >
2252 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
2253 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2254 IsNumeric<ST>::value
2255 ,
typename TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2256 , INVALID_TYPE >::Type Type;
2265 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2266 struct SVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>,
DVecScalarMultExpr<VT2,ST2,true> >
2270 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
2271 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2272 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2273 ,
typename TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2274 , INVALID_TYPE >::Type Type;
2291 template<
typename VT1,
typename VT2,
typename ST >
2296 typedef typename SelectType< IsSparseVector<VT1>::value && IsRowVector<VT1>::value &&
2297 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2298 IsNumeric<ST>::value
2299 ,
typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
2300 , INVALID_TYPE >::Type Type;
2309 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
2310 struct TSVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,true>,
DVecScalarMultExpr<VT2,ST2,true> >
2314 typedef typename SelectType< IsSparseVector<VT1>::value && IsRowVector<VT1>::value &&
2315 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
2316 IsNumeric<ST1>::value && IsNumeric<ST2>::value
2317 ,
typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
2318 , INVALID_TYPE >::Type Type;
2335 template<
typename MT,
typename VT,
typename ST >
2340 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2341 IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
2342 IsNumeric<ST>::value
2343 ,
typename DVecScalarMultExprTrait<typename DMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
2344 , INVALID_TYPE >::Type Type;
2361 template<
typename MT,
typename VT,
typename ST >
2366 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2367 IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
2368 IsNumeric<ST>::value
2369 ,
typename DVecScalarMultExprTrait<typename TDMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
2370 , INVALID_TYPE >::Type Type;
2387 template<
typename VT,
typename MT,
typename ST >
2392 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
2393 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2394 IsNumeric<ST>::value
2395 ,
typename TDVecScalarMultExprTrait<typename TDVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
2396 , INVALID_TYPE >::Type Type;
2413 template<
typename VT,
typename MT,
typename ST >
2418 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
2419 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2420 IsNumeric<ST>::value
2421 ,
typename TDVecScalarMultExprTrait<typename TDVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
2422 , INVALID_TYPE >::Type Type;
2439 template<
typename MT,
typename VT,
typename ST >
2444 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2445 IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
2446 IsNumeric<ST>::value
2447 ,
typename DVecScalarMultExprTrait<typename SMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
2448 , INVALID_TYPE >::Type Type;
2465 template<
typename MT,
typename VT,
typename ST >
2470 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2471 IsDenseVector<VT>::value && IsColumnVector<VT>::value &&
2472 IsNumeric<ST>::value
2473 ,
typename DVecScalarMultExprTrait<typename TSMatDVecMultExprTrait<MT,VT>::Type,ST>::Type
2474 , INVALID_TYPE >::Type Type;
2491 template<
typename VT,
typename MT,
typename ST >
2496 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
2497 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
2498 IsNumeric<ST>::value
2499 ,
typename TDVecScalarMultExprTrait<typename TDVecSMatMultExprTrait<VT,MT>::Type,ST>::Type
2500 , INVALID_TYPE >::Type Type;
2517 template<
typename VT,
typename MT,
typename ST >
2522 typedef typename SelectType< IsDenseVector<VT>::value && IsRowVector<VT>::value &&
2523 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
2524 IsNumeric<ST>::value
2525 ,
typename TDVecScalarMultExprTrait<typename TDVecTSMatMultExprTrait<VT,MT>::Type,ST>::Type
2526 , INVALID_TYPE >::Type Type;
2543 template<
typename VT,
typename ST,
bool TF,
bool AF >
2548 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.
BLAZE_ALWAYS_INLINE 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:879
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:8247
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:939
Header file for basic type definitions.
Header file for the SparseVector base class.
IntrinsicTrait< ElementType >::Type IntrinsicType
Resulting intrinsic element type.
Definition: DVecScalarMultExpr.h:174
ReturnType operator*() const
Direct access to the element at the current iterator position.
Definition: DVecScalarMultExpr.h:296
BLAZE_ALWAYS_INLINE size_t size(const Vector< VT, TF > &vector)
Returns the current size/dimension of the vector.
Definition: Vector.h:264
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:497
Efficient implementation of a compressed matrix.The CompressedMatrix class template is the represent...
Definition: CompressedMatrix.h:209
const ConstIterator operator++(int)
Post-increment operator.
Definition: DVecScalarMultExpr.h:265
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:2507
Header file for the IsRowVector type trait.
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:261
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:460
const DMatSerialExpr< MT, SO > serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:699
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:131
bool operator!=(const ConstIterator &rhs) const
Inequality comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:328
ConstIterator(IteratorType iterator, RightOperand scalar)
Constructor for the ConstIterator class.
Definition: DVecScalarMultExpr.h:219
Header file for the VecScalarMultExpr base class.
LeftOperand leftOperand() const
Returns the left-hand side dense vector operand.
Definition: DVecScalarMultExpr.h:517
ResultType::ElementType ElementType
Resulting element type.
Definition: DVecScalarMultExpr.h:173
Constraint on the data type.
ValueType value_type
Type of the underlying elements.
Definition: DVecScalarMultExpr.h:204
bool operator<=(const ConstIterator &rhs) const
Less-than comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:361
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:561
PointerType pointer
Pointer return type.
Definition: DVecScalarMultExpr.h:205
VT::ConstIterator IteratorType
ConstIterator type of the dense vector expression.
Definition: DVecScalarMultExpr.h:210
SelectType< IsExpression< VT >::value, const VT, const VT & >::Type LeftOperand
Composite type of the left-hand side dense vector expression.
Definition: DVecScalarMultExpr.h:183
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:263
DVecScalarMultExpr(const VT &vector, ST scalar)
Constructor for the DVecScalarMultExpr class.
Definition: DVecScalarMultExpr.h:448
ptrdiff_t DifferenceType
Difference between two iterators.
Definition: DVecScalarMultExpr.h:200
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.
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
#define BLAZE_ALWAYS_INLINE
Platform dependent setup of an enforced inline keyword.
Definition: Inline.h:85
Header file for the IsFloatingPoint type trait.
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:2511
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: DVecScalarMultExpr.h:539
BLAZE_ALWAYS_INLINE IntrinsicType load(size_t index) const
Access to the intrinsic elements of the vector.
Definition: DVecScalarMultExpr.h:472
Iterator over the elements of the dense vector.
Definition: DVecScalarMultExpr.h:192
Header file for the DenseMatrix base class.
BLAZE_ALWAYS_INLINE 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:635
const SelectType< returnExpr, ExprReturnType, ElementType >::Type ReturnType
Return type for expression template evaluations.
Definition: DVecScalarMultExpr.h:177
bool operator>(const ConstIterator &rhs) const
Greater-than comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:350
ResultType::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: DVecScalarMultExpr.h:172
bool operator>=(const ConstIterator &rhs) const
Greater-than comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:372
ST RightOperand
Composite type of the right-hand side scalar value.
Definition: DVecScalarMultExpr.h:186
VT::ResultType RT
Result type of the dense vector expression.
Definition: DVecScalarMultExpr.h:115
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:196
Constraint on the data type.
DVecScalarMultExpr< VT, ST, TF > This
Type of this DVecScalarMultExpr instance.
Definition: DVecScalarMultExpr.h:170
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:2505
bool operator<(const ConstIterator &rhs) const
Less-than comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:339
Header file for the SelectType class template.
LeftOperand vector_
Left-hand side dense vector of the multiplication expression.
Definition: DVecScalarMultExpr.h:578
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:516
Header file for the IsDenseMatrix type trait.
size_t size() const
Returns the current size/dimension of the vector.
Definition: DVecScalarMultExpr.h:507
Header file for the EnableIf class template.
ReferenceType reference
Reference return type.
Definition: DVecScalarMultExpr.h:206
ConstIterator & operator++()
Pre-increment operator.
Definition: DVecScalarMultExpr.h:254
Header file for the serial shim.
Header file for the BaseElementType type trait.
bool canSMPAssign() const
Returns whether the expression can be used in SMP assignments.
Definition: DVecScalarMultExpr.h:571
friend const ConstIterator operator+(const ConstIterator &it, size_t inc)
Addition between a ConstIterator and an integral value.
Definition: DVecScalarMultExpr.h:395
Header file for the IsNumeric type trait.
RightOperand scalar_
Right-hand side scalar of the multiplication expression.
Definition: DVecScalarMultExpr.h:579
ElementType ValueType
Type of the underlying elements.
Definition: DVecScalarMultExpr.h:197
bool operator==(const ConstIterator &rhs) const
Equality comparison between two ConstIterator objects.
Definition: DVecScalarMultExpr.h:317
Base class for all vector/scalar multiplication expression templates.The VecScalarMultExpr class serv...
Definition: VecScalarMultExpr.h:66
EnableIf< IsDenseMatrix< MT1 > >::Type smpSubAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP subtraction assignment of a matrix to dense matrix.
Definition: DenseMatrix.h:160
Header file for the IsSparseVector type trait.
const Type & ReturnType
Return type for expression template evaluations.
Definition: CompressedMatrix.h:2506
Intrinsic characteristics of data types.The IntrinsicTrait class template provides the intrinsic char...
Definition: IntrinsicTrait.h:749
Header file for run time assertion macros.
EnableIf< IsDenseMatrix< MT1 > >::Type smpAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:98
Utility type for generic codes.
Base template for the MultTrait class.
Definition: MultTrait.h:150
BLAZE_ALWAYS_INLINE 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:742
Header file for the division trait.
IteratorType iterator_
Iterator to the current element.
Definition: DVecScalarMultExpr.h:426
bool isAliased(const T *alias) const
Returns whether the expression is aliased with the given address alias.
Definition: DVecScalarMultExpr.h:551
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:527
VT::ElementType ET
Element type of the dense vector expression.
Definition: DVecScalarMultExpr.h:117
friend const ConstIterator operator+(size_t inc, const ConstIterator &it)
Addition between an integral value and a ConstIterator.
Definition: DVecScalarMultExpr.h:407
ElementType * PointerType
Pointer return type.
Definition: DVecScalarMultExpr.h:198
const size_t SMP_DVECSCALARMULT_THRESHOLD
SMP dense vector/scalar multiplication/division threshold.This threshold specifies when a dense vecto...
Definition: Thresholds.h:299
Evaluation of the base element type of a given data type.Via this type trait it is possible to evalua...
Definition: BaseElementType.h:80
VT::ReturnType RN
Return type of the dense vector expression.
Definition: DVecScalarMultExpr.h:116
BLAZE_ALWAYS_INLINE EnableIf< And< IsIntegral< T >, HasSize< T, 2UL > >, sse_int16_t >::Type set(T value)
Sets all values in the vector to the given 2-byte integral value.
Definition: Set.h:73
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:419
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:199
ConstIterator begin() const
Returns an iterator to the first non-zero element of the dense vector.
Definition: DVecScalarMultExpr.h:487
IntrinsicType load() const
Access to the intrinsic elements of the vector.
Definition: DVecScalarMultExpr.h:306
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:286
Expression object for dense vector-scalar multiplications.The DVecScalarMultExpr class represents the...
Definition: DVecScalarMultExpr.h:109
ConstIterator & operator+=(size_t inc)
Addition assignment operator.
Definition: DVecScalarMultExpr.h:231
Base class for all compute expression templates.The Computation class serves as a tag for all computa...
Definition: Computation.h:59
EnableIf< IsDenseMatrix< MT1 > >::Type smpAddAssign(Matrix< 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:129
Base class for sparse vectors.The SparseVector class is a base class for all arbitrarily sized (N-dim...
Definition: Forward.h:108
#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:243
This ResultType
Result type for expression template evaluations.
Definition: CompressedMatrix.h:2502
Header file for the SubvectorExprTrait class template.
SelectType< useAssign, const ResultType, const DVecScalarMultExpr & >::Type CompositeType
Data type for composite expression templates.
Definition: DVecScalarMultExpr.h:180
const DVecScalarMultExpr< VT, typename VT::ElementType, TF > normalize(const DenseVector< VT, TF > &vec)
Normalization of the dense vector ( ).
Definition: DVecScalarMultExpr.h:1069
MultTrait< RT, ST >::Type ResultType
Result type for expression template evaluations.
Definition: DVecScalarMultExpr.h:171
Header file for the IsColumnVector type trait.
IteratorCategory iterator_category
The iterator category.
Definition: DVecScalarMultExpr.h:203
VT::CompositeType CT
Composite type of the dense vector expression.
Definition: DVecScalarMultExpr.h:118
System settings for the inline keywords.
EnableIf< IsDenseVector< VT1 > >::Type smpMultAssign(Vector< 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:189
Header file for the Size type trait.
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:427
#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
#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.
BLAZE_ALWAYS_INLINE 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:849
DifferenceType difference_type
Difference between two iterators.
Definition: DVecScalarMultExpr.h:207
DifferenceType operator-(const ConstIterator &rhs) const
Calculating the number of elements between two iterators.
Definition: DVecScalarMultExpr.h:383
ConstIterator & operator--()
Pre-decrement operator.
Definition: DVecScalarMultExpr.h:275