22 #ifndef _BLAZE_MATH_SPARSE_COMPRESSEDVECTOR_H_
23 #define _BLAZE_MATH_SPARSE_COMPRESSEDVECTOR_H_
164 template<
typename Type
179 using ElementBase::operator=;
189 struct FindIndex :
public std::binary_function<Element,size_t,bool>
191 inline bool operator()(
const Element& element,
size_t index )
const {
192 return element.index() < index;
194 inline bool operator()(
size_t index,
const Element& element )
const {
195 return index < element.index();
197 inline bool operator()(
const Element& element1,
const Element& element2 )
const {
198 return element1.index() < element2.index();
261 template<
typename Other >
263 operator*=( Other rhs );
265 template<
typename Other >
267 operator/=( Other rhs );
274 inline size_t size()
const;
280 inline void erase (
size_t index );
284 inline void resize(
size_t n,
bool preserve=
true );
294 inline void append(
size_t index,
const Type& value,
bool check=
false );
301 template<
typename Other >
inline bool canAlias (
const Other* alias )
const;
302 template<
typename Other >
inline bool isAliased(
const Other* alias )
const;
353 template<
typename Type
369 template<
typename Type
385 template<
typename Type
402 template<
typename Type
406 , capacity_( nonzeros )
407 , begin_ ( new Element[capacity_] )
421 template<
typename Type
425 , capacity_( sv.nonZeros() )
426 , begin_ ( new Element[capacity_] )
427 , end_ ( begin_+capacity_ )
439 template<
typename Type
441 template<
typename VT >
443 : size_ ( (~dv).size() )
459 template<
typename Type
461 template<
typename VT >
463 : size_ ( (~sv).size() )
464 , capacity_( (~sv).nonZeros() )
465 , begin_ ( new Element[capacity_] )
485 template<
typename Type
513 template<
typename Type
531 template<
typename Type
538 const Iterator pos( std::lower_bound( begin_, end_, index, FindIndex() ) );
540 if( pos == end_ || pos->index_ != index )
553 template<
typename Type
567 template<
typename Type
581 template<
typename Type
595 template<
typename Type
609 template<
typename Type
623 template<
typename Type
649 template<
typename Type
654 if( &rhs ==
this )
return *
this;
656 const size_t nonzeros( rhs.
nonZeros() );
658 if( nonzeros > capacity_ ) {
659 Iterator newBegin(
new Element[nonzeros] );
660 end_ = std::copy( rhs.
begin_, rhs.
end_, newBegin );
665 capacity_ = nonzeros;
668 end_ = std::copy( rhs.
begin_, rhs.
end_, begin_ );
686 template<
typename Type
688 template<
typename VT >
694 if( (~rhs).canAlias(
this ) ) {
699 size_ = (~rhs).size();
718 template<
typename Type
720 template<
typename VT >
726 if( (~rhs).canAlias(
this ) || (~rhs).nonZeros() > capacity_ ) {
731 size_ = (~rhs).size();
751 template<
typename Type
753 template<
typename VT >
758 if( (~rhs).size() != size_ )
759 throw std::invalid_argument(
"Vector sizes do not match" );
778 template<
typename Type
780 template<
typename VT >
785 if( (~rhs).size() != size_ )
786 throw std::invalid_argument(
"Vector sizes do not match" );
806 template<
typename Type
808 template<
typename VT >
811 if( (~rhs).size() != size_ )
812 throw std::invalid_argument(
"Vector sizes do not match" );
833 template<
typename Type
835 template<
typename Other >
839 for(
Iterator element=begin_; element!=end_; ++element )
840 element->value_ *= rhs;
858 template<
typename Type
860 template<
typename Other >
872 const Tmp tmp( Tmp(1)/static_cast<Tmp>( rhs ) );
873 for(
Iterator element=begin_; element!=end_; ++element )
874 element->value_ *= tmp;
877 for(
Iterator element=begin_; element!=end_; ++element )
878 element->value_ /= rhs;
899 template<
typename Type
913 template<
typename Type
930 template<
typename Type
934 return end_ - begin_;
944 template<
typename Type
960 template<
typename Type
982 template<
typename Type
989 const Iterator pos( std::lower_bound( begin_, end_, index, FindIndex() ) );
991 if( pos != end_ && pos->index_ == index )
992 throw std::invalid_argument(
"Bad access index" );
994 if( nonZeros() != capacity_ ) {
995 std::copy_backward( pos, end_, end_+1 );
1003 size_t newCapacity( extendCapacity() );
1005 Iterator newBegin =
new Element[newCapacity];
1006 Iterator tmp = std::copy( begin_, pos, newBegin );
1007 tmp->value_ = value;
1008 tmp->index_ = index;
1009 end_ = std::copy( pos, end_, tmp+1 );
1013 capacity_ = newCapacity;
1029 template<
typename Type
1035 const Iterator pos( find( index ) );
1037 end_ = std::copy( pos+1, end_, pos );
1050 template<
typename Type
1054 BLAZE_USER_ASSERT( pos >= begin_ && pos <= end_,
"Invalid compressed vector iterator" );
1057 end_ = std::copy( pos+1, end_, pos );
1076 template<
typename Type
1080 return const_cast<Iterator>(
const_cast<const This&
>( *this ).
find( index ) );
1098 template<
typename Type
1102 const Iterator pos( std::lower_bound( begin_, end_, index, FindIndex() ) );
1103 if( pos != end_ && pos->index_ == index )
1122 template<
typename Type
1127 end_ = std::lower_bound( begin_, end_, n, FindIndex() );
1147 template<
typename Type
1151 if( n > capacity_ ) {
1152 const size_t newCapacity( n );
1155 Iterator newBegin =
new Element[newCapacity];
1158 end_ = std::copy( begin_, end_, newBegin );
1160 capacity_ = newCapacity;
1173 template<
typename Type
1175 template<
typename Other >
1178 for(
Iterator element=begin_; element!=end_; ++element )
1179 element->value_ *= scalar;
1192 template<
typename Type
1212 template<
typename Type
1219 size_t nonzeros( 2UL*capacity_+1UL );
1220 nonzeros =
max( nonzeros, 7UL );
1221 nonzeros =
min( nonzeros, size_ );
1262 template<
typename Type
1268 BLAZE_USER_ASSERT( begin_ == end_ || (end_-1UL)->index_ < index,
"Index is not strictly increasing" );
1270 end_->value_ = value;
1272 if( !check || !
isDefault( end_->value_ ) ) {
1273 end_->index_ = index;
1298 template<
typename Type
1300 template<
typename Other >
1303 return static_cast<const void*
>( this ) == static_cast<const void*>( alias );
1318 template<
typename Type
1320 template<
typename Other >
1323 return static_cast<const void*
>( this ) == static_cast<const void*>( alias );
1339 template<
typename Type
1341 template<
typename VT >
1346 size_t nonzeros( 0UL );
1348 for(
size_t i=0UL; i<size_; ++i )
1350 if( nonzeros == capacity_ )
1351 reserve( extendCapacity() );
1353 end_->value_ = (~rhs)[i];
1376 template<
typename Type
1378 template<
typename VT >
1389 for(
typename VT::ConstIterator element=(~rhs).begin(); element!=(~rhs).end(); ++element )
1390 append( element->index(), element->value() );
1406 template<
typename Type
1408 template<
typename VT >
1419 const AddType tmp( *
this + (~rhs) );
1437 template<
typename Type
1439 template<
typename VT >
1461 template<
typename Type
1463 template<
typename VT >
1474 const SubType tmp( *
this - (~rhs) );
1492 template<
typename Type
1494 template<
typename VT >
1516 template<
typename Type,
bool TF >
1519 template<
typename Type,
bool TF >
1522 template<
typename Type,
bool TF >
1525 template<
typename Type,
bool TF >
1528 template<
typename Type,
bool TF >
1541 template<
typename Type
1557 template<
typename Type
1583 template<
typename Type
1589 const ConstIterator end( v.
end() );
1590 for( ConstIterator element=v.
begin(); element!=end; ++element ) {
1591 if(
isnan( element->value() ) )
return true;
1617 template<
typename Type
1623 for( ConstIterator element=v.
begin(); element!=v.
end(); ++element )
1624 if( !
isDefault( element->value() ) )
return false;
1639 template<
typename Type
1658 template<
typename T,
bool TF >
1659 struct IsResizable< CompressedVector<T,TF> > :
public TrueType
1665 template<
typename T,
bool TF >
1666 struct IsResizable< const CompressedVector<T,TF> > :
public TrueType
1672 template<
typename T,
bool TF >
1673 struct IsResizable< volatile CompressedVector<T,TF> > :
public TrueType
1679 template<
typename T,
bool TF >
1680 struct IsResizable< const volatile CompressedVector<T,TF> > :
public TrueType
1699 template<
typename T1,
bool TF,
typename T2,
size_t N >
1700 struct AddTrait< CompressedVector<T1,TF>, StaticVector<T2,N,TF> >
1702 typedef StaticVector< typename AddTrait<T1,T2>::Type, N, TF > Type;
1705 template<
typename T1,
size_t N,
bool TF,
typename T2 >
1706 struct AddTrait< StaticVector<T1,N,TF>, CompressedVector<T2,TF> >
1708 typedef StaticVector< typename AddTrait<T1,T2>::Type, N, TF > Type;
1711 template<
typename T1,
bool TF,
typename T2 >
1712 struct AddTrait< CompressedVector<T1,TF>, DynamicVector<T2,TF> >
1714 typedef DynamicVector< typename AddTrait<T1,T2>::Type, TF > Type;
1717 template<
typename T1,
bool TF,
typename T2 >
1718 struct AddTrait< DynamicVector<T1,TF>, CompressedVector<T2,TF> >
1720 typedef DynamicVector< typename AddTrait<T1,T2>::Type, TF > Type;
1723 template<
typename T1,
bool TF,
typename T2 >
1724 struct AddTrait< CompressedVector<T1,TF>, CompressedVector<T2,TF> >
1726 typedef CompressedVector< typename AddTrait<T1,T2>::Type, TF > Type;
1742 template<
typename T1,
bool TF,
typename T2,
size_t N >
1743 struct SubTrait< CompressedVector<T1,TF>, StaticVector<T2,N,TF> >
1745 typedef StaticVector< typename SubTrait<T1,T2>::Type, N, TF > Type;
1748 template<
typename T1,
size_t N,
bool TF,
typename T2 >
1749 struct SubTrait< StaticVector<T1,N,TF>, CompressedVector<T2,TF> >
1751 typedef StaticVector< typename SubTrait<T1,T2>::Type, N, TF > Type;
1754 template<
typename T1,
bool TF,
typename T2 >
1755 struct SubTrait< CompressedVector<T1,TF>, DynamicVector<T2,TF> >
1757 typedef DynamicVector< typename SubTrait<T1,T2>::Type, TF > Type;
1760 template<
typename T1,
bool TF,
typename T2 >
1761 struct SubTrait< DynamicVector<T1,TF>, CompressedVector<T2,TF> >
1763 typedef DynamicVector< typename SubTrait<T1,T2>::Type, TF > Type;
1766 template<
typename T1,
bool TF,
typename T2 >
1767 struct SubTrait< CompressedVector<T1,TF>, CompressedVector<T2,TF> >
1769 typedef CompressedVector< typename SubTrait<T1,T2>::Type, TF > Type;
1785 template<
typename T1,
bool TF,
typename T2 >
1786 struct MultTrait< CompressedVector<T1,TF>, T2 >
1788 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1792 template<
typename T1,
typename T2,
bool TF >
1793 struct MultTrait< T1, CompressedVector<T2,TF> >
1795 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1799 template<
typename T1,
bool TF,
typename T2,
size_t N >
1800 struct MultTrait< CompressedVector<T1,TF>, StaticVector<T2,N,TF> >
1802 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1805 template<
typename T1,
typename T2,
size_t N >
1806 struct MultTrait< CompressedVector<T1,false>, StaticVector<T2,N,true> >
1808 typedef CompressedMatrix< typename MultTrait<T1,T2>::Type,
true > Type;
1811 template<
typename T1,
typename T2,
size_t N >
1812 struct MultTrait< CompressedVector<T1,true>, StaticVector<T2,N,false> >
1814 typedef typename MultTrait<T1,T2>::Type Type;
1817 template<
typename T1,
size_t N,
bool TF,
typename T2 >
1818 struct MultTrait< StaticVector<T1,N,TF>, CompressedVector<T2,TF> >
1820 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1823 template<
typename T1,
size_t N,
typename T2 >
1824 struct MultTrait< StaticVector<T1,N,false>, CompressedVector<T2,true> >
1826 typedef CompressedMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
1829 template<
typename T1,
size_t N,
typename T2 >
1830 struct MultTrait< StaticVector<T1,N,true>, CompressedVector<T2,false> >
1832 typedef typename MultTrait<T1,T2>::Type Type;
1835 template<
typename T1,
bool TF,
typename T2 >
1836 struct MultTrait< CompressedVector<T1,TF>, DynamicVector<T2,TF> >
1838 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1841 template<
typename T1,
typename T2 >
1842 struct MultTrait< CompressedVector<T1,false>, DynamicVector<T2,true> >
1844 typedef CompressedMatrix< typename MultTrait<T1,T2>::Type,
true > Type;
1847 template<
typename T1,
typename T2 >
1848 struct MultTrait< CompressedVector<T1,true>, DynamicVector<T2,false> >
1850 typedef typename MultTrait<T1,T2>::Type Type;
1853 template<
typename T1,
bool TF,
typename T2 >
1854 struct MultTrait< DynamicVector<T1,TF>, CompressedVector<T2,TF> >
1856 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1859 template<
typename T1,
typename T2 >
1860 struct MultTrait< DynamicVector<T1,false>, CompressedVector<T2,true> >
1862 typedef CompressedMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
1865 template<
typename T1,
typename T2 >
1866 struct MultTrait< DynamicVector<T1,true>, CompressedVector<T2,false> >
1868 typedef typename MultTrait<T1,T2>::Type Type;
1871 template<
typename T1,
bool TF,
typename T2 >
1872 struct MultTrait< CompressedVector<T1,TF>, CompressedVector<T2,TF> >
1874 typedef CompressedVector< typename MultTrait<T1,T2>::Type, TF > Type;
1877 template<
typename T1,
typename T2 >
1878 struct MultTrait< CompressedVector<T1,false>, CompressedVector<T2,true> >
1880 typedef CompressedMatrix< typename MultTrait<T1,T2>::Type,
false > Type;
1883 template<
typename T1,
typename T2 >
1884 struct MultTrait< CompressedVector<T1,true>, CompressedVector<T2,false> >
1886 typedef typename MultTrait<T1,T2>::Type Type;
1902 template<
typename T1,
typename T2 >
1903 struct CrossTrait< CompressedVector<T1,false>, StaticVector<T2,3UL,false> >
1906 typedef typename MultTrait<T1,T2>::Type T;
1909 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
1912 template<
typename T1,
typename T2 >
1913 struct CrossTrait< StaticVector<T1,3UL,false>, CompressedVector<T2,false> >
1916 typedef typename MultTrait<T1,T2>::Type T;
1919 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
1922 template<
typename T1,
typename T2 >
1923 struct CrossTrait< CompressedVector<T1,false>, DynamicVector<T2,false> >
1926 typedef typename MultTrait<T1,T2>::Type T;
1929 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
1932 template<
typename T1,
typename T2 >
1933 struct CrossTrait< DynamicVector<T1,false>, CompressedVector<T2,false> >
1936 typedef typename MultTrait<T1,T2>::Type T;
1939 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
1942 template<
typename T1,
typename T2 >
1943 struct CrossTrait< CompressedVector<T1,false>, CompressedVector<T2,false> >
1946 typedef typename MultTrait<T1,T2>::Type T;
1949 typedef StaticVector< typename SubTrait<T,T>::Type, 3UL,
false > Type;
1965 template<
typename T1,
bool TF,
typename T2 >
1966 struct DivTrait< CompressedVector<T1,TF>, T2 >
1968 typedef CompressedVector< typename DivTrait<T1,T2>::Type, TF > Type;
1985 template<
typename T1,
bool TF,
typename T2 >
1986 struct MathTrait< CompressedVector<T1,TF>, CompressedVector<T2,TF> >
1988 typedef CompressedVector< typename MathTrait<T1,T2>::HighType, TF > HighType;
1989 typedef CompressedVector< typename MathTrait<T1,T2>::LowType , TF > LowType;