Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit dfbce6c

Browse files
sjoelundOpenModelica-Hudson
authored andcommitted
Use Set instead of List.unique
This improves scalability for ticket:4398. Belonging to [master]: - #1946
1 parent 9ff276e commit dfbce6c

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

Compiler/BackEnd/CommonSubExpression.mo

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import DAE;
4242

4343
protected
4444
import Array;
45+
import AvlSetInt;
4546
import BackendDAEUtil;
4647
import BackendDump;
4748
import BackendEquation;
@@ -1970,6 +1971,7 @@ protected
19701971
list<BackendDAE.Var> varLst;
19711972
list<CommonSubExp> cseLst2, cseLst3, shortenPathsCSE;
19721973
list<tuple<Boolean, String>> varAtts, eqAtts;
1974+
AvlSetInt.Tree varIdcsSet;
19731975
algorithm
19741976
try
19751977
range := List.intRange(arrayLength(mIn));
@@ -2005,9 +2007,12 @@ algorithm
20052007
(_, eqIdcs) := List.filter1OnTrueSync(lengthLst, intEq, 3, range);
20062008
(eqLst, eqIdcs) := List.filterOnTrueSync(BackendEquation.getList(eqIdcs, eqsIn),BackendEquation.isNotAlgorithm,eqIdcs); // no algorithms
20072009
eqs := BackendEquation.listEquation(eqLst);
2008-
varIdcs := List.unique(List.flatten(List.map1(eqIdcs, Array.getIndexFirst, mIn)));
2010+
varIdcsSet := AvlSetInt.EMPTY();
2011+
for eq in eqIdcs loop
2012+
varIdcsSet := AvlSetInt.addList(varIdcsSet, arrayGet(mIn, eq));
2013+
end for;
2014+
varIdcs := AvlSetInt.listKeysReverse(varIdcsSet);
20092015
varLst := List.map1(varIdcs, BackendVariable.getVarAtIndexFirst, varsIn);
2010-
//(varLst,varIdcs) := List.filterOnTrueSync(varLst,BackendVariable.isVarNonDiscrete,varIdcs);// no discrete vars
20112016
vars := BackendVariable.listVar1(varLst);
20122017
eqSys := BackendDAEUtil.createEqSystem(vars, eqs);
20132018
(_, m, mT) := BackendDAEUtil.getIncidenceMatrix(eqSys, BackendDAE.ABSOLUTE(), NONE());
@@ -2175,6 +2180,7 @@ algorithm
21752180
BackendDAE.Equation eq1, eq2;
21762181
BackendDAE.Var var1, var2;
21772182
DAE.Exp varExp1, varExp2, lhs, rhs1, rhs2;
2183+
array<Integer> varMapArr, eqMapArr;
21782184
case(_, _, _, _, _, _, _, _)
21792185
equation
21802186
//print("partition "+stringDelimitList(List.map(partition, intString), ", ")+"\n");
@@ -2206,10 +2212,14 @@ algorithm
22062212
//print("rhs2 " +ExpressionDump.printExpStr(rhs2)+"\n");
22072213
//print("is equal\n");
22082214
// build CSE
2209-
sharedVarIdcs = List.map1(sharedVarIdcs, List.getIndexFirst, varMap);
2215+
eqMapArr = listArray(eqMap);
2216+
varMapArr = listArray(varMap);
2217+
sharedVarIdcs = list(arrayGet(varMapArr, i) for i in sharedVarIdcs);
22102218
varIdcs1 = listAppend(varIdcs1, varIdcs2);
2211-
varIdcs1 = List.map1(varIdcs1, List.getIndexFirst, varMap);
2212-
eqIdcs = List.map1(loop1, List.getIndexFirst, eqMap);
2219+
varIdcs1 = list(arrayGet(varMapArr, i) for i in varIdcs1);
2220+
eqIdcs = list(arrayGet(eqMapArr,i) for i in loop1);
2221+
GC.free(eqMapArr);
2222+
GC.free(varMapArr);
22132223
then ASSIGNMENT_CSE(eqIdcs, sharedVarIdcs, varIdcs1)::cseIn;
22142224
else cseIn;
22152225
end matchcontinue;

0 commit comments

Comments
 (0)