Skip to content

Commit

Permalink
Use sets in comSubExp
Browse files Browse the repository at this point in the history
This improves performance of comSubExp (ticket:4398). Part of the
underlying problem is that the adjacency matrix stores everything as
list, but really is a set of integers. Using List.intersect,
and similar functions is much slower than using for example AvlSetInt.

Belonging to [master]:
  - OpenModelica/OMCompiler#1943
  • Loading branch information
sjoelund authored and OpenModelica-Hudson committed Oct 25, 2017
1 parent 2ac44ce commit 7b04aa1
Showing 1 changed file with 26 additions and 20 deletions.
46 changes: 26 additions & 20 deletions Compiler/BackEnd/ResolveLoops.mo
Expand Up @@ -36,24 +36,26 @@ encapsulated package ResolveLoops
resolveLoops."


public import BackendDAE;
public import DAE;

protected import Array;
protected import BackendDAEUtil;
protected import BackendEquation;
protected import BackendVariable;
protected import BackendDump;
protected import ComponentReference;
protected import Expression;
protected import ExpressionSimplify;
protected import ExpressionSolve;
protected import ExpressionDump;
protected import Flags;
protected import HpcOmTaskGraph;
protected import List;
protected import Util;
protected import Tearing;
import BackendDAE;
import DAE;

protected

import Array;
import BackendDAEUtil;
import BackendEquation;
import BackendVariable;
import BackendDump;
import ComponentReference;
import Expression;
import ExpressionSimplify;
import ExpressionSolve;
import ExpressionDump;
import Flags;
import HpcOmTaskGraph;
import List;
import Util;
import Tearing;

public function resolveLoops "author:Waurich TUD 2013-12
traverses the equations and finds simple equations(i.e. linear functions
Expand Down Expand Up @@ -366,13 +368,17 @@ public function resolveLoops_findLoops "author:Waurich TUD 2014-02
protected
list<list<Integer>> loops, eqVars;
list<Integer> eqCrossLst, varCrossLst, partitionVars;
AvlSetInt.Tree set;
algorithm
for partition in partitionsIn loop
try
// get the eqCrossNodes and varCrossNodes i.e. nodes with more than 2 edges
eqVars := List.map1(partition,Array.getIndexFirst,mIn);
partitionVars := List.flatten(eqVars);
partitionVars := List.unique(partitionVars);
set := AvlSetInt.EMPTY();
for vars in eqVars loop
set := AvlSetInt.addList(set, vars);
end for;
partitionVars := AvlSetInt.listKeys(set);
eqCrossLst := List.fold2(partition,gatherCrossNodes,mIn,mTIn,{});
varCrossLst := List.fold2(partitionVars,gatherCrossNodes,mTIn,mIn,{});

Expand Down

0 comments on commit 7b04aa1

Please sign in to comment.