Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added JuMP.delete extension for link constraints #118

Merged
merged 4 commits into from
Aug 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading