22 #ifndef _BLAZE_MATH_DENSE_DYNAMICVECTOR_H_
23 #define _BLAZE_MATH_DENSE_DYNAMICVECTOR_H_
149 template<
typename Type
195 template<
typename Other,
size_t N >
212 inline Type*
data ();
213 inline const Type*
data ()
const;
226 template<
typename Other,
size_t N >
236 template<
typename Other >
238 operator*=( Other rhs );
240 template<
typename Other >
242 operator/=( Other rhs );
249 inline size_t size()
const;
254 inline void resize(
size_t n,
bool preserve=
true );
255 inline void extend(
size_t n,
bool preserve=
true );
256 inline void reserve(
size_t n );
261 template<
typename Other >
inline DynamicVector& scale( Other scalar );
269 void read (
const char* file );
270 void write(
const char* file, std::streamsize prec=6 )
const;
278 template<
typename VT >
279 struct VectorizedAssign {
280 enum { value = vectorizable && VT::vectorizable &&
289 template<
typename VT >
290 struct VectorizedAddAssign {
291 enum { value = vectorizable && VT::vectorizable &&
292 IsSame<Type,typename VT::ElementType>::value &&
293 IntrinsicTrait<Type>::addition };
301 template<
typename VT >
302 struct VectorizedSubAssign {
303 enum { value = vectorizable && VT::vectorizable &&
304 IsSame<Type,typename VT::ElementType>::value &&
305 IntrinsicTrait<Type>::subtraction };
313 template<
typename VT >
314 struct VectorizedMultAssign {
315 enum { value = vectorizable && VT::vectorizable &&
316 IsSame<Type,typename VT::ElementType>::value &&
317 IntrinsicTrait<Type>::multiplication };
326 template<
typename Other >
inline bool canAlias (
const Other* alias )
const;
327 template<
typename Other >
inline bool isAliased(
const Other* alias )
const;
330 template<
typename VT >
331 inline typename DisableIf< VectorizedAssign<VT> >::Type
332 assign(
const DenseVector<VT,TF>& rhs );
334 template<
typename VT >
335 inline typename EnableIf< VectorizedAssign<VT> >::Type
336 assign(
const DenseVector<VT,TF>& rhs );
338 template<
typename VT >
inline void assign(
const SparseVector<VT,TF>& rhs );
340 template<
typename VT >
341 inline typename DisableIf< VectorizedAddAssign<VT> >::Type
342 addAssign(
const DenseVector<VT,TF>& rhs );
344 template<
typename VT >
345 inline typename EnableIf< VectorizedAddAssign<VT> >::Type
346 addAssign(
const DenseVector<VT,TF>& rhs );
348 template<
typename VT >
inline void addAssign(
const SparseVector<VT,TF>& rhs );
350 template<
typename VT >
351 inline typename DisableIf< VectorizedSubAssign<VT> >::Type
352 subAssign(
const DenseVector<VT,TF>& rhs );
354 template<
typename VT >
355 inline typename EnableIf< VectorizedSubAssign<VT> >::Type
356 subAssign(
const DenseVector<VT,TF>& rhs );
358 template<
typename VT >
inline void subAssign(
const SparseVector<VT,TF>& rhs );
360 template<
typename VT >
361 inline typename DisableIf< VectorizedMultAssign<VT> >::Type
362 multAssign(
const DenseVector<VT,TF>& rhs );
364 template<
typename VT >
365 inline typename EnableIf< VectorizedMultAssign<VT> >::Type
366 multAssign(
const DenseVector<VT,TF>& rhs );
368 template<
typename VT >
inline void multAssign(
const SparseVector<VT,TF>& rhs );
417 template<
typename Type
435 template<
typename Type
439 , capacity_( adjustCapacity( n ) )
440 , v_ (
allocate<Type>( capacity_ ) )
458 template<
typename Type
462 , capacity_( adjustCapacity( n ) )
463 , v_ (
allocate<Type>( capacity_ ) )
465 for(
size_t i=0UL; i<
size_; ++i )
484 template<
typename Type
488 , capacity_( adjustCapacity( v.size_ ) )
489 , v_ (
allocate<Type>( capacity_ ) )
504 template<
typename Type
506 template<
typename VT >
508 : size_ ( (~v).size() )
509 , capacity_( adjustCapacity( size_ ) )
510 , v_ (
allocate<Type>( capacity_ ) )
541 template<
typename Type
543 template<
typename Other
547 , capacity_( adjustCapacity( N ) )
548 , v_ (
allocate<Type>( capacity_ ) )
550 for(
size_t i=0UL; i<N; ++i )
572 template<
typename Type
595 template<
typename Type
612 template<
typename Type
628 template<
typename Type
642 template<
typename Type
656 template<
typename Type
670 template<
typename Type
684 template<
typename Type
698 template<
typename Type
712 template<
typename Type
726 template<
typename Type
760 template<
typename Type
762 template<
typename Other
768 for(
size_t i=0UL; i<N; ++i )
782 template<
typename Type
786 for(
size_t i=0UL; i<size_; ++i )
802 template<
typename Type
806 if( &rhs ==
this )
return *
this;
808 resize( rhs.
size_,
false );
810 for(
size_t i=0UL; i<size_; ++i )
826 template<
typename Type
828 template<
typename VT >
833 if( (~rhs).canAlias(
this ) ) {
838 resize( (~rhs).size(),
false );
859 template<
typename Type
861 template<
typename VT >
866 if( (~rhs).size() != size_ )
867 throw std::invalid_argument(
"Vector sizes do not match" );
869 if( (~rhs).canAlias(
this ) ) {
870 typename VT::ResultType tmp( ~rhs );
893 template<
typename Type
895 template<
typename VT >
900 if( (~rhs).size() != size_ )
901 throw std::invalid_argument(
"Vector sizes do not match" );
903 if( (~rhs).canAlias(
this ) ) {
904 typename VT::ResultType tmp( ~rhs );
927 template<
typename Type
929 template<
typename VT >
934 if( (~rhs).size() != size_ )
935 throw std::invalid_argument(
"Vector sizes do not match" );
942 assign( *
this, *
this * (~rhs) );
957 template<
typename Type
959 template<
typename Other >
963 return operator=( (*
this) * rhs );
977 template<
typename Type
979 template<
typename Other >
985 return operator=( (*
this) / rhs );
1003 template<
typename Type
1017 template<
typename Type
1034 template<
typename Type
1038 size_t nonzeros( 0 );
1040 for(
size_t i=0UL; i<size_; ++i ) {
1055 template<
typename Type
1060 for(
size_t i=0UL; i<size_; ++i )
1073 template<
typename Type
1109 template<
typename Type
1116 const size_t newCapacity( adjustCapacity( n ) );
1121 std::copy( v_, v_+size_, tmp );
1125 for(
size_t i=size_; i<newCapacity; ++i )
1132 capacity_ = newCapacity;
1152 template<
typename Type
1156 resize( size_+n, preserve );
1170 template<
typename Type
1177 const size_t newCapacity( adjustCapacity( n ) );
1181 std::copy( v_, v_+size_, tmp );
1184 for(
size_t i=size_; i<newCapacity; ++i )
1191 capacity_ = newCapacity;
1227 template<
typename Type
1238 for(
size_t i=0UL; i<size_; ++i )
1239 sum += v_[i] * v_[i];
1240 return std::sqrt( sum );
1255 template<
typename Type
1262 for(
size_t i=0UL; i<size_; ++i )
1263 sum += v_[i] * v_[i];
1278 template<
typename Type
1284 const Type len( length() );
1286 if( len == Type(0) )
1289 const Type ilen( Type(1) / len );
1291 for(
size_t i=0; i<size_; ++i )
1308 template<
typename Type
1314 const Type len( length() );
1316 if( len == Type(0) )
1319 const Type ilen( Type(1) / len );
1322 for(
size_t i=0UL; i<size_; ++i )
1323 tmp[i] = v_[i] * ilen;
1336 template<
typename Type
1338 template<
typename Other >
1341 for(
size_t i=0UL; i<size_; ++i )
1355 template<
typename Type
1372 template<
typename Type
1377 return minCapacity + ( IT::size - ( minCapacity % IT::size ) ) % IT::size;
1378 else return minCapacity;
1412 template<
typename Type
1416 std::ifstream in( file, std::ifstream::in );
1417 if( !in.is_open() ) {
1418 throw std::runtime_error(
"File could not be opened!" );
1422 if( !(in >> vsize) || vsize == 0UL ) {
1423 throw std::runtime_error(
"Vector size could not be extracted!" );
1428 for(
size_t i=0UL; i<vsize; ++i ) {
1429 if( !(in >> tmp.
v_[i]) ) {
1430 throw std::runtime_error(
"Error during vector extraction!" );
1464 template<
typename Type
1468 std::ofstream out( file, std::ofstream::out | std::ostream::trunc );
1469 if( !out.is_open() ) {
1470 throw std::runtime_error(
"File could not be opened!" );
1473 out << size_ <<
"\n";
1475 out.precision( prec );
1476 for(
size_t i=0UL; i<size_; ++i )
1477 out << v_[i] <<
"\n";
1502 template<
typename Type
1504 template<
typename Other >
1507 return static_cast<const void*
>( this ) == static_cast<const void*>( alias );
1522 template<
typename Type
1524 template<
typename Other >
1527 return static_cast<const void*
>( this ) == static_cast<const void*>( alias );
1543 template<
typename Type
1554 return load( &v_[index] );
1570 template<
typename Type
1572 template<
typename VT >
1578 const size_t iend( (~rhs).size() &
size_t(-2) );
1579 for(
size_t i=0UL; i<iend; i+=2UL ) {
1580 v_[i ] = (~rhs)[i ];
1581 v_[i+1UL] = (~rhs)[i+1UL];
1583 if( iend < (~rhs).size() )
1584 v_[iend] = (~rhs)[iend];
1600 template<
typename Type
1602 template<
typename VT >
1610 if( size_ > (
cacheSize/(
sizeof(Type) * 3UL ) ) && !(~rhs).isAliased(
this ) )
1612 for(
size_t i=0UL; i<size_; i+=IT::size ) {
1613 stream( v_+i, (~rhs).
get(i) );
1618 BLAZE_INTERNAL_ASSERT( ( size_ - ( size_ % (IT::size*4UL) ) ) == ( size_ &
size_t(-IT::size*4) ),
"Invalid end calculation" );
1619 const size_t iend( size_ &
size_t(-IT::size*4) );
1621 for(
size_t i=0UL; i<iend; i+=IT::size*4UL ) {
1622 store( v_+i , (~rhs).
get(i ) );
1623 store( v_+i+IT::size , (~rhs).
get(i+IT::size ) );
1624 store( v_+i+IT::size*2UL, (~rhs).
get(i+IT::size*2UL) );
1625 store( v_+i+IT::size*3UL, (~rhs).
get(i+IT::size*3UL) );
1627 for(
size_t i=iend; i<size_; i+=IT::size ) {
1628 store( v_+i, (~rhs).
get(i) );
1646 template<
typename Type
1648 template<
typename VT >
1653 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1654 v_[element->index()] = element->value();
1670 template<
typename Type
1672 template<
typename VT >
1678 const size_t iend( (~rhs).size() &
size_t(-2) );
1679 for(
size_t i=0UL; i<iend; i+=2UL ) {
1680 v_[i ] += (~rhs)[i ];
1681 v_[i+1UL] += (~rhs)[i+1UL];
1683 if( iend < (~rhs).size() )
1684 v_[iend] += (~rhs)[iend];
1700 template<
typename Type
1702 template<
typename VT >
1710 BLAZE_INTERNAL_ASSERT( ( size_ - ( size_ % (IT::size*4UL) ) ) == ( size_ &
size_t(-IT::size*4) ),
"Invalid end calculation" );
1711 const size_t iend( size_ &
size_t(-IT::size*4) );
1713 for(
size_t i=0UL; i<iend; i+=IT::size*4UL ) {
1714 store( v_+i ,
load(v_+i ) + (~rhs).
get(i ) );
1715 store( v_+i+IT::size ,
load(v_+i+IT::size ) + (~rhs).
get(i+IT::size ) );
1716 store( v_+i+IT::size*2UL,
load(v_+i+IT::size*2UL) + (~rhs).
get(i+IT::size*2UL) );
1717 store( v_+i+IT::size*3UL,
load(v_+i+IT::size*3UL) + (~rhs).
get(i+IT::size*3UL) );
1719 for(
size_t i=iend; i<size_; i+=IT::size ) {
1720 store( v_+i,
load(v_+i) + (~rhs).
get(i) );
1737 template<
typename Type
1739 template<
typename VT >
1744 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1745 v_[element->index()] += element->value();
1761 template<
typename Type
1763 template<
typename VT >
1769 const size_t iend( (~rhs).size() &
size_t(-2) );
1770 for(
size_t i=0UL; i<iend; i+=2UL ) {
1771 v_[i ] -= (~rhs)[i ];
1772 v_[i+1UL] -= (~rhs)[i+1UL];
1774 if( iend < (~rhs).size() )
1775 v_[iend] -= (~rhs)[iend];
1791 template<
typename Type
1793 template<
typename VT >
1801 BLAZE_INTERNAL_ASSERT( ( size_ - ( size_ % (IT::size*4UL) ) ) == ( size_ &
size_t(-IT::size*4) ),
"Invalid end calculation" );
1802 const size_t iend( size_ &
size_t(-IT::size*4) );
1804 for(
size_t i=0UL; i<iend; i+=IT::size*4UL ) {
1805 store( v_+i ,
load(v_+i ) - (~rhs).
get(i ) );
1806 store( v_+i+IT::size ,
load(v_+i+IT::size ) - (~rhs).
get(i+IT::size ) );
1807 store( v_+i+IT::size*2UL,
load(v_+i+IT::size*2UL) - (~rhs).
get(i+IT::size*2UL) );
1808 store( v_+i+IT::size*3UL,
load(v_+i+IT::size*3UL) - (~rhs).
get(i+IT::size*3UL) );
1810 for(
size_t i=iend; i<size_; i+=IT::size ) {
1811 store( v_+i,
load(v_+i) - (~rhs).
get(i) );
1828 template<
typename Type
1830 template<
typename VT >
1835 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1836 v_[element->index()] -= element->value();
1852 template<
typename Type
1854 template<
typename VT >
1860 const size_t iend( (~rhs).size() &
size_t(-2) );
1861 for(
size_t i=0UL; i<iend; i+=2UL ) {
1862 v_[i ] *= (~rhs)[i ];
1863 v_[i+1UL] *= (~rhs)[i+1UL];
1865 if( iend < (~rhs).size() )
1866 v_[iend] *= (~rhs)[iend];
1882 template<
typename Type
1884 template<
typename VT >
1892 BLAZE_INTERNAL_ASSERT( ( size_ - ( size_ % (IT::size*4UL) ) ) == ( size_ &
size_t(-IT::size*4) ),
"Invalid end calculation" );
1893 const size_t iend( size_ &
size_t(-IT::size*4) );
1895 for(
size_t i=0UL; i<iend; i+=IT::size*4UL ) {
1896 store( v_+i ,
load(v_+i ) * (~rhs).
get(i ) );
1897 store( v_+i+IT::size ,
load(v_+i+IT::size ) * (~rhs).
get(i+IT::size ) );
1898 store( v_+i+IT::size*2UL,
load(v_+i+IT::size*2UL) * (~rhs).
get(i+IT::size*2UL) );
1899 store( v_+i+IT::size*3UL,
load(v_+i+IT::size*3UL) * (~rhs).
get(i+IT::size*3UL) );
1901 for(
size_t i=iend; i<size_; i+=IT::size ) {
1902 store( v_+i,
load(v_+i) * (~rhs).
get(i) );
1919 template<
typename Type
1921 template<
typename VT >
1930 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1931 v_[element->index()] = tmp[element->index()] * element->value();
1947 template<
typename Type,
bool TF >
1950 template<
typename Type,
bool TF >
1953 template<
typename Type,
bool TF >
1956 template<
typename Type,
bool TF >
1959 template<
typename Type,
bool TF >
1972 template<
typename Type
1988 template<
typename Type
2014 template<
typename Type
2018 for(
size_t i=0UL; i<v.
size(); ++i ) {
2019 if(
isnan( v[i] ) )
return true;
2045 template<
typename Type
2049 for(
size_t i=0UL; i<v.
size(); ++i )
2065 template<
typename Type
2084 template<
typename T,
bool TF >
2085 struct IsResizable< DynamicVector<T,TF> > :
public TrueType
2091 template<
typename T,
bool TF >
2092 struct IsResizable< const DynamicVector<T,TF> > :
public TrueType
2098 template<
typename T,
bool TF >
2099 struct IsResizable< volatile DynamicVector<T,TF> > :
public TrueType
2105 template<
typename T,
bool TF >
2106 struct IsResizable< const volatile DynamicVector<T,TF> > :
public TrueType
2125 template<
typename T1,
bool TF,
typename T2,
size_t N >
2126 struct AddTrait< DynamicVector<T1,TF>, StaticVector<T2,N,TF> >
2128 typedef StaticVector< typename AddTrait<T1,T2>::Type, N, TF > Type;
2131 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2132 struct AddTrait< StaticVector<T1,N,TF>, DynamicVector<T2,TF> >
2134 typedef StaticVector< typename AddTrait<T1,T2>::Type, N, TF > Type;
2137 template<
typename T1,
bool TF,
typename T2 >
2138 struct AddTrait< DynamicVector<T1,TF>, DynamicVector<T2,TF> >
2140 typedef DynamicVector< typename AddTrait<T1,T2>::Type, TF > Type;
2156 template<
typename T1,
bool TF,
typename T2,
size_t N >
2157 struct SubTrait< DynamicVector<T1,TF>, StaticVector<T2,N,TF> >
2159 typedef StaticVector< typename SubTrait<T1,T2>::Type, N, TF > Type;
2162 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2163 struct SubTrait< StaticVector<T1,N,TF>, DynamicVector<T2,TF> >
2165 typedef StaticVector< typename SubTrait<T1,T2>::Type, N, TF > Type;
2168 template<
typename T1,
bool TF,
typename T2 >
2169 struct SubTrait< DynamicVector<T1,TF>, DynamicVector<T2,TF> >
2171 typedef DynamicVector< typename SubTrait<T1,T2>::Type, TF > Type;
2187 template<
typename T1,
bool TF,
typename T2 >
2188 struct MultTrait< DynamicVector<T1,TF>, T2 >
2190 typedef DynamicVector< typename MultTrait<T1,T2>::Type, TF > Type;
2194 template<
typename T1,
typename T2,
bool TF >
2195 struct MultTrait< T1, DynamicVector<T2,TF> >
2197 typedef DynamicVector< typename MultTrait<T1,T2>::Type, TF > Type;
2201 template<
typename T1,
bool TF,
typename T2,
size_t N >
2202 struct MultTrait< DynamicVector<T1,TF>, StaticVector<T2,N,TF> >
2204 typedef StaticVector< typename MultTrait<T1,T2>::Type, N, TF > Type;
2207 template<
typename T1,
typename T2,
size_t N >
2208 struct MultTrait< DynamicVector<T1,false>, StaticVector<T2,N,true> >
2210 typedef DynamicMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
2213 template<
typename T1,
typename T2,
size_t N >
2214 struct MultTrait< DynamicVector<T1,true>, StaticVector<T2,N,false> >
2216 typedef typename MultTrait<T1,T2>::Type Type;
2219 template<
typename T1,
size_t N,
bool TF,
typename T2 >
2220 struct MultTrait< StaticVector<T1,N,TF>, DynamicVector<T2,TF> >
2222 typedef StaticVector< typename MultTrait<T1,T2>::Type, N, TF > Type;
2225 template<
typename T1,
size_t N,
typename T2 >
2226 struct MultTrait< StaticVector<T1,N,false>, DynamicVector<T2,true> >
2228 typedef DynamicMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
2231 template<
typename T1,
size_t N,
typename T2 >
2232 struct MultTrait< StaticVector<T1,N,true>, DynamicVector<T2,false> >
2234 typedef typename MultTrait<T1,T2>::Type Type;
2237 template<
typename T1,
bool TF,
typename T2 >
2238 struct MultTrait< DynamicVector<T1,TF>, DynamicVector<T2,TF> >
2240 typedef DynamicVector< typename MultTrait<T1,T2>::Type, TF > Type;
2243 template<
typename T1,
typename T2 >
2244 struct MultTrait< DynamicVector<T1,false>, DynamicVector<T2,true> >
2246 typedef DynamicMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
2249 template<
typename T1,
typename T2 >
2250 struct MultTrait< DynamicVector<T1,true>, DynamicVector<T2,false> >
2252 typedef typename MultTrait<T1,T2>::Type Type;
2268 template<
typename T1,
typename T2 >
2269 struct CrossTrait< DynamicVector<T1,false>, StaticVector<T2,3UL,false> >
2272 typedef typename MultTrait<T1,T2>::Type T;
2275 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2278 template<
typename T1,
typename T2 >
2279 struct CrossTrait< StaticVector<T1,3UL,false>, DynamicVector<T2,false> >
2282 typedef typename MultTrait<T1,T2>::Type T;
2285 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2288 template<
typename T1,
typename T2 >
2289 struct CrossTrait< DynamicVector<T1,false>, DynamicVector<T2,false> >
2292 typedef typename MultTrait<T1,T2>::Type T;
2295 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2311 template<
typename T1,
bool TF,
typename T2 >
2312 struct DivTrait< DynamicVector<T1,TF>, T2 >
2314 typedef DynamicVector< typename DivTrait<T1,T2>::Type, TF > Type;
2331 template<
typename T1,
bool TF,
typename T2 >
2332 struct MathTrait< DynamicVector<T1,TF>, DynamicVector<T2,TF> >
2334 typedef DynamicVector< typename MathTrait<T1,T2>::HighType, TF > HighType;
2335 typedef DynamicVector< typename MathTrait<T1,T2>::LowType , TF > LowType;