6 #ifndef realroot_SOLVE_mslvbst_H
7 #define realroot_SOLVE_mslvbst_H
25 #define REP(x) (x).rep()
43 #define SBD_RDRDLRDS 4
48 #define SBD_MTH SBD_RDRDL
51 template<
class system,
int mth >
54 template<
class system >
57 template<
class system >
60 template<
class system>
64 template<
class system >
67 template<
class system >
71 template<
class system >
75 template<
class system >
79 template<
class system >
83 template<
class T,
class eenv_t,
class MPOL >
90 template<
class monom >
92 {
for (
unsigned i = 0; i < (m.
rep()).
size(); i++ )
if ( (m.
rep())[i] != 0 ) env.insert(i); };
111 template<
class C,
int MTH>
127 template<
class MPDI >
static
133 for ( eptr = first; eptr != last; eptr ++ ) ne++;
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]);
145 int mxv = *(gvrs.rend());
148 for ( std::set<int>::const_iterator it = gvrs.begin(); it != gvrs.end(); lnames[*it++] = nv++ ) ;
149 int * vrdat =
new int[ nv * ne ];
153 for ( eptr = first; eptr != last; vrptr+= eptr->rep().nbvar(), e++, eptr ++ ) {
155 const int * tmp = eptr->rep().vrs();
156 for (
int v = 0; v < eptr->rep().nvr(); v ++ )
157 vrptr[v] = lnames[ tmp[v] ];
162 e=0;
for ( MPDI eptr = first; eptr != last; add_equation(
REP(*eptr), e++ ), eptr++ ) ;
173 sys->set_monomial2( data.
begin(), e );
176 static int run( std::vector<C> & R,
int& nv )
183 int nvars = sys->
nvr();
186 int nsols = R.size() / (2*nvars);
188 R.resize(nsols2 * nvars) ;
194 static int run( std::vector<C> & sol,
C* dom,
int& nv )
199 int nvars = sys->
nvr();
206 __mth.
launch(sys,intf,dom);
208 int nsols = sol.size() / (2*nvars);
210 sol.resize(nsols2 * nvars) ;
225 template<
class output,
class MPC,
class Domains >
229 bool verbose =
false )
232 typedef typename MPC::value_type mpoly_t;
234 typedef typename plist_t::const_iterator pptr_t;
235 typedef typename mpoly_t::const_iterator mptr_t;
239 sz_t nvars = 0, neqs, * nvrs, ** vrs, ** szs;
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);
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++ )
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];
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++ )
262 nvrs[e] = seenvs[e].size();
264 szs [e] = base + nvrs[e];
266 for ( seenvit = seenvs[e].begin(); k < nvrs[e]; seenvit++, k++ )
268 vrs[e][k] = *seenvit;
269 szs[e][k] =
degree( *cpl, *seenvit ) + 1;
273 std::vector<C> result;
275 if ( (sz_t)dom.size() >= 2*nvars )
277 dmns =
new C[ 2*nvars ];
278 for (
int i = 0; i < 2*nvars; i ++ )
let::assign(dmns[i],dom[i]);
285 using namespace realroot;
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++ )
294 __mth.
launch(&sys,intf,dmns);
298 std::cout <<
" iterations = " << __mth.
m_niter << std::endl;
299 std::cout <<
"subdivisions = "<< __mth.
m_nsbd << std::endl;
303 if ( !verbose && dmns )
delete[] dmns;
309 std::cout <<
"<domain>";
312 std::cout << std::endl;
313 for (
int i = 0; i < nvars; i ++ )
316 <<
" = [ " << dmns[2*i]
321 else std::cout <<
"[0,1]^" << nvars;
322 std::cout <<
"</domain>\n";
327 if ( dmns )
delete[] dmns;
330 unsigned nsols = tmp.size() / (2*nvars);
331 T boxes[nsols*2*nvars];
332 std::copy(&tmp[0], &tmp[0]+2*nvars*nsols,boxes);
336 for (
unsigned i = 0; i < nsols; i ++ )
339 for (
int j = 0; j < nvars; j ++ )
340 std::cout << (boxes[2*(i*nvars+j)]+boxes[2*(i*nvars+j)+1])/2.0 <<
" ";
342 std::cout << std::endl;
349 tmp.resize( nsols2 * nvars );
351 std::vector<T> vsol(nvars);
353 for(
int i=0;i<nsols2;++i)
355 for(
int j=0; j<nvars; j++)
356 vsol[j]=tmp[i*nvars+j];
362 template<
class output,
class MPC>
365 init_bernstein(l.begin(), l.end());
375 template<
class output,
class MPL,
class DOM>
376 static void solve(output& sol,
const MPL& eqs,
const DOM& dom)
378 init_bernstein(eqs.begin(), eqs.end());
379 int nvars = sys->
nvr();
382 if((
int)dom.size()>=2*nvars)
383 ns=run(sol,&dmns[0],nv);
395 template<
class C,
int M> realroot::system<C>* solver<C,ProjRd<M> >::sys = 0;
416 template<
class C,
class MPC,
class Domains,
int MTH>
419 const ProjRd<MTH> &,
const Domains& D ,
420 bool verbose =
false ) {
422 typedef typename MPC::value_type
POL;
423 typedef typename POL::value_type coeff;
424 typedef tensor::bernstein<QQ> bpol;
426 typedef polynomial<C, with<Bernstein> >
Polynomial;
427 typedef polynomial<Rational, with<Bernstein> > PolynomialQQ;
429 typedef polynomial<Rational, with<Sparse,DegRevLex> > PolynomialSparse;
431 Seq<Rational> box(D.size());
432 for(
unsigned i=0;i<D.size();i++)
434 std::cout<<
"Box: "<<box<<std::endl;
439 typedef typename MPC::const_iterator iterator;
440 for(iterator i=l.begin();i!=l.end();i++) {
450 Seq<std::vector<C> > sol;
451 solver<C, ProjRd<MTH> >::solve_bernstein(sol,L,D,verbose);
466 template<
class C,
class MPC,
class Domains,
int MTH>
469 bool verbose =
false ) {
474 for(
unsigned i=0;i<D.size();i++)
let::assign(box[i],D[i]);
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
#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