|
@@ -11,6 +11,7 @@ import animation.ControlFlow;
|
|
|
import animation.Memory;
|
|
|
import animation.PseudoCodeNode;
|
|
|
import animation.Memory.MemoryType;
|
|
|
+import animation.Memory.ReadOnlyMemory;
|
|
|
import bk.BKNodePlacement.State;
|
|
|
import bk.LayoutType;
|
|
|
import codelines.DeclareVariable;
|
|
@@ -111,14 +112,14 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
root.add( text );
|
|
|
PseudoCodeNode foreach = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "foreach n in graph.getContainedNodes() do", vars ), tree, new ForEachLoop<LayeredGraphNode>( "n" ) {
|
|
|
@Override
|
|
|
- protected List<LayeredGraphNode> list(Memory m) {
|
|
|
+ protected List<LayeredGraphNode> list(ReadOnlyMemory m) {
|
|
|
return m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL ).getContainedNodes();
|
|
|
}
|
|
|
} );
|
|
|
root.add( foreach );
|
|
|
PseudoCodeNode ifNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if n has subgraph then", vars ), tree, new IfLoop() {
|
|
|
@Override
|
|
|
- protected boolean condition(Memory m) {
|
|
|
+ protected boolean condition(ReadOnlyMemory m) {
|
|
|
return m.<LayeredGraphNode>read( "n", MemoryType.LOCAL ).getContainedLayers().size() > 0;
|
|
|
}
|
|
|
} );
|
|
@@ -127,24 +128,20 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
ifNode.add( call );
|
|
|
text = new PseudoCodeNode(TextLayoutHelper.setupPseudoCodeStage( "-- mark conflicts in graph --" ), tree, new Kommentar() );
|
|
|
root.add( text );
|
|
|
- PseudoCodeNode init = new PseudoCodeNode(TextLayoutHelper.setupPseudoCode( "L = graph.getContainedLayers();", vars), tree, new CodeLine() {
|
|
|
- @Override
|
|
|
- public ControlFlow runForward(Memory m) {
|
|
|
- m.declare( "L", m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL ).getContainedLayers(), MemoryType.LOCAL );
|
|
|
- actions.push( (Memory mem) -> {
|
|
|
- mem.undeclare( "L", MemoryType.LOCAL );
|
|
|
- } );
|
|
|
- return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
- }
|
|
|
+ PseudoCodeNode init = new PseudoCodeNode(TextLayoutHelper.setupPseudoCode( "L = graph.getContainedLayers();", vars), tree, new DeclareVariable<ArrayList<ArrayList<LayeredGraphNode>>>( "L" ) {
|
|
|
+ @Override
|
|
|
+ protected ArrayList<ArrayList<LayeredGraphNode>> value(ReadOnlyMemory m) {
|
|
|
+ return m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL ).getContainedLayers();
|
|
|
+ }
|
|
|
} );
|
|
|
root.add( init );
|
|
|
PseudoCodeNode outerLoop = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "for i=1 to |L|-2 do", vars ), tree, new ForLoop( "i" ) {
|
|
|
@Override
|
|
|
- protected int minimum( Memory m ) {
|
|
|
+ protected int minimum( ReadOnlyMemory m ) {
|
|
|
return 1;
|
|
|
}
|
|
|
@Override
|
|
|
- protected int maximum( Memory m ) {
|
|
|
+ protected int maximum( ReadOnlyMemory m ) {
|
|
|
return m.<ArrayList<ArrayList<LayeredGraphNode>>>read( "L", MemoryType.LOCAL ).size() - 2;
|
|
|
}
|
|
|
} );
|
|
@@ -164,18 +161,18 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
outerLoop.add( line );
|
|
|
PseudoCodeNode innerLoop = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "for l1=0 to |L[i+1]|-1 do", vars ), tree, new ForLoop( "l1" ) {
|
|
|
@Override
|
|
|
- protected int minimum(Memory m) {
|
|
|
+ protected int minimum(ReadOnlyMemory m) {
|
|
|
return 0;
|
|
|
}
|
|
|
@Override
|
|
|
- protected int maximum(Memory m) {
|
|
|
+ protected int maximum(ReadOnlyMemory m) {
|
|
|
return m.<ArrayList<ArrayList<LayeredGraphNode>>>read( "L", MemoryType.LOCAL ).get( m.<Integer>read( "i", MemoryType.LOCAL ) + 1 ).size() - 1;
|
|
|
}
|
|
|
} );
|
|
|
outerLoop.add( innerLoop );
|
|
|
ifNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if l1==|L[i+1]|-1 or L[i+1][l1] incident to inner segment between L[i+1] and L[i] then", vars ), tree, new IfLoop() {
|
|
|
@Override
|
|
|
- protected boolean condition(Memory m) {
|
|
|
+ protected boolean condition(ReadOnlyMemory m) {
|
|
|
return m.<Integer>read( "l1", MemoryType.LOCAL ) == m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL ).getContainedLayers().get( m.<Integer>read( "i", MemoryType.LOCAL ) + 1).size() - 1 ||
|
|
|
incidentToInnerSegmentBetweenLiPlusOneAndLi( m );
|
|
|
}
|
|
@@ -183,14 +180,14 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
innerLoop.add( ifNode );
|
|
|
line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k1 = |L[i]|-1;", vars ), tree, new DeclareVariable<Integer>( "k1" ) {
|
|
|
@Override
|
|
|
- protected Integer value(Memory m) {
|
|
|
+ protected Integer value(ReadOnlyMemory m) {
|
|
|
return (int)m.<ArrayList<ArrayList<LayeredGraphNode>>>read( "L", MemoryType.LOCAL ).get( m.read( "i", MemoryType.LOCAL ) ).size() - 1;
|
|
|
}
|
|
|
} );
|
|
|
ifNode.add( line );
|
|
|
PseudoCodeNode innerIfNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if L[i+1][l1] incident to inner segment between L[i+1] and L[i] then", vars ), tree, new IfLoop() {
|
|
|
@Override
|
|
|
- protected boolean condition(Memory m) {
|
|
|
+ protected boolean condition(ReadOnlyMemory m) {
|
|
|
return incidentToInnerSegmentBetweenLiPlusOneAndLi( m );
|
|
|
}
|
|
|
} );
|
|
@@ -198,7 +195,7 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
|
|
|
line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k1 = pos(pred(L[i+1][l1])[0]);", vars ), tree, new SetVariable<Integer>( "k1" ) {
|
|
|
@Override
|
|
|
- protected Integer value(Memory m) {
|
|
|
+ protected Integer value(ReadOnlyMemory m) {
|
|
|
return (int)m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL ).getContainedLayers().get( m.read( "i", MemoryType.LOCAL ) ).indexOf(
|
|
|
m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL ).getContainedLayers().get( m.<Integer>read( "i", MemoryType.LOCAL ) + 1 ).get( m.read( "l1", MemoryType.LOCAL ) ).getSortedIncomingEdges().get( 0 ).getSources().get( 0 ) );
|
|
|
}
|
|
@@ -206,21 +203,21 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
innerIfNode.add( line );
|
|
|
PseudoCodeNode whileLoop = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "while l <= l1 do", vars ), tree, new WhileLoop() {
|
|
|
@Override
|
|
|
- protected boolean condition( Memory m ) {
|
|
|
+ protected boolean condition( ReadOnlyMemory m ) {
|
|
|
return m.<Integer>read( "l", MemoryType.LOCAL ) <= m.<Integer>read( "l1", MemoryType.LOCAL );
|
|
|
}
|
|
|
} );
|
|
|
ifNode.add( whileLoop );
|
|
|
foreach = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "foreach v in pred(L[i+1][l]) do", vars ), tree, new ForEachLoop<LayeredGraphEdge>( "v" ) {
|
|
|
@Override
|
|
|
- protected List<LayeredGraphEdge> list(Memory m) {
|
|
|
+ protected List<LayeredGraphEdge> list(ReadOnlyMemory m) {
|
|
|
return m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL ).getContainedLayers().get( m.<Integer>read( "i", MemoryType.LOCAL ) + 1 ).get( m.read( "l", MemoryType.LOCAL ) ).getIncomingEdges();
|
|
|
}
|
|
|
} );
|
|
|
whileLoop.add( foreach );
|
|
|
innerIfNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if pos(v) < k0 or pos(v) > k1 then", vars ), tree, new IfLoop() {
|
|
|
@Override
|
|
|
- protected boolean condition(Memory m) {
|
|
|
+ protected boolean condition(ReadOnlyMemory m) {
|
|
|
int k = m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL ).getContainedLayers().get( m.read( "i", MemoryType.LOCAL ) ).indexOf( m.<LayeredGraphEdge>read( "v", MemoryType.LOCAL ).getSources().get( 0 ) );
|
|
|
return k < m.<Integer>read( "k0", MemoryType.LOCAL ) || k > m.<Integer>read( "k1", MemoryType.LOCAL );
|
|
|
}
|
|
@@ -241,14 +238,14 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
innerIfNode.add( line );
|
|
|
line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "l = l+1;", vars ), tree, new SetVariable<Integer>( "l" ) {
|
|
|
@Override
|
|
|
- protected Integer value(Memory m) {
|
|
|
+ protected Integer value(ReadOnlyMemory m) {
|
|
|
return (int)m.<Integer>read( "l", MemoryType.LOCAL ) + 1;
|
|
|
}
|
|
|
} );
|
|
|
whileLoop.add( line );
|
|
|
line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k0 = k1;", vars ), tree, new SetVariable<Integer>( "k0" ) {
|
|
|
@Override
|
|
|
- protected Integer value(Memory m) {
|
|
|
+ protected Integer value(ReadOnlyMemory m) {
|
|
|
return (int)m.<Integer>read( "k1", MemoryType.LOCAL );
|
|
|
}
|
|
|
} );
|
|
@@ -256,7 +253,7 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
return root;
|
|
|
}
|
|
|
|
|
|
- private boolean incidentToInnerSegmentBetweenLiPlusOneAndLi( Memory m ) {
|
|
|
+ private boolean incidentToInnerSegmentBetweenLiPlusOneAndLi( ReadOnlyMemory m ) {
|
|
|
LayeredGraphNode curr = m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL ).getContainedLayers().get( m.<Integer>read( "i", MemoryType.LOCAL ) + 1 ).get( m.read( "l1", MemoryType.LOCAL ) );
|
|
|
for (LayeredGraphEdge e : curr.getIncomingEdges()) {
|
|
|
if (e.isDummyEdge()) {
|