Skip to content

Commit

Permalink
Merge pull request #272 from scipopt/presolving-attr
Browse files Browse the repository at this point in the history
presolving attribute
  • Loading branch information
matbesancon committed Jul 25, 2023
2 parents 6777257 + 53fe7da commit c85881b
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
22 changes: 22 additions & 0 deletions src/MOI_wrapper.jl
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,28 @@ function MOI.set(o::Optimizer, ::MOI.Name, name::String)
@SCIP_CALL SCIPsetProbName(o, name)
end

"""
Presolving
Attribute for activating presolving in SCIP.
"""
struct Presolving <: MOI.AbstractOptimizerAttribute end

MOI.supports(o::Optimizer, ::Presolving) = true

function MOI.get(o::Optimizer, ::Presolving)
return MOI.get(o, MOI.RawOptimizerAttribute("presolving/maxrounds")) != 0
end

function MOI.set(o::Optimizer, ::Presolving, value::Bool)
param = MOI.RawOptimizerAttribute("presolving/maxrounds")
if value
MOI.set(o, param, -1) # max presolving rounds
else
MOI.set(o, param, 0) # no presolving
end
end

function MOI.get(o::Optimizer, ::MOI.NumberOfConstraints{F,S}) where {F,S}
return haskey(o.constypes, (F, S)) ? length(o.constypes[F, S]) : 0
end
Expand Down
38 changes: 38 additions & 0 deletions test/MOI_additional.jl
Original file line number Diff line number Diff line change
Expand Up @@ -519,3 +519,41 @@ end
@test (MOI.get(model, MOI.VariablePrimal(), z2), T(1), config)
end
end

@testset "Presolving $presolving" for presolving in (true, false)
optimizer = SCIP.Optimizer(; display_verblevel=0)
atol, rtol = 1e-6, 1e-6

x, y = MOI.add_variables(optimizer, 2)
MOI.add_constraint(optimizer, x, MOI.GreaterThan(0.0))
MOI.add_constraint(optimizer, y, MOI.GreaterThan(0.0))

c = MOI.add_constraint(
optimizer,
MOI.ScalarAffineFunction(
MOI.ScalarAffineTerm.([1.0, 1.0], [x, y]),
0.0,
),
MOI.LessThan(1.0),
)

MOI.set(
optimizer,
MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(),
MOI.ScalarAffineFunction(
MOI.ScalarAffineTerm.([1.0, 2.0], [x, y]),
0.0,
),
)
MOI.set(optimizer, MOI.ObjectiveSense(), MOI.MAX_SENSE)

@test MOI.get(optimizer, SCIP.Presolving()) == true
MOI.set(optimizer, SCIP.Presolving(), presolving)
@test MOI.get(optimizer, SCIP.Presolving()) == presolving

# after optimize
MOI.optimize!(optimizer)

MOI.set(optimizer, SCIP.Presolving(), presolving)
@test MOI.get(optimizer, SCIP.Presolving()) == presolving
end

0 comments on commit c85881b

Please sign in to comment.