From fd078956c9bcc4b319eefba35745f1e952c0bd81 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar <MichielCottaar@protonmail.com> Date: Fri, 2 Aug 2024 11:03:17 +0100 Subject: [PATCH] Ensure that there are strictly more variables then equality constraints This prevents the Ipopt optimiser to quit with: Feasible_Point_Found (see https://coin-or.github.io/Ipopt/OUTPUT.html) --- src/build_sequences.jl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/build_sequences.jl b/src/build_sequences.jl index b53faeb..c9a715a 100644 --- a/src/build_sequences.jl +++ b/src/build_sequences.jl @@ -1,5 +1,5 @@ module BuildSequences -import JuMP: Model, optimizer_with_attributes, optimize!, AbstractJuMPScalar, value, solution_summary, termination_status, LOCALLY_SOLVED, OPTIMAL, num_variables, all_variables, set_start_value, ALMOST_LOCALLY_SOLVED, objective_value, INVALID_MODEL, @variable, @objective, @constraint, raw_status +using JuMP import Ipopt import Juniper import ..Scanners: Scanner, gradient_strength, Default_Scanner @@ -95,6 +95,10 @@ function build_sequence(f::Function, scanner::Union{Nothing, Scanner}, model::Tu end end +function number_equality_constraints(model::Model) + sum([num_constraints(model, expr, comp) for (expr, comp) in JuMP.list_of_constraint_types(model) if comp <: MOI.EqualTo]) +end + function optimise_with_cost_func(jump_model::Model, cost_func, n_attempts) @objective jump_model Min cost_func min_objective = Inf @@ -107,11 +111,10 @@ function optimise_with_cost_func(jump_model::Model, cost_func, n_attempts) set_start_value(var, v) end end - optimize!(jump_model) - while termination_status(jump_model) == INVALID_MODEL + for _ in num_variables(jump_model):number_equality_constraints(jump_model) @variable(jump_model) - optimize!(jump_model) end + optimize!(jump_model) if termination_status(jump_model) in (LOCALLY_SOLVED, OPTIMAL) if objective_value(jump_model) < min_objective min_objective = objective_value(jump_model) -- GitLab