From 2c4c21ad7c094ce7e2e445eea4ac679b69f9f795 Mon Sep 17 00:00:00 2001 From: Arndt Brenschede Date: Sun, 2 Jul 2017 23:01:51 +0200 Subject: [PATCH 1/2] access to way-context vars from (no caching) node-context --- .../main/java/btools/router/ProfileCache.java | 3 +- .../java/btools/expressions/BExpression.java | 11 ++++ .../expressions/BExpressionContext.java | 65 ++++++++++++++++++- 3 files changed, 76 insertions(+), 3 deletions(-) diff --git a/brouter-core/src/main/java/btools/router/ProfileCache.java b/brouter-core/src/main/java/btools/router/ProfileCache.java index 1a71d4b..f03e6ae 100644 --- a/brouter-core/src/main/java/btools/router/ProfileCache.java +++ b/brouter-core/src/main/java/btools/router/ProfileCache.java @@ -64,7 +64,8 @@ public final class ProfileCache BExpressionContextGlobal expctxGlobal = new BExpressionContextGlobal( meta ); rc.expctxWay = new BExpressionContextWay( rc.memoryclass * 512, meta ); - rc.expctxNode = new BExpressionContextNode( rc.memoryclass * 128, meta ); + rc.expctxNode = new BExpressionContextNode( 0, meta ); + rc.expctxNode.setForeignContext( rc.expctxWay ); meta.readMetaData( new File( profileDir, "lookups.dat" ) ); diff --git a/brouter-expressions/src/main/java/btools/expressions/BExpression.java b/brouter-expressions/src/main/java/btools/expressions/BExpression.java index c66fc45..a029023 100644 --- a/brouter-expressions/src/main/java/btools/expressions/BExpression.java +++ b/brouter-expressions/src/main/java/btools/expressions/BExpression.java @@ -24,6 +24,7 @@ final class BExpression private static final int LOOKUP_EXP = 32; private static final int NUMBER_EXP = 33; private static final int VARIABLE_EXP = 34; + private static final int FOREIGN_VARIABLE_EXP = 35; private int typ; private BExpression op1; @@ -138,6 +139,8 @@ final class BExpression exp.typ = ASSIGN_EXP; String variable = ctx.parseToken(); if ( variable == null ) throw new IllegalArgumentException( "unexpected end of file" ); + if ( variable.indexOf( '=' ) >= 0 ) throw new IllegalArgumentException( "variable name cannot contain '=': " + variable ); + if ( variable.indexOf( ':' ) >= 0 ) throw new IllegalArgumentException( "cannot assign context-prefixed variable: " + variable ); exp.variableIdx = ctx.getVariableIdx( variable, true ); if ( exp.variableIdx < ctx.getMinWriteIdx() ) throw new IllegalArgumentException( "cannot assign to readonly variable " + variable ); } @@ -175,6 +178,13 @@ final class BExpression } } } + else if ( ( idx = operator.indexOf( ':' ) ) >= 0 ) + { + String context = operator.substring( 0, idx ); + String varname = operator.substring( idx+1 ); + exp.typ = FOREIGN_VARIABLE_EXP; + exp.variableIdx = ctx.getForeignVariableIdx( context, varname ); + } else if ( (idx = ctx.getVariableIdx( operator, false )) >= 0 ) { exp.typ = VARIABLE_EXP; @@ -257,6 +267,7 @@ final class BExpression case LOOKUP_EXP: return ctx.getLookupMatch( lookupNameIdx, lookupValueIdxArray ); case NUMBER_EXP: return numberValue; case VARIABLE_EXP: return ctx.getVariableValue( variableIdx ); + case FOREIGN_VARIABLE_EXP: return ctx.getForeignVariableValue( variableIdx ); case NOT_EXP: return op1.evaluate(ctx) == 0.f ? 1.f : 0.f; default: throw new IllegalArgumentException( "unknown op-code: " + typ ); } diff --git a/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java b/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java index 9fc4526..3d265d5 100644 --- a/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java +++ b/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java @@ -70,6 +70,8 @@ public abstract class BExpressionContext implements IByteArrayUnifier private float[] currentVars; private int currentVarOffset; + private BExpressionContext foreignContext; + protected void setInverseVars() { currentVarOffset = nBuildInVars; @@ -108,8 +110,11 @@ public abstract class BExpressionContext implements IByteArrayUnifier if ( Boolean.getBoolean( "disableExpressionCache" ) ) hashSize = 1; // create the expression cache - cache = new LruMap( 4*hashSize, hashSize ); - resultVarCache = new LruMap( 4096, 4096 ); + if ( hashSize > 0 ) + { + cache = new LruMap( 4*hashSize, hashSize ); + resultVarCache = new LruMap( 4096, 4096 ); + } } /** @@ -347,6 +352,18 @@ public abstract class BExpressionContext implements IByteArrayUnifier { requests++; lookupDataValid = false; // this is an assertion for a nasty pifall + + if ( cache == null ) + { + decode( lookupData, inverseDirection, ab ); + if ( currentVars == null || currentVars.length != nBuildInVars ) + { + currentVars = new float[nBuildInVars]; + } + evaluateInto( currentVars, 0 ); + currentVarOffset = 0; + return; + } CacheNode cn; if ( lastCacheNode.ab == ab ) @@ -660,6 +677,50 @@ public abstract class BExpressionContext implements IByteArrayUnifier Integer num = lookupNumbers.get( name ); return num != null && lookupData[num.intValue()] == 2; } + + public int getOutputVariableIndex( String name ) + { + int idx = getVariableIdx( name, false ); + if ( idx < 0 ) + { + throw new IllegalArgumentException( "unknown variable: " + name ); + } + if ( idx < minWriteIdx ) + { + throw new IllegalArgumentException( "bad access to global variable: " + name ); + } + for( int i=0; i Date: Sat, 12 Aug 2017 18:17:23 +0200 Subject: [PATCH 2/2] fixed interface provided nogos --- .../src/main/java/btools/routingapp/BRouterWorker.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java b/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java index ac5dea6..736caa4 100644 --- a/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java +++ b/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java @@ -66,13 +66,10 @@ public class BRouterWorker rc.startDirection = Integer.valueOf( params.getInt( "direction" ) ); } - if ( nogoList != null ) - { - rc.prepareNogoPoints( nogoList ); - rc.nogopoints = nogoList; - } - readNogos( params ); // add interface provided nogos + rc.prepareNogoPoints( nogoList ); + rc.nogopoints = nogoList; + waypoints = readPositions(params); RoutingEngine cr = new RoutingEngine( null, null, segmentDir, waypoints, rc );