Commit 364204c4 authored by Andrey Filippov's avatar Andrey Filippov

working on conflicts

parent 18261553
...@@ -116,7 +116,12 @@ public class Conflicts { ...@@ -116,7 +116,12 @@ public class Conflicts {
num_ortho_dual += conf.getDualTriOrthoDiagOrthoConflicts(); num_ortho_dual += conf.getDualTriOrthoDiagOrthoConflicts();
num_conflicts += conf.getNumConflicts(); num_conflicts += conf.getNumConflicts();
if (debugLevel > 0){ if (debugLevel > 0){
printConflict("addConflicts() nsTile = "+nsTile+" ", conf); int tilesX = st.tileProcessor.getTilesX();
int superTileSize = st.tileProcessor.getSuperTileSize();
int stilesX = (tilesX + superTileSize -1)/superTileSize;
int ty = nsTile / stilesX;
int tx = nsTile % stilesX;
printConflict("addConflicts() nsTile = "+nsTile+" ["+tx+":"+ty+"] ", conf);
} }
} }
} }
...@@ -137,7 +142,12 @@ public class Conflicts { ...@@ -137,7 +142,12 @@ public class Conflicts {
num_ortho_dual += conf.getDualTriOrthoDiagOrthoConflicts(); num_ortho_dual += conf.getDualTriOrthoDiagOrthoConflicts();
num_conflicts += conf.getNumConflicts(); num_conflicts += conf.getNumConflicts();
if (debugLevel > 0){ if (debugLevel > 0){
printConflict("addConflicts() nsTile = "+nsTile+" ", conf); int tilesX = st.tileProcessor.getTilesX();
int superTileSize = st.tileProcessor.getSuperTileSize();
int stilesX = (tilesX + superTileSize -1)/superTileSize;
int ty = nsTile / stilesX;
int tx = nsTile % stilesX;
printConflict("addConflicts() nsTile = "+nsTile+" ["+tx+":"+ty+"] ", conf);
} }
} }
} }
......
...@@ -2185,6 +2185,7 @@ public class EyesisCorrectionParameters { ...@@ -2185,6 +2185,7 @@ public class EyesisCorrectionParameters {
public double plStarDiag = 0.25; // When calculating cost for the connections scale 4 diagonal neighbors public double plStarDiag = 0.25; // When calculating cost for the connections scale 4 diagonal neighbors
public double plStarPwr = 0.5; // Divide cost by number of connections to this power public double plStarPwr = 0.5; // Divide cost by number of connections to this power
public double plDblTriLoss = 0.0001; // When resolving double triangles allow minor degradation (0.0 - strict) public double plDblTriLoss = 0.0001; // When resolving double triangles allow minor degradation (0.0 - strict)
public boolean plNewConfl = false; // Allow more conflicts if overall cost is reduced
public boolean plMutualOnly = true; // keep only mutual links, remove weakest if conflict public boolean plMutualOnly = true; // keep only mutual links, remove weakest if conflict
public boolean plFillSquares = true; // Add diagonals to full squares public boolean plFillSquares = true; // Add diagonals to full squares
...@@ -2543,6 +2544,7 @@ public class EyesisCorrectionParameters { ...@@ -2543,6 +2544,7 @@ public class EyesisCorrectionParameters {
properties.setProperty(prefix+"plStarDiag", this.plStarDiag +""); properties.setProperty(prefix+"plStarDiag", this.plStarDiag +"");
properties.setProperty(prefix+"plStarPwr", this.plStarPwr +""); properties.setProperty(prefix+"plStarPwr", this.plStarPwr +"");
properties.setProperty(prefix+"plDblTriLoss", this.plDblTriLoss +""); properties.setProperty(prefix+"plDblTriLoss", this.plDblTriLoss +"");
properties.setProperty(prefix+"plNewConfl", this.plNewConfl+"");
properties.setProperty(prefix+"plMutualOnly", this.plMutualOnly+""); properties.setProperty(prefix+"plMutualOnly", this.plMutualOnly+"");
properties.setProperty(prefix+"plFillSquares", this.plFillSquares+""); properties.setProperty(prefix+"plFillSquares", this.plFillSquares+"");
...@@ -2881,6 +2883,7 @@ public class EyesisCorrectionParameters { ...@@ -2881,6 +2883,7 @@ public class EyesisCorrectionParameters {
if (properties.getProperty(prefix+"plStarDiag")!=null) this.plStarDiag=Double.parseDouble(properties.getProperty(prefix+"plStarDiag")); if (properties.getProperty(prefix+"plStarDiag")!=null) this.plStarDiag=Double.parseDouble(properties.getProperty(prefix+"plStarDiag"));
if (properties.getProperty(prefix+"plStarPwr")!=null) this.plStarPwr=Double.parseDouble(properties.getProperty(prefix+"plStarPwr")); if (properties.getProperty(prefix+"plStarPwr")!=null) this.plStarPwr=Double.parseDouble(properties.getProperty(prefix+"plStarPwr"));
if (properties.getProperty(prefix+"plDblTriLoss")!=null) this.plDblTriLoss=Double.parseDouble(properties.getProperty(prefix+"plDblTriLoss")); if (properties.getProperty(prefix+"plDblTriLoss")!=null) this.plDblTriLoss=Double.parseDouble(properties.getProperty(prefix+"plDblTriLoss"));
if (properties.getProperty(prefix+"plNewConfl")!=null) this.plNewConfl=Boolean.parseBoolean(properties.getProperty(prefix+"plNewConfl"));
if (properties.getProperty(prefix+"plMutualOnly")!=null) this.plMutualOnly=Boolean.parseBoolean(properties.getProperty(prefix+"plMutualOnly")); if (properties.getProperty(prefix+"plMutualOnly")!=null) this.plMutualOnly=Boolean.parseBoolean(properties.getProperty(prefix+"plMutualOnly"));
if (properties.getProperty(prefix+"plFillSquares")!=null) this.plFillSquares=Boolean.parseBoolean(properties.getProperty(prefix+"plFillSquares")); if (properties.getProperty(prefix+"plFillSquares")!=null) this.plFillSquares=Boolean.parseBoolean(properties.getProperty(prefix+"plFillSquares"));
...@@ -3247,6 +3250,7 @@ public class EyesisCorrectionParameters { ...@@ -3247,6 +3250,7 @@ public class EyesisCorrectionParameters {
gd.addNumericField("When calculating cost for the connections scale 4 diagonal neighbors", this.plStarDiag, 6); gd.addNumericField("When calculating cost for the connections scale 4 diagonal neighbors", this.plStarDiag, 6);
gd.addNumericField("Divide cost by number of connections to this power", this.plStarPwr, 6); gd.addNumericField("Divide cost by number of connections to this power", this.plStarPwr, 6);
gd.addNumericField("When resolving double triangles allow minor degradation (0.0 - strict)", this.plDblTriLoss, 6); gd.addNumericField("When resolving double triangles allow minor degradation (0.0 - strict)", this.plDblTriLoss, 6);
gd.addCheckbox ("Allow more conflicts if overall cost is reduced", this.plNewConfl);
gd.addCheckbox ("Keep only mutual links, remove weakest if conflict", this.plMutualOnly); gd.addCheckbox ("Keep only mutual links, remove weakest if conflict", this.plMutualOnly);
...@@ -3598,6 +3602,7 @@ public class EyesisCorrectionParameters { ...@@ -3598,6 +3602,7 @@ public class EyesisCorrectionParameters {
this.plStarDiag= gd.getNextNumber(); this.plStarDiag= gd.getNextNumber();
this.plStarPwr= gd.getNextNumber(); this.plStarPwr= gd.getNextNumber();
this.plDblTriLoss= gd.getNextNumber(); this.plDblTriLoss= gd.getNextNumber();
this.plNewConfl= gd.getNextBoolean();
this.plMutualOnly= gd.getNextBoolean(); this.plMutualOnly= gd.getNextBoolean();
......
...@@ -4003,12 +4003,12 @@ public class SuperTiles{ ...@@ -4003,12 +4003,12 @@ public class SuperTiles{
", improvement (negative diff) = "+new_costs_diff_old); ", improvement (negative diff) = "+new_costs_diff_old);
} }
if (debugLevel > -1) { if (debugLevel > 0) { // -1) {
new_conflicts_stats.printConflictSummary( new_conflicts_stats.printConflictSummary(
"Conflicts difference after resolution:", true, true, true); "Conflicts difference after resolution:", true, true, true);
} }
// See if it is good // See if it is good
if (debugLevel > -1) { if (debugLevel > 0) { // -1) {
if (new_conflicts_stats.getNumConflicts() > 0) { if (new_conflicts_stats.getNumConflicts() > 0) {
if (debugLevel > -1) System.out.println("FAILURE: number of conflicts increased"); if (debugLevel > -1) System.out.println("FAILURE: number of conflicts increased");
} else if (new_costs_diff > dblTriLoss){ } else if (new_costs_diff > dblTriLoss){
...@@ -4389,6 +4389,7 @@ public class SuperTiles{ ...@@ -4389,6 +4389,7 @@ public class SuperTiles{
double diagonalWeight, double diagonalWeight,
double starPwr, // Divide cost by number of connections to this power double starPwr, // Divide cost by number of connections to this power
double dblTriLoss, // When resolving double triangles allow minor degradation (0.0 - strict) double dblTriLoss, // When resolving double triangles allow minor degradation (0.0 - strict)
boolean newConfl, // Allow more conflicts if overall cost is reduced
boolean preferDisparity, boolean preferDisparity,
int debugLevel, int debugLevel,
int dbg_X, int dbg_X,
...@@ -4416,11 +4417,12 @@ public class SuperTiles{ ...@@ -4416,11 +4417,12 @@ public class SuperTiles{
conflicts, conflicts,
conflict_stats, // to be updated after applying resolution conflict_stats, // to be updated after applying resolution
// maxEigen, // maximal eigenvalue of planes to consider // maxEigen, // maximal eigenvalue of planes to consider
starSteps, // How far to look around when calculationg connection cost starSteps, // How far to look around when calculating connection cost
orthoWeight, orthoWeight,
diagonalWeight, diagonalWeight,
starPwr, // double starPwr, // Divide cost by number of connections to this power starPwr, // double starPwr, // Divide cost by number of connections to this power
dblTriLoss, // When resolving double triangles allow minor degradation (0.0 - strict) dblTriLoss, // When resolving double triangles allow minor degradation (0.0 - strict)
newConfl, // boolean newConfl, // Allow more conflicts if overall cost is reduced
preferDisparity, preferDisparity,
dl); // debugLevel, dl); // debugLevel,
if (OK) rslt[0]++; if (OK) rslt[0]++;
...@@ -4444,9 +4446,14 @@ public class SuperTiles{ ...@@ -4444,9 +4446,14 @@ public class SuperTiles{
double diagonalWeight, double diagonalWeight,
double starPwr, // Divide cost by number of connections to this power double starPwr, // Divide cost by number of connections to this power
double dblTriLoss, // When resolving double triangles allow minor degradation (0.0 - strict) double dblTriLoss, // When resolving double triangles allow minor degradation (0.0 - strict)
boolean newConfl, // Allow more conflicts if overall cost is reduced
boolean preferDisparity, boolean preferDisparity,
int debugLevel) int debugLevel)
{ {
if (newConfl && (dblTriLoss > 0.0)){
dblTriLoss = 0.0; // require strict reducing of the cost if conflict increase is allowed
}
Conflicts iconflicts = new Conflicts(this); Conflicts iconflicts = new Conflicts(this);
TwoLayerNeighbors twoLayerNeighbors = new TwoLayerNeighbors(); TwoLayerNeighbors twoLayerNeighbors = new TwoLayerNeighbors();
...@@ -4462,8 +4469,11 @@ public class SuperTiles{ ...@@ -4462,8 +4469,11 @@ public class SuperTiles{
} }
} }
twoLayerNeighbors.setLayers(nl1, nl2); twoLayerNeighbors.setLayers(nl1, nl2);
if (debugLevel > 1) {
System.out.println("resolveStarConflict(): nsTile ="+nsTile+" nl1="+nl1+" nl2="+nl2);
}
int [][][][] neibs_vars_dir = twoLayerNeighbors.getNeighborVariants(); int [][][][] neibs_vars_dir = twoLayerNeighbors.getNeighborVariants(debugLevel);
int [] mod_supertiles = {nsTile}; int [] mod_supertiles = {nsTile};
mod_supertiles = getInvolvedSupertiles( // first mod_supertiles.length entries will be mod_supertiles[] mod_supertiles = getInvolvedSupertiles( // first mod_supertiles.length entries will be mod_supertiles[]
...@@ -4481,7 +4491,13 @@ public class SuperTiles{ ...@@ -4481,7 +4491,13 @@ public class SuperTiles{
for (int dir = -1; dir < 8; dir++){ for (int dir = -1; dir < 8; dir++){
int nindx = (dir < 0) ? 8 : dir; int nindx = (dir < 0) ? 8 : dir;
int nt = tnSurface.getNeibIndex(nsTile, dir); int nt = tnSurface.getNeibIndex(nsTile, dir);
int indx = replacement_tiles.get(nt); int indx = -1;
Integer Indx = replacement_tiles.get(nt);
if (Indx == null){
System.out.println("resolveStarConflict(): nsTile = "+nsTile+" nindx="+nindx+" Indx == null ");
} else {
indx = Indx;
}
if (indx >= 0) { if (indx >= 0) {
indexToDir[indx] = nindx; indexToDir[indx] = nindx;
} }
...@@ -4546,7 +4562,7 @@ public class SuperTiles{ ...@@ -4546,7 +4562,7 @@ public class SuperTiles{
double [] variant_costs_diff = new double [neibs_vars.length]; double [] variant_costs_diff = new double [neibs_vars.length];
for (int variant = 0; variant < neibs_vars.length; variant ++){ for (int variant = 0; variant < neibs_vars.length; variant ++){
if (debugLevel > 0) { if (debugLevel > 1) {
System.out.println("resolveStarConflict(): resolving conflict for tile "+nsTile+ System.out.println("resolveStarConflict(): resolving conflict for tile "+nsTile+
", nl1 = "+nl1+ ", nl1 = "+nl1+
", nl2 = "+nl2 + ", nl2 = "+nl2 +
...@@ -4557,12 +4573,11 @@ public class SuperTiles{ ...@@ -4557,12 +4573,11 @@ public class SuperTiles{
neibs_vars[variant], neibs_vars[variant],
debugLevel); debugLevel);
if (debugLevel > -1) { if (debugLevel > 0) {
System.out.println("resolveStarConflict(): resolving conflict for tile "+nsTile+ System.out.println("resolveStarConflict(): resolving conflict for tile "+nsTile+
", nl1 = "+nl1+ ", nl1 = "+nl1+
", nl2 = "+nl2 + ", nl2 = "+nl2 +
", variant = "+variant+" improvement (negative diff) = "+variant_costs_diff[variant]); ", variant = "+variant+" improvement (negative diff) = "+variant_costs_diff[variant]);
} }
...@@ -4579,13 +4594,14 @@ public class SuperTiles{ ...@@ -4579,13 +4594,14 @@ public class SuperTiles{
debugLevel - 1); // debugLevel); debugLevel - 1); // debugLevel);
variant_conflicts_stats[variant].subConflicts(iconflicts); // subtract old number of different types of conflicts variant_conflicts_stats[variant].subConflicts(iconflicts); // subtract old number of different types of conflicts
if (debugLevel > -1) { if (debugLevel > 0) { // -1) {
variant_conflicts_stats[variant].printConflictSummary( variant_conflicts_stats[variant].printConflictSummary(
"Conflicts difference after resolution:", true, true, false); "Conflicts difference after resolution:", true, true, false);
} }
} }
// How to compare? 1 attempt: none of the conflicts get worse, some get better or cost goes down // How to compare? 1 attempt: none of the conflicts get worse, some get better or cost goes down
int best_variant = -1; int best_variant = -1;
int best_ignore_conflicts = -1;
int [][] num_better_worse = new int [neibs_vars.length][2]; int [][] num_better_worse = new int [neibs_vars.length][2];
for (int variant = 0; variant < neibs_vars.length; variant ++){ for (int variant = 0; variant < neibs_vars.length; variant ++){
int num_worse = variant_conflicts_stats[variant].numBetterWorse( int num_worse = variant_conflicts_stats[variant].numBetterWorse(
...@@ -4610,12 +4626,23 @@ public class SuperTiles{ ...@@ -4610,12 +4626,23 @@ public class SuperTiles{
(variant_costs_diff[variant] < variant_costs_diff[best_variant])))){ (variant_costs_diff[variant] < variant_costs_diff[best_variant])))){
best_variant = variant; best_variant = variant;
} }
if ((best_ignore_conflicts <0) || (variant_costs_diff[variant] < variant_costs_diff[best_ignore_conflicts])){
best_ignore_conflicts = variant;
}
} }
if (debugLevel > 1){ if (debugLevel > 1){
System.out.println("resolveStarConflict(): for tile "+nsTile); System.out.println("resolveStarConflict(): for tile "+nsTile);
} }
if ((best_variant < 0) && newConfl && (variant_costs_diff[best_ignore_conflicts] < 0)){ // should be cost improvement
best_variant = best_ignore_conflicts;
if (debugLevel > -1) {
System.out.println("resolveMultiTriangularConflict(): conflicts increase but cost decreases "+nsTile+
", nl1 = "+nl1+
", nl2 = "+nl2 +" of "+ neibs_vars.length+" variants");
}
}
if ((best_variant < 0) || (variant_costs_diff[best_variant] > dblTriLoss)){ if ((best_variant < 0) || (variant_costs_diff[best_variant] > dblTriLoss)){
if (debugLevel > -1) { if (debugLevel > -1) {
System.out.println("resolveMultiTriangularConflict(): FAILED find a sutable solution for tile "+nsTile+ System.out.println("resolveMultiTriangularConflict(): FAILED find a sutable solution for tile "+nsTile+
...@@ -4651,8 +4678,18 @@ public class SuperTiles{ ...@@ -4651,8 +4678,18 @@ public class SuperTiles{
// apply resolution // apply resolution
for (int i = 0; i < mod_supertiles.length; i++){ for (int i = 0; i < mod_supertiles.length; i++){
for (int nl = 0; nl < neibs_vars[best_variant][i].length; nl ++) if (neibs_vars[best_variant][i][nl] != null){ if (debugLevel > 1){
planes[mod_supertiles[i]][nl].setNeibBest(neibs_vars[best_variant][i][nl]); System.out.println("resolveStarConflict(): nsTile = "+nsTile+ "mod_supertiles["+i+"]="+mod_supertiles[i]);
}
if (neibs_vars[best_variant][i] != null) {
for (int nl = 0; nl < neibs_vars[best_variant][i].length; nl ++){
if (debugLevel > 1){
System.out.println("resolveStarConflict(): nl= = "+nl);
}
if (neibs_vars[best_variant][i][nl] != null){
planes[mod_supertiles[i]][nl].setNeibBest(neibs_vars[best_variant][i][nl]);
}
}
} }
} }
} }
...@@ -4919,7 +4956,8 @@ public class SuperTiles{ ...@@ -4919,7 +4956,8 @@ public class SuperTiles{
double diagonalWeight, double diagonalWeight,
double starPwr, // Divide cost by number of connections to this power double starPwr, // Divide cost by number of connections to this power
double dblTriLoss, // When resolving double triangles allow minor degradation (0.0 - strict) double dblTriLoss, // When resolving double triangles allow minor degradation (0.0 - strict)
boolean preferDisparity, boolean newConfl, // Allow more conflicts if overall cost is reduced
boolean preferDisparity,
int debugLevel, int debugLevel,
int dbg_X, int dbg_X,
int dbg_Y) int dbg_Y)
...@@ -4994,6 +5032,7 @@ public class SuperTiles{ ...@@ -4994,6 +5032,7 @@ public class SuperTiles{
diagonalWeight, // double diagonalWeight, diagonalWeight, // double diagonalWeight,
starPwr, // double starPwr, // Divide cost by number of connections to this power starPwr, // double starPwr, // Divide cost by number of connections to this power
dblTriLoss, // double diagonalWeight, dblTriLoss, // double diagonalWeight,
newConfl, // Allow more conflicts if overall cost is reduced
preferDisparity, preferDisparity,
debugLevel, // 1, // final int debugLevel) debugLevel, // 1, // final int debugLevel)
dbg_X, dbg_X,
......
...@@ -3440,6 +3440,7 @@ public class TileProcessor { ...@@ -3440,6 +3440,7 @@ public class TileProcessor {
clt_parameters.plStarDiag, // double diagonalWeight, clt_parameters.plStarDiag, // double diagonalWeight,
clt_parameters.plStarPwr, // double starPwr, // Divide cost by number of connections to this power clt_parameters.plStarPwr, // double starPwr, // Divide cost by number of connections to this power
clt_parameters.plDblTriLoss, // double diagonalWeight, clt_parameters.plDblTriLoss, // double diagonalWeight,
clt_parameters.plNewConfl, // boolean preferDisparity, // Allow more conflicts if overall cost is reduced
clt_parameters.plPreferDisparity, clt_parameters.plPreferDisparity,
1, // final int debugLevel) 1, // final int debugLevel)
clt_parameters.tileX, clt_parameters.tileX,
...@@ -3546,6 +3547,7 @@ public class TileProcessor { ...@@ -3546,6 +3547,7 @@ public class TileProcessor {
clt_parameters.plStarDiag, // double diagonalWeight, clt_parameters.plStarDiag, // double diagonalWeight,
clt_parameters.plStarPwr, // double starPwr, // Divide cost by number of connections to this power clt_parameters.plStarPwr, // double starPwr, // Divide cost by number of connections to this power
clt_parameters.plDblTriLoss, // double diagonalWeight, clt_parameters.plDblTriLoss, // double diagonalWeight,
clt_parameters.plNewConfl, // boolean preferDisparity, // Allow more conflicts if overall cost is reduced
clt_parameters.plPreferDisparity, clt_parameters.plPreferDisparity,
1, // final int debugLevel) 1, // final int debugLevel)
clt_parameters.tileX, clt_parameters.tileX,
......
...@@ -63,7 +63,7 @@ public class TwoLayerNeighbors { ...@@ -63,7 +63,7 @@ public class TwoLayerNeighbors {
int nl2; int nl2;
NeibVariant neibs_init = new NeibVariant(); NeibVariant neibs_init = new NeibVariant();
int [][] layers_around = new int [8][]; int [][] layers_around = new int [8][];
int [] options_around = new int [8]; int [] options_around = new int [8]; // how many tiles are connected to the center at this direction, from one of nl1, nl2
int [][] num_se = new int [PAIRS.length][]; int [][] num_se = new int [PAIRS.length][];
int [][][] conns = new int [PAIRS.length][][]; int [][][] conns = new int [PAIRS.length][][];
int [] selection_star = null; int [] selection_star = null;
...@@ -124,11 +124,15 @@ public class TwoLayerNeighbors { ...@@ -124,11 +124,15 @@ public class TwoLayerNeighbors {
int dir1, int dir1,
int nl1, int nl1,
int dir2, int dir2,
int nl2){ int nl2,
int debugLevel){
int dir12 = getDir2From1(dir1, dir2); int dir12 = getDir2From1(dir1, dir2);
if (dir12 <0){ if (dir12 <0){
throw new IllegalArgumentException ("Invalid connection from "+dir1+" to "+dir2+": resulted in direction 1->2 = "+dir12); throw new IllegalArgumentException ("Invalid connection from "+dir1+" to "+dir2+": resulted in direction 1->2 = "+dir12);
} }
if (debugLevel > 1){
System.out.print(" "+dir1+":"+nl1+"<->"+dir2+":"+nl2);
}
int dir21 = (dir12 + 4) % 8; int dir21 = (dir12 + 4) % 8;
int [][] neibs_start = getNeighbors(dir1); int [][] neibs_start = getNeighbors(dir1);
int [][] neibs_end = getNeighbors(dir2); int [][] neibs_end = getNeighbors(dir2);
...@@ -153,6 +157,34 @@ public class TwoLayerNeighbors { ...@@ -153,6 +157,34 @@ public class TwoLayerNeighbors {
} }
public void diffToOther(NeibVariant other_variant)
{
for (int dir0 = 0; dir0 < neighbors.length; dir0++){
if ((neighbors[dir0] != null) || (other_variant.neighbors[dir0] != null)){
if ((neighbors[dir0] == null) || (other_variant.neighbors[dir0] == null)){
System.out.print(" ["+dir0+"]");
} else {
for (int nl = 0; nl < neighbors[dir0].length; nl++){
if ((neighbors[dir0][nl] != null) || (other_variant.neighbors[dir0][nl] != null)){
if ((neighbors[dir0][nl] == null) || (other_variant.neighbors[dir0][nl] == null)){
System.out.print(" ["+dir0+":"+nl+"]");
} else {
for (int dir = 0; dir < 8; dir++){
if (neighbors[dir0][nl][dir] != other_variant.neighbors[dir0][nl][dir]){
System.out.print(" "+dir0+":"+nl+":"+dir+":("+neighbors[dir0][nl][dir]+"/"+
other_variant.neighbors[dir0][nl][dir]+")");
}
}
}
}
}
}
}
}
System.out.println();
}
} }
/** /**
...@@ -167,12 +199,6 @@ public class TwoLayerNeighbors { ...@@ -167,12 +199,6 @@ public class TwoLayerNeighbors {
} else { } else {
// increment connection variant if possible // increment connection variant if possible
for (int np = 0; np < PAIRS.length; np++){ for (int np = 0; np < PAIRS.length; np++){
// if (
// (num_se[np] == null) ||
// (conns[np] == null)) {
// System.out.println("nextSelection BUG");
// return false;
// }
if ((num_se[np] != null) && (num_se[np][0] == 2) && (num_se[np][1] == 2) && (conns[np] != null) && (conns[np].length == 1)){ if ((num_se[np] != null) && (num_se[np][0] == 2) && (num_se[np][1] == 2) && (conns[np] != null) && (conns[np].length == 1)){
if (selection_conns[np] == 0){ if (selection_conns[np] == 0){
selection_conns[np] = 1; selection_conns[np] = 1;
...@@ -188,7 +214,7 @@ public class TwoLayerNeighbors { ...@@ -188,7 +214,7 @@ public class TwoLayerNeighbors {
selection_conns[i] = 0; selection_conns[i] = 0;
} }
for (int dir = 0; dir < options_around.length; dir++){ for (int dir = 0; dir < options_around.length; dir++){
if ((options_around[dir]>1) && (selection_star[dir] == 0)){ if ((options_around[dir] > 0) && (selection_star[dir] == 0)){ // either 1 or two layers connected - still 2 variants
selection_star[dir] = 1; selection_star[dir] = 1;
for (int dir1 = 0; dir1 < dir; dir1++){ for (int dir1 = 0; dir1 < dir; dir1++){
selection_star[dir1] = 0; selection_star[dir1] = 0;
...@@ -205,9 +231,9 @@ public class TwoLayerNeighbors { ...@@ -205,9 +231,9 @@ public class TwoLayerNeighbors {
* @return neibVariant instance fro the current selection or null if the * @return neibVariant instance fro the current selection or null if the
* selection leads to conflicts * selection leads to conflicts
*/ */
public NeibVariant generateVariant() public NeibVariant generateVariant(int debugLevel)
{ {
// verify all connetions are possible // verify all connections are possible
for (int np = 0; np < PAIRS.length; np++) if (conns[np] != null){ for (int np = 0; np < PAIRS.length; np++) if (conns[np] != null){
// single connection for a single variant for start and end - either match or not // single connection for a single variant for start and end - either match or not
if ((num_se[np] != null) && (conns[np].length == 1) && (num_se[np][0] == 1) && (num_se[np][1] == 1)){ if ((num_se[np] != null) && (conns[np].length == 1) && (num_se[np][0] == 1) && (num_se[np][1] == 1)){
...@@ -222,17 +248,31 @@ public class TwoLayerNeighbors { ...@@ -222,17 +248,31 @@ public class TwoLayerNeighbors {
NeibVariant variant = neibs_init.clone(); NeibVariant variant = neibs_init.clone();
// set connections for the center // set connections for the center
if (debugLevel > 1){
System.out.print("center connections:");
}
for (int dir = 0; dir < 8; dir++) if (options_around[dir] > 0){ for (int dir = 0; dir < 8; dir++) if (options_around[dir] > 0){
// make a first connection, if there are two - other will be created simultaneously // make a first connection, if there are two - other will be created simultaneously
variant.connect( variant.connect(
-1, // int dir1, -1, // int dir1,
((selection_star[dir] > 0) ? nl2 : nl1), // int nl1, ((selection_star[dir] > 0) ? nl2 : nl1), // int nl1,
dir, // int dir2, dir, // int dir2,
layers_around[dir][0]); // int nl2); layers_around[dir][0], // int nl2);
debugLevel);
}
if (debugLevel > 1){
System.out.println();
} }
if (debugLevel > 1){
System.out.print("other connections:");
}
// set all other connections // set all other connections
for (int np = 0; np < PAIRS.length; np++) if (conns[np] != null){ for (int np = 0; np < PAIRS.length; np++) if (conns[np] != null){
if (debugLevel > 1){
System.out.print(" {"+np+"}");
}
int start_dir = PAIRS[np][0]; int start_dir = PAIRS[np][0];
int end_dir = PAIRS[np][1]; int end_dir = PAIRS[np][1];
boolean swap = (selection_star[start_dir] != selection_star[end_dir]) ^ (selection_conns[np] > 0); boolean swap = (selection_star[start_dir] != selection_star[end_dir]) ^ (selection_conns[np] > 0);
...@@ -248,21 +288,39 @@ public class TwoLayerNeighbors { ...@@ -248,21 +288,39 @@ public class TwoLayerNeighbors {
start_dir, // int dir1, start_dir, // int dir1,
layers_around[start_dir][opts[0]], // int nl1, layers_around[start_dir][opts[0]], // int nl1,
end_dir, // int dir2, end_dir, // int dir2,
layers_around[end_dir][opts[1]]); // int nl2); layers_around[end_dir][opts[1]], // int nl2);
return variant; debugLevel);
} }
return null; if (debugLevel > 1){
System.out.println();
}
return variant;
} }
public int [][][][] getNeighborVariants() public int [][][][] getNeighborVariants()
{
return getNeighborVariants(0);
}
public int [][][][] getNeighborVariants(int debugLevel)
{ {
ArrayList<NeibVariant> variant_list = new ArrayList<NeibVariant>(); ArrayList<NeibVariant> variant_list = new ArrayList<NeibVariant>();
while (nextSelection()){ while (nextSelection()){
NeibVariant variant = generateVariant(); NeibVariant variant = generateVariant(debugLevel);
if (variant != null){ if (variant != null){
variant_list.add(variant); variant_list.add(variant);
if (debugLevel > 0){
System.out.print("getNeighborVariants() "+(variant_list.size()-1)+": [");
for (int i = 0; i < selection_star.length; i++){
System.out.print(selection_star[i]);
}
System.out.print("] [");
for (int i = 0; i < selection_conns.length; i++){
System.out.print(selection_conns[i]);
}
System.out.print("]: ");
variant.diffToOther(neibs_init);
}
} }
} }
int [][][][] variants = new int [variant_list.size()][][][]; int [][][][] variants = new int [variant_list.size()][][][];
int indx = 0; int indx = 0;
...@@ -327,7 +385,7 @@ public class TwoLayerNeighbors { ...@@ -327,7 +385,7 @@ public class TwoLayerNeighbors {
public void setLayers(int nl1, int nl2) public void setLayers(int nl1, int nl2)
{ {
this.nl1 = nl1; this.nl1 = nl1;
this.nl2 = nl1; this.nl2 = nl2;
layers_around = new int [8][]; layers_around = new int [8][];
options_around = new int [8]; options_around = new int [8];
int [][] neighbors_center = neibs_init.getNeighbors(-1); int [][] neighbors_center = neibs_init.getNeighbors(-1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment