浏览代码

conflict detection selectiert nodes

Kolja Strohm 6 年之前
父节点
当前提交
dcf7144a28

+ 2 - 3
src/animation/Memory.java

@@ -75,18 +75,17 @@ public class Memory {
         }
     }
     
-    public boolean isSomewhereDefined( String name, boolean global, int maxDepth )
+    public boolean isSomewhereDefined( String name, boolean global )
     {
     	if( global )
     		return this.global.isDefined( name );
     	int index = stack.size() - 1;
-    	while( index >= 0 && maxDepth >= 0 ) {
+    	while( index >= 0 ) {
     	   StackFrame stackF = stack.get( index-- );
     	   if( stackF.isDefined( name ) )
     		   return true;
     	   if( stackF.getType() == FrameType.FUNCTION )
     		   break;
-    	   maxDepth--;
     	}
     	return false;
     }

+ 20 - 0
src/animation/PseudoCodeNode.java

@@ -245,19 +245,23 @@ public class PseudoCodeNode extends DefaultMutableTreeNode {
 	                switch( stepInto( m ) )
 	                {
 					case BREAKPOINT:
+					    hiddenActionWithoutSideEffects( m );
 						return CodeStatus.BREAKPOINT;
 					case FINISHED:
 						currentCodeLine = -1;
 	                    switch( setSelected( true ) )
 	                    {
 						case SKIP:
+	                        hiddenActionWithoutSideEffects( m );
 							return forwardStepOverIntern( m );
 						case STOP:
+	                        hiddenActionWithoutSideEffects( m );
 							return CodeStatus.BREAKPOINT;
 						default:
 							break;
 	                    }
 					case UNFINISHED:
+                        hiddenActionWithoutSideEffects( m );
 						return CodeStatus.UNFINISHED;
 	                }
 	            case ControlFlow.STEP_OVER:
@@ -268,6 +272,7 @@ public class PseudoCodeNode extends DefaultMutableTreeNode {
 	                	m.removeFrame(); // remove the stack frame
 	                	setSelected( false );
 	            	}
+                    hiddenActionWithoutSideEffects( m );
 	                return CodeStatus.FINISHED;
 	            case ControlFlow.CALL:
 	    			alg.addActiveFunction( cf.getFunction() );
@@ -282,22 +287,27 @@ public class PseudoCodeNode extends DefaultMutableTreeNode {
 						switch( cf.getFunction().forwardStepOverIntern( m ) )
 	        			{
 						case BREAKPOINT:
+	                        hiddenActionWithoutSideEffects( m );
 							return CodeStatus.BREAKPOINT;
 						case FINISHED:
 							setSelected( true );
 						case UNFINISHED:
+	                        hiddenActionWithoutSideEffects( m );
 							return CodeStatus.UNFINISHED;
 	        			}
 						break;
 					case STOP:
+                        hiddenActionWithoutSideEffects( m );
 						return CodeStatus.BREAKPOINT;
 	    			}
+                    hiddenActionWithoutSideEffects( m );
 	    			return CodeStatus.UNFINISHED;
 	            }
 			}
 			else
 			{
 				m.undeclare( "node_" + nodeId + "_call", false );
+                hiddenActionWithoutSideEffects( m );
 				return CodeStatus.FINISHED;
 			}
         }
@@ -310,6 +320,7 @@ public class PseudoCodeNode extends DefaultMutableTreeNode {
             switch( ( (PseudoCodeNode)children.get( currentCodeLine ) ).forwardStep( m ) )
             {
             case BREAKPOINT:
+                hiddenActionWithoutSideEffects( m );
                 return CodeStatus.BREAKPOINT;
             case FINISHED:
                 ( (PseudoCodeNode)children.get( currentCodeLine ) ).setSelected( false );
@@ -320,8 +331,10 @@ public class PseudoCodeNode extends DefaultMutableTreeNode {
                     switch( setSelected( true ) )
                     {
 					case SKIP:
+                        hiddenActionWithoutSideEffects( m );
 						return forwardStepOverIntern( m );
 					case STOP:
+                        hiddenActionWithoutSideEffects( m );
 						return CodeStatus.BREAKPOINT;
 					default:
 						break;
@@ -337,19 +350,24 @@ public class PseudoCodeNode extends DefaultMutableTreeNode {
                         switch( setSelected( true ) )
                         {
     					case SKIP:
+                            hiddenActionWithoutSideEffects( m );
     						return forwardStepOverIntern( m );
     					case STOP:
+                            hiddenActionWithoutSideEffects( m );
     						return CodeStatus.BREAKPOINT;
     					default:
     						break;
                         }
                     }
+                    hiddenActionWithoutSideEffects( m );
                     return status;
                 }
             case UNFINISHED:
+                hiddenActionWithoutSideEffects( m );
                 return CodeStatus.UNFINISHED;
             }
         }
+        hiddenActionWithoutSideEffects( m );
         return CodeStatus.UNFINISHED;
     }
     
@@ -471,4 +489,6 @@ public class PseudoCodeNode extends DefaultMutableTreeNode {
             return ((PseudoCodeNode)parent).backwardStepOver( m );
         return backwardStepOutIntern( m );
     }
+    
+    protected void hiddenActionWithoutSideEffects( Memory m ) {}
 }

