22 #ifndef _BLAZE_MATH_DENSE_DYNAMICVECTOR_H_
23 #define _BLAZE_MATH_DENSE_DYNAMICVECTOR_H_
150 template<
typename Type
190 enum { canAlias = 0 };
202 template<
typename Other,
size_t N >
219 inline Type*
data ();
220 inline const Type*
data ()
const;
233 template<
typename Other,
size_t N >
243 template<
typename Other >
244 inline typename EnableIf< IsNumeric<Other>,
DynamicVector >::Type&
247 template<
typename Other >
248 inline typename EnableIf< IsNumeric<Other>,
DynamicVector >::Type&
256 inline size_t size()
const;
261 inline void resize(
size_t n,
bool preserve=
true );
262 inline void extend(
size_t n,
bool preserve=
true );
263 inline void reserve(
size_t n );
276 void read (
const char* file );
277 void write(
const char* file, std::streamsize prec=6 )
const;
285 template<
typename VT >
286 struct VectorizedAssign {
287 enum { value = vectorizable && VT::vectorizable &&
288 IsSame<Type,typename VT::ElementType>::value };
296 template<
typename VT >
297 struct VectorizedAddAssign {
298 enum { value = vectorizable && VT::vectorizable &&
299 IsSame<Type,typename VT::ElementType>::value &&
300 IntrinsicTrait<Type>::addition };
308 template<
typename VT >
309 struct VectorizedSubAssign {
310 enum { value = vectorizable && VT::vectorizable &&
311 IsSame<Type,typename VT::ElementType>::value &&
312 IntrinsicTrait<Type>::subtraction };
320 template<
typename VT >
321 struct VectorizedMultAssign {
322 enum { value = vectorizable && VT::vectorizable &&
323 IsSame<Type,typename VT::ElementType>::value &&
324 IntrinsicTrait<Type>::multiplication };
333 template<
typename Other >
inline bool isAliased(
const Other* alias )
const;
336 template<
typename VT >
337 inline typename DisableIf< VectorizedAssign<VT> >::Type
338 assign(
const DenseVector<VT,TF>& rhs );
340 template<
typename VT >
341 inline typename EnableIf< VectorizedAssign<VT> >::Type
342 assign(
const DenseVector<VT,TF>& rhs );
346 template<
typename VT >
347 inline typename DisableIf< VectorizedAddAssign<VT> >::Type
348 addAssign(
const DenseVector<VT,TF>& rhs );
350 template<
typename VT >
351 inline typename EnableIf< VectorizedAddAssign<VT> >::Type
352 addAssign(
const DenseVector<VT,TF>& rhs );
356 template<
typename VT >
357 inline typename DisableIf< VectorizedSubAssign<VT> >::Type
358 subAssign(
const DenseVector<VT,TF>& rhs );
360 template<
typename VT >
361 inline typename EnableIf< VectorizedSubAssign<VT> >::Type
362 subAssign(
const DenseVector<VT,TF>& rhs );
366 template<
typename VT >
367 inline typename DisableIf< VectorizedMultAssign<VT> >::Type
370 template<
typename VT >
371 inline typename EnableIf< VectorizedMultAssign<VT> >::Type
391 Type* BLAZE_RESTRICT
v_;
423 template<
typename Type
441 template<
typename Type
445 , capacity_( adjustCapacity( n ) )
446 , v_ (
allocate<Type>( capacity_ ) )
464 template<
typename Type
468 , capacity_( adjustCapacity( n ) )
469 , v_ (
allocate<Type>( capacity_ ) )
471 for(
size_t i=0UL; i<
size_; ++i )
490 template<
typename Type
494 , capacity_( adjustCapacity( v.size_ ) )
495 , v_ (
allocate<Type>( capacity_ ) )
510 template<
typename Type
512 template<
typename VT >
514 : size_ ( (~v).size() )
515 , capacity_( adjustCapacity( size_ ) )
516 , v_ (
allocate<Type>( capacity_ ) )
547 template<
typename Type
549 template<
typename Other
553 , capacity_( adjustCapacity( N ) )
554 , v_ (
allocate<Type>( capacity_ ) )
556 for(
size_t i=0UL; i<N; ++i )
578 template<
typename Type
601 template<
typename Type
618 template<
typename Type
634 template<
typename Type
648 template<
typename Type
662 template<
typename Type
676 template<
typename Type
690 template<
typename Type
704 template<
typename Type
718 template<
typename Type
732 template<
typename Type
766 template<
typename Type
768 template<
typename Other
774 for(
size_t i=0UL; i<N; ++i )
788 template<
typename Type
792 for(
size_t i=0UL; i<size_; ++i )
808 template<
typename Type
812 if( &rhs ==
this )
return *
this;
814 resize( rhs.
size_,
false );
816 for(
size_t i=0UL; i<size_; ++i )
832 template<
typename Type
834 template<
typename VT >
844 resize( (~rhs).size(),
false );
865 template<
typename Type
867 template<
typename VT >
872 if( (~rhs).size() != size_ )
873 throw std::invalid_argument(
"Vector sizes do not match" );
876 typename VT::ResultType tmp( ~rhs );
899 template<
typename Type
901 template<
typename VT >
906 if( (~rhs).size() != size_ )
907 throw std::invalid_argument(
"Vector sizes do not match" );
910 typename VT::ResultType tmp( ~rhs );
933 template<
typename Type
935 template<
typename VT >
940 if( (~rhs).size() != size_ )
941 throw std::invalid_argument(
"Vector sizes do not match" );
948 assign( *
this, *
this * (~rhs) );
963 template<
typename Type
965 template<
typename Other >
969 return operator=( (*
this) * rhs );
983 template<
typename Type
985 template<
typename Other >
991 return operator=( (*
this) / rhs );
1009 template<
typename Type
1023 template<
typename Type
1040 template<
typename Type
1044 size_t nonzeros( 0 );
1046 for(
size_t i=0UL; i<size_; ++i ) {
1061 template<
typename Type
1066 for(
size_t i=0UL; i<size_; ++i )
1079 template<
typename Type
1115 template<
typename Type
1122 const size_t newCapacity( adjustCapacity( n ) );
1123 Type* BLAZE_RESTRICT tmp = allocate<Type>( newCapacity );
1127 std::copy( v_, v_+size_, tmp );
1131 for(
size_t i=size_; i<newCapacity; ++i )
1138 capacity_ = newCapacity;
1158 template<
typename Type
1162 resize( size_+n, preserve );
1176 template<
typename Type
1183 const size_t newCapacity( adjustCapacity( n ) );
1184 Type* BLAZE_RESTRICT tmp = allocate<Type>( newCapacity );
1187 std::copy( v_, v_+size_, tmp );
1190 for(
size_t i=size_; i<newCapacity; ++i )
1197 capacity_ = newCapacity;
1233 template<
typename Type
1244 for(
size_t i=0UL; i<size_; ++i )
1245 sum += v_[i] * v_[i];
1246 return std::sqrt( sum );
1261 template<
typename Type
1268 for(
size_t i=0UL; i<size_; ++i )
1269 sum += v_[i] * v_[i];
1284 template<
typename Type
1290 const Type len( length() );
1292 if( len == Type(0) )
1295 const Type ilen( Type(1) / len );
1297 for(
size_t i=0; i<size_; ++i )
1314 template<
typename Type
1320 const Type len( length() );
1322 if( len == Type(0) )
1325 const Type ilen( Type(1) / len );
1328 for(
size_t i=0UL; i<size_; ++i )
1329 tmp[i] = v_[i] * ilen;
1342 template<
typename Type
1344 template<
typename Other >
1347 for(
size_t i=0UL; i<size_; ++i )
1361 template<
typename Type
1378 template<
typename Type
1383 return minCapacity + ( IT::size - ( minCapacity % IT::size ) ) % IT::size;
1384 else return minCapacity;
1418 template<
typename Type
1422 std::ifstream in( file, std::ifstream::in );
1423 if( !in.is_open() ) {
1424 throw std::runtime_error(
"File could not be opened!" );
1428 if( !(in >> vsize) || vsize == 0UL ) {
1429 throw std::runtime_error(
"Vector size could not be extracted!" );
1434 for(
size_t i=0UL; i<vsize; ++i ) {
1435 if( !(in >> tmp.
v_[i]) ) {
1436 throw std::runtime_error(
"Error during vector extraction!" );
1470 template<
typename Type
1474 std::ofstream out( file, std::ofstream::out | std::ostream::trunc );
1475 if( !out.is_open() ) {
1476 throw std::runtime_error(
"File could not be opened!" );
1479 out << size_ <<
"\n";
1481 out.precision( prec );
1482 for(
size_t i=0UL; i<size_; ++i )
1483 out << v_[i] <<
"\n";
1504 template<
typename Type
1506 template<
typename Other >
1509 return static_cast<const void*
>( this ) == static_cast<const void*>( alias );
1525 template<
typename Type
1536 return load( &v_[index] );
1552 template<
typename Type
1554 template<
typename VT >
1560 const size_t iend( (~rhs).size() &
size_t(-2) );
1561 for(
size_t i=0UL; i<iend; i+=2UL ) {
1562 v_[i ] = (~rhs)[i ];
1563 v_[i+1UL] = (~rhs)[i+1UL];
1565 if( iend < (~rhs).size() )
1566 v_[iend] = (~rhs)[iend];
1582 template<
typename Type
1584 template<
typename VT >
1592 if( size_ > (
cacheSize/(
sizeof(Type) * 3UL ) ) && !(~rhs).isAliased(
this ) )
1594 for(
size_t i=0UL; i<size_; i+=IT::size ) {
1595 stream( v_+i, (~rhs).
get(i) );
1600 BLAZE_INTERNAL_ASSERT( ( size_ - ( size_ % (IT::size*4UL) ) ) == ( size_ &
size_t(-IT::size*4) ),
"Invalid end calculation" );
1601 const size_t iend( size_ &
size_t(-IT::size*4) );
1603 for(
size_t i=0UL; i<iend; i+=IT::size*4UL ) {
1604 store( v_+i , (~rhs).
get(i ) );
1605 store( v_+i+IT::size , (~rhs).
get(i+IT::size ) );
1606 store( v_+i+IT::size*2UL, (~rhs).
get(i+IT::size*2UL) );
1607 store( v_+i+IT::size*3UL, (~rhs).
get(i+IT::size*3UL) );
1609 for(
size_t i=iend; i<size_; i+=IT::size ) {
1610 store( v_+i, (~rhs).
get(i) );
1628 template<
typename Type
1630 template<
typename VT >
1635 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1636 v_[element->index()] = element->value();
1652 template<
typename Type
1654 template<
typename VT >
1660 const size_t iend( (~rhs).size() &
size_t(-2) );
1661 for(
size_t i=0UL; i<iend; i+=2UL ) {
1662 v_[i ] += (~rhs)[i ];
1663 v_[i+1UL] += (~rhs)[i+1UL];
1665 if( iend < (~rhs).size() )
1666 v_[iend] += (~rhs)[iend];
1682 template<
typename Type
1684 template<
typename VT >
1692 BLAZE_INTERNAL_ASSERT( ( size_ - ( size_ % (IT::size*4UL) ) ) == ( size_ &
size_t(-IT::size*4) ),
"Invalid end calculation" );
1693 const size_t iend( size_ &
size_t(-IT::size*4) );
1695 for(
size_t i=0UL; i<iend; i+=IT::size*4UL ) {
1696 store( v_+i ,
load(v_+i ) + (~rhs).
get(i ) );
1697 store( v_+i+IT::size ,
load(v_+i+IT::size ) + (~rhs).
get(i+IT::size ) );
1698 store( v_+i+IT::size*2UL,
load(v_+i+IT::size*2UL) + (~rhs).
get(i+IT::size*2UL) );
1699 store( v_+i+IT::size*3UL,
load(v_+i+IT::size*3UL) + (~rhs).
get(i+IT::size*3UL) );
1701 for(
size_t i=iend; i<size_; i+=IT::size ) {
1702 store( v_+i,
load(v_+i) + (~rhs).
get(i) );
1719 template<
typename Type
1721 template<
typename VT >
1726 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1727 v_[element->index()] += element->value();
1743 template<
typename Type
1745 template<
typename VT >
1751 const size_t iend( (~rhs).size() &
size_t(-2) );
1752 for(
size_t i=0UL; i<iend; i+=2UL ) {
1753 v_[i ] -= (~rhs)[i ];
1754 v_[i+1UL] -= (~rhs)[i+1UL];
1756 if( iend < (~rhs).size() )
1757 v_[iend] -= (~rhs)[iend];
1773 template<
typename Type
1775 template<
typename VT >
1783 BLAZE_INTERNAL_ASSERT( ( size_ - ( size_ % (IT::size*4UL) ) ) == ( size_ &
size_t(-IT::size*4) ),
"Invalid end calculation" );
1784 const size_t iend( size_ &
size_t(-IT::size*4) );
1786 for(
size_t i=0UL; i<iend; i+=IT::size*4UL ) {
1787 store( v_+i ,
load(v_+i ) - (~rhs).
get(i ) );
1788 store( v_+i+IT::size ,
load(v_+i+IT::size ) - (~rhs).
get(i+IT::size ) );
1789 store( v_+i+IT::size*2UL,
load(v_+i+IT::size*2UL) - (~rhs).
get(i+IT::size*2UL) );
1790 store( v_+i+IT::size*3UL,
load(v_+i+IT::size*3UL) - (~rhs).
get(i+IT::size*3UL) );
1792 for(
size_t i=iend; i<size_; i+=IT::size ) {
1793 store( v_+i,
load(v_+i) - (~rhs).
get(i) );
1810 template<
typename Type
1812 template<
typename VT >
1817 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1818 v_[element->index()] -= element->value();
1834 template<
typename Type
1836 template<
typename VT >
1842 const size_t iend( (~rhs).size() &
size_t(-2) );
1843 for(
size_t i=0UL; i<iend; i+=2UL ) {
1844 v_[i ] *= (~rhs)[i ];
1845 v_[i+1UL] *= (~rhs)[i+1UL];
1847 if( iend < (~rhs).size() )
1848 v_[iend] *= (~rhs)[iend];
1864 template<
typename Type
1866 template<
typename VT >
1874 BLAZE_INTERNAL_ASSERT( ( size_ - ( size_ % (IT::size*4UL) ) ) == ( size_ &
size_t(-IT::size*4) ),
"Invalid end calculation" );
1875 const size_t iend( size_ &
size_t(-IT::size*4) );
1877 for(
size_t i=0UL; i<iend; i+=IT::size*4UL ) {
1878 store( v_+i ,
load(v_+i ) * (~rhs).
get(i ) );
1879 store( v_+i+IT::size ,
load(v_+i+IT::size ) * (~rhs).
get(i+IT::size ) );
1880 store( v_+i+IT::size*2UL,
load(v_+i+IT::size*2UL) * (~rhs).
get(i+IT::size*2UL) );
1881 store( v_+i+IT::size*3UL,
load(v_+i+IT::size*3UL) * (~rhs).
get(i+IT::size*3UL) );
1883 for(
size_t i=iend; i<size_; i+=IT::size ) {
1884 store( v_+i,
load(v_+i) * (~rhs).
get(i) );
1901 template<
typename Type
1903 template<
typename VT >
1912 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1913 v_[element->index()] = tmp[element->index()] * element->value();
1929 template<
typename Type,
bool TF >
1932 template<
typename Type,
bool TF >
1935 template<
typename Type,
bool TF >
1938 template<
typename Type,
bool TF >
1941 template<
typename Type,
bool TF >
1954 template<
typename Type
1970 template<
typename Type
1996 template<
typename Type
2000 for(
size_t i=0UL; i<v.
size(); ++i ) {
2001 if(
isnan( v[i] ) )
return true;
2027 template<
typename Type
2031 for(
size_t i=0UL; i<v.
size(); ++i )
2047 template<
typename Type
2066 template<
typename T,
bool TF >
2067 struct IsResizable< DynamicVector<T,TF> > :
public TrueType
2073 template<
typename T,
bool TF >
2074 struct IsResizable< const DynamicVector<T,TF> > :
public TrueType
2080 template<
typename T,
bool TF >
2081 struct IsResizable< volatile DynamicVector<T,TF> > :
public TrueType
2087 template<
typename T,
bool TF >
2088 struct IsResizable< const volatile DynamicVector<T,TF> > :
public TrueType
2107 template<
typename T1,
bool TF,
typename T2,
size_t N >
2108 struct AddTrait< DynamicVector<T1,TF>, StaticVector<T2,N,TF> >
2110 typedef StaticVector< typename AddTrait<T1,T2>::Type, N, TF > Type;
2113 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2114 struct AddTrait< StaticVector<T1,N,TF>, DynamicVector<T2,TF> >
2116 typedef StaticVector< typename AddTrait<T1,T2>::Type, N, TF > Type;
2119 template<
typename T1,
bool TF,
typename T2 >
2120 struct AddTrait< DynamicVector<T1,TF>, DynamicVector<T2,TF> >
2122 typedef DynamicVector< typename AddTrait<T1,T2>::Type, TF > Type;
2138 template<
typename T1,
bool TF,
typename T2,
size_t N >
2139 struct SubTrait< DynamicVector<T1,TF>, StaticVector<T2,N,TF> >
2141 typedef StaticVector< typename SubTrait<T1,T2>::Type, N, TF > Type;
2144 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2145 struct SubTrait< StaticVector<T1,N,TF>, DynamicVector<T2,TF> >
2147 typedef StaticVector< typename SubTrait<T1,T2>::Type, N, TF > Type;
2150 template<
typename T1,
bool TF,
typename T2 >
2151 struct SubTrait< DynamicVector<T1,TF>, DynamicVector<T2,TF> >
2153 typedef DynamicVector< typename SubTrait<T1,T2>::Type, TF > Type;
2169 template<
typename T1,
bool TF,
typename T2 >
2170 struct MultTrait< DynamicVector<T1,TF>, T2 >
2172 typedef DynamicVector< typename MultTrait<T1,T2>::Type, TF > Type;
2176 template<
typename T1,
typename T2,
bool TF >
2177 struct MultTrait< T1, DynamicVector<T2,TF> >
2179 typedef DynamicVector< typename MultTrait<T1,T2>::Type, TF > Type;
2183 template<
typename T1,
bool TF,
typename T2,
size_t N >
2184 struct MultTrait< DynamicVector<T1,TF>, StaticVector<T2,N,TF> >
2186 typedef StaticVector< typename MultTrait<T1,T2>::Type, N, TF > Type;
2189 template<
typename T1,
typename T2,
size_t N >
2190 struct MultTrait< DynamicVector<T1,false>, StaticVector<T2,N,true> >
2192 typedef DynamicMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
2195 template<
typename T1,
typename T2,
size_t N >
2196 struct MultTrait< DynamicVector<T1,true>, StaticVector<T2,N,false> >
2198 typedef typename MultTrait<T1,T2>::Type Type;
2201 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2202 struct MultTrait< StaticVector<T1,N,TF>, DynamicVector<T2,TF> >
2204 typedef StaticVector< typename MultTrait<T1,T2>::Type, N, TF > Type;
2207 template<
typename T1,
size_t N,
typename T2 >
2208 struct MultTrait< StaticVector<T1,N,false>, DynamicVector<T2,true> >
2210 typedef DynamicMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
2213 template<
typename T1,
size_t N,
typename T2 >
2214 struct MultTrait< StaticVector<T1,N,true>, DynamicVector<T2,false> >
2216 typedef typename MultTrait<T1,T2>::Type Type;
2219 template<
typename T1,
bool TF,
typename T2 >
2220 struct MultTrait< DynamicVector<T1,TF>, DynamicVector<T2,TF> >
2222 typedef DynamicVector< typename MultTrait<T1,T2>::Type, TF > Type;
2225 template<
typename T1,
typename T2 >
2226 struct MultTrait< DynamicVector<T1,false>, DynamicVector<T2,true> >
2228 typedef DynamicMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
2231 template<
typename T1,
typename T2 >
2232 struct MultTrait< DynamicVector<T1,true>, DynamicVector<T2,false> >
2234 typedef typename MultTrait<T1,T2>::Type Type;
2250 template<
typename T1,
typename T2 >
2251 struct CrossTrait< DynamicVector<T1,false>, StaticVector<T2,3UL,false> >
2254 typedef typename MultTrait<T1,T2>::Type T;
2257 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2260 template<
typename T1,
typename T2 >
2261 struct CrossTrait< StaticVector<T1,3UL,false>, DynamicVector<T2,false> >
2264 typedef typename MultTrait<T1,T2>::Type T;
2267 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2270 template<
typename T1,
typename T2 >
2271 struct CrossTrait< DynamicVector<T1,false>, DynamicVector<T2,false> >
2274 typedef typename MultTrait<T1,T2>::Type T;
2277 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2293 template<
typename T1,
bool TF,
typename T2 >
2294 struct DivTrait< DynamicVector<T1,TF>, T2 >
2296 typedef DynamicVector< typename DivTrait<T1,T2>::Type, TF > Type;
2313 template<
typename T1,
bool TF,
typename T2 >
2314 struct MathTrait< DynamicVector<T1,TF>, DynamicVector<T2,TF> >
2316 typedef DynamicVector< typename MathTrait<T1,T2>::HighType, TF > HighType;
2317 typedef DynamicVector< typename MathTrait<T1,T2>::LowType , TF > LowType;