DiffOpt.jl
DiffOpt.jl copied to clipboard
No Clear API for `ReverseConstraintFunction` for Conic Constraints
The following errors and it is not clear how to correctly fetch the ReverseConstraintFunction perturbations for conic constraints:
model = JuMP.Model(() -> DiffOpt.diff_optimizer(SCS.Optimizer))
set_silent(model)
x = @variable(model)
y = @variable(model)
t = @variable(model)
ceq = @constraint(model, -1.0t == -1.0)
cnon = @constraint(model, 1.0y >= 1 / √2)
csoc = @constraint(model, [1.0t, 1.0x, 1.0y] in MOI.SecondOrderCone(3))
@objective(model, Min, 1.0x)
optimize!(model)
MOI.set(
model,
DiffOpt.ReverseVariablePrimal(),
y,
1.0
)
DiffOpt.reverse_differentiate!(model)
JuMP.coefficient(MOI.get(model, DiffOpt.ReverseConstraintFunction(), cnon), y)
Errors with:
ERROR: MethodError: no method matching coefficient(::DiffOpt.MatrixVectorAffineFunction{…}, ::MathOptInterface.VariableIndex)
Closest candidates are:
coefficient(::DiffOpt.MatrixScalarQuadraticFunction, ::MathOptInterface.VariableIndex)
@ DiffOpt ~/Workspace/DiffOpt.jl/src/utils.jl:228
coefficient(::DiffOpt.MatrixScalarQuadraticFunction, ::MathOptInterface.VariableIndex, ::MathOptInterface.VariableIndex)
@ DiffOpt ~/Workspace/DiffOpt.jl/src/jump_moi_overloads.jl:198
coefficient(::GenericQuadExpr{C, V}, ::V, ::V) where {C, V}
@ JuMP ~/.julia/packages/JuMP/xlp0s/src/quad_expr.jl:220
...
Stacktrace:
[1] coefficient(func::DiffOpt.IndexMappedFunction{…}, vi::MathOptInterface.VariableIndex)
@ DiffOpt ~/Workspace/DiffOpt.jl/src/jump_moi_overloads.jl:247
[2] coefficient(func::DiffOpt.IndexMappedFunction{DiffOpt.IndexMappedFunction{…}}, vi::MathOptInterface.VariableIndex)
@ DiffOpt ~/Workspace/DiffOpt.jl/src/jump_moi_overloads.jl:247
[3] coefficient(func::DiffOpt.MOItoJuMP{DiffOpt.IndexMappedFunction{DiffOpt.IndexMappedFunction{…}}}, var_ref::VariableRef)
@ DiffOpt ~/Workspace/DiffOpt.jl/src/jump_moi_overloads.jl:297
[4] top-level scope
@blegat did you think about it at some point?
I just tested it on master and I don't get any error, I get -0.7071019991587887. @andrewrosemberg can you confirm that this is fixed ?
I get
DiffOpt.MOItoJuMP{DiffOpt.IndexMappedFunction{DiffOpt.IndexMappedFunction{DiffOpt.VectorScalarAffineFunction{Float64, Vector{Float64}}}}}
so no DiffOpt.MatrixVectorAffineFunction.
Changing the last line:
JuMP.coefficient(MOI.get(model, DiffOpt.ReverseConstraintFunction(), csoc), y)
leads to the same error:
ERROR: MethodError: no method matching coefficient(::DiffOpt.MatrixVectorAffineFunction{…}, ::MathOptInterface.VariableIndex)
Closest candidates are:
coefficient(::DiffOpt.IndexMappedFunction, ::MathOptInterface.VariableIndex)
@ DiffOpt ~/.julia/dev/DiffOpt/src/jump_moi_overloads.jl:246
coefficient(::DiffOpt.IndexMappedFunction, ::MathOptInterface.VariableIndex, ::MathOptInterface.VariableIndex)
@ DiffOpt ~/.julia/dev/DiffOpt/src/jump_moi_overloads.jl:258
coefficient(::GenericQuadExpr{C, V}, ::V, ::V) where {C, V}
@ JuMP ~/.julia/packages/JuMP/CU7H5/src/quad_expr.jl:220
...
Stacktrace:
[1] coefficient(func::DiffOpt.IndexMappedFunction{…}, vi::MathOptInterface.VariableIndex)
@ DiffOpt ~/.julia/dev/DiffOpt/src/jump_moi_overloads.jl:247
[2] coefficient(func::DiffOpt.IndexMappedFunction{DiffOpt.IndexMappedFunction{…}}, vi::MathOptInterface.VariableIndex)
@ DiffOpt ~/.julia/dev/DiffOpt/src/jump_moi_overloads.jl:247
[3] coefficient(func::DiffOpt.MOItoJuMP{DiffOpt.IndexMappedFunction{DiffOpt.IndexMappedFunction{…}}}, var_ref::VariableRef)
@ DiffOpt ~/.julia/dev/DiffOpt/src/jump_moi_overloads.jl:297
[4] top-level scope
@ REPL[87]:1
Some type information was truncated. Use `show(err)` to see complete types.