Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

checker for column reduced cost calculation #818

Merged
merged 9 commits into from
Apr 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/Algorithm/colgen/default.jl
Original file line number Diff line number Diff line change
Expand Up @@ -327,20 +327,23 @@ function ColGen.insert_columns!(reform, ctx::ColGenContext, phase, columns)
nb_reactivated_cols = 0

# Then, we add the new columns (i.e. not in the pool).
col_ids = VarId[]
for sol in primal_sols_to_insert
col_id = insert_column!(master, sol, "MC")
_set_column_cost!(master, col_id, phase)
push!(col_ids, col_id)
nb_added_cols += 1
end

# And we reactivate the deactivated columns already generated.
for col_id in col_ids_to_activate
activate!(master, col_id)
_set_column_cost!(master, col_id, phase)
push!(col_ids, col_id)
nb_reactivated_cols += 1
end

return nb_added_cols + nb_reactivated_cols
return col_ids
end

#############################################################################
Expand Down
37 changes: 33 additions & 4 deletions src/Algorithm/colgen/printer.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@ mutable struct ColGenPrinterContext <: ColGen.AbstractColGenContext
phase::Int
mst_elapsed_time::Float64
sp_elapsed_time::Float64
print_column_reduced_cost::Bool

function ColGenPrinterContext(reform, alg)
function ColGenPrinterContext(
reform, alg;
print_column_reduced_cost = true
)
inner = ColGenContext(reform, alg)
new(inner, 3, 0.0, 0.0)
new(inner, 3, 0.0, 0.0, print_column_reduced_cost)
end
end

Expand Down Expand Up @@ -47,13 +51,38 @@ function ColGen.update_sp_vars_red_costs!(ctx::ColGenPrinterContext, sp::Formula
end

function ColGen.insert_columns!(reform, ctx::ColGenPrinterContext, phase, columns)
return ColGen.insert_columns!(reform, ctx.inner, phase, columns)
col_ids = ColGen.insert_columns!(reform, ctx.inner, phase, columns)
if ctx.print_column_reduced_cost
_print_column_reduced_costs(ColGen.get_reform(ctx), col_ids)
end
return col_ids
end

ColGen.compute_sp_init_db(ctx::ColGenPrinterContext, sp::Formulation{DwSp}) = ColGen.compute_sp_init_db(ctx.inner, sp)

ColGen.set_of_columns(ctx::ColGenPrinterContext) = ColGen.set_of_columns(ctx.inner)
ColGen.push_in_set!(ctx::ColGenPrinterContext, set, col) = ColGen.push_in_set!(ctx.inner, set, col)

function _calculate_column_reduced_cost(reform, col_id)
master = getmaster(reform)
matrix = getcoefmatrix(master)
c = getcurcost(master, col_id)
tmp = 0
for (constrid, coef) in @view matrix[:, col_id] #retrieve the original cost
tmp += coef * getcurincval(master, constrid)
end
return c - tmp
end

function _print_column_reduced_costs(reform, col_ids)
for col_id in col_ids
redcost = _calculate_column_reduced_cost(reform, col_id)
println("********** column $(col_id) with reduced cost = $(redcost) **********")
end
end

function ColGen.push_in_set!(ctx::ColGenPrinterContext, set, col)
return ColGen.push_in_set!(ctx.inner, set, col)
end

function ColGen.optimize_pricing_problem!(ctx::ColGenPrinterContext, sp::Formulation{DwSp}, env, master_dual_sol)
ctx.sp_elapsed_time = @elapsed begin
Expand Down
3 changes: 2 additions & 1 deletion src/ColGen/interface.jl
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,8 @@ function run_colgen_iteration!(context, phase, env, ip_primal_sol)

# Insert columns into the master.
# The implementation is responsible for checking if the column is "valid".
nb_cols_inserted = insert_columns!(get_reform(context), context, phase, generated_columns)
col_ids = insert_columns!(get_reform(context), context, phase, generated_columns)
nb_cols_inserted = length(col_ids)

master_lp_obj_val = get_obj_val(mast_result)

Expand Down
4 changes: 2 additions & 2 deletions src/MOIwrapper.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1062,7 +1062,7 @@ function _customdata!(model::Optimizer, type::DataType)
end

function MOI.set(
model::Optimizer, ::BD.CustomVars, customvars::Vector{DataType}
model::Optimizer, ::BD.CustomVars, customvars
)
for customvar in customvars
_customdata!(model, customvar)
Expand All @@ -1071,7 +1071,7 @@ function MOI.set(
end

function MOI.set(
model::Optimizer, ::BD.CustomConstrs, customconstrs::Vector{DataType}
model::Optimizer, ::BD.CustomConstrs, customconstrs
)
for customconstr in customconstrs
_customdata!(model, customconstr)
Expand Down
12 changes: 6 additions & 6 deletions test/unit/ColGen/colgen_default.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1032,8 +1032,8 @@ function test_two_identicals_cols_at_two_iterations_failure()
ColGen.push_in_set!(ctx, columns, ClA.GeneratedColumn(sol, cost))
end

nb_new_cols = ColGen.insert_columns!(reform, ctx, phase, columns)
@test nb_new_cols == 1
new_cols = ColGen.insert_columns!(reform, ctx, phase, columns)
@test length(new_cols) == 1

## Iteration 2
redcosts_spsols = [-1.0]
Expand Down Expand Up @@ -1091,8 +1091,8 @@ function test_two_identicals_cols_at_same_iteration_ok()
ColGen.push_in_set!(ctx, columns, ClA.GeneratedColumn(sol, cost))
end

nb_new_cols = ColGen.insert_columns!(reform, ctx, phase, columns)
@test nb_new_cols == 2
new_cols = ColGen.insert_columns!(reform, ctx, phase, columns)
@test length(new_cols) == 2
end
register!(unit_tests, "colgen_default", test_two_identicals_cols_at_same_iteration_ok)

Expand Down Expand Up @@ -1140,8 +1140,8 @@ function test_deactivated_column_added_twice_at_same_iteration_ok()
ColGen.push_in_set!(ctx, columns, ClA.GeneratedColumn(sol, cost))
end

nb_new_cols = ColGen.insert_columns!(reform, ctx, phase, columns)
@test nb_new_cols == 1
new_cols = ColGen.insert_columns!(reform, ctx, phase, columns)
@test length(new_cols) == 1
end
register!(unit_tests, "colgen_default", test_deactivated_column_added_twice_at_same_iteration_ok)

Expand Down
2 changes: 1 addition & 1 deletion test/unit/ColGen/colgen_iteration.jl
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ ColGen.update_master_constrs_dual_vals!(::ColGenIterationTestContext, ::ColGenIt
function ColGen.insert_columns!(reform, ::ColGenIterationTestContext, phase, generated_columns)
@test length(generated_columns) == 1
@test generated_columns[1] == [0, 1, 1, 0, 1, 1, 0, 0, 1, 0]
return 1
return [1]
end

function ColGen.compute_dual_bound(::ColGenIterationTestContext, ::ColGenIterationTestPhase, mast_lp_obj_val, sp_dbs, mast_dual_sol)
Expand Down