Code Monkey home page Code Monkey logo

snopt7.jl's Introduction

SNOPT7.jl

Julia interface for SNOPT7

Still needs work, but currently works with:

  • Julia 1.4.2

  • JuMP 0.21.2

  • MathOptInterface 0.9.14

  • SNOPT 7.7 (including trial libraries)

There are two examples, one using JuMP/MOI and the other using the "SNOPT"-like interface.

If you're using the trial libraries, set DL_LOAD_PATH (macOS) or LD_LIBRARY_PATH (linux) to the location of the libraries.

snopt7.jl's People

Contributors

eric-heiden avatar gnowzil avatar realziangliu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

snopt7.jl's Issues

Support JuMP.@constraint

First of all, thank you for making SNOPT available in Julia!

I was able to run the JuMP example in example/hs72.jl. However, I am not able to run an equivalent formulation in which the last constraint is encoded via JuMP.@constraint rather than JuMP.@NLconstraint:

import JuMP
import SNOPT7


m = JuMP.Model(JuMP.optimizer_with_attributes(
        SNOPT7.Optimizer,
        "print_level" => 0,
        "system_information" => "yes",
))

JuMP.@variable(m, 1 <= x[i = 1:4] <= 5)
JuMP.@NLobjective(m, Min, x[1] * x[4] * (x[1] + x[2] + x[3]) + x[3])
JuMP.@NLconstraint(m, x[1] * x[2] * x[3] * x[4] >= 25)
JuMP.@constraint(m, sum(el -> el^2, x) == 40)

JuMP.optimize!(m)

println(JuMP.value.(x))

objval = JuMP.objective_value(m)
println("Final objective: $objval")

println(JuMP.termination_status(m))

I am getting the following error message (truncated)

ERROR: LoadError: `MOI.ScalarQuadraticFunction{Float64}`-in-`MOI.EqualTo{Float64}` constraints are not supported and cannot be bridged into supported constrained variables and constraints. See details below:
 [1] constrained variables in `MOI.RotatedSecondOrderCone` are not supported because:
   Cannot use `MOIB.Variable.RSOCtoSOCBridge{Float64}` because:
   [2] constrained variables in `MOI.SecondOrderCone` are not supported
   Cannot use `MOIB.Variable.RSOCtoPSDBridge{Float64}` because:
   [5] constrained variables in `MOI.PositiveSemidefiniteConeTriangle` are not supported
   Cannot add free variables and then constrain them because:
   (9) `MOI.VectorOfVariables`-in-`MOI.RotatedSecondOrderCone` constraints are not supported
 [2] constrained variables in `MOI.SecondOrderCone` are not supported because:
   Cannot use `MOIB.Variable.SOCtoRSOCBridge{Float64}` because:
   [1] constrained variables in `MOI.RotatedSecondOrderCone` are not supported
   Cannot add free variables and then constrain them because:
   (11) `MOI.VectorOfVariables`-in-`MOI.SecondOrderCone` constraints are not supported
 [5] constrained variables in `MOI.PositiveSemidefiniteConeTriangle` are not supported because no added bridge supports bridging it.
   Cannot add free variables and then constrain them because:
   (18) `MOI.VectorOfVariables`-in-`MOI.PositiveSemidefiniteConeTriangle` constraints are not supported
 (1) `MOI.ScalarQuadraticFunction{Float64}`-in-`MOI.EqualTo{Float64}` constraints are not supported because:
   Cannot use `MOIB.Constraint.VectorizeBridge{Float64,MOI.VectorQuadraticFunction{Float64},MOI.Zeros,MOI.ScalarQuadraticFunction{Float64}}` because:
   (2) `MOI.VectorQuadraticFunction{Float64}`-in-`MOI.Zeros` constraints are not supported
   Cannot use `MOIB.Constraint.SplitIntervalBridge{Float64,MOI.ScalarQuadraticFunction{Float64},MOI.EqualTo{Float64},MOI.GreaterThan{Float64},MOI.LessThan{Float64}}` because:
