Developer documentation

contfrac_intervaldata.hpp
Go to the documentation of this file.
1 #ifndef synaps_usolve_contfrac_IntervalData_h
2 #define synaps_usolve_contfrac_IntervalData_h
3 
4 #include <realroot/Interval.hpp>
6 namespace mmx {
7 
8  template<class POL> void div_x(POL& p, int k)
9  {
10  for(int i=0;i< int(p.size()-k);i++)
11  p[i]=p[i+k];
12  for(int i=p.size()-k; i<(int)p.size();i++)
13  p[i]=0;
14  }
15 
16  template < typename RT_, typename Poly_ >
17  struct IntervalData
18  {
19  typedef RT_ RT;
20  typedef Poly_ Poly;
21 
22  RT a, b, c, d;
23  Poly p;
24  unsigned long s;
25 
26  IntervalData( const RT& a_, const RT& b_, const RT& c_, const RT& d_,
27  const Poly& p_, unsigned long s_)
28  : a(a_), b(b_), c(c_), d(d_), p(p_), s(s_) {}
29 
31 
32  };
33 
34  template < typename FT > inline
35  Interval< FT > as_interval( const FT& a, const FT& b)
36  {
37  if ( a <= b )
38  return Interval<FT>( a, b);
39  return Interval<FT>( b, a);
40  }
41 
42  template < typename RT, typename Poly >
43  IntervalData<RT,Poly> as_interval_data(const RT& a, const RT& b, const RT&c, const RT&d,
44  const Poly& f)
45  {
46 
47  Poly X = Poly("x")*a+Poly(b), Y=Poly("x")*c+Poly(d);
48 
49  Poly F = univariate::eval_homogeneous(f,X,Y);
50  return IntervalData<RT,Poly> (a,b,c,d,F,degree(f));
51  }
52 
53 #ifndef WITH_AS
54 #define WITH_AS
55  template<typename T,typename F>
56  struct as_helper {
57  static inline T cv (const F& x) { return x; }
58  };
59 
60  template<typename T,typename F> inline T
61  as (const F& x) { return as_helper<T,F>::cv (x); }
62 #endif
63 
64  template<typename FT, typename RT, typename Poly>
65  struct as_helper<Interval<FT>,IntervalData<RT,Poly> > {
66  static inline Interval<FT>
68  FT left, right;
69  if ( I.c == RT(0))
70  left = (I.a* bound_root( I.p, Cauchy<FT>())+ FT(I.b))/FT(I.d);
71  else
72  left = FT(I.a)/I.c;
73 
74  if ( I.d == RT(0))
75  right = (FT(I.a) + FT(I.b) /bound_root( I.p, Cauchy<FT>()))/FT(I.c);
76  else
77  right = FT(I.b)/I.d;
78  //std::cout << I.a<<"/"<<I.c<<", "<<I.b<<"/"<<I.d<<std::endl;
79  return Interval<FT>(left, right);
80  }
81  };
82 
83 
84 
85 
86 
87 
88  // template <> inline rational as<rational>(const integer& a, const integer& b)
89  // {
90  // return rational(a)/b;
91  // }
92 
93  template<class C> typename texp::rationalof<C>::T to_FT(const C& a, const C& b)
94  {
95  typedef typename texp::rationalof<C>::T rational;
96  return (rational(a)/b);
97  }
98 
99 
100 
101  template < typename FT >
102  Interval< FT > inline
103  to_FIT( const FT& a, const FT& b)
104  {
105  if ( a <= b )
106  return Interval<FT>( a, b);
107  return Interval<FT>( b, a);
108  }
109 
110 
111  template < typename K >
112  typename K::FIT
113  to_FIT( const typename K::RT& a, const typename K::RT& b,
114  const typename K::RT& c, const typename K::RT& d,
115  const typename K::FT& B)
116  {
117  typedef typename K::RT RT;
118  typedef typename K::FT FT;
119  //typedef typename K::FIT FIT;
120 
121 
122  FT left;
123  FT right;
124 
125  if ( c == RT(0)) left = sign(a) * B;
126  // else left = as<FT>(a, c);
127  else left = to_FT(a,c);
128 
129  if ( d == RT(0)) right = sign(b) * B;
130  // else right = as<FT>(b, d);
131  else right = to_FT(b,d);
132 
133  return to_FIT( left, right);
134  }
135 
136 
137  template < typename Poly> inline
138  void
139  reverse(Poly & R, const Poly& P) {
140  R=P; reverse(R);
141  }
142 
143  /* Replace R by its reverse */
144  template < typename Poly> inline
145  void
146  reverse(Poly & R)
147  {
148  int deg = degree(R);
149  Poly temp(R);
150  for (int i = 0; i <= deg; ++i)
151  R[i] = temp[deg-i];
152  }
153 
154  /* Replaces P by the polynomial P(X+1) */
155  template < typename RT, typename Poly > inline
157  {
158  reverse(I1.p);
159  std::swap(I1.a,I1.b);
160  std::swap(I1.c,I1.d);
161  return;
162  }
163 
164 
165 
166  /* Replaces P by the polynomial P(X+1) */
167  template < typename Poly > inline
168  void shift_by_1( Poly& R, const Poly& P)
169  {
170  R=P;
171  int deg = degree(P);
172  for (int j = deg-1; j >= 0; j--) {
173  for (int i = j; i < deg; i++) {
174  R[i] += R[i+1];
175  }
176 
177  }
178 
179  return;
180  }
181 
182  /* Replaces P by the polynomial P(X+1) */
183  template < typename RT, typename Poly > inline
185  {
186  shift_by_1(I1.p,I2.p);
187  I1.a = I2.a;
188  I1.b = I2.a + I2.b;
189  I1.c = I2.c;
190  I1.d = I2.c + I2.d;
191  I1.s = sign_variation(I1.p);
192  return;
193  }
194 
195  /* Replaces P by the polynomial P(X+1) */
196  template < typename RT, typename Poly > inline
198  {
199  shift_by_1(I1.p);
200  I1.b += I1.a;
201  I1.d += I1.c;
202  I1.s = sign_variation(I1.p);
203  }
204 
205  /* Replaces P by the polynomial P(X+1) */
206  template < typename Poly > inline
207  void shift_by_1(Poly& R)
208 
209  {
210  long deg = degree( R);
211  for (int j = deg-1; j >= 0; j--) {
212  for (int i = j; i < deg; i++) {
213  R[i] += R[i+1];
214  }
215  }
216  return;
217  }
218 
219 
220  template < typename RT, typename Poly > inline
221  void scale( IntervalData<RT,Poly>& ID, const RT& a)
222  {
223  univariate::scale( ID.p, ID.p, a);
224  ID.a *= a;
225  ID.c *= a;
226  }
227 
228  template < typename RT, typename Poly, typename RT2 > inline
229  void scale( IntervalData<RT,Poly>& ID, const RT2& a)
230  {
231  univariate::scale( ID.p, ID.p, a);
232  ID.a *= a;
233  ID.c *= a;
234  }
235 
236  template < typename RT, typename Poly > inline
237  void scale( IntervalData<RT,Poly>& ID, long k)
238  {
239  RT a = pow( RT( 2), k);
240 
241  univariate::scale( ID.p, ID.p, a);
242  ID.a *= a;
243  ID.c *= a;
244  }
245 
246 
247  template < typename RT, typename Poly > inline
248  void inv_scale( IntervalData<RT,Poly>& ID, const RT& a)
249  {
250  univariate::inv_scale( ID.p, ID.p, a);
251  ID.b *= a;
252  ID.d *= a;
253  }
254 
255 
256  template < typename RT, typename Poly > inline
257  void shift( IntervalData<RT,Poly>& ID, const RT& a)
258  {
259  univariate::shift( ID.p, ID.p, a);
260  ID.s = sign_variation(ID.p);
261  ID.b += a * ID.a;
262  ID.d += ID.c * a;
263  }
264 
265  template < typename RT, typename Poly, typename RT2 > inline
266  void shift( IntervalData<RT,Poly>& ID, const RT2& a)
267  {
268  univariate::shift( ID.p, ID.p, a);
269  ID.s = sign_variation(ID.p);
270  ID.b += a * ID.a;
271  ID.d += ID.c * a;
272  }
273 
274  /* Replaces P by the polynomial (X+1)^d*P(1/(X+1)) */
275  template < typename RT, typename Poly > inline
277  {
278  I2.a = ID.b;
279  I2.b = ID.a + ID.b;
280  I2.c = ID.d;
281  I2.d = ID.c + ID.d;
282  }
283 
284  /* Replaces P by the polynomial (X+1)^d*P(1/(X+1)) */
285  template < typename RT, typename Poly > inline
287  {
288  I2.a = ID.b;
289  I2.b = ID.a + ID.b;
290  I2.c = ID.d;
291  I2.d = ID.c + ID.d;
292  I2.p= ID.p;
293  reverse(I2);
294  shift_by_1(I2);
295  I2.s = sign_variation(I2.p);
296  }
297 
298 } //namespace mmx
299 #endif //synaps_usolve_contfrac_IntervalData_h
C eval_homogeneous(const R &p, const C &a, const C &b)
Definition: univariate.hpp:526
Cauchy bound.
Definition: univariate_bounds.hpp:163
IntervalData()
Definition: contfrac_intervaldata.hpp:30
texp::rationalof< C >::T to_FT(const C &a, const C &b)
Definition: contfrac_intervaldata.hpp:93
void div_x(POL &p, int k)
Definition: contfrac_intervaldata.hpp:8
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
dynamic_exp< E >::degree_t degree(const dynamic_exp< E > &t)
Definition: dynamicexp.hpp:191
void shift(IntervalData< RT, Poly > &ID, const RT &a)
Definition: contfrac_intervaldata.hpp:257
const Interval & I
Definition: Interval_glue.hpp:49
MP swap(const MP &P, int var_i, int var_j)
Definition: sparse_monomials.hpp:988
Interval< FT > to_FIT(const FT &a, const FT &b)
Definition: contfrac_intervaldata.hpp:103
Definition: assign.hpp:48
void scale(IntervalData< RT, Poly > &ID, const RT &a)
Definition: contfrac_intervaldata.hpp:221
FT bound_root(const POLY &p, const Cauchy< FT > &m)
Definition: univariate_bounds.hpp:325
Poly_ Poly
Definition: contfrac_intervaldata.hpp:20
RT a
Definition: contfrac_intervaldata.hpp:22
void reverse(Poly &R, const Poly &P)
Definition: contfrac_intervaldata.hpp:139
static T cv(const F &x)
Definition: contfrac_intervaldata.hpp:57
TMPL void shift(Polynomial &r, const Polynomial &p, int d, int v=0)
Definition: univariate.hpp:318
void inv_scale(IntervalData< RT, Poly > &ID, const RT &a)
Definition: contfrac_intervaldata.hpp:248
RT b
Definition: contfrac_intervaldata.hpp:22
RT c
Definition: contfrac_intervaldata.hpp:22
Definition: contfrac_intervaldata.hpp:17
unsigned long s
Definition: contfrac_intervaldata.hpp:24
kernel_rationalof< typename kernelof< X >::T, _X, typename is_extended< X >::T >::T T
Definition: texp_rationalof.hpp:21
T as(const F &x)
Definition: assign.hpp:51
RT d
Definition: contfrac_intervaldata.hpp:22
IntervalData< RT, Poly > as_interval_data(const RT &a, const RT &b, const RT &c, const RT &d, const Poly &f)
Definition: contfrac_intervaldata.hpp:43
void shift_by_1(Poly &R, const Poly &P)
Definition: contfrac_intervaldata.hpp:168
void scale(R &t, const R &p, const C &l)
Definition: univariate.hpp:812
IntervalData(const RT &a_, const RT &b_, const RT &c_, const RT &d_, const Poly &p_, unsigned long s_)
Definition: contfrac_intervaldata.hpp:26
Definition: polynomial.hpp:37
void reverse_shift(IntervalData< RT, Poly > &I2, const IntervalData< RT, Poly > &ID)
Definition: contfrac_intervaldata.hpp:286
TMPL POL
Definition: polynomial_dual.hpp:74
Interval< FT > as_interval(const FT &a, const FT &b)
Definition: contfrac_intervaldata.hpp:35
Polynomial P
Definition: solver_mv_cf.cpp:24
Generic class for intervals.
Definition: Interval.hpp:44
const C & c
Definition: Interval_glue.hpp:45
Poly p
Definition: contfrac_intervaldata.hpp:23
double C
Definition: solver_mv_fatarcs.cpp:16
int sign(const QQ &a)
Definition: GMP.hpp:60
unsigned sign_variation(Iterator b, Iterator e)
Definition: sign_variation.hpp:27
static Interval< FT > cv(const IntervalData< RT, Poly > &I)
Definition: contfrac_intervaldata.hpp:67
void reverse_shift_homography(IntervalData< RT, Poly > &I2, const IntervalData< RT, Poly > &ID)
Definition: contfrac_intervaldata.hpp:276
RT_ RT
Definition: contfrac_intervaldata.hpp:19
Definition: array.hpp:12
void inv_scale(R &r, const R &p, const C &l)
Definition: univariate.hpp:828
Home