22 #ifndef _BLAZE_MATH_SPARSE_COMPRESSEDVECTOR_H_
23 #define _BLAZE_MATH_SPARSE_COMPRESSEDVECTOR_H_
171 template<
typename Type
186 using ElementBase::operator=;
196 struct FindIndex :
public std::binary_function<Element,size_t,bool>
198 inline bool operator()(
const Element& element,
size_t index )
const {
199 return element.index() < index;
201 inline bool operator()(
size_t index,
const Element& element )
const {
202 return index < element.index();
204 inline bool operator()(
const Element& element1,
const Element& element2 )
const {
205 return element1.index() < element2.index();
234 enum { canAlias = 0 };
280 template<
typename Other >
284 template<
typename Other >
293 inline size_t size()
const;
298 void append(
size_t index,
const Type& value );
299 Type&
insert(
size_t index,
const Type& value );
302 inline void resize(
size_t n,
bool preserve=
true );
303 inline void reserve(
size_t n );
316 template<
typename Other >
inline bool isAliased(
const Other* alias )
const;
367 template<
typename Type
383 template<
typename Type
399 template<
typename Type
416 template<
typename Type
420 , capacity_( nonzeros )
421 , begin_ ( new Element[capacity_] )
435 template<
typename Type
439 , capacity_( sv.nonZeros() )
440 , begin_ ( new Element[capacity_] )
441 , end_ ( begin_+capacity_ )
453 template<
typename Type
455 template<
typename VT >
457 : size_ ( (~dv).size() )
473 template<
typename Type
475 template<
typename VT >
477 : size_ ( (~sv).size() )
478 , capacity_( (~sv).nonZeros() )
479 , begin_ ( new Element[capacity_] )
499 template<
typename Type
527 template<
typename Type
545 template<
typename Type
552 const Iterator pos( std::lower_bound( begin_, end_, index, FindIndex() ) );
554 if( pos == end_ || pos->index_ != index )
567 template<
typename Type
581 template<
typename Type
595 template<
typename Type
609 template<
typename Type
623 template<
typename Type
637 template<
typename Type
663 template<
typename Type
668 if( &rhs ==
this )
return *
this;
670 const size_t nonzeros( rhs.
nonZeros() );
672 if( nonzeros > capacity_ ) {
673 Iterator newBegin(
new Element[nonzeros] );
674 end_ = std::copy( rhs.
begin_, rhs.
end_, newBegin );
679 capacity_ = nonzeros;
682 end_ = std::copy( rhs.
begin_, rhs.
end_, begin_ );
700 template<
typename Type
702 template<
typename VT >
713 size_ = (~rhs).size();
732 template<
typename Type
734 template<
typename VT >
741 (~rhs).nonZeros() > capacity_ ) {
746 size_ = (~rhs).size();
766 template<
typename Type
768 template<
typename VT >
773 if( (~rhs).size() != size_ )
774 throw std::invalid_argument(
"Vector sizes do not match" );
793 template<
typename Type
795 template<
typename VT >
800 if( (~rhs).size() != size_ )
801 throw std::invalid_argument(
"Vector sizes do not match" );
821 template<
typename Type
823 template<
typename VT >
826 if( (~rhs).size() != size_ )
827 throw std::invalid_argument(
"Vector sizes do not match" );
848 template<
typename Type
850 template<
typename Other >
854 for(
Iterator element=begin_; element<end_; ++element )
855 element->value_ *= rhs;
873 template<
typename Type
875 template<
typename Other >
887 const Tmp tmp( Tmp(1)/static_cast<Tmp>( rhs ) );
888 for(
Iterator element=begin_; element!=end_; ++element )
889 element->value_ *= tmp;
892 for(
Iterator element=begin_; element!=end_; ++element )
893 element->value_ /= rhs;
914 template<
typename Type
928 template<
typename Type
945 template<
typename Type
949 return end_ - begin_;
959 template<
typename Type
975 template<
typename Type
1006 template<
typename Type
1012 BLAZE_USER_ASSERT( begin_ == end_ || (end_-1UL)->index_ < index,
"Index is not strictly increasing" );
1014 end_->value_ = value;
1015 end_->index_ = index;
1033 template<
typename Type
1039 const Iterator pos( std::lower_bound( begin_, end_, index, FindIndex() ) );
1041 if( pos != end_ && pos->index_ == index )
1042 throw std::invalid_argument(
"Bad access index" );
1044 if( nonZeros() != capacity_ ) {
1045 std::copy_backward( pos, end_, end_+1 );
1046 pos->value_ = value;
1047 pos->index_ = index;
1053 size_t newCapacity( extendCapacity() );
1055 Iterator newBegin =
new Element[newCapacity];
1056 Iterator tmp = std::copy( begin_, pos, newBegin );
1057 tmp->value_ = value;
1058 tmp->index_ = index;
1059 end_ = std::copy( pos, end_, tmp+1 );
1063 capacity_ = newCapacity;
1084 template<
typename Type
1088 return const_cast<Iterator>(
const_cast<const This&
>( *this ).
find( index ) );
1106 template<
typename Type
1110 const Iterator pos( std::lower_bound( begin_, end_, index, FindIndex() ) );
1111 if( pos != end_ && pos->index_ == index )
1130 template<
typename Type
1135 end_ = std::lower_bound( begin_, end_, n, FindIndex() );
1155 template<
typename Type
1159 if( n > capacity_ ) {
1160 const size_t newCapacity( n );
1163 Iterator newBegin =
new Element[newCapacity];
1166 end_ = std::copy( begin_, end_, newBegin );
1168 capacity_ = newCapacity;
1205 template<
typename Type
1216 for(
Iterator element=begin_; element!=end_; ++element )
1217 sum += element->value_ * element->value_;
1218 return std::sqrt( sum );
1233 template<
typename Type
1240 for(
Iterator element=begin_; element!=end_; ++element )
1241 sum += element->value_ * element->value_;
1256 template<
typename Type
1262 const Type len( length() );
1264 if( len == Type(0) )
1267 const Type ilen( Type(1) / len );
1269 for(
Iterator element=begin_; element!=end_; ++element )
1270 element->value_ *= ilen;
1286 template<
typename Type
1292 const Type len( length() );
1294 if( len == Type(0) )
1297 const Type ilen( Type(1) / len );
1301 element->value_ *= ilen;
1315 template<
typename Type
1317 template<
typename Other >
1320 for(
Iterator element=begin_; element!=end_; ++element )
1321 element->value_ *= scalar;
1334 template<
typename Type
1354 template<
typename Type
1361 size_t nonzeros( 2UL*capacity_+1UL );
1362 nonzeros =
max( nonzeros, 7UL );
1363 nonzeros =
min( nonzeros, size_ );
1386 template<
typename Type
1388 template<
typename Other >
1391 return static_cast<const void*
>( this ) == static_cast<const void*>( alias );
1407 template<
typename Type
1409 template<
typename VT >
1414 size_t nonzeros( 0UL );
1416 for(
size_t i=0UL; i<size_; ++i )
1418 if( nonzeros == capacity_ )
1419 reserve( extendCapacity() );
1421 end_->value_ = (~rhs)[i];
1444 template<
typename Type
1446 template<
typename VT >
1457 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1458 append( element->index(), element->value() );
1474 template<
typename Type
1476 template<
typename VT >
1487 AddType tmp( *
this + (~rhs) );
1505 template<
typename Type
1507 template<
typename VT >
1529 template<
typename Type
1531 template<
typename VT >
1542 SubType tmp( *
this - (~rhs) );
1560 template<
typename Type
1562 template<
typename VT >
1584 template<
typename Type,
bool TF >
1587 template<
typename Type,
bool TF >
1590 template<
typename Type,
bool TF >
1593 template<
typename Type,
bool TF >
1596 template<
typename Type,
bool TF >
1609 template<
typename Type
1625 template<
typename Type
1651 template<
typename Type
1657 const ConstIterator end( v.
end() );
1658 for( ConstIterator element=v.
begin(); element!=end; ++element ) {
1659 if(
isnan( element->value() ) )
return true;
1685 template<
typename Type
1691 for( ConstIterator element=v.
begin(); element!=v.
end(); ++element )
1692 if( !
isDefault( element->value() ) )
return false;
1707 template<
typename Type
1726 template<
typename T,
bool TF >
1727 struct IsResizable< CompressedVector<T,TF> > :
public TrueType
1733 template<
typename T,
bool TF >
1734 struct IsResizable< const CompressedVector<T,TF> > :
public TrueType
1740 template<
typename T,
bool TF >
1741 struct IsResizable< volatile CompressedVector<T,TF> > :
public TrueType
1747 template<
typename T,
bool TF >
1748 struct IsResizable< const volatile CompressedVector<T,TF> > :
public TrueType
1767 template<
typename T1,
bool TF,
typename T2,
size_t N >
1768 struct AddTrait< CompressedVector<T1,TF>, StaticVector<T2,N,TF> >
1770 typedef StaticVector< typename AddTrait<T1,T2>::Type, N, TF > Type;
1773 template<
typename T1,
size_t N,
bool TF,
typename T2 >
1774 struct AddTrait< StaticVector<T1,N,TF>, CompressedVector<T2,TF> >
1776 typedef StaticVector< typename AddTrait<T1,T2>::Type, N, TF > Type;
1779 template<
typename T1,
bool TF,
typename T2 >
1780 struct AddTrait< CompressedVector<T1,TF>, DynamicVector<T2,TF> >
1782 typedef DynamicVector< typename AddTrait<T1,T2>::Type, TF > Type;
1785 template<
typename T1,
bool TF,
typename T2 >
1786 struct AddTrait< DynamicVector<T1,TF>, CompressedVector<T2,TF> >
1788 typedef DynamicVector< typename AddTrait<T1,T2>::Type, TF > Type;
1791 template<
typename T1,
bool TF,
typename T2 >
1792 struct AddTrait< CompressedVector<T1,TF>, CompressedVector<T2,TF> >
1794 typedef CompressedVector< typename AddTrait<T1,T2>::Type, TF > Type;
1810 template<
typename T1,
bool TF,
typename T2,
size_t N >
1811 struct SubTrait< CompressedVector<T1,TF>, StaticVector<T2,N,TF> >
1813 typedef StaticVector< typename SubTrait<T1,T2>::Type, N, TF > Type;
1816 template<
typename T1,
size_t N,
bool TF,
typename T2 >
1817 struct SubTrait< StaticVector<T1,N,TF>, CompressedVector<T2,TF> >
1819 typedef StaticVector< typename SubTrait<T1,T2>::Type, N, TF > Type;
1822 template<
typename T1,
bool TF,
typename T2 >
1823 struct SubTrait< CompressedVector<T1,TF>, DynamicVector<T2,TF> >
1825 typedef DynamicVector< typename SubTrait<T1,T2>::Type, TF > Type;
1828 template<
typename T1,
bool TF,
typename T2 >
1829 struct SubTrait< DynamicVector<T1,TF>, CompressedVector<T2,TF> >
1831 typedef DynamicVector< typename SubTrait<T1,T2>::Type, TF > Type;
1834 template<
typename T1,
bool TF,
typename T2 >
1835 struct SubTrait< CompressedVector<T1,TF>, CompressedVector<T2,TF> >
1837 typedef CompressedVector< typename SubTrait<T1,T2>::Type, TF > Type;
1853 template<
typename T1,
bool TF,
typename T2 >
1854 struct MultTrait< CompressedVector<T1,TF>, T2 >
1856 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1860 template<
typename T1,
typename T2,
bool TF >
1861 struct MultTrait< T1, CompressedVector<T2,TF> >
1863 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1867 template<
typename T1,
bool TF,
typename T2,
size_t N >
1868 struct MultTrait< CompressedVector<T1,TF>, StaticVector<T2,N,TF> >
1870 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1873 template<
typename T1,
typename T2,
size_t N >
1874 struct MultTrait< CompressedVector<T1,false>, StaticVector<T2,N,true> >
1876 typedef CompressedMatrix< typename MultTrait<T1,T2>::Type,
true > Type;
1879 template<
typename T1,
typename T2,
size_t N >
1880 struct MultTrait< CompressedVector<T1,true>, StaticVector<T2,N,false> >
1882 typedef typename MultTrait<T1,T2>::Type Type;
1885 template<
typename T1,
size_t N,
bool TF,
typename T2 >
1886 struct MultTrait< StaticVector<T1,N,TF>, CompressedVector<T2,TF> >
1888 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1891 template<
typename T1,
size_t N,
typename T2 >
1892 struct MultTrait< StaticVector<T1,N,false>, CompressedVector<T2,true> >
1894 typedef CompressedMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
1897 template<
typename T1,
size_t N,
typename T2 >
1898 struct MultTrait< StaticVector<T1,N,true>, CompressedVector<T2,false> >
1900 typedef typename MultTrait<T1,T2>::Type Type;
1903 template<
typename T1,
bool TF,
typename T2 >
1904 struct MultTrait< CompressedVector<T1,TF>, DynamicVector<T2,TF> >
1906 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1909 template<
typename T1,
typename T2 >
1910 struct MultTrait< CompressedVector<T1,false>, DynamicVector<T2,true> >
1912 typedef CompressedMatrix< typename MultTrait<T1,T2>::Type,
true > Type;
1915 template<
typename T1,
typename T2 >
1916 struct MultTrait< CompressedVector<T1,true>, DynamicVector<T2,false> >
1918 typedef typename MultTrait<T1,T2>::Type Type;
1921 template<
typename T1,
bool TF,
typename T2 >
1922 struct MultTrait< DynamicVector<T1,TF>, CompressedVector<T2,TF> >
1924 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1927 template<
typename T1,
typename T2 >
1928 struct MultTrait< DynamicVector<T1,false>, CompressedVector<T2,true> >
1930 typedef CompressedMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
1933 template<
typename T1,
typename T2 >
1934 struct MultTrait< DynamicVector<T1,true>, CompressedVector<T2,false> >
1936 typedef typename MultTrait<T1,T2>::Type Type;
1939 template<
typename T1,
bool TF,
typename T2 >
1940 struct MultTrait< CompressedVector<T1,TF>, CompressedVector<T2,TF> >
1942 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1945 template<
typename T1,
typename T2 >
1946 struct MultTrait< CompressedVector<T1,false>, CompressedVector<T2,true> >
1948 typedef CompressedMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
1951 template<
typename T1,
typename T2 >
1952 struct MultTrait< CompressedVector<T1,true>, CompressedVector<T2,false> >
1954 typedef typename MultTrait<T1,T2>::Type Type;
1970 template<
typename T1,
typename T2 >
1971 struct CrossTrait< CompressedVector<T1,false>, StaticVector<T2,3UL,false> >
1974 typedef typename MultTrait<T1,T2>::Type T;
1977 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
1980 template<
typename T1,
typename T2 >
1981 struct CrossTrait< StaticVector<T1,3UL,false>, CompressedVector<T2,false> >
1984 typedef typename MultTrait<T1,T2>::Type T;
1987 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
1990 template<
typename T1,
typename T2 >
1991 struct CrossTrait< CompressedVector<T1,false>, DynamicVector<T2,false> >
1994 typedef typename MultTrait<T1,T2>::Type T;
1997 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2000 template<
typename T1,
typename T2 >
2001 struct CrossTrait< DynamicVector<T1,false>, CompressedVector<T2,false> >
2004 typedef typename MultTrait<T1,T2>::Type T;
2007 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2010 template<
typename T1,
typename T2 >
2011 struct CrossTrait< CompressedVector<T1,false>, CompressedVector<T2,false> >
2014 typedef typename MultTrait<T1,T2>::Type T;
2017 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
2033 template<
typename T1,
bool TF,
typename T2 >
2034 struct DivTrait< CompressedVector<T1,TF>, T2 >
2036 typedef CompressedVector< typename DivTrait<T1,T2>::Type, TF > Type;
2053 template<
typename T1,
bool TF,
typename T2 >
2054 struct MathTrait< CompressedVector<T1,TF>, CompressedVector<T2,TF> >
2056 typedef CompressedVector< typename MathTrait<T1,T2>::HighType, TF > HighType;
2057 typedef CompressedVector< typename MathTrait<T1,T2>::LowType , TF > LowType;