- }
- /*ASSERT: we are at optimal solution for this "plane"*/
-
-
- }
-
- Vector lagrange_mult=act.get_lagrange (gradient);
- int m= min_elt_index (lagrange_mult);
-
- if (m>=0 && lagrange_mult (m) > 0)
- {
- break; // optimal sol.
- }
- else if (m<0)
- {
- assert (gradient.norm() < EPS) ;
-
- break;
- }
-
- DOUT << "dropping cons " << m<<'\n';
- act.drop (m);
+
+
+ Real numerator = ia.rhs () - ia.vec()*x;
+ if (numerator >= 0)
+ {
+ if (numerator > EPS)
+ {
+ warning (_f ("Ineq_constrained_qp::solve (): Constraint off by %f", numerator));
+ act.degenerate_count_i_ ++;
+ }
+ minalf = -numerator;
+ minidx = ia;
+ break;
+ }
+
+ Real alfa = numerator / dot;
+
+
+ if (minalf > alfa)
+ {
+ minidx = ia;
+ minalf = alfa;
+ }
+ }
+
+ Real optimal_step = minalf;
+
+ Vector deltax = direction * optimal_step;
+ x += deltax;
+ gradient += optimal_step * (quad_ * deltax);
+
+ DOUT << "step = " << optimal_step << " (|dx| = " <<
+ to_str (deltax.norm()) << ")\n";
+
+ if (minalf < unbounded_alfa)
+ {
+ /* bumped into an edge. try again, in smaller space. */
+ act.add_constraint (minidx.idx());
+ DOUT << "adding cons "<< minidx.idx () << '\n';
+ continue;
+ }
+ /*ASSERT: we are at the optimal solution for this "plane"*/
+ }
+
+ Vector lagrange_mult=act.get_lagrange (gradient);
+ int m= min_elt_index (lagrange_mult);
+
+ if (m>=0 && lagrange_mult (m) > 0)
+ {
+ break; // optimal sol.
+ }
+ else if (m<0)
+ {
+ assert (gradient.norm() < EPS) ;
+
+ break;
+ }
+
+ DOUT << "dropping cons " << m << '\n';
+ act.drop_constraint (m);