# Dual: "getdual()" is not working for Conic/Quadratic constraints

**URL:** <https://discourse.julialang.org/t/dual-getdual-is-not-working-for-conic-quadratic-constraints/11884>\
**Category:** Optimization (Mathematical)\
**Tags:** question\
**Created:** [June 22, 2018, 4:20pm UTC](https://discourse.julialang.org/t/dual-getdual-is-not-working-for-conic-quadratic-constraints/11884 "2018-06-22T16:20:59Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![SingingKim](https://avatars.discourse-cdn.com/v4/letter/s/5fc32e/32.png) [@SingingKim](https://discourse.julialang.org/u/SingingKim)\
**Post date:** [June 22, 2018, 4:21pm UTC](https://discourse.julialang.org/t/dual-getdual-is-not-working-for-conic-quadratic-constraints/11884/1 "2018-06-22T16:21:00Z")

</div>

How can I get dual values for Conic/Quadratic constraints?  
getdual() function works fine for LPs, however it doesn’t work for QP or SOCP.  
Below is a sample code.

```julia
using JuMP, Gurobi
m = Model(solver=GurobiSolver())
@variable(m, x[1:3] >=0)
@constraint(m, constraint1, x[1]^2 + x[2]^2 <= 10)
@constraint(m, constraint2, x[2] == 1)
@constraint(m, constraint3, x[1]-x[2]==0)
@constraint(m, constraint4, x[1]-x[3] <= -1 )
@objective(m, Min, x[1]+x[2]+x[3])
status = solve(m)
getdual(constraint1)
getdual(constraint2)
getdual(constraint3)
getdual(constraint4)

```

 ![image](https://global.discourse-cdn.com/julialang/original/3X/0/0/00d242f2b7d2c49699cb52f7114b97a9027aa4e6.png)

---

<div class="post-metadata">

**Author:** ![blegat](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/blegat/32/217090_2.png) [@blegat](https://discourse.julialang.org/u/blegat)\
**Post date:** [June 22, 2018, 6:08pm UTC](https://discourse.julialang.org/t/dual-getdual-is-not-working-for-conic-quadratic-constraints/11884/2 "2018-06-22T18:08:37Z")

</div>

Replace `@constraint(m, constraint1, x[1]^2 + x[2]^2 <= 10)` by `@constraint(m, constraint1, norm(x[1:2]) <= √10)`

---

<div class="post-metadata">

**Author:** ![miles.lubin](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/miles.lubin/32/279_2.png) [@miles.lubin](https://discourse.julialang.org/u/miles.lubin)\
**Post date:** [June 22, 2018, 7:33pm UTC](https://discourse.julialang.org/t/dual-getdual-is-not-working-for-conic-quadratic-constraints/11884/3 "2018-06-22T19:33:42Z")

</div>

For conic constraints: Solvers like Gurobi and CPLEX don’t return duals for SOCPs, at least not in a way that we have hooked up through the interface. I would recommend using ECOS or Mosek instead if you care about duals on SOCPs.

For quadratic constraints: I think JuMP 0.18 just doesn’t have this hooked up. The usual workaround would be to call, e.g., Ipopt and formulate the quadratic constraints with `@NLconstraint` instead of `@constraint`.

---

<div class="post-metadata">

**Author:** ![SingingKim](https://avatars.discourse-cdn.com/v4/letter/s/5fc32e/32.png) [@SingingKim](https://discourse.julialang.org/u/SingingKim)\
**Post date:** [June 26, 2018, 4:20pm UTC](https://discourse.julialang.org/t/dual-getdual-is-not-working-for-conic-quadratic-constraints/11884/4 "2018-06-26T16:20:58Z")

</div>

Thanks for the suggestion!  
It does return dual variable values with nonlinear solvers after replacing the constraint using norm.  
But I don’t know why. Could you explain the difference between three expressions?

```julia
@constraint(m, constraint1, norm(x[1:2]) <= sqrt(10))

```

```julia
@constraint(m, constraint1, x[1]^2 + x[2]^2 <= 10)

```

```julia
@NLconstraint(m, constraint1, sqrt(x[1]^2 + x[2]^2) <= sqrt(10))

```

---

<div class="post-metadata">

**Author:** ![SingingKim](https://avatars.discourse-cdn.com/v4/letter/s/5fc32e/32.png) [@SingingKim](https://discourse.julialang.org/u/SingingKim)\
**Post date:** [June 26, 2018, 4:37pm UTC](https://discourse.julialang.org/t/dual-getdual-is-not-working-for-conic-quadratic-constraints/11884/5 "2018-06-26T16:37:19Z")

</div>

Miles,  
Thank you for the information. It helped a lot!  
I was able to obtain dual variable values with nonlinear solvers.

---

<div class="post-metadata">

**Author:** ![blegat](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/blegat/32/217090_2.png) [@blegat](https://discourse.julialang.org/u/blegat)\
**Post date:** [June 27, 2018, 7:12am UTC](https://discourse.julialang.org/t/dual-getdual-is-not-working-for-conic-quadratic-constraints/11884/6 "2018-06-27T07:12:38Z")

</div>

With the `norm` syntax, it is treated as a conic constraint with the second order cone and with the quadratic function is it treated as a LessThan expression with a quadratic function.  
Duals are supporting for conic constraints but not for constraints with quadratic functions

---

<div class="post-metadata">

**Author:** ![SingingKim](https://avatars.discourse-cdn.com/v4/letter/s/5fc32e/32.png) [@SingingKim](https://discourse.julialang.org/u/SingingKim)\
**Post date:** [June 30, 2018, 7:06pm UTC](https://discourse.julialang.org/t/dual-getdual-is-not-working-for-conic-quadratic-constraints/11884/7 "2018-06-30T19:06:00Z")

</div>

Thank you for the kind response!
