method< system, _strgy_, _rdslv_, _sbdrl_ > Struct Template Reference

#include <system_method.hpp>

Inheritance diagram for method< system, _strgy_, _rdslv_, _sbdrl_ >:
method_base

List of all members.

Public Types

Public Member Functions

Public Attributes


Detailed Description

template<class system, class _strgy_ = strgy::newton<system>, template< class > class _rdslv_ = rdslv::parallel, template< class > class _sbdrl_ = sbdrl::parametric>
struct mmx::realroot::method< system, _strgy_, _rdslv_, _sbdrl_ >

Definition at line 58 of file system_method.hpp.


Member Typedef Documentation

typedef system::creal_t creal_t

Definition at line 60 of file system_method.hpp.

typedef system::interval_t interval_t

Definition at line 61 of file system_method.hpp.

typedef system::sz_t sz_t

Definition at line 62 of file system_method.hpp.


Member Function Documentation

void accept (  )  [inline, virtual]

Implements method_base.

Definition at line 72 of file system_method.hpp.

References mmx::realroot::C_ACCEPT, and method< system, _strgy_, _rdslv_, _sbdrl_ >::m_state.

00073     {
00074       /* le system a recu l'ordre d'une des methodes d'accepter le domaine */
00075       m_state = C_ACCEPT;
00076     };

void check_pstack ( system *  sys  )  [inline]

Definition at line 110 of file system_method.hpp.

00111     {
00112       for ( sz_t v = 0; v < sys->nvr(); v ++ )
00113         {
00114           //      std::cout << "projection : " << v << std::endl;
00115         };
00116     };

void error ( const char *  sysmsg  )  [inline, virtual]

Implements method_base.

Definition at line 78 of file system_method.hpp.

References mmx::realroot::D_REJECT, mmx::realroot::E_CTRL, mmx::realroot::E_INIT, mmx::realroot::E_RDSLV, mmx::realroot::E_SBDRL, mmx::realroot::E_STRGY, method< system, _strgy_, _rdslv_, _sbdrl_ >::m_dbg, method< system, _strgy_, _rdslv_, _sbdrl_ >::m_state, method_debug::output(), mmx::realroot::R_ERROR, and mmx::realroot::R_FAIL.

Referenced by method< system, _strgy_, _rdslv_, _sbdrl_ >::launch().

00079     {
00080       char msg[ 200 ];
00081       switch( m_state )
00082         {
00083         case E_CTRL:
00084           sprintf(msg,"domain control:\n\t%s\n",sysmsg);
00085           break;
00086         case E_STRGY:
00087           sprintf(msg,"strategy:\n\t%s\n",sysmsg);
00088           break;
00089         case E_RDSLV:
00090           sprintf(msg,"reduction(solveur):\n\t%s\n",sysmsg);
00091           break;
00092         case E_SBDRL:
00093           sprintf(msg,"subdivision:\n\t%s\n",sysmsg);
00094           break;
00095         case E_INIT:
00096           sprintf(msg,"initialisation:\n\t%s\n",sysmsg);
00097           break;
00098         case R_ERROR:
00099           sprintf(msg,"reduction:\n\t%s\n",sysmsg);
00100           break;
00101         case R_FAIL:
00102           sprintf(msg,"%s","reduction: projection stack is empty !\n");
00103           break;
00104         case D_REJECT:
00105           sprintf(msg,"%s","rejection: pb in pop()\n");
00106         };
00107       m_dbg->output( msg );
00108     };    

void launch ( system *  sys,
Prm &  prm,
Bounds *  inits,
method_debug dbg = 0 
) [inline]

Definition at line 169 of file system_method.hpp.

References mmx::realroot::C_ACCEPT, mmx::realroot::D_REJECT, mmx::realroot::E_CTRL, mmx::realroot::E_INIT, mmx::realroot::E_SBDRL, mmx::realroot::E_STRGY, method< system, _strgy_, _rdslv_, _sbdrl_ >::error(), method< system, _strgy_, _rdslv_, _sbdrl_ >::m_dbg, method< system, _strgy_, _rdslv_, _sbdrl_ >::m_dbgdefault, method< system, _strgy_, _rdslv_, _sbdrl_ >::m_niter, method< system, _strgy_, _rdslv_, _sbdrl_ >::m_nsbd, method< system, _strgy_, _rdslv_, _sbdrl_ >::m_sbdrl, method< system, _strgy_, _rdslv_, _sbdrl_ >::m_seq, method< system, _strgy_, _rdslv_, _sbdrl_ >::m_state, method< system, _strgy_, _rdslv_, _sbdrl_ >::m_strgy, mmx::realroot::R_FAIL, mmx::realroot::R_ISOK, mmx::realroot::R_REJECT, mmx::realroot::R_WEAK, and method< system, _strgy_, _rdslv_, _sbdrl_ >::reduction().

Referenced by solver< C, ProjRd< MTH > >::run(), and solver< C, ProjRd< MTH > >::solve_monomial().

