Skip to content

Can I use StochasticPrograms.jl with Conic Constraints? #39

@jmcastro2109

Description

@jmcastro2109

Hi,

My second stage problem has a linear objective and the constraint is a power cone. Currently I am solving this second stage problem with Mosek. Can I use Stochastic Programs to solve the first stage?

edit:

Looks like it does not work :(

Solver name: Mosek
ERROR: LoadError: Unable to transform a quadratic constraint into a second-order cone
constraint because the quadratic constraint is not strongly convex.

Convex constraints that are not strongly convex (i.e., the matrix is
positive semidefinite but not positive definite) are not supported
yet.

Note that a quadratic equality constraint is non-convex.
Stacktrace:
  [1] error(s::String)
    @ Base .\error.jl:33
  [2] bridge_constraint(#unused#::Type{MathOptInterface.Bridges.Constraint.QuadtoSOCBridge{Float64}}, model::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, func::MathOptInterface.ScalarQuadraticFunction{Float64}, set::MathOptInterface.GreaterThan{Float64})
    @ MathOptInterface.Bridges.Constraint C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\Constraint\quad_to_soc.jl:82
  [3] add_bridged_constraint(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, BridgeType::Type, f::MathOptInterface.ScalarQuadraticFunction{Float64}, s::MathOptInterface.GreaterThan{Float64})
    @ MathOptInterface.Bridges C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:1404
  [4] add_constraint(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, f::MathOptInterface.ScalarQuadraticFunction{Float64}, s::MathOptInterface.GreaterThan{Float64})
    @ MathOptInterface.Bridges C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:1483
  [5] normalize_and_add_constraint(model::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, func::MathOptInterface.ScalarQuadraticFunction{Float64}, set::MathOptInterface.GreaterThan{Float64}; allow_modify_function::Bool)
    @ MathOptInterface.Utilities C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\constraints.jl:19
  [6] normalize_and_add_constraint(model::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, func::MathOptInterface.ScalarQuadraticFunction{Float64}, set::MathOptInterface.GreaterThan{Float64})
    @ MathOptInterface.Utilities C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\constraints.jl:19
  [7] bridge_objective(#unused#::Type{MathOptInterface.Bridges.Objective.SlackBridge{Float64, MathOptInterface.ScalarQuadraticFunction{Float64}, MathOptInterface.ScalarQuadraticFunction{Float64}}}, model::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, func::MathOptInterface.ScalarQuadraticFunction{Float64})
    @ MathOptInterface.Bridges.Objective C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\Objective\slack.jl:43
  [8] _bridge_objective(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, BridgeType::Type, func::MathOptInterface.ScalarQuadraticFunction{Float64})
    @ MathOptInterface.Bridges C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:957
  [9] set(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, attr::MathOptInterface.ObjectiveFunction{MathOptInterface.ScalarQuadraticFunction{Float64}}, func::MathOptInterface.ScalarQuadraticFunction{Float64})
    @ MathOptInterface.Bridges C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:995
 [10] bridge_objective
    @ C:\Users\juan\.julia\packages\StochasticPrograms\Jl6sf\src\types\decisions\bridges\objectives\quadratic.jl:13 [inlined]
 [11] _bridge_objective(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, BridgeType::Type, func::QuadraticDecisionFunction{Float64})
    @ MathOptInterface.Bridges C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:957
 [12] set(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, attr::MathOptInterface.ObjectiveFunction{QuadraticDecisionFunction{Float64}}, func::QuadraticDecisionFunction{Float64})
    @ MathOptInterface.Bridges C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:995
 [13] _pass_attributes(dest::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, src::MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}, idxmap::MathOptInterface.Utilities.IndexMap, attrs::Vector{MathOptInterface.AbstractModelAttribute}, supports_args::Tuple{}, get_args::Tuple{}, set_args::Tuple{}, pass_attr!::Function)
    @ MathOptInterface.Utilities C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\copy.jl:300
 [14] pass_attributes
    @ C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\copy.jl:206 [inlined]
 [15] pass_attributes
    @ C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\copy.jl:202 [inlined]
 [16] default_copy_to(dest::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, src::MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}, copy_names::Bool, filter_constraints::Nothing)
    @ MathOptInterface.Utilities C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\copy.jl:711
 [17] #automatic_copy_to#127
    @ C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\copy.jl:24 [inlined]
 [18] #copy_to#4
    @ C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:401 [inlined]
 [19] attach_optimizer(model::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.AbstractOptimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}})
    @ MathOptInterface.Utilities C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\cachingoptimizer.jl:185
 [20] optimize!(m::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.AbstractOptimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}})
    @ MathOptInterface.Utilities C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\cachingoptimizer.jl:248
 [21] optimize!(structure::DeterministicEquivalent{2, 1, Tuple{Vector{Scenario{NamedTuple{(:z₁, :z₂), Tuple{Float64, Float64}}}}}}, optimizer::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.AbstractOptimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}}, x₀::Vector{Float64})
    @ StochasticPrograms C:\Users\juan\.julia\packages\StochasticPrograms\Jl6sf\src\methods\deterministic_equivalent\optimization.jl:13
 [22] optimize!(stochasticprogram::StochasticProgram{2, Tuple{StochasticPrograms.Stage{NamedTuple{(), Tuple{}}}, StochasticPrograms.Stage{NamedTuple{(), Tuple{}}}}, DeterministicEquivalent{2, 1, Tuple{Vector{Scenario{NamedTuple{(:z₁, :z₂), Tuple{Float64, Float64}}}}}}}; crash::StochasticPrograms.Crash.None, cache::Bool, kw::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ StochasticPrograms C:\Users\juan\.julia\packages\StochasticPrograms\Jl6sf\src\methods\api.jl:209
 [23] optimize!(stochasticprogram::StochasticProgram{2, Tuple{StochasticPrograms.Stage{NamedTuple{(), Tuple{}}}, StochasticPrograms.Stage{NamedTuple{(), Tuple{}}}}, DeterministicEquivalent{2, 1, Tuple{Vector{Scenario{NamedTuple{(:z₁, :z₂), Tuple{Float64, Float64}}}}}}})
    @ StochasticPrograms C:\Users\juan\.julia\packages\StochasticPrograms\Jl6sf\src\methods\api.jl:201
 [24] top-level scope
    @ c:\Users\juan\Dropbox\Projects\JMP\others\MWE_2.jl:196
in expression starting at c:\Users\juan\Dropbox\Projects\JMP\others\MWE_2.jl:196

caused by: PosDefException: matrix is not positive definite; Cholesky factorization failed.
Stacktrace:
  [1] cholesky!(F::SuiteSparse.CHOLMOD.Factor{Float64}, A::SuiteSparse.CHOLMOD.Sparse{Float64}; shift::Float64, check::Bool)
    @ SuiteSparse.CHOLMOD C:\Users\juan\AppData\Local\Programs\Julia-1.7.1\share\julia\stdlib\v1.7\SuiteSparse\src\cholmod.jl:1150
  [2] #cholesky#8
    @ C:\Users\juan\AppData\Local\Programs\Julia-1.7.1\share\julia\stdlib\v1.7\SuiteSparse\src\cholmod.jl:1185 [inlined]
  [3] cholesky
    @ C:\Users\juan\AppData\Local\Programs\Julia-1.7.1\share\julia\stdlib\v1.7\SuiteSparse\src\cholmod.jl:1182 [inlined]
  [4] #cholesky#9
    @ C:\Users\juan\AppData\Local\Programs\Julia-1.7.1\share\julia\stdlib\v1.7\SuiteSparse\src\cholmod.jl:1297 [inlined]
  [5] cholesky
    @ C:\Users\juan\AppData\Local\Programs\Julia-1.7.1\share\julia\stdlib\v1.7\SuiteSparse\src\cholmod.jl:1297 [inlined]
  [6] bridge_constraint(#unused#::Type{MathOptInterface.Bridges.Constraint.QuadtoSOCBridge{Float64}}, model::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, func::MathOptInterface.ScalarQuadraticFunction{Float64}, set::MathOptInterface.GreaterThan{Float64})
    @ MathOptInterface.Bridges.Constraint C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\Constraint\quad_to_soc.jl:78
  [7] add_bridged_constraint(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, BridgeType::Type, f::MathOptInterface.ScalarQuadraticFunction{Float64}, s::MathOptInterface.GreaterThan{Float64})
    @ MathOptInterface.Bridges C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:1404
  [8] add_constraint(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, f::MathOptInterface.ScalarQuadraticFunction{Float64}, s::MathOptInterface.GreaterThan{Float64})
    @ MathOptInterface.Bridges C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:1483
  [9] normalize_and_add_constraint(model::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, func::MathOptInterface.ScalarQuadraticFunction{Float64}, set::MathOptInterface.GreaterThan{Float64}; allow_modify_function::Bool)
    @ MathOptInterface.Utilities C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\constraints.jl:19
 [10] normalize_and_add_constraint(model::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, func::MathOptInterface.ScalarQuadraticFunction{Float64}, set::MathOptInterface.GreaterThan{Float64})
    @ MathOptInterface.Utilities C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\constraints.jl:19
 [11] bridge_objective(#unused#::Type{MathOptInterface.Bridges.Objective.SlackBridge{Float64, MathOptInterface.ScalarQuadraticFunction{Float64}, MathOptInterface.ScalarQuadraticFunction{Float64}}}, model::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, func::MathOptInterface.ScalarQuadraticFunction{Float64})
    @ MathOptInterface.Bridges.Objective C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\Objective\slack.jl:43
 [12] _bridge_objective(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, BridgeType::Type, func::MathOptInterface.ScalarQuadraticFunction{Float64})
    @ MathOptInterface.Bridges C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:957
 [13] set(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, attr::MathOptInterface.ObjectiveFunction{MathOptInterface.ScalarQuadraticFunction{Float64}}, func::MathOptInterface.ScalarQuadraticFunction{Float64})
    @ MathOptInterface.Bridges C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:995
 [14] bridge_objective
    @ C:\Users\juan\.julia\packages\StochasticPrograms\Jl6sf\src\types\decisions\bridges\objectives\quadratic.jl:13 [inlined]
 [15] _bridge_objective(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, BridgeType::Type, func::QuadraticDecisionFunction{Float64})
    @ MathOptInterface.Bridges C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:957
 [16] set(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, attr::MathOptInterface.ObjectiveFunction{QuadraticDecisionFunction{Float64}}, func::QuadraticDecisionFunction{Float64})
    @ MathOptInterface.Bridges C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:995
 [17] _pass_attributes(dest::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, src::MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}, idxmap::MathOptInterface.Utilities.IndexMap, attrs::Vector{MathOptInterface.AbstractModelAttribute}, supports_args::Tuple{}, get_args::Tuple{}, set_args::Tuple{}, pass_attr!::Function)
    @ MathOptInterface.Utilities C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\copy.jl:300
 [18] pass_attributes
    @ C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\copy.jl:206 [inlined]
 [19] pass_attributes
    @ C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\copy.jl:202 [inlined]
 [20] default_copy_to(dest::MathOptInterface.Bridges.LazyBridgeOptimizer{MosekModel}, src::MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}, copy_names::Bool, filter_constraints::Nothing)
    @ MathOptInterface.Utilities C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\copy.jl:711
 [21] #automatic_copy_to#127
    @ C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\copy.jl:24 [inlined]
 [22] #copy_to#4
    @ C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Bridges\bridge_optimizer.jl:401 [inlined]
 [23] attach_optimizer(model::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.AbstractOptimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}})
    @ MathOptInterface.Utilities C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\cachingoptimizer.jl:185
 [24] optimize!(m::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.AbstractOptimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}})
    @ MathOptInterface.Utilities C:\Users\juan\.julia\packages\MathOptInterface\YDdD3\src\Utilities\cachingoptimizer.jl:248
 [25] optimize!(structure::DeterministicEquivalent{2, 1, Tuple{Vector{Scenario{NamedTuple{(:z₁, :z₂), Tuple{Float64, Float64}}}}}}, optimizer::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.AbstractOptimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.GenericModel{Float64, MathOptInterface.Utilities.ModelFunctionConstraints{Float64}}}}, x₀::Vector{Float64})
    @ StochasticPrograms C:\Users\juan\.julia\packages\StochasticPrograms\Jl6sf\src\methods\deterministic_equivalent\optimization.jl:13
 [26] optimize!(stochasticprogram::StochasticProgram{2, Tuple{StochasticPrograms.Stage{NamedTuple{(), Tuple{}}}, StochasticPrograms.Stage{NamedTuple{(), Tuple{}}}}, DeterministicEquivalent{2, 1, Tuple{Vector{Scenario{NamedTuple{(:z₁, :z₂), Tuple{Float64, Float64}}}}}}}; crash::StochasticPrograms.Crash.None, cache::Bool, kw::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ StochasticPrograms C:\Users\juan\.julia\packages\StochasticPrograms\Jl6sf\src\methods\api.jl:209
 [27] optimize!(stochasticprogram::StochasticProgram{2, Tuple{StochasticPrograms.Stage{NamedTuple{(), Tuple{}}}, StochasticPrograms.Stage{NamedTuple{(), Tuple{}}}}, DeterministicEquivalent{2, 1, Tuple{Vector{Scenario{NamedTuple{(:z₁, :z₂), Tuple{Float64, Float64}}}}}}})
    @ StochasticPrograms C:\Users\juan\.julia\packages\StochasticPrograms\Jl6sf\src\methods\api.jl:201
 [28] top-level scope
    @ c:\Users\juan\Dropbox\Projects\JMP\others\MWE_2.jl:196

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions