From dc629ce5c20ad902cb8c2135663a58800487554c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Fri, 10 Oct 2025 15:58:18 +0200 Subject: [PATCH] Implement ForwardConstraintDual for Conic --- src/ConicProgram/ConicProgram.jl | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/ConicProgram/ConicProgram.jl b/src/ConicProgram/ConicProgram.jl index abf21231..6fa2f60d 100644 --- a/src/ConicProgram/ConicProgram.jl +++ b/src/ConicProgram/ConicProgram.jl @@ -408,9 +408,23 @@ function MOI.get( i = vi.value du = model.forw_grad_cache.du dw = model.forw_grad_cache.dw + # From https://arxiv.org/pdf/1904.09043, we have + # dx = du - (dw)x + # we just need to flip the sign due to different conventions. return -(du[i] - model.x[i] * dw[]) end +function MOI.get( + model::Model, + ::DiffOpt.ForwardConstraintDual, + ci::MOI.ConstraintIndex{MOI.VectorAffineFunction{Float64},S}, +) where {S} + i = MOI.Utilities.rows(model.model.constraints, ci) # vector + # From https://arxiv.org/pdf/1904.09043, we have + # dy = DΠ(v)dv - (dw)y + return DΠ(v) * dv - dw[] * model.y[i] +end + function DiffOpt._get_db( model::Model, ci::MOI.ConstraintIndex{F,S},