|
@@ -12,6 +12,11 @@ import animation.ControlFlow;
|
|
|
import animation.Memory;
|
|
|
import animation.PseudoCodeNode;
|
|
|
import animation.PseudoCodeNode.CodeAction;
|
|
|
+import animation.StackFrame;
|
|
|
+import animation.StackFrame.FrameType;
|
|
|
+import codelines.DeclareVariable;
|
|
|
+import codelines.ForLoop;
|
|
|
+import codelines.FunctionDefinition;
|
|
|
import graph.LayeredGraphEdge;
|
|
|
import graph.LayeredGraphNode;
|
|
|
import lib.TextLayoutHelper;
|
|
@@ -35,46 +40,82 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
@Override
|
|
|
public PseudoCodeNode createPseudocodeTree(JTree tree) {
|
|
|
String vars[] = { "i", "L", "k0", "l", "l1", "k1", "k", "v", "graph" };
|
|
|
- PseudoCodeNode root = new PseudoCodeNode(TextLayoutHelper.setupPseudoCode("mark_conflicts( graph )", vars), tree, new CodeLine() {
|
|
|
-
|
|
|
+ String params[] = { "graph" };
|
|
|
+ PseudoCodeNode root = new PseudoCodeNode(TextLayoutHelper.setupPseudoCode("function mark_conflicts( graph )", vars), tree, new FunctionDefinition( params ), alg );
|
|
|
+ PseudoCodeNode init = new PseudoCodeNode(TextLayoutHelper.setupPseudoCode( "L = graph.getContainedLayers();", vars), tree, new CodeLine() {
|
|
|
@Override
|
|
|
public ControlFlow runForward(Memory m) {
|
|
|
- if( !m.isDefined( "param1", true ) )
|
|
|
+ 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 );
|
|
|
- //m.addFrame();
|
|
|
- LayeredGraphNode param = m.<LayeredGraphNode>read( "param1", true );
|
|
|
- m.undeclare( "param1", true );
|
|
|
- m.declare( "graph", param, false );
|
|
|
- m.declare( "Layers", param.getContainedLayers(), false );
|
|
|
- return new ControlFlow( ControlFlow.STEP_INTO );
|
|
|
+ } );
|
|
|
+ return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
}
|
|
|
}, alg );
|
|
|
- PseudoCodeNode[] lines = new PseudoCodeNode[16];
|
|
|
- lines[ 0 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "for i=1 to |L|-2 do", vars ), tree, new CodeLine() {
|
|
|
-
|
|
|
+ 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 );
|
|
|
+ root.add( outerLoop );
|
|
|
+ PseudoCodeNode line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k0 = 0; l = 0;", vars ), tree, new CodeLine() {
|
|
|
@Override
|
|
|
public ControlFlow runForward(Memory m) {
|
|
|
- // TODO Auto-generated method stub
|
|
|
- return null;
|
|
|
+ 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 );
|
|
|
+ actions.push( (Memory mem) -> {
|
|
|
+ mem.undeclare( "k0", false );
|
|
|
+ mem.undeclare( "l", false );
|
|
|
+ mem.undeclare( "end_", false );
|
|
|
+ mem.undeclare( "0", false );
|
|
|
+ return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
+ } );
|
|
|
+ return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
}
|
|
|
-
|
|
|
}, alg );
|
|
|
- root.add( lines[ 0 ] );
|
|
|
- lines[ 1 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k0 = 0; l = 0;", vars ), tree, new CodeLine() {
|
|
|
-
|
|
|
+ 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 );
|
|
|
+ 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 CodeLine() {
|
|
|
@Override
|
|
|
public ControlFlow runForward(Memory m) {
|
|
|
- // TODO Auto-generated method stub
|
|
|
- return null;
|
|
|
+ if( m.isDefined( "line_" + lineId + "_inside", false ) )
|
|
|
+ {
|
|
|
+ StackFrame old = m.removeFrame();
|
|
|
+ actions.push( (Memory mem) -> {
|
|
|
+ mem.addFrame( old );
|
|
|
+ return new ControlFlow( ControlFlow.STEP_INTO );
|
|
|
+ } );
|
|
|
+ return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if( m.<LayeredGraphNode>read( "graph", false ).getContainedLayers().get( m.<Integer>read( "i", false ) + 1).size() == m.<Integer>read( "l1", false ) ||
|
|
|
+ incidentToInnerSegmentBetweenLiPlusOneAndLi( m ) ) {
|
|
|
+ m.addFrame( new StackFrame( FrameType.LOOP ) );
|
|
|
+ m.declare( "line_" + lineId + "_inside", true, false );
|
|
|
+ actions.push( (Memory mem) -> {
|
|
|
+ mem.removeFrame();
|
|
|
+ return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
+ } );
|
|
|
+ return new ControlFlow( ControlFlow.STEP_INTO );
|
|
|
+ } else {
|
|
|
+ m.declare( "line_" + lineId + "_inside", false, false );
|
|
|
+ actions.push( (Memory mem) -> {
|
|
|
+ mem.undeclare( "line_" + lineId + "_inside", false );
|
|
|
+ return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
+ } );
|
|
|
+ return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
- }, alg);
|
|
|
- lines[ 0 ].add( lines[ 1 ] );
|
|
|
+ }, alg );
|
|
|
+ innerLoop.add( ifNode );
|
|
|
/*
|
|
|
- lines[ 2 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "for l1=0 to |L[i+1]|-1 do", vars ), tree );
|
|
|
- lines[ 0 ].add( lines[ 2 ] );
|
|
|
- lines[ 3 ] = 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 );
|
|
|
- lines[ 2 ].add( lines[ 3 ] );
|
|
|
lines[ 4 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k1 = |L[i]|-1;", vars ), tree );
|
|
|
lines[ 3 ].add( lines[ 4 ] );
|
|
|
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 );
|
|
@@ -95,6 +136,16 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
root.add( lines[ 15 ] );*/
|
|
|
return root;
|
|
|
}
|
|
|
+
|
|
|
+ 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 ) );
|
|
|
+ for (LayeredGraphEdge e : curr.getIncomingEdges()) {
|
|
|
+ if (e.isDummyEdge()) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
|
public String getDebugString() {/*
|