Skip to content

Commit ea72c01

Browse files
committed
Optimize List.deleteMemberOnTrue
- Use `listAppend` with `listReverseInPlace` instead of `append_reverse` in `List.deleteMemberOnTrue`, so that as much work as possible is done in the C runtime instead of in MetaModelica. - Remove `List.deleteMember` and `List.deleteMemberF`, they can be trivially replaced with `List.deleteMemberOnTrue` and `valueEq` is rarely a good equality function.
1 parent 381bb31 commit ea72c01

File tree

13 files changed

+34
-69
lines changed

13 files changed

+34
-69
lines changed

OMCompiler/Compiler/BackEnd/BackendDAEUtil.mo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4588,7 +4588,7 @@ algorithm
45884588
Integer i;
45894589
case(i,_,_) then i;
45904590
end match for adjacencyElemT in adjacencyRowT);
4591-
eqns := List.deleteMember(eqns,eqn);
4591+
eqns := List.deleteMemberOnTrue(eqn,eqns,intEq);
45924592
for e in eqns loop
45934593
adjacencyRow := m[e];
45944594
adjacencyRow := list(

OMCompiler/Compiler/BackEnd/HpcOmEqSystems.mo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2483,7 +2483,7 @@ algorithm
24832483
vars = listGet(varsIn,idx);
24842484
eq = listGet(eqsIn,idx);
24852485
depEqs = List.flatten(List.map1(vars,Array.getIndexFirst,mt));
2486-
depEqs = List.deleteMember(depEqs,eq);
2486+
depEqs = List.deleteMemberOnTrue(eq,depEqs,intEq);
24872487
graph = arrayUpdate(graphIn,eq,depEqs);
24882488
graph = buildMatchedGraphForTornSystem(idx+1,eqsIn,varsIn,m,mt,graph);
24892489
then graph;

OMCompiler/Compiler/BackEnd/HpcOmScheduler.mo

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1707,7 +1707,7 @@ algorithm
17071707

17081708
// get the nodes that are necessary to compute the next critical path node, collect unassigned
17091709
levelNodes = List.flatten(List.map1(List.intRange2(levelIdx,critNodeLevel),List.getIndexFirst,levelIn));
1710-
levelNodes = List.deleteMember(levelNodes,critPathNode);
1710+
levelNodes = List.deleteMemberOnTrue(critPathNode,levelNodes,intEq);
17111711
//print("levelNodes: \n"+stringDelimitList(List.map(levelNodes,intString)," ; ")+"\n");
17121712
necessaryPredecessors = arrayGet(iGraphT,listHead(restCritNodes));
17131713
//print("necessaryPredecessors: "+stringDelimitList(List.map(necessaryPredecessors,intString)," ; ")+"\n");
@@ -5261,7 +5261,7 @@ algorithm
52615261
case(_,_::_,_)
52625262
equation
52635263
pivotElement = listGet(lstIn,pivotIdx);
5264-
marked = List.deleteMember(markedLstIn,pivotElement);
5264+
marked = List.deleteMemberOnTrue(pivotElement,markedLstIn,realEq);
52655265
r1 = listHead(marked);
52665266
r2 = List.last(marked);
52675267
midIdx = intDiv(listLength(marked),2);

OMCompiler/Compiler/BackEnd/HpcOmTaskGraph.mo

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4075,7 +4075,7 @@ algorithm
40754075
//print("HpcOmTaskGraph.contractNodesInGraph1 contractNodes: " + stringDelimitList(List.map(contractNodes,intString),",") + "\n");
40764076
//print("HpcOmTaskGraph.contractNodesInGraph1 startNode: " + intString(List.last(contractNodes)) + "\n");
40774077
startNode := List.last(contractNodes);
4078-
deleteEntries := List.deleteMember(contractNodes,startNode); //all nodes which should be deleted
4078+
deleteEntries := List.deleteMemberOnTrue(startNode,contractNodes,intEq); //all nodes which should be deleted
40794079
//print("HpcOmTaskGraph.contractNodesInGraph1 deleteEntries: " + stringDelimitList(List.map(deleteEntries,intString),",") + "\n");
40804080
deleteNodesParents := List.flatten(List.map1(deleteEntries, Array.getIndexFirst, graphInT));
40814081
//print("HpcOmTaskGraph.contractNodesInGraph1 deleteNodesParents: " + stringDelimitList(List.map(deleteNodesParents,intString),",") + "\n");
@@ -4394,7 +4394,7 @@ algorithm
43944394
pathLst = listHead(lstIn);
43954395
pathLst = inPath::pathLst;
43964396
lstTmp = List.replaceAt(pathLst, 1, lstIn);
4397-
rest = List.deleteMember(allNodes,inPath);
4397+
rest = List.deleteMemberOnTrue(inPath,allNodes,intEq);
43984398
lstTmp = findOneChildParents(rest,graphIn,doNotMerge,lstTmp,child,contrNodes);
43994399
then
44004400
lstTmp;
@@ -4411,7 +4411,7 @@ algorithm
44114411
pathLst = listHead(lstIn);
44124412
pathLst = inPath::pathLst;
44134413
lstTmp = List.replaceAt(pathLst, 1, lstIn);
4414-
rest = List.deleteMember(allNodes,inPath);
4414+
rest = List.deleteMemberOnTrue(inPath,allNodes,intEq);
44154415
lstTmp = findOneChildParents(rest,graphIn,doNotMerge,lstTmp,0,contrNodes);
44164416
then
44174417
lstTmp;

OMCompiler/Compiler/BackEnd/Matching.mo

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5897,7 +5897,7 @@ algorithm
58975897
//update mt
58985898
for varIdx in varIdxs loop
58995899
row := arrayGet(mt,varIdx);
5900-
row := List.deleteMember(row,e);
5900+
row := List.deleteMemberOnTrue(e, row, intEq);
59015901
arrayUpdate(mt,varIdx,row);
59025902
end for;
59035903
end for;
@@ -5942,7 +5942,7 @@ algorithm
59425942
//update mt
59435943
for varIdx in varIdxs loop
59445944
row := arrayGet(mt,varIdx);
5945-
row := List.deleteMember(row,idx);
5945+
row := List.deleteMemberOnTrue(idx,row,intEq);
59465946
arrayUpdate(mt,varIdx,row);
59475947
end for;
59485948
end if;

OMCompiler/Compiler/BackEnd/ResolveLoops.mo

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -813,8 +813,8 @@ algorithm
813813
nextPaths2 = List.filter1OnTrue(allPathsIn, lastInListIsEqual, startNode);
814814
nextPaths2 = listAppend(nextPaths1,nextPaths2);
815815
nextPath = listHead(nextPaths2);
816-
rest = List.deleteMember(allPathsIn,nextPath);
817-
nextPath = List.deleteMember(nextPath,startNode);
816+
rest = List.deleteMemberOnTrue(nextPath,allPathsIn, function List.isEqualOnTrue(inCompFunc = intEq));
817+
nextPath = List.deleteMemberOnTrue(startNode,nextPath,intEq);
818818
path = listAppend(nextPath,loopIn);
819819
path = connectPathsToOneLoop(rest,path);
820820
then
@@ -826,7 +826,7 @@ algorithm
826826
nextPaths2 = List.filter1OnTrue(rest, lastInListIsEqual, startNode);
827827
nextPaths2 = listAppend(nextPaths1,nextPaths2);
828828
nextPath = listHead(nextPaths2);
829-
rest = List.deleteMember(rest,nextPath);
829+
rest = List.deleteMemberOnTrue(nextPath,rest, function List.isEqualOnTrue(inCompFunc = intEq));
830830
path = listAppend(nextPath,restPath);
831831
path = connectPathsToOneLoop(rest,path);
832832
then
@@ -886,7 +886,7 @@ algorithm
886886
pos = -1;
887887
end if;
888888

889-
eqs = List.deleteMember(loop1,pos);
889+
eqs = List.deleteMemberOnTrue(pos,loop1,intEq);
890890
//print("contract eqs: "+stringDelimitList(List.map(eqs,intString),",")+" to eq "+intString(pos)+"\n");
891891

892892
// get the corresponding vars
@@ -935,7 +935,7 @@ algorithm
935935
pos = if not listEmpty(replEqs) then listHead(replEqs) else -1;
936936
pos = if not listEmpty(eqs) then listHead(eqs) else pos;
937937

938-
eqs = List.deleteMember(loop1,pos);
938+
eqs = List.deleteMemberOnTrue(pos,loop1,intEq);
939939
//print("contract eqs: "+stringDelimitList(List.map(eqs,intString),",")+" to eq "+intString(pos)+"\n");
940940

941941
// get the corresponding vars
@@ -1128,7 +1128,7 @@ algorithm
11281128
equation
11291129
elemR = listReverse(elem);
11301130
elemR = List.getMember(elemR,elemLst);
1131-
foldLst = List.deleteMember(foldLstIn,elem);
1131+
foldLst = List.deleteMemberOnTrue(elem,foldLstIn,function List.isEqualOnTrue(inCompFunc = intEq));
11321132
then
11331133
elemR::foldLst;
11341134
else
@@ -1342,7 +1342,7 @@ algorithm
13421342
else
13431343
next := List.first(eqs);
13441344
end if;
1345-
rest := List.deleteMember(loopIn,next);
1345+
rest := List.deleteMemberOnTrue(next,loopIn,intEq);
13461346
then sortLoop(rest,m,mT,next::sortLoopIn);
13471347
end matchcontinue;
13481348
end sortLoop;
@@ -1500,7 +1500,7 @@ algorithm
15001500
// check the next eqNode of the crossEq whether the paths is finished here or the path goes on to another crossEq
15011501
adjVars = arrayGet(mIn,crossEq);
15021502
adjEqs = List.map1(adjVars,Array.getIndexFirst,mTIn);
1503-
adjEqs = List.map1(adjEqs,List.deleteMember,crossEq);// REMARK: this works only if there are no varCrossNodes
1503+
adjEqs = list(List.deleteMemberOnTrue(crossEq, eq, intEq) for eq in adjEqs); // REMARK: this works only if there are no varCrossNodes
15041504
adjEqs = List.filterOnFalse(adjEqs,listEmpty);
15051505
nextEqs = List.flatten(adjEqs);
15061506
(endEqs,unfinEqs,_) = List.intersection1OnTrue(nextEqs,allEqCrossNodes,intEq);
@@ -1517,7 +1517,7 @@ algorithm
15171517
prevEq = List.second(pathStart);
15181518
adjVars = arrayGet(mIn,lastEq);
15191519
adjEqs = List.map1(adjVars,Array.getIndexFirst,mTIn);
1520-
adjEqs = List.map1(adjEqs,List.deleteMember,lastEq);// REMARK: this works only if there are no varCrossNodes
1520+
adjEqs = list(List.deleteMemberOnTrue(lastEq, eq, intEq) for eq in adjEqs); // REMARK: this works only if there are no varCrossNodes
15211521
adjEqs = List.filterOnFalse(adjEqs,listEmpty);
15221522
nextEqs = List.map(adjEqs,listHead);
15231523
(nextEqs,_) = List.deleteMemberOnTrue(prevEq,nextEqs,intEq); //do not take the path back to the previous node
@@ -2133,7 +2133,7 @@ algorithm
21332133
path = listHead(allPaths);
21342134
endNode = if not listEmpty(allPaths) then List.last(path) else -1;
21352135
endNode = if not listEmpty(paths2) then listHead(path) else -1;
2136-
rest = List.deleteMember(pathsIn,path);
2136+
rest = List.deleteMemberOnTrue(path,pathsIn,function List.isEqualOnTrue(inCompFunc = intEq));
21372137
sortedPaths = listAppend(sortedPathsIn,{path});
21382138
sortedPaths = sortPathsAsChain1(rest,firstNode,endNode,sortedPaths);
21392139

@@ -2149,7 +2149,7 @@ algorithm
21492149
path = listHead(allPaths);
21502150
startNode = if not listEmpty(allPaths) then List.last(path) else -1;
21512151
startNode = if not listEmpty(paths2) then listHead(path) else -1;
2152-
rest = List.deleteMember(pathsIn,path);
2152+
rest = List.deleteMemberOnTrue(path,pathsIn,function List.isEqualOnTrue(inCompFunc = intEq));
21532153
sortedPaths = path::sortedPathsIn;
21542154
sortedPaths = sortPathsAsChain1(rest,startNode,lastNode,sortedPaths);
21552155
then

OMCompiler/Compiler/BackEnd/SymbolicJacobian.mo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,7 @@ algorithm
760760
(pivotIdx,pivot) := getPivotElement(A,rangeIn,indxIn,n);
761761
//print("pivot: "+intString(pivotIdx)+" has value: "+realString(pivot)+"\n");
762762
arrayUpdate(permutation,indxIn,pivotIdx);
763-
range := List.deleteMember(rangeIn,pivotIdx);
763+
range := List.deleteMemberOnTrue(pivotIdx,rangeIn,intEq);
764764

765765
// the pivot row in the A-matrix divided by the pivot element
766766
for ic in indxIn:n loop

OMCompiler/Compiler/BackEnd/SynchronousFeatures.mo

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,10 +1219,10 @@ protected
12191219
list<Integer> row;
12201220
algorithm
12211221
row := arrayGet(m,eq);
1222-
row := List.deleteMember(row,var);
1222+
row := List.deleteMemberOnTrue(var,row,intEq);
12231223
arrayUpdate(m,eq,row);
12241224
row := arrayGet(mT,var);
1225-
row := List.deleteMember(row,eq);
1225+
row := List.deleteMemberOnTrue(eq,row,intEq);
12261226
arrayUpdate(mT,var,row);
12271227
end removeEdge;
12281228

OMCompiler/Compiler/BackEnd/Tearing.mo

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1750,7 +1750,7 @@ try
17501750
if isEntrySolved(entr) then
17511751
(vidx,_,_) := entr;
17521752
algSolvedVars := vidx::algSolvedVars;
1753-
unsolvedCombined := List.deleteMember(unsolvedCombined,vidx);
1753+
unsolvedCombined := List.deleteMemberOnTrue(vidx, unsolvedCombined, intEq);
17541754

17551755
// mark the var to be ignored for later
17561756
// matching.
@@ -3832,7 +3832,7 @@ algorithm
38323832
while not listEmpty(eqns) loop
38333833
eqOut := getMostNonlinearEquation(eqnNonlinPoints, eqns, mapEqnIncRow, mapIncRowEqn);
38343834
(solvable, eqnsOut, varsOut) := eqnSolvableCheck(eqOut, mapEqnIncRow, ass1, m, me);
3835-
eqns := List.deleteMember(eqns, eqOut);
3835+
eqns := List.deleteMemberOnTrue(eqOut, eqns, intEq);
38363836
if Flags.isSet(Flags.TEARING_DUMPVERBOSE) then
38373837
print("Most nonlinear equation: " + intString(eqOut) + " - solvable?: " + boolString(solvable) + "\n");
38383838
end if;
@@ -4098,7 +4098,7 @@ algorithm
40984098
rowsIndx := arrayGet(mHelp,entry);
40994099
for rowIndx in rowsIndx loop
41004100
row := arrayGet(mUpdate,rowIndx);
4101-
row := List.deleteMember(row,entry);
4101+
row := List.deleteMemberOnTrue(entry, row, intEq);
41024102
Array.replaceAtWithFill(rowIndx,row,row,mUpdate);
41034103
end for;
41044104
end for;

OMCompiler/Compiler/Script/Refactor.mo

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1313,7 +1313,8 @@ algorithm
13131313
true = isLayerAnnInList(listAppend(res,rest))/*Fails the case if we have a coordsys without a layer definition*/;
13141314
res = Absyn.MODIFICATION(fi, e, Absyn.IDENT("Coordsys"), SOME(Absyn.CLASSMOD(args, eqMod)),com,mod_info) :: res;
13151315
res = transformClassAnnList(rest,context,res,p);
1316-
then List.deleteMember(res,Absyn.MODIFICATION(fi, e, Absyn.IDENT("Coordsys"), SOME(Absyn.CLASSMOD(args, eqMod)),com,mod_info));
1316+
res = List.deleteMemberOnTrue(Absyn.MODIFICATION(fi, e, Absyn.IDENT("Coordsys"), SOME(Absyn.CLASSMOD(args, eqMod)),com,mod_info), res, valueEq);
1317+
then res;
13171318

13181319
case(Absyn.MODIFICATION(finalPrefix = fi, eachPrefix = e, path = Absyn.IDENT(name = "Coordsys"), modification = SOME(Absyn.CLASSMOD(elementArgLst = args, eqMod = eqMod)), comment = com, info = mod_info) :: rest,context,res,p)
13191320
equation
@@ -1322,7 +1323,8 @@ algorithm
13221323
res = Absyn.MODIFICATION(false, Absyn.NON_EACH(), Absyn.IDENT("Diagram"), SOME(Absyn.CLASSMOD({coord},Absyn.NOMOD())),NONE(),mod_info)
13231324
:: Absyn.MODIFICATION(false, Absyn.NON_EACH(), Absyn.IDENT("Icon"), SOME(Absyn.CLASSMOD({coord},Absyn.NOMOD())),NONE(),mod_info) :: res;
13241325
res = transformClassAnnList(rest,context,res,p);
1325-
then List.deleteMember(res,Absyn.MODIFICATION(fi, e, Absyn.IDENT("Coordsys"), SOME(Absyn.CLASSMOD(args, eqMod)),com,mod_info));
1326+
res = List.deleteMemberOnTrue(Absyn.MODIFICATION(fi, e, Absyn.IDENT("Coordsys"), SOME(Absyn.CLASSMOD(args, eqMod)),com,mod_info), res, valueEq);
1327+
then res;
13261328

13271329
case(Absyn.MODIFICATION(finalPrefix = fi, eachPrefix = e, path = Absyn.IDENT(name = "extent"), modification = SOME(Absyn.CLASSMOD(elementArgLst = args, eqMod = Absyn.EQMOD(Absyn.MATRIX(matrix = {{x1,y1},{x2,y2}} ),info))), comment = com, info = mod_info) :: rest,context as ("Coordsys" :: _),res,p)
13281330
equation

0 commit comments

Comments
 (0)