42 #include "MoochoPack_FeasibilityStepReducedStd_Strategy.hpp"
43 #include "MoochoPack_NLPAlgo.hpp"
44 #include "MoochoPack_NLPAlgoState.hpp"
45 #include "MoochoPack_Exceptions.hpp"
46 #include "Teuchos_dyn_cast.hpp"
48 namespace MoochoPack {
51 const quasi_range_space_step_ptr_t &quasi_range_space_step
52 ,
const qp_solver_ptr_t &qp_solver
53 ,
const qp_tester_ptr_t &qp_tester
57 :quasi_range_space_step_(quasi_range_space_step)
58 ,qp_solver_(qp_solver)
59 ,qp_tester_(qp_tester)
60 ,qp_objective_(qp_objective)
61 ,qp_testing_(qp_testing)
69 ,
const Vector& xo,
const Vector& c_xo, VectorMutable* w
509 out << L <<
"*** Computes feasibility steps by solving a constrained QP using the range and null\n"
510 << L <<
"*** space decomposition\n"
511 << L <<
"begin quais-range space step: \"" <<
typeName(quasi_range_space_step()) <<
"\"\n";
513 quasi_range_space_step().print_step( out, L +
" " );
515 out << L <<
"end quasi-range space step\n"
516 << L <<
"if quasi-range space step failed then\n"
517 << L <<
" this feasibility step fails also!\n"
520 << L <<
"*** Set the bounds for bl <= Z*wz <= bu\n"
521 << L <<
"bl = d_bounds_k.l - (xo - x_k) - Ywy\n"
522 << L <<
"bu = d_bounds_k.u - (xo - x_k) - Ywy\n"
523 << L <<
"Set bl(i) = bu(i) for those nu_k(i) != 0.0\n"
524 << L <<
"if (qp_objective == OBJ_MIN_FULL_STEP) and (current_k != k) then\n"
525 << L <<
" grad = Z_k'*Ywy\n"
526 << L <<
" Hess = Z_k'*Z_k\n"
527 << L <<
"elseif (qp_objective == OBJ_MIN_NULL_SPACE_STEP) and (current_k != k) then\n"
528 << L <<
" grad = 0\n"
529 << L <<
" Hess = I\n"
530 << L <<
"elseif (qp_objective == OBJ_RSQP) and (current_k != k) then\n"
531 << L <<
" grad = qp_grad_k\n"
532 << L <<
" Hess = rHL_k\n"
534 << L <<
"if check_results == true then\n"
535 << L <<
" assert that bl and bu are valid and sorted\n"
537 << L <<
"etaL = 0.0\n"
538 << L <<
"*** Determine if we can use simple bounds on pz or not\n"
539 << L <<
"if Z_k is a variable reduction null space matrix and norm(Ypy_k(indep),0) == 0 then\n"
540 << L <<
" use_simple_wz_bounds = true\n"
542 << L <<
" use_simple_wz_bounds = false\n"
544 << L <<
"*** Setup QP arguments\n"
545 << L <<
"qp_g = qp_grad_k\n"
546 << L <<
"qp_G = rHL_k\n"
547 << L <<
"if use_simple_wz_bounds == true then\n"
548 << L <<
" qp_dL = bl(indep), qp_dU = bu(indep)\n"
549 << L <<
" qp_E = Z_k.D, qp_b = Ywy(dep)\n"
550 << L <<
" qp_eL = bl(dep), qp_eU = bu(dep)\n"
552 << L <<
" qp_dL = -inf, qp_dU = +inf\n"
553 << L <<
" qp_E = Z_k, qp_b = Ywy\n"
554 << L <<
" qp_eL = bl, qp_eU = bu\n"
556 << L <<
"if m > r then\n"
557 << L <<
" qp_F = V_k, qp_f = c_k(undecomp) + Gc_k(undecomp)'*Ywy\n"
559 << L <<
" qp_F = empty, qp_f = empty\n"
561 << L <<
"Use a warm start given the active-set in nu_k\n"
562 << L <<
"Solve the following QP to compute qp_d, qp_eta, qp_Ed = qp_E * qp_d\n"
563 << L <<
",qp_nu, qp_mu and qp_lambda (" <<
typeName(qp_solver()) <<
"):\n"
564 << L <<
" min qp_g' * qp_d + 1/2 * qp_d' * qp_G * qp_d + M(eta)\n"
565 << L <<
" qp_d <: R^(n-r)\n"
567 << L <<
" etaL <= qp_eta\n"
568 << L <<
" qp_dL <= qp_d <= qp_dU [qp_nu]\n"
569 << L <<
" qp_eL <= qp_E * qp_d + (1-eta)*qp_b <= qp_eU [qp_mu]\n"
570 << L <<
" qp_F * d_qp + (1-eta) * qp_f = 0 [qp_lambda]\n"
571 << L <<
"if (qp_teing==QP_TEST) or (fd_deriv_testing==QP_TEST_DEFAULT\n"
572 << L <<
"and check_results==true) then\n"
573 << L <<
" Check the optimality conditions of the above QP\n"
574 << L <<
" if the optimality conditions do not check out then\n"
575 << L <<
" set throw_qp_failure = true\n"
578 << L <<
"*** Set the solution to the QP subproblem\n"
579 << L <<
"wz = qp_d\n"
580 << L <<
"eta = qp_eta\n"
581 << L <<
"if use_simple_wz_bounds == true then\n"
582 << L <<
" Zwz(dep) = qp_Ed, Zwz(indep) = wz\n"
584 << L <<
" Zwz = qp_Ed\n"
586 << L <<
"if eta > 0 then set Ywy = (1-eta) * Ywy\n"
587 << L <<
"if QP solution is suboptimal then\n"
588 << L <<
" throw_qp_failure = true\n"
589 << L <<
"elseif QP solution is primal feasible (not optimal) then\n"
590 << L <<
" throw_qp_failure = primal_feasible_point_error\n"
591 << L <<
"elseif QP solution is dual feasible (not optimal) then\n"
592 << L <<
" find max u s.t.\n"
593 << L <<
" d_bounds_k.l <= (xo - x) + u*(Ywy+Zwz) <= d_bounds_k.u\n"
594 << L <<
" alpha_k = u\n"
595 << L <<
" throw_qp_failure = true\n"
597 << L <<
"if eta == 1.0 then\n"
598 << L <<
" The constraints are infeasible!\n"
599 << L <<
" throw_qp_failure = true\n"
601 << L <<
"current_k = k\n"
602 << L <<
"w = Zwz + Ywy\n"
603 << L <<
"if (throw_qp_failure == true) then\n"
604 << L <<
" The feasibility step computation has failed!\n"
void print_step(std::ostream &out, const std::string &leading_str) const
T_To & dyn_cast(T_From &from)
rSQP Algorithm control class.
Reduced space SQP state encapsulation interface.
bool compute_feasibility_step(std::ostream &out, EJournalOutputLevel olevel, NLPAlgo *algo, NLPAlgoState *s, const Vector &xo, const Vector &c_xo, VectorMutable *w)
Computes a feasibility step by computing simple quasi-range and null space components.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
std::string typeName(const T &t)
FeasibilityStepReducedStd_Strategy(const quasi_range_space_step_ptr_t &quasi_range_space_step, const qp_solver_ptr_t &qp_solver, const qp_tester_ptr_t &qp_tester, EQPObjective qp_objective=OBJ_MIN_NULL_SPACE_STEP, EQPTesting qp_testing=QP_TEST_DEFAULT)
Construct and initialize.