From 0316c41924138e61d45f33132e81de500fd3c5ef Mon Sep 17 00:00:00 2001 From: Arndt Date: Fri, 3 Apr 2015 13:39:38 +0200 Subject: [PATCH] explicit classifier for initial cost --- .../src/main/java/btools/router/OsmPath.java | 18 +++++++++++------- .../java/btools/expressions/BExpression.java | 6 ++++++ .../btools/expressions/BExpressionContext.java | 10 ++++++---- .../expressions/BExpressionContextWay.java | 3 ++- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/brouter-core/src/main/java/btools/router/OsmPath.java b/brouter-core/src/main/java/btools/router/OsmPath.java index 8d6dbaa..e33e10a 100644 --- a/brouter-core/src/main/java/btools/router/OsmPath.java +++ b/brouter-core/src/main/java/btools/router/OsmPath.java @@ -40,7 +40,7 @@ final class OsmPath implements OsmLinkHolder public int originLat; // the costfactor of the segment just before this paths position - public float lastCostfactor; + public float lastClassifier; public String message; @@ -64,7 +64,7 @@ final class OsmPath implements OsmLinkHolder this.cost = origin.cost; this.ehbd = origin.ehbd; this.ehbu = origin.ehbu; - this.lastCostfactor = origin.lastCostfactor; + this.lastClassifier = origin.lastClassifier; addAddionalPenalty(refTrack, recordTransferNodes, origin, link, rc ); } @@ -260,12 +260,16 @@ final class OsmPath implements OsmLinkHolder int waycost = (int)(fcost); cost += waycost; - // *** add initial cost if factor changed - float newcostfactor = (cfup + cfdown + cf)/3; - float costdiff = newcostfactor - lastCostfactor; - if ( costdiff > 0.0005 || costdiff < -0.0005 ) + // *** add initial cost if the classifier changed + float newClassifier = rc.expctxWay.getInitialClassifier(); + if ( newClassifier == 0. ) { - lastCostfactor = newcostfactor; + newClassifier = (cfup + cfdown + cf)/3; + } + float classifierDiff = newClassifier - lastClassifier; + if ( classifierDiff > 0.0005 || classifierDiff < -0.0005 ) + { + lastClassifier = classifierDiff; float initialcost = rc.expctxWay.getInitialcost(); int iicost = (int)initialcost; msgData.linkinitcost += iicost; diff --git a/brouter-expressions/src/main/java/btools/expressions/BExpression.java b/brouter-expressions/src/main/java/btools/expressions/BExpression.java index 59bcfb4..9f889d2 100644 --- a/brouter-expressions/src/main/java/btools/expressions/BExpression.java +++ b/brouter-expressions/src/main/java/btools/expressions/BExpression.java @@ -11,6 +11,7 @@ final class BExpression private static final int ADD_EXP = 20; private static final int MULTIPLY_EXP = 21; private static final int MAX_EXP = 22; + private static final int EQUAL_EXP = 23; private static final int SWITCH_EXP = 30; private static final int ASSIGN_EXP = 31; @@ -100,6 +101,10 @@ final class BExpression { exp.typ = MAX_EXP; } + else if ( "equal".equals( operator ) ) + { + exp.typ = EQUAL_EXP; + } else { nops = 1; // check unary expressions @@ -220,6 +225,7 @@ final class BExpression case ADD_EXP: return op1.evaluate(ctx) + op2.evaluate(ctx); case MULTIPLY_EXP: return op1.evaluate(ctx) * op2.evaluate(ctx); case MAX_EXP: return max( op1.evaluate(ctx), op2.evaluate(ctx) ); + case EQUAL_EXP: return op1.evaluate(ctx) == op2.evaluate(ctx) ? 1.f : 0.f; case SWITCH_EXP: return op1.evaluate(ctx) != 0.f ? op2.evaluate(ctx) : op3.evaluate(ctx); case ASSIGN_EXP: return ctx.assign( variableIdx, op1.evaluate(ctx) ); case LOOKUP_EXP: return ctx.getLookupMatch( lookupNameIdx, lookupValueIdxArray ); diff --git a/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java b/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java index ddf2456..10d6da7 100644 --- a/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java +++ b/brouter-expressions/src/main/java/btools/expressions/BExpressionContext.java @@ -399,7 +399,8 @@ public abstract class BExpressionContext for( int vi=0; vi