Developer documentation

loops_brnops.hpp
Go to the documentation of this file.
1 /********************************************************************
2  * This file is part of the source code of the realroot library.
3  * Author(s): J.P. Pavone, GALAAD, INRIA
4  * $Id: brnops.hpp,v 1.1 2005/07/11 10:03:56 jppavone Exp $
5  ********************************************************************/
6 #ifndef realroot_SOLVE_SBDSLV_LOOPS_BRNOPS_H
7 #define realroot_SOLVE_SBDSLV_LOOPS_BRNOPS_H
8 //--------------------------------------------------------------------
9 #include<algorithm>
10 //--------------------------------------------------------------------
11 namespace mmx {
12 //--------------------------------------------------------------------
13 
14 /* boucle unidimensionelle de base pour la representation de bernstein */
15 namespace brnops
16 {
17  /* algorithme de de Casteljau sur place
18  * ------------------------------------
19  * r[i] = (1-t)*r[i] + t*r[i+1]
20  */
21 
22  template<typename real_t>
23  void decasteljau( real_t * r, unsigned sz, const real_t& t, int str = 1 )
24  {
25  real_t *er, *p;
26  for ( er = r + (sz-1)*str; er != r; er -= str )
27  for ( p = r; p != er; p += str )
28  *p = (1.0-t)**p+t**(p+str);
29  };
30 
31  /* algorithme de de Casteljau pour les bissections, t = 1/2
32  * --------------------------------------------------------
33  * r[i] = (r[i]+r[i+1])/2
34  */
35 
36  template<typename real_t>
37  void decasteljau( real_t * r, unsigned sz, int str = 1 )
38  {
39  real_t *er, *p;
40  for ( er = r + (sz-1)*str; er != r; er -= str )
41  for ( p = r; p != er; p += str )
42  *p = (*p+*(p+str))/2.0;
43  };
44 
45  /* évaluation en t */
46  template<typename real_t>
47  real_t eval( real_t const * const src, unsigned sz, const real_t& t, int st = 1 )
48  {
49  real_t tmp[sz];
50  std::copy( src, src + sz, tmp );
51  decasteljau( tmp, sz, t );
52  return tmp[0];
53  };
54 
55  /* évaluation en (1/2) */
56  template<typename real_t>
57  real_t eval( real_t const * const src, unsigned sz, int st = 1 )
58  {
59  real_t tmp[sz];
60  std::copy( src, src + sz, tmp );
61  decasteljau( tmp, sz );
62  return tmp[0];
63  };
64 
65 
66  /* algorithme de de Casteljau, version subdivision
67  * -----------------------------------------------
68  * entrée:
69  * ------
70  * r = coefficients du polynome
71  *
72  * sortie:
73  * ------
74  * r = partie droite [t, 1]
75  * l = partie gauche [0, t]
76  */
77 
78  template<typename real_t>
79  void decasteljau( real_t * r, real_t * l, unsigned sz, const real_t& t, int str = 1, int stl = 1 )
80  {
81  real_t * er, * p;
82  for ( er = r + (sz-1)*str; er != r; er -= str, l += stl )
83  {
84  *l = *r;
85  for ( p = r; p != er; p += str )
86  *p = (1.0-t)**p+t**(p+str);
87  };
88  *l = *r;
89  };
90 
91  /* algorithme de de Casteljau, version subdivision (1/2)
92  * -----------------------------------------------
93  * entrée:
94  * ------
95  * r = coefficients du polynome
96  *
97  * sortie:
98  * ------
99  * r = partie droite [t, 1]
100  * l = partie gauche [0, t]
101  */
102 
103  template<typename real_t>
104  void decasteljau( real_t * r, real_t * l, unsigned sz, int str = 1, int stl = 1 )
105  {
106  real_t * er, * p;
107  er = r + (sz-1)*str;
108  for ( er = r + (sz-1)*str; er != r; er -= str, l += stl )
109  {
110  *l = *r;
111  for ( p = r; p != er; p += str )
112  *p = (*p+*(p+str))/2.0;
113  };
114  *l = *r;
115  };
116 
117  /* restriction à gauche
118  * --------------------
119  * calcul de la representation pour [t,1]
120  */
121 
122  template<typename real_t>
123  void lrestrict( real_t * data, int sz, const real_t& t, int st )
124  { decasteljau(data,sz,t,st); };
125 
126  /* restriction à droite
127  * --------------------
128  * calcul de la representation pour [0,t]
129  */
130 
131  template<typename real_t>
132  void rrestrict( real_t * data, int sz, const real_t& t, int st )
133  { decasteljau( data + (sz-1)*st, sz, (real_t)(real_t(1)-t), -st ); };
134 
135 
136 
137  template<typename real_t>
138  void hodograph( real_t * dst, real_t const * const src, unsigned sz, int st)
139  {
140  int p = 0;
141  for ( unsigned i = 0; i < sz-1; i ++, p += st ) dst[p] = src[p+st]-src[p];
142  };
143 
144  template<typename real_t>
145  void diff( real_t * dst, real_t const * const src, unsigned sz, int sta = 1, int stout = 1)
146  {
147  int pa = 0;
148  int po = 0;
149  for ( unsigned i = 0; i < sz-1; i ++, pa += sta, po += stout )
150  dst[po] = (sz-1)*(src[pa+sta]-src[pa]);
151  };
152 
153 
154  template<typename real_t>
155  bool rockwood_cut( real_t& t, real_t const * b, unsigned sz, int st = 1 )
156  {
157  for ( unsigned i = 0; i < sz-1; i ++ )
158  {
159  if ( b[i*st]*b[(i+1)*st] <= 0 )
160  {
161  real_t d = b[i*st]-b[(i+1)*st];
162  t = (i*d+b[i])/(sz*d);
163  return true;
164  };
165  };
166  return false;
167  };
168  };
169 //--------------------------------------------------------------------
170 } //namespace mmx
171 /********************************************************************/
172 #endif //
void hodograph(real_t *dst, real_t const *const src, unsigned sz, int st)
Definition: loops_brnops.hpp:138
const C & b
Definition: Interval_glue.hpp:25
real_t eval(real_t const *const src, unsigned sz, const real_t &t, int st=1)
Definition: loops_brnops.hpp:47
void decasteljau(real_t *r, unsigned sz, const real_t &t, int str=1)
Definition: loops_brnops.hpp:23
void rrestrict(real_t *data, int sz, const real_t &t, int st)
Definition: loops_brnops.hpp:132
void lrestrict(real_t *data, int sz, const real_t &t, int st)
Definition: loops_brnops.hpp:123
void diff(real_t *dst, real_t const *const src, unsigned sz, int sta=1, int stout=1)
Definition: loops_brnops.hpp:145
TMPL void copy(Polynomial &r, const Polynomial &a)
Copy of a in r.
Definition: sparse_monomials.hpp:613
Definition: array.hpp:12
bool rockwood_cut(real_t &t, real_t const *b, unsigned sz, int st=1)
Definition: loops_brnops.hpp:155
Home