6 #ifndef realroot_SOLVE_SBDSLV_SYSTEM_HPP
7 #define realroot_SOLVE_SBDSLV_SYSTEM_HPP
24 template<
typename real_t,
bool rsafe = false,
bool tsafe = false>
65 rstcmd_t(
int t,
const creal_t& a,
const creal_t&
b ) : m_type(t)
67 using namespace numerics::rdw;
70 m_aa =
upsub((creal_t)1.0,a);
71 m_bb =
upsub((creal_t)1.0,b);
87 inline eenv_t *
env ( sz_t i )
const {
return eenvs + i; };
88 inline sz_t
nvars ( sz_t e )
const {
return eenvs[e].
nvr(); };
89 inline sz_t
size ( sz_t e )
const {
return eenvs[e].
sz(); };
90 inline sz_t
size ( sz_t e, sz_t v )
const {
return eenvs[e].
sz(v); };
91 inline sz_t
varname( sz_t e, sz_t v )
const {
return eenvs[e].
vr(v); };
92 inline sz_t
stride ( sz_t e, sz_t v )
const {
return eenvs[e].
st(v); };
96 inline creal_t *
data ( sz_t e ) {
return m_data+m_esft[e]; };
97 inline const creal_t *
data ( sz_t e )
const {
return m_data+m_esft[e]; };
98 inline creal_t *
rdata( sz_t e ) {
return m_mnrdata+m_esft[e]; };
99 inline const creal_t *
rdata( sz_t e )
const {
return m_mnrdata+m_esft[e]; };
100 inline creal_t *
rmndata(sz_t e) {
return m_mnrdata+m_esft[e]; };
101 inline const creal_t *
rmndata(sz_t e)
const {
return m_mnrdata+m_esft[e]; };
102 inline creal_t *
rmxdata(sz_t e) {
return m_mxrdata+m_esft[e]; };
103 inline const creal_t *
rmxdata(sz_t e)
const {
return m_mxrdata+m_esft[e]; };
110 convertb2m(m_mdata+m_esft[e],eenvs[e],m_bzenv);
116 if ( m_estate[e] & stMonomials )
return m_mdata + m_esft[e];
else tomonoms(e);
120 void meval( creal_t * dst, sz_t * eqs, sz_t n, creal_t * prms,
int nsmp = 1 )
124 creal_t locals[
nvr()];
125 for ( sz_t i = 0; i < nsmp; i++, dst += n, prms +=
nvr() )
126 for ( sz_t ie = 0; ie < n; ie ++ )
129 for ( sz_t v = 0; v <
nvars(e); locals[v] = prms[
varname(e,v)], v++ ) ;
134 inline void meval( creal_t * dst, sz_t e, creal_t * prms,
int nsmp = 1 )
135 { sz_t eqs[]={e};
meval(dst,eqs,1,prms,nsmp); };
168 using namespace numerics::rdw;
169 for ( sz_t v = 0; v <
nvr(); v ++ )
171 creal_t a = this->
current()[v].lower();
172 creal_t
b = this->
current()[v].upper();
174 if ( a > (creal_t)1.0 )
181 void _rst_( sz_t e, creal_t * base )
185 for ( sz_t v = 0; v <
nvars(e); v ++ )
188 switch( m_rstcmd[
varname(e,v) ].m_type )
211 void restrict( sz_t * eqs , sz_t n, creal_t * )
213 for ( sz_t e = 0; e < n; e ++ )
215 if ( m_estate[eqs[e]] & stRestricted )
continue;
216 _rst_(eqs[e],m_mnrdata);
221 inline void restrict( sz_t * eqs, sz_t n,
const texp::false_t& )
224 assert(m_mnrdata==m_mxrdata);
225 numerics::rounding<creal_t> rnd( numerics::rnd_nr() );
226 restrict(eqs,n,m_mnrdata);
229 void GETERROR(
double * mn_,
double * mx,
int e )
233 for (
double * mn = mn_; mn != mn_+sze; mn++, mx++ )
236 if ( d < 0 ) { *mn=*mx; d = -d; };
237 if ( d > err ) err = d;
241 inline void restrict( sz_t * eqs, sz_t n,
const texp::true_t& )
245 numerics::rounding<creal_t> rnd( numerics::rnd_dw() );
249 numerics::rounding<creal_t> rnd( numerics::rnd_up() );
252 for (
int e = 0; e < n; e ++ )
264 { sz_t tmp[] = { e }; restrict( tmp, 1 ); };
284 void prcinfo(
unsigned * address, creal_t * bindata, eenv_t * o, eenv_t * a, eenv_t *
b )
286 int ia, ib,
add, vo, ca, cb;
288 int vidx = o->
mxvr();
295 for ( ia = 0; ia < a->
sz(); ia ++ )
298 for ( ib = 0; ib < b->
sz(); ib ++ )
302 for ( v = 0; v < a->
nvr(); sc*=
m_bzenv(a->
sz(v)-1,adda[a->
vr(v)]), v ++ ) ;
303 for ( v = 0; v < b->
nvr(); sc*=
m_bzenv(b->
sz(v)-1,addb[b->
vr(v)]), v ++ ) ;
304 for ( add = vo = 0; vo < o->
nvr(); vo++ )
308 sc /=
m_bzenv( o->
sz(vo)-1, adda[o->
vr(vo)] + addb[o->
vr(vo)] );
309 add += (adda[o->
vr(vo)]+addb[o->
vr(vo)])*o->
st(vo);
317 while ( cb>0 && (addb[b->
vr(cb)]==b->
sz(cb)) )
326 while ( ca >0 && (adda[a->
vr(ca)] == a->
szs()[ca]))
346 m_errors =
new creal_t[
neqs() ];
348 for ( sz_t v = 0; v <
nvr(); evrs[v] = v, eszs[v++] = 0 ) ;
349 for ( sz_t e = 0; e <
neqs(); e ++ )
350 for ( sz_t v = 0; v <
nvars(e); v ++ )
356 m_elenvs =
new eenv_t[
neqs() ];
360 for ( sz_t e = 0; e <
neqs(); e ++ )
363 for ( sz_t v = 0; v <
nvr(); eszs[v] = m_elenv.szs()[v], v++ ) ;
368 new (m_elenvs+e)
eenv_t(
nvr(),eszs,evrs);
369 ssz += m_elenvs[e].
sz() *
env(e)->
sz();
372 assert(
sizeof(creal_t*)==
sizeof(
unsigned*));
373 m_elbins =
new creal_t* [ 2*
neqs() + ssz];
375 m_eladdr = (
unsigned**)(m_elbins +
neqs());
376 unsigned * achnk = (
unsigned*)(m_eladdr +
neqs());
377 unsigned ellssz = m_elenv.sz() *
neqs();
378 creal_t * cchnk =
new creal_t[ ssz + ((rsafe?1:2)+(tsafe?1:2))*ellssz];
380 m_mnelldata = cchnk + ssz;
381 m_mxelldata = rsafe?(m_mnelldata+ellssz):m_mnelldata;
382 m_mntrnsfdata = m_mxelldata+ellssz;
383 m_mxtrnsfdata = tsafe?(m_mntrnsfdata+ellssz):m_mntrnsfdata;
385 for ( sz_t e = 0; e <
neqs(); e ++ )
387 unsigned isz = m_elenvs[e].sz() * eenvs[e].
sz();
392 prcinfo( m_eladdr[e], m_elbins[e], &m_elenv, m_elenvs+e, eenvs+e );
399 delete[] m_elbins[0];
403 inline creal_t *
mnelldata ( sz_t e ) {
return m_mnelldata + m_elenv.sz() * e; };
404 inline creal_t *
mxelldata ( sz_t e ) {
return m_mxelldata + m_elenv.sz() * e; };
406 inline creal_t *
mntrnsfdata( sz_t e ) {
return m_mntrnsfdata + m_elenv.sz() * e;};
407 inline creal_t *
mxtrnsfdata( sz_t e ) {
return m_mxtrnsfdata + m_elenv.sz() * e;};
411 void elevate_loop( sz_t e, creal_t * dst, creal_t * src, creal_t * bins,
unsigned * address )
414 std::fill( dst, dst + m_elenv.sz(), 0.0 );
415 for ( sz_t ia = 0; ia < m_elenvs[e].sz(); ia++ )
416 for ( sz_t ib = 0; ib < eenvs[e].
sz(); ib ++, c++ )
417 dst[address[c]] += bins[c] * src[ib];
452 inline void elevate( sz_t * eqs = 0, sz_t n = 0 )
457 for ( sz_t i = 0; i < n; i ++ )
459 if ( m_estate[eqs[i]] & stElevated )
continue;
460 if ( !(m_estate[eqs[i]] & stRestricted) ) { this->
error(
"elevate: restriction needed");
continue; };
472 creal_t * trsf_up, creal_t * trsf_dw,
473 creal_t * ell_up, creal_t * ell_dw )
476 creal_t *dst_up,*dst_dw,*src_up,*src_dw,cm;
477 for ( sz_t l = 0; l < n; l ++ )
480 dst_up = trsf_up + eqs[l] * m_elenv.sz();
481 dst_dw = trsf_dw + eqs[l] * m_elenv.sz();
484 for ( sz_t
c = 0;
c < n;
c ++ )
487 src_up = ell_up + eqs[
c] * m_elenv.sz();
488 src_dw = ell_dw + eqs[
c] * m_elenv.sz();
491 for ( sz_t k = 0; k < m_elenv.sz(); dst_dw[k] += cm*src_dw[k], k ++ )
495 for ( sz_t k = 0; k < m_elenv.sz(); k ++ )
496 dst_up[k] += cm*src_up[k];
501 for ( sz_t k = 0; k < m_elenv.sz(); dst_dw[k] += cm*src_up[k], k ++ )
505 for ( sz_t k = 0; k < m_elenv.sz(); k ++ )
506 dst_up[k] += cm*src_dw[k];
513 void _transform_( creal_t * mat, sz_t * eqs, sz_t n, creal_t * basetrsf, creal_t * baseell )
515 creal_t *dst,*src,cm;
516 for ( sz_t l = 0; l < n; l ++ )
519 dst = basetrsf + eqs[l] * m_elenv.sz();
521 for ( sz_t
c = 0;
c < n;
c ++ )
524 src = baseell + eqs[
c] * m_elenv.sz();
525 for ( sz_t k = 0; k < m_elenv.sz(); dst[k] += cm*src[k], k ++ ) ;
530 inline void transform( creal_t * mat, sz_t * eqs, sz_t n )
536 _transform_( mat, eqs, n, m_mntrnsfdata, m_mnelldata ); };
538 _transform_( mat, eqs, n, m_mxtrnsfdata, m_mxelldata );};
544 _transform_( mat, eqs, n, m_mntrnsfdata, m_mnelldata );
553 creal_t * pmn, * pmx;
554 for ( sz_t i = 0; i < ne; i ++ )
557 if ( m_estate[e] & stTransformed )
561 for ( sz_t v = 0; v <
nvr(); v ++ )
570 if ( m_estate[e] & stRestricted )
573 for ( sz_t lv = 0; lv <
env(e)->
nvr(); lv ++ )
583 if ( nobj == 0 ) this->
error(
"no restricted equations to project!\n");
601 inline void init( creal_t * inits = 0 )
610 system( sz_t neqs_, sz_t nvars_, sz_t
const * nvrs, sz_t
const ** vars, sz_t
const ** szs,
611 const creal_t& prmeps = (creal_t)1e-6,
612 const creal_t&
spceps = (creal_t)1e-12,
const creal_t& isoleps = (creal_t)1e-6,
bool use_prcnd =
true ) :
613 dstack_t(nvars_,prmeps,isoleps),
616 assert(use_prcnd || !use_prcnd );
621 eenvs =
new eenv_t[
neqs() ];
622 for (i=0;i<
neqs();i++) eenvs[i] =
eenv_t( nvrs[i], szs[i], vars[i] );
624 m_esft =
new sz_t [
neqs() +
629 m_estate = m_esft +
neqs(), m_eqssel = m_estate +
neqs(), m_vrssel = m_eqssel +
neqs();
630 for ( i = 0; i <
nvr(); m_vrssel[i] = i, i ++ ) ;
631 for ( i = m_esz = 0; i <
neqs(); m_ssz +=
size(i), i ++ )
633 m_estate[i] = 0; m_eqssel[i] = i; m_esft[i] =
m_ssz;
638 m_data =
new creal_t[ ((rsafe)?4:3)*m_ssz +
m_esz ];
640 m_mnrdata = m_data +
m_ssz;
641 m_mxrdata = rsafe?(m_mnrdata+
m_ssz):m_mnrdata;
642 m_mdata = m_mxrdata +
m_ssz;
643 m_evchnk = m_mdata +
m_ssz;
651 if ( eenvs )
delete[]
eenvs;
652 if ( m_esft )
delete[]
m_esft;
653 if ( m_data )
delete[]
m_data;
663 {
return m_slv->
env(a)->
sz() < m_slv->
env(b)->
sz(); };
670 {
return m_slv->
nvars(a) < m_slv->
nvars(b); };
sz_t size(sz_t e) const
Definition: system_system.h:89
static const int RSTCMDRL
Definition: system_system.h:60
void dreset()
Definition: system_system.h:588
void brestrictRL(C *s, const eenv &env, int v, const T &a, const T &b, const T &c, const T &d)
Definition: tensor_eenv_loops.hpp:470
void init(creal_t *inits=0)
Definition: system_system.h:601
void meval(creal_t *dst, sz_t e, creal_t *prms, int nsmp=1)
Definition: system_system.h:134
creal_t * m_data
Definition: system_system.h:52
void fill(C *a, unsigned n, int s, const C &x)
Definition: tensor_vctops.hpp:152
const C & b
Definition: Interval_glue.hpp:25
void _safe_transform_(creal_t *mat, sz_t *eqs, sz_t n, creal_t *trsf_up, creal_t *trsf_dw, creal_t *ell_up, creal_t *ell_dw)
Definition: system_system.h:471
creal_t * mnelldata(sz_t e)
Definition: system_system.h:403
eenv_t m_elenv
Definition: system_system.h:264
dstack_t::interval_t interval_t
Definition: system_system.h:31
creal_t * trnsfdata(sz_t e)
Definition: system_system.h:408
void set_monomials(creal_t *src, sz_t e, bool scale_=false)
Definition: system_system.h:137
int * szs()
Definition: tensor_eenv_fcts.hpp:12
creal_t * m_evchnk
Definition: system_system.h:52
creal_t * data(sz_t e)
Definition: system_system.h:96
static const int stElevated
Definition: system_system.h:42
void szvsort()
Definition: system_system.h:675
const creal_t * rdata(sz_t e) const
Definition: system_system.h:99
creal_t * m_mntrnsfdata
Definition: system_system.h:273
bool thickness()
Definition: system_system.h:589
Definition: system_system.h:659
system(sz_t neqs_, sz_t nvars_, sz_t const *nvrs, sz_t const **vars, sz_t const **szs, const creal_t &prmeps=(creal_t) 1e-6, const creal_t &spceps=(creal_t) 1e-12, const creal_t &isoleps=(creal_t) 1e-6, bool use_prcnd=true)
Definition: system_system.h:610
creal_t * m_mnrdata
Definition: system_system.h:52
void _free_elldata_()
Definition: system_system.h:396
creal_t m_bb
Definition: system_system.h:63
std::ostream & print(std::ostream &o, const rstcmd_t &rmc)
Definition: system_system.h:75
sz_t m_neqs
Definition: system_system.h:38
sz_t nvr() const
Definition: system_system.h:84
void force_elevate(sz_t *eqs=0, sz_t n=0)
Definition: system_system.h:468
void meval(creal_t *dst, sz_t *eqs, sz_t n, creal_t *prms, int nsmp=1)
Definition: system_system.h:120
void restrict(sz_t *eqs=0, sz_t n=0)
Definition: system_system.h:259
static const int stTransformed
Definition: system_system.h:43
void init(creal_t *inits)
Definition: system_dstack.h:50
const creal_t * rmxdata(sz_t e) const
Definition: system_system.h:103
Intervals< creal_t >::rdw_t interval_t
Definition: system_dstack.h:23
Definition: system_system.h:57
void elevate(sz_t e, const texp::true_t &)
Definition: system_system.h:440
sz_t varname(sz_t e, sz_t v) const
Definition: system_system.h:91
void reset()
Definition: system_system.h:593
void restrict(bernstein< C > &rst, int v, const T &a, const T &b)
Definition: tensor_bernstein_fcts.hpp:347
void restrict(sz_t e)
Definition: system_system.h:263
void _rst_(sz_t e, creal_t *base)
Definition: system_system.h:181
bool operator()(int a, int b) const
Definition: system_system.h:669
int sz_t
Definition: system_system.h:35
sz_t size(sz_t e, sz_t v) const
Definition: system_system.h:90
void elevate(sz_t e)
Definition: system_system.h:469
void elevate(sz_t e, const texp::false_t &)
Definition: system_system.h:433
int m_type
Definition: system_system.h:59
sz_t stride(sz_t e, sz_t v) const
Definition: system_system.h:92
cmp_sze(self_t *slv)
Definition: system_system.h:664
bool thickness(const creal_t &eps)
Definition: system_pstack.h:33
Definition: system_pstack.h:16
Definition: tensor_eenv.hpp:9
bool project(sz_t *eqs=0, sz_t ne=0)
Definition: system_system.h:548
creal_t * m_errors
Definition: system_system.h:51
~system()
Definition: system_system.h:647
void _rstcmd_()
Definition: system_system.h:165
rstcmd_t * m_rstcmd
Definition: system_system.h:80
int vr(int lv) const
return the global id for variable lv
Definition: tensor_eenv_fcts.hpp:26
creal_t * rmndata(sz_t e)
Definition: system_system.h:100
void transform(creal_t *mat, sz_t *eqs, sz_t n)
Definition: system_system.h:530
Definition: rounding_mode.hpp:71
void reset()
Definition: system_dstack.h:60
bool operator()(int a, int b) const
Definition: system_system.h:662
const creal_t & spceps() const
Definition: system_system.h:94
unsigned ** m_eladdr
Definition: system_system.h:270
void tomonoms(sz_t e)
Definition: system_system.h:107
int nvr() const
number of variables
Definition: tensor_eenv_fcts.hpp:9
structure defining a positive answer
Definition: texp_bool.hpp:7
TMPL void copy(Polynomial &r, const Polynomial &a)
Copy of a in r.
Definition: sparse_monomials.hpp:613
real_t creal_t
Definition: system_system.h:28
void _transform_(creal_t *mat, sz_t *eqs, sz_t n, creal_t *basetrsf, creal_t *baseell)
Definition: system_system.h:513
void push(sz_t v, creal_t *&pmn, creal_t *&pmx, sz_t sz)
Definition: system_pstack.h:25
void set_monomials2(const creal_t *src, sz_t e, bool scale_=false)
Definition: system_system.h:151
creal_t * rmxdata(sz_t e)
Definition: system_system.h:102
void error(const char *msg)
Definition: system_dstack.h:26
void _alloc_elldata_()
Definition: system_system.h:336
sz_t m_ssz
Definition: system_system.h:48
creal_t m_aa
Definition: system_system.h:62
creal_t * m_mxtrnsfdata
Definition: system_system.h:274
sz_t m_esz
Definition: system_system.h:48
eenv_t * env(sz_t i) const
Definition: system_system.h:87
T updiv(const T &a, const T &b)
Definition: rounding_mode.hpp:98
creal_t * m_mnelldata
Definition: system_system.h:271
T dwdiv(const T &a, const T &b)
Definition: rounding_mode.hpp:100
void elevate(sz_t *eqs=0, sz_t n=0)
Definition: system_system.h:452
Definition: system_system.h:25
T dwsub(const T &a, const T &b)
Definition: rounding_mode.hpp:92
void prcinfo(unsigned *address, creal_t *bindata, eenv_t *o, eenv_t *a, eenv_t *b)
Definition: system_system.h:284
Definition: system_vstack.h:16
creal_t * m_mxrdata
Definition: system_system.h:52
int sz() const
return the total number of coefficients of the dense representation
Definition: tensor_eenv_fcts.hpp:16
void maxs(OutputIterator _maxs_, const C *data, const eenv &env, int v)
Definition: tensor_eenv_loops.hpp:106
self_t * m_slv
Definition: system_system.h:668
system()
Definition: system_system.h:608
system< creal_t, rsafe, tsafe > self_t
Definition: system_system.h:33
void levalm(R &result, const C *data, const eenv &env, const P &p)
Definition: tensor_eenv_loops.hpp:20
creal_t * mxelldata(sz_t e)
Definition: system_system.h:404
const creal_t * data(sz_t e) const
Definition: system_system.h:97
void set_bernstein2(const creal_t *src, sz_t e)
Definition: system_system.h:159
creal_t * mntrnsfdata(sz_t e)
Definition: system_system.h:406
void szssort()
Definition: system_system.h:673
T upsub(const T &a, const T &b)
Definition: rounding_mode.hpp:90
void elevate_loop(sz_t e, creal_t *dst, creal_t *src, creal_t *bins, unsigned *address)
Definition: system_system.h:411
interval_t * current()
Definition: system_dstack.h:32
static const int RSTCMDLR
Definition: system_system.h:61
sz_t nvr() const
Definition: system_dstack.h:35
creal_t * m_mdata
Definition: system_system.h:52
eenv_t * eenvs
Definition: system_system.h:39
sz_t * m_eqssel
Definition: system_system.h:46
const C & c
Definition: Interval_glue.hpp:45
binomials< creal_t > m_bzenv
Definition: system_system.h:54
dstack< creal_t > dstack_t
Definition: system_system.h:30
creal_t * m_mxelldata
Definition: system_system.h:272
void convertm2b(bernstein< C > &mpl)
Definition: tensor_bernstein_fcts.hpp:31
creal_t m_seps
Definition: system_system.h:53
creal_t * mdata(sz_t e)
Definition: system_system.h:114
pstack< creal_t > pstack_t
Definition: system_system.h:29
structure defining a negative answer
Definition: texp_bool.hpp:9
tensor::eenv eenv_t
Definition: system_system.h:34
const creal_t * rmndata(sz_t e) const
Definition: system_system.h:101
Definition: system_system.h:666
int st(int v) const
return the stride for variable v
Definition: tensor_eenv_fcts.hpp:24
sz_t neqs() const
Definition: system_system.h:85
sz_t * m_esft
Definition: system_system.h:48
creal_t * elldata(sz_t e)
Definition: system_system.h:405
eenv_t * m_elenvs
Definition: system_system.h:264
sz_t nvars(sz_t e) const
Definition: system_system.h:88
void convertb2m(monomials< C > &mpl)
Definition: tensor_bernstein_fcts.hpp:26
rstcmd_t(int t, const creal_t &a, const creal_t &b)
Definition: system_system.h:65
void set_bernstein(creal_t *src, sz_t e)
Definition: system_system.h:145
creal_t m_ba
Definition: system_system.h:63
creal_t * mxtrnsfdata(sz_t e)
Definition: system_system.h:407
pstack_t::vstack_t vstack_t
Definition: system_system.h:32
creal_t ** m_elbins
Definition: system_system.h:269
Interval< T, r > max(const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:135
void add(sz_t v, real_t *const pmn, real_t *const pmx, sz_t sz)
Definition: system_pstack.h:27
Definition: system_dstack.h:20
static const int stRestricted
Definition: system_system.h:41
int mxvr() const
Definition: tensor_eenv.hpp:67
self_t * m_slv
Definition: system_system.h:661
void mins(OutputIterator _mins_, const C *data, const eenv &env, int v)
Definition: tensor_eenv_loops.hpp:123
void reset()
Definition: system_pstack.h:23
creal_t * rdata(sz_t e)
Definition: system_system.h:98
rstcmd_t()
Definition: system_system.h:64
creal_t m_ab
Definition: system_system.h:62
void brestrictLR(C *s, const eenv &env, int v, const T &a, const T &b, const T &c, const T &d)
Definition: tensor_eenv_loops.hpp:454
sz_t * m_estate
Definition: system_system.h:46
sz_t * m_vrssel
Definition: system_system.h:46
#define assert(expr, msg)
Definition: shared_object.hpp:57
static const int stMonomials
Definition: system_system.h:44