# ModelingToolkit + IntervalConstraintProgramming: how to build expressions and contractors without "world age" problems or ambiguities

**URL:** https://discourse.julialang.org/t/modelingtoolkit-intervalconstraintprogramming-how-to-build-expressions-and-contractors-without-world-age-problems-or-ambiguities/59007
**Category:** General Usage
**Created:** [April 10, 2021, 8:08pm UTC](https://discourse.julialang.org/t/modelingtoolkit-intervalconstraintprogramming-how-to-build-expressions-and-contractors-without-world-age-problems-or-ambiguities/59007 "2021-04-10T20:08:34Z")
**Posts on this page:** 9
**Page:** 1

<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: [April 10, 2021, 8:08pm UTC](https://discourse.julialang.org/t/modelingtoolkit-intervalconstraintprogramming-how-to-build-expressions-and-contractors-without-world-age-problems-or-ambiguities/59007/1 "2021-04-10T20:08:34Z")

</div>

Hi,

I’m facing a problem of “world age” that my Julia experience doesn’t allow me to comprehend very well. Here is a MWE that uses the ModelingToolkit and IntervalConstraintProgramming packages:

```julia
using ModelingToolkit
using IntervalArithmetic
using IntervalConstraintProgramming

# dynamic reformulation of the expression by adding a slack
function add_slack(constraint_expression)
    new_variable = @variables s
    return (constraint_expression - s, new_variable[1])
end

# contract the box wrt the constraint
function contract(box, constraint_expression, variables)
    contractor = Contractor(variables, constraint_expression)
    box = contractor(0..0, box)
    return box
end

function constraint(x)
    return x[1]*x[2]
end

# create the original variables
variables = @variables x[1:2]
# flatten to an array
variables = vcat(variables...)

# add the slack
constraint_expression = constraint(x)
(constraint_expression, new_variable) = add_slack(constraint_expression)
# create the array [x1, x2, s]
append!(variables, new_variable)

# create a box and contract it wrt constraint
box = IntervalBox(0..1, 0..1, 0..1)
box = contract(box, constraint_expression, variables)

```

I define a problem, reformulate it somehow (here I add a slack variable, but I could add arbitrarily many variables), generate a contractor and call it.  
I get this error:

```julia
ERROR: LoadError: MethodError: no method matching (::IntervalConstraintProgramming.var"#31#32")(::IntervalBox{3,Float64})
The applicable method may be too new: running in world age 27984, while current world is 27986.

```

Somehow my logic is not Julia-compliant 🙂 I must say that the scope of the ModelingToolkit variables eludes me.  
Can you help me out? If possible, I’d like to keep the same structure (problem definition + reformulation + creation of contractor independently).  
Thanks,

Charlie

---

<div class="post-metadata">

### Author: ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)
#### Post date: [April 11, 2021, 7:38am UTC](https://discourse.julialang.org/t/modelingtoolkit-intervalconstraintprogramming-how-to-build-expressions-and-contractors-without-world-age-problems-or-ambiguities/59007/2 "2021-04-11T07:38:29Z")

</div>

Whatever is evaling in there, make it not use eval and instead use Runtime generated functions.

---

<div class="post-metadata">

### Author: ![dpsanders](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dpsanders/32/3573_2.png) [@dpsanders](https://discourse.julialang.org/u/dpsanders)
#### Post date: [April 12, 2021, 12:47am UTC](https://discourse.julialang.org/t/modelingtoolkit-intervalconstraintprogramming-how-to-build-expressions-and-contractors-without-world-age-problems-or-ambiguities/59007/3 "2021-04-12T00:47:06Z")

</div>

As Chris suggests, the problem is that `Contractor` is using `eval` to evaluate an expression, but then you are immediately calling `contractor` within the same function.

To avoid the world-age problem you need to return to the “top level” before using a function created by `eval`. Maybe we should indeed be using RuntimeGeneratedFunctions instead of eval.

---

<div class="post-metadata">

### Author: ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)
#### Post date: [April 12, 2021, 1:29pm UTC](https://discourse.julialang.org/t/modelingtoolkit-intervalconstraintprogramming-how-to-build-expressions-and-contractors-without-world-age-problems-or-ambiguities/59007/4 "2021-04-12T13:29:14Z")

</div>

> [@dpsanders](#):
>
> Maybe we should indeed be using RuntimeGeneratedFunctions instead of eval.

You should 😉

---

<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: [April 12, 2021, 5:05pm UTC](https://discourse.julialang.org/t/modelingtoolkit-intervalconstraintprogramming-how-to-build-expressions-and-contractors-without-world-age-problems-or-ambiguities/59007/5 "2021-04-12T17:05:19Z")

</div>

Thanks for your answers! I tried something like this:

```julia
using ModelingToolkit
using IntervalArithmetic
using IntervalConstraintProgramming

function add_slack(constraint_expression)
    new_variable = @variables s
    return (constraint_expression - s, new_variable[1])
end

function create_contractor(variables, constraint_expression)
    return Contractor(variables, constraint_expression)
end

function constraint(x)
    return x[1]*x[2]
end

function main()
    # create the original variables
    variables = @variables x[1:2]
    # flatten to an array
    variables = vcat(variables...)

    # add the slack
    constraint_expression = constraint(x)
    (constraint_expression, new_variable) = add_slack(constraint_expression)
    # create the array [x1, x2, s]
    append!(variables, new_variable)

    # create a box and contract it wrt constraint
    box = IntervalBox(0..1, 0..1, 0..1)
    contractor = create_contractor(variables, constraint_expression)
    box = contractor(0..0, box)
    println(box)
    return box
end

main()

```

with the same result. What happens is absolutely not intuitive for me. The Contractor is now created and called in 2 different functions 🤔

---

<div class="post-metadata">

### Author: ![simeonschaub](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/simeonschaub/32/216566_2.png) [@simeonschaub](https://discourse.julialang.org/u/simeonschaub)
#### Post date: [April 12, 2021, 5:11pm UTC](https://discourse.julialang.org/t/modelingtoolkit-intervalconstraintprogramming-how-to-build-expressions-and-contractors-without-world-age-problems-or-ambiguities/59007/6 "2021-04-12T17:11:12Z")

</div>

That’s still the same world age. You want to call `contractor` via `Base.invokelatest(contractor, 0..0, box)`, but note that this will infer to `Any` and have some overhead.

---

<div class="post-metadata">

### Author: ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)
#### Post date: [April 12, 2021, 5:13pm UTC](https://discourse.julialang.org/t/modelingtoolkit-intervalconstraintprogramming-how-to-build-expressions-and-contractors-without-world-age-problems-or-ambiguities/59007/7 "2021-04-12T17:13:51Z")

</div>

Or just don’t put it in a main function.

But @dpsanders knows what’s up and this’ll presumably get fixed in the package soon.

---

<div class="post-metadata">

### Author: ![dpsanders](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dpsanders/32/3573_2.png) [@dpsanders](https://discourse.julialang.org/u/dpsanders)
#### Post date: [April 12, 2021, 5:21pm UTC](https://discourse.julialang.org/t/modelingtoolkit-intervalconstraintprogramming-how-to-build-expressions-and-contractors-without-world-age-problems-or-ambiguities/59007/8 "2021-04-12T17:21:31Z")

</div>

You’re still inside the `main()` function. You don’t get back to top level (global scope).

---

<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: [April 12, 2021, 5:23pm UTC](https://discourse.julialang.org/t/modelingtoolkit-intervalconstraintprogramming-how-to-build-expressions-and-contractors-without-world-age-problems-or-ambiguities/59007/9 "2021-04-12T17:23:30Z")

</div>

Got it this time 🙂 Thanks a lot!
