From 60e1c1dc0c8813e378e3c8bfc5b78bc696e639a8 Mon Sep 17 00:00:00 2001 From: Alinson S Xavier Date: Tue, 18 May 2021 11:02:58 -0500 Subject: [PATCH] Implement add/remove_constraints --- src/modeling/jump_solver.jl | 53 +++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/src/modeling/jump_solver.jl b/src/modeling/jump_solver.jl index a64262c..69fbc5f 100644 --- a/src/modeling/jump_solver.jl +++ b/src/modeling/jump_solver.jl @@ -109,6 +109,46 @@ function are_constraints_satisfied( end +function add_constraints( + data::JuMPSolverData; + lhs::Vector{Vector{Tuple{String, Float64}}}, + rhs::Vector{Float64}, + senses::Vector{String}, + names::Vector{String}, +)::Nothing + for (i, sense) in enumerate(senses) + lhs_expr = AffExpr(0.0) + for (varname, coeff) in lhs[i] + var = data.varname_to_var[varname] + add_to_expression!(lhs_expr, var, coeff) + end + if sense == "<" + constr = @constraint(data.model, lhs_expr <= rhs[i]) + elseif sense == ">" + constr = @constraint(data.model, lhs_expr >= rhs[i]) + else + constr = @constraint(data.model, lhs_expr == rhs[i]) + end + set_name(constr, names[i]) + data.cname_to_constr[names[i]] = constr + end + return +end + + +function remove_constraints( + data::JuMPSolverData, + names::Vector{String}, +)::Nothing + for name in names + constr = data.cname_to_constr[name] + delete(data.model, constr) + delete!(data.cname_to_constr, name) + end + return +end + + function solve( data::JuMPSolverData; tee::Bool=false, @@ -401,7 +441,13 @@ end end add_constraints(self, cf) = - error("not implemented") + add_constraints( + self.data, + lhs=[[term for term in constr] for constr in cf.lhs], + rhs=[r for r in cf.rhs], + senses=[s for s in cf.senses], + names=[n for n in cf.names], + ) are_constraints_satisfied(self, cf; tol=1e-5) = tuple(are_constraints_satisfied( @@ -478,7 +524,10 @@ end is_infeasible(self.data) remove_constraints(self, names) = - error("not implemented") + remove_constraints( + self.data, + [n for n in names], + ) set_instance(self, instance, model) = set_instance!(self.data, instance, model)