|
@@ -31,8 +31,8 @@ public class Compaction implements AlgorithmStage{
|
|
|
private LayeredGraphNode graph;
|
|
|
private int vIndex;
|
|
|
|
|
|
- private ArrayList< StackFrame > stack;
|
|
|
- private ArrayList< BackwardAction > actions;
|
|
|
+ private ArrayList< StackFrame > stack;
|
|
|
+ private ArrayList< BackwardAction > actions;
|
|
|
private LayoutType layout;
|
|
|
|
|
|
public Compaction( LayeredGraphNode graph, LayoutType layout )
|
|
@@ -40,7 +40,7 @@ public class Compaction implements AlgorithmStage{
|
|
|
this.layout = layout;
|
|
|
this.graph = graph;
|
|
|
state = CompactionState.PLACE_BLOCKS;
|
|
|
- stack = new ArrayList<>();
|
|
|
+ stack = new ArrayList<>();
|
|
|
vIndex = 0;
|
|
|
actions = new ArrayList<>();
|
|
|
}
|
|
@@ -69,13 +69,15 @@ public class Compaction implements AlgorithmStage{
|
|
|
@Override
|
|
|
public StageStatus forwardStep() {
|
|
|
int acSize = actions.size();
|
|
|
- if( state == CompactionState.PLACE_BLOCKS )
|
|
|
+ if( state == CompactionState.PLACE_BLOCKS )
|
|
|
{
|
|
|
- if( stack.size() == 0 )
|
|
|
+ if( stack.size() == 0 )
|
|
|
{
|
|
|
ArrayList< LayeredGraphNode > nodes = graph.getContainedNodes();
|
|
|
- boolean found = false;
|
|
|
- int oldVIndex = vIndex;
|
|
|
+ boolean found = false;
|
|
|
+ int oldVIndex = vIndex;
|
|
|
+
|
|
|
+
|
|
|
for( ; vIndex < nodes.size(); vIndex++ )
|
|
|
{
|
|
|
if( getNodeFromIndex( vIndex ).isXUndefined( layout ) && getNodeFromIndex( vIndex ) == getNodeFromIndex( vIndex ).getRoot( layout ) )
|
|
@@ -84,8 +86,11 @@ public class Compaction implements AlgorithmStage{
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
if( !found )
|
|
|
{
|
|
|
+
|
|
|
state = CompactionState.APPLY_SHIFT;
|
|
|
vIndex = 0;
|
|
|
actions.add( 0, ()-> {
|
|
@@ -93,16 +98,18 @@ public class Compaction implements AlgorithmStage{
|
|
|
state = CompactionState.PLACE_BLOCKS;
|
|
|
} );
|
|
|
}
|
|
|
- else
|
|
|
+ else
|
|
|
{
|
|
|
- StackFrame f = new StackFrame();
|
|
|
+ StackFrame f = new StackFrame();
|
|
|
f.v = getNodeFromIndex( vIndex );
|
|
|
- double oldX = f.v.getX( layout );
|
|
|
+ double oldX = f.v.getX( layout );
|
|
|
f.v.setX( 0, true, layout );
|
|
|
- f.v.setSelected( layout );
|
|
|
+ f.v.setSelected( layout );
|
|
|
f.w = f.v;
|
|
|
System.out.println( "call place_block( " + f.v + " )" );
|
|
|
stack.add( 0, f );
|
|
|
+
|
|
|
+
|
|
|
actions.add( 0, ()-> {
|
|
|
stack.get( 0 ).v.setX( oldX, false, layout );
|
|
|
stack.get( 0 ).v.setSelected( layout );
|
|
@@ -112,25 +119,29 @@ public class Compaction implements AlgorithmStage{
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
- else
|
|
|
+ else
|
|
|
{
|
|
|
StackFrame sf = stack.get( 0 );
|
|
|
- if( sf.u == null )
|
|
|
+ if( sf.u == null )
|
|
|
{
|
|
|
- int posW = graph.getContainedLayers().get( sf.w.getLayer() ).indexOf( sf.w );
|
|
|
- if( posW >= 1 )
|
|
|
+ int posW = graph.getContainedLayers().get( sf.w.getLayer() ).indexOf( sf.w );
|
|
|
+ if( posW >= 1 )
|
|
|
{
|
|
|
- sf.u = graph.getContainedLayers().get( sf.w.getLayer() ).get( posW - 1 ).getRoot( layout );
|
|
|
- if( sf.u.isXUndefined( layout ) )
|
|
|
- {
|
|
|
- StackFrame nsf = new StackFrame();
|
|
|
+
|
|
|
+ sf.u = graph.getContainedLayers().get( sf.w.getLayer() ).get( posW - 1 ).getRoot( layout );
|
|
|
+
|
|
|
+ if( sf.u.isXUndefined( layout ) )
|
|
|
+ {
|
|
|
+ StackFrame nsf = new StackFrame();
|
|
|
nsf.v = sf.u;
|
|
|
- double oldX = nsf.v.getX( layout );
|
|
|
+ double oldX = nsf.v.getX( layout );
|
|
|
nsf.v.setX( 0, true, layout );
|
|
|
- nsf.v.setSelected( layout );
|
|
|
+ nsf.v.setSelected( layout );
|
|
|
nsf.w = nsf.v;
|
|
|
System.out.println( "call place_block( " + nsf.v + " )" );
|
|
|
stack.add( 0, nsf );
|
|
|
+
|
|
|
+
|
|
|
actions.add( 0, ()-> {
|
|
|
stack.get( 0 ).v.setX( oldX, false, layout );
|
|
|
stack.get( 0 ).v.setSelected( layout );
|
|
@@ -138,22 +149,23 @@ public class Compaction implements AlgorithmStage{
|
|
|
stack.get( 0 ).u = null;
|
|
|
});
|
|
|
}
|
|
|
- else
|
|
|
+ else
|
|
|
{
|
|
|
- sf.u.setSelected( layout );
|
|
|
+
|
|
|
+ sf.u.setSelected( layout );
|
|
|
actions.add( 0, ()-> {
|
|
|
stack.get( 0 ).u = null;
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
+ else
|
|
|
+ {
|
|
|
LayeredGraphNode oldW = sf.w;
|
|
|
sf.v.setSelected( layout );
|
|
|
sf.w = sf.w.getAlignedTo( layout );
|
|
|
- if( sf.w == sf.v )
|
|
|
- {
|
|
|
- System.out.println( "return place_block( " + sf.v + " )" );
|
|
|
+ if( sf.w == sf.v )
|
|
|
+ {
|
|
|
+ System.out.println( "return place_block( " + sf.v + " )" );
|
|
|
stack.remove( 0 );
|
|
|
actions.add( 0, ()-> {
|
|
|
stack.add( 0, sf );
|
|
@@ -162,7 +174,7 @@ public class Compaction implements AlgorithmStage{
|
|
|
});
|
|
|
}
|
|
|
else
|
|
|
- {
|
|
|
+ {
|
|
|
actions.add( 0, ()-> {
|
|
|
sf.w = oldW;
|
|
|
sf.v.setSelected( layout );
|
|
@@ -170,27 +182,40 @@ public class Compaction implements AlgorithmStage{
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- else
|
|
|
+ else
|
|
|
{
|
|
|
- LayeredGraphNode oldSink = sf.v.getSink( layout );
|
|
|
+
|
|
|
+ LayeredGraphNode oldSink = sf.v.getSink( layout );
|
|
|
LayeredGraphNode sinkOfU = sf.u.getSink( layout );
|
|
|
double oldShift = sinkOfU.getShift( layout );
|
|
|
double oldX = sf.v.getX( layout );
|
|
|
boolean oldDef = !sf.v.isXUndefined( layout );
|
|
|
+
|
|
|
+
|
|
|
sf.v.setSelected( layout );
|
|
|
- if( sf.v.getSink( layout ) == sf.v )
|
|
|
- sf.v.setSink( sf.u.getSink( layout ), layout );
|
|
|
- if( sf.v.getSink( layout ) != sf.u.getSink( layout ) )
|
|
|
- sf.u.getSink( layout ).setShift( Math.min( sf.u.getSink( layout ).getShift( layout ), sf.v.getX( layout ) - sf.u.getX( layout ) - calcSpacing() ), layout );
|
|
|
+
|
|
|
+ if( sf.v.getSink( layout ) == sf.v )
|
|
|
+ sf.v.setSink( sf.u.getSink( layout ), layout );
|
|
|
+
|
|
|
+ if( sf.v.getSink( layout ) != sf.u.getSink( layout ) )
|
|
|
+ sf.u.getSink( layout ).setShift(
|
|
|
+ Math.min( sf.u.getSink( layout ).getShift( layout ),
|
|
|
+ sf.v.getX( layout ) - sf.u.getX( layout ) - calcSpacing() ), layout );
|
|
|
else
|
|
|
+
|
|
|
sf.v.setX( Math.max( sf.v.getX( layout ), sf.u.getX( layout ) + calcSpacing() ), true, layout );
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
LayeredGraphNode oldW = sf.w;
|
|
|
- sf.w = sf.w.getAlignedTo( layout );
|
|
|
- LayeredGraphNode oldU = sf.u;
|
|
|
- sf.u = null;
|
|
|
- if( sf.w == sf.v )
|
|
|
- {
|
|
|
- System.out.println( "return place_block( " + sf.v + " )" );
|
|
|
+ LayeredGraphNode oldU = sf.u;
|
|
|
+
|
|
|
+ sf.w = sf.w.getAlignedTo( layout );
|
|
|
+ sf.u = null;
|
|
|
+
|
|
|
+ if( sf.w == sf.v )
|
|
|
+ {
|
|
|
+ System.out.println( "return place_block( " + sf.v + " )" );
|
|
|
stack.remove( 0 );
|
|
|
actions.add( 0, ()-> {
|
|
|
stack.add( 0, sf );
|
|
@@ -203,7 +228,7 @@ public class Compaction implements AlgorithmStage{
|
|
|
});
|
|
|
}
|
|
|
else
|
|
|
- {
|
|
|
+ {
|
|
|
actions.add( 0, ()-> {
|
|
|
stack.get( 0 ).v.setSink( oldSink, layout );
|
|
|
sinkOfU.setShift( oldShift, layout );
|