Skip to content

Commit

Permalink
Added JuMP.delete extension for link constraints (#118)
Browse files Browse the repository at this point in the history
* Added delete extension for link constraints

* added unregister functions

* added unregister function for edges

* refactored JuMP.delete methods
  • Loading branch information
dlcole3 authored Aug 22, 2024
1 parent cb5851e commit ab36f80
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 10 deletions.
7 changes: 7 additions & 0 deletions src/optiedge.jl
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,13 @@ function JuMP.all_variables(edge::OptiEdge)
return unique(vars)
end

function _set_dirty(edge::OptiEdge)
for graph in containing_optigraphs(edge)
graph.is_model_dirty = true
end
return nothing
end

### Edge Constraints

# NOTE: could use one method for node and edge
Expand Down
12 changes: 12 additions & 0 deletions src/optielement.jl
Original file line number Diff line number Diff line change
Expand Up @@ -144,3 +144,15 @@ function JuMP.all_constraints(
end
return constraints
end

function JuMP.delete(element::OptiElement, cref::ConstraintRef)
if element !== JuMP.owner_model(cref)
error(
"The constraint reference you are trying to delete does not " *
"belong to the model.",
)
end
_set_dirty(element)
MOI.delete(element, cref)
return nothing
end
4 changes: 4 additions & 0 deletions src/optigraph.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1423,3 +1423,7 @@ function _set_objective_coefficient(
)
return nothing
end

function JuMP.unregister(graph::OptiGraph, key::Symbol)
delete!(object_dictionary(graph), key)
end
12 changes: 2 additions & 10 deletions src/optinode.jl
Original file line number Diff line number Diff line change
Expand Up @@ -121,16 +121,8 @@ function JuMP.all_variables(node::OptiNode)
return NodeVariableRef.(Ref(node), var_inds)
end

function JuMP.delete(node::OptiNode, cref::ConstraintRef)
if node !== JuMP.owner_model(cref)
error(
"The constraint reference you are trying to delete does not " *
"belong to the model.",
)
end
_set_dirty(node)
MOI.delete(node, cref)
return nothing
function JuMP.unregister(node::OptiNode, key::Symbol)
delete!(object_dictionary(node), (node, key))
end

### Duals
Expand Down
20 changes: 20 additions & 0 deletions test/test_optigraph.jl
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,26 @@ function test_nlp_exceptions()
@test_throws Exception @NLconstraint(graph, graph[1][:x]^3 >= 0)
end

function test_delete_extensions()
graph = OptiGraph()
@optinode(graph, nodes[1:2])

@variable(nodes[1], x >= 1)
@variable(nodes[2], x >= 2)
@constraint(nodes[1], n_con, nodes[1][:x]^2 >= 1)
@linkconstraint(graph, l_con, nodes[1][:x] + nodes[2][:x] == 4)

edge = JuMP.owner_model(l_con)

@test_throws ErrorException JuMP.delete(edge, n_con)
@test_throws ErrorException JuMP.delete(nodes[1], l_con)

JuMP.delete(nodes[1], n_con)
@test !(n_con in all_constraints(nodes[1]))
JuMP.delete(edge, l_con)
@test !(l_con in all_link_constraints(graph))
end

function run_tests()
for name in names(@__MODULE__; all=true)
if !startswith("$(name)", "test_")
Expand Down

0 comments on commit ab36f80

Please sign in to comment.