DiffOpt.jl icon indicating copy to clipboard operation
DiffOpt.jl copied to clipboard

No Clear API for `ReverseConstraintFunction` for Conic Constraints

Open andrewrosemberg opened this issue 10 months ago • 3 comments

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

andrewrosemberg avatar Mar 22 '25 02:03 andrewrosemberg

@blegat did you think about it at some point?

joaquimg avatar Mar 24 '25 18:03 joaquimg

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.

blegat avatar Apr 22 '25 10:04 blegat

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.

joaquimg avatar May 20 '25 02:05 joaquimg