separated build-in vars from BExpressionContext

This commit is contained in:
Arndt 2015-04-03 12:51:26 +02:00
parent 53c3df66f5
commit 3ed62bb2b3
13 changed files with 280 additions and 72 deletions

View file

@ -37,8 +37,8 @@ public final class RoutingContext implements DistanceChecker
return name; return name;
} }
public BExpressionContext expctxWay; public BExpressionContextWay expctxWay;
public BExpressionContext expctxNode; public BExpressionContextNode expctxNode;
public boolean serversizing = false; public boolean serversizing = false;

View file

@ -9,6 +9,9 @@ import java.util.Date;
import java.util.List; import java.util.List;
import btools.expressions.BExpressionContext; import btools.expressions.BExpressionContext;
import btools.expressions.BExpressionContextGlobal;
import btools.expressions.BExpressionContextNode;
import btools.expressions.BExpressionContextWay;
import btools.expressions.BExpressionMetaData; import btools.expressions.BExpressionMetaData;
import btools.mapaccess.NodesCache; import btools.mapaccess.NodesCache;
import btools.mapaccess.OsmLink; import btools.mapaccess.OsmLink;
@ -80,9 +83,9 @@ public class RoutingEngine extends Thread
BExpressionMetaData meta = new BExpressionMetaData(); BExpressionMetaData meta = new BExpressionMetaData();
BExpressionContext expctxGlobal = new BExpressionContext( "global", meta ); BExpressionContextGlobal expctxGlobal = new BExpressionContextGlobal( meta );
rc.expctxWay = new BExpressionContext( "way", rc.serversizing ? 262144 : 4096, meta ); rc.expctxWay = new BExpressionContextWay( rc.serversizing ? 262144 : 4096, meta );
rc.expctxNode = new BExpressionContext( "node", rc.serversizing ? 16384 : 1024, meta ); rc.expctxNode = new BExpressionContextNode( rc.serversizing ? 16384 : 1024, meta );
meta.readMetaData( new File( profileDir, "lookups.dat" ) ); meta.readMetaData( new File( profileDir, "lookups.dat" ) );

View file

