This is an automated email from the git hooks/post-receive script. sebastic-guest pushed a commit to branch master in repository mkgmap-splitter.
commit 59c34c55fd6db8e9b00318ed9f3bc9524a9a4fdd Author: Bas Couwenberg <sebas...@xs4all.nl> Date: Fri Jan 9 16:52:47 2015 +0100 Imported Upstream version 0.0.0+svn418 --- resources/splitter-version.properties | 4 +- .../osmosis/core/OsmosisRuntimeException.java | 8 +- src/uk/me/parabola/splitter/Main.java | 5 ++ src/uk/me/parabola/splitter/Solution.java | 21 +++-- .../parabola/splitter/SplittableDensityArea.java | 94 ++++++++-------------- 5 files changed, 61 insertions(+), 71 deletions(-) diff --git a/resources/splitter-version.properties b/resources/splitter-version.properties index 9107c3d..a01dfa8 100644 --- a/resources/splitter-version.properties +++ b/resources/splitter-version.properties @@ -1,2 +1,2 @@ -svn.version: 416 -build.timestamp: 2014-12-01T15:25:48+0000 +svn.version: 418 +build.timestamp: 2015-01-08T09:10:44+0000 diff --git a/src/org/openstreetmap/osmosis/core/OsmosisRuntimeException.java b/src/org/openstreetmap/osmosis/core/OsmosisRuntimeException.java index e00244f..c121654 100644 --- a/src/org/openstreetmap/osmosis/core/OsmosisRuntimeException.java +++ b/src/org/openstreetmap/osmosis/core/OsmosisRuntimeException.java @@ -1,7 +1,7 @@ -// License: GPL. Copyright 2007-2008 by Brett Henderson and other contributors. -package org.openstreetmap.osmosis.core; - - +// This software is released into the Public Domain. See copying.txt for details. +package org.openstreetmap.osmosis.core; + + /** * The root of the unchecked exception hierarchy for the application. All typed * runtime exceptions subclass this exception. diff --git a/src/uk/me/parabola/splitter/Main.java b/src/uk/me/parabola/splitter/Main.java index 012f11a..fe4b9aa 100644 --- a/src/uk/me/parabola/splitter/Main.java +++ b/src/uk/me/parabola/splitter/Main.java @@ -366,6 +366,11 @@ public class Main { System.err.println("The --mapid parameter must have less than 9 digits. Resetting to " + mapId + "."); } maxNodes = params.getMaxNodes(); + if (maxNodes < 10000){ + System.err.println("Error: Invalid number "+ params.getMaxNodes() + + ". The --max-nodes parameter must be an integer value of 10000 or higher."); + throw new IllegalArgumentException(); + } String numTilesParm = params.getNumTiles(); if (numTilesParm != null){ try{ diff --git a/src/uk/me/parabola/splitter/Solution.java b/src/uk/me/parabola/splitter/Solution.java index 4b71701..7956d39 100644 --- a/src/uk/me/parabola/splitter/Solution.java +++ b/src/uk/me/parabola/splitter/Solution.java @@ -58,7 +58,6 @@ class Solution { /** * Combine this solution with the other. * @param other - * @param mergeAtDepth */ public void merge(Solution other){ if (other.tiles.isEmpty()) @@ -111,12 +110,24 @@ class Solution { if (isNice() != other.isNice()) return isNice() ? -1 : 1; -// if (depth != other.depth) -// return (depth < other.depth) ? -1 : 1; - if (worstMinNodes != other.worstMinNodes) - return (worstMinNodes > other.worstMinNodes) ? -1 : 1; + if (worstMinNodes != other.worstMinNodes){ + // ignore minNodes when both are bad + if (Math.max(worstMinNodes, other.worstMinNodes) > 1000) + return (worstMinNodes > other.worstMinNodes) ? -1 : 1; + } + // if aspect ratio is very different and tile sizes are almost equal, + // favour better aspect ratio + double tileRatio = (double) tiles.size() / other.tiles.size(); + double arRatio = worstAspectRatio / other.worstAspectRatio; + if (tileRatio < 1 && tileRatio > 0.99 && arRatio > 1.5) + return 1; + if (tileRatio < 1.01 && tileRatio > 1 && arRatio < 0.66666) + return -1; + if (tiles.size() != other.tiles.size()) return tiles.size() < other.tiles.size() ? -1 : 1; + if (worstAspectRatio != other.worstAspectRatio) + return worstAspectRatio < other.worstAspectRatio ? -1 : 1; return 0; } diff --git a/src/uk/me/parabola/splitter/SplittableDensityArea.java b/src/uk/me/parabola/splitter/SplittableDensityArea.java index 3ab6921..51a5564 100644 --- a/src/uk/me/parabola/splitter/SplittableDensityArea.java +++ b/src/uk/me/parabola/splitter/SplittableDensityArea.java @@ -50,8 +50,6 @@ public class SplittableDensityArea { private final DensityMap allDensities; private EnhancedDensityMap extraDensityInfo; - private boolean tryOptimize = false; - private boolean beQuiet = false; private long maxNodes; private final int shift; @@ -70,6 +68,7 @@ public class SplittableDensityArea { private boolean trimTiles; private boolean allowEmptyPart = false; private int currMapId; + private boolean hasEmptyPart; public SplittableDensityArea(DensityMap densities, int startSearchLimit) { this.shift = densities.getShift(); @@ -118,9 +117,11 @@ public class SplittableDensityArea { List<Tile> startTiles = checkForEmptyClusters(0, startTile, true); Solution fullSolution = new Solution(maxNodes); - int countNoSol = 0; + int countNoSol; while (true){ + countNoSol = 0; for (Tile tile: startTiles){ + hasEmptyPart = false; if (!beQuiet) System.out.println("Solving partition " + tile.toString()); Solution solution = solveRectangularArea(tile); @@ -134,15 +135,16 @@ public class SplittableDensityArea { } if (countNoSol == 0) break; - if (allowEmptyPart) + if (allowEmptyPart || hasEmptyPart == false) break; allowEmptyPart = true; fullSolution = new Solution(maxNodes); } + if(countNoSol > 0) + throw new SplitFailedException("Failed to find a correct split"); System.out.println("Final solution: " + fullSolution.toString()); if (fullSolution.isNice()) System.out.println("This seems to be nice."); - return getAreas(fullSolution, null); } @@ -572,8 +574,10 @@ public class SplittableDensityArea { private Solution findSolution(int depth, final Tile tile, Tile parent, TileMetaInfo smiParent){ boolean addAndReturn = false; if (tile.count == 0){ - if (!allowEmptyPart) + if (!allowEmptyPart){ + hasEmptyPart = true; return null; + } if (tile.width * tile.height <= 4) return null; return new Solution(maxNodes); // allow empty part of the world @@ -612,7 +616,6 @@ public class SplittableDensityArea { if (cached != null){ return cached; } - // we have to split the tile Integer alreadyDone = null; if (countBad == 0 && incomplete.size() > 0){ @@ -653,6 +656,10 @@ public class SplittableDensityArea { continue; } int splitPos = todoList.getInt(usedTestPos++); +// if (tested.get(splitPos)){ +// continue; +// } +// tested.set(splitPos); // create the two parts of the tile boolean ok = false; if (axis == AXIS_HOR){ @@ -699,15 +706,6 @@ public class SplittableDensityArea { if (countOK == 2){ Solution sol = sols[0]; sol.merge(sols[1]); - if (tryOptimize && searchAll == false){ - if(sol.getTiles().size() <= 32 && sol.getWorstMinNodes() < VERY_NICE_FILL_RATIO * maxNodes){ - Solution optSol = solveSmallTile(depth, tile, smi, (long) (VERY_NICE_FILL_RATIO * maxNodes)); - if (sol.compareTo(optSol) > 0){ - System.out.println("found better solution for part " + tile + " : " + optSol); - sol = optSol; - } - } - } bestSol = sol; break; // we found a valid split and searched the direct neighbours } @@ -741,7 +739,6 @@ public class SplittableDensityArea { // start values for optimization process: we make little steps towards a good solution // spread = 7; searchLimit = startSearchLimit; - tryOptimize = false; minNodes = Math.max(Math.min((long)(0.05 * maxNodes), extraDensityInfo.getNodeCount()), 1); if (extraDensityInfo.getNodeCount() / maxNodes < 4){ @@ -792,7 +789,6 @@ public class SplittableDensityArea { factor = Math.min(1.30,(double)bestSolution.getWorstMinNodes() / prevBest.getWorstMinNodes()); minNodes = Math.max(maxNodes /3, (long) (bestSolution.getWorstMinNodes() * factor)); } - if (bestSolution.size() == 1){ if (!beQuiet) System.out.println("This can't be improved."); @@ -809,23 +805,38 @@ public class SplittableDensityArea { } } } - if (tryOptimize) - break; maxAspectRatio = Math.max(bestSolution.getWorstAspectRatio()/2, NICE_MAX_ASPECT_RATIO); maxAspectRatio = Math.min(32,maxAspectRatio); - if (bestSolution.isEmpty() == false && bestSolution.getWorstMinNodes() > VERY_NICE_FILL_RATIO * maxNodes) break; if (minNodes > VERY_NICE_FILL_RATIO * maxNodes) minNodes = (long) (VERY_NICE_FILL_RATIO * maxNodes); if (saveMaxAspectRatio == maxAspectRatio && saveMinNodes == minNodes){ if (bestSolution.isEmpty() || bestSolution.getWorstMinNodes() < 0.5 * maxNodes){ - if (searchLimit < 5_000_000){ + if (countBad > searchLimit && searchLimit < 5_000_000){ searchLimit *= 2; resetCaches(); System.out.println("No good solution found, duplicated search-limit to " + searchLimit); continue; } + if (bestSolution.isEmpty() && minNodes > 1){ + minNodes = 1; + resetCaches(); + searchLimit = startSearchLimit; + // sanity check + System.out.println("No good solution found, trying to find one accepting anything"); + int highestCount = extraDensityInfo.getMaxNodesInDensityMapGridElement(); + // inform user about possible better options? + double ratio = (double) highestCount / maxNodes; + if (ratio > 4) + System.err.printf("max-nodes value %d is far below highest node count %d in single grid element, consider using a higher resolution.\n", maxNodes , highestCount); + else if (ratio > 1) + System.err.printf("max-nodes value %d is below highest node count %d in single grid element, consider using a higher resolution.\n", maxNodes , highestCount); + else if (ratio < 0.25) + System.err.printf("max-nodes value %d is far above highest node count %d in single grid element, consider using a lower resolution.\n", maxNodes , highestCount); + + continue; + } if (searchAll){ searchAll = false; if (bestSolution.isEmpty() == false) @@ -836,12 +847,6 @@ public class SplittableDensityArea { continue; } } - if (tryOptimize == false && searchAll == false && bestSolution.isEmpty() == false){ - System.out.println("Trying to optimize parts of the best solution..."); - tryOptimize = true; - resetCaches(); - continue; - } break; } @@ -853,6 +858,7 @@ public class SplittableDensityArea { private void resetCaches(){ knownBad = new HashSet<>(); + // incomplete = new LinkedHashMap<>(); // System.out.println("resetting caches"); } @@ -1003,38 +1009,6 @@ public class SplittableDensityArea { } return tests; } - - /** - * This can be called to optimise a part of the start tile or to verify if a better solution is possible - * @param depth - * @param tile - * @param smi - * @param testMinNodes - * @return - */ - Solution solveSmallTile(int depth, Tile tile, TileMetaInfo smi, long testMinNodes){ - if (searchAll) - return null; - double saveMaxRatio = maxAspectRatio; - long saveBad = countBad; - long saveMinNodes = minNodes; - minNodes = testMinNodes; - countBad = 0; - searchAll = true; - beQuiet = true; - knownBad.remove(tile); -// long t1 = System.currentTimeMillis(); - Solution sol = findSolution(depth+1, tile, tile, smi); -// long dt = System.currentTimeMillis() - t1; - beQuiet = false; -// if (dt > 20) -// System.out.println("optimization took long and returned " + sol + " for " + tile); - searchAll = false; - countBad = saveBad; - minNodes = saveMinNodes; - maxAspectRatio = saveMaxRatio; - return sol; - } } -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/mkgmap-splitter.git _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel