Skip to content

Commit

Permalink
Solutions comparison operators (#549)
Browse files Browse the repository at this point in the history
  • Loading branch information
laradicp authored Jul 2, 2021
1 parent 51db6d4 commit 3ef9f73
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 49 deletions.
2 changes: 1 addition & 1 deletion src/Coluna.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module Coluna
# Base functions for which we define more methods in Coluna
import Base: isempty, hash, isequal, length, iterate, getindex, lastindex,
getkey, delete!, setindex!, haskey, copy, promote_rule, convert, isinteger,
push!, filter, diff, hcat
push!, filter, diff, hcat, in

import BlockDecomposition, MathOptInterface, TimerOutputs

Expand Down
8 changes: 8 additions & 0 deletions src/ColunaBase/solsandbounds.jl
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,14 @@ function Base.filter(f::Function, s::S) where {S <: Solution}
return S(s.model, s.bound, s.status, filter(f, s.sol), s.custom_data)
end

function Base.in(p::Tuple{De,Va}, a::Solution{Mo,De,Va}, valcmp=(==)) where {Mo,De,Va}
v = get(a, p[1], Base.secret_table_token)
if v !== Base.secret_table_token
return valcmp(v, p[2])
end
return false
end

function Base.show(io::IO, solution::Solution{Mo,De,Va}) where {Mo,De,Va}
println(io, "Solution")
for (decision, value) in solution
Expand Down
72 changes: 24 additions & 48 deletions test/unit/optimizationstate.jl
Original file line number Diff line number Diff line change
Expand Up @@ -22,51 +22,45 @@ function update_sol_tests()
update_ip_primal_sol!(state, primalsol)
# check that `primalsol` is added to `state.ip_primal_sols`
@test length(get_ip_primal_sols(state)) == 1
@test keys(get_ip_primal_sols(state)[1]) == keys(primalsol)
@test values(get_ip_primal_sols(state)[1]) == values(primalsol)
@test get_ip_primal_sols(state)[1] == primalsol
# check that incumbent bound is updated
@test get_ip_primal_bound(state) == 2.0
update_ip_primal_sol!(state, PrimalSolution(
form, [getid(var)], [3.0], 3.0, CB.UNKNOWN_FEASIBILITY
))
# check that solution worse than `primalsol` is NOT added to `state.ip_primal_sols`
@test length(get_ip_primal_sols(state)) == 1
@test keys(get_ip_primal_sols(state)[1]) == keys(primalsol)
@test values(get_ip_primal_sols(state)[1]) == values(primalsol)
@test get_ip_primal_sols(state)[1] == primalsol
###

### lp primal
update_lp_primal_sol!(state, primalsol)
# check that `primalsol` is added to `state.lp_primal_sols`
@test length(get_lp_primal_sols(state)) == 1
@test keys(get_lp_primal_sols(state)[1]) == keys(primalsol)
@test values(get_lp_primal_sols(state)[1]) == values(primalsol)
@test get_lp_primal_sols(state)[1] == primalsol
# check that incumbent bound is updated
@test get_lp_primal_bound(state) == 2.0
update_lp_primal_sol!(
state, PrimalSolution(form, [getid(var)], [3.0], 3.0, CB.UNKNOWN_FEASIBILITY
))
# check that solution worse than `primalsol` is NOT added to `state.lp_primal_sols`
@test length(get_lp_primal_sols(state)) == 1
@test keys(get_lp_primal_sols(state)[1]) == keys(primalsol)
@test values(get_lp_primal_sols(state)[1]) == values(primalsol)
@test get_lp_primal_sols(state)[1] == primalsol
###

### lp dual
update_lp_dual_sol!(state, dualsol)
# check that `dualsol` is added to `state.lp_dual_sols`
@test length(get_lp_dual_sols(state)) == 1
@test keys(get_lp_dual_sols(state)[1]) == keys(dualsol)
@test values(get_lp_dual_sols(state)[1]) == values(dualsol)
@test get_lp_dual_sols(state)[1] == dualsol
# check that incumbent bound is updated
@test get_lp_dual_bound(state) == 1.0
update_lp_dual_sol!(state, DualSolution(
form, [getid(constr)], [0.0], 0.0, CB.UNKNOWN_FEASIBILITY
))
# check that solution worse than `dualsol` is NOT added to `state.lp_dual_sols`
@test length(get_lp_dual_sols(state)) == 1
@test keys(get_lp_dual_sols(state)[1]) == keys(dualsol)
@test values(get_lp_dual_sols(state)[1]) == values(dualsol)
@test get_lp_dual_sols(state)[1] == dualsol
###

############################################################################################
Expand All @@ -88,51 +82,45 @@ function update_sol_tests()
update_ip_primal_sol!(state, primalsol)
# check that `primalsol` is added to `state.ip_primal_sols`
@test length(get_ip_primal_sols(state)) == 1
@test keys(get_ip_primal_sols(state)[1]) == keys(primalsol)
@test values(get_ip_primal_sols(state)[1]) == values(primalsol)
@test get_ip_primal_sols(state)[1] == primalsol
# check that incumbent bound is updated
@test get_ip_primal_bound(state) == 1.0
update_ip_primal_sol!(state, PrimalSolution(
form, [getid(var)], [0.0], 0.0, CB.UNKNOWN_FEASIBILITY
))
# check that solution worse than `primalsol` is NOT added to `state.ip_primal_sols`
@test length(get_ip_primal_sols(state)) == 1
@test keys(get_ip_primal_sols(state)[1]) == keys(primalsol)
@test values(get_ip_primal_sols(state)[1]) == values(primalsol)
@test get_ip_primal_sols(state)[1] == primalsol
###

### lp primal
update_lp_primal_sol!(state, primalsol)
# check that `primalsol` is added to `state.lp_primal_sols`
@test length(get_lp_primal_sols(state)) == 1
@test keys(get_lp_primal_sols(state)[1]) == keys(primalsol)
@test values(get_lp_primal_sols(state)[1]) == values(primalsol)
@test get_lp_primal_sols(state)[1] == primalsol
# check that incumbent bound is updated
@test get_lp_primal_bound(state) == 1.0
update_lp_primal_sol!(
state, PrimalSolution(form, [getid(var)], [0.0], 0.0, CB.UNKNOWN_FEASIBILITY
))
# check that solution worse than `primalsol` is NOT added to `state.lp_primal_sols`
@test length(get_lp_primal_sols(state)) == 1
@test keys(get_lp_primal_sols(state)[1]) == keys(primalsol)
@test values(get_lp_primal_sols(state)[1]) == values(primalsol)
@test get_lp_primal_sols(state)[1] == primalsol
###

### lp dual
update_lp_dual_sol!(state, dualsol)
# check that `dualsol` is added to `state.lp_dual_sols`
@test length(get_lp_dual_sols(state)) == 1
@test keys(get_lp_dual_sols(state)[1]) == keys(dualsol)
@test values(get_lp_dual_sols(state)[1]) == values(dualsol)
@test get_lp_dual_sols(state)[1] == dualsol
# check that incumbent bound is updated
@test get_lp_dual_bound(state) == 2.0
update_lp_dual_sol!(state, DualSolution(
form, [getid(constr)], [3.0], 3.0, CB.UNKNOWN_FEASIBILITY
))
# check that solution worse than `dualsol` is NOT added to `state.lp_dual_sols`
@test length(get_lp_dual_sols(state)) == 1
@test keys(get_lp_dual_sols(state)[1]) == keys(dualsol)
@test values(get_lp_dual_sols(state)[1]) == values(dualsol)
@test get_lp_dual_sols(state)[1] == dualsol
###
end

Expand All @@ -155,8 +143,7 @@ function add_sol_tests()
)
# check that `primalsol` is added to `state.ip_primal_sols` and worst solution is removed
@test length(get_ip_primal_sols(state)) == 1
@test keys(get_ip_primal_sols(state)[1]) == keys(primalsol)
@test values(get_ip_primal_sols(state)[1]) == values(primalsol)
@test get_ip_primal_sols(state)[1] == primalsol
# check that incumbent bound is updated
@test get_ip_primal_bound(state) == 2.0
###
Expand All @@ -170,8 +157,7 @@ function add_sol_tests()
add_lp_primal_sol!(state, primalsol)
# check that `primalsol` is added to `state.lp_primal_sols` and worst solution is removed
@test length(get_lp_primal_sols(state)) == 1
@test keys(get_lp_primal_sols(state)[1]) == keys(primalsol)
@test values(get_lp_primal_sols(state)[1]) == values(primalsol)
@test get_lp_primal_sols(state)[1] == primalsol
# check that incumbent bound is updated
@test get_lp_primal_bound(state) == 2.0
###
Expand All @@ -185,8 +171,7 @@ function add_sol_tests()
add_lp_dual_sol!(state, dualsol)
# check that `dualsol` is added to `state.lp_dual_sols` and worst solution is removed
@test length(get_lp_dual_sols(state)) == 1
@test keys(get_lp_dual_sols(state)[1]) == keys(dualsol)
@test values(get_lp_dual_sols(state)[1]) == values(dualsol)
@test get_lp_dual_sols(state)[1] == dualsol
# check that incumbent bound is updated
@test get_lp_dual_bound(state) == 1.0
###
Expand All @@ -211,8 +196,7 @@ function add_sol_tests()
)
# check that `primalsol` is added to `state.ip_primal_sols` and worst solution is removed
@test length(get_ip_primal_sols(state)) == 1
@test keys(get_ip_primal_sols(state)[1]) == keys(primalsol)
@test values(get_ip_primal_sols(state)[1]) == values(primalsol)
@test get_ip_primal_sols(state)[1] == primalsol
# check that incumbent bound is updated
@test get_ip_primal_bound(state) == 1.0
###
Expand All @@ -226,8 +210,7 @@ function add_sol_tests()
add_lp_primal_sol!(state, primalsol)
# check that `primalsol` is added to `state.lp_primal_sols` and worst solution is removed
@test length(get_lp_primal_sols(state)) == 1
@test keys(get_lp_primal_sols(state)[1]) == keys(primalsol)
@test values(get_lp_primal_sols(state)[1]) == values(primalsol)
@test get_lp_primal_sols(state)[1] == primalsol
# check that incumbent bound is updated
@test get_lp_primal_bound(state) == 1.0
###
Expand All @@ -241,8 +224,7 @@ function add_sol_tests()
add_lp_dual_sol!(state, dualsol)
# check that `dualsol` is added to `state.lp_dual_sols` and worst solution is removed
@test length(get_lp_dual_sols(state)) == 1
@test keys(get_lp_dual_sols(state)[1]) == keys(dualsol)
@test values(get_lp_dual_sols(state)[1]) == values(dualsol)
@test get_lp_dual_sols(state)[1] == dualsol
# check that incumbent bound is updated
@test get_lp_dual_bound(state) == 2.0
###
Expand All @@ -268,8 +250,7 @@ function set_sol_tests()
set_ip_primal_sol!(state, primalsol)
# check that only the solution which was set last is in `state.ip_primal_sols`
@test length(get_ip_primal_sols(state)) == 1
@test keys(get_ip_primal_sols(state)[1]) == keys(primalsol)
@test values(get_ip_primal_sols(state)[1]) == values(primalsol)
@test get_ip_primal_sols(state)[1] == primalsol
# check that incumbent bound is NOT updated
@test get_ip_primal_bound(state) == 3.0
###
Expand All @@ -281,8 +262,7 @@ function set_sol_tests()
set_lp_primal_sol!(state, primalsol)
# check that only the solution which was set last is in `state.lp_primal_sols`
@test length(get_lp_primal_sols(state)) == 1
@test keys(get_lp_primal_sols(state)[1]) == keys(primalsol)
@test values(get_lp_primal_sols(state)[1]) == values(primalsol)
@test get_lp_primal_sols(state)[1] == primalsol
# check that incumbent bound is NOT updated
@test get_lp_primal_bound(state) == 3.0
###
Expand All @@ -294,8 +274,7 @@ function set_sol_tests()
set_lp_dual_sol!(state, dualsol)
# check that only the solution which was set last is in `state.lp_dual_sols`
@test length(get_lp_dual_sols(state)) == 1
@test keys(get_lp_dual_sols(state)[1]) == keys(dualsol)
@test values(get_lp_dual_sols(state)[1]) == values(dualsol)
@test get_lp_dual_sols(state)[1] == dualsol
# check that incumbent bound is NOT updated
@test get_lp_dual_bound(state) == -1.0
###
Expand All @@ -321,8 +300,7 @@ function set_sol_tests()
set_ip_primal_sol!(state, primalsol)
# check that only the solution which was set last is in `state.ip_primal_sols`
@test length(get_ip_primal_sols(state)) == 1
@test keys(get_ip_primal_sols(state)[1]) == keys(primalsol)
@test values(get_ip_primal_sols(state)[1]) == values(primalsol)
@test get_ip_primal_sols(state)[1] == primalsol
# check that incumbent bound is NOT updated
@test get_ip_primal_bound(state) == -1.0
###
Expand All @@ -334,8 +312,7 @@ function set_sol_tests()
set_lp_primal_sol!(state, primalsol)
# check that only the solution which was set last is in `state.lp_primal_sols`
@test length(get_lp_primal_sols(state)) == 1
@test keys(get_lp_primal_sols(state)[1]) == keys(primalsol)
@test values(get_lp_primal_sols(state)[1]) == values(primalsol)
@test get_lp_primal_sols(state)[1] == primalsol
# check that incumbent bound is NOT updated
@test get_lp_primal_bound(state) == -1.0
###
Expand All @@ -347,8 +324,7 @@ function set_sol_tests()
set_lp_dual_sol!(state, dualsol)
# check that only the solution which was set last is in `state.lp_dual_sols`
@test length(get_lp_dual_sols(state)) == 1
@test keys(get_lp_dual_sols(state)[1]) == keys(dualsol)
@test values(get_lp_dual_sols(state)[1]) == values(dualsol)
@test get_lp_dual_sols(state)[1] == dualsol
# check that incumbent bound is NOT updated
@test get_lp_dual_bound(state) == 3.0
###
Expand Down

0 comments on commit 3ef9f73

Please sign in to comment.