BlockDecomposition.jl icon indicating copy to clipboard operation
BlockDecomposition.jl copied to clipboard

sos2 constraint not supported

Open manojcentura opened this issue 7 months ago • 1 comments

                            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

manojcentura avatar May 19 '25 15:05 manojcentura

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

odow avatar May 20 '25 21:05 odow