BlockDecomposition.jl
BlockDecomposition.jl copied to clipboard
sos2 constraint not supported
coluna = optimizer_with_attributes(
Coluna.Optimizer,
"params" => Coluna.Params(
solver = Coluna.Algorithm.TreeSearchAlgorithm() # default branch-cut-and-price
),
"default_optimizer" => () -> Gurobi.Optimizer(env)
# "default_optimizer" => HiGHS.Optimizer # GLPK for the master & the subproblems
);
local mod3 = BlockModel(coluna)
println("===========================test================================================")
try
columns = [
(cover = [1, 0, 1], load = 1.2),
(cover = [0, 1, 1], load = 2.5),
(cover = [1, 1, 0], load = 0.5),
] # each is a "schedule" with a certain load
@axis(pschedule_axis, 1:length(columns))
cost_breakpoints = [0.0, 1.0, 2.0, 3.0] # x axis
cost_values = [0.0, 0.8, 1.2, 2.0] # y axis
n_bp = length(cost_breakpoints)
# model = BlockModel(coluna)
# # λ interpolation weights for each column's load
# @variable(mod3, λ[1:length(columns), 1:n_bp] >= 0)
# @constraint(mod3,λ in SOS2())
# # @constraint(mod3, λsfbm_corrections in SOS2(),base_name = "λsfbm_corrections in sos2 ,$pc, $frameno")
# #@variable(model, z[1:length(columns), 1:n_bp - 1], Bin) # SOS2-style selector
# @variable(mod3, select[1:length(columns)] >= 0) # weight of each column
# # Task coverage constraints
# @constraint(mod3, [t = 1:3], sum(select[j] * columns[j].cover[t] for j in 1:length(columns)) == 1)
# # Each column's cost interpolated via SOS2-style convex combination
# @variable(mod3, cost[1:length(columns)])
# @constraint(mod3,sos[1:length(columns)],sum(λ[j, i] for i in 1:n_bp) == select[j])
# @constraint(mod3,sos_2[j in 1:length(columns)],cost[j] == sum(cost_values[i] * λ[j, i] for i in 1:n_bp))
# λ interpolation weights for each column's load
@variable(mod3, λ[1:length(columns), 1:n_bp],upper_bound=1,lower_bound=0)
@constraint(mod3,sos_sum[i in 1:length(columns)],sum(λ[i,j] for j in 1:n_bp)==1)
println("999999")
# @constraint(mod3,λ[:,:] in SOS2())
#for i in 1:length(columns)
@constraint(mod3,constr123[i in 1:length(columns)], λ[i, :] in SOS2())
#end
println("99pppppppp")
# @variable(mod3, z[1:length(columns), 1:n_bp - 1], Bin) # SOS2-style selector
@variable(mod3, select[1:length(columns)] >= 0) # weight of each column
println("manoj45678")
# Task coverage constraints
@constraint(mod3, con1[t = 1:3], sum(select[j] * columns[j].cover[t] for j in 1:length(columns)) == 1)
# Each column's cost interpolated via SOS2-style convex combination
@variable(mod3, cost[1:length(columns)])
@constraint(mod3,sos78[j in 1:length(columns)],sum(λ[j, i] for i in 1:n_bp) == 1)
@constraint(mod3, sos_2899[j in 1:length(columns)],cost[j] == sum(cost_values[i] * λ[j, i] for i in 1:n_bp))
# @constraint(mod3,sos_3[j in 1:length(columns),i in 1:(n_bp - 1)],λ[j, i] <= z[j, i])
# @constraint(mod3,sos_4[j in 1:length(columns),i in 1:(n_bp - 1)],λ[j, i + 1] <= z[j, i])
# @constraint(mod3,sos_5[j in 1:length(columns)],sum(z[j, :]) <= 1)
@dantzig_wolfe_decomposition(mod3, decomposition, pschedule_axis)
@objective(mod3, Min, sum(cost[j] for j in 1:length(columns)))
optimize!(mod3)
File: C:\Users\manojkumar.ram\.julia\packages\BlockDecomposition\xVj1Y\src\checker.jl, Line: 197, Function: _check_dec_constr
File: C:\Users\manojkumar.ram\.julia\packages\BlockDecomposition\xVj1Y\src\checker.jl, Line: 114, Function: _check_annotation
File: C:\Users\manojkumar.ram\.julia\packages\BlockDecomposition\xVj1Y\src\checker.jl, Line: 76, Function: _check_annotations
File: C:\Users\manojkumar.ram\.julia\packages\BlockDecomposition\xVj1Y\src\decomposition.jl, Line: 21, Function: register_decomposition
File: C:\Users\manojkumar.ram\.julia\packages\BlockDecomposition\xVj1Y\src\BlockDecomposition.jl, Line: 76, Function: optimize!
File: C:\Users\manojkumar.ram\.julia\packages\JuMP\RGIK3\src\optimizer_interface.jl, Line: 575, Function: #optimize!#104
File: C:\Users\manojkumar.ram\.julia\packages\JuMP\RGIK3\src\optimizer_interface.jl, Line: 546, Function: optimize!
File: e:\G2_develop_19_05_2025\bcap_optimizer\bcapm_.jl, Line: 451, Function: #453
A reproducible example is:
julia> using Coluna
julia> using Gurobi
julia> using JuMP
julia> using BlockDecomposition
julia> begin
columns = [
(cover = [1, 0, 1], load = 1.2),
(cover = [0, 1, 1], load = 2.5),
(cover = [1, 1, 0], load = 0.5),
]
@axis(pschedule_axis, 1:length(columns))
cost_breakpoints = [0.0, 1.0, 2.0, 3.0]
cost_values = [0.0, 0.8, 1.2, 2.0]
n_bp = length(cost_breakpoints)
coluna = optimizer_with_attributes(
Coluna.Optimizer,
"params" => Coluna.Params(solver = Coluna.Algorithm.TreeSearchAlgorithm()),
"default_optimizer" => Gurobi.Optimizer
)
model = BlockModel(coluna)
@variables(model, begin
0 <= λ[1:length(columns), 1:n_bp] <= 1
select[1:length(columns)] >= 0
cost[1:length(columns)]
end)
@constraints(model, begin
c1, sum(λ; dims = 2) .== 1
c2[i in 1:length(columns)], λ[i,:] in SOS2()
c3[t in 1:3], sum(select[j] * columns[j].cover[t] for j in 1:length(columns)) == 1
c4, select .== sum(λ; dims = 2)
c5, cost .== λ * cost_values
end)
@dantzig_wolfe_decomposition(model, decomposition, pschedule_axis)
@objective(model, Min, sum(cost))
optimize!(model)
end
ERROR: MethodError: no method matching _check_dec_constr(::Model, ::VariableRef, ::ConstraintRef{…}, ::BlockDecomposition.Annotation{…})
Closest candidates are:
_check_dec_constr(::Model, ::Vector{A}, ::ConstraintRef, ::Any) where A<:AbstractJuMPScalar
@ BlockDecomposition ~/.julia/packages/BlockDecomposition/xVj1Y/src/checker.jl:195
_check_dec_constr(::Model, ::AffExpr, ::ConstraintRef, ::Any)
@ BlockDecomposition ~/.julia/packages/BlockDecomposition/xVj1Y/src/checker.jl:187
Stacktrace:
[1] _check_dec_constr
@ ~/.julia/packages/BlockDecomposition/xVj1Y/src/checker.jl:197 [inlined]
[2] _check_annotation
@ ~/.julia/packages/BlockDecomposition/xVj1Y/src/checker.jl:114 [inlined]
[3] _check_annotations(model::Model, container::Vector{ConstraintRef{…}})
@ BlockDecomposition ~/.julia/packages/BlockDecomposition/xVj1Y/src/checker.jl:76
[4] register_decomposition(model::Model)
@ BlockDecomposition ~/.julia/packages/BlockDecomposition/xVj1Y/src/decomposition.jl:21
[5] optimize!(m::Model)
@ BlockDecomposition ~/.julia/packages/BlockDecomposition/xVj1Y/src/BlockDecomposition.jl:76
[6] optimize!(model::Model; ignore_optimize_hook::Bool, _differentiation_backend::MathOptInterface.Nonlinear.SparseReverseMode, kwargs::@Kwargs{})
@ JuMP ~/.julia/packages/JuMP/RGIK3/src/optimizer_interface.jl:575
[7] optimize!(model::Model)
@ JuMP ~/.julia/packages/JuMP/RGIK3/src/optimizer_interface.jl:546
[8] top-level scope
@ REPL[109]:32
Some type information was truncated. Use `show(err)` to see complete types.
julia> show(err)
1-element ExceptionStack:
MethodError: no method matching _check_dec_constr(::Model, ::VariableRef, ::ConstraintRef{Model, MathOptInterface.ConstraintIndex{MathOptInterface.VectorOfVariables, MathOptInterface.SOS2{Float64}}, VectorShape}, ::BlockDecomposition.Annotation{Int64, BlockDecomposition.Master, BlockDecomposition.DantzigWolfe})
Closest candidates are:
_check_dec_constr(::Model, ::Vector{A}, ::ConstraintRef, ::Any) where A<:AbstractJuMPScalar
@ BlockDecomposition ~/.julia/packages/BlockDecomposition/xVj1Y/src/checker.jl:195
_check_dec_constr(::Model, ::AffExpr, ::ConstraintRef, ::Any)
@ BlockDecomposition ~/.julia/packages/BlockDecomposition/xVj1Y/src/checker.jl:187
Stacktrace:
[1] _check_dec_constr
@ ~/.julia/packages/BlockDecomposition/xVj1Y/src/checker.jl:197 [inlined]
[2] _check_annotation
@ ~/.julia/packages/BlockDecomposition/xVj1Y/src/checker.jl:114 [inlined]
[3] _check_annotations(model::Model, container::Vector{ConstraintRef{Model, MathOptInterface.ConstraintIndex{MathOptInterface.VectorOfVariables, MathOptInterface.SOS2{Float64}}, VectorShape}})
@ BlockDecomposition ~/.julia/packages/BlockDecomposition/xVj1Y/src/checker.jl:76
[4] register_decomposition(model::Model)
@ BlockDecomposition ~/.julia/packages/BlockDecomposition/xVj1Y/src/decomposition.jl:21
[5] optimize!(m::Model)
@ BlockDecomposition ~/.julia/packages/BlockDecomposition/xVj1Y/src/BlockDecomposition.jl:76
[6] optimize!(model::Model; ignore_optimize_hook::Bool, _differentiation_backend::MathOptInterface.Nonlinear.SparseReverseMode, kwargs::@Kwargs{})
@ JuMP ~/.julia/packages/JuMP/RGIK3/src/optimizer_interface.jl:575
[7] optimize!(model::Model)
@ JuMP ~/.julia/packages/JuMP/RGIK3/src/optimizer_interface.jl:546
[8] top-level scope
@ REPL[109]:32