A constraint on the outputs - a post-processing constraint - is typically done using a penalty function such as a barrier function: basically when evaluating the cost function if it doesn't respect your constraint you give the cost function - that you are trying to *minimize* - a very large value.

In your case, you want to constraint the **input** parameters, so there's no reason at all to have the simulation be executed and then to check that! It'll just be a waste of time and electricity, and we all want to be energy efficient don't we?

**You can just reduce your problem by using only a single variable** $x$ that can take **DISCRETE** integer values of 0, 1, 2, 3, 4, 5, and **then define deriving variables by using the equality operator **`==`

.

This is equivalent to the following system of equation:

$$ x \in [0..5] $$
$$x0 = (x == 0) $$
$$x1 = (x == 1) $$
$$x2 = (x == 2) $$
$$x3 = (x == 3) $$
$$x4 = (x == 4) $$
$$x5 = (x == 5) $$

Now, as far as implementation in GenOpt, it shouldn't be too hard. As stated in the user manual (section 11.3), GenOpt implements some built-in functions and all functions in `java.lang.StrictMath`

, and you can also define your own functions that will return a double, so worse case scenario you can implement one in `Fun.java`

and recompile it.

But you can try the following, see if it works out of the box, I think it will since the ternary operator `?`

is built-in Java...

```
Parameter{ // initial variable in [0..5]
Name = x;
Min = 0;
Ini = 0;
Max = 5;
Step = 1;
Type = DISCRETE;
}
Function{
Name = x0;
Function = "(%x% == 0)? 1.0 : 0.0;";
}
Function{
Name = x1;
Function = "(%x% == 1)? 1.0 : 0.0;";
}
Function{
Name = x2;
Function = "(%x% == 2)? 1.0 : 0.0;";
}
Function{
Name = x3;
Function = "(%x% == 3)? 1.0 : 0.0;";
}
Function{
Name = x4;
Function = "(%x% == 4)? 1.0 : 0.0;";
}
Function{
Name = x5;
Function = "(%x% == 5)? 1.0 : 0.0;";
}
```

Then obviously you would assign each of the $x0.. x5$ variables in your template file for each water heater using `%x0%`

, `%x1%`

etc.

PS: Note that I didn't try any of the above code, and I know nothing about Java so typos are expected. Let me know if it works and what you had to change so we can leave a clean code here that can be reused by more people: we're doing this for "the children".