Developer documentation

solver_mv_bernstein.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: realroot.h,v 1.1 2005/07/11 10:03:51 jppavone Exp $
5  ********************************************************************/
6 #ifndef realroot_SOLVE_mslvbst_H
7 #define realroot_SOLVE_mslvbst_H
8 /********************************************************************/
17 #include <set>
18 #include <vector>
19 #include <math.h>
21 #include <realroot/solver.hpp>
22 
24 
25 #define REP(x) (x).rep()
26 
27 #include <realroot/GMP.hpp>
28 #include <realroot/polynomial.hpp>
31 #include <realroot/Seq.hpp>
32 
33 
34 //====================================================================
35 namespace mmx {
36 //====================================================================
37 namespace realroot
38 {
39 #define SBD_RD 0
40 #define SBD_RDL 1
41 #define SBD_RDS 2
42 #define SBD_RDRDL 3
43 #define SBD_RDRDLRDS 4
44 #define SBD_RDRDS 5
45 #define SBD_RDLRDS 6
46 #define SBD_RDSRDL 7
47 #ifndef SBD_MTH
48 #define SBD_MTH SBD_RDRDL
49 #endif
50 
51  template< class system, int mth > /* selection de methodes */
52  struct select_mth
54  template< class system >
57  template< class system >
60  template< class system>
64  template< class system >
67  template< class system >
70 
71  template< class system >
74 
75  template< class system >
78 
79  template< class system >
82 
83  template< class T, class eenv_t, class MPOL >
84  void fill_data( T * data, eenv_t * env, const MPOL& p, binomials<T>& benv )
85  {
86  std::fill(data,data+env->sz(),0);
87  mpolfill(data,p.rep(),*env);
88  convertm2b (data,*env,benv);
89  };
90  template< class monom >
91  void scan_monom_env ( std::set< int >& env, const monom& m )
92  { for ( unsigned i = 0; i < (m.rep()).size(); i++ ) if ( (m.rep())[i] != 0 ) env.insert(i); };
93 }
94 
95  template<int MTH> struct ProjRd {};
96 
97 //====================================================================
111 template<class C, int MTH>
112 struct solver< C, ProjRd<MTH> >
113 {
114  typedef C coeff_t;
117 
118  static C eps;
119  static system_t* sys;
120 
122  // solver_multivariate_bernstein( const C& precision = (C)1e-6 ): eps(precision), sys(0){};
123 
124 
125  static void set_precision(int prec) { using std::pow; eps = pow(2.0,-prec); }
126 
127  template< class MPDI > static
128  void init_bernstein( MPDI first, MPDI last)
129  {
130 
131  int ne = 0;
132  MPDI eptr;
133  for ( eptr = first; eptr != last; eptr ++ ) ne++;
134  int nvrs[ne];
135  const int *szs[ne];
136  int e;
137  // int mxvr = 0;
138  std::set<int> gvrs;
139  for ( e = 0, eptr = first; eptr != last; eptr ++, e++ ) {
140  nvrs[e] = eptr->rep().nbvar();
141  szs[e] = eptr->rep().szs();
142  const int * tmp = eptr->rep().vrs();
143  for ( int v = 0; v < eptr->rep().nvr(); v ++ ) gvrs.insert(tmp[v]);
144  };
145  int mxv = *(gvrs.rend());
146  int lnames[ mxv+1 ];
147  int nv = 0;
148  for ( std::set<int>::const_iterator it = gvrs.begin(); it != gvrs.end(); lnames[*it++] = nv++ ) ;
149  int * vrdat = new int[ nv * ne ];
150  int * vrptr = vrdat;
151  const int * vrs[ne];
152  e = 0;
153  for ( eptr = first; eptr != last; vrptr+= eptr->rep().nbvar(), e++, eptr ++ ) {
154  vrs[e] = vrptr;
155  const int * tmp = eptr->rep().vrs();
156  for ( int v = 0; v < eptr->rep().nvr(); v ++ )
157  vrptr[v] = lnames[ tmp[v] ];
158  };
159  // std::cout << ne << " " << nv << std::endl;
160  assert(ne>=nv);
161  sys = new realroot::system<C>( ne, nv, nvrs, (const int**)vrs, (const int**)szs, eps );
162  e=0; for ( MPDI eptr = first; eptr != last; add_equation( REP(*eptr), e++ ), eptr++ ) ;
163  delete[] vrdat;
164  };
165 
166  static void add_equation( const tensor::bernstein<C>& data, int e )
167  {
168  sys->set_bernstein2( data.begin(), e );
169  };
170 
171  static void add_equation( const tensor::monomials<C>& data, int e )
172  {
173  sys->set_monomial2( data.begin(), e );
174  };
175 
176  static int run( std::vector<C> & R, int& nv )
177  {
178  R.resize(0);
180  //int e = 0;for ( MPDI eptr = first; eptr != last; add( eptr->rep(), e++ ), eptr++ );
181  //std::vector<C> tmp;
183  int nvars = sys->nvr();
184  __mth.launch(sys,intf,(C*)0);
185 
186  int nsols = R.size() / (2*nvars);
187  int nsols2 = realroot::clean_result( &R[0], nvars, nsols,(C)1e-3 );
188  R.resize(nsols2 * nvars) ;
189  int ns = nsols2;
190  nv = nvars;
191  return ns;
192  };
193 
194  static int run( std::vector<C> & sol, C* dom, int& nv )
195  {
196  sol.resize(0);
199  int nvars = sys->nvr();
200  // C* dmns = &dom[0];
201  // if ( (int)dom.size() >= 2*nvars )
202 // {
203 // dmns = new C[ 2*nvars ];
204 // for ( int i = 0; i < 2*nvars; i ++ ) let::assign(dmns[i],dom[i]);
205 // };
206  __mth.launch(sys,intf,dom);
207 
208  int nsols = sol.size() / (2*nvars);
209  int nsols2 = realroot::clean_result( &sol[0], nvars, nsols,(C)1e-3 );
210  sol.resize(nsols2 * nvars) ;
211  int ns = nsols2;
212  nv = nvars;
213  return ns;
214  };
215 
216  //--------------------------------------------------------------------
225  template< class output, class MPC, class Domains >
226  static void solve_monomial( output& res,
227  const MPC& l,
228  const Domains & dom,
229  bool verbose = false )
230  {
231  typedef C T;
232  typedef typename MPC::value_type mpoly_t;
233  typedef MPC plist_t;
234  typedef typename plist_t::const_iterator pptr_t;
235  typedef typename mpoly_t::const_iterator mptr_t;
236  // typedef typename mpoly_t::monom_t monom_t;
237  // typedef solver_multivariate_bernstein<C, MTH> mth_t;
238  typedef int sz_t;
239  sz_t nvars = 0, neqs, * nvrs, ** vrs, ** szs;
240  int e;
241  pptr_t cpl;
242  // recuperation de l'environement global
243  for ( neqs = 0, cpl = l.begin(); cpl != l.end(); cpl++, neqs++ )
244  for ( mptr_t mn = cpl->begin(); mn != cpl->end(); mn++ )
245  nvars = std::max(nvars,mn->nvars()+1);
246  // recuperation de l'environement de chaque equation
247  std::set<int> * seenvs = new std::set< int > [ neqs ];
248  for ( e = 0, cpl = l.begin(); e < neqs; e++, cpl++ )
249  for ( mptr_t mn = cpl->begin(); mn != cpl->end(); mn++ )
250  realroot::scan_monom_env(seenvs[e],*mn);
251 
252  // assert(sizeof(sz_t)==sizeof(sz_t*));
253  sz_t s = 0;
254  for ( e = 0; e < neqs; s += seenvs[e].size(), e++ ) ;
255  nvrs = new sz_t [neqs+2*s];
256  vrs = new sz_t*[2*neqs];
257  szs = vrs + neqs;
258  sz_t * base = nvrs + neqs;
259  std::set<int>::iterator seenvit;
260  for ( e = 0, cpl = l.begin(); e < neqs; base += 2*nvrs[e++], cpl++ )
261  {
262  nvrs[e] = seenvs[e].size();
263  vrs [e] = base;
264  szs [e] = base + nvrs[e];
265  int k = 0;
266  for ( seenvit = seenvs[e].begin(); k < nvrs[e]; seenvit++, k++ )
267  {
268  vrs[e][k] = *seenvit;
269  szs[e][k] = degree( *cpl, *seenvit ) + 1;
270  };
271  };
272 
273  std::vector<C> result;
274  C * dmns = 0;
275  if ( (sz_t)dom.size() >= 2*nvars )
276  {
277  dmns = new C[ 2*nvars ];
278  for ( int i = 0; i < 2*nvars; i ++ ) let::assign(dmns[i],dom[i]);
279  };
280 
281  // chrono tm;
282  std::vector<T> tmp;
283 
284  { /* remplissage et appel */
285  using namespace realroot;
286  binomials<T> bznv;
287  typedef realroot::system<T> system_t;
288  system_t sys( neqs, nvars, nvrs, (const int**)vrs, (const int**)szs, (T)eps);
289  for ( e = 0, cpl = l.begin(); e < neqs; e ++, cpl++ )
290  realroot::fill_data( sys.data(e), sys.env(e), *cpl, bznv );
292  // tm.start();
294  __mth.launch(&sys,intf,dmns);
295  //tm.stop();
296  if ( verbose )
297  {
298  std::cout << " iterations = " << __mth.m_niter << std::endl;
299  std::cout << "subdivisions = "<< __mth.m_nsbd << std::endl;
300  };
301  };
302 
303  if ( !verbose && dmns ) delete[] dmns;
304  delete[] seenvs;
305  delete[] nvrs;
306  delete[] vrs;
307  if ( verbose )
308  {
309  std::cout << "<domain>";
310  if ( dmns )
311  {
312  std::cout << std::endl;
313  for ( int i = 0; i < nvars; i ++ )
314  std::cout << "\t"
315  << "x" << i//monom_t::var_of_index(i)
316  << " = [ " << dmns[2*i]
317  << ","
318  << dmns[2*i+1]
319  << " ]";
320  }
321  else std::cout << "[0,1]^" << nvars;
322  std::cout << "</domain>\n";
323  // std::cout << "\treductions = " << bsys.nrest() << std::endl;
324  // std::cout << "\titerations = " << bsys.niter() << std::endl;
325  // std::cout << "<solver_time>"; tm.write(std::cout);
326  // std::cout <<"</solver_time>"<< std::endl;
327  if ( dmns ) delete[] dmns;
328  };
329 
330  unsigned nsols = tmp.size() / (2*nvars);
331  T boxes[nsols*2*nvars];
332  std::copy(&tmp[0], &tmp[0]+2*nvars*nsols,boxes);
333  int nsols2 = realroot::clean_result( &tmp[0], nvars, nsols,(T)1e-3 );
334  if ( verbose ) {
335  // xml::print(std::cout,nsols,"nb_box")<< std::endl;
336  for ( unsigned i = 0; i < nsols; i ++ )
337  {
338  std::cout << "\t[ ";
339  for (int j = 0; j < nvars; j ++ )
340  std::cout << (boxes[2*(i*nvars+j)]+boxes[2*(i*nvars+j)+1])/2.0 << " ";
341  std::cout << "]";
342  std::cout << std::endl;
343  };
344  // xml::print(std::cout,nsols2,"nb_sol")<< std::endl;
345  // if ( nsols ) vctops::print(&tmp[0],nvars*nsols );
346  };
347 
348 
349  tmp.resize( nsols2 * nvars );
350  // cout <<"-----"<<endl;
351  std::vector<T> vsol(nvars);
352  // Seq<vectdse<T> > res;
353  for(int i=0;i<nsols2;++i)
354  {
355  for(int j=0; j<nvars; j++)
356  vsol[j]=tmp[i*nvars+j];
357  res.push_back(vsol);
358  }
359  // return res;
360  };
361 
362  template< class output, class MPC>
363  static void solve_bernstein(output& sol, const MPC& l)
364  {
365  init_bernstein(l.begin(), l.end());
366  std::vector<C> res;
367  int nv; //ns;
368  //ns=
369  run(sol,nv);
370  // std::cout<<"system: nv="<<nv<< " ns="<< ns<<std::endl;
371 
372  }
373 
374 
375  template< class output, class MPL, class DOM>
376  static void solve(output& sol, const MPL& eqs, const DOM& dom)
377  {
378  init_bernstein(eqs.begin(), eqs.end());
379  int nvars = sys->nvr();
380  int ns, nv;
381  DOM dmns(dom);
382  if((int)dom.size()>=2*nvars)
383  ns=run(sol,&dmns[0],nv);
384  else
385  ns=run(sol,nv);
386 
387  // std::cout<<"system: nv="<<nv<< " ns="<< ns<<std::endl;
388 
389  }
390  // ~solver_multivariate_bernstein() { delete sys; };
391 
392 };
393 
394  template<class C, int M> C solver<C,ProjRd<M> >::eps = std::pow(2.0,-solver_default_precision);
395  template<class C, int M> realroot::system<C>* solver<C,ProjRd<M> >::sys = 0;
396 
397 //====================================================================
398 // template<class C,int MTH= SBD_RDRDL> struct MVBST
399 // {
400 // static void set_precision(unsigned prec)
401 // {
402 // solver_multivariate_bernstein<C,MTH>::set_precision(prec);
403 // }
404 // };
405 //====================================================================
406 // template< class MPC, class Domains, class C, int MTH>
407 // Seq<std::vector<C> > solve( const MPC& l, MVBST<C,MTH> slv, const Domains& D,
408 // bool verbose = false )
409 // {
410 // Seq<std::vector<C> > sol;
411 // solver_multivariate_bernstein<C,MTH>::solve(sol,l,D,verbose);
412 // return sol;
413 // }
414 //====================================================================
415 #if 0
416 template<class C, class MPC, class Domains, int MTH>
417 Seq<std::vector<C> >
418 solve( const MPC& l,
419  const ProjRd<MTH> &, const Domains& D ,
420  bool verbose = false ) {
421 
422  typedef typename MPC::value_type POL;
423  typedef typename POL::value_type coeff;
424  typedef tensor::bernstein<QQ> bpol;
425  typedef QQ Rational;
426  typedef polynomial<C, with<Bernstein> > Polynomial;
427  typedef polynomial<Rational, with<Bernstein> > PolynomialQQ;
428 
429  typedef polynomial<Rational, with<Sparse,DegRevLex> > PolynomialSparse;
430 
431  Seq<Rational> box(D.size());
432  for(unsigned i=0;i<D.size();i++)
433  let::assign(box[i],D[i]);
434  std::cout<<"Box: "<<box<<std::endl;
435 
436  Polynomial p;
437  PolynomialQQ q;
438  Seq<Polynomial> L;
439  typedef typename MPC::const_iterator iterator;
440  for(iterator i=l.begin();i!=l.end();i++) {
441  let::assign(q.rep(),i->rep(),box);
442  Rational mx = array::max_abs(q);
443  // q/=mx;
444  // std::cout<<q<<std::endl;
445  let::assign(p.rep(),q.rep());
446  // std::cout<<p.rep()<<std::endl;
447  L<<p;
448  }
449 
450  Seq<std::vector<C> > sol;
451  solver<C, ProjRd<MTH> >::solve_bernstein(sol,L,D,verbose);
452  return sol;
453 }
454 #endif
455 //====================================================================
466 template<class C, class MPC, class Domains, int MTH>
467 Seq<std::vector<C> >
468 solve( const MPC& l, const ProjRd<MTH> &, const Domains& D,
469  bool verbose = false ) {
470  //typedef typename MPC::value_type POL;
471  //typedef typename POL::value_type coeff;
472  typedef QQ Rational;
473  Seq<Rational> box(D.size());
474  for(unsigned i=0;i<D.size();i++) let::assign(box[i],D[i]);
475  //std::cout<<"Box: "<<box<<std::endl;
476 
477  Seq<std::vector<C> > sol;
478  solver<C, ProjRd<MTH> >::solve_monomial(sol,l,D,verbose);
479  return sol;
480 }
481 //====================================================================
482 } //namespace mmx
483 /********************************************************************/
484 #endif //realroot_SOLVE_mslvbst_H
#define SBD_RDLRDS
Definition: solver_mv_bernstein.hpp:45
realroot::method< system, strgy::cvmatrix< system, strgy::newton< system > >, rdslv::parallel, sbdrl::parametric > result_t
Definition: solver_mv_bernstein.hpp:81
Sequence of terms with reference counter.
Definition: Seq.hpp:28
realroot::method< system, strgy::simple< system >, rdslv::parallel, sbdrl::parametric > result_t
Definition: solver_mv_bernstein.hpp:56
T pow(const T &a, int i)
Definition: binomials.hpp:12
Definition: solver_mv_bernstein.hpp:95
void fill(C *a, unsigned n, int s, const C &x)
Definition: tensor_vctops.hpp:152
static system_t * sys
Definition: solver_mv_bernstein.hpp:119
dynamic_exp< E >::degree_t degree(const dynamic_exp< E > &t)
Definition: dynamicexp.hpp:191
realroot::method< system, strgy::cvmatrix< system, strgy::newton< system > >, rdslv::parallel, sbdrl::parametric > result_t
Definition: solver_mv_bernstein.hpp:77
static Solutions solve(const POL &p)
Definition: solver.hpp:75
realroot::method< system, strgy::cvmatrix< system, strgy::simple< system > >, rdslv::parallel, sbdrl::parametric > result_t
Definition: solver_mv_bernstein.hpp:73
static C eps
Definition: solver_mv_bernstein.hpp:118
creal_t * data(sz_t e)
Definition: system_system.h:96
sz_t nvr() const
Definition: system_system.h:84
realroot::method< system, strgy::cvmatrix< system, strgy::newton< system, strgy::simple< system > > >, rdslv::parallel, sbdrl::parametric > result_t
Definition: solver_mv_bernstein.hpp:66
#define SBD_RDRDS
Definition: solver_mv_bernstein.hpp:44
void fill_data(T *data, eenv_t *env, const MPOL &p, binomials< T > &benv)
Definition: solver_mv_bernstein.hpp:84
void scan_monom_env(std::set< int > &env, const monom &m)
Definition: solver_mv_bernstein.hpp:91
Definition: strgy_rdslv_parallel.hpp:29
Definition: system_support.hpp:14
#define SBD_RDS
Definition: solver_mv_bernstein.hpp:41
realroot::system< C > system_t
Definition: solver_mv_bernstein.hpp:116
realroot::method< system, strgy::newton< system >, rdslv::parallel, sbdrl::parametric > result_t
Definition: solver_mv_bernstein.hpp:53
int m_nsbd
Definition: system_method.hpp:155
realroot::method< system, strgy::newton< system, strgy::simple< system > >, rdslv::parallel, sbdrl::parametric > result_t
Definition: solver_mv_bernstein.hpp:63
#define REP(x)
Definition: solver_mv_bernstein.hpp:25
polynomial< COEFF, with< MonomialTensor > > Polynomial
Definition: solver_mv_cf.cpp:23
int m_niter
Definition: system_method.hpp:152
GMP::rational QQ
Definition: GMP.hpp:37
C * begin()
Definition: tensor_monomials.hpp:47
Definition: solver_mv_bernstein.hpp:52
TMPL void copy(Polynomial &r, const Polynomial &a)
Copy of a in r.
Definition: sparse_monomials.hpp:613
static void add_equation(const tensor::bernstein< C > &data, int e)
Definition: solver_mv_bernstein.hpp:166
#define SBD_RD
Definition: solver_mv_bernstein.hpp:39
static void solve(output &sol, const MPL &eqs, const DOM &dom)
Definition: solver_mv_bernstein.hpp:376
Definition: solver.hpp:68
Definition: tensor_monomials.hpp:18
unsigned clean_result(real_t *isols, int nvars, int nsols, const real_t &prec)
Definition: system_support.hpp:34
eenv_t * env(sz_t i) const
Definition: system_system.h:87
Seq< std::vector< C > > Solutions
Definition: solver_mv_bernstein.hpp:115
realroot::method< system, strgy::newton< system >, rdslv::parallel, sbdrl::parametric > result_t
Definition: solver_mv_bernstein.hpp:59
ZZ size(const ZZ &z)
Definition: GMPXX.hpp:67
void launch(system *sys, Prm &prm, Bounds *inits, method_debug *dbg=0)
Definition: system_method.hpp:160
E & rep()
Definition: monomial.hpp:73
Definition: system_system.h:25
TMPL POL
Definition: polynomial_dual.hpp:74
void pow(polynomial< C, with< Bernstein > > &poly, int n)
Definition: fatarcs_fcts.hpp:180
static void set_precision(int prec)
Construction of the solver for the precision precision.
Definition: solver_mv_bernstein.hpp:125
static int run(std::vector< C > &R, int &nv)
Definition: solver_mv_bernstein.hpp:176
#define SBD_RDRDLRDS
Definition: solver_mv_bernstein.hpp:43
static void add_equation(const tensor::monomials< C > &data, int e)
Definition: solver_mv_bernstein.hpp:171
Definition: system_method.hpp:58
static void solve_monomial(output &res, const MPC &l, const Domains &dom, bool verbose=false)
Definition: solver_mv_bernstein.hpp:226
Definition: binomials.hpp:68
void set_bernstein2(const creal_t *src, sz_t e)
Definition: system_system.h:159
static int run(std::vector< C > &sol, C *dom, int &nv)
Definition: solver_mv_bernstein.hpp:194
void mpolfill(C *data, const sparse::monomial_seq< X, O > &mpol, const eenv &env)
Definition: tensor_eenv_loops.hpp:541
double C
Definition: solver_mv_fatarcs.cpp:16
void convertm2b(bernstein< C > &mpl)
Definition: tensor_bernstein_fcts.hpp:31
#define SBD_RDL
Definition: solver_mv_bernstein.hpp:40
static void init_bernstein(MPDI first, MPDI last)
Definition: solver_mv_bernstein.hpp:128
realroot::method< system, strgy::cvmatrix< system >, rdslv::parallel, sbdrl::parametric > result_t
Definition: solver_mv_bernstein.hpp:69
#define solver_default_precision
Definition: solver.hpp:59
void assign(A &a, const B &b)
Generic definition of the assignement function.
Definition: assign.hpp:97
Monomial class.
Definition: monomial.hpp:62
static void solve_bernstein(output &sol, const MPC &l)
Definition: solver_mv_bernstein.hpp:363
#define SBD_RDSRDL
Definition: solver_mv_bernstein.hpp:46
Interval< T, r > max(const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:135
Definition: array.hpp:12
#define SBD_RDRDL
Definition: solver_mv_bernstein.hpp:42
C coeff_t
Definition: solver_mv_bernstein.hpp:114
Definition: scalar.hpp:24
R::value_type max_abs(const R &v)
Definition: array.hpp:387
Definition: tensor_bernstein.hpp:13
Definition: strgy_sbdrl_parametric.hpp:16
#define assert(expr, msg)
Definition: shared_object.hpp:57
Home