Conditional NLconstraint, Couenne

Hi all,

I am trying to solve a MINLP problem with Couenne. I have difficulty implementing an NLconstraint of this form: if x[i,j] == 0, y[i,j] == 0 else y[i,j] = 1/x[i,j], I have checked the Syntax notes and I still cannot get it right. If I try to use isapprox(x[i,j], 0, atol=1e-8), I get an error:
LoadError: MethodError: no method matching isapprox(::VariableRef, ::Int64; atol=1.0e-8)

here is a simplified version of my code excluding many other parts that makes it a MINLP problem:

using JuMP
using AmplNLWriter

m = Model(with_optimizer(AmplNLWriter.Optimizer, "path to couenne.exe"))

    D_st = [0, 0.03, 0.06, 0.2, 0.3, 0.5]
    Q = [0.02; 0.05; 0.07]
    NP = size(Q,1)
    ND = size(D_st,1)
    min_velocity = 0.6
    max_velocity = 2

    @variable(m, D[1:NP, 1:NP] >= 0)
    @variable(m, D_idx[1:NP, 1:NP, 1:ND] >= 0, Bin)
    @variable(m, x[1:NP, 1:NP] >= 0)

    @constraint(m, 1 .>= sum(x, dims=2))

    @constraint(m, [i = 1:NP, j = 1:NP], D[i,j] == sum(D_st[n]*D_idx[i,j,n] for n = 1:ND))

    @NLexpression(m, v_aux[i = 1:NP, j = 1:NP], 4*x[i,j]*Q[i]/(pi*D[i,j]^2))
    @NLexpression(m, QF[i = 1:NP], Q[i] - sum(x[j,i]*Q[j] for j = 1:NP))

    @expression(m, v[i = 1:NP, j = 1:NP], ifelse(isapprox(D[i,j],0, atol=1e-8),0,1)*v_aux[i,j])

    @NLconstraint(m, [i = 1:NP, j = 1:NP], min_velocity <= v[i,j])
    @NLconstraint(m, [i = 1:NP, j = 1:NP], max_velocity >= v[i,j])

    @NLconstraint(m, sum(QF[i] for i =1:NP)/sum(Q[i] for  i = 1:NP) == 0.8)


    x = JuMP.value.(x);
    D = JuMP.value.(D)
    v = JuMP.value.(v)

    println("x = ", x)
    println("D = ", D)
    println("v = ", v)

A standard way to implement this kind of constraint is using a big-M formulation. Are you familiar with that?

No I am not, but I can look it up. Thanks for the tip!

@tkoolen sorry, i’m not familiar with that. Could you help me understand (or recommend a source) how the big m formulation could be applied in this case? another question: is this a requirement of the input format of the couenne optimization problem?