bool CGPenaltyLSAcceptor::ArmijoHolds(Number alpha_primal_test) { DBG_START_METH("CGPenaltyLSAcceptor::ArmijoHolds", dbg_verbosity); bool accept = false; Number trial_penalty_function = CGPenCq().trial_penalty_function(); DBG_ASSERT(IsFiniteNumber(trial_penalty_function)); Jnlst().Printf(J_DETAILED, J_LINE_SEARCH, "Checking acceptability for trial step size alpha_primal_test=%13.6e:\n", alpha_primal_test); Jnlst().Printf(J_DETAILED, J_LINE_SEARCH, " New values of penalty function = %23.16e (reference %23.16e):\n", trial_penalty_function, reference_penalty_function_); if (Jnlst().ProduceOutput(J_DETAILED, J_LINE_SEARCH)) { Jnlst().Printf(J_DETAILED, J_LINE_SEARCH, "curr_barr = %23.16e curr_inf = %23.16e\n", IpCq().curr_barrier_obj(), IpCq().curr_constraint_violation()); Jnlst().Printf(J_DETAILED, J_LINE_SEARCH, "trial_barr = %23.16e trial_inf = %23.16e\n", IpCq().trial_barrier_obj(), IpCq().trial_constraint_violation()); } // Now check the Armijo condition accept = Compare_le(trial_penalty_function-reference_penalty_function_, eta_penalty_*alpha_primal_test*reference_direct_deriv_penalty_function_, reference_penalty_function_); return accept; }
bool InexactLSAcceptor::IsAcceptableToCurrentIterate( Number trial_barr, Number trial_theta, bool called_from_restoration /*=false*/ ) const { DBG_START_METH("InexactLSAcceptor::IsAcceptableToCurrentIterate", dbg_verbosity); THROW_EXCEPTION(INTERNAL_ABORT, "InexactLSAcceptor::IsAcceptableToCurrentIterate called"); ASSERT_EXCEPTION(resto_pred_ <= 0., INTERNAL_ABORT, "resto_pred_ not set for check from restoration phase."); Number ared = reference_barr_ + nu_ * (reference_theta_) - (trial_barr + nu_ * trial_theta); Jnlst().Printf(J_DETAILED, J_LINE_SEARCH, " Checking Armijo Condition (for resto) with pred = %23.16e and ared = %23.16e\n", resto_pred_, ared); bool accept; if( Compare_le(eta_ * resto_pred_, ared, reference_barr_ + nu_ * (reference_theta_)) ) { Jnlst().Printf(J_DETAILED, J_LINE_SEARCH, " Success...\n"); accept = true; } else { Jnlst().Printf(J_DETAILED, J_LINE_SEARCH, " Failed...\n"); accept = false; } return accept; }
bool CGPenaltyLSAcceptor::IsAcceptableToPiecewisePenalty(Number alpha_primal_test) { DBG_START_METH("CGPenaltyLSAcceptor::IsAcceptableToPiecewisePenalty", dbg_verbosity); // If the current infeasibility is small, we require the barrier to be decreased. bool accept = false; Number infeasibility = IpCq().curr_primal_infeasibility(NORM_MAX); SmartPtr<const Vector> dx = IpData().delta()->x(); SmartPtr<const Vector> ds = IpData().delta()->s(); Number curr_barr = IpCq().curr_barrier_obj(); Number trial_barr = IpCq().trial_barrier_obj(); Number nrm_dx_ds = pow(dx->Nrm2(),2.) + pow(ds->Nrm2(),2.); if (infeasibility < theta_min_) { Number biggest_barr = PiecewisePenalty_.BiggestBarr(); accept = Compare_le(trial_barr-biggest_barr, -alpha_primal_test* piecewisepenalty_gamma_obj_*nrm_dx_ds, curr_barr); if (!accept) { return false; } } Number Fzconst, Fzlin; Fzconst = IpCq().trial_barrier_obj() + alpha_primal_test * piecewisepenalty_gamma_obj_ * nrm_dx_ds; Fzlin = IpCq().trial_constraint_violation() + alpha_primal_test * piecewisepenalty_gamma_infeasi_ * IpCq().curr_constraint_violation(); accept = PiecewisePenalty_.Acceptable(Fzconst, Fzlin); return accept; }
bool InexactLSAcceptor::CheckAcceptabilityOfTrialPoint( Number alpha_primal_test ) { DBG_START_METH("InexactLSAcceptor::CheckAcceptabilityOfTrialPoint", dbg_verbosity); // If we are in termiation test 2 iteration, we skip the line search if( in_tt2_ ) { return true; } // First compute the barrier function and constraint violation at the // current iterate and the trial point Number trial_theta = IpCq().trial_constraint_violation(); Number trial_barr = IpCq().trial_barrier_obj(); DBG_ASSERT(IsFiniteNumber(trial_barr)); Jnlst().Printf(J_DETAILED, J_LINE_SEARCH, "Checking acceptability for trial step size alpha_primal_test=%13.6e:\n", alpha_primal_test); Jnlst().Printf(J_DETAILED, J_LINE_SEARCH, " New values of barrier function = %23.16e (reference %23.16e):\n", trial_barr, reference_barr_); Jnlst().Printf(J_DETAILED, J_LINE_SEARCH, " New values of constraint violation = %23.16e (reference %23.16e):\n", trial_theta, reference_theta_); Number pred = CalcPred(alpha_primal_test); resto_pred_ = pred; DBG_PRINT((1, "nu_ = %e reference_barr_ + nu_*(reference_theta_)=%e trial_barr + nu_*trial_theta=%e\n", nu_, reference_barr_ + nu_ * (reference_theta_), trial_barr + nu_ * trial_theta)); Number ared = reference_barr_ + nu_ * (reference_theta_) - (trial_barr + nu_ * trial_theta); Jnlst().Printf(J_DETAILED, J_LINE_SEARCH, " Checking Armijo Condition with pred = %23.16e and ared = %23.16e\n", pred, ared); bool accept = Compare_le(eta_ * pred, ared, reference_barr_ + nu_ * (reference_theta_)); bool accept_low = false; if( flexible_penalty_function_ ) { DBG_PRINT((1, "nu_low = %e reference_barr_ + nu_low*(reference_theta_)=%e trial_barr + nu_low*trial_theta=%e\n", nu_low_, reference_barr_ + nu_low_ * (reference_theta_), trial_barr + nu_low_ * trial_theta)); ared = reference_barr_ + nu_low_ * (reference_theta_) - (trial_barr + nu_low_ * trial_theta); Jnlst().Printf(J_DETAILED, J_LINE_SEARCH, " Checking nu_low Armijo Condition with pred = %23.16e and ared = %23.16e\n", pred, ared); accept_low = Compare_le(eta_ * pred, ared, reference_barr_ + nu_low_ * (reference_theta_)); } accepted_by_low_only_ = false; if( accept ) { Jnlst().Printf(J_DETAILED, J_LINE_SEARCH, " Success...\n"); } else if( flexible_penalty_function_ && accept_low ) { Jnlst().Printf(J_DETAILED, J_LINE_SEARCH, " Success with nu_low...\n"); accept = true; accepted_by_low_only_ = true; } else { Jnlst().Printf(J_DETAILED, J_LINE_SEARCH, " Failed...\n"); } if( accept ) { // HERE WE RESET THE SLACKS. MAYBE THIS SHOULD BE BEFORE THE // FUNCTION EVALUATIONS? ResetSlacks(); if( flexible_penalty_function_ ) { // update the lower penalty parameter if necessary if( !accept_low ) { Number nu_real = -(trial_barr - reference_barr_) / (trial_theta - reference_theta_); nu_low_ = Min(nu_, nu_low_ + Max(nu_low_fact_ * (nu_real - nu_low_), nu_inc_)); Jnlst().Printf(J_MOREDETAILED, J_LINE_SEARCH, "Updating nu_low to %8.2e with nu_real = %8.2e\n", nu_low_, nu_real); } } } return accept; }