realroot_doc 0.1.1
|
#include <solver_mv_monomial.hpp>
Definition at line 66 of file solver_mv_monomial.hpp.
solver_mv_monomial | ( | double | e = 1e-7 | ) | [inline] |
Definition at line 295 of file solver_mv_monomial.hpp.
References BOX, mmx::realroot::jacobian(), POL, Seq< C, R >::size(), and solver_mv_monomial< FT, POL >::solve_system().
Referenced by solver< C, MCFapproximate >::solve(), and solver< C, M >::solve().
{ homography_mv<C> h(d); BOX sys= BOX(p,h); /*Global data*/ free(J); for (unsigned i=0;i<S0.size();++i) free(S0[i]); S0=Seq<POL *>(); for (unsigned i=0;i<sys->nbpol();++i) S0 << new POL( sys->system(i) ); J= jacobian(S0); /*end Global data*/ Seq<FT> t; Seq< BOX> s(solve_system(sys) ); Seq< std::vector<FT> > a; // ... inf ? // free(J); // for (unsigned i=0;i<S0.size();++i) // free(S0[i]); return a; }
Definition at line 323 of file solver_mv_monomial.hpp.
References BOX, C_INCLUDE, mmx::realroot::jacobian(), POL, Seq< C, R >::rep(), Seq< C, R >::size(), and solver_mv_monomial< FT, POL >::solve_system().
{ BOX * sys= new BOX(p, dom.size() ); /*Global data*/ // free(J); //crash for (unsigned i=0;i<S0.size();++i) free(S0[i]); S0=Seq<POL *>(); for (unsigned i=0;i<sys->nbpol();++i) S0 << new POL( sys->system(i) ); J= jacobian(S0); /*end Global data*/ sys->restrict(dom); unsigned v; //, dim(dom.size() ); Seq<FT> d; BOX * l, * b; Seq<C> t; //FT ev; Seq<BOX> s(solve_system(*sys) ); Seq< std::vector<FT> > a; for (unsigned i=0;i<s.size(); ++i ) { b= new BOX(s[i]); while ( b->template width<FT>(v) > eps ) { t= b->middle(); if ( b->is_root(t) ) { d= b->template point<FT>(t); a << d.rep(); } l= new BOX( *b ) ; l->shift_box( t[v] , v ); if ( C_INCLUDE ) { free(b); b=l; continue; } else { free(l); b->contract_box(t[i],v); b->reverse_and_shift_box(v); b->reverse_box(v); } } d= b->template domain<FT>(); a << d.rep(); free(b); } return a; }
bool check_root | ( | const Seq< double > | t, |
const double | eps | ||
) | [inline] |
Definition at line 390 of file solver_mv_monomial.hpp.
References mmx::abs(), mmx::assign(), DPOL, mmx::eval(), and Seq< C, R >::size().
Referenced by solver_mv_monomial< FT, POL >::solve_system().
{ DPOL p(0); double ev; for (unsigned j=0; j!=S0.size(); ++j) { let::assign(p, *S0[j]); tensor::eval( ev , p.rep() , t , t.size() ); //std::cout<<"check: "<< ev<<std::endl; if ( abs(ev) > 1e-10 ) return false; } std::cout<<"Root on split: "<< t <<std::endl; return true; };
Definition at line 266 of file solver_mv_monomial.hpp.
References BOX, mmx::realroot::jacobian(), POL, Seq< C, R >::size(), and solver_mv_monomial< FT, POL >::solve_system().
{ BOX * sys= new BOX(p, dom.size() ); /*Global data*/ free(J); for (unsigned i=0;i<S0.size();++i) free(S0[i]); S0=Seq<POL *>(); for (unsigned i=0;i<sys->nbpol();++i) S0 << new POL( sys->system(i) ); J= jacobian(S0); /*end Global data*/ sys->restrict(dom); Seq< BOX> s(solve_system( *sys) ); Seq< std::vector<Interval<FT> > > a; for (unsigned i=0; i<s.size(); ++i) a << s[i].template domain<FT>().rep(); // free(J); // for (unsigned i=0;i<S0.size();++i) // free(S0[i]); return a; }
Definition at line 238 of file solver_mv_monomial.hpp.
References BOX, mmx::realroot::jacobian(), POL, Seq< C, R >::size(), and solver_mv_monomial< FT, POL >::solve_system().
Referenced by solver< C, MCFisolate >::solve().
{ homography_mv<C> h(d); BOX sys= BOX(p,h); /*Global data*/ free(J); for (unsigned i=0;i<S0.size();++i) free(S0[i]); S0=Seq<POL *>(); for (unsigned i=0;i<sys.nbpol();++i) S0 << new POL( sys.system(i) ); J= jacobian(S0); /*end Global data*/ Seq< BOX> s(solve_system(sys) ); Seq< std::vector<Interval<FT> > > a; for (unsigned i=0; i<s.size(); ++i) a << s[i].template domain<FT>().rep(); // free(J); // for (unsigned i=0;i<S0.size();++i) // free(S0[i]); return a; }
Solve routine.
Definition at line 85 of file solver_mv_monomial.hpp.
References ALLBOXES, BOX, C_EXCLUDE, C_INCLUDE, solver_mv_monomial< FT, POL >::check_root(), Seq< C, R >::erase(), mmx::realroot::exclude2(), N_ITER, Seq< C, R >::size(), mmx::sparse::subs(), and VERBOSE.
Referenced by solver_mv_monomial< FT, POL >::approximate(), and solver_mv_monomial< FT, POL >::isolate().
{ unsigned c=0,cand=0, i, it=0, subs=0, ver=0; BOX * b = NULL; BOX * r = NULL; Seq<BOX> sol; Seq<BOX> psol; bool red, out; STACK boxes; FT v(0), bx; bx= sys.template volume <FT>(); if (VERBOSE) sys.print(); boxes.push( new BOX(sys) ); while ( !boxes.empty() ) { it++; b = boxes.top() ; boxes.pop(); /*reduce the domain */ out= false; red= true; while ( !out && red ) { if ( C_EXCLUDE ) { out=true; if (VERBOSE) { //std::cout<<"- Excluded:"<<std::endl; //b->print(); } if (ALLBOXES) //FOR AXEL { v+= b->template volume<FT>(); r = new BOX( *b ) ; sol << (*r); free(r); } c++; } else { red= b->reduce_domain(); if (VERBOSE && red) { //std::cout<<"- Reduced:"<<std::endl; //b->print(); } //red= false; } } if ( out ) { free(b); continue; } /*check for root */ if ( C_INCLUDE ) { if (VERBOSE) { std::cout<<"- Solution found:"<<std::endl; b->print(); } ver++ ; sol << (*b); free(b); continue; } /*Subdivide*/ if ( it > N_ITER ) { cand++; std::cout<<"MAX iters"<<" ("<<N_ITER<<") " <<"reached!" << std::endl; b->print(); sol << (*b); free(b); } else { if ( b->template width<double>(i) > eps ) { subs++; if (check_root( b->subdiv_point(i),eps) ) { psol <<BOX( *b, i); //free(b); //continue; //sol[sol.size()-1].print(); ver++; } b->subdivide (i,boxes, b->middle(i) ); //b->subdivide (i,boxes); //b->subdivide (i,boxes, 1 ); //b->subdivide (boxes); free(b); } else { if ( C_EXCLUDE ){ if (ALLBOXES) sol << (*b); //FOR AXEL }else { cand++; sol << (*b); if (VERBOSE) { std::cout<<"- EPS reached:"<<std::endl; //b->print(); } } free(b); } } }/*while*/ unsigned j=0; //if (0) if ( !ALLBOXES && S0.size()==2) while (j<sol.size()) { if ( exclude2( &sol[j],J) ) { sol.erase(j); cand--; } else { //std::cout <<"td="<<sol[j].td<<std::endl; ++j; } } if (VERBOSE) { std::cout<< "Iterations= "<< it <<std::endl; std::cout<< "Excluded = "<< c <<std::endl; std::cout<< "Verified = "<< ver <<std::endl; std::cout<< "Subdivs = "<< subs <<std::endl; if (ALLBOXES) std::cout<< "Reduced volume= "<< as<double>( 100*(bx-v)/bx )<< "\%" <<std::endl; std::cout<< "#stack= "<< cand <<std::endl; } sol<< psol; return sol; }