[...]

Tl;DR
Is it not possible to use any JuMP.@contraint calls with SNOPT7.jl; i.e. do I have to convert all of them to JuMP.@NLconstraint? If so, are there any plans to support JuMP.@constraint in the future?

Support JuMP.@objective

This is somewhat related to #4. I'm just creating a separate issue to make tracking a bit easier.

Currently, the use of JuMP.@objective does not seem to be supported. For example, the code

import JuMP
import SNOPT7

m = JuMP.Model(JuMP.optimizer_with_attributes(
    SNOPT7.Optimizer,
    "print_level" => 0,
    "system_information" => "yes",
))

JuMP.@variable(m, x[1:10])
JuMP.@objective(m, Min, x'*x)
JuMP.optimize!(m)

println(JuMP.value.(x))
println(JuMP.termination_status(m))

throws the following error

┌ Error: VariablePrimal not available.
└ @ SNOPT7 ~/.julia/packages/SNOPT7/tZVgh/src/MOIWrapper.jl:420
ERROR: LoadError: type Nothing has no field x
Stacktrace:
 [1] getproperty(::Nothing, ::Symbol) at ./Base.jl:33
 [2] get(::SNOPT7.Optimizer, ::MathOptInterface.VariablePrimal, ::MathOptInterface.VariableIndex) at /home/lassepe/.julia/packages/SNOPT7/tZVgh/src/MOIWrapper.jl:422
 [3] get(::MathOptInterface.Utilities.CachingOptimizer{SNOPT7.Optimizer,MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}, ::MathOptInterface.VariablePrimal, ::MathOptInterface.VariableIndex) at /home/lassepe/.julia/packages/MathOptInterface/ZJFKw/src/Utilities/cachingoptimizer.jl:605
 [4] get(::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{SNOPT7.Optimizer,MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, ::MathOptInterface.VariablePrimal, ::MathOptInterface.VariableIndex) at /home/lassepe/.julia/packages/MathOptInterface/ZJFKw/src/Bridges/bridge_optimizer.jl:808
 [5] get(::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.AbstractOptimizer,MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}, ::MathOptInterface.VariablePrimal, ::MathOptInterface.VariableIndex) at /home/lassepe/.julia/packages/MathOptInterface/ZJFKw/src/Utilities/cachingoptimizer.jl:605
 [6] _moi_get_result(::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.AbstractOptimizer,MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}, ::MathOptInterface.VariablePrimal, ::Vararg{Any,N} where N) at /home/lassepe/.julia/packages/JuMP/y5vgk/src/JuMP.jl:946
 [7] get(::JuMP.Model, ::MathOptInterface.VariablePrimal, ::JuMP.VariableRef) at /home/lassepe/.julia/packages/JuMP/y5vgk/src/JuMP.jl:976
 [8] value(::JuMP.VariableRef; result::Int64) at /home/lassepe/.julia/packages/JuMP/y5vgk/src/variables.jl:766
 [9] value at /home/lassepe/.julia/packages/JuMP/y5vgk/src/variables.jl:766 [inlined]
 [10] _broadcast_getindex_evalf at ./broadcast.jl:648 [inlined]
 [11] _broadcast_getindex at ./broadcast.jl:621 [inlined]
 [12] getindex at ./broadcast.jl:575 [inlined]
 [13] macro expansion at ./broadcast.jl:932 [inlined]
 [14] macro expansion at ./simdloop.jl:77 [inlined]
 [15] copyto! at ./broadcast.jl:931 [inlined]
 [16] copyto! at ./broadcast.jl:886 [inlined]
 [17] copy at ./broadcast.jl:862 [inlined]
 [18] materialize(::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Nothing,typeof(JuMP.value),Tuple{Array{JuMP.VariableRef,1}}}) at ./broadcast.jl:837
 [19] top-level scope at /home/lassepe/worktree/research/20_inverse_games/SNOPT7Lib.jl/example.jl:15
 [20] include(::String) at ./client.jl:457
 [21] top-level scope at REPL[2]:1
