@NLconstraint and String Name

Can the string be included to represent the constraint name in non-linear constraints using @NLconstraint, akin to @constraint’s base_name functionality?

Unfortunately, no. This is a known limitation.

1 Like

So, it appears that using the base_name keyword or a similar option is not possible, and the set_name function is not a viable solution.

Does this imply that if I need to create a non-linear constraint within the for loop, I am unable to specify distinct names? For example, if I require something like:

model = Model()
@variable(model, x[i=1:5])
for i = 1:3
    @NLconstraint(model, con[i], x[i]^3 <= 1)
end

I understand that the solution could be as follows:

model = Model()
@variable(model, x[i=1:5])
@NLconstraint(model, con[i = 1:3], x[i]^3 <= 1)

However, I require the ability to invoke the @NLconstraint statement within the for loop, as demonstrated in the initial example.

So, it appears that using the base_name keyword or a similar option is not possible, and the set_name function is not a viable solution.

Correct. Nonlinear constraints are not like normal @constraints. They do not have names.

It’s always worth remembering that you can add anonymous constraints, and that you can create your own data structures to store a constraint:

Option 1

model = Model()
@variable(model, x[i=1:5])
for i = 1:3
    @NLconstraint(model, x[i]^3 <= 1)
end

Option 2

model = Model()
@variable(model, x[i=1:5])
con = Any[]
for i = 1:3
    c = @NLconstraint(model, x[i]^3 <= 1)
    push!(con, c)
end
con

In actuality, option 2 appears to be a satisfactory solution as I can remove specific constraints, such as:

delete(model, con[2])

Although this solution results in a slightly higher number of allocations, it appears to be acceptable. Thank you, this should be sufficient.

1 Like