@ -22,7 +22,7 @@ import btools.util.Crc32;
import java.util.Random; import java.util.Random;
public final class BExpressionContext public abstract class BExpressionContext
{ {
private static final String CONTEXT_TAG = "---context:"; private static final String CONTEXT_TAG = "---context:";
@ -63,33 +63,23 @@ public final class BExpressionContext
private int minWriteIdx; private int minWriteIdx;
// build-in variable indexes for fast access // build-in variable indexes for fast access
private int costfactorIdx; private int[] buildInVariableIdx;
private int turncostIdx;
private int uphillcostfactorIdx;
private int downhillcostfactorIdx;
private int initialcostIdx;
private int nodeaccessgrantedIdx;
private float[] _arrayCostfactor; protected float[][] arrayBuildInVariablesCache;
private float[] _arrayTurncost;
private float[] _arrayUphillCostfactor;
private float[] _arrayDownhillCostfactor;
private float[] _arrayInitialcost;
private float[] _arrayNodeAccessGranted;
public float getCostfactor() { return _arrayCostfactor[currentHashBucket]; } abstract String[] getBuildInVariableNames();
public float getTurncost() { return _arrayTurncost[currentHashBucket]; }
public float getUphillCostfactor() { return _arrayUphillCostfactor[currentHashBucket]; } protected float getBuildInVariable( int idx )
public float getDownhillCostfactor() { return _arrayDownhillCostfactor[currentHashBucket]; } {
public float getInitialcost() { return _arrayInitialcost[currentHashBucket]; } return arrayBuildInVariablesCache[idx][currentHashBucket];
public float getNodeAccessGranted() { return _arrayNodeAccessGranted[currentHashBucket]; } }
private int linenr; private int linenr;
public BExpressionMetaData meta; public BExpressionMetaData meta;
private boolean lookupDataValid = false; private boolean lookupDataValid = false;
public BExpressionContext( String context, BExpressionMetaData meta ) protected BExpressionContext( String context, BExpressionMetaData meta )
{ {
this( context, 4096, meta ); this( context, 4096, meta );
} }
@ -100,7 +90,7 @@ public final class BExpressionContext
* @param context global, way or node - context of that instance * @param context global, way or node - context of that instance
* @param hashSize size of hashmap for result caching * @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.context = context;
this.meta = meta; this.meta = meta;
@ -113,12 +103,13 @@ public final class BExpressionContext
_arrayInverse = new boolean[hashSize]; _arrayInverse = new boolean[hashSize];
_arrayCrc = new int[hashSize]; _arrayCrc = new int[hashSize];
_arrayCostfactor = new float[hashSize]; // create the build-in variables cache
_arrayTurncost = new float[hashSize]; int nBuildInVars = getBuildInVariableNames().length;
_arrayUphillCostfactor = new float[hashSize]; arrayBuildInVariablesCache = new float[nBuildInVars][];
_arrayDownhillCostfactor = new float[hashSize]; for( int vi=0; vi<nBuildInVars; vi++ )
_arrayInitialcost = new float[hashSize]; {
_arrayNodeAccessGranted = new float[hashSize]; arrayBuildInVariablesCache[vi] = new float[hashSize];
}
} }
/** /**
@ -406,12 +397,10 @@ public final class BExpressionContext
decode( lookupData, currentInverseDirection, currentByteArray ); decode( lookupData, currentInverseDirection, currentByteArray );
evaluate( lookupData ); evaluate( lookupData );
_arrayCostfactor[currentHashBucket] = variableData[costfactorIdx]; for( int vi=0; vi<buildInVariableIdx.length; vi++ )
_arrayTurncost[currentHashBucket] = variableData[turncostIdx]; {
_arrayUphillCostfactor[currentHashBucket] = variableData[uphillcostfactorIdx]; arrayBuildInVariablesCache[vi][currentHashBucket] = variableData[buildInVariableIdx[vi]];
_arrayDownhillCostfactor[currentHashBucket] = variableData[downhillcostfactorIdx]; }
_arrayInitialcost[currentHashBucket] = variableData[initialcostIdx];
_arrayNodeAccessGranted[currentHashBucket] = variableData[nodeaccessgrantedIdx];
_receiver = null; _receiver = null;
return false; return false;
@ -669,13 +658,13 @@ public final class BExpressionContext
linenr = 1; linenr = 1;
minWriteIdx = variableData == null ? 0 : variableData.length; minWriteIdx = variableData == null ? 0 : variableData.length;
costfactorIdx = getVariableIdx( "costfactor", true ); // create the build-in variables
turncostIdx = getVariableIdx( "turncost", true ); String[] varNames = getBuildInVariableNames();
uphillcostfactorIdx = getVariableIdx( "uphillcostfactor", true ); buildInVariableIdx = new int[varNames.length];
downhillcostfactorIdx = getVariableIdx( "downhillcostfactor", true ); for( int vi=0; vi<varNames.length; vi++ )
initialcostIdx = getVariableIdx( "initialcost", true ); {
nodeaccessgrantedIdx = getVariableIdx( "nodeaccessgranted", true ); buildInVariableIdx[vi] = getVariableIdx( varNames[vi], true );
}
expressionList = _parseFile( file ); expressionList = _parseFile( file );
float[] readOnlyData = variableData; float[] readOnlyData = variableData;

View file

@ -0,0 +1,35 @@
// context for simple expression
// context means:
// - the local variables
// - the local variable names
// - the lookup-input variables
package btools.expressions;
public final class BExpressionContextGlobal extends BExpressionContext
{
private static String[] buildInVariables =
{};
protected String[] getBuildInVariableNames()
{
return buildInVariables;
}
public BExpressionContextGlobal( BExpressionMetaData meta )
{
super( "global", meta );
}
/**
* Create an Expression-Context for way context
*
* @param hashSize size of hashmap for result caching
*/
public BExpressionContextGlobal( int hashSize, BExpressionMetaData meta )
{
super( "global", hashSize, meta );
}
}

