Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

if-condition on array of booleans in Modelica

Tags:

modelica

I'm sorry if this is a 'read the manual' question (I did but can't find an answer).

I have an array of Booleans and I want to test if any of them is true.

model TestArray

(...)
Boolean[:] booleanArray;
Real y;

equation
y = if [if any element in booleanArray is true] then ... else ...;

end TestArray;

How can I do this? Thanks, Roel

like image 545
saroele Avatar asked Aug 31 '25 10:08

saroele


2 Answers

There are functions like the ones you are requesting in Modelica.Math.BooleanVectors.

Here you'll find allTrue(Boolean b[:]), anyTrue(Boolean b[:]) and oneTrue(Boolean b[:]).

like image 70
Peter Sundström Avatar answered Sep 03 '25 04:09

Peter Sundström


This is an interesting question. Frankly, I'm not aware of any built-in capabilities for doing this (although the need for such capabilities is certainly valid).

What we've frequently done in the past is to write utility functions called "any" and "all", that look like this (untested, but you get the idea):

function any
  input Boolean vals[:];
  output Boolean result;
algorithm
  result := max({if i==true then 1 else 0 for i in vals})==1;
end any;

function all
  input Boolean vals[:];
  output Boolean result;
algorithm
  result := min({if i==true then 1 else 0 for i in vals})==1;
end all;

This is similar to what you did but using array comprehensions and then encapsulating that in functions. This allows you to write code like:

if any(conditions) then ... else ...;

Ideally, these functions could be added to the built-in set of "reduction operators" (like min and max), but the language group tends to be somewhat conservative about introducing such operators because they pollute the namespace and create potential collisions with existing code.

Note that things get a bit tricky when using when clauses. With when clauses, there is a vector construction, e.g.

when {cond1, cond2, cond3} then
  ...
end when;

Which has very useful semantics, but is not 100% analogous to either "any" or "all" as written above. So if you intend to use a vector of conditions in a when clause, then read up on how this is handled (in the specification) or ask a follow-up question on that and I can elaborate more (it is somewhat beyond the scope of this question).

like image 44
Michael Tiller Avatar answered Sep 03 '25 04:09

Michael Tiller