in expression starting at /home/lassepe/worktree/research/20_inverse_games/SNOPT7Lib.jl/example.jl:15

Julia SegFault when JuMP optimize is called.

Hi I'm trying to call the SNOPT trial libraries and I've run into an issue where the julia process SegFaults after showing the SNOPT header. To test this, I'm calling the hs71.jl example file. Any leads for what could be wrong? Here's the stack trace for the SegFault:

julia> JuMP.optimize!(m)

 ==============================
 S N O P T  7.7.4    (May 2020)
 ==============================

signal (11): Segmentation fault
in expression starting at REPL[8]:1
s3opt_ at /usr/local/lib/libsnopt7.so (unknown line)
snset_ at /usr/local/lib/libsnopt7.so (unknown line)
setOption! at /home/ankitb/.julia/dev/SNOPT7/src/SNOPT7.jl:251
optimize! at /home/ankitb/.julia/dev/SNOPT7/src/MOIWrapper.jl:312
optimize! at /home/ankitb/.julia/packages/MathOptInterface/bygN7/src/Utilities/cachingoptimizer.jl:189
optimize! at /home/ankitb/.julia/packages/MathOptInterface/bygN7/src/Bridges/bridge_optimizer.jl:239
optimize! at /home/ankitb/.julia/packages/MathOptInterface/bygN7/src/Utilities/cachingoptimizer.jl:189
#optimize!#95 at /home/ankitb/.julia/packages/JuMP/YXK4e/src/optimizer_interface.jl:131
optimize! at /home/ankitb/.julia/packages/JuMP/YXK4e/src/optimizer_interface.jl:107 [inlined]
optimize! at /home/ankitb/.julia/packages/JuMP/YXK4e/src/optimizer_interface.jl:107
unknown function (ip: 0x7fe51a34575b)
unknown function (ip: 0x7fe51a345389)
unknown function (ip: 0x7fe51a3458f0)
unknown function (ip: 0x7fe51a3469c8)
unknown function (ip: 0x7fe51a347616)
unknown function (ip: 0x7fe51a35fe08)
unknown function (ip: 0x7fe51a3603c8)
jl_toplevel_eval_in at /usr/bin/../lib/x86_64-linux-gnu/libjulia.so.1 (unknown line)
eval at ./boot.jl:331
eval_user_input at /build/julia-98cBbp/julia-1.4.1+dfsg/usr/share/julia/stdlib/v1.4/REPL/src/REPL.jl:86
macro expansion at /build/julia-98cBbp/julia-1.4.1+dfsg/usr/share/julia/stdlib/v1.4/REPL/src/REPL.jl:118 [inlined]
#26 at ./task.jl:358
unknown function (ip: 0x7fe51a34acbb)
unknown function (ip: (nil))
Allocations: 87693300 (Pool: 87679021; Big: 14279); GC: 83
[1]    50174 segmentation fault (core dumped)  julia

Can't Find gfortran library

Hello,

I am attempting to run SNOPT using the trial libraries. However, when calling SNOPT, the following error occurs.

LoadError: could not load library "/Users/lab_home/Documents/SNOPT/libsnopt7"
dlopen(/Users/lab_home/Documents/SNOPT/libsnopt7.dylib, 1): Library not loaded: /opt/local/lib/libgcc/libgfortran.5.dylib
Referenced from: /Users/lab_home/Documents/SNOPT/libsnopt7.dylib
Reason: image not found

It appears the snopt trial library is looking for the gfortran library in the wrong place? The /opt/local... directory doesn't actually exist on my Mac.

I appreciate any feedback you can give.

`Invalid_Problem_Definition` error for unconstrained optimization problems specified via JuMP.jl