View file

@ -0,0 +1,38 @@
// context for simple expression
// context means:
// - the local variables
// - the local variable names
// - the lookup-input variables
package btools.expressions;
public final class BExpressionContextNode extends BExpressionContext
{
private static String[] buildInVariables =
{ "initialcost" };
protected String[] getBuildInVariableNames()
{
return buildInVariables;
}
public float getInitialcost() { return getBuildInVariable(0); }
public BExpressionContextNode( BExpressionMetaData meta )
{
super( "node", meta );
}
/**
* Create an Expression-Context for way context
*
* @param hashSize size of hashmap for result caching
*/
public BExpressionContextNode( int hashSize, BExpressionMetaData meta )
{
super( "node", hashSize, meta );
}
}

View file

@ -0,0 +1,43 @@
// context for simple expression
// context means:
// - the local variables
// - the local variable names
// - the lookup-input variables
package btools.expressions;
public final class BExpressionContextWay extends BExpressionContext
{
private static String[] buildInVariables =
{ "costfactor", "turncost", "uphillcostfactor", "downhillcostfactor", "initialcost", "nodeaccessgranted" };
protected String[] getBuildInVariableNames()
{
return buildInVariables;
}
public float getCostfactor() { return getBuildInVariable(0); }
public float getTurncost() { return getBuildInVariable(1); }
public float getUphillCostfactor() { return getBuildInVariable(2); }
public float getDownhillCostfactor() { return getBuildInVariable(3); }
public float getInitialcost() { return getBuildInVariable(4); }
public float getNodeAccessGranted() { return getBuildInVariable(5); }
public BExpressionContextWay( BExpressionMetaData meta )
{
super( "way", meta );
}
/**
* Create an Expression-Context for way context
*
* @param hashSize size of hashmap for result caching
*/
public BExpressionContextWay( int hashSize, BExpressionMetaData meta )
{
super( "way", hashSize, meta );
}
}

View file

