# Defining variable model as x != 0 in JuMP

**URL:** <https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162>\
**Category:** Optimization (Mathematical)\
**Created:** [November 8, 2021, 5:17pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162 "2021-11-08T17:17:21Z")\
**Posts on this page:** 17\
**Page:** 1

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [November 8, 2021, 5:17pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/1 "2021-11-08T17:17:21Z")

</div>

I am trying to run my first example of optimization using `JuMP`.

I have a problem with the definition of the values of `x`. I want to do `x != 0` but it gives me an error. It only works for `x >= 0` or `x <= 0`.

> using JuMP  
> import Ipopt  
> model = Model(Ipopt.Optimizer)  
> @variable(model, y \>= 0)  
> @variable(model, x != 0) # x \>= 0 works  
> @NLobjective(model, Max, (x^2)\*y)  
> @NLconstraint(model, x^2 + y^2 == 1)  
> print(model)  
> optimize!(model)  
> @show value(x) # sqrt(2/3)  
> @show value(y) # sqrt(1/3)

---

<div class="post-metadata">

**Author:** ![cvanaret](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cvanaret/32/11594_2.png) [@cvanaret](https://discourse.julialang.org/u/cvanaret)\
**Post date:** [November 8, 2021, 5:42pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/2 "2021-11-08T17:42:01Z")

</div>

We may be able to model your problem as a mixed-integer problem. Can you be more specific? Why do you need x \neq 0?

---

<div class="post-metadata">

**Author:** ![HenriDeh](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/henrideh/32/8316_2.png) [@HenriDeh](https://discourse.julialang.org/u/HenriDeh)\
**Post date:** [November 8, 2021, 5:52pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/3 "2021-11-08T17:52:02Z")

</div>

It’s a weird thing to ask for a continuous variable to be not equal to a value. If `x == 0` is optimal and you forbid it with a constraint, then 0.00000000000000001 is probably the next best value.

It is not possible in JuMP just because it’s not a thing one does in continuous optimization.  
You’re not getting `x==0` as a solution anyway.

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [November 8, 2021, 5:58pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/4 "2021-11-08T17:58:08Z")

</div>

Well, i’s possible that I am not thinking right. I know that the results are two points P1(sqrt(2/3); sqrt(1/3)) and P2(-sqrt(2/3); sqrt(1/3)). If I make `x >= 0` I only have as a result P1 and if I do `x <= 0` I have P2. If I don’t give any restriction to `x` I have a wrong result. So I thought That the solution could be `x != 0`.

---

<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:** [November 8, 2021, 6:01pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/5 "2021-11-08T18:01:48Z")

</div>

You don’t have to add a bound constraint. Just leave it as a free variable.

What do you mean by wrong result?

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [November 8, 2021, 6:03pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/6 "2021-11-08T18:03:45Z")

</div>

I tried something like `@variable(model, x)` but the results are wrong: (0;0).

---

<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:** [November 8, 2021, 6:06pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/7 "2021-11-08T18:06:53Z")

</div>

You need to check the problem status  
[Solutions · JuMP](https://jump.dev/JuMP.jl/stable/manual/solutions/#Why-did-the-solver-stop)?

Your problem is nonconvex, so ipopt struggled to solve it.

Provide a different starting point

[https://jump.dev/JuMP.jl/stable/manual/variables/#Start-values](https://jump.dev/JuMP.jl/stable/manual/variables/#Start-values)

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [November 8, 2021, 6:17pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/8 "2021-11-08T18:17:52Z")

</div>

Well, I tried several starting points 0.2, 1, 2, 10 but I don’t get the negative value for `x`. I tried for ex. `@variable(model, x, start = 10)`.

---

<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:** [November 8, 2021, 6:21pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/9 "2021-11-08T18:21:15Z")

</div>

You’ll have to set a negative starting point close to the solution. You’ll also have to provide a starting point for y that makes the solution feasible.

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [November 8, 2021, 6:25pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/10 "2021-11-08T18:25:59Z")

</div>

I tried

> @variable(model, y \>= 0, start = 1)  
> @variable(model, x, start = -1)

But I got only one point:

```julia
julia> @show value(x) # sqrt(2/3)
value(x) = -0.8164965800409512
-0.8164965800409512

julia> @show value(y) # sqrt(1/3)
value(y) = 0.5773502704448548
0.5773502704448548

```

---

<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:** [November 8, 2021, 6:41pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/11 "2021-11-08T18:41:37Z")

</div>

Ipopt only finds a single solution. It does not find all solutions.

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [November 8, 2021, 6:43pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/12 "2021-11-08T18:43:53Z")

</div>

Thanks. Can you suggest an alternative solver for this problem?

---

<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:** [November 8, 2021, 6:45pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/13 "2021-11-08T18:45:13Z")

</div>

To find all solutions? None of the JuMP solvers support this.

Why do you need it?

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [November 8, 2021, 6:48pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/14 "2021-11-08T18:48:17Z")

</div>

I am only studying a simple example, which I know the solutions previously. Is there an alternative package in `Julia` that gives all solutions?

I tried `Wolfram Alpha` with `maximize x^2*y on x^2+y^2=1` and I got immediately the two solution points!

---

<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:** [November 8, 2021, 7:08pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/15 "2021-11-08T19:08:11Z")

</div>

Try: [https://github.com/JuliaIntervals/IntervalConstraintProgramming.jl](https://github.com/JuliaIntervals/IntervalConstraintProgramming.jl)

In general, mathematical optimization is the wrong tool to compute all solutions. Almost all solvers focus on providing _an_ optimal solution, rather than _all_ optimal solutions.

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [November 8, 2021, 7:16pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/16 "2021-11-08T19:16:22Z")

</div>

But `Wolfram Alpha` is based on `Mathematica`… Maybe the reason is that the solution is symbolic, not numerical.

---

<div class="post-metadata">

**Author:** ![Gleb\_Belov](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gleb_belov/32/31076_2.png) [@Gleb\_Belov](https://discourse.julialang.org/u/Gleb_Belov)\
**Post date:** [November 24, 2021, 4:44pm UTC](https://discourse.julialang.org/t/defining-variable-model-as-x-0-in-jump/71162/17 "2021-11-24T16:44:40Z")

</div>

Gurobi can find all solutions, I believe for quadratic problems as well, so need to split the higher order terms
