Developer documentation

system_method.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: method.hpp,v 1.1 2005/07/11 10:03:55 jppavone Exp $
5  ********************************************************************/
6 #ifndef realroot_SOLVE_SBDSLV_METHOD_HPP
7 #define realroot_SOLVE_SBDSLV_METHOD_HPP
8 // JW - the following file is not under svn control ...
9 //#include "../realroot2/system.H"
10 #include <realroot/system_system.h>
11 #include <realroot/strgy_simple.h>
12 #include <realroot/strgy_newton.h>
16 //--------------------------------------------------------------------
17 namespace mmx {
18 //--------------------------------------------------------------------
19 //#include "debug_stream.hpp"
20 
21 namespace realroot
22 {
23 
24  /* erreur detectées par le system provoquées par un les parametres */
25  const int E_CTRL = 0;
26  const int E_STRGY = 1;
27  const int E_RDSLV = 2;
28  const int E_SBDRL = 3;
29  const int E_INIT = 4;
30 
31  /* ordre recu par le systeme depuis l'un des parametres */
32  const int C_ACCEPT = 5;
33 
34  /* reponses possibles de la méthode de réduction */
35 
36  const int R_REJECT = 6;
37 
38  const int R_ISOK = 7;
39  const int R_WEAK = 8;
40  const int R_FAIL = 9;
41  const int R_ERROR = 10;
42  const int D_REJECT = 11;
43 
44  struct method_debug /* retour d'erreurs */
45  {
46  virtual ~method_debug(void) {}
47  virtual void output(const char * msg) {
48  std::cerr << msg << std::endl;
49  exit(1);
50  }
51  } ;
52 
53  /* méthode paramétree par strate'gie, solveur de réduction et règle de subdivision */
54  template< class system,
55  class _strgy_ = strgy::newton<system> ,
56  template<class> class _rdslv_ = rdslv::parallel,
57  template<class> class _sbdrl_ = sbdrl::parametric >
58  struct method : method_base
59  {
60  typedef typename system::creal_t creal_t;
61  typedef typename system::interval_t interval_t;
62  typedef typename system::sz_t sz_t;
65  /* paramètres de la methode */
66  _strgy_ m_strgy;
67  _rdslv_<system> m_rdslv;
68  _sbdrl_<system> m_sbdrl;
69 
70  int m_state;
71 
72  void accept()
73  {
74  /* le system a recu l'ordre d'une des methodes d'accepter le domaine */
75  m_state = C_ACCEPT;
76  };
77 
78  void error( const char * sysmsg )
79  {
80  char msg[ 200 ];
81  switch( m_state )
82  {
83  case E_CTRL:
84  sprintf(msg,"domain control:\n\t%s\n",sysmsg);
85  break;
86  case E_STRGY:
87  sprintf(msg,"strategy:\n\t%s\n",sysmsg);
88  break;
89  case E_RDSLV:
90  sprintf(msg,"reduction(solveur):\n\t%s\n",sysmsg);
91  break;
92  case E_SBDRL:
93  sprintf(msg,"subdivision:\n\t%s\n",sysmsg);
94  break;
95  case E_INIT:
96  sprintf(msg,"initialisation:\n\t%s\n",sysmsg);
97  break;
98  case R_ERROR:
99  sprintf(msg,"reduction:\n\t%s\n",sysmsg);
100  break;
101  case R_FAIL:
102  sprintf(msg,"%s","reduction: projection stack is empty !\n");
103  break;
104  case D_REJECT:
105  sprintf(msg,"%s","rejection: pb in pop()\n");
106  };
107  m_dbg->output( msg );
108  };
109 
110  void check_pstack( system * sys )
111  {
112  for ( sz_t v = 0; v < sys->nvr(); v ++ )
113  {
114  // std::cout << "projection : " << v << std::endl;
115  };
116  };
117  /* la méthode de réduction consiste à appliquer le solveur de réduction sur */
118  /* toutes les projections disponibles, et à mettre à jour la pile de domaines */
119  /* paramètres: le systeme utilisé et le taux de réduction esperé */
120  /* retourne: */
121  /* R_ISOK en cas de succès */
122  /* R_WEAK en cas de réduction trop faible (i.e. < ratio) */
123  /* R_FAIL si la pile de projections est vide. */
124  /* R_REJECT si le solveur de réduction rejette le domaine */
125 
126  int reduction( system * sys )
127  {
128  int nvrTemp = sys->nvr();
129  std::vector<interval_t> *ri = new std::vector<interval_t>[nvrTemp ];
130  m_state = R_FAIL;
131  for ( sz_t v = 0; v < sys->nvr(); v ++ )
132  {
133  if ( sys->projections(v).nbp() == 0 ) continue;
134  m_state = E_RDSLV;
135  creal_t prc = sys->current()[v].size();
136  creal_t eps = std::min(std::max(sys->peps()/(10*prc),(creal_t)1e-4),(creal_t)1e-2);
137  if ( ! m_rdslv.process(ri[v],sys->projections(v),eps) ) return R_REJECT;
138  };
139 
140  if ( m_state == R_FAIL ) {
141  return R_FAIL;
142  };
143  /* on propose les réductions au système, c'est à lui de disposer */
144  return sys->reduce(ri,sys->nvr())?R_ISOK:R_WEAK;
145  };
146 
147  void//int
149  {
150  m_state = E_SBDRL;
151  m_sbdrl.process( sys );
152  };
153 
154  int m_niter;
155  int m_nsbd ;
156  int m_seq;
157 
158  /* allumage de l'usine à gaz */
159  template<class Prm, class Bounds>
160  void launch( system * sys, Prm& prm,
161  Bounds * inits,//creal_t * inits,
162  method_debug * dbg = 0 )
163  {
164  m_seq = 0;
165  m_niter = 0;
166  m_nsbd = 0;
167  /* si la stream de debug n'est pas fourni on utilise celle donnée par défaut */
168  m_dbg = (dbg)?dbg:&m_dbgdefault;
169  unsigned answ;
170  sys->receiver(this); /* la methode ecoute les messages du systeme */
171  m_state = E_INIT;
172  sys->init( inits ); /* initialisation du domaine de recherche */
173  /* tant que la pile de domaines n'est pas vide */
174  while ( sys->current() ) /* tant que la pile de domaines n'est pas vide */
175  {
176  // 12
177  // if ( m_niter == 12 ) std::cout << "POPO\n";
178  m_niter++;
179  m_seq ++;
180  sys->reset();
181  /* on passe le domaine à la classe de contrôle */
182  m_state = E_CTRL;
183  // vctops::print(sys->current(),sys->nvr());
184  answ = prm.check(sys->current(),sys->nvr());
185  /* si elle retourne false on rejette le domaine */
186  m_state = D_REJECT; if ( !answ ) { sys->pop(); continue; };
187  /* on applique la strategie qui consiste à remplir la pile de projection */
188  m_state = E_STRGY, answ = m_strgy.process(sys);
189  /* pour une raison inconnue la strategie veut que l'on accepte le domaine*/
190  if ( m_state == C_ACCEPT ) {
191  // std::cout << " ACCEPT = STRGY\n";
192  prm.output(sys->current(),sys->nvr()); sys->pop(); continue; };
193  /* la strategie peut rejeter le domaine */
194  m_state = D_REJECT; if ( !answ ) { sys->pop(); continue; };
195  /* phase de réduction du domaine par l'utilisation de la pile de projection */
196 
197  if ( sys->thickness() ) {
198  // std::cout << "ACCEPT = THICK \n";
199  prm.output(sys->current(),sys->nvr()); sys->pop(); continue; };
200 
201  switch(reduction(sys))
202  {
203  case R_REJECT: /* le domaine est à rejeter */
204  m_state = R_REJECT;
205  sys->pop();
206  continue;
207  case R_ISOK: /* le domaine est réduit */
208  m_state = R_ISOK;
209  break;
210  case R_WEAK: /* la réduction n'est pas acceptée */
211  break;
212  case R_FAIL: /* échec de la réduction */
213  m_state = R_FAIL;
214  error("");
215  break;
216  };
217 
218  if ( m_state == R_ISOK ) { sys->dreset(); };
219 
220  if ( sys->prc() < sys->peps() )
221  {
222  // std::cout << " ACCEPT = PREC\n";
223  prm.output(sys->current(),sys->nvr());
224  sys->pop();
225  }
226  else
227  {
228  if ( m_state != R_ISOK )
229  {
230  m_seq = 0;
231  m_nsbd ++;
232  m_state = E_SBDRL;
233  if ( !m_sbdrl.process(sys) ) {
234  // std::cout << " ACCEPT = SBD\n";
235  prm.output(sys->current(),sys->nvr()); sys->pop();
236  };
237  };
238  };
239  };
240 
241  };
242  };
243 };
244 //--------------------------------------------------------------------
245 } //namespace mmx
246 /********************************************************************/
247 #endif //
const int D_REJECT
Definition: system_method.hpp:42
void dreset()
Definition: system_system.h:588
_strgy_ m_strgy
Definition: system_method.hpp:66
void init(creal_t *inits=0)
Definition: system_system.h:601
void error(const char *sysmsg)
Definition: system_method.hpp:78
dstack_t::interval_t interval_t
Definition: system_system.h:31
system::creal_t creal_t
Definition: system_method.hpp:60
bool thickness()
Definition: system_system.h:589
bool reduce(std::vector< interval_t > *ri, unsigned)
Definition: system_dstack.h:170
sz_t nvr() const
Definition: system_system.h:84
virtual ~method_debug(void)
Definition: system_method.hpp:46
Definition: system_method.hpp:44
const creal_t & peps() const
Definition: system_dstack.h:37
void reset()
Definition: system_system.h:593
int sz_t
Definition: system_system.h:35
int m_nsbd
Definition: system_method.hpp:155
void receiver(method_base *mb)
Definition: system_dstack.h:25
creal_t prc()
Definition: system_dstack.h:47
void subdivision(system *sys)
Definition: system_method.hpp:148
const int E_STRGY
Definition: system_method.hpp:26
int m_niter
Definition: system_method.hpp:152
const int E_INIT
Definition: system_method.hpp:29
real_t creal_t
Definition: system_system.h:28
_rdslv_< system > m_rdslv
Definition: system_method.hpp:67
const int R_WEAK
Definition: system_method.hpp:39
#define min(a, b)
Definition: parser_def.c:475
void pop()
Definition: system_nstack.h:33
void launch(system *sys, Prm &prm, Bounds *inits, method_debug *dbg=0)
Definition: system_method.hpp:160
system::interval_t interval_t
Definition: system_method.hpp:61
int reduction(system *sys)
Definition: system_method.hpp:126
vstack_t & projections(sz_t v)
Definition: system_pstack.h:32
sz_t nbp() const
Definition: system_vstack.h:21
const int R_ERROR
Definition: system_method.hpp:41
Definition: system_system.h:25
Definition: system_method.hpp:58
const int E_CTRL
Definition: system_method.hpp:25
const int E_SBDRL
Definition: system_method.hpp:28
int m_seq
Definition: system_method.hpp:156
_sbdrl_< system > m_sbdrl
Definition: system_method.hpp:68
const int R_REJECT
Definition: system_method.hpp:36
interval_t * current()
Definition: system_dstack.h:32
const int R_FAIL
Definition: system_method.hpp:40
system::sz_t sz_t
Definition: system_method.hpp:62
method_debug * m_dbg
Definition: system_method.hpp:63
const int C_ACCEPT
Definition: system_method.hpp:32
int m_state
Definition: system_method.hpp:70
void check_pstack(system *sys)
Definition: system_method.hpp:110
const int R_ISOK
Definition: system_method.hpp:38
method_debug m_dbgdefault
Definition: system_method.hpp:64
Interval< T, r > max(const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:135
Definition: array.hpp:12
void accept()
Definition: system_method.hpp:72
Definition: method_base.hpp:14
const int E_RDSLV
Definition: system_method.hpp:27
virtual void output(const char *msg)
Definition: system_method.hpp:47
Home