@ -29,18 +29,18 @@ public final class ProfileComparator
File profile1File = new File( args[1] ); File profile1File = new File( args[1] );
File profile2File = new File( args[2] ); File profile2File = new File( args[2] );
int nsamples = Integer.parseInt( args[3] ); int nsamples = Integer.parseInt( args[3] );
testContext( lookupFile, profile1File, profile2File, nsamples, "way" ); testContext( lookupFile, profile1File, profile2File, nsamples, false );
testContext( lookupFile, profile1File, profile2File, nsamples, "node" ); testContext( lookupFile, profile1File, profile2File, nsamples, true );
} }
private static void testContext( File lookupFile, File profile1File, File profile2File, int nsamples, String contextName ) private static void testContext( File lookupFile, File profile1File, File profile2File, int nsamples, boolean nodeContext )
{ {
// read lookup.dat + profiles // read lookup.dat + profiles
BExpressionMetaData meta1 = new BExpressionMetaData(); BExpressionMetaData meta1 = new BExpressionMetaData();
BExpressionMetaData meta2 = new BExpressionMetaData(); BExpressionMetaData meta2 = new BExpressionMetaData();
BExpressionContext expctx1 = new BExpressionContext(contextName, 4096, meta1 ); BExpressionContext expctx1 = nodeContext ? new BExpressionContextNode( meta1 ) : new BExpressionContextWay( meta1 );
BExpressionContext expctx2 = new BExpressionContext(contextName, 4096, meta2 ); BExpressionContext expctx2 = nodeContext ? new BExpressionContextNode( meta2 ) : new BExpressionContextWay( meta2 );
meta1.readMetaData( lookupFile ); meta1.readMetaData( lookupFile );
meta2.readMetaData( lookupFile ); meta2.readMetaData( lookupFile );
expctx1.parseFile( profile1File, "global" ); expctx1.parseFile( profile1File, "global" );

View file

@ -19,7 +19,7 @@ public class EncodeDecodeTest
// read lookup.dat + trekking.brf // read lookup.dat + trekking.brf
BExpressionMetaData meta = new BExpressionMetaData(); BExpressionMetaData meta = new BExpressionMetaData();
BExpressionContext expctxWay = new BExpressionContext("way", 4096, meta ); BExpressionContextWay expctxWay = new BExpressionContextWay( meta );
meta.readMetaData( lookupFile ); meta.readMetaData( lookupFile );
expctxWay.parseFile( new File( profileDir, "trekking.brf" ), "global" ); expctxWay.parseFile( new File( profileDir, "trekking.brf" ), "global" );

View file

@ -13,6 +13,8 @@ import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import btools.expressions.BExpressionContext; import btools.expressions.BExpressionContext;
import btools.expressions.BExpressionContextNode;
import btools.expressions.BExpressionContextWay;
import btools.expressions.BExpressionMetaData; import btools.expressions.BExpressionMetaData;
public class OsmCutter extends MapCreatorBase public class OsmCutter extends MapCreatorBase
@ -46,11 +48,11 @@ public class OsmCutter extends MapCreatorBase
); );
} }
private BExpressionContext _expctxWay; private BExpressionContextWay _expctxWay;
private BExpressionContext _expctxNode; private BExpressionContextNode _expctxNode;
private BExpressionContext _expctxWayStat; private BExpressionContextWay _expctxWayStat;
private BExpressionContext _expctxNodeStat; private BExpressionContextNode _expctxNodeStat;
public void process (File lookupFile, File outTileDir, File wayFile, File relFile, File profileFile, File mapFile ) throws Exception public void process (File lookupFile, File outTileDir, File wayFile, File relFile, File profileFile, File mapFile ) throws Exception
{ {
@ -61,14 +63,14 @@ public class OsmCutter extends MapCreatorBase
BExpressionMetaData meta = new BExpressionMetaData(); BExpressionMetaData meta = new BExpressionMetaData();
_expctxWay = new BExpressionContext("way", meta ); _expctxWay = new BExpressionContextWay( meta );
_expctxNode = new BExpressionContext("node", meta ); _expctxNode = new BExpressionContextNode( meta );
meta.readMetaData( lookupFile ); meta.readMetaData( lookupFile );
_expctxWay.parseFile( profileFile, "global" ); _expctxWay.parseFile( profileFile, "global" );
_expctxWayStat = new BExpressionContext("way", null ); _expctxWayStat = new BExpressionContextWay( null );
_expctxNodeStat = new BExpressionContext("node", null ); _expctxNodeStat = new BExpressionContextNode( null );
this.outTileDir = outTileDir; this.outTileDir = outTileDir;
if ( !outTileDir.isDirectory() ) throw new RuntimeException( "out tile directory " + outTileDir + " does not exist" ); if ( !outTileDir.isDirectory() ) throw new RuntimeException( "out tile directory " + outTileDir + " does not exist" );

View file

@ -6,7 +6,7 @@ import java.io.EOFException;
import java.io.File; import java.io.File;
import java.util.HashMap; import java.util.HashMap;
import btools.expressions.BExpressionContext; import btools.expressions.BExpressionContextWay;
import btools.expressions.BExpressionMetaData; import btools.expressions.BExpressionMetaData;
import btools.util.CompactLongSet; import btools.util.CompactLongSet;
import btools.util.FrozenLongSet; import btools.util.FrozenLongSet;
@ -22,8 +22,8 @@ public class RelationMerger extends MapCreatorBase
{ {
private HashMap<String,CompactLongSet> routesets; private HashMap<String,CompactLongSet> routesets;
private CompactLongSet routesetall; private CompactLongSet routesetall;
private BExpressionContext expctxReport; private BExpressionContextWay expctxReport;
private BExpressionContext expctxCheck; private BExpressionContextWay expctxCheck;
// private BExpressionContext expctxStat; // private BExpressionContext expctxStat;
private DataOutputStream wayOutStream; private DataOutputStream wayOutStream;
@ -44,11 +44,11 @@ public class RelationMerger extends MapCreatorBase
{ {
// read lookup + profile for relation access-check // read lookup + profile for relation access-check
BExpressionMetaData metaReport = new BExpressionMetaData(); BExpressionMetaData metaReport = new BExpressionMetaData();
expctxReport = new BExpressionContext("way", metaReport ); expctxReport = new BExpressionContextWay( metaReport );
metaReport.readMetaData( lookupFile ); metaReport.readMetaData( lookupFile );
BExpressionMetaData metaCheck = new BExpressionMetaData(); BExpressionMetaData metaCheck = new BExpressionMetaData();
expctxCheck = new BExpressionContext("way", metaCheck ); expctxCheck = new BExpressionContextWay( metaCheck );
metaCheck.readMetaData( lookupFile ); metaCheck.readMetaData( lookupFile );
expctxReport.parseFile( reportProfile, "global" ); expctxReport.parseFile( reportProfile, "global" );

View file

@ -7,7 +7,8 @@ import java.io.RandomAccessFile;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import btools.expressions.BExpressionContext; import btools.expressions.BExpressionContextNode;
import btools.expressions.BExpressionContextWay;
import btools.expressions.BExpressionMetaData; import btools.expressions.BExpressionMetaData;
import btools.util.ByteArrayUnifier; import btools.util.ByteArrayUnifier;
import btools.util.ByteDataWriter; import btools.util.ByteDataWriter;
@ -46,8 +47,8 @@ public class WayLinker extends MapCreatorBase
private long creationTimeStamp; private long creationTimeStamp;
private BExpressionContext expctxWay; private BExpressionContextWay expctxWay;
private BExpressionContext expctxNode; private BExpressionContextNode expctxNode;
private ByteArrayUnifier abUnifier; private ByteArrayUnifier abUnifier;
@ -83,8 +84,8 @@ public class WayLinker extends MapCreatorBase
BExpressionMetaData meta = new BExpressionMetaData(); BExpressionMetaData meta = new BExpressionMetaData();
// read lookup + profile for lookup-version + access-filter // read lookup + profile for lookup-version + access-filter
expctxWay = new BExpressionContext("way", meta); expctxWay = new BExpressionContextWay( meta);
expctxNode = new BExpressionContext("node", meta); expctxNode = new BExpressionContextNode( meta);
meta.readMetaData( lookupFile ); meta.readMetaData( lookupFile );
lookupVersion = meta.lookupVersion; lookupVersion = meta.lookupVersion;

View file

@ -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<OsmNodeNamed> 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<String,BExpressionContext[]> expressionCache = new HashMap<String,BExpressionContext[]>();
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 );
}
}

View file

@ -11,7 +11,6 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -30,7 +29,7 @@ import android.os.Environment;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.view.View; import android.view.View;
import android.widget.Toast; import android.widget.Toast;
import btools.expressions.BExpressionContext; import btools.expressions.BExpressionContextGlobal;
import btools.expressions.BExpressionMetaData; import btools.expressions.BExpressionMetaData;
import btools.mapaccess.OsmNode; import btools.mapaccess.OsmNode;
import btools.router.OsmNodeNamed; import btools.router.OsmNodeNamed;
@ -683,7 +682,7 @@ private long startTime = 0L;
// parse global section of profile for mode preselection // parse global section of profile for mode preselection
BExpressionMetaData meta = new BExpressionMetaData(); BExpressionMetaData meta = new BExpressionMetaData();
BExpressionContext expctxGlobal = new BExpressionContext( "global", meta ); BExpressionContextGlobal expctxGlobal = new BExpressionContextGlobal( meta );
meta.readMetaData( new File( profileDir, "lookups.dat" ) ); meta.readMetaData( new File( profileDir, "lookups.dat" ) );
expctxGlobal.parseFile( new File( profilePath ), null ); expctxGlobal.parseFile( new File( profilePath ), null );
expctxGlobal.evaluate( new int[0] ); expctxGlobal.evaluate( new int[0] );