First 2 commits are very small improvements.
Third commit adds application files so the multi-level application can be run from the UI.
Fourth commit add building and printing the multi-level synthesis tree.
The computation happens in
ComputeMultiLevelTree.process(). After clustering it kicks off the recursive tree build function with
makeTreeNode() at line 100. That function is basically algorithm 1, and it returns a
computeGroupContents() function implements algorithm 2. Not that both functions exist twice, once for a collection of plant nodes and once for a single plant node (the
M == 1 case in both algorithms).
Algorithm 2 the general case does a search in the plant group relations, which is encoded at lines 200 to 234. The
GroupContent class contains the actual data that is being updated inside the search (done in the
update function). The
GroupContent also functions as return value for algorithm 2.
I ran it with the simple waterlock case, and the output is the same as in the paper, except that our clustering function returns a different order of the clusters.