Developer documentation

tensor_vctops.hpp
Go to the documentation of this file.
1 #ifndef realroot_MPOLDSE_VCTOPS_H
2 #define realroot_MPOLDSE_VCTOPS_H
3 #include <iostream>
4 #include <realroot/texp_sup.hpp>
6 
7 namespace mmx {
8 
9 namespace vct
10 {
11 
12  template<typename A, typename B> inline
13  void padd( A * a, const B * b, unsigned sz, int sta = 1, int stb = 1 )
14  {
15  for ( A * ea = a; ea != a+sz*sta; *ea += *b , ea += sta, b += stb ) {}
16  };
17 
18  template<typename A, typename B, typename C> inline
19  void padd( A * a, const B * b, const C * c, unsigned sz,
20  int sta = 1, int stb = 1, int stc = 1 )
21  {
22  for ( A * ea = a; ea != a+sz*sta; *ea = *b+*c, ea += sta, b += stb, c += stc ) ;
23  };
24 
25  template<typename A, typename B> inline
26  void psub( A * a, const B * b, unsigned sz, int sta = 1, int stb = 1 )
27  {
28  for ( A * ea = a; ea != a+sz*sta; *ea -= *b, ea += sta, b += stb ) ;
29  };
30 
31  template<typename A, typename B, typename C> inline
32  void psub( A * a, const B * b, const C * c, unsigned sz, int sta = 1, int stb = 1, int stc = 1 )
33  {
34  for ( A * ea = a; ea != a+sz*sta; *ea = *b-*c, ea += sta, b += stb, c += stc ) ;
35  };
36 
37  template<typename A, typename B> inline
38  void pmul( A * a, const B * b, int sz, int sta = 1, int stb = 1 )
39  {
40  for ( A * ea = a; ea != a+sz*sta; *ea *= *b, ea += sta, b += stb ) ;
41  };
42 
43  template<typename A, typename B, typename C> inline
44  void pmul( A * a, const B * b, const C * c, unsigned sz, int sta = 1, int stb = 1, int stc = 1 )
45  {
46  for ( A * ea = a; ea != a+sz*sta; *ea = *b**c, ea += sta, b += stb, c += stc ) ;
47  };
48 
49  template<typename A, typename B> inline
50  void pdiv( A * a, const B * b, unsigned sz, int sta = 1, int stb = 1 )
51  {
52  for ( A * ea = a; ea != a+sz*sta; *ea /= *b, ea += sta, b += stb ) ;
53  };
54 
55  template<typename A, typename B, typename C> inline
56  void pdiv( A * a, const B * b, const C * c, unsigned sz, int sta = 1, int stb = 1, int stc = 1 )
57  {
58  for ( A * ea = a; ea != a+sz*sta; *ea = *b/(*c), ea += sta, b += stb, c += stc ) ;
59  };
60 
61  template<typename A, typename B> inline
62  void scadd( A * a, const B& b, unsigned n, int s = 1 )
63  {
64  for ( A * ea = a; ea != a + n*s; *a += b, ea += s ) ;
65  };
66 
67  template<typename A, typename B, typename C> inline
68  void scadd( A * a, const B * b, const C& c, unsigned n, int sa = 1, int sb = 1 )
69  {
70  for ( A * ea = a; ea != a + n*sa; *ea = *b + c, ea += sa, b += sb ) ;
71  };
72 
73  template<typename A, typename B> inline
74  void scsub( A * a, const B& b, unsigned n, int s = 1 )
75  {
76  for ( A * ea = a; ea != a + n*s; *ea -= b, ea += s ) ;
77  };
78 
79  template<typename A, typename B> inline
80  void scsub( const B& b, A * a, unsigned n, int s = 1 )
81  {
82  for ( A * ea = a; ea != a+n*s; *ea = b-*ea, ea += s ) ;
83  }
84 
85  template<typename A, typename B, typename C> inline
86  void scsub( A * a, const B * b, const C& c, unsigned n, int sa = 1, int sb = 1 )
87  {
88  for ( A * ea = a; ea != a+n*sa; *ea = *b-c, ea += sa, b += sb ) ;
89  }
90 
91  template<typename A, typename B, typename C> inline
92  void scsub( A * a, const B& b, const C * c, unsigned n, int sa = 1, int sb = 1 )
93  {
94  for ( A * ea = a; ea != a+n*sa; *ea = c-*b, ea += sa, b += sb ) ;
95  };
96 
97  template<typename A, typename B> inline
98  void scmul( A * a, const B& b, unsigned n, int s = 1 )
99  {
100  for ( A * ea = a; ea != a+n*s; *ea *= b, ea += s ) ;
101  }
102 
103  template<typename A, typename B, typename C> inline
104  void scmul( A * a, const B * b, const C& c, unsigned n, int sa = 1, int sb = 1 )
105  {
106  for ( A * ea = a; ea != a + n*sa; *ea = *b*c, ea += sa, b += sb ) ;
107  }
108 
109  template<typename A, typename B, typename C> inline
110  void scmul( A * a, const A * _a, const B * b, const C& c )
111  {
112  for ( A * ea = a; ea != _a; *ea++ = *b++*c ) ;
113  }
114 
115  template<typename A, typename B> inline
116  void scdiv( A * a, const B& b, unsigned n, int s = 1 )
117  {
118  for ( A * ea = a; ea != a+n*s; *ea /= b, ea += s ) ;
119  }
120 
121  template<typename A, typename B> inline
122  void scdiv( const B& b, A * a, unsigned n, int s = 1 )
123  {
124  for ( A * ea = a; ea != a+n*s; *ea = b/(*ea), ea += s ) ;
125  };
126 
127  template<typename A, typename B, typename C> inline
128  void scdiv( A * a, const B * b, const C& c, unsigned n, int sa = 1, int sb = 1 )
129  {
130  for ( A * ea = a; ea != a + n*sa; *ea = *b/c, ea += sa, b += sb ) ;
131  }
132 
133  template<typename A, typename B, typename C> inline
134  void scdiv( A * a, const C& c, const B * b , unsigned n, int sa = 1, int sb = 1 )
135  {
136  for ( A * ea = a; ea != a + n*sa; *ea = c/(*b), ea += sa, b += sb ) ;
137  }
138 
139  template<typename A, typename B> inline
140  void copy ( A * a, const B * b, unsigned n )
141  {
142  std::copy(b,b+n,a) ;
143  };
144 
145  template<typename A, typename B> inline
146  void copy ( A * a, const B * b, unsigned n, int sa, int sb )
147  {
148  for ( A * ea = a; ea != a + n*sa; *ea = *b, ea += sa, b += sb ) ;
149  };
150 
151  template<class C >
152  void fill( C * a, unsigned n, int s, const C& x )
153  {
154  for ( C * pa = a; pa != a+n*s; *pa = x, pa += s ) ;
155  };
156 
157  template<typename A, typename B> inline
158  void icopy( A * a, unsigned * aadd, unsigned nadd, const B * b )
159  {
160  for ( unsigned * ea = aadd; ea != aadd + nadd; a[*ea++] = *b++ ) ;
161  };
162 
163  template<typename A, typename B> inline
164  void ipadd( A * a, unsigned * aadd, unsigned nadd, const B * b )
165  {
166  for ( unsigned * ea = aadd; ea != aadd + nadd; a[*ea++] += *b++ ) ;
167  };
168 
169  template<typename A, typename B> inline
170  void ipsub( A * a, unsigned * aadd, unsigned nadd, const B * b )
171  {
172  for ( unsigned * ea = aadd; ea != aadd + nadd; a[*ea++] -= *b++ ) ;
173  };
174 
175  /* min - max */
176  template<typename A, typename B> inline
177  void accmin( A& mn, B const * v, unsigned n, int s = 1 )
178  {
179  const B * p;
180  for ( p = v; p != v + n*s; p += s )
181  if ( mn > *p ) mn = *p;
182  };
183 
184  template<typename A, typename B> inline
185  void min( A& mn, B const * v, unsigned n, int s = 1 )
186  {
187  mn = v[0];
188  accmin(mn,v+s,n-1,s) ;
189  };
190 
191  template<typename A, typename B> inline
192  void accmax( A& mx, const B * v, unsigned n, int s = 1 )
193  {
194  const B * p;
195  for ( p = v; p != v+n*s; p += s )
196  if ( mx < *p ) mx = *p;
197  };
198 
199  template<typename A, typename B> inline
200  void max( A& mx, B const * v, unsigned n, int s = 1 )
201  {
202  mx = v[0];
203  accmax(mx,v,n,s) ;
204  };
205  template<typename A> inline
206  void print( const A * p, unsigned n, int st = 1,
207  std::ostream& o = std::cout )
208  {
209  const A * i;
210  o << "[ ";
211  for ( i = p; i != p + (n-1)*st; i += st )
212  o << *i << ", ";
213  o << *i << " ]";
214  };
215 
228  template<class C>
229  void conv( C * r,
230  unsigned nr, int str,
231  const
232  C * a,
233  unsigned na, int sta,
234  const
235  C * b,
236  unsigned nb, int stb )
237  {
238  if ( na < nb ) { conv(r,nr,str,b,nb,stb,a,na,sta); return; };
239  int k, l;
240  C * er;
241  const C * ea, * eb, * eeb, * eea;
242  er = r;
243  eb = b;
244 
245  for ( er = r, eb = b, k = 0; k < std::min(nb,nr); k ++, er += str, eb += stb )
246  for ( eeb = eb, ea = a, *er = 0, l = 0;
247  l <= k;
248  *er += *ea**eeb, l ++, eeb -= stb, ea += sta ) ;
249 
250  for ( ; k < std::min(na,nr) ; k ++, er += str )
251  for ( *er = 0,
252  l = k-nb+1, eeb = b +(nb-1)*stb , ea = a + l*sta;
253  l <= k;
254  *er+= *ea**eeb,
255  l ++, eeb -= stb, ea += sta ) ;
256 
257  for ( ; k < nr; k ++, er += str )
258  for ( *er = 0,
259  l = k-nb+1, eeb = b+(nb-1)*stb, ea = a + l*sta;
260  l < na;
261  *er += *ea**eeb,
262  l ++, eeb -= stb, ea += sta ) ;
263  };
264 
276  template<class C>
277  void accconv( C * r, int str,
278  const C * a, unsigned na, int sta,
279  const C * b, unsigned nb, int stb )
280  {
281  C * er;
282  const C * ea, * eb;
283  for ( ea = a; ea != a + na*sta; ea += sta, r += str )
284  for ( er = r, eb = b; eb != b + nb*stb; eb += stb, er += str )
285  *er += *ea**eb;
286  };
287 
299  template<class C>
300  void conv( C * r, int str,
301  const C * a, unsigned na, int sta,
302  const C * b, unsigned nb, int stb )
303  {
304  C * er;
305  for ( er = r; er != r + (na+nb-1)*str; *er++ = 0 ) ;
306  accconv(r,str,a,na,sta,b,nb,stb);
307  };
308 
316  template<class C> inline
317  void minmax( C& m, C& M, const C * a, unsigned n, unsigned s = 1 )
318  {
319  for ( const C * e = a + n*s-s, m = M = *e; a < e; a += 2*s )
320  {
321  if ( *a > *(a+s) )
322  {
323  if ( *a > M ) M = *a;
324  if ( *(a+s) < m ) m = *(a+s) ;
325  }
326  else
327  {
328  if ( *a > M ) M = *a;
329  if ( *(a+s) < m ) m = *(a+s) ;
330  };
331  };
332  };
333 
334  template<class C> inline
335  unsigned mmerge( C * r, const C* a, const C* b,
336  unsigned na, unsigned nb )
337  {
338  C * er(r);
339  const C * ea(a), * eb(b);
340  a += na;
341  b += nb;
342  for (;;)
343  {
344  while( ea < a && *ea < *eb ) *er++ = *ea++;
345  if ( ea == a ) { std::copy(eb,b,er) ; break; };
346  if ( *ea == *eb ) { *er++ = *ea++; eb++;};
347  while( eb < b && *eb < *ea ) *er++ = *eb++;
348  if ( eb == b ) { std::copy(ea,a,er); break; };
349  if ( *eb == *ea ) { *er++ = *eb++; ea++;};
350  };
351  return er-r;
352  };
353 
354  template<class C> inline
355  void mmerge( C * r, int str,
356  const C * a, unsigned na, int sta,
357  const C * b, unsigned nb, int stb )
358  {
359  C * er(r);
360  const C * ea(a), * eb(b);
361 
362  a += na*sta;
363  b += nb*stb;
364 
365  for (;;)
366  {
367  for (;ea != a && *ea < *eb; *er = *ea, er += str, ea += sta ) ;
368 
369  if ( ea == a )
370  {
371  for ( ; eb != b; *er = *eb, er += str, eb += stb ) ;
372  break;
373  };
374 
375  if ( *ea == *eb )
376  {
377  *er = *ea;
378  er += str;
379  ea += sta;
380  eb += stb;
381  };
382 
383  for (;eb != b && *eb < *ea; *er = *eb, er += str, eb += stb ) ;
384 
385  if ( eb == b )
386  {
387  for ( ; ea != a; *er = *ea, er += str, ea += sta ) ;
388  break;
389  };
390 
391  if ( *eb == *ea )
392  {
393  *er = *eb;
394  er += str;
395  eb += stb;
396  ea += sta;
397  };
398  };
399  return (er - r)/str;
400  };
401 
402 
403 
404  template < class C > static
405  void shift (C * p, const C & c, unsigned n, int is = 1)
406  {
407  int j, k, s;
408  for (s = n, j = 0; j <= s - 2; j++)
409  for (k = s - 2; k >= j; p[k * is] += c * p[k * is + is], k--) ;
410  };
411 
412  template < class C > static
413  void scale (C * p, const C & s, unsigned n, int is = 1)
414  {
415  C pw = s;
416  for (C * cp = p + is; cp != p + n * is; *cp *= pw, pw *= s, cp += is) ;
417  };
418 
419 template<class O, class C, class I> inline
420 void horner( O& o, C const * const c, unsigned n, const I& i, int s = 1 )
421 {
422  o = O(0);
423  for ( int p = (n-1)*s; p != 0; o += as<O>(c[p]), o *= i, p -= s ) ;
424  o+= as<O>(c[0]);
425 };
426 
427 template<typename C, typename I> inline typename texp::sup<C,I>::T
428 horner( C const * const c, unsigned n, const I& i, int s = 1 )
429 {
430  typename texp::ringof<C,I>::T o(0);
431  horner(o,c,n,i,s);
432  return o;
433 };
434 
435 template<class O, class C, class I> inline
436 void hhorner( O& o, C const * const c, unsigned n, const I& i, const I&i0, int s = 1 )
437 {
438  o = O(c[(n-1)*s]);
439  for ( int p = (n-2)*s; p >= 0; o *= i, o += O(c[p])*i0, p -= s ) ;
440 };
441 
442 
443 template<typename C, typename I> inline typename texp::sup<C,I>::T
444 hhorner( C const * const c, unsigned n, const I& i, const I&i0, int s = 1 )
445 {
446  typename texp::ringof<C,I>::T o(0);
447  hhorner(o,c,n,i,i0,s) ;
448  return o;
449 };
450 
451 
452 template<typename C> inline
453 void diff( C * dst, C const * const src, unsigned sz, int st = 1 )
454 {
455  for ( unsigned i = 0; i < sz-1; dst[i*st] = (i+1)*src[(i+1)*st], i++ ) ;
456 };
457 
458 template<typename C, typename I>
459 void decasteljau( C * c, unsigned n, const I& i, int s = 1 )
460 {
461  C *ec, *p;
462  for ( ec = c + (n-1)*s; ec != c; ec -= s )
463  for ( p = c; p != ec; p += s )
464  *p = (1.0-i)**p+i**(p+s) ;
465 };
466 
467 template<class O, class C, class I> inline
468 void dhorner( O& p, O& dp, C const * const c, unsigned n, const I& t, int s = 1 )
469 {
470  p = c[n-1], dp = 0.0;
471  for ( int j = (n-2)*s; j >=0; dp=dp*t+p, p=p*t+c[j], j -= s ) ;
472 };
473 
474 
475 template<class A>
476 void inverses( A * a, A * ea ) { for ( ;a != ea; *a++ = 1/(*a) ) ; };
477 
478 
479  template<typename real_t>
480  real_t min( real_t const * src, int sz, int st = 1 )
481  {
482  real_t r = src[0];
483  for ( int p = st; p != sz*st; p += st ) if ( r > src[p] ) r = src[p];
484  return r;
485  };
486 
487  template<typename real_t>
488  real_t max( real_t const * src, int sz, int st = 1 )
489  {
490  real_t r = src[0];
491  for ( int p = st; p != sz*st; p += st ) if ( r < src[p] ) r = src[p];
492  return r;
493  };
494 
495 
496 
497 
498 };
499 
500 } //namespace mmx
501 
502 #endif
unsigned mmerge(C *r, const C *a, const C *b, unsigned na, unsigned nb)
Definition: tensor_vctops.hpp:335
void inverses(A *a, A *ea)
Definition: tensor_vctops.hpp:476
void min(A &mn, B const *v, unsigned n, int s=1)
Definition: tensor_vctops.hpp:185
void ipsub(A *a, unsigned *aadd, unsigned nadd, const B *b)
Definition: tensor_vctops.hpp:170
void accmin(A &mn, B const *v, unsigned n, int s=1)
Definition: tensor_vctops.hpp:177
void hhorner(O &o, C const *const c, unsigned n, const I &i, const I &i0, int s=1)
Definition: tensor_vctops.hpp:436
void scdiv(A *a, const B &b, unsigned n, int s=1)
Definition: tensor_vctops.hpp:116
void fill(C *a, unsigned n, int s, const C &x)
Definition: tensor_vctops.hpp:152
void diff(C *dst, C const *const src, unsigned sz, int st=1)
Definition: tensor_vctops.hpp:453
const C & b
Definition: Interval_glue.hpp:25
void shift(IntervalData< RT, Poly > &ID, const RT &a)
Definition: contfrac_intervaldata.hpp:257
const Interval & I
Definition: Interval_glue.hpp:49
void conv(C *r, unsigned nr, int str, const C *a, unsigned na, int sta, const C *b, unsigned nb, int stb)
Definition: tensor_vctops.hpp:229
void ipadd(A *a, unsigned *aadd, unsigned nadd, const B *b)
Definition: tensor_vctops.hpp:164
void copy(A *a, const B *b, unsigned n)
Definition: tensor_vctops.hpp:140
sfirstnn< typename ringof_< _X, _Y >::T, KXY, KYX, typename sup< X, Y >::T >::T T
Definition: texp_ringof.hpp:81
void accconv(C *r, int str, const C *a, unsigned na, int sta, const C *b, unsigned nb, int stb)
Definition: tensor_vctops.hpp:277
void scsub(A *a, const B &b, unsigned n, int s=1)
Definition: tensor_vctops.hpp:74
void dhorner(O &p, O &dp, C const *const c, unsigned n, const I &t, int s=1)
Definition: tensor_vctops.hpp:468
void decasteljau(C *c, unsigned n, const I &i, int s=1)
Definition: tensor_vctops.hpp:459
void icopy(A *a, unsigned *aadd, unsigned nadd, const B *b)
Definition: tensor_vctops.hpp:158
void minmax(C &m, C &M, const C *a, unsigned n, unsigned s=1)
Definition: tensor_vctops.hpp:317
void pmul(A *a, const B *b, int sz, int sta=1, int stb=1)
Definition: tensor_vctops.hpp:38
void copy(A *a, const B *b, unsigned n, int sa, int sb)
Definition: tensor_vctops.hpp:146
#define min(a, b)
Definition: parser_def.c:475
void scadd(A *a, const B &b, unsigned n, int s=1)
Definition: tensor_vctops.hpp:62
void padd(A *a, const B *b, unsigned sz, int sta=1, int stb=1)
Definition: tensor_vctops.hpp:13
void print(const A *p, unsigned n, int st=1, std::ostream &o=std::cout)
Definition: tensor_vctops.hpp:206
const C & c
Definition: Interval_glue.hpp:45
double C
Definition: solver_mv_fatarcs.cpp:16
void pdiv(A *a, const B *b, unsigned sz, int sta=1, int stb=1)
Definition: tensor_vctops.hpp:50
sfirstnn< C, A, B >::T T
Definition: texp_sup.hpp:31
void max(A &mx, B const *v, unsigned n, int s=1)
Definition: tensor_vctops.hpp:200
void accmax(A &mx, const B *v, unsigned n, int s=1)
Definition: tensor_vctops.hpp:192
void psub(A *a, const B *b, unsigned sz, int sta=1, int stb=1)
Definition: tensor_vctops.hpp:26
void horner(O &o, C const *const c, unsigned n, const I &i, int s=1)
Definition: tensor_vctops.hpp:420
Definition: array.hpp:12
void scmul(A *a, const B &b, unsigned n, int s=1)
Definition: tensor_vctops.hpp:98
Home