35 #ifndef _BLAZE_MATH_EXPRESSIONS_SVECSCALARMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_SVECSCALARMULTEXPR_H_
102 class SVecScalarMultExpr :
public SparseVector< SVecScalarMultExpr<VT,ST,TF>, TF >
103 ,
private VecScalarMultExpr
104 ,
private Computation
137 template<
typename VT2 >
140 enum { value = useAssign };
383 template<
typename T >
385 return vector_.canAlias( alias );
395 template<
typename T >
397 return vector_.isAliased( alias );
421 template<
typename VT2 >
429 assign( ~lhs, rhs.vector_ );
430 (~lhs) *= rhs.scalar_;
449 template<
typename VT2 >
457 assign( ~lhs, rhs.vector_ );
458 (~lhs) *= rhs.scalar_;
477 template<
typename VT2 >
478 friend inline typename EnableIf< UseAssign<VT2> >::Type
513 template<
typename VT2 >
514 friend inline typename EnableIf< UseAssign<VT2> >::Type
549 template<
typename VT2 >
550 friend inline typename EnableIf< UseAssign<VT2> >::Type
608 template<
typename VT
610 inline const SVecScalarMultExpr<VT,typename BaseElementType<VT>::Type,TF>
650 template<
typename T1
653 inline const typename EnableIf< IsNumeric<T2>,
typename MultExprTrait<T1,T2>::Type >::Type
659 return Type( ~vec, scalar );
685 template<
typename T1
688 inline const typename EnableIf< IsNumeric<T1>,
typename MultExprTrait<T1,T2>::Type >::Type
694 return Type( ~vec, scalar );
725 template<
typename VT
727 inline const SVecScalarMultExpr<VT,typename VT::ElementType,TF>
734 const ElementType len (
length( ~vec ) );
762 template<
typename VT
765 inline const SVecScalarMultExpr<VT,ST,TF>
766 operator-(
const SVecScalarMultExpr<VT,ST,TF>& sv )
770 return SVecScalarMultExpr<VT,ST,TF>( sv.leftOperand(), -sv.rightOperand() );
797 template<
typename VT
801 inline const typename EnableIf< IsNumeric<ST2>
802 ,
typename MultExprTrait< SVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
803 operator*(
const SVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
807 return vec.leftOperand() * ( vec.rightOperand() * scalar );
826 template<
typename ST1
830 inline const typename EnableIf< IsNumeric<ST1>
831 ,
typename MultExprTrait< ST1, SVecScalarMultExpr<VT,ST2,TF> >::Type >::Type
832 operator*( ST1 scalar,
const SVecScalarMultExpr<VT,ST2,TF>& vec )
836 return vec.leftOperand() * ( scalar * vec.rightOperand() );
855 template<
typename VT
859 inline const typename EnableIf< IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>
860 ,
typename DivExprTrait< SVecScalarMultExpr<VT,ST1,TF>, ST2 >::Type >::Type
861 operator/(
const SVecScalarMultExpr<VT,ST1,TF>& vec, ST2 scalar )
865 return vec.leftOperand() * ( vec.rightOperand() / scalar );
885 template<
typename VT1
889 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
890 operator*(
const SVecScalarMultExpr<VT1,ST,TF>& lhs,
const DenseVector<VT2,TF>& rhs )
894 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
914 template<
typename VT1
918 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,TF> >::Type
919 operator*(
const DenseVector<VT1,TF>& lhs,
const SVecScalarMultExpr<VT2,ST,TF>& rhs )
923 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
943 template<
typename VT1
946 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
947 operator*(
const SVecScalarMultExpr<VT1,ST,false>& lhs,
const DenseVector<VT2,true>& rhs )
951 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
971 template<
typename VT1
974 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >::Type
975 operator*(
const DenseVector<VT1,false>& lhs,
const SVecScalarMultExpr<VT2,ST,true>& rhs )
979 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
999 template<
typename VT1
1003 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,TF>, VT2 >::Type
1004 operator*(
const SVecScalarMultExpr<VT1,ST,TF>& lhs,
const SparseVector<VT2,TF>& rhs )
1008 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1028 template<
typename VT1
1032 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,TF> >::Type
1033 operator*(
const SparseVector<VT1,TF>& lhs,
const SVecScalarMultExpr<VT2,ST,TF>& rhs )
1037 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1057 template<
typename VT1
1062 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,TF>, SVecScalarMultExpr<VT2,ST2,TF> >::Type
1063 operator*(
const SVecScalarMultExpr<VT1,ST1,TF>& lhs,
const SVecScalarMultExpr<VT2,ST2,TF>& rhs )
1067 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1087 template<
typename VT1
1090 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >::Type
1091 operator*(
const SVecScalarMultExpr<VT1,ST,false>& lhs,
const SparseVector<VT2,true>& rhs )
1095 return ( lhs.leftOperand() * (~rhs) ) * lhs.rightOperand();
1115 template<
typename VT1
1118 inline const typename MultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >::Type
1119 operator*(
const SparseVector<VT1,false>& lhs,
const SVecScalarMultExpr<VT2,ST,true>& rhs )
1123 return ( (~lhs) * rhs.leftOperand() ) * rhs.rightOperand();
1143 template<
typename VT1
1147 inline const typename MultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >::Type
1148 operator*(
const SVecScalarMultExpr<VT1,ST1,false>& lhs,
const SVecScalarMultExpr<VT2,ST2,true>& rhs )
1152 return ( lhs.leftOperand() * rhs.leftOperand() ) * ( lhs.rightOperand() * rhs.rightOperand() );
1172 template<
typename MT
1176 inline const typename MultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >::Type
1177 operator*(
const DenseMatrix<MT,SO>& mat,
const SVecScalarMultExpr<VT,ST,false>& vec )
1181 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1201 template<
typename VT
1205 inline const typename MultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >::Type
1206 operator*(
const SVecScalarMultExpr<VT,ST,true>& vec,
const DenseMatrix<MT,SO>& mat )
1210 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1230 template<
typename MT
1234 inline const typename MultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >::Type
1235 operator*(
const SparseMatrix<MT,SO>& mat,
const SVecScalarMultExpr<VT,ST,false>& vec )
1239 return ( (~mat) * vec.leftOperand() ) * vec.rightOperand();
1259 template<
typename VT
1263 inline const typename MultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >::Type
1264 operator*(
const SVecScalarMultExpr<VT,ST,true>& vec,
const SparseMatrix<MT,SO>& mat )
1268 return ( vec.leftOperand() * (~mat) ) * vec.rightOperand();
1284 template<
typename VT,
typename ST1,
typename ST2 >
1285 struct SVecScalarMultExprTrait< SVecScalarMultExpr<VT,ST1,false>, ST2 >
1289 typedef typename SelectType< IsSparseVector<VT>::value && IsColumnVector<VT>::value &&
1290 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1291 ,
typename SVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1292 , INVALID_TYPE >::Type Type;
1309 template<
typename VT,
typename ST1,
typename ST2 >
1310 struct TSVecScalarMultExprTrait< SVecScalarMultExpr<VT,ST1,true>, ST2 >
1314 typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
1315 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1316 ,
typename TSVecScalarMultExprTrait<VT,typename MultTrait<ST1,ST2>::Type>::Type
1317 , INVALID_TYPE >::Type Type;
1334 template<
typename VT,
typename ST1,
typename ST2 >
1335 struct SVecScalarDivExprTrait< SVecScalarMultExpr<VT,ST1,false>, ST2 >
1339 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1343 typedef typename SVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1344 typedef typename SVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1349 typedef typename SelectType< IsSparseVector<VT>::value && IsColumnVector<VT>::value &&
1350 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1351 ,
typename SelectType<condition,T1,T2>::Type
1352 , INVALID_TYPE >::Type Type;
1369 template<
typename VT,
typename ST1,
typename ST2 >
1370 struct TSVecScalarDivExprTrait< SVecScalarMultExpr<VT,ST1,true>, ST2 >
1374 enum { condition = IsFloatingPoint<typename DivTrait<ST1,ST2>::Type>::value };
1378 typedef typename TSVecScalarMultExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T1;
1379 typedef typename TSVecScalarDivExprTrait<VT,typename DivTrait<ST1,ST2>::Type>::Type T2;
1384 typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
1385 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1386 ,
typename SelectType<condition,T1,T2>::Type
1387 , INVALID_TYPE >::Type Type;
1404 template<
typename VT1,
typename VT2,
typename ST >
1405 struct DVecSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,false> >
1409 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1410 IsSparseVector<VT2>::value && IsColumnVector<VT2>::value &&
1411 IsNumeric<ST>::value
1412 ,
typename SVecScalarMultExprTrait<typename DVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1413 , INVALID_TYPE >::Type Type;
1430 template<
typename VT1,
typename VT2,
typename ST >
1431 struct DVecTSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >
1435 typedef typename SelectType< IsDenseVector<VT1>::value && IsColumnVector<VT1>::value &&
1436 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
1437 IsNumeric<ST>::value
1438 ,
typename SMatScalarMultExprTrait<typename DVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1439 , INVALID_TYPE >::Type Type;
1456 template<
typename VT1,
typename VT2,
typename ST >
1457 struct TDVecTSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >
1461 typedef typename SelectType< IsDenseVector<VT1>::value && IsRowVector<VT1>::value &&
1462 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
1463 IsNumeric<ST>::value
1464 ,
typename TSVecScalarMultExprTrait<typename TDVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1465 , INVALID_TYPE >::Type Type;
1482 template<
typename VT1,
typename ST,
typename VT2 >
1483 struct SVecDVecMultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >
1487 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
1488 IsDenseVector<VT2>::value && IsColumnVector<VT2>::value &&
1489 IsNumeric<ST>::value
1490 ,
typename SVecScalarMultExprTrait<typename SVecDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1491 , INVALID_TYPE >::Type Type;
1508 template<
typename VT1,
typename ST,
typename VT2 >
1509 struct SVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >
1513 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
1514 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1515 IsNumeric<ST>::value
1516 ,
typename TSMatScalarMultExprTrait<typename SVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1517 , INVALID_TYPE >::Type Type;
1534 template<
typename VT1,
typename ST,
typename VT2 >
1535 struct TSVecTDVecMultExprTrait< SVecScalarMultExpr<VT1,ST,true>, VT2 >
1539 typedef typename SelectType< IsSparseVector<VT1>::value && IsRowVector<VT1>::value &&
1540 IsDenseVector<VT2>::value && IsRowVector<VT2>::value &&
1541 IsNumeric<ST>::value
1542 ,
typename TSVecScalarMultExprTrait<typename TSVecTDVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1543 , INVALID_TYPE >::Type Type;
1560 template<
typename VT1,
typename ST,
typename VT2 >
1561 struct SVecSVecMultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >
1565 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
1566 IsSparseVector<VT2>::value && IsColumnVector<VT2>::value &&
1567 IsNumeric<ST>::value
1568 ,
typename SVecScalarMultExprTrait<typename SVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1569 , INVALID_TYPE >::Type Type;
1578 template<
typename VT1,
typename VT2,
typename ST >
1579 struct SVecSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,false> >
1583 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
1584 IsSparseVector<VT2>::value && IsColumnVector<VT2>::value &&
1585 IsNumeric<ST>::value
1586 ,
typename SVecScalarMultExprTrait<typename SVecSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1587 , INVALID_TYPE >::Type Type;
1596 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1597 struct SVecSVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,false> >
1601 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
1602 IsSparseVector<VT2>::value && IsColumnVector<VT2>::value &&
1603 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1604 ,
typename SVecScalarMultExprTrait<typename SVecSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1605 , INVALID_TYPE >::Type Type;
1622 template<
typename VT1,
typename ST,
typename VT2 >
1623 struct SVecTSVecMultExprTrait< SVecScalarMultExpr<VT1,ST,false>, VT2 >
1627 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
1628 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
1629 IsNumeric<ST>::value
1630 ,
typename SMatScalarMultExprTrait<typename SVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1631 , INVALID_TYPE >::Type Type;
1640 template<
typename VT1,
typename VT2,
typename ST >
1641 struct SVecTSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >
1645 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
1646 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
1647 IsNumeric<ST>::value
1648 ,
typename SMatScalarMultExprTrait<typename SVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1649 , INVALID_TYPE >::Type Type;
1658 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1659 struct SVecTSVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,false>, SVecScalarMultExpr<VT2,ST2,true> >
1663 typedef typename SelectType< IsSparseVector<VT1>::value && IsColumnVector<VT1>::value &&
1664 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
1665 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1666 ,
typename SMatScalarMultExprTrait<typename SVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1667 , INVALID_TYPE >::Type Type;
1684 template<
typename VT1,
typename ST,
typename VT2 >
1685 struct TSVecTSVecMultExprTrait< SVecScalarMultExpr<VT1,ST,true>, VT2 >
1689 typedef typename SelectType< IsSparseVector<VT1>::value && IsRowVector<VT1>::value &&
1690 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
1691 IsNumeric<ST>::value
1692 ,
typename TSVecScalarMultExprTrait<typename TSVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1693 , INVALID_TYPE >::Type Type;
1702 template<
typename VT1,
typename VT2,
typename ST >
1703 struct TSVecTSVecMultExprTrait< VT1, SVecScalarMultExpr<VT2,ST,true> >
1707 typedef typename SelectType< IsSparseVector<VT1>::value && IsRowVector<VT1>::value &&
1708 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
1709 IsNumeric<ST>::value
1710 ,
typename TSVecScalarMultExprTrait<typename TSVecTSVecMultExprTrait<VT1,VT2>::Type,ST>::Type
1711 , INVALID_TYPE >::Type Type;
1720 template<
typename VT1,
typename ST1,
typename VT2,
typename ST2 >
1721 struct TSVecTSVecMultExprTrait< SVecScalarMultExpr<VT1,ST1,true>, SVecScalarMultExpr<VT2,ST2,true> >
1725 typedef typename SelectType< IsSparseVector<VT1>::value && IsRowVector<VT1>::value &&
1726 IsSparseVector<VT2>::value && IsRowVector<VT2>::value &&
1727 IsNumeric<ST1>::value && IsNumeric<ST2>::value
1728 ,
typename TSVecScalarMultExprTrait<typename TSVecTSVecMultExprTrait<VT1,VT2>::Type,
typename MultTrait<ST1,ST2>::Type>::Type
1729 , INVALID_TYPE >::Type Type;
1746 template<
typename MT,
typename VT,
typename ST >
1747 struct DMatSVecMultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >
1751 typedef typename SelectType< IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1752 IsSparseVector<VT>::value && IsColumnVector<VT>::value &&
1753 IsNumeric<ST>::value
1754 ,
typename DVecScalarMultExprTrait<typename DMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1755 , INVALID_TYPE >::Type Type;
1772 template<
typename MT,
typename VT,
typename ST >
1773 struct TDMatSVecMultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >
1777 typedef typename SelectType< IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1778 IsSparseVector<VT>::value && IsColumnVector<VT>::value &&
1779 IsNumeric<ST>::value
1780 ,
typename DVecScalarMultExprTrait<typename TDMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1781 , INVALID_TYPE >::Type Type;
1798 template<
typename VT,
typename ST,
typename MT >
1799 struct TSVecDMatMultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >
1803 typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
1804 IsDenseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1805 IsNumeric<ST>::value
1806 ,
typename TDVecScalarMultExprTrait<typename TSVecDMatMultExprTrait<VT,MT>::Type,ST>::Type
1807 , INVALID_TYPE >::Type Type;
1824 template<
typename VT,
typename ST,
typename MT >
1825 struct TSVecTDMatMultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >
1829 typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
1830 IsDenseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1831 IsNumeric<ST>::value
1832 ,
typename TDVecScalarMultExprTrait<typename TSVecTDMatMultExprTrait<VT,MT>::Type,ST>::Type
1833 , INVALID_TYPE >::Type Type;
1850 template<
typename MT,
typename VT,
typename ST >
1851 struct SMatSVecMultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >
1855 typedef typename SelectType< IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1856 IsSparseVector<VT>::value && IsColumnVector<VT>::value &&
1857 IsNumeric<ST>::value
1858 ,
typename SVecScalarMultExprTrait<typename SMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1859 , INVALID_TYPE >::Type Type;
1876 template<
typename MT,
typename VT,
typename ST >
1877 struct TSMatSVecMultExprTrait< MT, SVecScalarMultExpr<VT,ST,false> >
1881 typedef typename SelectType< IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1882 IsSparseVector<VT>::value && IsColumnVector<VT>::value &&
1883 IsNumeric<ST>::value
1884 ,
typename SVecScalarMultExprTrait<typename TSMatSVecMultExprTrait<MT,VT>::Type,ST>::Type
1885 , INVALID_TYPE >::Type Type;
1902 template<
typename VT,
typename ST,
typename MT >
1903 struct TSVecSMatMultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >
1907 typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
1908 IsSparseMatrix<MT>::value && IsRowMajorMatrix<MT>::value &&
1909 IsNumeric<ST>::value
1910 ,
typename TSVecScalarMultExprTrait<typename TSVecSMatMultExprTrait<VT,MT>::Type,ST>::Type
1911 , INVALID_TYPE >::Type Type;
1928 template<
typename VT,
typename ST,
typename MT >
1929 struct TSVecTSMatMultExprTrait< SVecScalarMultExpr<VT,ST,true>, MT >
1933 typedef typename SelectType< IsSparseVector<VT>::value && IsRowVector<VT>::value &&
1934 IsSparseMatrix<MT>::value && IsColumnMajorMatrix<MT>::value &&
1935 IsNumeric<ST>::value
1936 ,
typename TSVecScalarMultExprTrait<typename TSVecTSMatMultExprTrait<VT,MT>::Type,ST>::Type
1937 , INVALID_TYPE >::Type Type;
1954 template<
typename VT,
typename ST,
bool TF >
1955 struct SubvectorExprTrait< SVecScalarMultExpr<VT,ST,TF> >
1959 typedef typename MultExprTrait< typename SubvectorExprTrait<const VT>::Type, ST >::Type Type;
ValueType & ReferenceType
Reference return type.
Definition: SVecScalarMultExpr.h:181
Pointer difference type of the Blaze library.
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
bool canAlias(const T *alias) const
Returns whether the expression can alias with the given address alias.
Definition: SVecScalarMultExpr.h:384
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.
ConstIterator end() const
Returns an iterator just past the last non-zero element of the sparse vector.
Definition: SVecScalarMultExpr.h:332
size_t size() const
Returns the current size/dimension of the vector.
Definition: SVecScalarMultExpr.h:342
ptrdiff_t DifferenceType
Difference between two iterators.
Definition: SVecScalarMultExpr.h:182
PointerType pointer
Pointer return type.
Definition: SVecScalarMultExpr.h:187
Header file for the IsSparseMatrix type trait.
Efficient implementation of a compressed matrix.The CompressedMatrix class template is the represent...
Definition: CompressedMatrix.h:196
bool isAliased(const T *alias) const
Returns whether the expression is aliased with the given address alias.
Definition: SVecScalarMultExpr.h:396
SelectType< IsExpression< VT >::value, const VT, const VT & >::Type LeftOperand
Composite type of the left-hand side sparse vector expression.
Definition: SVecScalarMultExpr.h:159
Header file for the IsColumnMajorMatrix type trait.
ConstIterator begin() const
Returns an iterator to the first non-zero element of the sparse vector.
Definition: SVecScalarMultExpr.h:322
DifferenceType operator-(const ConstIterator &rhs) const
Calculating the number of elements between two expression iterators.
Definition: SVecScalarMultExpr.h:280
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
MultExprTrait< RN, ST >::Type ExprReturnType
Expression return type for the subscript operator.
Definition: SVecScalarMultExpr.h:123
Iterator over the elements of the sparse vector/scalar multiplication expression. ...
Definition: SVecScalarMultExpr.h:168
ValueType * PointerType
Pointer return type.
Definition: SVecScalarMultExpr.h:180
Header file for the Computation base class.
Header file for the RequiresEvaluation type trait.
ReturnType value() const
Access to the current value of the sparse element.
Definition: SVecScalarMultExpr.h:237
Header file for the VecScalarMultExpr base class.
ConstIterator(IteratorType vector, RightOperand scalar)
Constructor for the ConstIterator class.
Definition: SVecScalarMultExpr.h:195
Constraint on the data type.
Header file for the DivExprTrait class template.
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
Header file for the ValueIndexPair class.
ResultType::ElementType ElementType
Resulting element type.
Definition: SVecScalarMultExpr.h:150
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.
RightOperand scalar_
Right-hand side scalar of the multiplication expression.
Definition: SVecScalarMultExpr.h:288
const ConstIterator * operator->() const
Direct access to the sparse vector element at the current iterator position.
Definition: SVecScalarMultExpr.h:227
bool operator==(const ConstIterator &rhs) const
Equality comparison between two ConstIterator objects.
Definition: SVecScalarMultExpr.h:258
Header file for the IsFloatingPoint type trait.
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:2379
IteratorCategory iterator_category
The iterator category.
Definition: SVecScalarMultExpr.h:185
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
Base class for N-dimensional dense vectors.The DenseVector class is a base class for all arbitrarily ...
Definition: DenseVector.h:70
LeftOperand vector_
Left-hand side sparse vector of the multiplication expression.
Definition: SVecScalarMultExpr.h:403
#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
#define BLAZE_CONSTRAINT_MUST_BE_SPARSE_VECTOR_TYPE(T)
Constraint on the data type.In case the given data type T is not a sparse, N-dimensional vector type...
Definition: SparseVector.h:79
size_t index() const
Access to the current index of the sparse element.
Definition: SVecScalarMultExpr.h:247
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
DifferenceType difference_type
Difference between two iterators.
Definition: SVecScalarMultExpr.h:189
ResultType::TransposeType TransposeType
Transpose type for expression template evaluations.
Definition: SVecScalarMultExpr.h:149
RemoveReference< LeftOperand >::Type::ConstIterator IteratorType
Iterator type of the sparse vector expression.
Definition: SVecScalarMultExpr.h:176
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:2373
IteratorType vector_
Iterator over the elements of the left-hand side sparse vector expression.
Definition: SVecScalarMultExpr.h:287
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
Header file for the SelectType class template.
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
Constraint on the data type.
Header file for the IsDenseMatrix type trait.
Header file for the EnableIf class template.
ConstIterator & operator++()
Pre-increment operator.
Definition: SVecScalarMultExpr.h:206
Header file for the BaseElementType type trait.
RightOperand scalar_
Right-hand side scalar of the multiplication expression.
Definition: SVecScalarMultExpr.h:404
Header file for the IsNumeric type trait.
ValueIndexPair< ElementType > Element
Element type of the sparse vector expression.
Definition: SVecScalarMultExpr.h:173
Header file for the IsSparseVector type trait.
const Type & ReturnType
Return type for expression template evaluations.
Definition: CompressedMatrix.h:2374
Removal of reference modifiers.The RemoveCV type trait removes any reference modifiers from the given...
Definition: RemoveReference.h:69
Element ValueType
Type of the underlying pointers.
Definition: SVecScalarMultExpr.h:179
bool operator!=(const ConstIterator &rhs) const
Inequality comparison between two ConstIterator objects.
Definition: SVecScalarMultExpr.h:269
Header file for run time assertion macros.
Utility type for generic codes.
Base template for the MultTrait class.
Definition: MultTrait.h:141
ValueType value_type
Type of the underlying pointers.
Definition: SVecScalarMultExpr.h:186
std::forward_iterator_tag IteratorCategory
The iterator category.
Definition: SVecScalarMultExpr.h:178
VT::CompositeType CT
Composite type of the sparse vector expression.
Definition: SVecScalarMultExpr.h:110
Header file for the division trait.
size_t nonZeros() const
Returns the number of non-zero elements in the sparse vector.
Definition: SVecScalarMultExpr.h:352
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
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
ReferenceType reference
Reference return type.
Definition: SVecScalarMultExpr.h:188
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
const Element operator*() const
Direct access to the sparse vector element at the current iterator position.
Definition: SVecScalarMultExpr.h:217
RightOperand rightOperand() const
Returns the right-hand side scalar operand.
Definition: SVecScalarMultExpr.h:372
Evaluation of the base element type of a given data type.Via this type trait it is possible to evalua...
Definition: BaseElementType.h:75
Header file for the RemoveReference type trait.
Header file for the IsDenseVector type trait.
Index-value-pair for sparse vectors and matrices.The ValueIndexPair class represents a single index-v...
Definition: ValueIndexPair.h:69
Header file for the IsRowMajorMatrix type trait.
Header file for the IsComputation type trait class.
SelectType< useAssign, const ResultType, const SVecScalarMultExpr & >::Type CompositeType
Data type for composite expression templates.
Definition: SVecScalarMultExpr.h:156
Expression object for sparse vector-scalar multiplications.The SVecScalarMultExpr class represents th...
Definition: Forward.h:112
SVecScalarMultExpr(const VT &vector, ST scalar)
Constructor for the SVecScalarMultExpr class.
Definition: SVecScalarMultExpr.h:299
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
VT::ResultType RT
Result type of the sparse vector expression.
Definition: SVecScalarMultExpr.h:108
This ResultType
Result type for expression template evaluations.
Definition: CompressedMatrix.h:2370
SVecScalarMultExpr< VT, ST, TF > This
Type of this SVecScalarMultExpr instance.
Definition: SVecScalarMultExpr.h:147
Header file for basic type definitions.
Header file for the SubvectorExprTrait class template.
const SelectType< returnExpr, ExprReturnType, ElementType >::Type ReturnType
Return type for expression template evaluations.
Definition: SVecScalarMultExpr.h:153
const DVecScalarMultExpr< VT, typename VT::ElementType, TF > normalize(const DenseVector< VT, TF > &vec)
Normalization of the dense vector ( ).
Definition: DVecScalarMultExpr.h:866
LeftOperand leftOperand() const
Returns the left-hand side sparse vector operand.
Definition: SVecScalarMultExpr.h:362
Header file for the IsColumnVector type trait.
ST RightOperand
Composite type of the right-hand side scalar value.
Definition: SVecScalarMultExpr.h:162
Evaluation of the resulting expression type of a multiplication.Via this type trait it is possible to...
Definition: MultExprTrait.h:137
#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
VT::ReturnType RN
Return type of the sparse vector expression.
Definition: SVecScalarMultExpr.h:109
MultTrait< RT, ST >::Type ResultType
Result type for expression template evaluations.
Definition: SVecScalarMultExpr.h:148
ReturnType operator[](size_t index) const
Subscript operator for the direct access to the vector elements.
Definition: SVecScalarMultExpr.h:311
#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.