Developer documentation

system_system.h
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: system.h,v 1.1 2005/07/11 10:03:57 jppavone Exp $
5  ********************************************************************/
6 #ifndef realroot_SOLVE_SBDSLV_SYSTEM_HPP
7 #define realroot_SOLVE_SBDSLV_SYSTEM_HPP
8 //--------------------------------------------------------------------
9 #include <assert.h>
11 //#include <realroot/bernstein_eenv.hpp>
12 #include <realroot/tensor_eenv.hpp>
14 #include <fstream>
15 #include <realroot/method_base.hpp>
16 #include <realroot/system_dstack.h>
17 #include <realroot/system_pstack.h>
18 
19 //--------------------------------------------------------------------
20 namespace mmx {
21 //--------------------------------------------------------------------
22 namespace realroot
23 {
24 template<typename real_t, bool rsafe = false, bool tsafe = false>
25 struct system : dstack<real_t>, pstack<real_t>
26 {
27  /* types */
28  typedef real_t creal_t;
31  typedef typename dstack_t::interval_t interval_t;
32  typedef typename pstack_t::vstack_t vstack_t;
35  typedef int sz_t;
36 
37  /* description du systeme */
38  sz_t m_neqs;
39  eenv_t * eenvs;
40 
41  static const int stRestricted = 1; /* restriction disponible */
42  static const int stElevated = 2; /* elevation disponible */
43  static const int stTransformed = 4; /* transformation disponible */
44  static const int stMonomials = 8; /* version monomiale disponible */
45  /* etats des equations, selection d'equations, selection des variables */
47  /* taille max, taille totale, addresses des équations */
49  /* systeme original, formes monomiales, buffer d'evaluation, restrictions */
50 
51  creal_t *m_errors;
53  creal_t m_seps;
54  binomials< creal_t > m_bzenv; /* cache des coefficients binomiaux (conversions) */
55 
56 
57  struct rstcmd_t /* commande de restriction = ordre d'application de de casteljau */
58  {
59  int m_type;
60  static const int RSTCMDRL = 0; /* droite puis gauche */
61  static const int RSTCMDLR = 1; /* gauche puis droite */
62  creal_t m_aa; creal_t m_ab; /* valeur utilisée à gauche */
63  creal_t m_ba; creal_t m_bb; /* valeur utilisée à droite */
64  rstcmd_t(){};
65  rstcmd_t( int t, const creal_t& a, const creal_t& b ) : m_type(t)
66  {
67  using namespace numerics::rdw;
68  m_ab = a;
69  m_ba = b;
70  m_aa = upsub((creal_t)1.0,a);
71  m_bb = upsub((creal_t)1.0,b);
72  };
73  };
74 
75  std::ostream& print( std::ostream& o, const rstcmd_t& rmc )
76  {
77  o << rmc.m_aa << " " << rmc.m_ab << ", " << rmc.m_ba << ", " << rmc.m_bb;
78  return o;
79 
80  };
81  rstcmd_t * m_rstcmd; /* commandes de restriction pour chaque variable */
82 
83  /* acces environement global */
84  inline sz_t nvr() const { return dstack_t::nvr(); };
85  inline sz_t neqs() const { return m_neqs; };
86  /* acces environements locaux */
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); };
93  /* precision (securité) */
94  inline const creal_t & spceps() const { return m_seps; };
95  /* acces aux équations */
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]; };
104 
105  /* acces aux équations (monomiales) */
106 
107  void tomonoms( sz_t e )
108  {
109  std::copy(data(e),data(e)+size(e),m_mdata+m_esft[e]);
110  convertb2m(m_mdata+m_esft[e],eenvs[e],m_bzenv);
111  m_estate[e] |= stMonomials;
112  };
113 
114  inline creal_t * mdata( sz_t e )
115  {
116  if ( m_estate[e] & stMonomials ) return m_mdata + m_esft[e]; else tomonoms(e);
117  return mdata(e);
118  };
119 
120  void meval( creal_t * dst, sz_t * eqs, sz_t n, creal_t * prms, int nsmp = 1 )
121  {
122  /* dst+i*n pour i = 0..nsmp pointe sur n valeurs correspondant aux évaluation des équations */
123  /* eqs[j], j = 0..n sous forme monomiales sur les valeurs pointées par prms+i*n, (sens global) */
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 ++ )
127  {
128  sz_t e = eqs[ie]; assert(e<neqs());
129  for ( sz_t v = 0; v < nvars(e); locals[v] = prms[varname(e,v)], v++ ) ;
130  levalm(dst[e],mdata(e),eenvs[e],locals);
131  };
132  };
133 
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); };
136 
137  void set_monomials( creal_t * src, sz_t e, bool scale_ = false )
138  {
139  m_estate[e] = stMonomials;
140  std::copy(src,src+size(e),data(e));
141  std::copy(src,src+size(e),m_mdata+m_esft[e]);
142  convertm2b(data(e),eenvs[e],m_bzenv);
143  };
144 
145  void set_bernstein( creal_t * src, sz_t e )
146  {
147  m_estate[e] = 0;
148  std::copy(src,src+size(e),data(e));
149  };
150 
151  void set_monomials2( const creal_t * src, sz_t e, bool scale_ = false )
152  {
153  m_estate[e] = stMonomials;
154  std::copy(src,src+size(e),data(e));
155  std::copy(src,src+size(e),m_mdata+m_esft[e]);
156  convertm2b(data(e),eenvs[e],m_bzenv);
157  };
158 
159  void set_bernstein2( const creal_t * src, sz_t e )
160  {
161  m_estate[e] = 0;
162  std::copy(src,src+size(e),data(e));
163  };
164 
165  void _rstcmd_() /* mise à jour des commandes de restriction par rapport au domaine courant */
166  {
167  numerics::rounding<creal_t> rnd( numerics::rnd_dw() );
168  using namespace numerics::rdw;
169  for ( sz_t v = 0; v < nvr(); v ++ )
170  {
171  creal_t a = this->current()[v].lower(); // -2
172  creal_t b = this->current()[v].upper(); // 0
173  assert(a<=b);
174  if ( a > (creal_t)1.0 )
175  new (m_rstcmd+v) rstcmd_t(rstcmd_t::RSTCMDRL,dwdiv(a,b),b);
176  else
177  new (m_rstcmd+v) rstcmd_t(rstcmd_t::RSTCMDLR,a,updiv(upsub(b,a),dwsub((creal_t)1.0,a)));
178  };
179  };
180 
181  void _rst_( sz_t e, creal_t * base ) /* restriction de l'equation e dans le buffer de restriction donné par base */
182  {
183  std::copy(data(e),data(e)+size(e),base+m_esft[e]);
184 
185  for ( sz_t v = 0; v < nvars(e); v ++ ) /* pour toute les variables de l'équation e */
186  {
187  /* application des commandes de restriction correspondantes (passage local->global) */
188  switch( m_rstcmd[ varname(e,v) ].m_type )
189  {
190  case rstcmd_t::RSTCMDRL: /* restriction à droite puis à gauche */
191  brestrictRL(base+m_esft[e],eenvs[e],v,
192  m_rstcmd[varname(e,v)].m_aa,
193  m_rstcmd[varname(e,v)].m_ab,
194  m_rstcmd[varname(e,v)].m_ba,
195  m_rstcmd[varname(e,v)].m_bb );
196  break;
197  case rstcmd_t::RSTCMDLR: /* restriction à gauche puis à droite */
198  brestrictLR(base+m_esft[e],eenvs[e],v,
199  m_rstcmd[varname(e,v)].m_aa,
200  m_rstcmd[varname(e,v)].m_ab,
201  m_rstcmd[varname(e,v)].m_ba,
202  m_rstcmd[varname(e,v)].m_bb );
203  break;
204  };
205  };
206  };
207 
208 
209 private:
210 
211  void restrict( sz_t * eqs , sz_t n, creal_t * ) /* restriction des équations données par eqs[i], i = 0..n-1 */
212  {
213  for ( sz_t e = 0; e < n; e ++ )
214  {
215  if ( m_estate[eqs[e]] & stRestricted ) continue; /* on vérifie que l'équation n'a pas déjà été restreinte */
216  _rst_(eqs[e],m_mnrdata); /* sinon on calcule sa restriction */
217  m_estate[eqs[e]] |= stRestricted; /* on note que la restriction est maintenant connue */
218  };
219  };
220 
221  inline void restrict( sz_t * eqs, sz_t n, const texp::false_t& ) /* restriction en arrondi au plus proche */
222  {
223  _rstcmd_(); /* calcul des commandes de restriction */
224  assert(m_mnrdata==m_mxrdata);
225  numerics::rounding<creal_t> rnd( numerics::rnd_nr() ); /* passage en mode d'arrondi au plus proche */
226  restrict(eqs,n,m_mnrdata); /* restriction */
227  };
228 
229  void GETERROR( double * mn_, double * mx, int e )
230  {
231  int sze = size(e);
232  creal_t err = 0;
233  for ( double * mn = mn_; mn != mn_+sze; mn++, mx++ )
234  {
235  creal_t d = *mx-*mn;
236  if ( d < 0 ) { *mn=*mx; d = -d; };
237  if ( d > err ) err = d;
238  };
239  };
240 
241  inline void restrict( sz_t * eqs, sz_t n, const texp::true_t& ) /* restriction en arrondi inférieur et supérieur */
242  {
243  _rstcmd_(); /* calcul des commandes de restriction */
244  {
245  numerics::rounding<creal_t> rnd( numerics::rnd_dw() ); /* passage en mode d'arrondi inférieur */
246  restrict(eqs,n,m_mnrdata); /* restriction */
247  };
248  {
249  numerics::rounding<creal_t> rnd( numerics::rnd_up() ); /* passage en mode d'arrondi inférieur */
250  restrict(eqs,n,m_mxrdata); /* restriction */
251  };
252  for ( int e = 0; e < n; e ++ )
253  {
254  GETERROR(rmndata(eqs[e]),rmxdata(eqs[e]),eqs[e]);
255  };
256  };
257 
258 public:
259  inline void restrict( sz_t * eqs = 0, sz_t n = 0 ) /* restrict, dispatch sur les fonctions precedentes */
260  {
261 
262  restrict( (eqs)?eqs:m_eqssel, (n)?n:neqs(), typename texp::BoolType< rsafe >::result_t() ); };
263  inline void restrict( sz_t e ) /* restriction d'une seule équation */
264  { sz_t tmp[] = { e }; restrict( tmp, 1 ); };
265 
266  // private:
267 
268  eenv_t m_elenv, *m_elenvs; /* environement(s) d'elevation du systeme */
269  creal_t ** m_elbins; /* coefficients binomiaux pour l'élévation */
270  unsigned ** m_eladdr; /* addresses de destination des coefficients*/
271  creal_t * m_mnelldata; /* élévation des restrictions basses */
272  creal_t * m_mxelldata; /* élévation des restrictions hautes */
273  creal_t * m_mntrnsfdata; /* transformations basses */
274  creal_t * m_mxtrnsfdata; /* transformations hautes */
275 
276  /* precalcul pour l'élévation */
277  /* -------------------------- */
278  /* avantages: */
279  /* - elevation reduite à un produit scalaire */
280  /* inconvenients: */
281  /* - consomme beaucoup de mémoire */
282  /* - risque d'overflow existe */
283 
284  void prcinfo( unsigned * address, creal_t * bindata, eenv_t * o, eenv_t * a, eenv_t * b )
285  {
286  int ia, ib, add, vo, ca, cb;
287  sz_t v;
288  int vidx = o->mxvr(); /* index de la variable maximum (scotch dans eenv) */
289  sz_t adda[vidx+1];
290  sz_t addb[vidx+1];
291  unsigned c = 0;
292  creal_t sumsc = 0.0;
293 
294  std::fill( adda, adda + vidx+1, 0 );
295  for ( ia = 0; ia < a->sz(); ia ++ )
296  {
297  std::fill( addb, addb + vidx+1, 0 );
298  for ( ib = 0; ib < b->sz(); ib ++ )
299  {
300  creal_t sc = 1.0;
301  /* on risque l'overflow ici */
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++ )
305  {
306  if ( o->sz(vo) > 1 )
307  {
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);
310  };
311  }
312  sumsc += sc;
313  address[c] = add;
314  bindata[c++] = sc;
315  cb = b->nvr()-1;
316  addb[b->vr(cb)] ++;
317  while ( cb>0 && (addb[b->vr(cb)]==b->sz(cb)) )
318  {
319  addb[b->vr(cb)] = 0;
320  cb--;
321  addb[b->vr(cb)]++;
322  };
323  }
324  ca = a->nvr()-1;
325  adda[a->vr(ca)]++;
326  while ( ca >0 && (adda[a->vr(ca)] == a->szs()[ca]))
327  {
328  adda[a->vr(ca)] = 0;
329  ca--;
330  adda[a->vr(ca)]++;
331  };
332  }
333  };
334 
335  /* collecte des informations utiles pour l'élévation (si requise) */
337  {
338  numerics::rounding<creal_t> rnd(numerics::rnd_nr());
339  assert(m_elenvs==0);
340  //int nvrMin = std::min(1000000, nvr());
341  int nvrMin = nvr();
342  sz_t evrs[nvrMin];
343 
344  sz_t eszs[nvrMin];
345 
346  m_errors = new creal_t[ neqs() ];
347 
348  for ( sz_t v = 0; v < nvr(); evrs[v] = v, eszs[v++] = 0 ) ;
349  for ( sz_t e = 0; e < neqs(); e ++ ) /* recuperation de l'environement élevé */
350  for ( sz_t v = 0; v < nvars(e); v ++ )
351  if ( eszs[varname(e,v)] < size(e,v) ) eszs[varname(e,v)] = size(e,v);
352 
353  m_elenv.~eenv_t();
354  new (&m_elenv) eenv_t(nvr(),eszs,evrs);
355 
356  m_elenvs = new eenv_t[ neqs() ]; /* allocation des "environements d'élevation". (differences avec m_elenv) */
357  assert(m_elenvs);
358 
359  unsigned ssz = 0; /* quantité de coefficients necessaires aux calculs d'élevation */
360  for ( sz_t e = 0; e < neqs(); e ++ ) /* pour tout nos environements */
361  {
362  /* s'il ne contient pas la variable v on initialise sa difference avec l'environement élevé */
363  for ( sz_t v = 0; v < nvr(); eszs[v] = m_elenv.szs()[v], v++ ) ;
364  /* sinon pour chacune de ses variables on calcule la différence */
365  for ( sz_t v = 0; v < nvars(e); v ++ ) eszs[varname(e,v)] = m_elenv.szs()[varname(e,v)]-size(e,v)+1;
366  /* on initialise l'environement d'élevation que l'on vient de calculer */
367  (m_elenvs+e)->~eenv_t();
368  new (m_elenvs+e) eenv_t(nvr(),eszs,evrs);
369  ssz += m_elenvs[e].sz() * env(e)->sz(); /* voir def de ssz */
370  };
371 
372  assert(sizeof(creal_t*)==sizeof(unsigned*)); /* normalement une addresse est une addresse */
373  m_elbins = new creal_t* [ 2*neqs() + ssz];
374  assert(m_elbins);
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];
379  assert(cchnk);
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;
384 
385  for ( sz_t e = 0; e < neqs(); e ++ )
386  {
387  unsigned isz = m_elenvs[e].sz() * eenvs[e].sz();
388  m_elbins[e] = cchnk;
389  m_eladdr[e] = achnk;
390  cchnk += isz;
391  achnk += isz;
392  prcinfo( m_eladdr[e], m_elbins[e], &m_elenv, m_elenvs+e, eenvs+e );
393  };
394  };
395 
397  {
398  if ( m_elenvs ) delete[] m_elenvs;
399  delete[] m_elbins[0];
400  delete[] m_elbins;
401  };
402 
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; };
405  inline creal_t * elldata( sz_t e ) { return mnelldata(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;};
408  inline creal_t * trnsfdata ( sz_t e ) { return mntrnsfdata(e); };
409 
410  /* boucle d'élevation */
411  void elevate_loop( sz_t e, creal_t * dst, creal_t * src, creal_t * bins, unsigned * address )
412  {
413  int c = 0;
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];
418  /* pourrait être remplacé par */
419  /* (1) dst[obins[ia]+osrc[ib]] += bins[c] * src[ib] */
420  /* pour des raisons d'économie mémoire */
421  /* (2) bins[c] par sqbinsa[c]*sqbinsb[c]*src[a] */
422  /* où sqbinsa[c] = binsa[ia]/sqrt(binsd[ia+ib]) */
423  /* pour éviter les dépassements de capacités */
424  /* les racines carrées devant être bien-entendues */
425  /* précalculées à la création */
426  /* la meilleure solution serait d'elever progressivement */
427  /* l'équation, mais le code n'est pas encore clair pour */
428  /* l'instant, quand ce sera le cas on sortira l'élevation*/
429  /* du systeme comme pour la pile de projection */
430  };
431 
432  /* elevation de l'equation e (safe = false) */
433  inline void elevate( sz_t e, const texp::false_t& )
434  {
435  numerics::rounding<creal_t> rnd( numerics::rnd_nr() );
436  elevate_loop( e, elldata(e), rdata(e),m_elbins[e],m_eladdr[e] );
437  };
438 
439  /* elevation de l'equation e (safe = true) */
440  inline void elevate( sz_t e, const texp::true_t& )
441  {
442  {
443  numerics::rounding<creal_t> rnd( numerics::rnd_dw() );
444  elevate_loop( e, mnelldata(e), rmndata(e), m_elbins[e], m_eladdr[e] );
445  };
446  {
447  numerics::rounding<creal_t> rnd( numerics::rnd_up() );
448  elevate_loop( e, mxelldata(e), rmxdata(e), m_elbins[e], m_eladdr[e] );
449  };
450  };
451 
452  inline void elevate( sz_t * eqs = 0, sz_t n = 0 )
453  {
454  eqs = eqs?eqs:m_eqssel;
455  n = n?n:neqs();
456  if ( m_elenvs == 0 ) _alloc_elldata_();
457  for ( sz_t i = 0; i < n; i ++ )
458  {
459  if ( m_estate[eqs[i]] & stElevated ) continue;
460  if ( !(m_estate[eqs[i]] & stRestricted) ) { this->error("elevate: restriction needed"); continue; };
461  /* pour le cas ou m_elenv est l'environement d'un équation du système (non-exploité) */
462  if ( mnelldata(eqs[i]) != rmndata(eqs[i]) )
463  elevate( eqs[i],typename texp::BoolType<rsafe>::result_t() );
464  m_estate[eqs[i]] |= stElevated;
465  };
466  };
467 
468  inline void force_elevate( sz_t * eqs = 0, sz_t n = 0 ) { restrict(eqs,n); elevate(eqs,n); };
469  inline void elevate( sz_t e ) { sz_t eqs[] ={ e }; elevate( eqs, 1 ); };
470 
471  void _safe_transform_( creal_t * mat, sz_t * eqs, sz_t n,
472  creal_t * trsf_up, creal_t * trsf_dw,
473  creal_t * ell_up, creal_t * ell_dw )
474  {
475  numerics::rounding<creal_t> rnd( numerics::rnd_dw() );
476  creal_t *dst_up,*dst_dw,*src_up,*src_dw,cm;
477  for ( sz_t l = 0; l < n; l ++ )
478  {
479  m_estate[eqs[l]] |= stTransformed;
480  dst_up = trsf_up + eqs[l] * m_elenv.sz();
481  dst_dw = trsf_dw + eqs[l] * m_elenv.sz();
482  std::fill( dst_up, dst_up + m_elenv.sz(), (creal_t)0.0 );
483  std::fill( dst_dw, dst_dw + m_elenv.sz(), (creal_t)0.0 );
484  for ( sz_t c = 0; c < n; c ++ )
485  {
486  cm = mat[l*n+c];
487  src_up = ell_up + eqs[c] * m_elenv.sz();
488  src_dw = ell_dw + eqs[c] * m_elenv.sz();
489  if ( cm > 0 )
490  {
491  for ( sz_t k = 0; k < m_elenv.sz(); dst_dw[k] += cm*src_dw[k], k ++ )
492  ;
493  {
494  numerics::rounding<creal_t> rnd(numerics::rnd_up());
495  for ( sz_t k = 0; k < m_elenv.sz(); k ++ )
496  dst_up[k] += cm*src_up[k];
497  };
498  };
499  if ( cm < 0 )
500  {
501  for ( sz_t k = 0; k < m_elenv.sz(); dst_dw[k] += cm*src_up[k], k ++ )
502  ;
503  {
504  numerics::rounding<creal_t> rnd(numerics::rnd_up());
505  for ( sz_t k = 0; k < m_elenv.sz(); k ++ )
506  dst_up[k] += cm*src_dw[k];
507  };
508  };
509  };
510  };
511  };
512 
513  void _transform_( creal_t * mat, sz_t * eqs, sz_t n, creal_t * basetrsf, creal_t * baseell )
514  {
515  creal_t *dst,*src,cm;
516  for ( sz_t l = 0; l < n; l ++ )
517  {
518  m_estate[eqs[l]] |= stTransformed;
519  dst = basetrsf + eqs[l] * m_elenv.sz();
520  std::fill( dst, dst + m_elenv.sz(), (creal_t)0.0 );
521  for ( sz_t c = 0; c < n; c ++ )
522  {
523  cm = mat[l*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 ++ ) ;
526  };
527  };
528  };
529 
530  inline void transform( creal_t * mat, sz_t * eqs, sz_t n )
531  {
532  elevate( eqs, n );
533  if ( tsafe )
534  {
535  { numerics::rounding< creal_t > rnd( numerics::rnd_dw() );
536  _transform_( mat, eqs, n, m_mntrnsfdata, m_mnelldata ); };
537  {numerics::rounding< creal_t > rnd( numerics::rnd_up() );
538  _transform_( mat, eqs, n, m_mxtrnsfdata, m_mxelldata );};
539  //_safe_transform_(mat,eqs,n,m_mxtrnsfdata,m_mntrnsfdata,m_mxelldata, m_mnelldata );
540  }
541  else
542  {
543  numerics::rounding< creal_t > rnd( numerics::rnd_nr() );
544  _transform_( mat, eqs, n, m_mntrnsfdata, m_mnelldata );
545  };
546  };
547 
548  bool project( sz_t * eqs = 0 , sz_t ne = 0 )
549  {
550  ne = ne?ne:neqs();
551  eqs=eqs?eqs:m_eqssel;
552  unsigned nobj = 0;
553  creal_t * pmn, * pmx;
554  for ( sz_t i = 0; i < ne; i ++ )
555  {
556  sz_t e = eqs[i];
557  if ( m_estate[e] & stTransformed )
558  {
559  // std::cout << "project " << i << " transformed \n";
560  nobj ++;
561  for ( sz_t v = 0; v < nvr(); v ++ )
562  {
563  pstack_t::push(v,pmn,pmx,m_elenv.sz(v));
564  mins(pmn,mntrnsfdata(e), m_elenv, v );
565  maxs(pmx,mxtrnsfdata(e), m_elenv, v );
566  };
567  continue;
568  };
569 
570  if ( m_estate[e] & stRestricted )
571  {
572  nobj ++;
573  for ( sz_t lv = 0; lv < env(e)->nvr(); lv ++ )
574  {
575  pstack_t::push(varname(e,lv),pmn,pmx,size(e,lv));
576  mins(pmn,rmndata(e),eenvs[e],lv);
577  maxs(pmx,rmxdata(e),eenvs[e],lv);
578  };
579  continue;
580  };
581  };
582 
583  if ( nobj == 0 ) this->error("no restricted equations to project!\n");
584  return true;
585  };
586 
587  /* reinitialisation de l'état des équations */
588  inline void dreset() { dstack_t::reset(); };
589  bool thickness()
590  {
591  return pstack_t::thickness( m_seps);
592  };
593  inline void reset()
594  {
595  dstack_t::reset();
596  pstack_t::reset();
597  /* la seule information indépendante du domaine est la forme monomiale */
598  for ( sz_t e = 0; e < neqs(); m_estate[e] &= stMonomials, e ++ ) ;
599  };
600 
601  inline void init( creal_t * inits = 0 )
602  {
603  dstack_t::init( inits ); /* initialisation du domaine de recherche */
604  reset();
605  };
606 
607 
608  system() { eenvs = 0; };
609 
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),
614  pstack_t(nvars_)
615  {
616  assert(use_prcnd || !use_prcnd );
617  m_seps = spceps;
618  sz_t i;
619  m_neqs = neqs_;
620  m_rstcmd = new rstcmd_t[ nvr() ];
621  eenvs = new eenv_t[ neqs() ];
622  for (i=0;i<neqs();i++) eenvs[i] = eenv_t( nvrs[i], szs[i], vars[i] );
623  m_ssz = 0;
624  m_esft = new sz_t [ neqs() /* offsets */+
625  neqs() /* états */+
626  neqs() /* séléction */+
627  nvr() /* séléction */ ];
628  assert(m_esft);
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 ++ )
632  {
633  m_estate[i] = 0; m_eqssel[i] = i; m_esft[i] = m_ssz;
634  m_esz = std::max(m_esz,size(i));
635  };
636 
637  m_elenvs = 0;
638  m_data = new creal_t[ ((rsafe)?4:3)*m_ssz + m_esz ];
639  assert( m_data );
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;
644  _alloc_elldata_();
645  };
646 
648  {
649  if ( m_errors ) delete[] m_errors;
650  if ( m_rstcmd ) delete[] m_rstcmd;
651  if ( eenvs ) delete[] eenvs;
652  if ( m_esft ) delete[] m_esft;
653  if ( m_data ) delete[] m_data;
654  _free_elldata_();
655  };
656 
657 
658  // gloutonneries
659  struct cmp_sze
660  {
661  self_t * m_slv;
662  bool operator()( int a, int b ) const
663  { return m_slv->env(a)->sz() < m_slv->env(b)->sz(); };
664  cmp_sze( self_t * slv ) : m_slv(slv){};
665  };
666  struct cmp_szv
667  {
668  self_t * m_slv;
669  bool operator()( int a, int b ) const
670  { return m_slv->nvars(a) < m_slv->nvars(b); };
671  };
672  /* tri sur la taille */
673  void szssort() { std::sort( m_eqssel, m_eqssel + neqs(), cmp_sze(this) ); };
674  /* tri sur le nombre de variables */
675  void szvsort() { std::sort( m_eqssel, m_eqssel + neqs(), cmp_szv(this) ); };
676 
677 
678 };
679 
680 };
681 
682 
683 
684 //--------------------------------------------------------------------
685 } //namespace mmx
686 /********************************************************************/
687 #endif //
688 
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: array.hpp:12
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
Home