浏览代码

conflikt detection fertig

Kolja Strohm 6 年之前
父节点
当前提交
ae876c1632
共有 4 个文件被更改,包括 105 次插入38 次删除
  1. 1 1
      src/bk/BKNodePlacement.java
  2. 82 27
      src/bk/ConflictDetection.java
  3. 10 10
      src/codelines/ForLoop.java
  4. 12 0
      src/codelines/Kommentar.java

+ 1 - 1
src/bk/BKNodePlacement.java

@@ -64,7 +64,7 @@ public class BKNodePlacement extends AnimatedAlgorithm {
     {
     	String[] vars = { "graph" };
     	PseudoCodeNode mainFunction = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode("function bkNodePlacement( graph )", vars ), tree, new FunctionDefinition( new String[]{"graph"} ), this );
-    	root = new PseudoCodeNode( TextLayoutHelper.setupPseudoCodeStage("BK Node Placement Algorithm" ), tree, new CodeLine() {
+    	root = new PseudoCodeNode( TextLayoutHelper.setupPseudoCodeStage("-- BK Node Placement Algorithm --" ), tree, new CodeLine() {
 
 			@Override
 			public ControlFlow runForward(Memory m) {

+ 82 - 27
src/bk/ConflictDetection.java

@@ -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;
     }
     

+ 10 - 10
src/codelines/ForLoop.java

@@ -6,17 +6,13 @@ import animation.Memory;
 import animation.StackFrame;
 import animation.StackFrame.FrameType;
 
-public class ForLoop extends CodeLine {
+public abstract class ForLoop extends CodeLine {
 
 	String loopVar;
-	private String start;
-	private String end;
 	
-	public ForLoop( String varName, String start, String end )
+	public ForLoop( String varName )
 	{
 		this.loopVar = varName;
-		this.start = start;
-		this.end = end;
 	}
 	
 	@Override
@@ -24,10 +20,10 @@ public class ForLoop extends CodeLine {
 		boolean declared = false; // prove if it is the first step in the loop
 		if( !m.isSomewhereDefined( "line_" + lineId + "_index", false ) )
 		{ // first loop step
-			m.declare( "line_" + lineId + "_index", (int)m.<Integer>read( start, false ), false );
+			m.declare( "line_" + lineId + "_index", minimum( m ), false );
 			declared = true;
 		}
-		if( m.<Integer>read( "line_" + lineId + "_index", false ) > m.<Integer>read( end, false ) ) // prove if the loop has finished
+		if( m.<Integer>read( "line_" + lineId + "_index", false ) > maximum( m ) ) // prove if the loop has finished
 		{
 			m.undeclare( "line_" + lineId + "_index", false );
 			actions.push( (Memory mem) -> {
@@ -38,7 +34,7 @@ public class ForLoop extends CodeLine {
 		if( declared )
 		{
 			m.addFrame( new StackFrame( FrameType.LOOP ) );
-			m.declare( loopVar, (int)m.<Integer>read( start, false ), false ); // set loop variable
+			m.declare( loopVar, minimum( m ), false ); // set loop variable
 			actions.push( (Memory mem) -> {
 				mem.removeFrame();
 				mem.undeclare( "line_" + lineId + "_index", false );
@@ -49,7 +45,7 @@ public class ForLoop extends CodeLine {
 		{
 			int oldIndex = m.<Integer>read( "line_" + lineId + "_index", false );
 			m.write( "line_" + lineId + "_index", oldIndex + 1, false ); // count index down
-			if( m.<Integer>read( "line_" + lineId + "_index", false ) > m.<Integer>read( end, false ) ) // prove if loop was finished
+			if( m.<Integer>read( "line_" + lineId + "_index", false ) > maximum( m ) ) // prove if loop was finished
 			{
 				StackFrame sf = m.removeFrame(); // remove loop stack
 				m.undeclare( "line_" + lineId + "_index", false );
@@ -72,4 +68,8 @@ public class ForLoop extends CodeLine {
 		}
 		return new ControlFlow( ControlFlow.STEP_INTO );
 	}
+	
+	abstract protected int minimum( Memory m );
+	
+	abstract protected int maximum( Memory m );
 }

+ 12 - 0
src/codelines/Kommentar.java

@@ -0,0 +1,12 @@
+package codelines;
+
+import animation.CodeLine;
+import animation.ControlFlow;
+import animation.Memory;
+
+public class Kommentar extends CodeLine{
+	@Override
+	public ControlFlow runForward(Memory m) {
+		return new ControlFlow( ControlFlow.STEP_OVER ); // just do nothing
+	}
+}