mirror of
https://github.com/ANL-CEEESA/MIPLearn.jl.git
synced 2025-12-07 00:48:50 -06:00
Replay
This commit is contained in:
@@ -4,7 +4,9 @@ authors = ["Alinson S. Xavier <git@axavier.org>"]
|
||||
version = "0.1.0"
|
||||
|
||||
[deps]
|
||||
CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
|
||||
Clp = "e2554f3b-3117-50c0-817c-e040a3ddf72d"
|
||||
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
|
||||
Glob = "c27321d9-0574-5035-807b-f59d2c89b15c"
|
||||
HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f"
|
||||
HiGHS = "87dc4568-4c63-4d18-b0c0-bb2238e4078b"
|
||||
|
||||
BIN
test/fixtures/stab/stab-n190-00000.h5
vendored
Normal file
BIN
test/fixtures/stab/stab-n190-00000.h5
vendored
Normal file
Binary file not shown.
BIN
test/fixtures/stab/stab-n190-00000.mps.gz
vendored
Normal file
BIN
test/fixtures/stab/stab-n190-00000.mps.gz
vendored
Normal file
Binary file not shown.
BIN
test/fixtures/stab/stab-n190-00002.h5
vendored
Normal file
BIN
test/fixtures/stab/stab-n190-00002.h5
vendored
Normal file
Binary file not shown.
BIN
test/fixtures/stab/stab-n190-00002.mps.gz
vendored
Normal file
BIN
test/fixtures/stab/stab-n190-00002.mps.gz
vendored
Normal file
Binary file not shown.
BIN
test/fixtures/stab/stab-n190-00003.h5
vendored
Normal file
BIN
test/fixtures/stab/stab-n190-00003.h5
vendored
Normal file
Binary file not shown.
BIN
test/fixtures/stab/stab-n190-00003.mps.gz
vendored
Normal file
BIN
test/fixtures/stab/stab-n190-00003.mps.gz
vendored
Normal file
Binary file not shown.
BIN
test/fixtures/stab/stab-n190-00004.h5
vendored
Normal file
BIN
test/fixtures/stab/stab-n190-00004.h5
vendored
Normal file
Binary file not shown.
BIN
test/fixtures/stab/stab-n190-00004.mps.gz
vendored
Normal file
BIN
test/fixtures/stab/stab-n190-00004.mps.gz
vendored
Normal file
Binary file not shown.
BIN
test/fixtures/stab/stab-n190-00005.h5
vendored
Normal file
BIN
test/fixtures/stab/stab-n190-00005.h5
vendored
Normal file
Binary file not shown.
BIN
test/fixtures/stab/stab-n190-00005.mps.gz
vendored
Normal file
BIN
test/fixtures/stab/stab-n190-00005.mps.gz
vendored
Normal file
Binary file not shown.
BIN
test/fixtures/stab/stab-n190-00006.h5
vendored
Normal file
BIN
test/fixtures/stab/stab-n190-00006.h5
vendored
Normal file
Binary file not shown.
BIN
test/fixtures/stab/stab-n190-00006.mps.gz
vendored
Normal file
BIN
test/fixtures/stab/stab-n190-00006.mps.gz
vendored
Normal file
Binary file not shown.
284
test/src/BB/tables.ipynb
Normal file
284
test/src/BB/tables.ipynb
Normal file
File diff suppressed because one or more lines are too long
@@ -10,9 +10,12 @@ using Test
|
||||
using MIPLearn.BB
|
||||
using MIPLearn
|
||||
|
||||
using CSV
|
||||
using DataFrames
|
||||
|
||||
basepath = @__DIR__
|
||||
|
||||
function bb_run(optimizer_name, optimizer; large = true)
|
||||
function bb_run(optimizer_name, optimizer; large=true)
|
||||
@testset "Solve ($optimizer_name)" begin
|
||||
@testset "interface" begin
|
||||
filename = "$FIXTURES/danoint.mps.gz"
|
||||
@@ -25,7 +28,7 @@ function bb_run(optimizer_name, optimizer; large = true)
|
||||
|
||||
status, obj = BB.solve_relaxation!(mip)
|
||||
@test status == :Optimal
|
||||
@test round(obj, digits = 6) == 62.637280
|
||||
@test round(obj, digits=6) == 62.637280
|
||||
|
||||
@test BB.name(mip, mip.int_vars[1]) == "xab"
|
||||
@test BB.name(mip, mip.int_vars[2]) == "xac"
|
||||
@@ -35,26 +38,26 @@ function bb_run(optimizer_name, optimizer; large = true)
|
||||
@test mip.int_vars_ub[1] == 1.0
|
||||
|
||||
vals = BB.values(mip, mip.int_vars)
|
||||
@test round(vals[1], digits = 6) == 0.046933
|
||||
@test round(vals[2], digits = 6) == 0.000841
|
||||
@test round(vals[3], digits = 6) == 0.248696
|
||||
@test round(vals[1], digits=6) == 0.046933
|
||||
@test round(vals[2], digits=6) == 0.000841
|
||||
@test round(vals[3], digits=6) == 0.248696
|
||||
|
||||
# Probe (up and down are feasible)
|
||||
probe_up, probe_down = BB.probe(mip, mip.int_vars[1], 0.5, 0.0, 1.0, 1_000_000)
|
||||
@test round(probe_down, digits = 6) == 62.690000
|
||||
@test round(probe_up, digits = 6) == 62.714100
|
||||
@test round(probe_down, digits=6) == 62.690000
|
||||
@test round(probe_up, digits=6) == 62.714100
|
||||
|
||||
# Fix one variable to zero
|
||||
BB.set_bounds!(mip, mip.int_vars[1:1], [0.0], [0.0])
|
||||
status, obj = BB.solve_relaxation!(mip)
|
||||
@test status == :Optimal
|
||||
@test round(obj, digits = 6) == 62.690000
|
||||
@test round(obj, digits=6) == 62.690000
|
||||
|
||||
# Fix one variable to one and another variable variable to zero
|
||||
BB.set_bounds!(mip, mip.int_vars[1:2], [1.0, 0.0], [1.0, 0.0])
|
||||
status, obj = BB.solve_relaxation!(mip)
|
||||
@test status == :Optimal
|
||||
@test round(obj, digits = 6) == 62.714777
|
||||
@test round(obj, digits=6) == 62.714777
|
||||
|
||||
# Fix all binary variables to one, making problem infeasible
|
||||
N = length(mip.int_vars)
|
||||
@@ -68,7 +71,7 @@ function bb_run(optimizer_name, optimizer; large = true)
|
||||
BB.set_bounds!(mip, mip.int_vars, zeros(N), ones(N))
|
||||
status, obj = BB.solve_relaxation!(mip)
|
||||
@test status == :Optimal
|
||||
@test round(obj, digits = 6) == 62.637280
|
||||
@test round(obj, digits=6) == 62.637280
|
||||
end
|
||||
|
||||
@testset "varbranch" begin
|
||||
@@ -82,8 +85,8 @@ function bb_run(optimizer_name, optimizer; large = true)
|
||||
BB.StrongBranching(),
|
||||
BB.ReliabilityBranching(),
|
||||
BB.HybridBranching(),
|
||||
BB.StrongBranching(aggregation = :min),
|
||||
BB.ReliabilityBranching(aggregation = :min, collect = true),
|
||||
BB.StrongBranching(aggregation=:min),
|
||||
BB.ReliabilityBranching(aggregation=:min, collect=true),
|
||||
]
|
||||
h5 = H5File("$FIXTURES/$instance.h5")
|
||||
mip_lower_bound = h5.get_scalar("mip_lower_bound")
|
||||
@@ -98,23 +101,23 @@ function bb_run(optimizer_name, optimizer; large = true)
|
||||
@info optimizer_name, branch_rule, instance
|
||||
@time BB.solve!(
|
||||
mip,
|
||||
initial_primal_bound = mip_primal_bound,
|
||||
print_interval = 1,
|
||||
node_limit = 25,
|
||||
branch_rule = branch_rule,
|
||||
initial_primal_bound=mip_primal_bound,
|
||||
print_interval=1,
|
||||
node_limit=25,
|
||||
branch_rule=branch_rule,
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@testset "collect" begin
|
||||
rule = BB.ReliabilityBranching(collect = true)
|
||||
rule = BB.ReliabilityBranching(collect=true)
|
||||
BB.collect!(
|
||||
optimizer,
|
||||
"$FIXTURES/bell5.mps.gz",
|
||||
node_limit = 100,
|
||||
print_interval = 10,
|
||||
branch_rule = rule,
|
||||
node_limit=100,
|
||||
print_interval=10,
|
||||
branch_rule=rule,
|
||||
)
|
||||
n_sb = rule.stats.num_strong_branch_calls
|
||||
h5 = H5File("$FIXTURES/bell5.h5")
|
||||
@@ -132,3 +135,67 @@ function test_bb()
|
||||
@time bb_run("HiGHS", optimizer_with_attributes(HiGHS.Optimizer))
|
||||
# @time bb_run("CPLEX", optimizer_with_attributes(CPLEX.Optimizer, "CPXPARAM_Threads" => 1))
|
||||
end
|
||||
|
||||
function test_bb_replay()
|
||||
rule_sb = BB.StrongBranching()
|
||||
rule_rb = BB.ReliabilityBranching()
|
||||
optimizer = optimizer_with_attributes(HiGHS.Optimizer)
|
||||
filenames = [replace(f, ".h5" => "") for f in glob("test/fixtures/stab/*.h5")]
|
||||
results_filename = "tmp.csv"
|
||||
|
||||
lk = ReentrantLock()
|
||||
results = []
|
||||
|
||||
function push_result(r)
|
||||
lock(lk) do
|
||||
push!(results, r)
|
||||
df = DataFrame()
|
||||
for row in results
|
||||
push!(df, row, cols=:union)
|
||||
end
|
||||
CSV.write(results_filename, df)
|
||||
end
|
||||
end
|
||||
|
||||
function solve(filename; replay=nothing, skip=false, rule)
|
||||
has_replay = (replay !== nothing)
|
||||
h5 = H5File("$filename.h5", "r")
|
||||
mip_obj_bound = h5.get_scalar("mip_obj_bound")
|
||||
@show filename
|
||||
@show has_replay
|
||||
h5.file.close()
|
||||
mip = BB.init(optimizer)
|
||||
BB.read!(mip, "$filename.mps.gz")
|
||||
time_solve = @elapsed begin
|
||||
pool, replay = BB.solve!(
|
||||
mip,
|
||||
initial_primal_bound=mip_obj_bound,
|
||||
print_interval=100,
|
||||
node_limit=1_000,
|
||||
branch_rule=rule,
|
||||
replay=replay,
|
||||
)
|
||||
end
|
||||
if !skip
|
||||
push_result(
|
||||
Dict(
|
||||
"Filename" => filename,
|
||||
"Replay?" => has_replay,
|
||||
"Solve time (s)" => time_solve,
|
||||
"Relative MIP gap (%)" => round(pool.gap * 100, digits=3)
|
||||
)
|
||||
)
|
||||
end
|
||||
return replay
|
||||
end
|
||||
|
||||
# Solve reference instance
|
||||
replay = solve(filenames[1], skip=true, rule=rule_sb)
|
||||
|
||||
# Solve perturbations
|
||||
for i in 2:6
|
||||
solve(filenames[i], rule=rule_rb, replay=nothing)
|
||||
solve(filenames[i], rule=rule_rb, replay=deepcopy(replay))
|
||||
end
|
||||
return
|
||||
end
|
||||
Reference in New Issue
Block a user