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),
999999
99pppppppp
manoj45678
error in bcapm.jl
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
============================test_end==========================================
File: e:\G2_develop_19_05_2025\bcap_optimizer\bcapm_.jl, Line: 451, Function: #453
============================test_end==========================================
Hi @manoj.centura,
I can’t tell what the problem is from the code you have posted. Do you have a reproducible example? Or the full output of the error?
I see you have posted an issue: sos2 constraint not supported · Issue #105 · atoptima/BlockDecomposition.jl · GitHub
Dear @odow, here the working code and error. Thanks in advance for the help
using Coluna
using Gurobi
using JuMP
xx="solverlink"
env = Gurobi.Env(xx,"svm_compute_dev")
coluna = optimizer_with_attributes(
Coluna.Optimizer,
"params" => Coluna.Params(
solver = Coluna.Algorithm.TreeSearchAlgorithm()
),"default_optimizer" => () -> Gurobi.Optimizer(env))
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)
mod3 = BlockModel(coluna)
# λ 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)
@constraint(mod3,sos_dif[i in 1:length(columns)],λ[i,:] in SOS2())
# @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
# 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,sos[j in 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))
@dantzig_wolfe_decomposition(mod3, decomposition, pschedule_axis)
@objective(mod3, Min, sum(cost[j] for j in 1:length(columns)))
optimize!(mod3)
show(err)
# Show results
for j in 1:length(columns)
println("Column $j selected: ", value(select[j]), ", Cost = ", value(cost[j]))
end
error trail is
julia> optimize!(mod3)
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 C:\Users\manojkumar.ram\.julia\packages\BlockDecomposition\xVj1Y\src\checker.jl:195
_check_dec_constr(::Model, ::AffExpr, ::ConstraintRef, ::Any)
@ BlockDecomposition C:\Users\manojkumar.ram\.julia\packages\BlockDecomposition\xVj1Y\src\checker.jl:187
Stacktrace:
[1] _check_dec_constr
@ C:\Users\manojkumar.ram\.julia\packages\BlockDecomposition\xVj1Y\src\checker.jl:197 [inlined]
[2] _check_annotation
@ C:\Users\manojkumar.ram\.julia\packages\BlockDecomposition\xVj1Y\src\checker.jl:114 [inlined]
[3] _check_annotations(model::Model, container::Vector{ConstraintRef{Model, MathOptInterface.ConstraintIndex{…}, VectorShape}})
@ BlockDecomposition C:\Users\manojkumar.ram\.julia\packages\BlockDecomposition\xVj1Y\src\checker.jl:76
[4] register_decomposition(model::Model)
@ BlockDecomposition C:\Users\manojkumar.ram\.julia\packages\BlockDecomposition\xVj1Y\src\decomposition.jl:21
[5] optimize!(m::Model)
@ BlockDecomposition C:\Users\manojkumar.ram\.julia\packages\BlockDecomposition\xVj1Y\src\BlockDecomposition.jl:76
[6] optimize!(model::Model; ignore_optimize_hook::Bool, _differentiation_backend::MathOptInterface.Nonlinear.SparseReverseMode, kwargs::@Kwargs{})
@ JuMP C:\Users\manojkumar.ram\.julia\packages\JuMP\RGIK3\src\optimizer_interface.jl:575
[7] optimize!(model::Model)
@ JuMP C:\Users\manojkumar.ram\.julia\packages\JuMP\RGIK3\src\optimizer_interface.jl:546
[8] top-level scope
@ REPL[187]:1
Some type information was truncated. Use `show(err)` to see complete types.
This seems like a bug in BlockDecomposition.jl, but it probably means that SOS2 constraints are not tested or expected to work.
I’ve updated your issue with a reproducible example: