Skip to content

The dual of VectorNonlinearOracle #2887

@odow

Description

@odow

See https://discourse.julialang.org/t/lagrange-multipliers-of-a-vectornonlinearoracle-after-solve/134236

julia> using JuMP, Ipopt

julia> set = MOI.VectorNonlinearOracle(;
           dimension = 2,
           l = [-Inf],
           u = [1.0],
           eval_f = (ret, x) -> (ret[1] = x[1]^2 + x[2]^2),
           jacobian_structure = [(1, 1), (1, 2)],
           eval_jacobian = (ret, x) -> ret .= 2.0 .* x,
           hessian_lagrangian_structure = [(1, 1), (2, 2)],
           eval_hessian_lagrangian = (ret, x, u) -> ret .= 2.0 .* u[1],
       )
VectorNonlinearOracle{Float64}(;
    dimension = 2,
    l = [-Inf],
    u = [1.0],
    ...,
)

julia> model = Model(Ipopt.Optimizer)
A JuMP Model
├ solver: Ipopt
├ objective_sense: FEASIBILITY_SENSE
├ num_variables: 0
├ num_constraints: 0
└ Names registered in the model: none

julia> set_silent(model)

julia> @variable(model, x[1:2])
2-element Vector{VariableRef}:
 x[1]
 x[2]

julia> @objective(model, Max, sum(x))
x[1] + x[2]

julia> @constraint(model, c, x in set)
c : [x[1], x[2]]  VectorNonlinearOracle{Float64}(;
    dimension = 2,
    l = [-Inf],
    u = [1.0],
    ...,
)

julia> optimize!(model)

julia> value(x)
2-element Vector{Float64}:
 0.7071067834685273
 0.7071067834685273

julia> dual(c)
2-element Vector{Float64}:
 -0.9999999999982961
 -0.9999999999982961

What should dual(c) here be?

I based it on:

julia> using JuMP, Ipopt

julia> model = Model(Ipopt.Optimizer)
A JuMP Model
├ solver: Ipopt
├ objective_sense: FEASIBILITY_SENSE
├ num_variables: 0
├ num_constraints: 0
└ Names registered in the model: none

julia> set_silent(model)

julia> @variable(model, x[1:2])
2-element Vector{VariableRef}:
 x[1]
 x[2]

julia> @objective(model, Max, sum(x))
x[1] + x[2]

julia> @constraint(model, c, sum(x.^2) <= 1)
c : x[1+ x[2 1

julia> optimize!(model)

julia> value(x)
2-element Vector{Float64}:
 0.7071067834685273
 0.7071067834685273

julia> dual(c)
-0.7071067789033629

julia> dual(c)' * (2 * value(x))
2-element Vector{Float64}:
 -0.9999999999982961
 -0.9999999999982961

but the user doesn't have an easy way to access the multipliers on the individual rows.

cc @Robbybp

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions