From e43811ccf69638afa5c87cfd13dec0f705b63845 Mon Sep 17 00:00:00 2001 From: Michael Stevens Date: Tue, 21 Sep 2004 08:17:17 +0000 Subject: [PATCH] Resize infrastructure WARNING Function parameter order changed svn path=/trunk/boost/boost/numeric/ublas/; revision=25293 --- include/boost/numeric/ublas/matrix_sparse.hpp | 65 +++++------ include/boost/numeric/ublas/vector_sparse.hpp | 106 +++++++++--------- 2 files changed, 86 insertions(+), 85 deletions(-) diff --git a/include/boost/numeric/ublas/matrix_sparse.hpp b/include/boost/numeric/ublas/matrix_sparse.hpp index 6970cd10..efa48e2b 100644 --- a/include/boost/numeric/ublas/matrix_sparse.hpp +++ b/include/boost/numeric/ublas/matrix_sparse.hpp @@ -264,23 +264,23 @@ namespace boost { namespace numeric { namespace ublas { BOOST_UBLAS_INLINE sparse_matrix (): matrix_expression (), - size1_ (0), size2_ (0), non_zeros_ (0), data_ () {} + size1_ (0), size2_ (0), data_ () {} BOOST_UBLAS_INLINE sparse_matrix (size_type size1, size_type size2, size_type non_zeros = 0): matrix_expression (), - size1_ (size1), size2_ (size2), non_zeros_ (max_nz (non_zeros)), data_ () { - detail::map_reserve (data (), non_zeros_); + size1_ (size1), size2_ (size2), data_ () { + detail::map_reserve (data (), max_nz (non_zeros)); } BOOST_UBLAS_INLINE sparse_matrix (const sparse_matrix &m): matrix_expression (), - size1_ (m.size1_), size2_ (m.size2_), non_zeros_ (m.non_zeros_), data_ (m.data_) {} + size1_ (m.size1_), size2_ (m.size2_), data_ (m.data_) {} template BOOST_UBLAS_INLINE sparse_matrix (const matrix_expression &ae, size_type non_zeros = 0): matrix_expression (), - size1_ (ae ().size1 ()), size2_ (ae ().size2 ()), non_zeros_ (max_nz (non_zeros)), data_ () { - detail::map_reserve (data (), non_zeros_); + size1_ (ae ().size1 ()), size2_ (ae ().size2 ()), data_ () { + detail::map_reserve (data (), max_nz (non_zeros)); matrix_assign (scalar_assign (), *this, ae); } @@ -320,21 +320,18 @@ namespace boost { namespace numeric { namespace ublas { } public: BOOST_UBLAS_INLINE - void resize (size_type size1, size_type size2, size_type non_zeros = 0, bool preserve = true) { + void resize (size_type size1, size_type size2, bool preserve = true) { // FIXME preserve unimplemented BOOST_UBLAS_CHECK (!preserve, internal_logic ()); size1_ = size1; size2_ = size2; - non_zeros_ = max_nz (non_zeros); data ().clear (); - detail::map_reserve (data (), non_zeros_); } // Reserving BOOST_UBLAS_INLINE - void reserve (size_type non_zeros = 0, bool preserve = true) { - non_zeros_ = max_nz (non_zeros); - detail::map_reserve (data (), non_zeros_); + void reserve (size_type non_zeros, bool preserve = true) { + detail::map_reserve (data (), max_nz (non_zeros)); } // Proxy support @@ -379,7 +376,6 @@ namespace boost { namespace numeric { namespace ublas { if (this != &m) { size1_ = m.size1_; size2_ = m.size2_; - non_zeros_ = m.non_zeros_; data () = m.data (); } return *this; @@ -392,8 +388,7 @@ namespace boost { namespace numeric { namespace ublas { template BOOST_UBLAS_INLINE sparse_matrix &operator = (const matrix_expression &ae) { - // return assign (self_type (ae, non_zeros_)); - self_type temporary (ae, non_zeros_); + self_type temporary (ae, detail::map_capacity (data ())); return assign_temporary (temporary); } template @@ -405,8 +400,7 @@ namespace boost { namespace numeric { namespace ublas { template BOOST_UBLAS_INLINE sparse_matrix& operator += (const matrix_expression &ae) { - // return assign (self_type (*this + ae, non_zeros_)); - self_type temporary (*this + ae, non_zeros_); + self_type temporary (*this + ae, detail::map_capacity (data ())); return assign_temporary (temporary); } template @@ -418,8 +412,7 @@ namespace boost { namespace numeric { namespace ublas { template BOOST_UBLAS_INLINE sparse_matrix& operator -= (const matrix_expression &ae) { - // return assign (self_type (*this - ae, non_zeros_)); - self_type temporary (*this - ae, non_zeros_); + self_type temporary (*this - ae, detail::map_capacity (data ())); return assign_temporary (temporary); } template @@ -447,7 +440,6 @@ namespace boost { namespace numeric { namespace ublas { if (this != &m) { std::swap (size1_, m.size1_); std::swap (size2_, m.size2_); - std::swap (non_zeros_, m.non_zeros_); data ().swap (m.data ()); } } @@ -1274,7 +1266,6 @@ namespace boost { namespace numeric { namespace ublas { private: size_type size1_; size_type size2_; - size_type non_zeros_; array_type data_; static const value_type zero_; }; @@ -1375,12 +1366,11 @@ namespace boost { namespace numeric { namespace ublas { // Resizing BOOST_UBLAS_INLINE - void resize (size_type size1, size_type size2, size_type non_zeros = 0, bool preserve = true) { + void resize (size_type size1, size_type size2, bool preserve = true) { // FIXME preserve unimplemented BOOST_UBLAS_CHECK (!preserve, internal_logic ()); size1_ = size1; size2_ = size2; - non_zeros_ = non_zeros; data ().clear (); data () [functor_type::size1 (size1_, size2_)] = vector_data_value_type (); } @@ -2606,12 +2596,12 @@ namespace boost { namespace numeric { namespace ublas { } public: BOOST_UBLAS_INLINE - void resize (size_type size1, size_type size2, size_type non_zeros = 0, bool preserve = true) { + void resize (size_type size1, size_type size2, bool preserve = true) { // FIXME preserve unimplemented BOOST_UBLAS_CHECK (!preserve, internal_logic ()); size1_ = size1; size2_ = size2; - non_zeros_ = max_nz (non_zeros); + non_zeros_ = max_nz (non_zeros_); filled1_ = 1; filled2_ = 0; index1_data ().resize (functor_type::size1 (size1_, size2_) + 1); @@ -2622,17 +2612,22 @@ namespace boost { namespace numeric { namespace ublas { // Reserving BOOST_UBLAS_INLINE - void reserve (size_type non_zeros = 0, bool preserve = true) { + void reserve (size_type non_zeros, bool preserve = true) { non_zeros_ = max_nz (non_zeros); if (preserve) { index2_data ().resize (non_zeros_, size_type ()); value_data ().resize (non_zeros_, value_type ()); + filled1_ = (std::min) (non_zeros_ + 1, filled1_); + filled2_ = (std::min) (non_zeros_, filled2_); } else { index2_data ().resize (non_zeros_); value_data ().resize (non_zeros_); + filled1_ = 1; + filled2_ = 0; } - } + BOOST_UBLAS_CHECK (index1_data () [filled1_ - 1] == k_based (filled2_), internal_logic ()); + } // Proxy support #ifdef BOOST_UBLAS_STRICT_MATRIX_SPARSE @@ -2799,7 +2794,7 @@ namespace boost { namespace numeric { namespace ublas { void push_back (size_type i, size_type j, const_reference t) { BOOST_UBLAS_CHECK (index1_data () [filled1_ - 1] == k_based (filled2_), internal_logic ()); if (filled2_ >= non_zeros_) - reserve (2 * non_zeros_); + reserve (2 * non_zeros_, true); size_type element1 = functor_type::element1 (i, size1_, j, size2_); size_type element2 = functor_type::element2 (i, size1_, j, size2_); while (filled1_ < element1 + 2) { @@ -2822,7 +2817,7 @@ namespace boost { namespace numeric { namespace ublas { void insert (size_type i, size_type j, const_reference t) { BOOST_UBLAS_CHECK (index1_data () [filled1_ - 1] == k_based (filled2_), internal_logic ()); if (filled2_ >= non_zeros_) - reserve (2 * non_zeros_); + reserve (2 * non_zeros_, true); size_type element1 = functor_type::element1 (i, size1_, j, size2_); size_type element2 = functor_type::element2 (i, size1_, j, size2_); while (filled1_ < element1 + 2) { @@ -3925,12 +3920,12 @@ namespace boost { namespace numeric { namespace ublas { } public: BOOST_UBLAS_INLINE - void resize (size_type size1, size_type size2, size_type non_zeros = 0, bool preserve = true) { + void resize (size_type size1, size_type size2, bool preserve = true) { // FIXME preserve unimplemented BOOST_UBLAS_CHECK (!preserve, internal_logic ()); size1_ = size1; size2_ = size2; - non_zeros_ = max_nz (non_zeros); + non_zeros_ = max_nz (non_zeros_); index1_data ().resize (non_zeros_); index2_data ().resize (non_zeros_); value_data ().resize (non_zeros_); @@ -3939,18 +3934,20 @@ namespace boost { namespace numeric { namespace ublas { // Reserving BOOST_UBLAS_INLINE - void reserve (size_type non_zeros = 0, bool preserve = true) { + void reserve (size_type non_zeros, bool preserve = true) { sort (); // remove duplicate elements non_zeros_ = max_nz (non_zeros); if (preserve) { index1_data ().resize (non_zeros_, size_type ()); index2_data ().resize (non_zeros_, size_type ()); value_data ().resize (non_zeros_, value_type ()); + filled_ = (std::min) (non_zeros_, filled_); } else { index1_data ().resize (non_zeros_); index2_data ().resize (non_zeros_); value_data ().resize (non_zeros_); + filled_ = 0; } } @@ -4143,7 +4140,7 @@ namespace boost { namespace numeric { namespace ublas { BOOST_UBLAS_INLINE void push_back (size_type i, size_type j, const_reference t) { if (filled_ >= non_zeros_) - reserve (2 * non_zeros_); + reserve (2 * non_zeros_, true); size_type element1 = functor_type::element1 (i, size1_, j, size2_); size_type element2 = functor_type::element2 (i, size1_, j, size2_); if (filled_ == 0 || @@ -4160,7 +4157,7 @@ namespace boost { namespace numeric { namespace ublas { BOOST_UBLAS_INLINE void insert (size_type i, size_type j, const_reference t) { if (filled_ >= non_zeros_) - reserve (2 * non_zeros_); + reserve (2 * non_zeros_, true); size_type element1 = functor_type::element1 (i, size1_, j, size2_); size_type element2 = functor_type::element2 (i, size1_, j, size2_); ++ filled_; diff --git a/include/boost/numeric/ublas/vector_sparse.hpp b/include/boost/numeric/ublas/vector_sparse.hpp index 46fd75fd..220fc124 100644 --- a/include/boost/numeric/ublas/vector_sparse.hpp +++ b/include/boost/numeric/ublas/vector_sparse.hpp @@ -257,23 +257,23 @@ namespace boost { namespace numeric { namespace ublas { BOOST_UBLAS_INLINE sparse_vector (): vector_expression (), - size_ (0), non_zeros_ (0), data_ () {} + size_ (0), data_ () {} BOOST_UBLAS_INLINE sparse_vector (size_type size, size_type non_zeros = 0): vector_expression (), - size_ (size), non_zeros_ (non_zeros), data_ () { - detail::map_reserve (data(), non_zeros_); + size_ (size), data_ () { + detail::map_reserve (data(), non_zeros); } BOOST_UBLAS_INLINE sparse_vector (const sparse_vector &v): vector_expression (), - size_ (v.size_), non_zeros_ (v.non_zeros_), data_ (v.data_) {} + size_ (v.size_), data_ (v.data_) {} template BOOST_UBLAS_INLINE sparse_vector (const vector_expression &ae, size_type non_zeros = 0): vector_expression (), - size_ (ae ().size ()), non_zeros_ (non_zeros), data_ () { - detail::map_reserve (data(), non_zeros_); + size_ (ae ().size ()), data_ () { + detail::map_reserve (data(), non_zeros); vector_assign (scalar_assign (), *this, ae); } @@ -297,25 +297,20 @@ namespace boost { namespace numeric { namespace ublas { // Resizing BOOST_UBLAS_INLINE - void resize (size_type size, size_type non_zeros = 0, bool preserve = true) { + void resize (size_type size, bool preserve = true) { size_ = size; - non_zeros_ = (std::max) (non_zeros, size_type (1)); - non_zeros_ = (std::min) (non_zeros_, size_); if (preserve) { data ().erase (data ().lower_bound(size_), data ().end()); } else { data ().clear (); } - detail::map_reserve (data (), non_zeros_); } // Reserving BOOST_UBLAS_INLINE void reserve (size_type non_zeros = 0, bool preserve = true) { - non_zeros_ = (std::max) (non_zeros, size_type (1)); - non_zeros_ = (std::min) (non_zeros_, size_); - detail::map_reserve (data (), non_zeros_); + detail::map_reserve (data (), non_zeros); } // Proxy support @@ -361,7 +356,6 @@ namespace boost { namespace numeric { namespace ublas { sparse_vector &operator = (const sparse_vector &v) { if (this != &v) { size_ = v.size_; - non_zeros_ = v.non_zeros_; data () = v.data (); } return *this; @@ -374,8 +368,7 @@ namespace boost { namespace numeric { namespace ublas { template BOOST_UBLAS_INLINE sparse_vector &operator = (const vector_expression &ae) { - // return assign (self_type (ae, non_zeros_)); - self_type temporary (ae, non_zeros_); + self_type temporary (ae, detail::map_capacity (data())); return assign_temporary (temporary); } template @@ -387,8 +380,7 @@ namespace boost { namespace numeric { namespace ublas { template BOOST_UBLAS_INLINE sparse_vector &operator += (const vector_expression &ae) { - // return assign (self_type (*this + ae, non_zeros_)); - self_type temporary (*this + ae, non_zeros_); + self_type temporary (*this + ae, detail::map_capacity (data())); return assign_temporary (temporary); } template @@ -400,8 +392,7 @@ namespace boost { namespace numeric { namespace ublas { template BOOST_UBLAS_INLINE sparse_vector &operator -= (const vector_expression &ae) { - // return assign (self_type (*this - ae, non_zeros_)); - self_type temporary (*this - ae, non_zeros_); + self_type temporary (*this - ae, detail::map_capacity (data())); return assign_temporary (temporary); } template @@ -428,7 +419,6 @@ namespace boost { namespace numeric { namespace ublas { void swap (sparse_vector &v) { if (this != &v) { std::swap (size_, v.size_); - std::swap (non_zeros_, v.non_zeros_); data ().swap (v.data ()); } } @@ -679,7 +669,6 @@ namespace boost { namespace numeric { namespace ublas { private: size_type size_; - size_type non_zeros_; array_type data_; static const value_type zero_; }; @@ -738,7 +727,6 @@ namespace boost { namespace numeric { namespace ublas { vector_expression (), size_ (size), non_zeros_ (non_zeros), filled_ (0), index_data_ (non_zeros), value_data_ (non_zeros) { - reserve (non_zeros_); } BOOST_UBLAS_INLINE compressed_vector (const compressed_vector &v): @@ -751,7 +739,6 @@ namespace boost { namespace numeric { namespace ublas { vector_expression (), size_ (ae ().size ()), non_zeros_ (non_zeros), filled_ (0), index_data_ (non_zeros), value_data_ (non_zeros) { - reserve (non_zeros_, false); vector_assign (scalar_assign (), *this, ae); } @@ -791,8 +778,20 @@ namespace boost { namespace numeric { namespace ublas { // Resizing BOOST_UBLAS_INLINE - void resize (size_type size, size_type non_zeros = 0, bool preserve = true) { + void resize (size_type size, bool preserve = true) { + // FIXME preserve unimplemented + BOOST_UBLAS_CHECK (!preserve, internal_logic ()); size_ = size; + non_zeros_ = (std::max) (non_zeros_, size_type (1)); + non_zeros_ = (std::min) (non_zeros_, size_); + index_data (). resize (non_zeros_); + value_data (). resize (non_zeros_); + filled_ = 0; + } + + // Reserving + BOOST_UBLAS_INLINE + void reserve (size_type non_zeros, bool preserve = true) { non_zeros_ = (std::max) (non_zeros, size_type (1)); non_zeros_ = (std::min) (non_zeros_, size_); if (preserve) { @@ -807,12 +806,6 @@ namespace boost { namespace numeric { namespace ublas { } } - // Reserving - BOOST_UBLAS_INLINE - void reserve (size_type non_zeros = 0, bool preserve = true) { - resize (size_, non_zeros, preserve); - } - // Proxy support #ifdef BOOST_UBLAS_STRICT_VECTOR_SPARSE pointer find_element (size_type i) { @@ -949,7 +942,7 @@ namespace boost { namespace numeric { namespace ublas { BOOST_UBLAS_INLINE void push_back (size_type i, const_reference t) { if (filled_ >= non_zeros_) - reserve (2 * non_zeros_); + reserve (2 * non_zeros_, true); if (filled_ == 0 || index_data () [filled_ - 1] < k_based (i)) { ++ filled_; index_data () [filled_ - 1] = k_based (i); @@ -961,7 +954,7 @@ namespace boost { namespace numeric { namespace ublas { BOOST_UBLAS_INLINE void insert (size_type i, const_reference t) { if (filled_ >= non_zeros_) - reserve (2 * non_zeros_); + reserve (2 * non_zeros_, true); iterator_type it (detail::lower_bound (index_data ().begin (), index_data ().begin () + filled_, k_based (i), std::less ())); difference_type n = it - index_data ().begin (); BOOST_UBLAS_CHECK (filled_ == 0 || filled_ == size_type (n) || *it != k_based (i), external_logic ()); @@ -1288,7 +1281,6 @@ namespace boost { namespace numeric { namespace ublas { vector_expression (), size_ (size), non_zeros_ (non_zeros), filled_ (0), sorted_ (true), index_data_ (non_zeros), value_data_ (non_zeros) { - reserve (non_zeros_); } BOOST_UBLAS_INLINE coordinate_vector (const coordinate_vector &v): @@ -1301,7 +1293,6 @@ namespace boost { namespace numeric { namespace ublas { vector_expression (), size_ (ae ().size ()), non_zeros_ (non_zeros), filled_ (0), sorted_ (true), index_data_ (non_zeros), value_data_ (non_zeros) { - reserve (non_zeros_, false); vector_assign (scalar_assign (), *this, ae); } @@ -1341,29 +1332,42 @@ namespace boost { namespace numeric { namespace ublas { // Resizing BOOST_UBLAS_INLINE - void resize (size_type size, size_type non_zeros = 0, bool preserve = true) { - non_zeros = (std::max) (non_zeros, size_type (1)); - sort (); // remove duplicate elements. - non_zeros = (std::min) (non_zeros, size_); + void resize (size_type size, bool preserve = true) { + // FIXME preserve unimplemented + BOOST_UBLAS_CHECK (!preserve, internal_logic ()); + if (preserve) + sort (); // remove duplicate elements. + non_zeros_ = (std::max) (non_zeros_, size_type (1)); + non_zeros_ = (std::min) (non_zeros_, size); if (preserve) { - sort (); - index_data (). resize (non_zeros, size_type ()); - value_data (). resize (non_zeros, value_type ()); + index_data (). resize (non_zeros_, size_type ()); + value_data (). resize (non_zeros_, value_type ()); filled_ = (std::min) (non_zeros_, filled_); - } + } else { - index_data (). resize (non_zeros); - value_data (). resize (non_zeros); + index_data (). resize (non_zeros_); + value_data (). resize (non_zeros_); filled_ = 0; } size_ = size; - non_zeros_ = non_zeros_; } - // Reserving BOOST_UBLAS_INLINE - void reserve (size_type non_zeros = 0, bool preserve = true) { - resize (size_, non_zeros, preserve); + void reserve (size_type non_zeros, bool preserve = true) { + if (preserve) + sort (); // remove duplicate elements. + non_zeros_ = (std::max) (non_zeros, size_type (1)); + non_zeros_ = (std::min) (non_zeros_, size_); + if (preserve) { + index_data (). resize (non_zeros_, size_type ()); + value_data (). resize (non_zeros_, value_type ()); + filled_ = (std::min) (non_zeros_, filled_); + } + else { + index_data (). resize (non_zeros_); + value_data (). resize (non_zeros_); + filled_ = 0; + } } // Proxy support @@ -1533,7 +1537,7 @@ namespace boost { namespace numeric { namespace ublas { BOOST_UBLAS_INLINE void push_back (size_type i, const_reference t) { if (filled_ >= non_zeros_) - reserve (2 * non_zeros_); + reserve (2 * non_zeros_, true); if (filled_ == 0 || index_data () [filled_ - 1] < k_based (i)) { ++ filled_; index_data () [filled_ - 1] = k_based (i); @@ -1545,7 +1549,7 @@ namespace boost { namespace numeric { namespace ublas { BOOST_UBLAS_INLINE void insert (size_type i, const_reference t) { if (filled_ >= non_zeros_) - reserve (2 * non_zeros_); + reserve (2 * non_zeros_, true); ++ filled_; index_data () [filled_ - 1] = k_based (i); value_data () [filled_ - 1] = t;