#3212 closed defect (fixed)
Code generation of algorithm with enumeration indexed array fails while integer indexed array works fine
| Reported by: | Gustaf Thorslund | Owned by: | Per Östlund |
|---|---|---|---|
| Priority: | high | Milestone: | 1.9.4 |
| Component: | Backend | Version: | trunk |
| Keywords: | enumeration, index, array, algorithm | Cc: | Lennart Ochel, Willi Braun |
Description
Somehow trying to index an array with an enumeration type results code generation trying to solve a linear system and fail, while same test with integer indexed array works fine. The following code have one model for each case:
package ArrayTest
constant Integer N = 3;
type E = enumeration (e1, e2, e3);
type AI = Real[N];
type AE = Real[E];
function printArray
input Real a[:];
algorithm
for i loop
print(" " + String(a[i]));
end for;
print("\n");
end printArray;
model IntIndex
AI x;
initial algorithm
for i loop
x[i] := 0;
end for;
algorithm
when sample(0,0.1) then
for i loop
x[i] := time;
end for;
printArray(x);
end when;
end IntIndex;
model EnumIndex
AE x;
initial algorithm
for i loop
x[i] := 0;
end for;
algorithm
when sample(0,0.1) then
for i loop
x[i] := time;
end for;
printArray(x);
end when;
end EnumIndex;
end ArrayTest;
Trying the integer indexed model works just fine:
$ omc -s ArrayTest.mo -i=ArrayTest.IntIndex -d=failtrace
function ArrayTest.printArray
input Real[:] a;
algorithm
for i in 1:size(a, 1) loop
print(" " + String(a[i], 0, true, 6));
end for;
print("
");
end ArrayTest.printArray;
class ArrayTest.IntIndex
Real x[1];
Real x[2];
Real x[3];
initial algorithm
for i in 1:3 loop
x[i] := 0.0;
end for;
algorithm
when sample(0.0, 0.1) then
for i in 1:3 loop
x[i] := time;
end for;
ArrayTest.printArray({x[1], x[2], x[3]});
end when;
end ArrayTest.IntIndex;
$ make -f ArrayTest.IntIndex.makefile
$ ./ArrayTest.IntIndex
0 0 0
0.1 0.1 0.1
0.2 0.2 0.2
0.3 0.3 0.3
0.4 0.4 0.4
0.5 0.5 0.5
0.6 0.6 0.6
0.7 0.7 0.7
0.8 0.8 0.8
0.9 0.9 0.9
1 1 1
The enumeration indexed array will on the other hand result in errors during code generation.
$ omc -s ArrayTest.mo -i=ArrayTest.EnumIndex -d=failtrace
function ArrayTest.printArray
input Real[:] a;
algorithm
for i in 1:size(a, 1) loop
print(" " + String(a[i], 0, true, 6));
end for;
print("
");
end ArrayTest.printArray;
class ArrayTest.EnumIndex
Real x[ArrayTest.E.e1];
Real x[ArrayTest.E.e2];
Real x[ArrayTest.E.e3];
initial algorithm
for i in ArrayTest.E.e1:ArrayTest.E.e3 loop
x[i] := 0.0;
end for;
algorithm
when sample(0.0, 0.1) then
for i in ArrayTest.E.e1:ArrayTest.E.e3 loop
x[i] := time;
end for;
ArrayTest.printArray({x[ArrayTest.E.e1], x[ArrayTest.E.e2], x[ArrayTest.E.e3]});
end when;
end ArrayTest.EnumIndex;
Error: When solving linear system
1 : $PRE.x[ArrayTest.E.e1] = x[ArrayTest.E.e1]
2 : x[ArrayTest.E.e1] = $PRE.x[ArrayTest.E.e1]
[
-1.0 , 1.0 ;
1.0 , -1.0
]
*
[
x[ArrayTest.E.e1] ;
$PRE.x[ArrayTest.E.e1]
]
=
[
-0.0 ;
-0.0
]
U(2,2) = 0.0, which means system is singular for variable $PRE.x[ArrayTest.E.e1].
[/home/gustaf/src/openmodelica/Compiler/BackEnd/BackendDAETransform.mo:445:7-445:48:writable] Error: Internal error BackendDAETransform.analyseStrongComponentBlock failed
variables:
x[ArrayTest.E.e1]
$PRE.x[ArrayTest.E.e1]
equations:
$PRE.x[ArrayTest.E.e1] = x[ArrayTest.E.e1]
x[ArrayTest.E.e1] = $PRE.x[ArrayTest.E.e1]
[/home/gustaf/src/openmodelica/Compiler/BackEnd/BackendDAETransform.mo:449:7-449:90:writable] Error: Internal error function analyseStrongComponentBlock failed
[/home/gustaf/src/openmodelica/Compiler/BackEnd/BackendDAETransform.mo:106:5-106:111:writable] Error: Internal error function strongComponentsScalar failed (sorting strong components)
[/home/gustaf/src/openmodelica/Compiler/BackEnd/BackendDAEUtil.mo:7193:5-7193:89:writable] Error: Internal error Transformation module sort components failed
Error: No system for the symbolic initialization was generated.
Since the variable x is only referred inside an algorithmic section I see no reason to solve a linear system for it.
Change History (10)
comment:1 by , 11 years ago
| Cc: | added |
|---|---|
| Component: | Frontend → Backend |
comment:2 by , 11 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
follow-up: 5 comment:3 by , 11 years ago
Fixed in r25037. There still seems to be some remaining issue though, because you now get warnings that the initial conditions are both not fully specified and over specified. But the model can be simulated and gives the expected result.
I found another place in the back end which doesn't handle enumeration ranges that I'm going to fix also, maybe that's related to the issue with the initial conditions. But I'm not sure if I'll have time to fix it today.
comment:5 by , 11 years ago
Replying to perost:
I found another place in the back end which doesn't handle enumeration ranges that I'm going to fix also, maybe that's related to the issue with the initial conditions. But I'm not sure if I'll have time to fix it today.
Fixed in r25063, but it made no difference for this model. I can't see any other obvious places in the back end where converting enums to ints may cause issues though.
comment:6 by , 11 years ago
Changing the initialization of the model removes the initial condition issue.
-
test/ArrayTest.mo
a b package ArrayTest 14 14 end printArray; 15 15 16 16 model IntIndex 17 AI x; 18 initial algorithm 19 for i loop 20 x[i] := 0; 21 end for; 17 AI x(each start=0, each fixed=true); 22 18 algorithm 23 19 when sample(0,0.1) then 24 20 for i loop … … package ArrayTest 29 25 end IntIndex; 30 26 31 27 model EnumIndex 32 AE x; 33 initial algorithm 34 for i loop 35 x[i] := 0; 36 end for; 28 AE x(each start=0, each fixed=true); 37 29 algorithm 38 30 when sample(0,0.1) then 39 31 for i loop
I think the issue of the initial conditions should be considered in some other ticket instead.
comment:8 by , 11 years ago
| Resolution: | → fixed |
|---|---|
| Status: | assigned → closed |
comment:9 by , 10 years ago
| Milestone: | Future → pre1.9.4 |
|---|
It doesn't make sense to keep closed ticket in the "Future" milestone that were simply forgotten to assign to the correct milestone in the past.
comment:10 by , 8 years ago
| Milestone: | pre1.9.4 → 1.9.4 |
|---|
Removing the pre1.9.4 milestone in favor of 1.9.4.

Despite what I told you earlier I had a quick look, and think I know what the issue is. The back end doesn't handle enum ranges well, but I'll fix that.