# Defining an if condition in a constraint

**URL:** https://discourse.julialang.org/t/defining-an-if-condition-in-a-constraint/76228
**Category:** Optimization (Mathematical)
**Tags:** question, package, jump, optimization
**Created:** [February 11, 2022, 9:58am UTC](https://discourse.julialang.org/t/defining-an-if-condition-in-a-constraint/76228 "2022-02-11T09:58:39Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![Sahar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sahar/32/31475_2.png) [@Sahar](https://discourse.julialang.org/u/Sahar)
#### Post date: [February 11, 2022, 9:58am UTC](https://discourse.julialang.org/t/defining-an-if-condition-in-a-constraint/76228/1 "2022-02-11T09:58:39Z")

</div>

Hello everyone!  
I want to define an if condition in a constraint. I will have different constraints if the variable is positive or negative (Pb \>0.0 or Pb \<0.0), and you can see this part of the code;

```julia
for i in 1:5, t in 1:24
	if Pb[i,t] <= Zeromat
    	@constraint(m, e[i,t] - e[i,t.-1] + 0.85 *Pb[i,t.-1] == 0.0);
	else
		@constraint(m, e[i,t] - e[i,t.-1] - 1.11 *Pb[i,t.-1] == 0.0);
	end
	end
end

```

but I am facing this error

```julia
MethodError: no method matching isless(::VariableRef, ::Matrix{Float64})

```

SideNote1: Zeromat is an array of zeros [5,24]. I also tried it with simple zero (0.0 ) but then I will face the following error,

```julia
Cannot evaluate `<=` between a variable and a number.

```

SideNote2: I am using Gurobi.jl.

I really appreciate any help. Thanks in advance for your support!

---

<div class="post-metadata">

### Author: ![jacobusmmsmit](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jacobusmmsmit/32/217669_2.png) [@jacobusmmsmit](https://discourse.julialang.org/u/jacobusmmsmit)
#### Post date: [February 11, 2022, 11:03am UTC](https://discourse.julialang.org/t/defining-an-if-condition-in-a-constraint/76228/2 "2022-02-11T11:03:44Z")

</div>

I’m not an experienced JuMP user, but I think you are looking for `@NLconstraint`.

Here is an example:

> [@Conditional constraint if else in JuMP](https://discourse.julialang.org/t/conditional-constraint-if-else-in-jump/6795/12):
>
> This is not a constraint. Do you mean @NLconstraint(model, eq[i in I; x0[i] \>= 0], 2y[i]^3 - 1 == x0[i]) which is equivalent to for i in I if x0[i] \>= 0 @NLconstraint(model, 2y[i]^3 - 1 == x0[i]) end end

---

<div class="post-metadata">

### Author: ![Sahar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sahar/32/31475_2.png) [@Sahar](https://discourse.julialang.org/u/Sahar)
#### Post date: [February 11, 2022, 11:40am UTC](https://discourse.julialang.org/t/defining-an-if-condition-in-a-constraint/76228/3 "2022-02-11T11:40:56Z")

</div>

Thank you, I tried to change the constraint into a non linear one, but I am still facing the same error ☹

---

<div class="post-metadata">

### Author: ![lawless-m](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lawless-m/32/30869_2.png) [@lawless-m](https://discourse.julialang.org/u/lawless-m)
#### Post date: [February 11, 2022, 11:52am UTC](https://discourse.julialang.org/t/defining-an-if-condition-in-a-constraint/76228/4 "2022-02-11T11:52:49Z")

</div>

I have no idea if this will work but it puts everything inside the macro

```julia
@constraint(m, e[i,t] - e[i,t.-1] + (Pb[i,t] <= Zeromat ? 0.85 : -1.11) * Pb[i,t.-1] == 0.0);

```

---

<div class="post-metadata">

### Author: ![Per](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/per/32/10387_2.png) [@Per](https://discourse.julialang.org/u/Per)
#### Post date: [February 11, 2022, 12:04pm UTC](https://discourse.julialang.org/t/defining-an-if-condition-in-a-constraint/76228/5 "2022-02-11T12:04:11Z")

</div>

You need to set up a binary variable (integer variable constrained by 0 \<= Z[I,t] \<= 1) that takes a different value depending on the sign of Pb[I,t]. (C.f. [Big M method - Wikipedia](https://en.wikipedia.org/wiki/Big_M_method) )

Then you can simply write your constraint as

```julia
e[i,t] - e[i,t.-1] + (0.85 + (-1.11-0.85)*Z[i,t]) * Pb[i,t.-1] == 0.0

```

Edit: I just realised it is a bit trickier still. The product between the binary and the continuous variable needs to be re-written using another artificial variable and a few constraints if you want a mixed-integer linear formulation.

---

<div class="post-metadata">

### Author: ![Henrique\_Becker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/henrique_becker/32/15443_2.png) [@Henrique\_Becker](https://discourse.julialang.org/u/Henrique_Becker)
#### Post date: [February 11, 2022, 1:54pm UTC](https://discourse.julialang.org/t/defining-an-if-condition-in-a-constraint/76228/6 "2022-02-11T13:54:10Z")

</div>

Will not, linear programming does not allow for conditionals inside constraints, unless you use tricks like @Per have shown.

---

<div class="post-metadata">

### Author: ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)
#### Post date: [February 11, 2022, 7:18pm UTC](https://discourse.julialang.org/t/defining-an-if-condition-in-a-constraint/76228/7 "2022-02-11T19:18:33Z")

</div>

Gurobi will automatically handle the bilinear term, so this approach should work fine.

---

<div class="post-metadata">

### Author: ![Sahar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sahar/32/31475_2.png) [@Sahar](https://discourse.julialang.org/u/Sahar)
#### Post date: [February 12, 2022, 2:55pm UTC](https://discourse.julialang.org/t/defining-an-if-condition-in-a-constraint/76228/8 "2022-02-12T14:55:23Z")

</div>

Thanks, it works fine now!
