22 #ifndef _BLAZE_MATH_DENSE_DYNAMICVECTOR_H_
23 #define _BLAZE_MATH_DENSE_DYNAMICVECTOR_H_
144 template<
typename Type
186 template<
typename Other,
size_t N >
203 inline Type*
data ();
204 inline const Type*
data ()
const;
217 template<
typename Other,
size_t N >
227 template<
typename Other >
229 operator*=( Other rhs );
231 template<
typename Other >
233 operator/=( Other rhs );
240 inline size_t size()
const;
245 inline void resize(
size_t n,
bool preserve=
true );
246 inline void extend(
size_t n,
bool preserve=
true );
247 inline void reserve(
size_t n );
248 template<
typename Other >
inline DynamicVector& scale( Other scalar );
256 void read (
const char* file );
257 void write(
const char* file, std::streamsize prec=6 )
const;
265 template<
typename VT >
266 struct VectorizedAssign {
267 enum { value = vectorizable && VT::vectorizable &&
276 template<
typename VT >
277 struct VectorizedAddAssign {
278 enum { value = vectorizable && VT::vectorizable &&
279 IsSame<Type,typename VT::ElementType>::value &&
280 IntrinsicTrait<Type>::addition };
288 template<
typename VT >
289 struct VectorizedSubAssign {
290 enum { value = vectorizable && VT::vectorizable &&
291 IsSame<Type,typename VT::ElementType>::value &&
292 IntrinsicTrait<Type>::subtraction };
300 template<
typename VT >
301 struct VectorizedMultAssign {
302 enum { value = vectorizable && VT::vectorizable &&
303 IsSame<Type,typename VT::ElementType>::value &&
304 IntrinsicTrait<Type>::multiplication };
313 template<
typename Other >
inline bool canAlias (
const Other* alias )
const;
314 template<
typename Other >
inline bool isAliased(
const Other* alias )
const;
317 template<
typename VT >
318 inline typename DisableIf< VectorizedAssign<VT> >::Type
319 assign(
const DenseVector<VT,TF>& rhs );
321 template<
typename VT >
322 inline typename EnableIf< VectorizedAssign<VT> >::Type
323 assign(
const DenseVector<VT,TF>& rhs );
325 template<
typename VT >
inline void assign(
const SparseVector<VT,TF>& rhs );
327 template<
typename VT >
328 inline typename DisableIf< VectorizedAddAssign<VT> >::Type
329 addAssign(
const DenseVector<VT,TF>& rhs );
331 template<
typename VT >
332 inline typename EnableIf< VectorizedAddAssign<VT> >::Type
333 addAssign(
const DenseVector<VT,TF>& rhs );
335 template<
typename VT >
inline void addAssign(
const SparseVector<VT,TF>& rhs );
337 template<
typename VT >
338 inline typename DisableIf< VectorizedSubAssign<VT> >::Type
339 subAssign(
const DenseVector<VT,TF>& rhs );
341 template<
typename VT >
342 inline typename EnableIf< VectorizedSubAssign<VT> >::Type
343 subAssign(
const DenseVector<VT,TF>& rhs );
345 template<
typename VT >
inline void subAssign(
const SparseVector<VT,TF>& rhs );
347 template<
typename VT >
348 inline typename DisableIf< VectorizedMultAssign<VT> >::Type
349 multAssign(
const DenseVector<VT,TF>& rhs );
351 template<
typename VT >
352 inline typename EnableIf< VectorizedMultAssign<VT> >::Type
353 multAssign(
const DenseVector<VT,TF>& rhs );
355 template<
typename VT >
inline void multAssign(
const SparseVector<VT,TF>& rhs );
404 template<
typename Type
422 template<
typename Type
426 , capacity_( adjustCapacity( n ) )
427 , v_ (
allocate<Type>( capacity_ ) )
445 template<
typename Type
449 , capacity_( adjustCapacity( n ) )
450 , v_ (
allocate<Type>( capacity_ ) )
452 for(
size_t i=0UL; i<
size_; ++i )
471 template<
typename Type
475 , capacity_( adjustCapacity( v.size_ ) )
476 , v_ (
allocate<Type>( capacity_ ) )
491 template<
typename Type
493 template<
typename VT >
495 : size_ ( (~v).size() )
496 , capacity_( adjustCapacity( size_ ) )
497 , v_ (
allocate<Type>( capacity_ ) )
528 template<
typename Type
530 template<
typename Other
534 , capacity_( adjustCapacity( N ) )
535 , v_ (
allocate<Type>( capacity_ ) )
537 for(
size_t i=0UL; i<N; ++i )
559 template<
typename Type
582 template<
typename Type
599 template<
typename Type
615 template<
typename Type
629 template<
typename Type
643 template<
typename Type
657 template<
typename Type
671 template<
typename Type
685 template<
typename Type
699 template<
typename Type
713 template<
typename Type
747 template<
typename Type
749 template<
typename Other
755 for(
size_t i=0UL; i<N; ++i )
769 template<
typename Type
773 for(
size_t i=0UL; i<size_; ++i )
789 template<
typename Type
793 if( &rhs ==
this )
return *
this;
795 resize( rhs.
size_,
false );
797 for(
size_t i=0UL; i<size_; ++i )
813 template<
typename Type
815 template<
typename VT >
820 if( (~rhs).canAlias(
this ) ) {
825 resize( (~rhs).size(),
false );
846 template<
typename Type
848 template<
typename VT >
853 if( (~rhs).size() != size_ )
854 throw std::invalid_argument(
"Vector sizes do not match" );
856 if( (~rhs).canAlias(
this ) ) {
857 typename VT::ResultType tmp( ~rhs );
880 template<
typename Type
882 template<
typename VT >
887 if( (~rhs).size() != size_ )
888 throw std::invalid_argument(
"Vector sizes do not match" );
890 if( (~rhs).canAlias(
this ) ) {
891 typename VT::ResultType tmp( ~rhs );
914 template<
typename Type
916 template<
typename VT >
921 if( (~rhs).size() != size_ )
922 throw std::invalid_argument(
"Vector sizes do not match" );
929 assign( *
this, *
this * (~rhs) );
944 template<
typename Type
946 template<
typename Other >
950 return operator=( (*
this) * rhs );
964 template<
typename Type
966 template<
typename Other >
972 return operator=( (*
this) / rhs );
990 template<
typename Type
1004 template<
typename Type
1021 template<
typename Type
1025 size_t nonzeros( 0 );
1027 for(
size_t i=0UL; i<size_; ++i ) {
1042 template<
typename Type
1047 for(
size_t i=0UL; i<size_; ++i )
1060 template<
typename Type
1096 template<
typename Type
1103 const size_t newCapacity( adjustCapacity( n ) );
1108 std::copy( v_, v_+size_, tmp );
1112 for(
size_t i=size_; i<newCapacity; ++i )
1119 capacity_ = newCapacity;
1123 for(
size_t i=n; i<size_; ++i )
1144 template<
typename Type
1148 resize( size_+n, preserve );
1162 template<
typename Type
1169 const size_t newCapacity( adjustCapacity( n ) );
1173 std::copy( v_, v_+size_, tmp );
1176 for(
size_t i=size_; i<newCapacity; ++i )
1183 capacity_ = newCapacity;
1195 template<
typename Type
1197 template<
typename Other >
1200 for(
size_t i=0UL; i<size_; ++i )
1214 template<
typename Type
1231 template<
typename Type
1236 return minCapacity + ( IT::size - ( minCapacity % IT::size ) ) % IT::size;
1237 else return minCapacity;
1271 template<
typename Type
1275 std::ifstream in( file, std::ifstream::in );
1276 if( !in.is_open() ) {
1277 throw std::runtime_error(
"File could not be opened!" );
1281 if( !(in >> vsize) || vsize == 0UL ) {
1282 throw std::runtime_error(
"Vector size could not be extracted!" );
1287 for(
size_t i=0UL; i<vsize; ++i ) {
1288 if( !(in >> tmp.
v_[i]) ) {
1289 throw std::runtime_error(
"Error during vector extraction!" );
1323 template<
typename Type
1327 std::ofstream out( file, std::ofstream::out | std::ostream::trunc );
1328 if( !out.is_open() ) {
1329 throw std::runtime_error(
"File could not be opened!" );
1332 out << size_ <<
"\n";
1334 out.precision( prec );
1335 for(
size_t i=0UL; i<size_; ++i )
1336 out << v_[i] <<
"\n";
1361 template<
typename Type
1363 template<
typename Other >
1366 return static_cast<const void*
>( this ) == static_cast<const void*>( alias );
1381 template<
typename Type
1383 template<
typename Other >
1386 return static_cast<const void*
>( this ) == static_cast<const void*>( alias );
1402 template<
typename Type
1413 return load( &v_[index] );
1429 template<
typename Type
1431 template<
typename VT >
1437 const size_t iend( (~rhs).size() &
size_t(-2) );
1438 for(
size_t i=0UL; i<iend; i+=2UL ) {
1439 v_[i ] = (~rhs)[i ];
1440 v_[i+1UL] = (~rhs)[i+1UL];
1442 if( iend < (~rhs).size() )
1443 v_[iend] = (~rhs)[iend];
1459 template<
typename Type
1461 template<
typename VT >
1469 if( size_ > (
cacheSize/(
sizeof(Type) * 3UL ) ) && !(~rhs).isAliased(
this ) )
1471 for(
size_t i=0UL; i<size_; i+=IT::size ) {
1472 stream( v_+i, (~rhs).
get(i) );
1477 BLAZE_INTERNAL_ASSERT( ( size_ - ( size_ % (IT::size*4UL) ) ) == ( size_ &
size_t(-IT::size*4) ),
"Invalid end calculation" );
1478 const size_t iend( size_ &
size_t(-IT::size*4) );
1480 for(
size_t i=0UL; i<iend; i+=IT::size*4UL ) {
1481 store( v_+i , (~rhs).
get(i ) );
1482 store( v_+i+IT::size , (~rhs).
get(i+IT::size ) );
1483 store( v_+i+IT::size*2UL, (~rhs).
get(i+IT::size*2UL) );
1484 store( v_+i+IT::size*3UL, (~rhs).
get(i+IT::size*3UL) );
1486 for(
size_t i=iend; i<size_; i+=IT::size ) {
1487 store( v_+i, (~rhs).
get(i) );
1505 template<
typename Type
1507 template<
typename VT >
1512 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1513 v_[element->index()] = element->value();
1529 template<
typename Type
1531 template<
typename VT >
1537 const size_t iend( (~rhs).size() &
size_t(-2) );
1538 for(
size_t i=0UL; i<iend; i+=2UL ) {
1539 v_[i ] += (~rhs)[i ];
1540 v_[i+1UL] += (~rhs)[i+1UL];
1542 if( iend < (~rhs).size() )
1543 v_[iend] += (~rhs)[iend];
1559 template<
typename Type
1561 template<
typename VT >
1569 BLAZE_INTERNAL_ASSERT( ( size_ - ( size_ % (IT::size*4UL) ) ) == ( size_ &
size_t(-IT::size*4) ),
"Invalid end calculation" );
1570 const size_t iend( size_ &
size_t(-IT::size*4) );
1572 for(
size_t i=0UL; i<iend; i+=IT::size*4UL ) {
1573 store( v_+i ,
load(v_+i ) + (~rhs).
get(i ) );
1574 store( v_+i+IT::size ,
load(v_+i+IT::size ) + (~rhs).
get(i+IT::size ) );
1575 store( v_+i+IT::size*2UL,
load(v_+i+IT::size*2UL) + (~rhs).
get(i+IT::size*2UL) );
1576 store( v_+i+IT::size*3UL,
load(v_+i+IT::size*3UL) + (~rhs).
get(i+IT::size*3UL) );
1578 for(
size_t i=iend; i<size_; i+=IT::size ) {
1579 store( v_+i,
load(v_+i) + (~rhs).
get(i) );
1596 template<
typename Type
1598 template<
typename VT >
1603 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1604 v_[element->index()] += element->value();
1620 template<
typename Type
1622 template<
typename VT >
1628 const size_t iend( (~rhs).size() &
size_t(-2) );
1629 for(
size_t i=0UL; i<iend; i+=2UL ) {
1630 v_[i ] -= (~rhs)[i ];
1631 v_[i+1UL] -= (~rhs)[i+1UL];
1633 if( iend < (~rhs).size() )
1634 v_[iend] -= (~rhs)[iend];
1650 template<
typename Type
1652 template<
typename VT >
1660 BLAZE_INTERNAL_ASSERT( ( size_ - ( size_ % (IT::size*4UL) ) ) == ( size_ &
size_t(-IT::size*4) ),
"Invalid end calculation" );
1661 const size_t iend( size_ &
size_t(-IT::size*4) );
1663 for(
size_t i=0UL; i<iend; i+=IT::size*4UL ) {
1664 store( v_+i ,
load(v_+i ) - (~rhs).
get(i ) );
1665 store( v_+i+IT::size ,
load(v_+i+IT::size ) - (~rhs).
get(i+IT::size ) );
1666 store( v_+i+IT::size*2UL,
load(v_+i+IT::size*2UL) - (~rhs).
get(i+IT::size*2UL) );
1667 store( v_+i+IT::size*3UL,
load(v_+i+IT::size*3UL) - (~rhs).
get(i+IT::size*3UL) );
1669 for(
size_t i=iend; i<size_; i+=IT::size ) {
1670 store( v_+i,
load(v_+i) - (~rhs).
get(i) );
1687 template<
typename Type
1689 template<
typename VT >
1694 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1695 v_[element->index()] -= element->value();
1711 template<
typename Type
1713 template<
typename VT >
1719 const size_t iend( (~rhs).size() &
size_t(-2) );
1720 for(
size_t i=0UL; i<iend; i+=2UL ) {
1721 v_[i ] *= (~rhs)[i ];
1722 v_[i+1UL] *= (~rhs)[i+1UL];
1724 if( iend < (~rhs).size() )
1725 v_[iend] *= (~rhs)[iend];
1741 template<
typename Type
1743 template<
typename VT >
1751 BLAZE_INTERNAL_ASSERT( ( size_ - ( size_ % (IT::size*4UL) ) ) == ( size_ &
size_t(-IT::size*4) ),
"Invalid end calculation" );
1752 const size_t iend( size_ &
size_t(-IT::size*4) );
1754 for(
size_t i=0UL; i<iend; i+=IT::size*4UL ) {
1755 store( v_+i ,
load(v_+i ) * (~rhs).
get(i ) );
1756 store( v_+i+IT::size ,
load(v_+i+IT::size ) * (~rhs).
get(i+IT::size ) );
1757 store( v_+i+IT::size*2UL,
load(v_+i+IT::size*2UL) * (~rhs).
get(i+IT::size*2UL) );
1758 store( v_+i+IT::size*3UL,
load(v_+i+IT::size*3UL) * (~rhs).
get(i+IT::size*3UL) );
1760 for(
size_t i=iend; i<size_; i+=IT::size ) {
1761 store( v_+i,
load(v_+i) * (~rhs).
get(i) );
1778 template<
typename Type
1780 template<
typename VT >
1789 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1790 v_[element->index()] = tmp[element->index()] * element->value();
1806 template<
typename Type,
bool TF >
1809 template<
typename Type,
bool TF >
1812 template<
typename Type,
bool TF >
1815 template<
typename Type,
bool TF >
1818 template<
typename Type,
bool TF >
1831 template<
typename Type
1847 template<
typename Type
1873 template<
typename Type
1877 for(
size_t i=0UL; i<v.
size(); ++i ) {
1878 if(
isnan( v[i] ) )
return true;
1904 template<
typename Type
1908 for(
size_t i=0UL; i<v.
size(); ++i )
1924 template<
typename Type
1943 template<
typename T,
bool TF >
1944 struct IsResizable< DynamicVector<T,TF> > :
public TrueType
1950 template<
typename T,
bool TF >
1951 struct IsResizable< const DynamicVector<T,TF> > :
public TrueType
1957 template<
typename T,
bool TF >
1958 struct IsResizable< volatile DynamicVector<T,TF> > :
public TrueType
1964 template<
typename T,
bool TF >
1965 struct IsResizable< const volatile DynamicVector<T,TF> > :
public TrueType
1984 template<
typename T1,
bool TF,
typename T2,
size_t N >
1985 struct AddTrait< DynamicVector<T1,TF>, StaticVector<T2,N,TF> >
1987 typedef StaticVector< typename AddTrait<T1,T2>::Type, N, TF > Type;
1990 template<
typename T1,
size_t N,
bool TF,
typename T2 >
1991 struct AddTrait< StaticVector<T1,N,TF>, DynamicVector<T2,TF> >
1993 typedef StaticVector< typename AddTrait<T1,T2>::Type, N, TF > Type;
1996 template<
typename T1,
bool TF,
typename T2 >
1997 struct AddTrait< DynamicVector<T1,TF>, DynamicVector<T2,TF> >
1999 typedef DynamicVector< typename AddTrait<T1,T2>::Type, TF > Type;
2015 template<
typename T1,
bool TF,
typename T2,
size_t N >
2016 struct SubTrait< DynamicVector<T1,TF>, StaticVector<T2,N,TF> >
2018 typedef StaticVector< typename SubTrait<T1,T2>::Type, N, TF > Type;
2021 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2022 struct SubTrait< StaticVector<T1,N,TF>, DynamicVector<T2,TF> >
2024 typedef StaticVector< typename SubTrait<T1,T2>::Type, N, TF > Type;
2027 template<
typename T1,
bool TF,
typename T2 >
2028 struct SubTrait< DynamicVector<T1,TF>, DynamicVector<T2,TF> >
2030 typedef DynamicVector< typename SubTrait<T1,T2>::Type, TF > Type;
2046 template<
typename T1,
bool TF,
typename T2 >
2047 struct MultTrait< DynamicVector<T1,TF>, T2 >
2049 typedef DynamicVector< typename MultTrait<T1,T2>::Type, TF > Type;
2053 template<
typename T1,
typename T2,
bool TF >
2054 struct MultTrait< T1, DynamicVector<T2,TF> >
2056 typedef DynamicVector< typename MultTrait<T1,T2>::Type, TF > Type;
2060 template<
typename T1,
bool TF,
typename T2,
size_t N >
2061 struct MultTrait< DynamicVector<T1,TF>, StaticVector<T2,N,TF> >
2063 typedef StaticVector< typename MultTrait<T1,T2>::Type, N, TF > Type;
2066 template<
typename T1,
typename T2,
size_t N >
2067 struct MultTrait< DynamicVector<T1,false>, StaticVector<T2,N,true> >
2069 typedef DynamicMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
2072 template<
typename T1,
typename T2,
size_t N >
2073 struct MultTrait< DynamicVector<T1,true>, StaticVector<T2,N,false> >
2075 typedef typename MultTrait<T1,T2>::Type Type;
2078 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2079 struct MultTrait< StaticVector<T1,N,TF>, DynamicVector<T2,TF> >
2081 typedef StaticVector< typename MultTrait<T1,T2>::Type, N, TF > Type;
2084 template<
typename T1,
size_t N,
typename T2 >
2085 struct MultTrait< StaticVector<T1,N,false>, DynamicVector<T2,true> >
2087 typedef DynamicMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
2090 template<
typename T1,
size_t N,
typename T2 >
2091 struct MultTrait< StaticVector<T1,N,true>, DynamicVector<T2,false> >
2093 typedef typename MultTrait<T1,T2>::Type Type;
2096 template<
typename T1,
bool TF,
typename T2 >
2097 struct MultTrait< DynamicVector<T1,TF>, DynamicVector<T2,TF> >
2099 typedef DynamicVector< typename MultTrait<T1,T2>::Type, TF > Type;
2102 template<
typename T1,
typename T2 >
2103 struct MultTrait< DynamicVector<T1,false>, DynamicVector<T2,true> >
2105 typedef DynamicMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
2108 template<
typename T1,
typename T2 >
2109 struct MultTrait< DynamicVector<T1,true>, DynamicVector<T2,false> >
2111 typedef typename MultTrait<T1,T2>::Type Type;
2127 template<
typename T1,
typename T2 >
2128 struct CrossTrait< DynamicVector<T1,false>, StaticVector<T2,3UL,false> >
2131 typedef typename MultTrait<T1,T2>::Type T;
2134 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2137 template<
typename T1,
typename T2 >
2138 struct CrossTrait< StaticVector<T1,3UL,false>, DynamicVector<T2,false> >
2141 typedef typename MultTrait<T1,T2>::Type T;
2144 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2147 template<
typename T1,
typename T2 >
2148 struct CrossTrait< DynamicVector<T1,false>, DynamicVector<T2,false> >
2151 typedef typename MultTrait<T1,T2>::Type T;
2154 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2170 template<
typename T1,
bool TF,
typename T2 >
2171 struct DivTrait< DynamicVector<T1,TF>, T2 >
2173 typedef DynamicVector< typename DivTrait<T1,T2>::Type, TF > Type;
2190 template<
typename T1,
bool TF,
typename T2 >
2191 struct MathTrait< DynamicVector<T1,TF>, DynamicVector<T2,TF> >
2193 typedef DynamicVector< typename MathTrait<T1,T2>::HighType, TF > HighType;
2194 typedef DynamicVector< typename MathTrait<T1,T2>::LowType , TF > LowType;