explicit classifier for initial cost

This commit is contained in:
Arndt 2015-04-03 13:39:38 +02:00
parent 3ed62bb2b3
commit 0316c41924
4 changed files with 25 additions and 12 deletions

View file

@ -40,7 +40,7 @@ final class OsmPath implements OsmLinkHolder
public int originLat; public int originLat;
// the costfactor of the segment just before this paths position // the costfactor of the segment just before this paths position
public float lastCostfactor; public float lastClassifier;
public String message; public String message;
@ -64,7 +64,7 @@ final class OsmPath implements OsmLinkHolder
this.cost = origin.cost; this.cost = origin.cost;
this.ehbd = origin.ehbd; this.ehbd = origin.ehbd;
this.ehbu = origin.ehbu; this.ehbu = origin.ehbu;
this.lastCostfactor = origin.lastCostfactor; this.lastClassifier = origin.lastClassifier;
addAddionalPenalty(refTrack, recordTransferNodes, origin, link, rc ); addAddionalPenalty(refTrack, recordTransferNodes, origin, link, rc );
} }
@ -260,12 +260,16 @@ final class OsmPath implements OsmLinkHolder
int waycost = (int)(fcost); int waycost = (int)(fcost);
cost += waycost; cost += waycost;
// *** add initial cost if factor changed // *** add initial cost if the classifier changed
float newcostfactor = (cfup + cfdown + cf)/3; float newClassifier = rc.expctxWay.getInitialClassifier();
float costdiff = newcostfactor - lastCostfactor; if ( newClassifier == 0. )
if ( costdiff > 0.0005 || costdiff < -0.0005 )
{ {
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(); float initialcost = rc.expctxWay.getInitialcost();
int iicost = (int)initialcost; int iicost = (int)initialcost;
msgData.linkinitcost += iicost; msgData.linkinitcost += iicost;

View file

@ -11,6 +11,7 @@ final class BExpression
private static final int ADD_EXP = 20; private static final int ADD_EXP = 20;
private static final int MULTIPLY_EXP = 21; private static final int MULTIPLY_EXP = 21;
private static final int MAX_EXP = 22; 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 SWITCH_EXP = 30;
private static final int ASSIGN_EXP = 31; private static final int ASSIGN_EXP = 31;
@ -100,6 +101,10 @@ final class BExpression
{ {
exp.typ = MAX_EXP; exp.typ = MAX_EXP;
} }
else if ( "equal".equals( operator ) )
{
exp.typ = EQUAL_EXP;
}
else else
{ {
nops = 1; // check unary expressions nops = 1; // check unary expressions
@ -220,6 +225,7 @@ final class BExpression
case ADD_EXP: return op1.evaluate(ctx) + op2.evaluate(ctx); case ADD_EXP: return op1.evaluate(ctx) + op2.evaluate(ctx);
case MULTIPLY_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 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 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 ASSIGN_EXP: return ctx.assign( variableIdx, op1.evaluate(ctx) );
case LOOKUP_EXP: return ctx.getLookupMatch( lookupNameIdx, lookupValueIdxArray ); case LOOKUP_EXP: return ctx.getLookupMatch( lookupNameIdx, lookupValueIdxArray );

View file

@ -399,7 +399,8 @@ public abstract class BExpressionContext
for( int vi=0; vi<buildInVariableIdx.length; vi++ ) for( int vi=0; vi<buildInVariableIdx.length; vi++ )
{ {
arrayBuildInVariablesCache[vi][currentHashBucket] = variableData[buildInVariableIdx[vi]]; int idx = buildInVariableIdx[vi];
arrayBuildInVariablesCache[vi][currentHashBucket] = idx == -1 ? 0.f : variableData[idx];
} }
_receiver = null; _receiver = null;
@ -658,15 +659,16 @@ public abstract class BExpressionContext
linenr = 1; linenr = 1;
minWriteIdx = variableData == null ? 0 : variableData.length; minWriteIdx = variableData == null ? 0 : variableData.length;
// create the build-in variables expressionList = _parseFile( file );
// determine the build-in variable indices
String[] varNames = getBuildInVariableNames(); String[] varNames = getBuildInVariableNames();
buildInVariableIdx = new int[varNames.length]; buildInVariableIdx = new int[varNames.length];
for( int vi=0; vi<varNames.length; vi++ ) for( int vi=0; vi<varNames.length; vi++ )
{ {
buildInVariableIdx[vi] = getVariableIdx( varNames[vi], true ); buildInVariableIdx[vi] = getVariableIdx( varNames[vi], false );
} }
expressionList = _parseFile( file );
float[] readOnlyData = variableData; float[] readOnlyData = variableData;
variableData = new float[variableNumbers.size()]; variableData = new float[variableNumbers.size()];
for( int i=0; i<minWriteIdx; i++ ) for( int i=0; i<minWriteIdx; i++ )

View file

@ -11,7 +11,7 @@ package btools.expressions;
public final class BExpressionContextWay extends BExpressionContext public final class BExpressionContextWay extends BExpressionContext
{ {
private static String[] buildInVariables = private static String[] buildInVariables =
{ "costfactor", "turncost", "uphillcostfactor", "downhillcostfactor", "initialcost", "nodeaccessgranted" }; { "costfactor", "turncost", "uphillcostfactor", "downhillcostfactor", "initialcost", "nodeaccessgranted", "initialclassifier" };
protected String[] getBuildInVariableNames() protected String[] getBuildInVariableNames()
{ {
@ -24,6 +24,7 @@ public final class BExpressionContextWay extends BExpressionContext
public float getDownhillCostfactor() { return getBuildInVariable(3); } public float getDownhillCostfactor() { return getBuildInVariable(3); }
public float getInitialcost() { return getBuildInVariable(4); } public float getInitialcost() { return getBuildInVariable(4); }
public float getNodeAccessGranted() { return getBuildInVariable(5); } public float getNodeAccessGranted() { return getBuildInVariable(5); }
public float getInitialClassifier() { return getBuildInVariable(6); }
public BExpressionContextWay( BExpressionMetaData meta ) public BExpressionContextWay( BExpressionMetaData meta )