Skip to content

Commit 0ce740a

Browse files
committed
add tests and some fixes for tests...
1 parent a6e7a0c commit 0ce740a

File tree

4 files changed

+116
-1
lines changed

4 files changed

+116
-1
lines changed

src/Bridges/Objective/bridges/FunctionConversionBridge.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
1515
for these pairs of functions:
1616
17-
* [`MOI.ScalarAffineFunction`](@ref)` to [`MOI.ScalarQuadraticFunction`](@ref)
17+
* [`MOI.ScalarAffineFunction`](@ref) to [`MOI.ScalarQuadraticFunction`](@ref)
1818
* [`MOI.ScalarQuadraticFunction`](@ref) to [`MOI.ScalarNonlinearFunction`](@ref)
1919
* [`MOI.VectorAffineFunction`](@ref) to [`MOI.VectorQuadraticFunction`](@ref)
2020
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
# Copyright (c) 2017: Miles Lubin and contributors
2+
# Copyright (c) 2017: Google Inc.
3+
#
4+
# Use of this source code is governed by an MIT-style license that can be found
5+
# in the LICENSE.md file or at https://opensource.org/licenses/MIT.
6+
7+
module TestObjectiveNonlinearize
8+
9+
using Test
10+
11+
import MathOptInterface as MOI
12+
13+
function runtests()
14+
for name in names(@__MODULE__; all = true)
15+
if startswith("$(name)", "test_")
16+
@testset "$(name)" begin
17+
getfield(@__MODULE__, name)()
18+
end
19+
end
20+
end
21+
return
22+
end
23+
24+
include("../utilities.jl")
25+
26+
function test_solve_singlevariable_obj()
27+
mock = MOI.Utilities.MockOptimizer(MOI.Utilities.Model{Float64}())
28+
model = MOI.Bridges.Objective.Nonlinearize{Float64}(mock)
29+
MOI.Utilities.set_mock_optimize!(
30+
mock,
31+
(mock::MOI.Utilities.MockOptimizer) ->
32+
MOI.Utilities.mock_optimize!(mock, [1.0], MOI.FEASIBLE_POINT),
33+
)
34+
MOI.Test.test_objective_ObjectiveFunction_duplicate_terms(
35+
model,
36+
MOI.Test.Config(;exclude = Any[MOI.DualObjectiveValue, MOI.ConstraintDual, ]),
37+
)
38+
@test MOI.get(mock, MOI.ObjectiveFunctionType()) ==
39+
MOI.ScalarNonlinearFunction
40+
@test MOI.get(model, MOI.ObjectiveFunctionType()) ==
41+
MOI.ScalarAffineFunction{Float64}
42+
@test MOI.get(mock, MOI.ObjectiveSense()) == MOI.MIN_SENSE
43+
@test MOI.get(model, MOI.ObjectiveSense()) == MOI.MIN_SENSE
44+
vis = MOI.get(model, MOI.ListOfVariableIndices())
45+
func = 3.0 * vis[1] + 0.0
46+
47+
@test MOI.get(
48+
model,
49+
MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(),
50+
) func
51+
MOI.set(model, MOI.ObjectiveSense(), MOI.MAX_SENSE)
52+
@test MOI.get(mock, MOI.ObjectiveSense()) == MOI.MAX_SENSE
53+
@test MOI.get(model, MOI.ObjectiveSense()) == MOI.MAX_SENSE
54+
55+
_test_delete_objective(model, 1, tuple())
56+
return
57+
end
58+
59+
function test_solve_result_index()
60+
mock = MOI.Utilities.MockOptimizer(MOI.Utilities.Model{Float64}())
61+
model = MOI.Bridges.Objective.Nonlinearize{Float64}(mock)
62+
MOI.Utilities.set_mock_optimize!(
63+
mock,
64+
(mock::MOI.Utilities.MockOptimizer) -> MOI.Utilities.mock_optimize!(
65+
mock,
66+
MOI.OPTIMAL,
67+
(MOI.FEASIBLE_POINT, [1.0]),
68+
MOI.FEASIBLE_POINT,
69+
(MOI.VariableIndex, MOI.GreaterThan{Float64}) => [1.0],
70+
),
71+
)
72+
MOI.Test.test_solve_result_index(model, MOI.Test.Config(;exclude = Any[MOI.DualObjectiveValue, MOI.ConstraintDual, ]))
73+
74+
return
75+
end
76+
77+
function test_runtests()
78+
MOI.Bridges.runtests(
79+
MOI.Bridges.Objective.NonlinearizeBridge,
80+
model -> begin
81+
x = MOI.add_variable(model)
82+
aff = MOI.ScalarAffineFunction(MOI.ScalarAffineTerm.([2.0], [x]), 1.0)
83+
MOI.set(model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), aff)
84+
MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE)
85+
end,
86+
model -> begin
87+
x = MOI.add_variable(model)
88+
exp = MOI.ScalarNonlinearFunction(:+, [MOI.ScalarNonlinearFunction(:*, [2.0, MOI.VariableIndex(1)]), 1.0])
89+
MOI.set(model, MOI.ObjectiveFunction{MOI.ScalarNonlinearFunction}(), exp)
90+
MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE)
91+
end,
92+
)
93+
MOI.Bridges.runtests(
94+
MOI.Bridges.Objective.NonlinearizeBridge,
95+
model -> begin
96+
x = MOI.add_variable(model)
97+
aff = MOI.ScalarAffineFunction(MOI.ScalarAffineTerm.([2.0], [x]), 1.0)
98+
MOI.set(model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), aff)
99+
MOI.set(model, MOI.ObjectiveSense(), MOI.MAX_SENSE)
100+
end,
101+
model -> begin
102+
x = MOI.add_variable(model)
103+
exp = MOI.ScalarNonlinearFunction(:+, [MOI.ScalarNonlinearFunction(:*, [2.0, MOI.VariableIndex(1)]), 1.0])
104+
MOI.set(model, MOI.ObjectiveFunction{MOI.ScalarNonlinearFunction}(), exp)
105+
MOI.set(model, MOI.ObjectiveSense(), MOI.MAX_SENSE)
106+
end,
107+
)
108+
return
109+
end
110+
111+
end # module
112+
113+
TestObjectiveNonlinearize.runtests()

test/Bridges/Objective/SlackBridge.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,7 @@ function test_complex_objective()
525525
MOI.Utilities.Model{Float64}(),
526526
Float64,
527527
)
528+
MOI.Bridges.remove_bridge(dest, MOI.Bridges.Objective.NonlinearizeBridge{Float64}) # Otherwise, would be bridged to Nonlinear.
528529
@test_throws MOI.UnsupportedAttribute(attr) MOI.copy_to(dest, model)
529530
end
530531
return

test/Bridges/debug.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ end
188188

189189
function test_print_active_bridges_objective_unsupported()
190190
model = MOI.Bridges.full_bridge_optimizer(Model{Float64}(), Float64)
191+
MOI.Bridges.remove_bridge(model, MOI.Bridges.Objective.NonlinearizeBridge{Float64}) # Otherwise, Int would be bridged to Nonlinear.
191192
F = MOI.ScalarAffineFunction{Int}
192193
@test_throws(
193194
MOI.UnsupportedAttribute{MOI.ObjectiveFunction{F}},

0 commit comments

Comments
 (0)