From 3ef9f738b00584bfb0c527381f7c926c6111930d Mon Sep 17 00:00:00 2001 From: Lara di Cavalcanti Pontes <34425678+laradicp@users.noreply.github.com> Date: Fri, 2 Jul 2021 03:20:01 -0300 Subject: [PATCH] Solutions comparison operators (#549) --- src/Coluna.jl | 2 +- src/ColunaBase/solsandbounds.jl | 8 ++++ test/unit/optimizationstate.jl | 72 +++++++++++---------------------- 3 files changed, 33 insertions(+), 49 deletions(-) diff --git a/src/Coluna.jl b/src/Coluna.jl index a8ed0640d..d09bd9476 100644 --- a/src/Coluna.jl +++ b/src/Coluna.jl @@ -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 diff --git a/src/ColunaBase/solsandbounds.jl b/src/ColunaBase/solsandbounds.jl index 5d72eeae1..ea8618225 100644 --- a/src/ColunaBase/solsandbounds.jl +++ b/src/ColunaBase/solsandbounds.jl @@ -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 diff --git a/test/unit/optimizationstate.jl b/test/unit/optimizationstate.jl index f42e54ade..253a0f9d6 100644 --- a/test/unit/optimizationstate.jl +++ b/test/unit/optimizationstate.jl @@ -22,8 +22,7 @@ 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( @@ -31,16 +30,14 @@ function update_sol_tests() )) # 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!( @@ -48,16 +45,14 @@ function update_sol_tests() )) # 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( @@ -65,8 +60,7 @@ function update_sol_tests() )) # 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 ### ############################################################################################ @@ -88,8 +82,7 @@ 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( @@ -97,16 +90,14 @@ function update_sol_tests() )) # 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!( @@ -114,16 +105,14 @@ function update_sol_tests() )) # 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( @@ -131,8 +120,7 @@ function update_sol_tests() )) # 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 @@ -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 ### @@ -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 ### @@ -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 ### @@ -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 ### @@ -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 ### @@ -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 ### @@ -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 ### @@ -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 ### @@ -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 ### @@ -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 ### @@ -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 ### @@ -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 ###