Developer documentation

array.hpp
Go to the documentation of this file.
1 /*********************************************************************
2 * This file is part of the source code of realroot kernel. *
3 * Author(s): B. Mourrain, GALAAD, INRIA *
4 **********************************************************************/
6 #ifndef realroot_array_hpp
7 #define realroot_array_hpp
8 //------------------------------------------------------------------------
9 #include <cassert>
10 #include <realroot/assign.hpp>
11 //======================================================================
12 namespace mmx {
13 //======================================================================
14 
35 namespace array {
36  //----------------------------------------------------------------------
38  template <class OS, class R>
39  inline OS & print(OS & os, const R & v) {
40  os <<"[";
41  typename R::const_iterator i=v.begin();
42  if (v.size()){
43  os<<*i; ++i;
44  for(; i != v.end(); ++i) {os <<", "; os<<*i;}
45  }
46  os <<"]";
47  return os;
48  }
49  //----------------------------------------------------------------------
51  template <class OS, class R>
52  inline OS & print(OS & os, const R & v, unsigned sz) {
53  os <<"[";
54  unsigned i=0;
55  if (sz){
56  os<<v[i]; ++i;
57  for(; i <sz; ++i) os <<","<<v[i];
58  }
59  os <<"]";
60  return os;
61  }
62  //----------------------------------------------------------------------
67  template <class IS, class R>
68  inline IS & read(IS & is, R & V) {
69  typedef typename R::size_type size_type;
70  size_type s;
71  is >> s;
72  V.rep().resize(s);
73  for(size_type i=0; i< s; ++i) is >> V[i];
74  return(is);
75  }
76  //----------------------------------------------------------------------
77 
78  template <class V1, class V2> inline
79  bool equal_n( const V1& v1, const V2 & v2, int n )
80  {
81  int i=0;
82  while(i < n && v1[i] == v2[i]) i++;
83  return i == n;
84  };
85 
87  template <class V1, class V2> inline
88  bool equal(const V1 & v1, const V2 & v2)
89  { return (v1.size() == v2.size()) && equal_n(v1,v2,v1.size()); }
90 
91 
92  //----------------------------------------------------------------------
93  template <class V, class C> inline
94  void init_n(V & a, const C & v, int n ) {
95  for ( int i = 0; i < n; a[i] = v, i ++ ) {} };
96 
98  template <class V, class C>
99  void set_cst(V & a, const C & v ) { init_n(a,v,(int)a.size()); };
100 
101 
102  template <class V, class W>
103  void set(V & a, const W & b ) {for ( int i = 0; i < (int)a.size(); a[i] = b[i], i ++ ) {} };
104 
105  //----------------------------------------------------------------------
107  template <class V>
108  void reverse_n( V & v, int a, int n )
109  {
110  int k = n - a;
111  for ( int i = 0; i < k/2; std::swap(v[a+i],v[k-1-i]), i ++ ) {}
112  };
113 
114  template <class V>
115  void reverse( V & v, int n ) { reverse_n( v, 0, n ); };
116 
118  template <class V,class I>
119  void reverse(V & v, I d) {
120  for(I i=0;i<d/2; std::swap(v[i],v[d-1-i]),++i) {}
121  }
122 
123  //----------------------------------------------------------------------
124  template<class V, class W> inline
125  void neg_range( V & r, const W & w, int a, int b ) {
126  for ( int i = a; i < b; r[i] = -w[i], i++ ) {}
127  }
128  template<class V, class W> inline
129  void neg_range( V & r, int a, int b )
130  { for ( int i = a; i < b; r[i] = -r[i], i++ ){} };
131 
132  template<class VI> inline
133  void neg_i( VI a, VI eda ) { for ( ; a != eda; *a = -(*a), a++ ){} };
134  template<class VI> inline
135  void neg_i( VI a, VI eda, VI b ) { for ( ; a != eda; *a = -(*b), a++, b++ ){} };
136  template<class V> inline
137  void neg( V & v ) { neg_i(v.begin(),v.end()); };
138  template<class V> inline
139  void neg( V & a, const V & b )
140  {
141  a.resize( b.size() );
142  neg_i( a.begin(), a.end(), b.begin() );
143  };
144 
145  template<class V, class W> inline
146  void copy_range( V & v, const W & w, int a, int b ) { for ( int i = a; i < b; v[i] = w[i], i ++ ){} }
147  template< class V, class W >
148  void add_n(V & a, const W & b, int n ) {for ( int i = 0; i < n; a[i] += b[i], i ++ ){} }
149  template<class VI, class WI>
150  void add_i( VI a, VI ea, WI b ) { for ( ; a != ea; *a += *b, ++a, ++b ){} };
151  //----------------------------------------------------------------------
153  template <class V, class W>
154  void add(V & a, const W & b)
155  {
156  int asz, bsz;
157  asz = a.size(), bsz = b.size();
158  if ( asz < bsz )
159  {
160  a.resize(bsz);
161  add_i(a.begin(),a.end(),b.begin());
162  copy_range(a,b,asz,bsz);
163  }
164  else
165  {
166  // PRINT_DEBUG("add");
167  add_n(a,b,bsz);
168  // add_i(a.begin(),a.begin()+bsz,b.begin());
169  }
170  }
171 
172  template< class V, class W, class X > inline
173  void add_n(V & a, const W & b, const X& c, int n ) { for ( int i = 0; i < n; a[i] = b[i]+c[i], i ++ ){} };
174 
175  //--------------------------------------------------------------------
178  template <class V, class W,class X>
179  void add_g(V & r, const W & a, const X & b)
180  {
181  int asz, bsz, rsz;
182  asz = a.size(), bsz = b.size(), rsz = r.size();
183  if ( asz > bsz )
184  {
185  if ( asz > rsz ) r.resize(asz);
186  add_n(r,a,b,bsz);
187  copy_range(r,a,bsz,asz);
188  }
189  else
190  {
191  if ( bsz > rsz ) r.resize(bsz);
192  add_n(r,a,b,asz);
193  copy_range(r,b,asz,bsz);
194  };
195  }
196  //--------------------------------------------------------------------
199  template <class V, class W,class X> inline
200  void add(V & r, const W & a, const X & b)
201  {
202  add_g(r,a,b);
203  }
204  //--------------------------------------------------------------------
207  template <class V> inline
208  void add(V & r, const V & a, const V & b)
209  {
210  if(&r==&a) { add(r,b); return; };
211  if(&r==&b) { add(r,a); return; };
212  add_g(r,a,b);
213  }
214  //====================================================================
215  template< class V, class W >
216  void sub_n(V & a, const W & b, int n ) { for ( int i = 0; i < n; a[i] -= b[i], i ++ ){} };
217 
218  //----------------------------------------------------------------------
220  template <class V, class W>
221  void sub(V & a, const W & b)
222  {
223  int asz, bsz;
224  asz = a.size(), bsz = b.size();
225  if ( asz < bsz )
226  {
227  a.resize(bsz);
228  sub_n(a,b,asz);
229  neg_range(a,b,asz,bsz);
230  }
231  else
232  sub_n(a,b,bsz);
233  }
234  //--------------------------------------------------------------------
235  template< class V, class W, class X > inline
236  void sub_n(V & a, const W & b, const X& c, int n ) { for ( int i = 0; i < n; a[i] = b[i]-c[i], i ++ ){} };
237 
238  //--------------------------------------------------------------------
239  template <class V, class W,class X>
240  void sub_g(V & r, const W & a, const X & b)
241  {
242  int asz, bsz, rsz;
243  asz = a.size(), bsz = b.size(), rsz = r.size();
244 
245  if ( asz > bsz )
246  {
247  if ( asz > rsz ) r.resize(asz);
248  sub_n(r,a,b,bsz);
249  copy_range(r,a,bsz,asz);
250  }
251  else
252  {
253  if ( bsz > rsz ) r.resize(bsz);
254  sub_n(r,a,b,asz);
255  neg_range(r,b,asz,bsz);
256  };
257  }
260  template <class V, class W,class X>
261  void sub(V & r, const W & a, const X & b)
262  {
263  sub_g(r,a,b);
264  }
265  //--------------------------------------------------------------------
268  template <class V>
269  void sub(V & r, const V & a, const V & b)
270  {
271  if(&r==&a) { sub(r,b); return; };
272  // if(&r==&b) { sub(r,a); mul_ext(r,-1); return; };
273  sub_g(r,a,b);
274  }
275  //----------------------------------------------------------------------
276  template<class V, class W> inline
277  void mul_ext_n( V & a, const W & c, int n )
278  { for ( int i = 0; i < n; a[i] = a[i]*c, i ++ ){} };
279  template<class V, class W, class S> inline
280  void mul_ext_n( V & a, const W & b, const S& c, int n )
281  { for ( int i = 0; i < n; a[i] = b[i]*c, i++ ){} };
282  template<class VI, class W> inline
283  void mul_ext_i( VI bga, VI eda, const W & c )
284  { for ( VI i = bga; i != eda; *i *= c, ++i ){} };
285  template<class VI, class VII, class W> inline
286  void mul_ext_i( VI bga, VI eda, VII bgb, const W & c )
287  { for ( VI a = bga; a != eda; *a = *bgb * c, ++bgb, ++a ){} };
288 
290  template <class V,class W>
291  void mul_ext(V & a, const V & b, const W & c)
292  {
293  if(&a != &b) {
294  a.resize( b.size() );
295  mul_ext_i(a.begin(),a.end(),b.begin(),c);
296  }
297  else
298  mul_ext_i(a.begin(),a.end(),c);
299  }
300  template <class V,class W>
301  void mul_ext(V & a, const W & c) {
302  mul_ext_i(a.begin(),a.end(),c);
303  }
304  //----------------------------------------------------------------------
305  template<class V, class SC> inline
306  void div_ext_n( V & a, const SC & sc, int n )
307  { for ( int i = 0; i < n; a[i] /= sc, i++){} }
308  template<class V1, class V2, class SC>
309  void div_ext_n( V1 & a, const V2 & b, const SC& sc, int n )
310  { for ( int i = 0; i < n; a[i] = b[i]/sc, i ++ ){} };
311  template<class VI, class SC> inline
312  void div_ext_i( VI bga, VI eda, const SC & sc )
313  { for ( ; bga < eda; *bga /= sc, bga++){} }
314  template<class VI, class SC> inline
315  void div_ext_i( VI a, VI eda, VI b, const SC & sc )
316  { for ( ; a < eda; *a = *b / sc, a++, b ++ ){} };
318  template <class V, class SC>
319  void div_ext( V & a, const V & b, const SC & sc)
320  {
321  if(&a != &b) {
322  a.resize( b.size() );
323  div_ext_i(a.begin(),a.end(),b.begin(),sc);
324  }
325  else div_ext_i(a.begin(),a.end(),sc);
326  }
328  template <class V, class W>
329  void div_ext(V & a, const W & c)
330  { div_ext_i(a.begin(),a.end(),c); }
331  //----------------------------------------------------------------------
333  template <class V, class W>
334  void div(V & a, const W & c)
335  {
336  div_ext(a,c);
337  //W tmp(c); for(typename V::iterator it=a.begin(); it !=a.end(); ++it) (*it)/=tmp;
338  }
339 
340  //----------------------------------------------------------------------
341  template <class R, class S, class C> inline
342  void apply_mult(R & result, const S& a, const C & m)
343  {
344  typedef typename S::const_iterator const_iterator;
345  typedef typename R::iterator iterator;
346  result.resize(a.size());
347  const_iterator b=a.begin(); iterator i=result.begin();
348  for(; b!=a.end(); ++i, ++b) *i = (*b) * m;
349  }
350  //----------------------------------------------------------------------
352  template <class C, class R>
353  C norm(const R & v)
354  {
355  C r=0;
356  for(typename R::const_iterator it=v.begin(); it !=v.end(); ++it) r+=(*it)*(*it);
357  return sqrt(r);
358  }
359  //----------------------------------------------------------------------
361  template <class C,class R>
362  C norm(const R & v, int p)
363  {
364  C r=0;
365  for(typename R::const_iterator it=v.begin(); it !=v.end(); ++it) r+=pow(*it,p);
366  return pow(r,1/p);
367  }
368  //----------------------------------------------------------------------
370  template <class R, class S>
371  typename R::value_type innerprod_n( const S & v, const R & w, unsigned n )
372  {
373  typename R::value_type r = 0;
374  for ( unsigned i = 0; i < n; r += v[i]*w[i], i++ ) {}
375  return r;
376  };
377 
378  template <class R, class S>
379  typename R::value_type innerprod(const S & v, const R & w)
380  {
381  typename R::value_type r =0;
382  for(unsigned int i=0; i <v.size(); i++){r += (v[i]*w[i]);}
383  return r;
384  }
385  //--------------------------------------------------------------------
386  template<class R>
387  typename R::value_type max_abs(const R& v)
388  {
389  typename R::value_type r=0;
390  for(unsigned i=0; i <(unsigned)v.size(); i++)
391  {
392  if(r>v[i]) r=v[i];
393  else if(r>-v[i]) r=-v[i];
394  }
395  return r;
396  }
397 
398  //--------------------------------------------------------------------
399  template<class U, class R>
400  void lcm_denominator(U& r, const R& v)
401  {
402  for(unsigned i=0; i <v.size(); i++)
403  {
404  r = lcm(r,denominator(v[i]));
405  }
406  }
407  //----------------------------------------------------------------------
408  /* Replace R by its reverse */
409  template < typename V> inline
410  void reverse(V & v)
411  {
412  unsigned sz = v.size();
413  V temp(v);
414  for (unsigned i = 0; i < sz; ++i)
415  v[i] = temp[sz-1-i];
416 }
417 
418  template<class Ia, class Ib> inline
419  void assign_i( Ia a, Ia eda, Ib b )
420  {
421  for ( ; a != eda; ++a, ++b ) let::assign(*a,*b);
422  };
423 
424  template<class Ra, class Rb> inline
425  void assign( Ra & a, const Rb & b )
426  {
427  a.resize( b.size() );
428  assign_i( a.begin(), a.end(), b.begin() );
429  };
430 
431  template<class R, class C> inline
432  void vaddsc( R & r, const C & x )
433  { for ( typename R::iterator i = r.begin(); i != r.end(); *i += x, i ++ ){} };
434 
435 } //CLOSE
436 
437 
438 //======================================================================
439 } // namespace mmx
440 //======================================================================
441 #endif // realroot_LINALG_VECTOR_H
442 
void set_cst(V &a, const C &v)
Set all the entries of a to the values v.
Definition: array.hpp:99
void apply_mult(R &result, const S &a, const C &m)
Definition: array.hpp:342
T pow(const T &a, int i)
Definition: binomials.hpp:12
const C & b
Definition: Interval_glue.hpp:25
TMPL X
Definition: polynomial_operators.hpp:148
void mul_ext(V &a, const V &b, const W &c)
Scalar multiplication.
Definition: array.hpp:291
const Interval & I
Definition: Interval_glue.hpp:49
MP swap(const MP &P, int var_i, int var_j)
Definition: sparse_monomials.hpp:988
void sub_g(V &r, const W &a, const X &b)
Definition: array.hpp:240
bool equal_n(const V1 &v1, const V2 &v2, int n)
Definition: array.hpp:79
C norm(const R &v)
The $L_{2}$ norm for vectors.
Definition: array.hpp:353
void add_n(V &a, const W &b, int n)
Definition: array.hpp:148
void assign_i(Ia a, Ia eda, Ib b)
Definition: array.hpp:419
R::value_type innerprod(const S &v, const R &w)
Definition: array.hpp:379
void copy_range(V &v, const W &w, int a, int b)
Definition: array.hpp:146
void reverse(V &v, int n)
Definition: array.hpp:115
R::value_type innerprod_n(const S &v, const R &w, unsigned n)
Innerproduct of two vectors.
Definition: array.hpp:371
void neg_i(VI a, VI eda)
Definition: array.hpp:133
IS & read(IS &is, R &V)
Definition: array.hpp:68
void lcm_denominator(U &r, const R &v)
Definition: array.hpp:400
void reverse_n(V &v, int a, int n)
Reverse the entries of v, from the index a to n-1.
Definition: array.hpp:108
void neg(V &v)
Definition: array.hpp:137
void mul_ext_i(VI bga, VI eda, const W &c)
Definition: array.hpp:283
void sub(V &a, const W &b)
Substraction of two vectors.
Definition: array.hpp:221
scalar< T > sqrt(const scalar< T > &b)
Definition: scalar.hpp:501
void set(V &a, const W &b)
Definition: array.hpp:103
void add(V &a, const W &b)
Addition of two vectors.
Definition: array.hpp:154
void neg_range(V &r, const W &w, int a, int b)
Definition: array.hpp:125
void sub_n(V &a, const W &b, int n)
Definition: array.hpp:216
bool equal(const V1 &v1, const V2 &v2)
Definition: array.hpp:88
ZZ denominator(const QQ &a)
Definition: GMPXX.hpp:96
void add_i(VI a, VI ea, WI b)
Definition: array.hpp:150
void mul_ext_n(V &a, const W &c, int n)
Definition: array.hpp:277
void init_n(V &a, const C &v, int n)
Definition: array.hpp:94
const C & c
Definition: Interval_glue.hpp:45
double C
Definition: solver_mv_fatarcs.cpp:16
void vaddsc(R &r, const C &x)
Definition: array.hpp:432
void div_ext_n(V &a, const SC &sc, int n)
Definition: array.hpp:306
void div(V &a, const W &c)
Inplace scalar division.
Definition: array.hpp:334
void assign(A &a, const B &b)
Generic definition of the assignement function.
Definition: assign.hpp:97
Definition: array.hpp:12
void div_ext_i(VI bga, VI eda, const SC &sc)
Definition: array.hpp:312
R::value_type max_abs(const R &v)
Definition: array.hpp:387
OS & print(OS &os, const R &v)
Output function for general vectors: [v1, v2, ...].
Definition: array.hpp:39
void add_g(V &r, const W &a, const X &b)
Definition: array.hpp:179
ZZ lcm(const ZZ &a, const ZZ &b)
Definition: GMPXX.hpp:58
void assign(Ra &a, const Rb &b)
Definition: array.hpp:425
void div_ext(V &a, const V &b, const SC &sc)
Scalar division.
Definition: array.hpp:319
Home