void Optimizer::contract_and_bound(Cell& c, const IntervalVector& init_box) { /*======================== contract y with y<=loup ========================*/ Interval& y=c.box[ext_sys.goal_var()]; // IntervalVector tmp_box(n); // read_ext_box(c.box,tmp_box); double ymax; if (loup==POS_INFINITY) ymax=POS_INFINITY; else ymax= compute_ymax()+1.e-15; // else ymax= compute_ymax(); /* if (!(y.ub() == ymax)) y &= Interval(NEG_INFINITY,ymax+1.e-15); else if (y.ub()==ymax && !(tmp_box.contains(loup_point))) y = Interval(y.lb(), ymax+1.e-15); */ y &= Interval(NEG_INFINITY,ymax); if (y.is_empty()) { c.box.set_empty(); return; } /*================ contract x with f(x)=y and g(x)<=0 ================*/ //cout << " [contract] x before=" << c.box << endl; //cout << " [contract] y before=" << y << endl; ctc.contract(c.box); if (c.box.is_empty()) return; //cout << " [contract] x after=" << c.box << endl; //cout << " [contract] y after=" << y << endl; // TODO: no more cell in argument here (just a box). Does it matter? /*====================================================================*/ /*========================= update loup =============================*/ IntervalVector tmp_box(n); read_ext_box(c.box,tmp_box); entailed = &c.get<EntailedCtr>(); if (!update_entailed_ctr(tmp_box)) { c.box.set_empty(); return; } bool loup_ch=update_loup(tmp_box); // update of the upper bound of y in case of a new loup found if (loup_ch) y &= Interval(NEG_INFINITY,compute_ymax()); loup_changed |= loup_ch; if (y.is_empty()) { // fix issue #44 c.box.set_empty(); return; } /*====================================================================*/ // [gch] The case (!c.box.is_bisectable()) seems redundant // with the case of a NoBisectableVariableException in // optimize(). Is update_uplo_of_epsboxes called twice in this case? // (bn] NO , the NoBisectableVariableException is raised by the bisector, there are 2 different cases of a non bisected box that may cause an update of uplo_of_epsboxes if ((tmp_box.max_diam()<=prec && y.diam() <=goal_abs_prec) || !c.box.is_bisectable()) { // rem1: tmp_box and not c.box because y is handled with goal_rel_prec and goal_abs_prec // rem2: do not use a precision contractor here since it would make the box empty (and y==(-inf,-inf)!!) // rem 3 : the extended boxes with no bisectable domains should be caught for avoiding infinite bisections update_uplo_of_epsboxes(y.lb()); c.box.set_empty(); return; } //gradient=0 contraction for unconstrained optimization ; //first order test for constrained optimization (useful only when there are no equations replaced by inequalities) //works with the box without the objective (tmp_box) firstorder_contract(tmp_box,init_box); if (tmp_box.is_empty()) { c.box.set_empty(); } else { // the current extended box in the cell is updated write_ext_box(tmp_box,c.box); } }
void Optimizer::contract_and_bound(Cell& c, const IntervalVector& init_box) { // cout << "box " <<c.box << endl; /*======================== contract y with y<=loup ========================*/ Interval& y=c.box[ext_sys.goal_var()]; double ymax; if (loup==POS_INFINITY) ymax=POS_INFINITY; else ymax= compute_ymax(); y &= Interval(NEG_INFINITY,ymax); if (y.is_empty()) { c.box.set_empty(); throw EmptyBoxException(); } /*================ contract x with f(x)=y and g(x)<=0 ================*/ // cout << "y=f(x) and g(x)<=0 " << endl; // cout << " x before=" << c.box << endl; // cout << " y before=" << y << endl; contract(c.box, init_box); // cout << " x after=" << c.box << endl; // cout << " y after=" << y << endl; // TODO: no more cell in argument here (just a box). Does it matter? /*====================================================================*/ /*========================= update loup =============================*/ IntervalVector tmp_box(n); read_ext_box(c.box,tmp_box); entailed = &c.get<EntailedCtr>(); update_entailed_ctr(tmp_box); update_loup(tmp_box); /*====================================================================*/ // [gch] TODO: the case (!c.box.is_bisectable()) seems redundant // with the case of a NoBisectableVariableException in // optimize(). Is update_uplo_of_epsboxes called twice in this case? // (bn] NO , the NoBisectableVariableException is raised by the bisector, // there are actually 2 different cases of a non bisected box that may cause an update // of uplo_of_epsboxes double tmp_diam =tmp_box.max_diam(); if ((tmp_diam<=prec && y.diam() <=goal_abs_prec) || !c.box.is_bisectable()) { // rem1: tmp_box and not c.box because y is handled with goal_rel_prec and goal_abs_prec // rem2: do not use a precision contractor here since it would make the box empty (and y==(-inf,-inf)!!) // rem 3 : the extended boxes with no bisectable domains should be catched for avoiding infinite bisections if (!(tmp_box.is_unbounded())) { // rem4: this case can append if the interval [1.79769e+308,inf] is in c.box. // It is only numerical degenerated case update_uplo_of_epsboxes(y.lb()); } throw EmptyBoxException(); } //gradient=0 contraction for unconstrained optimization ; //first order test for constrained optimization (useful only when there are no equations replaced by inequalities) //works with the box without the objective (tmp_box) firstorder_contract(tmp_box,init_box); // the current extended box in the cell is updated write_ext_box(tmp_box,c.box); }