22 #ifndef _BLAZE_MATH_SPARSE_COMPRESSEDVECTOR_H_
23 #define _BLAZE_MATH_SPARSE_COMPRESSEDVECTOR_H_
168 template<
typename Type
183 using ElementBase::operator=;
193 struct FindIndex :
public std::binary_function<Element,size_t,bool>
195 inline bool operator()(
const Element& element,
size_t index )
const {
196 return element.index() < index;
198 inline bool operator()(
size_t index,
const Element& element )
const {
199 return index < element.index();
201 inline bool operator()(
const Element& element1,
const Element& element2 )
const {
202 return element1.index() < element2.index();
269 template<
typename Other >
271 operator*=( Other rhs );
273 template<
typename Other >
275 operator/=( Other rhs );
282 inline size_t size()
const;
288 inline void erase (
size_t index );
292 inline void resize(
size_t n,
bool preserve=
true );
306 inline void append(
size_t index,
const Type& value,
bool check=
false );
313 template<
typename Other >
inline bool canAlias (
const Other* alias )
const;
314 template<
typename Other >
inline bool isAliased(
const Other* alias )
const;
365 template<
typename Type
381 template<
typename Type
397 template<
typename Type
414 template<
typename Type
418 , capacity_( nonzeros )
419 , begin_ ( new Element[capacity_] )
433 template<
typename Type
437 , capacity_( sv.nonZeros() )
438 , begin_ ( new Element[capacity_] )
439 , end_ ( begin_+capacity_ )
451 template<
typename Type
453 template<
typename VT >
455 : size_ ( (~dv).size() )
471 template<
typename Type
473 template<
typename VT >
475 : size_ ( (~sv).size() )
476 , capacity_( (~sv).nonZeros() )
477 , begin_ ( new Element[capacity_] )
497 template<
typename Type
525 template<
typename Type
543 template<
typename Type
550 const Iterator pos( std::lower_bound( begin_, end_, index, FindIndex() ) );
552 if( pos == end_ || pos->index_ != index )
565 template<
typename Type
579 template<
typename Type
593 template<
typename Type
607 template<
typename Type
621 template<
typename Type
635 template<
typename Type
661 template<
typename Type
666 if( &rhs ==
this )
return *
this;
668 const size_t nonzeros( rhs.
nonZeros() );
670 if( nonzeros > capacity_ ) {
671 Iterator newBegin(
new Element[nonzeros] );
672 end_ = std::copy( rhs.
begin_, rhs.
end_, newBegin );
677 capacity_ = nonzeros;
680 end_ = std::copy( rhs.
begin_, rhs.
end_, begin_ );
698 template<
typename Type
700 template<
typename VT >
706 if( (~rhs).canAlias(
this ) ) {
711 size_ = (~rhs).size();
730 template<
typename Type
732 template<
typename VT >
738 if( (~rhs).canAlias(
this ) || (~rhs).nonZeros() > capacity_ ) {
743 size_ = (~rhs).size();
763 template<
typename Type
765 template<
typename VT >
770 if( (~rhs).size() != size_ )
771 throw std::invalid_argument(
"Vector sizes do not match" );
790 template<
typename Type
792 template<
typename VT >
797 if( (~rhs).size() != size_ )
798 throw std::invalid_argument(
"Vector sizes do not match" );
818 template<
typename Type
820 template<
typename VT >
823 if( (~rhs).size() != size_ )
824 throw std::invalid_argument(
"Vector sizes do not match" );
845 template<
typename Type
847 template<
typename Other >
851 for(
Iterator element=begin_; element!=end_; ++element )
852 element->value_ *= rhs;
870 template<
typename Type
872 template<
typename Other >
884 const Tmp tmp( Tmp(1)/static_cast<Tmp>( rhs ) );
885 for(
Iterator element=begin_; element!=end_; ++element )
886 element->value_ *= tmp;
889 for(
Iterator element=begin_; element!=end_; ++element )
890 element->value_ /= rhs;
911 template<
typename Type
925 template<
typename Type
942 template<
typename Type
946 return end_ - begin_;
956 template<
typename Type
972 template<
typename Type
994 template<
typename Type
1001 const Iterator pos( std::lower_bound( begin_, end_, index, FindIndex() ) );
1003 if( pos != end_ && pos->index_ == index )
1004 throw std::invalid_argument(
"Bad access index" );
1006 if( nonZeros() != capacity_ ) {
1007 std::copy_backward( pos, end_, end_+1 );
1008 pos->value_ = value;
1009 pos->index_ = index;
1015 size_t newCapacity( extendCapacity() );
1017 Iterator newBegin =
new Element[newCapacity];
1018 Iterator tmp = std::copy( begin_, pos, newBegin );
1019 tmp->value_ = value;
1020 tmp->index_ = index;
1021 end_ = std::copy( pos, end_, tmp+1 );
1025 capacity_ = newCapacity;
1041 template<
typename Type
1047 const Iterator pos( find( index ) );
1049 end_ = std::copy( pos+1, end_, pos );
1062 template<
typename Type
1066 BLAZE_USER_ASSERT( pos >= begin_ && pos <= end_,
"Invalid compressed vector iterator" );
1069 end_ = std::copy( pos+1, end_, pos );
1088 template<
typename Type
1092 return const_cast<Iterator>(
const_cast<const This&
>( *this ).
find( index ) );
1110 template<
typename Type
1114 const Iterator pos( std::lower_bound( begin_, end_, index, FindIndex() ) );
1115 if( pos != end_ && pos->index_ == index )
1134 template<
typename Type
1139 end_ = std::lower_bound( begin_, end_, n, FindIndex() );
1159 template<
typename Type
1163 if( n > capacity_ ) {
1164 const size_t newCapacity( n );
1167 Iterator newBegin =
new Element[newCapacity];
1170 end_ = std::copy( begin_, end_, newBegin );
1172 capacity_ = newCapacity;
1209 template<
typename Type
1220 for(
Iterator element=begin_; element!=end_; ++element )
1221 sum += element->value_ * element->value_;
1222 return std::sqrt( sum );
1237 template<
typename Type
1244 for(
Iterator element=begin_; element!=end_; ++element )
1245 sum += element->value_ * element->value_;
1260 template<
typename Type
1266 const Type len( length() );
1268 if( len == Type(0) )
1271 const Type ilen( Type(1) / len );
1273 for(
Iterator element=begin_; element!=end_; ++element )
1274 element->value_ *= ilen;
1290 template<
typename Type
1296 const Type len( length() );
1298 if( len == Type(0) )
1301 const Type ilen( Type(1) / len );
1305 element->value_ *= ilen;
1319 template<
typename Type
1321 template<
typename Other >
1324 for(
Iterator element=begin_; element!=end_; ++element )
1325 element->value_ *= scalar;
1338 template<
typename Type
1358 template<
typename Type
1365 size_t nonzeros( 2UL*capacity_+1UL );
1366 nonzeros =
max( nonzeros, 7UL );
1367 nonzeros =
min( nonzeros, size_ );
1408 template<
typename Type
1414 BLAZE_USER_ASSERT( begin_ == end_ || (end_-1UL)->index_ < index,
"Index is not strictly increasing" );
1416 end_->value_ = value;
1418 if( !check || !
isDefault( end_->value_ ) ) {
1419 end_->index_ = index;
1444 template<
typename Type
1446 template<
typename Other >
1449 return static_cast<const void*
>( this ) == static_cast<const void*>( alias );
1464 template<
typename Type
1466 template<
typename Other >
1469 return static_cast<const void*
>( this ) == static_cast<const void*>( alias );
1485 template<
typename Type
1487 template<
typename VT >
1492 size_t nonzeros( 0UL );
1494 for(
size_t i=0UL; i<size_; ++i )
1496 if( nonzeros == capacity_ )
1497 reserve( extendCapacity() );
1499 end_->value_ = (~rhs)[i];
1522 template<
typename Type
1524 template<
typename VT >
1535 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1536 append( element->index(), element->value() );
1552 template<
typename Type
1554 template<
typename VT >
1565 const AddType tmp( *
this + (~rhs) );
1583 template<
typename Type
1585 template<
typename VT >
1607 template<
typename Type
1609 template<
typename VT >
1620 const SubType tmp( *
this - (~rhs) );
1638 template<
typename Type
1640 template<
typename VT >
1662 template<
typename Type,
bool TF >
1665 template<
typename Type,
bool TF >
1668 template<
typename Type,
bool TF >
1671 template<
typename Type,
bool TF >
1674 template<
typename Type,
bool TF >
1687 template<
typename Type
1703 template<
typename Type
1729 template<
typename Type
1735 const ConstIterator end( v.
end() );
1736 for( ConstIterator element=v.
begin(); element!=end; ++element ) {
1737 if(
isnan( element->value() ) )
return true;
1763 template<
typename Type
1769 for( ConstIterator element=v.
begin(); element!=v.
end(); ++element )
1770 if( !
isDefault( element->value() ) )
return false;
1785 template<
typename Type
1804 template<
typename T,
bool TF >
1805 struct IsResizable< CompressedVector<T,TF> > :
public TrueType
1811 template<
typename T,
bool TF >
1812 struct IsResizable< const CompressedVector<T,TF> > :
public TrueType
1818 template<
typename T,
bool TF >
1819 struct IsResizable< volatile CompressedVector<T,TF> > :
public TrueType
1825 template<
typename T,
bool TF >
1826 struct IsResizable< const volatile CompressedVector<T,TF> > :
public TrueType
1845 template<
typename T1,
bool TF,
typename T2,
size_t N >
1846 struct AddTrait< CompressedVector<T1,TF>, StaticVector<T2,N,TF> >
1848 typedef StaticVector< typename AddTrait<T1,T2>::Type, N, TF > Type;
1851 template<
typename T1,
size_t N,
bool TF,
typename T2 >
1852 struct AddTrait< StaticVector<T1,N,TF>, CompressedVector<T2,TF> >
1854 typedef StaticVector< typename AddTrait<T1,T2>::Type, N, TF > Type;
1857 template<
typename T1,
bool TF,
typename T2 >
1858 struct AddTrait< CompressedVector<T1,TF>, DynamicVector<T2,TF> >
1860 typedef DynamicVector< typename AddTrait<T1,T2>::Type, TF > Type;
1863 template<
typename T1,
bool TF,
typename T2 >
1864 struct AddTrait< DynamicVector<T1,TF>, CompressedVector<T2,TF> >
1866 typedef DynamicVector< typename AddTrait<T1,T2>::Type, TF > Type;
1869 template<
typename T1,
bool TF,
typename T2 >
1870 struct AddTrait< CompressedVector<T1,TF>, CompressedVector<T2,TF> >
1872 typedef CompressedVector< typename AddTrait<T1,T2>::Type, TF > Type;
1888 template<
typename T1,
bool TF,
typename T2,
size_t N >
1889 struct SubTrait< CompressedVector<T1,TF>, StaticVector<T2,N,TF> >
1891 typedef StaticVector< typename SubTrait<T1,T2>::Type, N, TF > Type;
1894 template<
typename T1,
size_t N,
bool TF,
typename T2 >
1895 struct SubTrait< StaticVector<T1,N,TF>, CompressedVector<T2,TF> >
1897 typedef StaticVector< typename SubTrait<T1,T2>::Type, N, TF > Type;
1900 template<
typename T1,
bool TF,
typename T2 >
1901 struct SubTrait< CompressedVector<T1,TF>, DynamicVector<T2,TF> >
1903 typedef DynamicVector< typename SubTrait<T1,T2>::Type, TF > Type;
1906 template<
typename T1,
bool TF,
typename T2 >
1907 struct SubTrait< DynamicVector<T1,TF>, CompressedVector<T2,TF> >
1909 typedef DynamicVector< typename SubTrait<T1,T2>::Type, TF > Type;
1912 template<
typename T1,
bool TF,
typename T2 >
1913 struct SubTrait< CompressedVector<T1,TF>, CompressedVector<T2,TF> >
1915 typedef CompressedVector< typename SubTrait<T1,T2>::Type, TF > Type;
1931 template<
typename T1,
bool TF,
typename T2 >
1932 struct MultTrait< CompressedVector<T1,TF>, T2 >
1934 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1938 template<
typename T1,
typename T2,
bool TF >
1939 struct MultTrait< T1, CompressedVector<T2,TF> >
1941 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1945 template<
typename T1,
bool TF,
typename T2,
size_t N >
1946 struct MultTrait< CompressedVector<T1,TF>, StaticVector<T2,N,TF> >
1948 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1951 template<
typename T1,
typename T2,
size_t N >
1952 struct MultTrait< CompressedVector<T1,false>, StaticVector<T2,N,true> >
1954 typedef CompressedMatrix< typename MultTrait<T1,T2>::Type,
true > Type;
1957 template<
typename T1,
typename T2,
size_t N >
1958 struct MultTrait< CompressedVector<T1,true>, StaticVector<T2,N,false> >
1960 typedef typename MultTrait<T1,T2>::Type Type;
1963 template<
typename T1,
size_t N,
bool TF,
typename T2 >
1964 struct MultTrait< StaticVector<T1,N,TF>, CompressedVector<T2,TF> >
1966 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1969 template<
typename T1,
size_t N,
typename T2 >
1970 struct MultTrait< StaticVector<T1,N,false>, CompressedVector<T2,true> >
1972 typedef CompressedMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
1975 template<
typename T1,
size_t N,
typename T2 >
1976 struct MultTrait< StaticVector<T1,N,true>, CompressedVector<T2,false> >
1978 typedef typename MultTrait<T1,T2>::Type Type;
1981 template<
typename T1,
bool TF,
typename T2 >
1982 struct MultTrait< CompressedVector<T1,TF>, DynamicVector<T2,TF> >
1984 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1987 template<
typename T1,
typename T2 >
1988 struct MultTrait< CompressedVector<T1,false>, DynamicVector<T2,true> >
1990 typedef CompressedMatrix< typename MultTrait<T1,T2>::Type,
true > Type;
1993 template<
typename T1,
typename T2 >
1994 struct MultTrait< CompressedVector<T1,true>, DynamicVector<T2,false> >
1996 typedef typename MultTrait<T1,T2>::Type Type;
1999 template<
typename T1,
bool TF,
typename T2 >
2000 struct MultTrait< DynamicVector<T1,TF>, CompressedVector<T2,TF> >
2002 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
2005 template<
typename T1,
typename T2 >
2006 struct MultTrait< DynamicVector<T1,false>, CompressedVector<T2,true> >
2008 typedef CompressedMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
2011 template<
typename T1,
typename T2 >
2012 struct MultTrait< DynamicVector<T1,true>, CompressedVector<T2,false> >
2014 typedef typename MultTrait<T1,T2>::Type Type;
2017 template<
typename T1,
bool TF,
typename T2 >
2018 struct MultTrait< CompressedVector<T1,TF>, CompressedVector<T2,TF> >
2020 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
2023 template<
typename T1,
typename T2 >
2024 struct MultTrait< CompressedVector<T1,false>, CompressedVector<T2,true> >
2026 typedef CompressedMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
2029 template<
typename T1,
typename T2 >
2030 struct MultTrait< CompressedVector<T1,true>, CompressedVector<T2,false> >
2032 typedef typename MultTrait<T1,T2>::Type Type;
2048 template<
typename T1,
typename T2 >
2049 struct CrossTrait< CompressedVector<T1,false>, StaticVector<T2,3UL,false> >
2052 typedef typename MultTrait<T1,T2>::Type T;
2055 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2058 template<
typename T1,
typename T2 >
2059 struct CrossTrait< StaticVector<T1,3UL,false>, CompressedVector<T2,false> >
2062 typedef typename MultTrait<T1,T2>::Type T;
2065 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2068 template<
typename T1,
typename T2 >
2069 struct CrossTrait< CompressedVector<T1,false>, DynamicVector<T2,false> >
2072 typedef typename MultTrait<T1,T2>::Type T;
2075 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2078 template<
typename T1,
typename T2 >
2079 struct CrossTrait< DynamicVector<T1,false>, CompressedVector<T2,false> >
2082 typedef typename MultTrait<T1,T2>::Type T;
2085 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2088 template<
typename T1,
typename T2 >
2089 struct CrossTrait< CompressedVector<T1,false>, CompressedVector<T2,false> >
2092 typedef typename MultTrait<T1,T2>::Type T;
2095 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2111 template<
typename T1,
bool TF,
typename T2 >
2112 struct DivTrait< CompressedVector<T1,TF>, T2 >
2114 typedef CompressedVector< typename DivTrait<T1,T2>::Type, TF > Type;
2131 template<
typename T1,
bool TF,
typename T2 >
2132 struct MathTrait< CompressedVector<T1,TF>, CompressedVector<T2,TF> >
2134 typedef CompressedVector< typename MathTrait<T1,T2>::HighType, TF > HighType;
2135 typedef CompressedVector< typename MathTrait<T1,T2>::LowType , TF > LowType;