diff --git a/brouter-core/src/main/java/btools/router/RoutingContext.java b/brouter-core/src/main/java/btools/router/RoutingContext.java index 8b31ead..bdd3eca 100644 --- a/brouter-core/src/main/java/btools/router/RoutingContext.java +++ b/brouter-core/src/main/java/btools/router/RoutingContext.java @@ -37,8 +37,8 @@ public final class RoutingContext implements DistanceChecker return name; } - public BExpressionContext expctxWay; - public BExpressionContext expctxNode; + public BExpressionContextWay expctxWay; + public BExpressionContextNode expctxNode; public boolean serversizing = false; diff --git a/brouter-core/src/main/java/btools/router/RoutingEngine.java b/brouter-core/src/main/java/btools/router/RoutingEngine.java index d1fb894..579d9df 100644 --- a/brouter-core/src/main/java/btools/router/RoutingEngine.java +++ b/brouter-core/src/main/java/btools/router/RoutingEngine.java @@ -9,6 +9,9 @@ import java.util.Date; import java.util.List; import btools.expressions.BExpressionContext; +import btools.expressions.BExpressionContextGlobal; +import btools.expressions.BExpressionContextNode; +import btools.expressions.BExpressionContextWay; import btools.expressions.BExpressionMetaData; import btools.mapaccess.NodesCache; import btools.mapaccess.OsmLink; @@ -80,9 +83,9 @@ public class RoutingEngine extends Thread BExpressionMetaData meta = new BExpressionMetaData(); - BExpressionContext expctxGlobal = new BExpressionContext( "global", meta ); - rc.expctxWay = new BExpressionContext( "way", rc.serversizing ? 262144 : 4096, meta ); - rc.expctxNode = new BExpressionContext( "node", rc.serversizing ? 16384 : 1024, meta ); + BExpressionContextGlobal expctxGlobal = new BExpressionContextGlobal( meta ); + rc.expctxWay = new BExpressionContextWay( rc.serversizing ? 262144 : 4096, meta ); + rc.expctxNode = new BExpressionContextNode( rc.serversizing ? 16384 : 1024, meta ); meta.readMetaData( new File( profileDir, "lookups.dat" ) ); diff --git a/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java b/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java index 54fa55e..ddf2456 100644 --- a/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java +++ b/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java @@ -22,7 +22,7 @@ import btools.util.Crc32; import java.util.Random; -public final class BExpressionContext +public abstract class BExpressionContext { private static final String CONTEXT_TAG = "---context:"; @@ -63,33 +63,23 @@ public final class BExpressionContext private int minWriteIdx; // build-in variable indexes for fast access - private int costfactorIdx; - private int turncostIdx; - private int uphillcostfactorIdx; - private int downhillcostfactorIdx; - private int initialcostIdx; - private int nodeaccessgrantedIdx; + private int[] buildInVariableIdx; - private float[] _arrayCostfactor; - private float[] _arrayTurncost; - private float[] _arrayUphillCostfactor; - private float[] _arrayDownhillCostfactor; - private float[] _arrayInitialcost; - private float[] _arrayNodeAccessGranted; + protected float[][] arrayBuildInVariablesCache; - public float getCostfactor() { return _arrayCostfactor[currentHashBucket]; } - public float getTurncost() { return _arrayTurncost[currentHashBucket]; } - public float getUphillCostfactor() { return _arrayUphillCostfactor[currentHashBucket]; } - public float getDownhillCostfactor() { return _arrayDownhillCostfactor[currentHashBucket]; } - public float getInitialcost() { return _arrayInitialcost[currentHashBucket]; } - public float getNodeAccessGranted() { return _arrayNodeAccessGranted[currentHashBucket]; } + abstract String[] getBuildInVariableNames(); + + protected float getBuildInVariable( int idx ) + { + return arrayBuildInVariablesCache[idx][currentHashBucket]; + } private int linenr; public BExpressionMetaData meta; private boolean lookupDataValid = false; - public BExpressionContext( String context, BExpressionMetaData meta ) + protected BExpressionContext( String context, BExpressionMetaData meta ) { this( context, 4096, meta ); } @@ -100,7 +90,7 @@ public final class BExpressionContext * @param context global, way or node - context of that instance * @param hashSize size of hashmap for result caching */ - public BExpressionContext( String context, int hashSize, BExpressionMetaData meta ) + protected BExpressionContext( String context, int hashSize, BExpressionMetaData meta ) { this.context = context; this.meta = meta; @@ -113,12 +103,13 @@ public final class BExpressionContext _arrayInverse = new boolean[hashSize]; _arrayCrc = new int[hashSize]; - _arrayCostfactor = new float[hashSize]; - _arrayTurncost = new float[hashSize]; - _arrayUphillCostfactor = new float[hashSize]; - _arrayDownhillCostfactor = new float[hashSize]; - _arrayInitialcost = new float[hashSize]; - _arrayNodeAccessGranted = new float[hashSize]; + // create the build-in variables cache + int nBuildInVars = getBuildInVariableNames().length; + arrayBuildInVariablesCache = new float[nBuildInVars][]; + for( int vi=0; vi routesets; private CompactLongSet routesetall; - private BExpressionContext expctxReport; - private BExpressionContext expctxCheck; + private BExpressionContextWay expctxReport; + private BExpressionContextWay expctxCheck; // private BExpressionContext expctxStat; private DataOutputStream wayOutStream; @@ -44,11 +44,11 @@ public class RelationMerger extends MapCreatorBase { // read lookup + profile for relation access-check BExpressionMetaData metaReport = new BExpressionMetaData(); - expctxReport = new BExpressionContext("way", metaReport ); + expctxReport = new BExpressionContextWay( metaReport ); metaReport.readMetaData( lookupFile ); BExpressionMetaData metaCheck = new BExpressionMetaData(); - expctxCheck = new BExpressionContext("way", metaCheck ); + expctxCheck = new BExpressionContextWay( metaCheck ); metaCheck.readMetaData( lookupFile ); expctxReport.parseFile( reportProfile, "global" ); diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/WayLinker.java b/brouter-map-creator/src/main/java/btools/mapcreator/WayLinker.java index 26934f5..eedf1e9 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/WayLinker.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/WayLinker.java @@ -7,7 +7,8 @@ import java.io.RandomAccessFile; import java.util.Collections; import java.util.List; -import btools.expressions.BExpressionContext; +import btools.expressions.BExpressionContextNode; +import btools.expressions.BExpressionContextWay; import btools.expressions.BExpressionMetaData; import btools.util.ByteArrayUnifier; import btools.util.ByteDataWriter; @@ -46,8 +47,8 @@ public class WayLinker extends MapCreatorBase private long creationTimeStamp; - private BExpressionContext expctxWay; - private BExpressionContext expctxNode; + private BExpressionContextWay expctxWay; + private BExpressionContextNode expctxNode; private ByteArrayUnifier abUnifier; @@ -83,8 +84,8 @@ public class WayLinker extends MapCreatorBase BExpressionMetaData meta = new BExpressionMetaData(); // read lookup + profile for lookup-version + access-filter - expctxWay = new BExpressionContext("way", meta); - expctxNode = new BExpressionContext("node", meta); + expctxWay = new BExpressionContextWay( meta); + expctxNode = new BExpressionContextNode( meta); meta.readMetaData( lookupFile ); lookupVersion = meta.lookupVersion; diff --git a/brouter-mem-router/src/main/java/btools/memrouter/TwinRoutingEngine.java b/brouter-mem-router/src/main/java/btools/memrouter/TwinRoutingEngine.java new file mode 100644 index 0000000..bbb8ff9 --- /dev/null +++ b/brouter-mem-router/src/main/java/btools/memrouter/TwinRoutingEngine.java @@ -0,0 +1,98 @@ +package btools.memrouter; + +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import btools.expressions.BExpressionContext; +import btools.router.OsmNodeNamed; +import btools.router.OsmTrack; +import btools.router.RoutingContext; +import btools.router.RoutingEngine; + +public class TwinRoutingEngine extends RoutingEngine +{ + private static Object graphSync = new Object(); + private static GraphLoader graph; + + public TwinRoutingEngine( String outfileBase, String logfileBase, String segmentDir, + List waypoints, RoutingContext rc ) + { + super( outfileBase, logfileBase, segmentDir, waypoints, rc ); + } + + public void doRun( long maxRunningTime ) + { + if ( routingContext.localFunction != null && routingContext.localFunction.startsWith( "../im/") ) + { + doMemoryRun( maxRunningTime ); + } + else + { + super.doRun( maxRunningTime ); + } + } + + static private Map expressionCache = new HashMap(); + + private void doMemoryRun( long maxRunningTime ) + { + try + { + synchronized( graphSync ) + { + if ( graph == null ) + { + loadGraph(); + } + +/* // reuse old expression-caches + BExpressionContext[] exp = expressionCache.get( routingContext.localFunction ); + if ( exp == null ) + { + exp = new BExpressionContext[2]; + exp[0] = routingContext.expctxWay; + exp[1] = routingContext.expctxNode; + expressionCache.put( routingContext.localFunction, exp ); + } + else + { + System.out.println( "re-using exp-ctx for : " + routingContext.localFunction ); + routingContext.expctxWay = exp[0]; + routingContext.expctxNode = exp[1]; + } +*/ + OsmLinkP.currentserial++; + ScheduledRouter router = new ScheduledRouter( graph, routingContext, this ); + foundTrack = router.findRoute( waypoints.get(0), waypoints.get(1), "17.12.2014-19:00", routingContext.getAlternativeIdx() ); + System.out.println( "linksProcessed=" + router.linksProcessed + " linksReProcessed=" + router.linksReProcessed); + System.out.println( "skippedChained=" + router.skippedChained + " closedSkippedChained=" + router.closedSkippedChained); + + System.out.println( "expCtxWay: requests: " + routingContext.expctxWay.requests + " requests2: " + routingContext.expctxWay.requests2 + " cache-misses: " + routingContext.expctxWay.cachemisses ); + + } + } + catch( Exception e ) + { + e.printStackTrace(); + errorMessage = e.getMessage(); + } + } + + + private void loadGraph() throws Exception + { + File parentDir = new File( segmentDir ).getParentFile(); + File nodeTilesIn = new File( parentDir, "unodes55"); + File wayTilesIn = new File( parentDir, "waytiles55"); + File[] fahrplanFiles = new File[2]; + fahrplanFiles[0] = new File( parentDir, "fahrplan_nahverkehr.txt" ); + fahrplanFiles[1] = new File( parentDir, "fahrplan.txt" ); + + graph = new GraphLoader(); + graph.process( nodeTilesIn, wayTilesIn, fahrplanFiles, routingContext.expctxWay ); + } + + +} diff --git a/brouter-routing-app/src/main/java/btools/routingapp/BRouterView.java b/brouter-routing-app/src/main/java/btools/routingapp/BRouterView.java index 5824fe4..f34bb42 100644 --- a/brouter-routing-app/src/main/java/btools/routingapp/BRouterView.java +++ b/brouter-routing-app/src/main/java/btools/routingapp/BRouterView.java @@ -11,7 +11,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; @@ -30,7 +29,7 @@ import android.os.Environment; import android.util.DisplayMetrics; import android.view.View; import android.widget.Toast; -import btools.expressions.BExpressionContext; +import btools.expressions.BExpressionContextGlobal; import btools.expressions.BExpressionMetaData; import btools.mapaccess.OsmNode; import btools.router.OsmNodeNamed; @@ -683,7 +682,7 @@ private long startTime = 0L; // parse global section of profile for mode preselection BExpressionMetaData meta = new BExpressionMetaData(); - BExpressionContext expctxGlobal = new BExpressionContext( "global", meta ); + BExpressionContextGlobal expctxGlobal = new BExpressionContextGlobal( meta ); meta.readMetaData( new File( profileDir, "lookups.dat" ) ); expctxGlobal.parseFile( new File( profilePath ), null ); expctxGlobal.evaluate( new int[0] );