I am seeing a LoadError: Unrecognized SNOPT7 status Invalid_Problem_Definition if I don't have at least one JuMP.@NLconstraint:

import JuMP
import SNOPT7

m = JuMP.Model(JuMP.optimizer_with_attributes(
    SNOPT7.Optimizer,
    "print_level" => 0,
    "system_information" => "yes",
))

x = JuMP.@variable(m, [1:2])
JuMP.@NLobjective(m, Min, sum((x[i] - 1)^2 for i in eachindex(x)))
# JuMP.@NLconstraint(m, x[1] == x[2]) # If this constraint is added no error is thrown.
JuMP.optimize!(m)

println(JuMP.value.(x))
println(JuMP.termination_status(m))

Here is the full output:

 XXX  Argument out of range:  m      =      0

 XXX  Argument out of range:  neJ    =      0

 XXX  Invalid locA(1), locA(n+1) =       1********

 SNOPTB EXIT  90 -- input arguments out of range
 SNOPTB INFO  91 -- invalid input argument
ERROR: LoadError: Unrecognized SNOPT7 status Invalid_Problem_Definition
Stacktrace:
 [1] error(::String) at ./error.jl:33
 [2] get(::SNOPT7.Optimizer, ::MathOptInterface.TerminationStatus) at /home/lassepe/.julia/packages/SNOPT7/tZVgh/src/MOIWrapper.jl:367
 [3] get(::MathOptInterface.Utilities.CachingOptimizer{SNOPT7.Optimizer,MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}, ::MathOptInterface.TerminationStatus) at /home/lassepe/.julia/packages/MathOptInterface/ZJFKw/src/Utilities/cachingoptimizer.jl:590
 [4] get(::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{SNOPT7.Optimizer,MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, ::MathOptInterface.TerminationStatus) at /home/lassepe/.julia/packages/MathOptInterface/ZJFKw/src/Bridges/bridge_optimizer.jl:615
 [5] get(::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.AbstractOptimizer,MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}, ::MathOptInterface.TerminationStatus) at /home/lassepe/.julia/packages/MathOptInterface/ZJFKw/src/Utilities/cachingoptimizer.jl:590
 [6] _moi_get_result(::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.AbstractOptimizer,MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}, ::MathOptInterface.VariablePrimal, ::Vararg{Any,N} where N) at /home/lassepe/.julia/packages/JuMP/y5vgk/src/JuMP.jl:943
 [7] get(::JuMP.Model, ::MathOptInterface.VariablePrimal, ::JuMP.VariableRef) at /home/lassepe/.julia/packages/JuMP/y5vgk/src/JuMP.jl:976
 [8] value(::JuMP.VariableRef; result::Int64) at /home/lassepe/.julia/packages/JuMP/y5vgk/src/variables.jl:766
 [9] value at /home/lassepe/.julia/packages/JuMP/y5vgk/src/variables.jl:766 [inlined]
 [10] _broadcast_getindex_evalf at ./broadcast.jl:648 [inlined]
 [11] _broadcast_getindex at ./broadcast.jl:621 [inlined]
 [12] getindex at ./broadcast.jl:575 [inlined]
 [13] macro expansion at ./broadcast.jl:932 [inlined]
 [14] macro expansion at ./simdloop.jl:77 [inlined]
 [15] copyto! at ./broadcast.jl:931 [inlined]
 [16] copyto! at ./broadcast.jl:886 [inlined]
 [17] copy at ./broadcast.jl:862 [inlined]
 [18] materialize(::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Nothing,typeof(JuMP.value),Tuple{Array{JuMP.VariableRef,1}}}) at ./broadcast.jl:837
 [19] top-level scope at /home/lassepe/worktree/research/20_inverse_games/SNOPT7Lib.jl/example.jl:16
 [20] include(::String) at ./client.jl:457
 [21] top-level scope at REPL[1]:1
in expression starting at /home/lassepe/worktree/research/20_inverse_games/SNOPT7Lib.jl/example.jl:16

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.