| 240 | } |
| 241 | |
| 242 | SolutionStatus OptimizationProblem::check_first_order_convergence(const Iterate& current_iterate, double primal_tolerance, |
| 243 | double dual_tolerance) const { |
| 244 | // evaluate termination conditions based on optimality conditions |
| 245 | const bool stationarity = (current_iterate.residuals.stationarity / current_iterate.residuals.stationarity_scaling <= dual_tolerance); |
| 246 | const bool primal_feasibility = (current_iterate.primal_feasibility <= primal_tolerance); |
| 247 | const bool complementarity = (current_iterate.residuals.complementarity / current_iterate.residuals.complementarity_scaling <= dual_tolerance); |
| 248 | |
| 249 | DEBUG << "\nTermination criteria for primal-dual tolerances = (" << primal_tolerance << ", " << dual_tolerance << "):\n"; |
| 250 | DEBUG << "Stationarity: " << std::boolalpha << stationarity << '\n'; |
| 251 | DEBUG << "Primal feasibility: " << std::boolalpha << primal_feasibility << '\n'; |
| 252 | DEBUG << "Complementarity: " << std::boolalpha << complementarity << '\n'; |
| 253 | |
| 254 | if (stationarity && primal_feasibility && 0. < current_iterate.objective_multiplier && complementarity) { |
| 255 | // feasible regular stationary point |
| 256 | return SolutionStatus::FEASIBLE_KKT_POINT; |
| 257 | } |
| 258 | return SolutionStatus::NOT_OPTIMAL; |
| 259 | } |
| 260 | |
| 261 | // infeasibility measure: constraint violation |
| 262 | void OptimizationProblem::set_infeasibility_measure(Iterate& iterate, Evaluations& evaluations, Norm norm) const { |
nothing calls this directly
no outgoing calls
no test coverage detected