|
@@ -11,6 +11,7 @@ import animation.CodeLine;
|
|
|
import animation.ControlFlow;
|
|
|
import animation.Memory;
|
|
|
import animation.PseudoCodeNode;
|
|
|
+import animation.Memory.MemoryType;
|
|
|
import bk.BKNodePlacement.State;
|
|
|
import bk.ExtremalLayoutCalc.LayoutType;
|
|
|
import codelines.DeclareVariable;
|
|
@@ -20,6 +21,7 @@ import codelines.FunctionCall;
|
|
|
import codelines.FunctionDefinition;
|
|
|
import codelines.IfLoop;
|
|
|
import codelines.Kommentar;
|
|
|
+import codelines.SetVariable;
|
|
|
import codelines.WhileLoop;
|
|
|
import graph.LayeredGraphEdge;
|
|
|
import graph.LayeredGraphNode;
|
|
@@ -41,7 +43,7 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
|
|
|
@Override
|
|
|
public PseudoCodeNode createPseudocodeTree(JTree tree) {
|
|
|
- String vars[] = { "i", "L", "k0", "l", "l1", "k1", "k", "v", "graph", "n" };
|
|
|
+ String vars[] = { "i", "L", "k0", "l", "l1", "k1", "v", "graph", "n" };
|
|
|
String params[] = { "graph" };
|
|
|
@SuppressWarnings("serial")
|
|
|
PseudoCodeNode root = new PseudoCodeNode(TextLayoutHelper.setupPseudoCode("function mark_conflicts( graph )", vars), tree, new FunctionDefinition( params ), alg ) {
|
|
@@ -50,29 +52,28 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
{
|
|
|
((BKNodePlacement)alg).setState( State.CONFLICTS );
|
|
|
|
|
|
- if( m.isSomewhereDefined( "l", false ) && m.isSomewhereDefined( "i", false ) &&
|
|
|
- m.<Integer>read( "l", false ) < m.<LayeredGraphNode>read( "graph", false).getContainedLayers().get( m.<Integer>read( "i", false ) + 1 ).size() )
|
|
|
- m.<LayeredGraphNode>read( "graph", false).getContainedLayers().get(m.<Integer>read( "i", false ) + 1).get(m.<Integer>read( "l", false )).setSelected(null);
|
|
|
+ if( m.isSomewhereDefined( "l", MemoryType.LOCAL ) && m.isSomewhereDefined( "i", MemoryType.LOCAL ) &&
|
|
|
+ m.<Integer>read( "l", MemoryType.LOCAL ) < m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL).getContainedLayers().get( m.<Integer>read( "i", MemoryType.LOCAL ) + 1 ).size() )
|
|
|
+ m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL).getContainedLayers().get(m.<Integer>read( "i", MemoryType.LOCAL ) + 1).get(m.<Integer>read( "l", MemoryType.LOCAL )).setSelected(null);
|
|
|
|
|
|
- if( m.isSomewhereDefined( "i", false ) && m.isSomewhereDefined( "l1", false ) ) {
|
|
|
- m.<LayeredGraphNode>read( "graph", false).getContainedLayers().get(m.<Integer>read( "i", false ) + 1).get(m.<Integer>read( "l1", false )).setSelected(null);
|
|
|
+ if( m.isSomewhereDefined( "i", MemoryType.LOCAL ) && m.isSomewhereDefined( "l1", MemoryType.LOCAL ) &&
|
|
|
+ m.<Integer>read( "l1", MemoryType.LOCAL ) < m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL).getContainedLayers().get(m.<Integer>read( "i", MemoryType.LOCAL ) + 1).size() ) {
|
|
|
+ m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL).getContainedLayers().get(m.<Integer>read( "i", MemoryType.LOCAL ) + 1).get(m.<Integer>read( "l1", MemoryType.LOCAL )).setSelected(null);
|
|
|
}
|
|
|
|
|
|
- if( m.isSomewhereDefined( "i", false ) && m.isSomewhereDefined( "k0", false ) ) {
|
|
|
- m.<LayeredGraphNode>read( "graph", false).getContainedLayers().get(m.<Integer>read( "i", false ) + 1).get(m.<Integer>read( "k0", false )).setSelected(null);
|
|
|
+ if( m.isSomewhereDefined( "i", MemoryType.LOCAL ) && m.isSomewhereDefined( "k0", MemoryType.LOCAL ) &&
|
|
|
+ m.<Integer>read( "k0", MemoryType.LOCAL ) < m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL).getContainedLayers().get(m.read( "i", MemoryType.LOCAL )).size()) {
|
|
|
+ m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL).getContainedLayers().get(m.read( "i", MemoryType.LOCAL )).get(m.<Integer>read( "k0", MemoryType.LOCAL )).setSelected(null);
|
|
|
}
|
|
|
|
|
|
- if( m.isSomewhereDefined( "i", false ) && m.isSomewhereDefined( "k1", false ) ) {
|
|
|
- m.<LayeredGraphNode>read( "graph", false).getContainedLayers().get(m.<Integer>read( "i", false ) + 1).get(m.<Integer>read( "k1", false )).setSelected(null);
|
|
|
+ if( m.isSomewhereDefined( "i", MemoryType.LOCAL ) && m.isSomewhereDefined( "k1", MemoryType.LOCAL ) &&
|
|
|
+ m.<Integer>read( "k1", MemoryType.LOCAL ) < m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL).getContainedLayers().get(m.read( "i", MemoryType.LOCAL )).size() ) {
|
|
|
+ m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL).getContainedLayers().get(m.read( "i", MemoryType.LOCAL )).get(m.<Integer>read( "k1", MemoryType.LOCAL )).setSelected(null);
|
|
|
}
|
|
|
|
|
|
- if( m.isSomewhereDefined( "i", false ) && m.isSomewhereDefined( "k", false ) ) {
|
|
|
- m.<LayeredGraphNode>read( "graph", false).getContainedLayers().get(m.<Integer>read( "i", false ) + 1).get(m.<Integer>read( "k", false )).setSelected(null);
|
|
|
- }
|
|
|
-
|
|
|
- if( m.isSomewhereDefined( "n", false ) )
|
|
|
+ if( m.isSomewhereDefined( "n", MemoryType.LOCAL ) )
|
|
|
{
|
|
|
- m.<LayeredGraphNode>read( "n", false ).setSelected( null );
|
|
|
+ m.<LayeredGraphNode>read( "n", MemoryType.LOCAL ).setSelected( null );
|
|
|
}
|
|
|
}
|
|
|
};
|
|
@@ -81,14 +82,14 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
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) {
|
|
|
- return m.<LayeredGraphNode>read( "graph", false ).getContainedNodes();
|
|
|
+ return m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL ).getContainedNodes();
|
|
|
}
|
|
|
}, alg );
|
|
|
root.add( foreach );
|
|
|
PseudoCodeNode ifNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if n has subgraph then", vars ), tree, new IfLoop() {
|
|
|
@Override
|
|
|
protected boolean condition(Memory m) {
|
|
|
- return m.<LayeredGraphNode>read( "n", false ).getContainedLayers().size() > 0;
|
|
|
+ return m.<LayeredGraphNode>read( "n", MemoryType.LOCAL ).getContainedLayers().size() > 0;
|
|
|
}
|
|
|
}, alg );
|
|
|
foreach.add( ifNode );
|
|
@@ -99,9 +100,9 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
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", false ).getContainedLayers(), false );
|
|
|
+ m.declare( "L", m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL ).getContainedLayers(), MemoryType.LOCAL );
|
|
|
actions.push( (Memory mem) -> {
|
|
|
- mem.undeclare( "L", false );
|
|
|
+ mem.undeclare( "L", MemoryType.LOCAL );
|
|
|
return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
} );
|
|
|
return new ControlFlow( ControlFlow.STEP_OVER );
|
|
@@ -115,22 +116,18 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
}
|
|
|
@Override
|
|
|
protected int maximum( Memory m ) {
|
|
|
- return m.<ArrayList<ArrayList<LayeredGraphNode>>>read( "L", false ).size() - 2;
|
|
|
+ return m.<ArrayList<ArrayList<LayeredGraphNode>>>read( "L", MemoryType.LOCAL ).size() - 2;
|
|
|
}
|
|
|
}, alg );
|
|
|
root.add( outerLoop );
|
|
|
PseudoCodeNode line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k0 = 0; l = 0;", vars ), tree, new CodeLine() {
|
|
|
@Override
|
|
|
public ControlFlow runForward(Memory m) {
|
|
|
- m.declare( "k0", 0, false );
|
|
|
- m.declare( "l", 0, false );
|
|
|
- m.declare( "end_", m.<LayeredGraphNode>read( "graph", false ).getContainedLayers().get( m.<Integer>read( "i", false ) + 1 ).size() - 1, false );
|
|
|
- m.declare( "0", 0, false );
|
|
|
+ m.declare( "k0", 0, MemoryType.LOCAL );
|
|
|
+ m.declare( "l", 0, MemoryType.LOCAL );
|
|
|
actions.push( (Memory mem) -> {
|
|
|
- mem.undeclare( "k0", false );
|
|
|
- mem.undeclare( "l", false );
|
|
|
- mem.undeclare( "end_", false );
|
|
|
- mem.undeclare( "0", false );
|
|
|
+ mem.undeclare( "k0", MemoryType.LOCAL );
|
|
|
+ mem.undeclare( "l", MemoryType.LOCAL );
|
|
|
return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
} );
|
|
|
return new ControlFlow( ControlFlow.STEP_OVER );
|
|
@@ -144,14 +141,14 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
}
|
|
|
@Override
|
|
|
protected int maximum(Memory m) {
|
|
|
- return m.<ArrayList<ArrayList<LayeredGraphNode>>>read( "L", false ).get( m.<Integer>read( "i", false ) + 1 ).size() - 1;
|
|
|
+ return m.<ArrayList<ArrayList<LayeredGraphNode>>>read( "L", MemoryType.LOCAL ).get( m.<Integer>read( "i", MemoryType.LOCAL ) + 1 ).size() - 1;
|
|
|
}
|
|
|
}, alg );
|
|
|
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) {
|
|
|
- return m.<LayeredGraphNode>read( "graph", false ).getContainedLayers().get( m.<Integer>read( "i", false ) + 1).size() == m.<Integer>read( "l1", false ) ||
|
|
|
+ return m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL ).getContainedLayers().get( m.<Integer>read( "i", MemoryType.LOCAL ) + 1).size() == m.<Integer>read( "l1", MemoryType.LOCAL ) ||
|
|
|
incidentToInnerSegmentBetweenLiPlusOneAndLi( m );
|
|
|
}
|
|
|
}, alg );
|
|
@@ -159,7 +156,7 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k1 = |L[i]|-1;", vars ), tree, new DeclareVariable<Integer>( "k1" ) {
|
|
|
@Override
|
|
|
protected Integer value(Memory m) {
|
|
|
- return (int)m.<ArrayList<ArrayList<LayeredGraphNode>>>read( "L", false ).get( m.read( "i", false ) ).size() - 1;
|
|
|
+ return (int)m.<ArrayList<ArrayList<LayeredGraphNode>>>read( "L", MemoryType.LOCAL ).get( m.read( "i", MemoryType.LOCAL ) ).size() - 1;
|
|
|
}
|
|
|
}, alg );
|
|
|
ifNode.add( line );
|
|
@@ -171,39 +168,40 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
}, alg );
|
|
|
ifNode.add( innerIfNode );
|
|
|
|
|
|
- line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k1 = pos(pred(L[i+1][l1])[0]);", vars ), tree, new DeclareVariable<Integer>( "k1" ) {
|
|
|
+ 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) {
|
|
|
- return (int)m.<LayeredGraphNode>read( "graph", false ).getContainedLayers().get( m.read( "i", false ) ).indexOf(
|
|
|
- m.<LayeredGraphNode>read( "graph", false ).getContainedLayers().get( m.<Integer>read( "i", false ) + 1 ).get( m.read( "l1", false ) ).getSortedIncomingEdges().get( 0 ).getSources().get( 0 ) );
|
|
|
+ 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 ) );
|
|
|
}
|
|
|
}, alg );
|
|
|
innerIfNode.add( line );
|
|
|
PseudoCodeNode whileLoop = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "while l <= l1 do", vars ), tree, new WhileLoop() {
|
|
|
@Override
|
|
|
protected boolean condition( Memory m ) {
|
|
|
- return m.<Integer>read( "l", false ) <= m.<Integer>read( "l1", false );
|
|
|
+ return m.<Integer>read( "l", MemoryType.LOCAL ) <= m.<Integer>read( "l1", MemoryType.LOCAL );
|
|
|
}
|
|
|
}, alg );
|
|
|
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) {
|
|
|
- return m.<LayeredGraphNode>read( "graph", false ).getContainedLayers().get( m.<Integer>read( "i", false ) + 1 ).get( m.read( "l", false ) ).getIncomingEdges();
|
|
|
+ return m.<LayeredGraphNode>read( "graph", MemoryType.LOCAL ).getContainedLayers().get( m.<Integer>read( "i", MemoryType.LOCAL ) + 1 ).get( m.read( "l", MemoryType.LOCAL ) ).getIncomingEdges();
|
|
|
}
|
|
|
}, alg );
|
|
|
whileLoop.add( foreach );
|
|
|
- innerIfNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if k < k0 or k > k1 then", vars ), tree, new IfLoop() {
|
|
|
+ innerIfNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if pos(v) < k0 or pos(v) > k1 then", vars ), tree, new IfLoop() {
|
|
|
@Override
|
|
|
protected boolean condition(Memory m) {
|
|
|
- return m.<Integer>read( "k", false ) < m.<Integer>read( "k0", false ) || m.<Integer>read( "k", false ) > m.<Integer>read( "k1", false );
|
|
|
+ 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 );
|
|
|
}
|
|
|
}, alg );
|
|
|
foreach.add( innerIfNode );
|
|
|
line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "mark segment (v,L[i+1][l]);", vars ), tree, new CodeLine() {
|
|
|
@Override
|
|
|
public ControlFlow runForward(Memory m) {
|
|
|
- LayeredGraphEdge e = m.read( "v", false );
|
|
|
+ LayeredGraphEdge e = m.read( "v", MemoryType.LOCAL );
|
|
|
boolean old = e.isConflicted( LayoutType.TOP_BOTTOM_LEFT );
|
|
|
e.setConflicted( true, null );
|
|
|
actions.add( (Memory mem) -> {
|
|
@@ -214,17 +212,17 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
}
|
|
|
}, alg );
|
|
|
innerIfNode.add( line );
|
|
|
- line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "l = l+1;", vars ), tree, new DeclareVariable<Integer>( "l" ) {
|
|
|
+ line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "l = l+1;", vars ), tree, new SetVariable<Integer>( "l" ) {
|
|
|
@Override
|
|
|
protected Integer value(Memory m) {
|
|
|
- return (int)m.<Integer>read( "l", false ) + 1;
|
|
|
+ return (int)m.<Integer>read( "l", MemoryType.LOCAL ) + 1;
|
|
|
}
|
|
|
}, alg );
|
|
|
whileLoop.add( line );
|
|
|
- line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k0 = k1;", vars ), tree, new DeclareVariable<Integer>( "k0" ) {
|
|
|
+ line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k0 = k1;", vars ), tree, new SetVariable<Integer>( "k0" ) {
|
|
|
@Override
|
|
|
protected Integer value(Memory m) {
|
|
|
- return (int)m.<Integer>read( "l1", false );
|
|
|
+ return (int)m.<Integer>read( "l1", MemoryType.LOCAL );
|
|
|
}
|
|
|
}, alg );
|
|
|
ifNode.add( line );
|
|
@@ -232,7 +230,7 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
}
|
|
|
|
|
|
private boolean incidentToInnerSegmentBetweenLiPlusOneAndLi( Memory m ) {
|
|
|
- LayeredGraphNode curr = m.<LayeredGraphNode>read( "graph", false ).getContainedLayers().get( m.<Integer>read( "i", false ) + 1 ).get( m.read( "l1", false ) );
|
|
|
+ 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()) {
|
|
|
return true;
|