+ 5 - 0
src/bk/BKNodePlacement.java

@@ -56,6 +56,11 @@ public class BKNodePlacement extends AnimatedAlgorithm {
     {
         return state;
     }
+    
+    public void setState( State s )
+    {
+        state = s;
+    }
 
     @Override
     public PseudoCodeNode createPseudocodeTree( JTree tree )

+ 39 - 6
src/bk/ConflictDetection.java

@@ -11,6 +11,7 @@ import animation.CodeLine;
 import animation.ControlFlow;
 import animation.Memory;
 import animation.PseudoCodeNode;
+import bk.BKNodePlacement.State;
 import bk.ExtremalLayoutCalc.LayoutType;
 import codelines.DeclareVariable;
 import codelines.ForEachLoop;
@@ -40,26 +41,58 @@ public class ConflictDetection implements AlgorithmStage {
 
     @Override
     public PseudoCodeNode createPseudocodeTree(JTree tree) {
-        String vars[] = { "i", "L", "k0", "l", "l1", "k1", "k", "v", "graph" };
+        String vars[] = { "i", "L", "k0", "l", "l1", "k1", "k", "v", "graph", "n" };
         String params[] = { "graph" };
-        PseudoCodeNode root = new PseudoCodeNode(TextLayoutHelper.setupPseudoCode("function mark_conflicts( graph )", vars), tree, new FunctionDefinition( params ), alg );
+        @SuppressWarnings("serial")
+        PseudoCodeNode root = new PseudoCodeNode(TextLayoutHelper.setupPseudoCode("function mark_conflicts( graph )", vars), tree, new FunctionDefinition( params ), alg ) {
+            @Override
+            protected void hiddenActionWithoutSideEffects( Memory m )
+            {
+                ((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( "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", 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", 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", 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 ) )
+                {
+                    m.<LayeredGraphNode>read( "n", false ).setSelected( null );
+                }
+            }
+        };
         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" ) {
+        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();
 			}
         }, alg );
         root.add( foreach );
-        PseudoCodeNode ifNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if v has subgraph then", vars ), tree, new IfLoop() {
+        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( "v", false ).getContainedLayers().size() > 0;
+				return m.<LayeredGraphNode>read( "n", 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 );
+        PseudoCodeNode call = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "call mark_conflicts( n );", vars ), tree, new FunctionCall( root, new String[]{ "n" } ), alg );
         ifNode.add( call );
         text = new PseudoCodeNode(TextLayoutHelper.setupPseudoCodeStage( "-- mark conflicts in graph --" ), tree, new Kommentar(), alg );
         root.add( text );

+ 1 - 1
src/codelines/BackwardForEachLoop.java

@@ -22,7 +22,7 @@ public class BackwardForEachLoop <T> extends CodeLine {
 	@Override
 	public ControlFlow runForward(Memory m) {
 		boolean declared = false; // prove if it is the first step in the loop
-		if( !m.isSomewhereDefined( "line_" + lineId + "_index", false, 1 ) )
+		if( !m.isSomewhereDefined( "line_" + lineId + "_index", false ) )
 		{ // first loop step
 			m.declare( "line_" + lineId + "_index", m.<List<T>>read( listVar, false ).size() - 1, false );
 			declared = true;

+ 1 - 1
src/codelines/ForEachLoop.java

@@ -20,7 +20,7 @@ public abstract class ForEachLoop <T> extends CodeLine {
 	@Override
 	public ControlFlow runForward(Memory m) {
 		boolean declared = false; // prove if it is the first step in the loop
-		if( !m.isSomewhereDefined( "line_" + lineId + "_index", false, 1 ) )
+		if( !m.isSomewhereDefined( "line_" + lineId + "_index", false ) )
 		{ // first loop step
 			m.declare( "line_" + lineId + "_index", 0, false );
 			declared = true;

+ 1 - 1
src/codelines/ForLoop.java

@@ -18,7 +18,7 @@ public abstract class ForLoop extends CodeLine {
 	@Override
 	public ControlFlow runForward(Memory m) {
 		boolean declared = false; // prove if it is the first step in the loop
-		if( !m.isSomewhereDefined( "line_" + lineId + "_index", false, 1 ) )
+		if( !m.isSomewhereDefined( "line_" + lineId + "_index", false ) )
 		{ // first loop step
 			m.declare( "line_" + lineId + "_index", minimum( m ), false );
 			declared = true;

+ 0 - 1
src/codelines/FunctionDefinition.java

@@ -54,5 +54,4 @@ public class FunctionDefinition extends CodeLine {
 			return new ControlFlow( ControlFlow.STEP_OVER ); // return
 		}
 	}
-
 }

+ 1 - 1
src/codelines/WhileLoop.java

@@ -11,7 +11,7 @@ public abstract class WhileLoop extends CodeLine {
 	@Override
 	public ControlFlow runForward(Memory m) {
 		boolean declared = false; // prove if it is the first step in the loop
-		if( !m.isSomewhereDefined( "line_" + lineId + "_index", false, 1 ) )
+		if( !m.isSomewhereDefined( "line_" + lineId + "_index", false ) )
 		{ // first loop step
 			m.declare( "line_" + lineId + "_index", 0, false );
 			declared = true;