00172     {
00173       m_seq   = 0;
00174       m_niter = 0;
00175       m_nsbd  = 0;
00176       /* si la stream de debug n'est pas fourni on utilise celle donnée par défaut */
00177       m_dbg = (dbg)?dbg:&m_dbgdefault;
00178       unsigned answ;
00179       sys->receiver(this);       /* la methode ecoute les messages du systeme */
00180       m_state = E_INIT;
00181       sys->init( inits );  /* initialisation du domaine de recherche    */
00182       /* tant que la pile de domaines n'est pas vide */
00183       while ( sys->current() ) /* tant que la pile de domaines n'est pas vide */
00184         {
00185           // 12
00186           //      if ( m_niter == 12 ) std::cout << "POPO\n";
00187           m_niter++;
00188           m_seq ++;
00189           sys->reset();
00190           /* on passe le domaine à la classe de contrôle */
00191           m_state = E_CTRL;
00192           //      vctops::print(sys->current(),sys->nvr());
00193           answ = prm.check(sys->current(),sys->nvr());
00194           /* si elle retourne false on rejette le domaine */
00195           m_state = D_REJECT; if ( !answ ) { sys->pop(); continue; };
00196           /* on applique la strategie qui consiste à remplir la pile de projection */
00197           m_state = E_STRGY, answ = m_strgy.process(sys);
00198           /* pour une raison inconnue la strategie veut que l'on accepte le domaine*/
00199           if ( m_state == C_ACCEPT ) { 
00200             //      std::cout << " ACCEPT = STRGY\n";
00201             prm.output(sys->current(),sys->nvr()); sys->pop();  continue; };
00202           /* la strategie peut rejeter le domaine                                  */
00203           m_state = D_REJECT; if ( !answ ) { sys->pop(); continue; };
00204           /* phase de réduction du domaine par l'utilisation de la pile de projection          */
00205 
00206           if ( sys->thickness()  ) { 
00207             //      std::cout << "ACCEPT = THICK \n";
00208             prm.output(sys->current(),sys->nvr()); sys->pop();  continue; };
00209 
00210           switch(reduction(sys))
00211             {
00212             case R_REJECT:  /* le domaine est à rejeter */
00213               m_state = R_REJECT;
00214               sys->pop(); 
00215               continue;
00216             case R_ISOK:      /* le domaine est réduit    */
00217               m_state = R_ISOK;
00218               break;
00219             case R_WEAK:   /* la réduction n'est pas acceptée */
00220               break;
00221             case R_FAIL:   /* échec de la réduction    */
00222               m_state = R_FAIL;
00223               error("");
00224               break;
00225             };
00226           
00227           if ( m_state == R_ISOK ) { sys->dreset(); };
00228           
00229           if ( sys->prc() < sys->peps() )
00230             {
00231               //              std::cout << " ACCEPT = PREC\n";
00232               prm.output(sys->current(),sys->nvr());
00233               sys->pop();
00234             }
00235           else
00236             {
00237               if ( m_state != R_ISOK )
00238                 {
00239                   m_seq = 0;
00240                   m_nsbd ++;
00241                   m_state = E_SBDRL;
00242                   if ( !m_sbdrl.process(sys) ) { 
00243                     //          std::cout << " ACCEPT = SBD\n";
00244                     prm.output(sys->current(),sys->nvr()); sys->pop(); 
00245                   };
00246                 };
00247             };
00248         };
00249 
00250     };

int reduction ( system *  sys  )  [inline]

Definition at line 126 of file system_method.hpp.

References mmx::realroot::E_RDSLV, method< system, _strgy_, _rdslv_, _sbdrl_ >::m_rdslv, method< system, _strgy_, _rdslv_, _sbdrl_ >::m_state, mmx::vctops::max(), mmx::min(), mmx::realroot::R_FAIL, mmx::realroot::R_ISOK, mmx::realroot::R_REJECT, and mmx::realroot::R_WEAK.

Referenced by method< system, _strgy_, _rdslv_, _sbdrl_ >::launch().

00127     {
00128       int nvrTemp =  sys->nvr();
00129 
00130       // std::vector<interval_t> ri[nvrTemp];
00131 
00132       std::vector<interval_t> *ri = new std::vector<interval_t>[nvrTemp];
00133 
00134       m_state = R_FAIL;
00135       for ( sz_t v = 0; v < sys->nvr(); v ++ )
00136         {
00137           if ( sys->projections(v).nbp()  ==  0 ) continue;
00138           m_state = E_RDSLV;
00139           creal_t prc = sys->current()[v].size();
00140           creal_t eps = std::min(std::max(sys->peps()/(10*prc),(creal_t)1e-4),(creal_t)1e-2);
00141           if ( ! m_rdslv.process(ri[v],sys->projections(v),eps) ) return R_REJECT;
00142         };      
00143       
00144       if ( m_state == R_FAIL ) { 
00145         delete ri;
00146         return R_FAIL;
00147       };
00148       /* on propose les réductions au système, c'est à lui de disposer */
00149       int r = sys->reduce(ri,sys->nvr())?R_ISOK:R_WEAK;
00150 
00151       delete ri;
00152 
00153       return r;
00154     };

void subdivision ( system *  sys  )  [inline]

Member Data Documentation

int m_niter
int m_nsbd
_rdslv_<system> m_rdslv
_sbdrl_<system> m_sbdrl
int m_seq
int m_state
_strgy_ m_strgy

The documentation for this struct was generated from the following file:

Generated on 6 Dec 2012 for realroot by  doxygen 1.6.1