void TestSolver::circle2() { const ExprSymbol& x=ExprSymbol::new_("x"); const ExprSymbol& y=ExprSymbol::new_("y"); SystemFactory f; f.add_var(x); f.add_var(y); f.add_ctr(sqr(x)+sqr(y)=1); f.add_ctr(sqr(x-2)+sqr(y)=1); double _sol1[]={1,0}; Vector sol1(2,_sol1); System sys(f); RoundRobin rr(1e-3); CellStack stack; CtcHC4 hc4(sys); Vector prec(2,1e-3); Solver solver(sys,hc4,rr,stack,prec,prec); solver.start(IntervalVector(2,Interval(-10,10))); CovSolverData::BoxStatus status; bool res=solver.next(status); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(status==CovSolverData::UNKNOWN); CPPUNIT_ASSERT(solver.get_data().nb_unknown()==1); CPPUNIT_ASSERT(solver.get_data().unknown(0).is_superset(sol1)); res=solver.next(status); CPPUNIT_ASSERT(!res); }
void TestSolver::circle4() { const ExprSymbol& x=ExprSymbol::new_("x"); const ExprSymbol& y=ExprSymbol::new_("y"); const ExprSymbol& r2=ExprSymbol::new_("r2"); SystemFactory f; f.add_var(x); f.add_var(y); f.add_var(r2); f.add_ctr(sqr(x)+sqr(y)=r2); f.add_ctr(sqr(x-1)+sqr(y)=r2); double cospi6=0.5; double sinpi6=::sqrt(3)/2; double _sol1[]={cospi6,sinpi6,1}; double _sol2[]={cospi6,-sinpi6,1}; Vector sol1(3,_sol1); Vector sol2(3,_sol2); System sys(f); RoundRobin rr(1e-3); CellStack stack; CtcHC4 hc4(sys); VarSet params(sys.f_ctrs,sys.args[2],false); Vector prec(3,1e-3); Solver solver(sys,hc4,rr,stack,prec,prec); solver.set_params(params); IntervalVector box(3); box[0]=Interval(-10,10); box[1]=Interval(-10,10); box[2]=Interval(1,1); solver.start(box); CovSolverData::BoxStatus status; bool res=solver.next(status); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(status==CovSolverData::SOLUTION); CPPUNIT_ASSERT(solver.get_data().nb_solution()==1); CPPUNIT_ASSERT(solver.get_data().solution(0).is_superset(sol1)); res=solver.next(status); CPPUNIT_ASSERT(status==CovSolverData::SOLUTION); CPPUNIT_ASSERT(solver.get_data().nb_solution()==2); CPPUNIT_ASSERT(solver.get_data().solution(1).is_superset(sol2)); res=solver.next(status); CPPUNIT_ASSERT(!res); }
void TestSolver::circle3() { const ExprSymbol& x=ExprSymbol::new_("x"); const ExprSymbol& y=ExprSymbol::new_("y"); SystemFactory f; f.add_var(x); f.add_var(y); f.add_ctr(sqr(x)+sqr(y)=1); f.add_ctr(sqr(x-1)+sqr(y)=1); double cospi6=0.5; double sinpi6=(sqrt(Interval(3))/2).lb(); f.add_ctr(4*y*abs(y)<=3); // a rigorous way to impose y<=sin(pi/6). double _sol1[]={cospi6,sinpi6}; double _sol2[]={cospi6,-sinpi6}; Vector sol1(2,_sol1); Vector sol2(2,_sol2); System sys(f); RoundRobin rr(1e-3); CellStack stack; CtcHC4 hc4(sys); Vector prec(2,1e-3); Solver solver(sys,hc4,rr,stack,prec,prec); solver.start(IntervalVector(2,Interval(-10,10))); CovSolverData::BoxStatus status; bool res=solver.next(status); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(status==CovSolverData::UNKNOWN); CPPUNIT_ASSERT(solver.get_data().nb_unknown()==1); CPPUNIT_ASSERT(solver.get_data().unknown(0).is_superset(sol1)); res=solver.next(status); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(status==CovSolverData::SOLUTION); CPPUNIT_ASSERT(solver.get_data().nb_solution()==1); CPPUNIT_ASSERT(solver.get_data().solution(0).is_superset(sol2)); res=solver.next(status); CPPUNIT_ASSERT(!res); }
void TestCtcHC4::ponts30() { Ponts30 p30; IntervalVector box = p30.init_box; NumConstraint* ctr[30]; CtcFwdBwd* c[30]; for (int i=0; i<30; i++) { Function* fi=dynamic_cast<Function*>(&((*p30.f)[i])); TEST_ASSERT(fi!=NULL); ctr[i]=new NumConstraint(*fi,EQ); c[i]=new CtcFwdBwd(*ctr[i]); } // cout << "before="<< box << endl; for (int i=0; i<30; i++) { c[i]->contract(box); //cout << box << endl; //cout << p30.hc4r_box[i] << endl; //c[i]->hc4r.eval.f.cf.print<Domain>(); TEST_ASSERT(almost_eq(box, p30.hc4r_box[i],1e-02)); } //cout << "after="<< box << endl; box = p30.init_box; Array<NumConstraint> a(ctr,30); CtcHC4 hc4(a,0.1); hc4.accumulate=true; box=p30.init_box; hc4.contract(box); TEST_ASSERT(almost_eq(box, p30.hc4_box,1e-04)); for (int i=0; i<30; i++) { delete c[i]; delete ctr[i]; } }