|
@@ -11,11 +11,14 @@ import animation.CodeLine;
|
|
|
import animation.ControlFlow;
|
|
|
import animation.Memory;
|
|
|
import animation.PseudoCodeNode;
|
|
|
+import bk.ExtremalLayoutCalc.LayoutType;
|
|
|
import codelines.DeclareVariable;
|
|
|
import codelines.ForEachLoop;
|
|
|
import codelines.ForLoop;
|
|
|
+import codelines.FunctionCall;
|
|
|
import codelines.FunctionDefinition;
|
|
|
import codelines.IfLoop;
|
|
|
+import codelines.Kommentar;
|
|
|
import codelines.WhileLoop;
|
|
|
import graph.LayeredGraphEdge;
|
|
|
import graph.LayeredGraphNode;
|
|
@@ -40,23 +43,48 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
String vars[] = { "i", "L", "k0", "l", "l1", "k1", "k", "v", "graph" };
|
|
|
String params[] = { "graph" };
|
|
|
PseudoCodeNode root = new PseudoCodeNode(TextLayoutHelper.setupPseudoCode("function mark_conflicts( graph )", vars), tree, new FunctionDefinition( params ), alg );
|
|
|
+ PseudoCodeNode text = new PseudoCodeNode(TextLayoutHelper.setupPseudoCodeStage( "-- mark conflicts in subgrapfhs --" ), tree, new Kommentar(), alg );
|
|
|
+ root.add( text );
|
|
|
+ PseudoCodeNode foreach = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "foreach v in graph.getContainedNodes() do", vars ), tree, new ForEachLoop<LayeredGraphNode>( "v" ) {
|
|
|
+ @Override
|
|
|
+ protected List<LayeredGraphNode> list(Memory m) {
|
|
|
+ return m.<LayeredGraphNode>read( "graph", false ).getContainedNodes();
|
|
|
+ }
|
|
|
+ }, alg );
|
|
|
+ root.add( foreach );
|
|
|
+ PseudoCodeNode ifNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if v has subgraph then", vars ), tree, new IfLoop() {
|
|
|
+ @Override
|
|
|
+ protected boolean condition(Memory m) {
|
|
|
+ return m.<LayeredGraphNode>read( "v", false ).getContainedLayers().size() > 0;
|
|
|
+ }
|
|
|
+ }, alg );
|
|
|
+ foreach.add( ifNode );
|
|
|
+ PseudoCodeNode call = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "call mark_conflicts( v );", vars ), tree, new FunctionCall( root, new String[]{ "v" } ), alg );
|
|
|
+ ifNode.add( call );
|
|
|
+ text = new PseudoCodeNode(TextLayoutHelper.setupPseudoCodeStage( "-- mark conflicts in graph --" ), tree, new Kommentar(), alg );
|
|
|
+ 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", false ).getContainedLayers(), false );
|
|
|
- m.declare( "L.length-2", m.<LayeredGraphNode>read( "graph", false ).getContainedLayers().size() - 2, false );
|
|
|
- m.declare( "1", 1, false );
|
|
|
actions.push( (Memory mem) -> {
|
|
|
mem.undeclare( "L", false );
|
|
|
- mem.undeclare( "L.length-2", false );
|
|
|
- mem.undeclare( "1", false );
|
|
|
return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
} );
|
|
|
return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
}
|
|
|
}, alg );
|
|
|
root.add( init );
|
|
|
- PseudoCodeNode outerLoop = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "for i=1 to |L|-2 do", vars ), tree, new ForLoop( "i", "1", "L.length-2" ), alg );
|
|
|
+ PseudoCodeNode outerLoop = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "for i=1 to |L|-2 do", vars ), tree, new ForLoop( "i" ) {
|
|
|
+ @Override
|
|
|
+ protected int minimum( Memory m ) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ protected int maximum( Memory m ) {
|
|
|
+ return m.<ArrayList<ArrayList<LayeredGraphNode>>>read( "L", false ).size() - 2;
|
|
|
+ }
|
|
|
+ }, alg );
|
|
|
root.add( outerLoop );
|
|
|
PseudoCodeNode line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k0 = 0; l = 0;", vars ), tree, new CodeLine() {
|
|
|
@Override
|
|
@@ -76,9 +104,18 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
}
|
|
|
}, alg );
|
|
|
outerLoop.add( line );
|
|
|
- PseudoCodeNode innerLoop = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "for l1=0 to |L[i+1]|-1 do", vars ), tree, new ForLoop( "l1", "0", "end_" ), alg );
|
|
|
+ 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) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ protected int maximum(Memory m) {
|
|
|
+ return m.<ArrayList<ArrayList<LayeredGraphNode>>>read( "L", false ).get( m.<Integer>read( "i", false ) + 1 ).size() - 1;
|
|
|
+ }
|
|
|
+ }, alg );
|
|
|
outerLoop.add( innerLoop );
|
|
|
- PseudoCodeNode 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() {
|
|
|
+ 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 ) ||
|
|
@@ -89,7 +126,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 m.<ArrayList<ArrayList<LayeredGraphNode>>>read( "L", false ).get( m.read( "i", false ) ).size() - 1;
|
|
|
+ return (int)m.<ArrayList<ArrayList<LayeredGraphNode>>>read( "L", false ).get( m.read( "i", false ) ).size() - 1;
|
|
|
}
|
|
|
}, alg );
|
|
|
ifNode.add( line );
|
|
@@ -104,7 +141,7 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k1 = pos(pred(L[i+1][l1])[0]);", vars ), tree, new DeclareVariable<Integer>( "k1" ) {
|
|
|
@Override
|
|
|
protected Integer value(Memory m) {
|
|
|
- return m.<LayeredGraphNode>read( "graph", false ).getContainedLayers().get( m.read( "i", false ) ).indexOf(
|
|
|
+ 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 ) );
|
|
|
}
|
|
|
}, alg );
|
|
@@ -116,30 +153,48 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
}
|
|
|
}, alg );
|
|
|
ifNode.add( whileLoop );
|
|
|
- PseudoCodeNode foreach = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "foreach v in pred(L[i+1][l]) do", vars ), tree, new ForEachLoop<LayeredGraphEdge>( "v" ) {
|
|
|
+ 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();
|
|
|
}
|
|
|
}, alg );
|
|
|
whileLoop.add( foreach );
|
|
|
- /*
|
|
|
- lines[ 5 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if L[i+1][l1] incident to inner segment between L[i+1] and L[i] then", vars ), tree );
|
|
|
- lines[ 3 ].add( lines[ 5 ] );
|
|
|
- lines[ 6 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k1 = pos(pred(L[i+1][l1])[0]);", vars ), tree );
|
|
|
- lines[ 5 ].add( lines[ 6 ] );
|
|
|
- lines[ 8 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "while l <= l1 do", vars ), tree );
|
|
|
- lines[ 3 ].add( lines[ 8 ] );
|
|
|
- lines[ 9 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "foreach v in pred(L[i+1][l]) do", vars ), tree );
|
|
|
- lines[ 8 ].add( lines[ 9 ] );
|
|
|
- lines[ 10 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if k < k0 or k > k1 then mark segment (v,L[i+1][l]);", vars ), tree );
|
|
|
- lines[ 9 ].add( lines[ 10 ] );
|
|
|
- lines[ 12 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "l = l+1;", vars ), tree );
|
|
|
- lines[ 8 ].add( lines[ 12 ] );
|
|
|
- lines[ 14 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k0 = k1;", vars ), tree );
|
|
|
- lines[ 3 ].add( lines[ 14 ] );
|
|
|
- lines[ 15 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCodeStage( "mark conflicts in subgraphs" ), tree );
|
|
|
- root.add( lines[ 15 ] );*/
|
|
|
+ innerIfNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if k < k0 or k > 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 );
|
|
|
+ }
|
|
|
+ }, 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 );
|
|
|
+ boolean old = e.isConflicted( LayoutType.TOP_BOTTOM_LEFT );
|
|
|
+ e.setConflicted( true, null );
|
|
|
+ actions.add( (Memory mem) -> {
|
|
|
+ e.setConflicted( old, null );
|
|
|
+ return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
+ });
|
|
|
+ return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
+ }
|
|
|
+ }, alg );
|
|
|
+ innerIfNode.add( line );
|
|
|
+ line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "l = l+1;", vars ), tree, new DeclareVariable<Integer>( "l" ) {
|
|
|
+ @Override
|
|
|
+ protected Integer value(Memory m) {
|
|
|
+ return (int)m.<Integer>read( "l", false ) + 1;
|
|
|
+ }
|
|
|
+ }, alg );
|
|
|
+ whileLoop.add( line );
|
|
|
+ line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k0 = k1;", vars ), tree, new DeclareVariable<Integer>( "k0" ) {
|
|
|
+ @Override
|
|
|
+ protected Integer value(Memory m) {
|
|
|
+ return (int)m.<Integer>read( "l1", false );
|
|
|
+ }
|
|
|
+ }, alg );
|
|
|
+ ifNode.add( line );
|
|
|
return root;
|
|
|
}
|
|
|
|