Связанная 2-норма в Юлии ЮМП

Используя библиотеку JuMP JuMP, у меня есть матричная переменная A, на которую я хотел бы наложить ограничение 2-нормы (эквивалентно: спектральная / операторная норма). Однако я не знаю, как это сделать. Ниже приведен минимально работающий код того, что я хотел бы написать.

using LinearAlgebra
using JuMP
using MathOptInterface
using MosekTools
using Mosek

model = Model(optimizer_with_attributes(
        Mosek.Optimizer,
        "QUIET" => false,
        "INTPNT_CO_TOL_DFEAS" => 1e-9
    ))

maxnorm = 3.0
# We want opnorm(A) <= maxnorm
@variable(model, A[1:4, 1:5])
# @SDconstraint(model, A' * A <= maxnorm^2) # Mathematically valid, but not accepted!

# Make dummy variable and constraint to satisfy
@variable(model, x)
@constraint(model, x >= 10)

@objective(model, Min, x)

optimize!(model)

Очень сложный способ сделать это - через

@constraint(model, [maxnorm; vec(A)] in SecondOrderCone())

поскольку это ограничивает норму Фробениуса, но это не является предпочтительным. Я был бы очень признателен за любую информацию о том, как это можно сделать.


person Anton Xue    schedule 13.11.2020    source источник
comment
Поскольку Convex.jl выполняет эти преобразования автоматически, я обычно просто проверяю его исходный код, чтобы узнать, как это делается: github.com/jump-dev/Convex.jl/blob/   -  person Eric    schedule 14.11.2020
comment
Спасибо, попробую!   -  person Anton Xue    schedule 15.11.2020


Ответы (1)


MathOptInterface имеет конус спектральной нормы:

https://jump.dev/MathOptInterface.jl/v0.9/apireference/#MathOptInterface.NormSpectralCone

@constraint(model, [maxnorm; vec(A)] in MOI.NormSpectralCone(4, 5))
person Oscar Dowson    schedule 15.11.2020