Alpine.jl
Alpine.jl copied to clipboard
ERROR: type Symbol has no field head
https://github.com/lanl-ansi/Alpine.jl/issues/223 rises from the grave.
I don't remember if we support user-defined functions, but we should at least throw a nicer error message:
(alpine) pkg> st
Status `/private/tmp/alpine/Project.toml`
[07493b3f] Alpine v0.5.2 `~/.julia/dev/Alpine`
[87dc4568] HiGHS v1.4.3
[b6b21f68] Ipopt v1.1.0
[4076af6c] JuMP v1.7.0
[2ddba703] Juniper v0.9.1
julia> using JuMP, Alpine, HiGHS, Ipopt, Juniper
julia> nlp_solver = optimizer_with_attributes(Ipopt.Optimizer, MOI.Silent() => true, "sb" => "yes", "max_iter" => Int(1e4));
julia> mip_solver = JuMP.optimizer_with_attributes(HiGHS.Optimizer, "presolve" => "on", "log_to_console" => false);
julia> m = Model(
optimizer_with_attributes(
Alpine.Optimizer,
"minlp_solver" => optimizer_with_attributes(
Juniper.Optimizer,
MOI.Silent() => true,
"mip_solver" => mip_solver,
"nl_solver" => nlp_solver,
),
"nlp_solver" => nlp_solver,
"mip_solver" => mip_solver,
)
)
A JuMP Model
Feasibility problem with:
Variables: 0
Model mode: AUTOMATIC
CachingOptimizer state: EMPTY_OPTIMIZER
Solver name: Alpine
julia> @variable(m, x[1:3], Bin)
3-element Vector{VariableRef}:
x[1]
x[2]
x[3]
julia> f_objective(x::T...) where {T<:Real} = x[1] + x[2] + x[3]
f_objective (generic function with 1 method)
julia> register(m, :f_objective, 3, f_objective; autodiff = true)
julia> @NLobjective(m, Min, f_objective(x...))
julia> optimize!(m)
ERROR: type Symbol has no field head
Stacktrace:
[1] getproperty(x::Symbol, f::Symbol)
@ Base ./Base.jl:33
[2] traverse_expr_linear_to_affine(expr::Symbol, lhscoeffs::Vector{Any}, lhsvars::Vector{Any}, rhs::Float64, bufferVal::Nothing, bufferVar::Nothing, sign::Float64, coef::Float64, level::Int64)
@ Alpine ~/.julia/dev/Alpine/src/nlexpr.jl:356
[3] traverse_expr_linear_to_affine(expr::Expr, lhscoeffs::Vector{Any}, lhsvars::Vector{Any}, rhs::Float64, bufferVal::Nothing, bufferVar::Nothing, sign::Float64, coef::Float64, level::Int64)
@ Alpine ~/.julia/dev/Alpine/src/nlexpr.jl:374
[4] traverse_expr_linear_to_affine
@ ~/.julia/dev/Alpine/src/nlexpr.jl:332 [inlined]
[5] expr_linear_to_affine(expr::Expr)
@ Alpine ~/.julia/dev/Alpine/src/nlexpr.jl:299
[6] expr_conversion(m::Alpine.Optimizer)
@ Alpine ~/.julia/dev/Alpine/src/nlexpr.jl:89
[7] process_expr
@ ~/.julia/dev/Alpine/src/nlexpr.jl:10 [inlined]
[8] load!(m::Alpine.Optimizer)
@ Alpine ~/.julia/dev/Alpine/src/main_algorithm.jl:110
[9] optimize!(m::Alpine.Optimizer)
@ Alpine ~/.julia/dev/Alpine/src/main_algorithm.jl:151
[10] optimize!
@ ~/.julia/packages/MathOptInterface/NCblk/src/Bridges/bridge_optimizer.jl:376 [inlined]
[11] optimize!
@ ~/.julia/packages/MathOptInterface/NCblk/src/MathOptInterface.jl:83 [inlined]
[12] optimize!(m::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.Bridges.LazyBridgeOptimizer{Alpine.Optimizer}, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}})
@ MathOptInterface.Utilities ~/.julia/packages/MathOptInterface/NCblk/src/Utilities/cachingoptimizer.jl:316
[13] optimize!(model::Model; ignore_optimize_hook::Bool, _differentiation_backend::MathOptInterface.Nonlinear.SparseReverseMode, kwargs::Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
@ JuMP ~/.julia/packages/JuMP/yYfHy/src/optimizer_interface.jl:480
[14] optimize!(model::Model)
@ JuMP ~/.julia/packages/JuMP/yYfHy/src/optimizer_interface.jl:458
[15] top-level scope
@ REPL[19]:1