mirror of https://github.com/ANL-CEEESA/RELOG.git
parent
f4e97ff7f2
commit
744b043461
@ -0,0 +1,144 @@
|
||||
# RELOG: Reverse Logistics Optimization
|
||||
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
||||
# Released under the modified BSD license. See COPYING.md for more details.
|
||||
|
||||
using RELOG
|
||||
using JuMP
|
||||
using HiGHS
|
||||
using Test
|
||||
|
||||
function jumpext_test()
|
||||
jumpext_pwl_single_point()
|
||||
jumpext_pwl_two_points()
|
||||
jumpext_pwl_multiple_points()
|
||||
jumpext_pwl_input_validation()
|
||||
return
|
||||
end
|
||||
|
||||
function jumpext_pwl_single_point()
|
||||
model = Model(HiGHS.Optimizer)
|
||||
set_silent(model)
|
||||
@variable(model, x)
|
||||
@variable(model, y1)
|
||||
@variable(model, y2)
|
||||
xpts = [5.0]
|
||||
ypts = [10.0 20.0]
|
||||
RELOG._add_pwl_constraints(model, x, [y1, y2], xpts, ypts)
|
||||
optimize!(model)
|
||||
@test is_solved_and_feasible(model)
|
||||
@test value(x) ≈ 5.0 atol = 1e-6
|
||||
@test value(y1) ≈ 10.0 atol = 1e-6
|
||||
@test value(y2) ≈ 20.0 atol = 1e-6
|
||||
return
|
||||
end
|
||||
|
||||
function jumpext_pwl_two_points()
|
||||
model = Model(HiGHS.Optimizer)
|
||||
set_silent(model)
|
||||
@variable(model, x)
|
||||
@variable(model, y1)
|
||||
@variable(model, y2)
|
||||
xpts = [0.0, 2.0]
|
||||
ypts = [0.0 10.0; 4.0 6.0]
|
||||
RELOG._add_pwl_constraints(model, x, [y1, y2], xpts, ypts)
|
||||
|
||||
# Test at x = 1
|
||||
JuMP.fix(x, 1.0)
|
||||
optimize!(model)
|
||||
@test is_solved_and_feasible(model)
|
||||
@test value(y1) ≈ 2.0 atol = 1e-6
|
||||
@test value(y2) ≈ 8.0 atol = 1e-6
|
||||
|
||||
# Test at x = 2
|
||||
JuMP.fix(x, 2.0)
|
||||
optimize!(model)
|
||||
@test is_solved_and_feasible(model)
|
||||
@test value(y1) ≈ 4.0 atol = 1e-6
|
||||
@test value(y2) ≈ 6.0 atol = 1e-6
|
||||
return
|
||||
end
|
||||
|
||||
function jumpext_pwl_multiple_points()
|
||||
model = Model(HiGHS.Optimizer)
|
||||
set_silent(model)
|
||||
@variable(model, x)
|
||||
@variable(model, y1)
|
||||
@variable(model, y2)
|
||||
xpts = [0.0, 1.0, 2.0]
|
||||
ypts = [0.0 5.0; 2.0 3.0; 1.0 4.0]
|
||||
RELOG._add_pwl_constraints(model, x, [y1, y2], xpts, ypts)
|
||||
|
||||
# Test at x = 0.5
|
||||
JuMP.fix(x, 0.5)
|
||||
optimize!(model)
|
||||
@test is_solved_and_feasible(model)
|
||||
@test value(y1) ≈ 1.0 atol = 1e-6
|
||||
@test value(y2) ≈ 4.0 atol = 1e-6
|
||||
|
||||
# Test at x = 1
|
||||
JuMP.fix(x, 1.0)
|
||||
optimize!(model)
|
||||
@test is_solved_and_feasible(model)
|
||||
@test value(y1) ≈ 2.0 atol = 1e-6
|
||||
@test value(y2) ≈ 3.0 atol = 1e-6
|
||||
|
||||
# Test at x = 1.5
|
||||
JuMP.fix(x, 1.5)
|
||||
optimize!(model)
|
||||
@test is_solved_and_feasible(model)
|
||||
@test value(y1) ≈ 1.5 atol = 1e-6
|
||||
@test value(y2) ≈ 3.5 atol = 1e-6
|
||||
return
|
||||
end
|
||||
|
||||
function jumpext_pwl_input_validation()
|
||||
model = Model(HiGHS.Optimizer)
|
||||
@variable(model, x)
|
||||
@variable(model, y)
|
||||
|
||||
# Test non-matrix ypts
|
||||
@test_throws ArgumentError RELOG._add_pwl_constraints(model, x, [y], [1.0], [1.0])
|
||||
|
||||
# Test mismatched dimensions
|
||||
@test_throws ArgumentError RELOG._add_pwl_constraints(
|
||||
model,
|
||||
x,
|
||||
[y],
|
||||
[1.0, 2.0],
|
||||
[1.0 2.0],
|
||||
)
|
||||
@test_throws ArgumentError RELOG._add_pwl_constraints(
|
||||
model,
|
||||
x,
|
||||
[y],
|
||||
[1.0],
|
||||
[1.0 2.0; 3.0 4.0],
|
||||
)
|
||||
|
||||
# Test empty breakpoints
|
||||
@test_throws ArgumentError RELOG._add_pwl_constraints(
|
||||
model,
|
||||
x,
|
||||
[y],
|
||||
Float64[],
|
||||
Matrix{Float64}(undef, 0, 1),
|
||||
)
|
||||
|
||||
# Test non-increasing x points
|
||||
@test_throws ArgumentError RELOG._add_pwl_constraints(
|
||||
model,
|
||||
x,
|
||||
[y],
|
||||
[2.0, 1.0],
|
||||
[1.0; 2.0],
|
||||
)
|
||||
@test_throws ArgumentError RELOG._add_pwl_constraints(
|
||||
model,
|
||||
x,
|
||||
[y],
|
||||
[1.0, 1.0],
|
||||
[1.0; 2.0],
|
||||
)
|
||||
|
||||
return
|
||||
end
|
Loading…
Reference in new issue