37 #ifndef GMM_VECTOR_H__
38 #define GMM_VECTOR_H__
52 template<
typename T,
typename V>
class ref_elt_vector {
59 operator T()
const {
return pm->r(l); }
60 ref_elt_vector(V *p,
size_type ll) : pm(p), l(ll) {}
61 inline bool operator ==(T v)
const {
return ((*pm).r(l) == v); }
62 inline bool operator !=(T v)
const {
return ((*pm).r(l) != v); }
63 inline bool operator ==(std::complex<T> v)
const
64 {
return ((*pm).r(l) == v); }
65 inline bool operator !=(std::complex<T> v)
const
66 {
return ((*pm).r(l) != v); }
67 inline ref_elt_vector &operator +=(T v)
68 { (*pm).wa(l, v);
return *
this; }
69 inline ref_elt_vector &operator -=(T v)
70 { (*pm).wa(l, -v);
return *
this; }
71 inline ref_elt_vector &operator /=(T v)
72 { (*pm).w(l,(*pm).r(l) / v);
return *
this; }
73 inline ref_elt_vector &operator *=(T v)
74 { (*pm).w(l,(*pm).r(l) * v);
return *
this; }
75 inline ref_elt_vector &operator =(
const ref_elt_vector &re)
76 { *
this = T(re);
return *
this; }
77 inline ref_elt_vector &operator =(T v)
78 { (*pm).w(l,v);
return *
this; }
79 T operator +() {
return T(*
this); }
80 T operator -() {
return -T(*
this); }
81 T operator +(T v) {
return T(*
this)+ v; }
82 T operator -(T v) {
return T(*
this)- v; }
83 T operator *(T v) {
return T(*
this)* v; }
84 T operator /(T v) {
return T(*
this)/ v; }
85 std::complex<T> operator +(std::complex<T> v) {
return T(*
this)+ v; }
86 std::complex<T> operator -(std::complex<T> v) {
return T(*
this)- v; }
87 std::complex<T> operator *(std::complex<T> v) {
return T(*
this)* v; }
88 std::complex<T> operator /(std::complex<T> v) {
return T(*
this)/ v; }
91 template<
typename T,
typename V>
class ref_elt_vector<std::complex<T>,V> {
98 operator std::complex<T>()
const {
return pm->r(l); }
99 ref_elt_vector(V *p,
size_type ll) : pm(p), l(ll) {}
100 ref_elt_vector(
const ref_elt_vector &re) : pm(re.pm), l(re.l) {}
101 inline bool operator ==(std::complex<T> v)
const
102 {
return ((*pm).r(l) == v); }
103 inline bool operator !=(std::complex<T> v)
const
104 {
return ((*pm).r(l) != v); }
105 inline bool operator ==(T v)
const {
return ((*pm).r(l) == v); }
106 inline bool operator !=(T v)
const {
return ((*pm).r(l) != v); }
107 inline ref_elt_vector &operator +=(std::complex<T> v)
108 { (*pm).w(l,(*pm).r(l) + v);
return *
this; }
109 inline ref_elt_vector &operator -=(std::complex<T> v)
110 { (*pm).w(l,(*pm).r(l) - v);
return *
this; }
111 inline ref_elt_vector &operator /=(std::complex<T> v)
112 { (*pm).w(l,(*pm).r(l) / v);
return *
this; }
113 inline ref_elt_vector &operator *=(std::complex<T> v)
114 { (*pm).w(l,(*pm).r(l) * v);
return *
this; }
115 inline ref_elt_vector &operator =(
const ref_elt_vector &re)
116 { *
this = std::complex<T>(re);
return *
this; }
117 inline ref_elt_vector &operator =(std::complex<T> v)
118 { (*pm).w(l,v);
return *
this; }
119 inline ref_elt_vector &operator =(T v)
120 { (*pm).w(l,std::complex<T>(v));
return *
this; }
121 inline ref_elt_vector &operator +=(T v)
122 { (*pm).w(l,(*pm).r(l) + v);
return *
this; }
123 inline ref_elt_vector &operator -=(T v)
124 { (*pm).w(l,(*pm).r(l) - v);
return *
this; }
125 inline ref_elt_vector &operator /=(T v)
126 { (*pm).w(l,(*pm).r(l) / v);
return *
this; }
127 inline ref_elt_vector &operator *=(T v)
128 { (*pm).w(l,(*pm).r(l) * v);
return *
this; }
129 std::complex<T> operator +() {
return std::complex<T>(*
this); }
130 std::complex<T> operator -() {
return -std::complex<T>(*
this); }
131 std::complex<T> operator +(T v) {
return std::complex<T>(*
this)+ v; }
132 std::complex<T> operator -(T v) {
return std::complex<T>(*
this)- v; }
133 std::complex<T> operator *(T v) {
return std::complex<T>(*
this)* v; }
134 std::complex<T> operator /(T v) {
return std::complex<T>(*
this)/ v; }
135 std::complex<T> operator +(std::complex<T> v)
136 {
return std::complex<T>(*
this)+ v; }
137 std::complex<T> operator -(std::complex<T> v)
138 {
return std::complex<T>(*
this)- v; }
139 std::complex<T> operator *(std::complex<T> v)
140 {
return std::complex<T>(*
this)* v; }
141 std::complex<T> operator /(std::complex<T> v)
142 {
return std::complex<T>(*
this)/ v; }
146 template<
typename T,
typename V>
inline
147 bool operator ==(T v,
const ref_elt_vector<T, V> &re) {
return (v==T(re)); }
148 template<
typename T,
typename V>
inline
149 bool operator !=(T v,
const ref_elt_vector<T, V> &re) {
return (v!=T(re)); }
150 template<
typename T,
typename V>
inline
151 T &operator +=(T &v,
const ref_elt_vector<T, V> &re)
152 { v += T(re);
return v; }
153 template<
typename T,
typename V>
inline
154 T &operator -=(T &v,
const ref_elt_vector<T, V> &re)
155 { v -= T(re);
return v; }
156 template<
typename T,
typename V>
inline
157 T &operator *=(T &v,
const ref_elt_vector<T, V> &re)
158 { v *= T(re);
return v; }
159 template<
typename T,
typename V>
inline
160 T &operator /=(T &v,
const ref_elt_vector<T, V> &re)
161 { v /= T(re);
return v; }
162 template<
typename T,
typename V>
inline
163 T operator +(T v,
const ref_elt_vector<T, V> &re) {
return v+ T(re); }
164 template<
typename T,
typename V>
inline
165 T operator -(T v,
const ref_elt_vector<T, V> &re) {
return v- T(re); }
166 template<
typename T,
typename V>
inline
167 T operator *(T v,
const ref_elt_vector<T, V> &re) {
return v* T(re); }
168 template<
typename T,
typename V>
inline
169 T operator /(T v,
const ref_elt_vector<T, V> &re) {
return v/ T(re); }
170 template<
typename T,
typename V>
inline
171 std::complex<T> operator +(std::complex<T> v,
const ref_elt_vector<T, V> &re)
173 template<
typename T,
typename V>
inline
174 std::complex<T> operator -(std::complex<T> v,
const ref_elt_vector<T, V> &re)
176 template<
typename T,
typename V>
inline
177 std::complex<T> operator *(std::complex<T> v,
const ref_elt_vector<T, V> &re)
179 template<
typename T,
typename V>
inline
180 std::complex<T> operator /(std::complex<T> v,
const ref_elt_vector<T, V> &re)
182 template<
typename T,
typename V>
inline
183 std::complex<T> operator +(T v,
const ref_elt_vector<std::complex<T>, V> &re)
184 {
return v+ std::complex<T>(re); }
185 template<
typename T,
typename V>
inline
186 std::complex<T> operator -(T v,
const ref_elt_vector<std::complex<T>, V> &re)
187 {
return v- std::complex<T>(re); }
188 template<
typename T,
typename V>
inline
189 std::complex<T> operator *(T v,
const ref_elt_vector<std::complex<T>, V> &re)
190 {
return v* std::complex<T>(re); }
191 template<
typename T,
typename V>
inline
192 std::complex<T> operator /(T v,
const ref_elt_vector<std::complex<T>, V> &re)
193 {
return v/ std::complex<T>(re); }
194 template<
typename T,
typename V>
inline
195 typename number_traits<T>::magnitude_type
196 abs(
const ref_elt_vector<T, V> &re) {
return gmm::abs(T(re)); }
197 template<
typename T,
typename V>
inline
198 T sqr(
const ref_elt_vector<T, V> &re) {
return gmm::sqr(T(re)); }
199 template<
typename T,
typename V>
inline
200 typename number_traits<T>::magnitude_type
201 abs_sqr(
const ref_elt_vector<T, V> &re) {
return gmm::abs_sqr(T(re)); }
202 template<
typename T,
typename V>
inline
203 T conj(
const ref_elt_vector<T, V> &re) {
return gmm::conj(T(re)); }
204 template<
typename T,
typename V> std::ostream &
operator <<
205 (std::ostream &o,
const ref_elt_vector<T, V> &re) { o << T(re);
return o; }
206 template<
typename T,
typename V>
inline
207 typename number_traits<T>::magnitude_type
208 real(
const ref_elt_vector<T, V> &re) {
return gmm::real(T(re)); }
209 template<
typename T,
typename V>
inline
210 typename number_traits<T>::magnitude_type
211 imag(
const ref_elt_vector<T, V> &re) {
return gmm::imag(T(re)); }
222 template<
typename T>
class dsvector;
224 template<
typename T>
struct dsvector_iterator {
229 typedef T value_type;
230 typedef value_type* pointer;
231 typedef const value_type* const_pointer;
232 typedef value_type& reference;
234 typedef ptrdiff_t difference_type;
235 typedef std::bidirectional_iterator_tag iterator_category;
236 typedef dsvector_iterator<T> iterator;
238 reference operator *()
const {
return *p; }
239 pointer operator->()
const {
return &(operator*()); }
241 iterator &operator ++() {
242 for (
size_type k = (i & 15); k < 15; ++k)
243 { ++p; ++i;
if (*p != T(0))
return *
this; }
244 v->next_pos(*(
const_cast<const_pointer *
>(&(p))), i);
247 iterator operator ++(
int) { iterator tmp = *
this; ++(*this);
return tmp; }
248 iterator &operator --() {
250 { --p; --i;
if (*p != T(0))
return *
this; }
251 v->previous_pos(p, i);
254 iterator operator --(
int) { iterator tmp = *
this; --(*this);
return tmp; }
256 bool operator ==(
const iterator &it)
const
257 {
return (i == it.i && p == it.p && v == it.v); }
258 bool operator !=(
const iterator &it)
const
259 {
return !(it == *
this); }
263 dsvector_iterator() : i(
size_type(-1)), p(0), v(0) {}
264 dsvector_iterator(dsvector<T> &w) : i(
size_type(-1)), p(0), v(&w) {};
268 template<
typename T>
struct dsvector_const_iterator {
271 const dsvector<T> *v;
273 typedef T value_type;
274 typedef const value_type* pointer;
275 typedef const value_type& reference;
277 typedef ptrdiff_t difference_type;
278 typedef std::bidirectional_iterator_tag iterator_category;
279 typedef dsvector_const_iterator<T> iterator;
281 reference operator *()
const {
return *p; }
282 pointer operator->()
const {
return &(operator*()); }
283 iterator &operator ++() {
284 for (
size_type k = (i & 15); k < 15; ++k)
285 { ++p; ++i;
if (*p != T(0))
return *
this; }
289 iterator operator ++(
int) { iterator tmp = *
this; ++(*this);
return tmp; }
290 iterator &operator --() {
292 { --p; --i;
if (*p != T(0))
return *
this; }
293 v->previous_pos(p, i);
296 iterator operator --(
int) { iterator tmp = *
this; --(*this);
return tmp; }
298 bool operator ==(
const iterator &it)
const
299 {
return (i == it.i && p == it.p && v == it.v); }
300 bool operator !=(
const iterator &it)
const
301 {
return !(it == *
this); }
305 dsvector_const_iterator() : i(
size_type(-1)), p(0) {}
306 dsvector_const_iterator(
const dsvector_iterator<T> &it)
307 : i(it.i), p(it.p), v(it.v) {}
308 dsvector_const_iterator(
const dsvector<T> &w)
318 template<
typename T>
class dsvector {
320 typedef dsvector_iterator<T> iterator;
321 typedef dsvector_const_iterator<T> const_iterator;
322 typedef dsvector<T> this_type;
324 typedef const T * const_pointer;
325 typedef void * void_pointer;
326 typedef const void * const_void_pointer;
333 void_pointer root_ptr;
335 const T *read_access(
size_type i)
const {
336 GMM_ASSERT1(i < n,
"index out of range");
337 size_type my_mask = mask, my_shift = shift;
338 void_pointer p = root_ptr;
341 p = ((
void **)(p))[(i & my_mask) >> my_shift];
343 my_mask = (my_mask >> 4);
346 GMM_ASSERT1(my_shift == 0,
"internal error");
347 GMM_ASSERT1(my_mask == 15,
"internal error");
348 return &(((
const T *)(p))[i & 15]);
352 GMM_ASSERT1(i < n,
"index " << i <<
" out of range (size " << n <<
")");
353 size_type my_mask = mask, my_shift = shift;
356 root_ptr =
new void_pointer[16];
357 std::memset(root_ptr, 0, 16*
sizeof(void_pointer));
359 root_ptr =
new T[16];
360 for (
size_type l = 0; l < 16; ++l) ((T *)(root_ptr))[l] = T(0);
364 void_pointer p = root_ptr;
367 void_pointer q = ((void_pointer *)(p))[j];
370 q =
new void_pointer[16];
371 std::memset(q, 0, 16*
sizeof(void_pointer));
374 for (
size_type l = 0; l < 16; ++l) ((T *)(q))[l] = T(0);
376 ((void_pointer *)(p))[j] = q;
379 my_mask = (my_mask >> 4);
382 GMM_ASSERT1(my_shift == 0,
"internal error");
383 GMM_ASSERT1(my_mask == 15,
"internal error " << my_mask);
384 return &(((T *)(p))[i & 15]);
388 n = n_; depth = 0; shift = 0; mask = 1;
if (n_) --n_;
389 while (n_) { n_ /= 16; ++depth; shift += 4; mask *= 16; }
390 mask--;
if (shift) shift -= 4;
if (depth) --depth;
394 void rec_del(void_pointer p,
size_type my_depth) {
397 if (((void_pointer *)(p))[k])
398 rec_del(((void_pointer *)(p))[k], my_depth-1);
399 delete[] ((void_pointer *)(p));
405 void rec_clean(void_pointer p,
size_type my_depth,
double eps) {
408 if (((void_pointer *)(p))[k])
409 rec_clean(((void_pointer *)(p))[k], my_depth-1, eps);
412 if (gmm::abs(((T *)(p))[k]) <= eps) ((T *)(p))[k] = T(0);
419 my_mask = (my_mask >> 4);
421 if (((void_pointer *)(p))[k] && (base + (k+1)*(mask+1)) >= i)
422 rec_clean_i(((void_pointer *)(p))[k], my_depth-1, my_mask,
423 i, base + k*(my_mask+1));
426 if (base+k > i) ((T *)(p))[k] = T(0);
435 if (((void_pointer *)(p))[k])
436 nn += rec_nnz(((void_pointer *)(p))[k], my_depth-1);
439 if (((
const T *)(p))[k] != T(0)) nn++;
444 void copy_rec(void_pointer &p, const_void_pointer q,
size_type my_depth) {
446 p =
new void_pointer[16];
447 std::memset(p, 0, 16*
sizeof(void_pointer));
449 if (((
const const_void_pointer *)(q))[l])
450 copy_rec(((void_pointer *)(p))[l],
451 ((
const const_void_pointer *)(q))[l], my_depth-1);
454 for (
size_type l = 0; l < 16; ++l) ((T *)(p))[l] = ((
const T *)(q))[l];
458 void copy(
const dsvector<T> &v) {
459 if (root_ptr) rec_del(root_ptr, depth);
461 mask = v.mask; depth = v.depth; n = v.n; shift = v.shift;
462 if (v.root_ptr) copy_rec(root_ptr, v.root_ptr, depth);
469 my_mask = (my_mask >> 4);
471 if (((void_pointer *)(p))[k] && (base + (k+1)*(my_mask+1)) >= i) {
472 next_pos_rec(((void_pointer *)(p))[k], my_depth-1, my_mask,
473 pp, i, base + k*(my_mask+1));
474 if (i !=
size_type(-1))
return;
else i = ii;
479 if (base+k > i && ((const_pointer)(p))[k] != T(0))
480 { i = base+k; pp = &(((const_pointer)(p))[k]);
return; }
490 my_mask = (my_mask >> 4);
492 if (((void_pointer *)(p))[k] && ((base + k*(my_mask+1)) < i)) {
493 previous_pos_rec(((void_pointer *)(p))[k], my_depth-1,
494 my_mask, pp, i, base + k*(my_mask+1));
495 if (i !=
size_type(-1))
return;
else i = ii;
500 if (base+k < i && ((const_pointer)(p))[k] != T(0))
501 { i = base+k; pp = &(((const_pointer)(p))[k]);
return; }
508 void clean(
double eps) {
if (root_ptr) rec_clean(root_ptr, depth); }
513 if (root_ptr) rec_clean_i(root_ptr, depth, mask, n_, 0);
516 size_type my_depth = 0, my_shift = 0, my_mask = 1;
if (n_) --n_;
517 while (n_) { n_ /= 16; ++my_depth; my_shift += 4; my_mask *= 16; }
518 my_mask--;
if (my_shift) my_shift -= 4;
if (my_depth) --my_depth;
519 if (my_depth > depth || depth == 0) {
521 for (
size_type k = depth; k < my_depth; ++k) {
522 void_pointer *q =
new void_pointer [16];
523 std::memset(q, 0, 16*
sizeof(void_pointer));
524 q[0] = root_ptr; root_ptr = q;
527 mask = my_mask; depth = my_depth; shift = my_shift;
533 void clear() {
if (root_ptr) rec_del(root_ptr, depth); root_ptr = 0; }
535 void next_pos(const_pointer &pp,
size_type &i)
const {
536 if (!root_ptr || i >= n) { pp = 0, i =
size_type(-1);
return; }
537 next_pos_rec(root_ptr, depth, mask, pp, i, 0);
540 void previous_pos(const_pointer &pp,
size_type &i)
const {
541 if (!root_ptr) { pp = 0, i =
size_type(-1);
return; }
543 previous_pos_rec(root_ptr, depth, mask, pp, i, 0);
549 it.i = 0; it.p =
const_cast<T *
>(read_access(0));
550 if (!(it.p) || *(it.p) == T(0))
551 next_pos(*(
const_cast<const_pointer *
>(&(it.p))), it.i);
556 iterator end() {
return iterator(*
this); }
558 const_iterator begin()
const {
559 const_iterator it(*
this);
561 it.i = 0; it.p = read_access(0);
562 if (!(it.p) || *(it.p) == T(0)) next_pos(it.p, it.i);
567 const_iterator end()
const {
return const_iterator(*
this); }
569 inline ref_elt_vector<T, dsvector<T> > operator [](
size_type c)
570 {
return ref_elt_vector<T, dsvector<T> >(
this, c); }
573 if (e == T(0)) {
if (read_access(c)) *(write_access(c)) = e; }
574 else *(write_access(c)) = e;
578 {
if (e != T(0)) { *(write_access(c)) += e; } }
581 {
const T *p = read_access(c);
if (p)
return *p;
else return T(0); }
583 inline T operator [](
size_type c)
const {
return r(c); }
586 {
if (root_ptr)
return rec_nnz(root_ptr, depth);
else return 0; }
589 void swap(dsvector<T> &v) {
590 std::swap(n, v.n); std::swap(root_ptr, v.root_ptr);
591 std::swap(depth, v.depth); std::swap(shift, v.shift);
592 std::swap(mask, v.mask);
596 dsvector(
const dsvector<T> &v) { init(0); copy(v); }
597 dsvector<T> &operator =(
const dsvector<T> &v) { copy(v);
return *
this; }
598 explicit dsvector(
size_type l){ init(l); }
599 dsvector() { init(0); }
600 ~dsvector() {
if (root_ptr) rec_del(root_ptr, depth); root_ptr = 0; }
603 template <
typename T>
struct linalg_traits<dsvector<T>> {
604 typedef dsvector<T> this_type;
605 typedef this_type origin_type;
606 typedef linalg_false is_reference;
607 typedef abstract_vector linalg_type;
608 typedef T value_type;
609 typedef ref_elt_vector<T, dsvector<T> > reference;
610 typedef dsvector_iterator<T> iterator;
611 typedef dsvector_const_iterator<T> const_iterator;
612 typedef abstract_sparse storage_type;
613 typedef linalg_true index_sorted;
614 static size_type size(
const this_type &v) {
return v.size(); }
615 static iterator begin(this_type &v) {
return v.begin(); }
616 static const_iterator begin(
const this_type &v) {
return v.begin(); }
617 static iterator end(this_type &v) {
return v.end(); }
618 static const_iterator end(
const this_type &v) {
return v.end(); }
619 static origin_type* origin(this_type &v) {
return &v; }
620 static const origin_type* origin(
const this_type &v) {
return &v; }
621 static void clear(origin_type* o,
const iterator &,
const iterator &)
623 static void do_clear(this_type &v) { v.clear(); }
624 static value_type access(
const origin_type *o,
const const_iterator &,
627 static reference access(origin_type *o,
const iterator &,
const iterator &,
633 template<
typename T> std::ostream &
operator <<
634 (std::ostream &o,
const dsvector<T>& v) { gmm::write(o,v);
return o; }
638 template <
typename T>
inline void copy(
const dsvector<T> &v1,
640 GMM_ASSERT2(v1.size() == v2.size(),
"dimensions mismatch");
643 template <
typename T>
inline void copy(
const dsvector<T> &v1,
644 const dsvector<T> &v2) {
645 GMM_ASSERT2(v1.size() == v2.size(),
"dimensions mismatch");
646 v2 =
const_cast<dsvector<T> &
>(v1);
648 template <
typename T>
inline
649 void copy(
const dsvector<T> &v1,
const simple_vector_ref<dsvector<T> *> &v2){
650 simple_vector_ref<dsvector<T> *>
651 *svr =
const_cast<simple_vector_ref<dsvector<T> *
> *>(&v2);
653 *pv =
const_cast<dsvector<T> *
>((v2.origin));
654 GMM_ASSERT2(vect_size(v1) == vect_size(v2),
"dimensions mismatch");
655 *pv = v1; svr->begin_ = vect_begin(*pv); svr->end_ = vect_end(*pv);
657 template <
typename T>
inline
658 void copy(
const simple_vector_ref<
const dsvector<T> *> &v1,
660 {
copy(*(v1.origin), v2); }
661 template <
typename T>
inline
662 void copy(
const simple_vector_ref<dsvector<T> *> &v1, dsvector<T> &v2)
663 {
copy(*(v1.origin), v2); }
664 template <
typename T>
inline
665 void copy(
const simple_vector_ref<dsvector<T> *> &v1,
666 const simple_vector_ref<dsvector<T> *> &v2)
667 {
copy(*(v1.origin), v2); }
668 template <
typename T>
inline
669 void copy(
const simple_vector_ref<
const dsvector<T> *> &v1,
670 const simple_vector_ref<dsvector<T> *> &v2)
671 {
copy(*(v1.origin), v2); }
673 template <
typename T>
674 inline size_type nnz(
const dsvector<T>& l) {
return l.nnz(); }
684 template<
typename T>
struct wsvector_iterator
685 :
public std::map<size_type, T>::iterator {
686 typedef typename std::map<size_type, T>::iterator base_it_type;
687 typedef T value_type;
688 typedef value_type* pointer;
689 typedef value_type& reference;
691 typedef ptrdiff_t difference_type;
692 typedef std::bidirectional_iterator_tag iterator_category;
694 reference operator *()
const {
return (base_it_type::operator*()).second; }
695 pointer operator->()
const {
return &(operator*()); }
696 size_type index()
const {
return (base_it_type::operator*()).first; }
698 wsvector_iterator() {}
699 wsvector_iterator(
const base_it_type &it) : base_it_type(it) {}
702 template<
typename T>
struct wsvector_const_iterator
703 :
public std::map<size_type, T>::const_iterator {
704 typedef typename std::map<size_type, T>::const_iterator base_it_type;
705 typedef T value_type;
706 typedef const value_type* pointer;
707 typedef const value_type& reference;
709 typedef ptrdiff_t difference_type;
710 typedef std::bidirectional_iterator_tag iterator_category;
712 reference operator *()
const {
return (base_it_type::operator*()).second; }
713 pointer operator->()
const {
return &(operator*()); }
714 size_type index()
const {
return (base_it_type::operator*()).first; }
716 wsvector_const_iterator() {}
717 wsvector_const_iterator(
const wsvector_iterator<T> &it)
718 : base_it_type(typename std::map<
size_type, T>::iterator(it)) {}
719 wsvector_const_iterator(
const base_it_type &it) : base_it_type(it) {}
727 template<
typename T>
class wsvector :
public std::map<size_type, T> {
731 typedef std::map<size_type, T> base_type;
732 typedef typename base_type::iterator iterator;
733 typedef typename base_type::const_iterator const_iterator;
739 void clean(
double eps);
740 void resize(size_type);
742 inline ref_elt_vector<T, wsvector<T> > operator [](size_type c)
743 {
return ref_elt_vector<T, wsvector<T> >(
this, c); }
745 inline void w(size_type c,
const T &e) {
746 GMM_ASSERT2(c < nbl,
"out of range");
747 if (e == T(0)) { this->erase(c); }
748 else base_type::operator [](c) = e;
751 inline void wa(size_type c,
const T &e) {
752 GMM_ASSERT2(c < nbl,
"out of range");
754 iterator it = this->lower_bound(c);
755 if (it != this->end() && it->first == c) it->second += e;
756 else base_type::operator [](c) = e;
760 inline T r(size_type c)
const {
761 GMM_ASSERT2(c < nbl,
"out of range");
762 const_iterator it = this->lower_bound(c);
763 if (it != this->end() && c == it->first)
return it->second;
767 inline T operator [](size_type c)
const {
return r(c); }
769 size_type nb_stored()
const {
return base_type::size(); }
772 void swap(wsvector<T> &v)
773 { std::swap(nbl, v.nbl); std::map<size_type, T>::swap(v); }
777 void init(size_type l) { nbl = l; this->
clear(); }
778 explicit wsvector(size_type l){ init(l); }
779 wsvector() { init(0); }
782 template<
typename T>
void wsvector<T>::clean(
double eps) {
783 iterator it = this->begin(), itf = it, ite = this->end();
785 ++itf;
if (gmm::abs(it->second) <= eps) this->erase(it); it = itf;
789 template<
typename T>
void wsvector<T>::resize(
size_type n) {
791 iterator it = this->begin(), itf = it, ite = this->end();
792 while (it != ite) { ++itf;
if (it->first >= n) this->erase(it); it=itf; }
797 template <
typename T>
struct linalg_traits<wsvector<T> > {
798 typedef wsvector<T> this_type;
799 typedef this_type origin_type;
800 typedef linalg_false is_reference;
801 typedef abstract_vector linalg_type;
802 typedef T value_type;
803 typedef ref_elt_vector<T, wsvector<T> > reference;
804 typedef wsvector_iterator<T> iterator;
805 typedef wsvector_const_iterator<T> const_iterator;
806 typedef abstract_sparse storage_type;
807 typedef linalg_true index_sorted;
808 static size_type size(
const this_type &v) {
return v.size(); }
809 static iterator begin(this_type &v) {
return v.begin(); }
810 static const_iterator begin(
const this_type &v) {
return v.begin(); }
811 static iterator end(this_type &v) {
return v.end(); }
812 static const_iterator end(
const this_type &v) {
return v.end(); }
813 static origin_type* origin(this_type &v) {
return &v; }
814 static const origin_type* origin(
const this_type &v) {
return &v; }
815 static void clear(origin_type* o,
const iterator &,
const iterator &)
817 static void do_clear(this_type &v) { v.clear(); }
818 static value_type access(
const origin_type *o,
const const_iterator &,
821 static reference access(origin_type *o,
const iterator &,
const iterator &,
827 template<
typename T> std::ostream &
operator <<
828 (std::ostream &o,
const wsvector<T>& v) { gmm::write(o,v);
return o; }
832 template <
typename T>
inline void copy(
const wsvector<T> &v1,
834 GMM_ASSERT2(vect_size(v1) == vect_size(v2),
"dimensions mismatch");
837 template <
typename T>
inline
838 void copy(
const wsvector<T> &v1,
const simple_vector_ref<wsvector<T> *> &v2){
839 simple_vector_ref<wsvector<T> *>
840 *svr =
const_cast<simple_vector_ref<wsvector<T> *
> *>(&v2);
842 *pv =
const_cast<wsvector<T> *
>(v2.origin);
843 GMM_ASSERT2(vect_size(v1) == vect_size(v2),
"dimensions mismatch");
844 *pv = v1; svr->begin_ = vect_begin(*pv); svr->end_ = vect_end(*pv);
846 template <
typename T>
inline
847 void copy(
const simple_vector_ref<
const wsvector<T> *> &v1,
849 {
copy(*(v1.origin), v2); }
850 template <
typename T>
inline
851 void copy(
const simple_vector_ref<wsvector<T> *> &v1, wsvector<T> &v2)
852 {
copy(*(v1.origin), v2); }
854 template <
typename T>
inline void clean(wsvector<T> &v,
double eps) {
855 typedef typename number_traits<T>::magnitude_type R;
856 typename wsvector<T>::iterator it = v.begin(), ite = v.end(), itc;
858 if (gmm::abs((*it).second) <= R(eps))
859 { itc=it; ++it; v.erase(itc); }
else ++it;
862 template <
typename T>
863 inline void clean(
const simple_vector_ref<wsvector<T> *> &l,
double eps) {
864 simple_vector_ref<wsvector<T> *>
865 *svr =
const_cast<simple_vector_ref<wsvector<T> *
> *>(&l);
867 *pv =
const_cast<wsvector<T> *
>((l.origin));
869 svr->begin_ = vect_begin(*pv); svr->end_ = vect_end(*pv);
872 template <
typename T>
873 inline size_type nnz(
const wsvector<T>& l) {
return l.nb_stored(); }
881 template<
typename T>
struct elt_rsvector_ {
894 elt_rsvector_() : e(0) {}
895 elt_rsvector_(
size_type cc) : c(cc), e(0) {}
896 elt_rsvector_(
size_type cc,
const T &ee) : c(cc), e(ee) {}
897 bool operator < (
const elt_rsvector_ &a)
const {
return c < a.c; }
898 bool operator == (
const elt_rsvector_ &a)
const {
return c == a.c; }
899 bool operator != (
const elt_rsvector_ &a)
const {
return c != a.c; }
902 template<
typename T>
struct rsvector_iterator {
903 typedef typename std::vector<elt_rsvector_<T> >::iterator IT;
904 typedef T value_type;
905 typedef value_type* pointer;
906 typedef value_type& reference;
908 typedef ptrdiff_t difference_type;
909 typedef std::bidirectional_iterator_tag iterator_category;
910 typedef rsvector_iterator<T> iterator;
914 reference operator *()
const {
return it->e; }
915 pointer operator->()
const {
return &(operator*()); }
917 iterator &operator ++() { ++it;
return *
this; }
918 iterator operator ++(
int) { iterator tmp = *
this; ++(*this);
return tmp; }
919 iterator &operator --() { --it;
return *
this; }
920 iterator operator --(
int) { iterator tmp = *
this; --(*this);
return tmp; }
922 bool operator ==(
const iterator &i)
const {
return it == i.it; }
923 bool operator !=(
const iterator &i)
const {
return !(i == *
this); }
925 size_type index()
const {
return it->c; }
926 rsvector_iterator() {}
927 rsvector_iterator(
const IT &i) : it(i) {}
930 template<
typename T>
struct rsvector_const_iterator {
931 typedef typename std::vector<elt_rsvector_<T> >::const_iterator IT;
932 typedef T value_type;
933 typedef const value_type* pointer;
934 typedef const value_type& reference;
936 typedef ptrdiff_t difference_type;
937 typedef std::forward_iterator_tag iterator_category;
938 typedef rsvector_const_iterator<T> iterator;
942 reference operator *()
const {
return it->e; }
943 pointer operator->()
const {
return &(operator*()); }
944 size_type index()
const {
return it->c; }
946 iterator &operator ++() { ++it;
return *
this; }
947 iterator operator ++(
int) { iterator tmp = *
this; ++(*this);
return tmp; }
948 iterator &operator --() { --it;
return *
this; }
949 iterator operator --(
int) { iterator tmp = *
this; --(*this);
return tmp; }
951 bool operator ==(
const iterator &i)
const {
return it == i.it; }
952 bool operator !=(
const iterator &i)
const {
return !(i == *
this); }
954 rsvector_const_iterator() {}
955 rsvector_const_iterator(
const rsvector_iterator<T> &i) : it(i.it) {}
956 rsvector_const_iterator(
const IT &i) : it(i) {}
963 template<
typename T>
class rsvector :
public std::vector<elt_rsvector_<T> > {
966 typedef std::vector<elt_rsvector_<T> > base_type_;
967 typedef typename base_type_::iterator iterator;
968 typedef typename base_type_::const_iterator const_iterator;
970 typedef T value_type;
977 void sup(size_type j);
978 void base_resize(size_type n) { base_type_::resize(n); }
979 void resize(size_type);
981 ref_elt_vector<T, rsvector<T> > operator [](size_type c)
982 {
return ref_elt_vector<T, rsvector<T> >(
this, c); }
984 void w(size_type c,
const T &e);
985 void wa(size_type c,
const T &e);
986 T r(size_type c)
const;
987 void swap_indices(size_type i, size_type j);
989 inline T operator [](size_type c)
const {
return r(c); }
991 size_type nb_stored()
const {
return base_type_::size(); }
993 void clear() { base_type_::resize(0); }
994 void swap(rsvector<T> &v)
995 { std::swap(nbl, v.nbl); std::vector<elt_rsvector_<T> >::swap(v); }
998 explicit rsvector(size_type l) : nbl(l) { }
999 rsvector() : nbl(0) { }
1002 template <
typename T>
1004 if (i > j) std::swap(i, j);
1007 elt_rsvector_<T> ei(i), ej(j), a;
1008 iterator it, ite, iti, itj;
1009 iti = std::lower_bound(this->begin(), this->end(), ei);
1010 if (iti != this->end() && iti->c == i) situation += 1;
1011 itj = std::lower_bound(this->begin(), this->end(), ej);
1012 if (itj != this->end() && itj->c == j) situation += 2;
1014 switch (situation) {
1015 case 1 : a = *iti; a.c = j; it = iti; ++it; ite = this->end();
1016 for (; it != ite && it->c <= j; ++it, ++iti) *iti = *it;
1019 case 2 : a = *itj; a.c = i; it = itj; ite = this->begin();
1022 while (it->c >= i) { *itj = *it; --itj;
if (it==ite)
break; --it; }
1026 case 3 : std::swap(iti->e, itj->e);
1032 template <
typename T>
void rsvector<T>::sup(
size_type j) {
1033 if (nb_stored() != 0) {
1034 elt_rsvector_<T> ev(j);
1035 iterator it = std::lower_bound(this->begin(), this->end(), ev);
1036 if (it != this->end() && it->c == j) {
1037 for (iterator ite = this->end() - 1; it != ite; ++it) *it = *(it+1);
1038 base_resize(nb_stored()-1);
1043 template<
typename T>
void rsvector<T>::resize(
size_type n) {
1045 for (
size_type i = 0; i < nb_stored(); ++i)
1046 if (base_type_::operator[](i).c >= n) { base_resize(i);
break; }
1051 template <
typename T>
void rsvector<T>::w(
size_type c,
const T &e) {
1052 GMM_ASSERT2(c < nbl,
"out of range");
1053 if (e == T(0)) sup(c);
1055 elt_rsvector_<T> ev(c, e);
1056 if (nb_stored() == 0) {
1057 base_type_::push_back(ev);
1060 iterator it = std::lower_bound(this->begin(), this->end(), ev);
1061 if (it != this->end() && it->c == c) it->e = e;
1063 size_type ind = it - this->begin(), nb = this->nb_stored();
1064 if (nb - ind > 1100)
1065 GMM_WARNING2(
"Inefficient addition of element in rsvector with "
1066 << this->nb_stored() - ind <<
" non-zero entries");
1067 base_type_::push_back(ev);
1069 it = this->begin() + ind;
1070 iterator ite = this->end(); --ite; iterator itee = ite;
1071 for (; ite != it; --ite) { --itee; *ite = *itee; }
1079 template <
typename T>
void rsvector<T>::wa(
size_type c,
const T &e) {
1080 GMM_ASSERT2(c < nbl,
"out of range");
1082 elt_rsvector_<T> ev(c, e);
1083 if (nb_stored() == 0) {
1084 base_type_::push_back(ev);
1087 iterator it = std::lower_bound(this->begin(), this->end(), ev);
1088 if (it != this->end() && it->c == c) it->e += e;
1090 size_type ind = it - this->begin(), nb = this->nb_stored();
1091 if (nb - ind > 1100)
1092 GMM_WARNING2(
"Inefficient addition of element in rsvector with "
1093 << this->nb_stored() - ind <<
" non-zero entries");
1094 base_type_::push_back(ev);
1096 it = this->begin() + ind;
1097 iterator ite = this->end(); --ite; iterator itee = ite;
1098 for (; ite != it; --ite) { --itee; *ite = *itee; }
1106 template <
typename T> T rsvector<T>::r(
size_type c)
const {
1107 GMM_ASSERT2(c < nbl,
"out of range. Index " << c
1108 <<
" for a length of " << nbl);
1109 if (nb_stored() != 0) {
1110 elt_rsvector_<T> ev(c);
1111 const_iterator it = std::lower_bound(this->begin(), this->end(), ev);
1112 if (it != this->end() && it->c == c)
return it->e;
1117 template <
typename T>
struct linalg_traits<rsvector<T> > {
1118 typedef rsvector<T> this_type;
1119 typedef this_type origin_type;
1120 typedef linalg_false is_reference;
1121 typedef abstract_vector linalg_type;
1122 typedef T value_type;
1123 typedef ref_elt_vector<T, rsvector<T> > reference;
1124 typedef rsvector_iterator<T> iterator;
1125 typedef rsvector_const_iterator<T> const_iterator;
1126 typedef abstract_sparse storage_type;
1127 typedef linalg_true index_sorted;
1128 static size_type size(
const this_type &v) {
return v.size(); }
1129 static iterator begin(this_type &v) {
return iterator(v.begin()); }
1130 static const_iterator begin(
const this_type &v)
1131 {
return const_iterator(v.begin()); }
1132 static iterator end(this_type &v) {
return iterator(v.end()); }
1133 static const_iterator end(
const this_type &v)
1134 {
return const_iterator(v.end()); }
1135 static origin_type* origin(this_type &v) {
return &v; }
1136 static const origin_type* origin(
const this_type &v) {
return &v; }
1137 static void clear(origin_type* o,
const iterator &,
const iterator &)
1139 static void do_clear(this_type &v) { v.clear(); }
1140 static value_type access(
const origin_type *o,
const const_iterator &,
1143 static reference access(origin_type *o,
const iterator &,
const iterator &,
1149 template<
typename T> std::ostream &
operator <<
1150 (std::ostream &o,
const rsvector<T>& v) { gmm::write(o,v);
return o; }
1154 template <
typename T>
inline void copy(
const rsvector<T> &v1,
1156 GMM_ASSERT2(vect_size(v1) == vect_size(v2),
"dimensions mismatch");
1159 template <
typename T>
inline
1160 void copy(
const rsvector<T> &v1,
const simple_vector_ref<rsvector<T> *> &v2){
1161 simple_vector_ref<rsvector<T> *>
1162 *svr =
const_cast<simple_vector_ref<rsvector<T> *
> *>(&v2);
1164 *pv =
const_cast<rsvector<T> *
>((v2.origin));
1165 GMM_ASSERT2(vect_size(v1) == vect_size(v2),
"dimensions mismatch");
1166 *pv = v1; svr->begin_ = vect_begin(*pv); svr->end_ = vect_end(*pv);
1168 template <
typename T>
inline
1169 void copy(
const simple_vector_ref<
const rsvector<T> *> &v1,
1171 {
copy(*(v1.origin), v2); }
1172 template <
typename T>
inline
1173 void copy(
const simple_vector_ref<rsvector<T> *> &v1, rsvector<T> &v2)
1174 {
copy(*(v1.origin), v2); }
1176 template <
typename V,
typename T>
inline void add(
const V &v1,
1178 if ((
const void *)(&v1) != (
const void *)(&v2)) {
1179 GMM_ASSERT2(vect_size(v1) == vect_size(v2),
"dimensions mismatch");
1180 add_rsvector(v1, v2,
typename linalg_traits<V>::storage_type());
1184 template <
typename V,
typename T>
1185 inline void add_rsvector(
const V &v1, rsvector<T> &v2, abstract_dense)
1186 {
add(v1, v2, abstract_dense(), abstract_sparse()); }
1188 template <
typename V,
typename T>
1189 inline void add_rsvector(
const V &v1, rsvector<T> &v2, abstract_skyline)
1190 {
add(v1, v2, abstract_skyline(), abstract_sparse()); }
1192 template <
typename V,
typename T>
1193 void add_rsvector(
const V &v1, rsvector<T> &v2, abstract_sparse) {
1194 add_rsvector(v1, v2,
typename linalg_traits<V>::index_sorted());
1197 template <
typename V,
typename T>
1198 void add_rsvector(
const V &v1, rsvector<T> &v2, linalg_false) {
1199 add(v1, v2, abstract_sparse(), abstract_sparse());
1202 template <
typename V,
typename T>
1203 void add_rsvector(
const V &v1, rsvector<T> &v2, linalg_true) {
1204 typename linalg_traits<V>::const_iterator it1 = vect_const_begin(v1),
1205 ite1 = vect_const_end(v1);
1206 typename rsvector<T>::iterator it2 = v2.begin(), ite2 = v2.end(), it3;
1207 size_type nbc = 0, old_nbc = v2.nb_stored();
1208 for (; it1 != ite1 && it2 != ite2 ; ++nbc)
1209 if (it1.index() == it2->c) { ++it1; ++it2; }
1210 else if (it1.index() < it2->c) ++it1;
else ++it2;
1211 for (; it1 != ite1; ++it1) ++nbc;
1212 for (; it2 != ite2; ++it2) ++nbc;
1214 v2.base_resize(nbc);
1215 it3 = v2.begin() + old_nbc;
1219 ite1 = vect_const_begin(v1);
1220 while (it1 != ite1 && it2 != ite2 && it3 != ite2){
1224 if (it3->c > it1.index()) {
1228 else if (it3->c == it1.index()) {
1233 it2->c = it1.index();
1234 it2->e = *it1; ++it3;
1237 while (it1 != ite1 && it2 != ite2) {
1240 it2->c = it1.index();
1245 template <
typename V,
typename T>
void copy(
const V &v1, rsvector<T> &v2) {
1246 if ((
const void *)(&v1) != (
const void *)(&v2)) {
1247 GMM_ASSERT2(vect_size(v1) == vect_size(v2),
"dimensions mismatch");
1248 if (same_origin(v1, v2))
1249 GMM_WARNING2(
"a conflict is possible in vector copy\n");
1250 copy_rsvector(v1, v2,
typename linalg_traits<V>::storage_type());
1254 template <
typename V,
typename T>
1255 void copy_rsvector(
const V &v1, rsvector<T> &v2, abstract_dense)
1256 { copy_vect(v1, v2, abstract_dense(), abstract_sparse()); }
1258 template <
typename V,
typename T>
1259 void copy_rsvector(
const V &v1, rsvector<T> &v2, abstract_skyline)
1260 { copy_vect(v1, v2, abstract_skyline(), abstract_sparse()); }
1262 template <
typename V,
typename T>
1263 void copy_rsvector(
const V &v1, rsvector<T> &v2, abstract_sparse) {
1264 copy_rsvector(v1, v2,
typename linalg_traits<V>::index_sorted());
1267 template <
typename V,
typename T2>
1268 void copy_rsvector(
const V &v1, rsvector<T2> &v2, linalg_true) {
1269 typedef typename linalg_traits<V>::value_type T1;
1270 typename linalg_traits<V>::const_iterator it = vect_const_begin(v1),
1271 ite = vect_const_end(v1);
1272 v2.base_resize(
nnz(v1));
1273 typename rsvector<T2>::iterator it2 = v2.begin();
1275 for (; it != ite; ++it)
1276 if ((*it) != T1(0)) { it2->c = it.index(); it2->e = *it; ++it2; ++nn; }
1280 template <
typename V,
typename T2>
1281 void copy_rsvector(
const V &v1, rsvector<T2> &v2, linalg_false) {
1282 typedef typename linalg_traits<V>::value_type T1;
1283 typename linalg_traits<V>::const_iterator it = vect_const_begin(v1),
1284 ite = vect_const_end(v1);
1285 v2.base_resize(
nnz(v1));
1286 typename rsvector<T2>::iterator it2 = v2.begin();
1288 for (; it != ite; ++it)
1289 if ((*it) != T1(0)) { it2->c = it.index(); it2->e = *it; ++it2; ++nn; }
1291 std::sort(v2.begin(), v2.end());
1294 template <
typename T>
inline void clean(rsvector<T> &v,
double eps) {
1295 typedef typename number_traits<T>::magnitude_type R;
1296 typename rsvector<T>::iterator it = v.begin(), ite = v.end();
1297 for (; it != ite; ++it)
if (gmm::abs((*it).e) <= eps)
break;
1299 typename rsvector<T>::iterator itc = it;
1301 for (++it; it != ite; ++it)
1302 { *itc = *it;
if (gmm::abs((*it).e) <= R(eps)) ++erased;
else ++itc; }
1303 v.base_resize(v.nb_stored() - erased);
1307 template <
typename T>
1308 inline void clean(
const simple_vector_ref<rsvector<T> *> &l,
double eps) {
1309 simple_vector_ref<rsvector<T> *>
1310 *svr =
const_cast<simple_vector_ref<rsvector<T> *
> *>(&l);
1312 *pv =
const_cast<rsvector<T> *
>((l.origin));
1314 svr->begin_ = vect_begin(*pv); svr->end_ = vect_end(*pv);
1317 template <
typename T>
1318 inline size_type nnz(
const rsvector<T>& l) {
return l.nb_stored(); }
1326 template<
typename T>
struct slvector_iterator {
1327 typedef T value_type;
1329 typedef T &reference;
1330 typedef ptrdiff_t difference_type;
1331 typedef std::random_access_iterator_tag iterator_category;
1333 typedef slvector_iterator<T> iterator;
1334 typedef typename std::vector<T>::iterator base_iterator;
1340 iterator &operator ++()
1341 { ++it; ++shift;
return *
this; }
1342 iterator &operator --()
1343 { --it; --shift;
return *
this; }
1344 iterator operator ++(
int)
1345 { iterator tmp = *
this; ++(*(
this));
return tmp; }
1346 iterator operator --(
int)
1347 { iterator tmp = *
this; --(*(
this));
return tmp; }
1348 iterator &operator +=(difference_type i)
1349 { it += i; shift += i;
return *
this; }
1350 iterator &operator -=(difference_type i)
1351 { it -= i; shift -= i;
return *
this; }
1352 iterator operator +(difference_type i)
const
1353 { iterator tmp = *
this;
return (tmp += i); }
1354 iterator operator -(difference_type i)
const
1355 { iterator tmp = *
this;
return (tmp -= i); }
1356 difference_type operator -(
const iterator &i)
const
1357 {
return it - i.it; }
1359 reference operator *()
const
1361 reference operator [](
int ii)
1362 {
return *(it + ii); }
1364 bool operator ==(
const iterator &i)
const
1365 {
return it == i.it; }
1366 bool operator !=(
const iterator &i)
const
1367 {
return !(i == *
this); }
1368 bool operator < (
const iterator &i)
const
1369 {
return it < i.it; }
1370 size_type index()
const {
return shift; }
1372 slvector_iterator() {}
1373 slvector_iterator(
const base_iterator &iter,
size_type s)
1374 : it(iter), shift(s) {}
1377 template<
typename T>
struct slvector_const_iterator {
1378 typedef T value_type;
1379 typedef const T *pointer;
1380 typedef value_type reference;
1381 typedef ptrdiff_t difference_type;
1382 typedef std::random_access_iterator_tag iterator_category;
1384 typedef slvector_const_iterator<T> iterator;
1385 typedef typename std::vector<T>::const_iterator base_iterator;
1391 iterator &operator ++()
1392 { ++it; ++shift;
return *
this; }
1393 iterator &operator --()
1394 { --it; --shift;
return *
this; }
1395 iterator operator ++(
int)
1396 { iterator tmp = *
this; ++(*(
this));
return tmp; }
1397 iterator operator --(
int)
1398 { iterator tmp = *
this; --(*(
this));
return tmp; }
1399 iterator &operator +=(difference_type i)
1400 { it += i; shift += i;
return *
this; }
1401 iterator &operator -=(difference_type i)
1402 { it -= i; shift -= i;
return *
this; }
1403 iterator operator +(difference_type i)
const
1404 { iterator tmp = *
this;
return (tmp += i); }
1405 iterator operator -(difference_type i)
const
1406 { iterator tmp = *
this;
return (tmp -= i); }
1407 difference_type operator -(
const iterator &i)
const
1408 {
return it - i.it; }
1410 value_type operator *()
const
1412 value_type operator [](
int ii)
1413 {
return *(it + ii); }
1415 bool operator ==(
const iterator &i)
const
1416 {
return it == i.it; }
1417 bool operator !=(
const iterator &i)
const
1418 {
return !(i == *
this); }
1419 bool operator < (
const iterator &i)
const
1420 {
return it < i.it; }
1421 size_type index()
const {
return shift; }
1423 slvector_const_iterator() {}
1424 slvector_const_iterator(
const slvector_iterator<T>& iter)
1425 : it(iter.it), shift(iter.shift) {}
1426 slvector_const_iterator(
const base_iterator &iter,
size_type s)
1427 : it(iter), shift(s) {}
1433 template <
typename T>
class slvector {
1436 typedef slvector_iterator<T> iterators;
1437 typedef slvector_const_iterator<T> const_iterators;
1439 typedef T value_type;
1442 std::vector<T> data;
1449 size_type size()
const {
return size_; }
1450 size_type first()
const {
return shift; }
1451 size_type last()
const {
return shift + data.size(); }
1452 ref_elt_vector<T, slvector<T> > operator [](size_type c)
1453 {
return ref_elt_vector<T, slvector<T> >(
this, c); }
1455 typename std::vector<T>::iterator data_begin() {
return data.begin(); }
1456 typename std::vector<T>::iterator data_end() {
return data.end(); }
1457 typename std::vector<T>::const_iterator data_begin()
const
1458 {
return data.begin(); }
1459 typename std::vector<T>::const_iterator data_end()
const
1460 {
return data.end(); }
1462 void w(size_type c,
const T &e);
1463 void wa(size_type c,
const T &e);
1464 T r(size_type c)
const {
1465 GMM_ASSERT2(c < size_,
"out of range");
1466 if (c < shift || c >= shift + data.size())
return T(0);
1467 return data[c - shift];
1470 inline T operator [](size_type c)
const {
return r(c); }
1471 void resize(size_type);
1472 void clear() { data.resize(0); shift = 0; }
1473 void swap(slvector<T> &v) {
1474 std::swap(data, v.data);
1475 std::swap(shift, v.shift);
1476 std::swap(size_, v.size_);
1480 slvector() : data(0), shift(0), size_(0) {}
1481 explicit slvector(size_type l) : data(0), shift(0), size_(l) {}
1482 slvector(size_type l, size_type d, size_type s)
1483 : data(d), shift(s), size_(l) {}
1487 template<
typename T>
void slvector<T>::resize(
size_type n) {
1489 if (shift >= n)
clear();
else { data.resize(n-shift); }
1494 template<
typename T>
void slvector<T>::w(
size_type c,
const T &e) {
1495 GMM_ASSERT2(c < size_,
"out of range");
1497 if (!s) { data.resize(1); shift = c; }
1498 else if (c < shift) {
1499 data.resize(s + shift - c);
1500 typename std::vector<T>::iterator it = data.begin(),it2=data.end()-1;
1501 typename std::vector<T>::iterator it3 = it2 - shift + c;
1502 for (; it3 >= it; --it3, --it2) *it2 = *it3;
1503 std::fill(it, it + shift - c, T(0));
1506 else if (c >= shift + s) {
1507 data.resize(c - shift + 1, T(0));
1510 data[c - shift] = e;
1513 template<
typename T>
void slvector<T>::wa(
size_type c,
const T &e) {
1514 GMM_ASSERT2(c < size_,
"out of range");
1516 if (!s) { data.resize(1, e); shift = c;
return; }
1517 else if (c < shift) {
1518 data.resize(s + shift - c);
1519 typename std::vector<T>::iterator it = data.begin(),it2=data.end()-1;
1520 typename std::vector<T>::iterator it3 = it2 - shift + c;
1521 for (; it3 >= it; --it3, --it2) *it2 = *it3;
1522 std::fill(it, it + shift - c, T(0));
1524 data[c - shift] = e;
1527 else if (c >= shift + s) {
1528 data.resize(c - shift + 1, T(0));
1529 data[c - shift] = e;
1533 data[c - shift] += e;
1537 template <
typename T>
struct linalg_traits<slvector<T> > {
1538 typedef slvector<T> this_type;
1539 typedef this_type origin_type;
1540 typedef linalg_false is_reference;
1541 typedef abstract_vector linalg_type;
1542 typedef T value_type;
1543 typedef ref_elt_vector<T, slvector<T> > reference;
1544 typedef slvector_iterator<T> iterator;
1545 typedef slvector_const_iterator<T> const_iterator;
1546 typedef abstract_skyline storage_type;
1547 typedef linalg_true index_sorted;
1548 static size_type size(
const this_type &v) {
return v.size(); }
1549 static iterator begin(this_type &v)
1550 {
return iterator(v.data_begin(), v.first()); }
1551 static const_iterator begin(
const this_type &v)
1552 {
return const_iterator(v.data_begin(), v.first()); }
1553 static iterator end(this_type &v)
1554 {
return iterator(v.data_end(), v.last()); }
1555 static const_iterator end(
const this_type &v)
1556 {
return const_iterator(v.data_end(), v.last()); }
1557 static origin_type* origin(this_type &v) {
return &v; }
1558 static const origin_type* origin(
const this_type &v) {
return &v; }
1559 static void clear(origin_type* o,
const iterator &,
const iterator &)
1561 static void do_clear(this_type &v) { v.clear(); }
1562 static value_type access(
const origin_type *o,
const const_iterator &,
1565 static reference access(origin_type *o,
const iterator &,
const iterator &,
1571 template<
typename T> std::ostream &
operator <<
1572 (std::ostream &o,
const slvector<T>& v) { gmm::write(o,v);
return o; }
1574 template <
typename T>
1575 inline size_type nnz(
const slvector<T>& l) {
return l.last() - l.first(); }