Reformat whole codebase using Android Studio
This commit is contained in:
parent
d5322667d5
commit
c15913c1ab
161 changed files with 15124 additions and 18537 deletions
|
|
@ -1,300 +1,255 @@
|
|||
package btools.expressions;
|
||||
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
final class BExpression
|
||||
{
|
||||
private static final int OR_EXP = 10;
|
||||
private static final int AND_EXP = 11;
|
||||
private static final int NOT_EXP = 12;
|
||||
|
||||
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 GREATER_EXP = 24;
|
||||
private static final int MIN_EXP = 25;
|
||||
|
||||
private static final int SUB_EXP = 26;
|
||||
private static final int LESSER_EXP = 27;
|
||||
private static final int XOR_EXP = 28;
|
||||
|
||||
private static final int SWITCH_EXP = 30;
|
||||
private static final int ASSIGN_EXP = 31;
|
||||
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 static final int VARIABLE_GET_EXP = 36;
|
||||
|
||||
private int typ;
|
||||
private BExpression op1;
|
||||
private BExpression op2;
|
||||
private BExpression op3;
|
||||
private float numberValue;
|
||||
private int variableIdx;
|
||||
private int lookupNameIdx;
|
||||
private int[] lookupValueIdxArray;
|
||||
|
||||
// Parse the expression and all subexpression
|
||||
public static BExpression parse( BExpressionContext ctx, int level ) throws Exception
|
||||
{
|
||||
return parse( ctx, level, null );
|
||||
}
|
||||
|
||||
private static BExpression parse( BExpressionContext ctx, int level, String optionalToken ) throws Exception
|
||||
{
|
||||
boolean brackets = false;
|
||||
String operator = ctx.parseToken();
|
||||
if ( optionalToken != null && optionalToken.equals( operator ) )
|
||||
{
|
||||
operator = ctx.parseToken();
|
||||
}
|
||||
if ( "(".equals( operator ) )
|
||||
{
|
||||
brackets = true;
|
||||
operator = ctx.parseToken();
|
||||
}
|
||||
|
||||
if ( operator == null )
|
||||
{
|
||||
if ( level == 0 ) return null;
|
||||
else throw new IllegalArgumentException( "unexpected end of file" );
|
||||
}
|
||||
|
||||
if ( level == 0 )
|
||||
{
|
||||
if ( !"assign".equals( operator ) )
|
||||
{
|
||||
throw new IllegalArgumentException( "operator " + operator + " is invalid on toplevel (only 'assign' allowed)" );
|
||||
}
|
||||
}
|
||||
|
||||
BExpression exp = new BExpression();
|
||||
int nops = 3;
|
||||
boolean ifThenElse = false;
|
||||
|
||||
if ( "switch".equals( operator ) )
|
||||
{
|
||||
exp.typ = SWITCH_EXP;
|
||||
}
|
||||
else if ( "if".equals( operator ) )
|
||||
{
|
||||
exp.typ = SWITCH_EXP;
|
||||
ifThenElse = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
nops = 2; // check binary expressions
|
||||
|
||||
if ( "or".equals( operator ) )
|
||||
{
|
||||
exp.typ = OR_EXP;
|
||||
}
|
||||
else if ( "and".equals( operator ) )
|
||||
{
|
||||
exp.typ = AND_EXP;
|
||||
}
|
||||
else if ( "multiply".equals( operator ) )
|
||||
{
|
||||
exp.typ = MULTIPLY_EXP;
|
||||
}
|
||||
else if ( "add".equals( operator ) )
|
||||
{
|
||||
exp.typ = ADD_EXP;
|
||||
}
|
||||
else if ( "max".equals( operator ) )
|
||||
{
|
||||
exp.typ = MAX_EXP;
|
||||
}
|
||||
else if ( "min".equals( operator ) )
|
||||
{
|
||||
exp.typ = MIN_EXP;
|
||||
}
|
||||
else if ( "equal".equals( operator ) )
|
||||
{
|
||||
exp.typ = EQUAL_EXP;
|
||||
}
|
||||
else if ( "greater".equals( operator ) )
|
||||
{
|
||||
exp.typ = GREATER_EXP;
|
||||
}
|
||||
else if ( "sub".equals( operator ) )
|
||||
{
|
||||
exp.typ = SUB_EXP;
|
||||
}
|
||||
else if ( "lesser".equals( operator ) )
|
||||
{
|
||||
exp.typ = LESSER_EXP;
|
||||
}
|
||||
else if ( "xor".equals( operator ) )
|
||||
{
|
||||
exp.typ = XOR_EXP;
|
||||
}
|
||||
else
|
||||
{
|
||||
nops = 1; // check unary expressions
|
||||
if ( "assign".equals( operator ) )
|
||||
{
|
||||
if ( level > 0 ) throw new IllegalArgumentException( "assign operator within expression" );
|
||||
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 );
|
||||
}
|
||||
else if ( "not".equals( operator ) )
|
||||
{
|
||||
exp.typ = NOT_EXP;
|
||||
}
|
||||
else
|
||||
{
|
||||
nops = 0; // check elemantary expressions
|
||||
int idx = operator.indexOf( '=' );
|
||||
if ( idx >= 0 )
|
||||
{
|
||||
exp.typ = LOOKUP_EXP;
|
||||
String name = operator.substring( 0, idx );
|
||||
String values = operator.substring( idx+1 );
|
||||
|
||||
exp.lookupNameIdx = ctx.getLookupNameIdx( name );
|
||||
if ( exp.lookupNameIdx < 0 )
|
||||
{
|
||||
throw new IllegalArgumentException( "unknown lookup name: " + name );
|
||||
}
|
||||
ctx.markLookupIdxUsed( exp.lookupNameIdx );
|
||||
StringTokenizer tk = new StringTokenizer( values, "|" );
|
||||
int nt = tk.countTokens();
|
||||
int nt2 = nt == 0 ? 1 : nt;
|
||||
exp.lookupValueIdxArray = new int[nt2];
|
||||
for( int ti=0; ti<nt2; ti++ )
|
||||
{
|
||||
String value = ti < nt ? tk.nextToken() : "";
|
||||
exp.lookupValueIdxArray[ti] = ctx.getLookupValueIdx( exp.lookupNameIdx, value );
|
||||
if ( exp.lookupValueIdxArray[ti] < 0 )
|
||||
{
|
||||
throw new IllegalArgumentException( "unknown lookup value: " + value );
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( ( idx = operator.indexOf( ':' ) ) >= 0 )
|
||||
{
|
||||
/*
|
||||
use of variable values
|
||||
assign no_height
|
||||
switch and not maxheight=
|
||||
lesser v:maxheight my_height true
|
||||
false
|
||||
*/
|
||||
if (operator.startsWith("v:")) {
|
||||
String name = operator.substring(2);
|
||||
exp.typ = VARIABLE_GET_EXP;
|
||||
exp.lookupNameIdx = ctx.getLookupNameIdx( name );
|
||||
} else {
|
||||
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;
|
||||
exp.variableIdx = idx;
|
||||
}
|
||||
else if ( "true".equals( operator ) )
|
||||
{
|
||||
exp.numberValue = 1.f;
|
||||
exp.typ = NUMBER_EXP;
|
||||
}
|
||||
else if ( "false".equals( operator ) )
|
||||
{
|
||||
exp.numberValue = 0.f;
|
||||
exp.typ = NUMBER_EXP;
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
exp.numberValue = Float.parseFloat( operator );
|
||||
exp.typ = NUMBER_EXP;
|
||||
}
|
||||
catch( NumberFormatException nfe )
|
||||
{
|
||||
throw new IllegalArgumentException( "unknown expression: " + operator );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// parse operands
|
||||
if ( nops > 0 )
|
||||
{
|
||||
exp.op1 = BExpression.parse( ctx, level+1, exp.typ == ASSIGN_EXP ? "=" : null );
|
||||
}
|
||||
if ( nops > 1 )
|
||||
{
|
||||
if ( ifThenElse ) checkExpectedToken( ctx, "then" );
|
||||
exp.op2 = BExpression.parse( ctx, level+1, null );
|
||||
}
|
||||
if ( nops > 2 )
|
||||
{
|
||||
if ( ifThenElse ) checkExpectedToken( ctx, "else" );
|
||||
exp.op3 = BExpression.parse( ctx, level+1, null );
|
||||
}
|
||||
if ( brackets )
|
||||
{
|
||||
checkExpectedToken( ctx, ")" );
|
||||
}
|
||||
return exp;
|
||||
}
|
||||
|
||||
private static void checkExpectedToken( BExpressionContext ctx, String expected ) throws Exception
|
||||
{
|
||||
String token = ctx.parseToken();
|
||||
if ( ! expected.equals( token ) )
|
||||
{
|
||||
throw new IllegalArgumentException( "unexpected token: " + token + ", expected: " + expected );
|
||||
}
|
||||
}
|
||||
|
||||
// Evaluate the expression
|
||||
public float evaluate( BExpressionContext ctx )
|
||||
{
|
||||
switch( typ )
|
||||
{
|
||||
case OR_EXP: return op1.evaluate(ctx) != 0.f ? 1.f : ( op2.evaluate(ctx) != 0.f ? 1.f : 0.f );
|
||||
case XOR_EXP: return ( (op1.evaluate(ctx) != 0.f) ^ ( op2.evaluate(ctx) != 0.f ) ? 1.f : 0.f );
|
||||
case AND_EXP: return op1.evaluate(ctx) != 0.f ? ( op2.evaluate(ctx) != 0.f ? 1.f : 0.f ) : 0.f;
|
||||
case ADD_EXP: return op1.evaluate(ctx) + op2.evaluate(ctx);
|
||||
case SUB_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 MIN_EXP: return min( op1.evaluate(ctx), op2.evaluate(ctx) );
|
||||
case EQUAL_EXP: return op1.evaluate(ctx) == op2.evaluate(ctx) ? 1.f : 0.f;
|
||||
case GREATER_EXP: return op1.evaluate(ctx) > op2.evaluate(ctx) ? 1.f : 0.f;
|
||||
case LESSER_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 );
|
||||
case NUMBER_EXP: return numberValue;
|
||||
case VARIABLE_EXP: return ctx.getVariableValue( variableIdx );
|
||||
case FOREIGN_VARIABLE_EXP: return ctx.getForeignVariableValue( variableIdx );
|
||||
case VARIABLE_GET_EXP: return ctx.getLookupValue(lookupNameIdx);
|
||||
case NOT_EXP: return op1.evaluate(ctx) == 0.f ? 1.f : 0.f;
|
||||
default: throw new IllegalArgumentException( "unknown op-code: " + typ );
|
||||
}
|
||||
}
|
||||
|
||||
private float max( float v1, float v2 )
|
||||
{
|
||||
return v1 > v2 ? v1 : v2;
|
||||
}
|
||||
|
||||
private float min( float v1, float v2 )
|
||||
{
|
||||
return v1 < v2 ? v1 : v2;
|
||||
}
|
||||
}
|
||||
package btools.expressions;
|
||||
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
final class BExpression {
|
||||
private static final int OR_EXP = 10;
|
||||
private static final int AND_EXP = 11;
|
||||
private static final int NOT_EXP = 12;
|
||||
|
||||
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 GREATER_EXP = 24;
|
||||
private static final int MIN_EXP = 25;
|
||||
|
||||
private static final int SUB_EXP = 26;
|
||||
private static final int LESSER_EXP = 27;
|
||||
private static final int XOR_EXP = 28;
|
||||
|
||||
private static final int SWITCH_EXP = 30;
|
||||
private static final int ASSIGN_EXP = 31;
|
||||
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 static final int VARIABLE_GET_EXP = 36;
|
||||
|
||||
private int typ;
|
||||
private BExpression op1;
|
||||
private BExpression op2;
|
||||
private BExpression op3;
|
||||
private float numberValue;
|
||||
private int variableIdx;
|
||||
private int lookupNameIdx;
|
||||
private int[] lookupValueIdxArray;
|
||||
|
||||
// Parse the expression and all subexpression
|
||||
public static BExpression parse(BExpressionContext ctx, int level) throws Exception {
|
||||
return parse(ctx, level, null);
|
||||
}
|
||||
|
||||
private static BExpression parse(BExpressionContext ctx, int level, String optionalToken) throws Exception {
|
||||
boolean brackets = false;
|
||||
String operator = ctx.parseToken();
|
||||
if (optionalToken != null && optionalToken.equals(operator)) {
|
||||
operator = ctx.parseToken();
|
||||
}
|
||||
if ("(".equals(operator)) {
|
||||
brackets = true;
|
||||
operator = ctx.parseToken();
|
||||
}
|
||||
|
||||
if (operator == null) {
|
||||
if (level == 0) return null;
|
||||
else throw new IllegalArgumentException("unexpected end of file");
|
||||
}
|
||||
|
||||
if (level == 0) {
|
||||
if (!"assign".equals(operator)) {
|
||||
throw new IllegalArgumentException("operator " + operator + " is invalid on toplevel (only 'assign' allowed)");
|
||||
}
|
||||
}
|
||||
|
||||
BExpression exp = new BExpression();
|
||||
int nops = 3;
|
||||
boolean ifThenElse = false;
|
||||
|
||||
if ("switch".equals(operator)) {
|
||||
exp.typ = SWITCH_EXP;
|
||||
} else if ("if".equals(operator)) {
|
||||
exp.typ = SWITCH_EXP;
|
||||
ifThenElse = true;
|
||||
} else {
|
||||
nops = 2; // check binary expressions
|
||||
|
||||
if ("or".equals(operator)) {
|
||||
exp.typ = OR_EXP;
|
||||
} else if ("and".equals(operator)) {
|
||||
exp.typ = AND_EXP;
|
||||
} else if ("multiply".equals(operator)) {
|
||||
exp.typ = MULTIPLY_EXP;
|
||||
} else if ("add".equals(operator)) {
|
||||
exp.typ = ADD_EXP;
|
||||
} else if ("max".equals(operator)) {
|
||||
exp.typ = MAX_EXP;
|
||||
} else if ("min".equals(operator)) {
|
||||
exp.typ = MIN_EXP;
|
||||
} else if ("equal".equals(operator)) {
|
||||
exp.typ = EQUAL_EXP;
|
||||
} else if ("greater".equals(operator)) {
|
||||
exp.typ = GREATER_EXP;
|
||||
} else if ("sub".equals(operator)) {
|
||||
exp.typ = SUB_EXP;
|
||||
} else if ("lesser".equals(operator)) {
|
||||
exp.typ = LESSER_EXP;
|
||||
} else if ("xor".equals(operator)) {
|
||||
exp.typ = XOR_EXP;
|
||||
} else {
|
||||
nops = 1; // check unary expressions
|
||||
if ("assign".equals(operator)) {
|
||||
if (level > 0) throw new IllegalArgumentException("assign operator within expression");
|
||||
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);
|
||||
} else if ("not".equals(operator)) {
|
||||
exp.typ = NOT_EXP;
|
||||
} else {
|
||||
nops = 0; // check elemantary expressions
|
||||
int idx = operator.indexOf('=');
|
||||
if (idx >= 0) {
|
||||
exp.typ = LOOKUP_EXP;
|
||||
String name = operator.substring(0, idx);
|
||||
String values = operator.substring(idx + 1);
|
||||
|
||||
exp.lookupNameIdx = ctx.getLookupNameIdx(name);
|
||||
if (exp.lookupNameIdx < 0) {
|
||||
throw new IllegalArgumentException("unknown lookup name: " + name);
|
||||
}
|
||||
ctx.markLookupIdxUsed(exp.lookupNameIdx);
|
||||
StringTokenizer tk = new StringTokenizer(values, "|");
|
||||
int nt = tk.countTokens();
|
||||
int nt2 = nt == 0 ? 1 : nt;
|
||||
exp.lookupValueIdxArray = new int[nt2];
|
||||
for (int ti = 0; ti < nt2; ti++) {
|
||||
String value = ti < nt ? tk.nextToken() : "";
|
||||
exp.lookupValueIdxArray[ti] = ctx.getLookupValueIdx(exp.lookupNameIdx, value);
|
||||
if (exp.lookupValueIdxArray[ti] < 0) {
|
||||
throw new IllegalArgumentException("unknown lookup value: " + value);
|
||||
}
|
||||
}
|
||||
} else if ((idx = operator.indexOf(':')) >= 0) {
|
||||
/*
|
||||
use of variable values
|
||||
assign no_height
|
||||
switch and not maxheight=
|
||||
lesser v:maxheight my_height true
|
||||
false
|
||||
*/
|
||||
if (operator.startsWith("v:")) {
|
||||
String name = operator.substring(2);
|
||||
exp.typ = VARIABLE_GET_EXP;
|
||||
exp.lookupNameIdx = ctx.getLookupNameIdx(name);
|
||||
} else {
|
||||
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;
|
||||
exp.variableIdx = idx;
|
||||
} else if ("true".equals(operator)) {
|
||||
exp.numberValue = 1.f;
|
||||
exp.typ = NUMBER_EXP;
|
||||
} else if ("false".equals(operator)) {
|
||||
exp.numberValue = 0.f;
|
||||
exp.typ = NUMBER_EXP;
|
||||
} else {
|
||||
try {
|
||||
exp.numberValue = Float.parseFloat(operator);
|
||||
exp.typ = NUMBER_EXP;
|
||||
} catch (NumberFormatException nfe) {
|
||||
throw new IllegalArgumentException("unknown expression: " + operator);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// parse operands
|
||||
if (nops > 0) {
|
||||
exp.op1 = BExpression.parse(ctx, level + 1, exp.typ == ASSIGN_EXP ? "=" : null);
|
||||
}
|
||||
if (nops > 1) {
|
||||
if (ifThenElse) checkExpectedToken(ctx, "then");
|
||||
exp.op2 = BExpression.parse(ctx, level + 1, null);
|
||||
}
|
||||
if (nops > 2) {
|
||||
if (ifThenElse) checkExpectedToken(ctx, "else");
|
||||
exp.op3 = BExpression.parse(ctx, level + 1, null);
|
||||
}
|
||||
if (brackets) {
|
||||
checkExpectedToken(ctx, ")");
|
||||
}
|
||||
return exp;
|
||||
}
|
||||
|
||||
private static void checkExpectedToken(BExpressionContext ctx, String expected) throws Exception {
|
||||
String token = ctx.parseToken();
|
||||
if (!expected.equals(token)) {
|
||||
throw new IllegalArgumentException("unexpected token: " + token + ", expected: " + expected);
|
||||
}
|
||||
}
|
||||
|
||||
// Evaluate the expression
|
||||
public float evaluate(BExpressionContext ctx) {
|
||||
switch (typ) {
|
||||
case OR_EXP:
|
||||
return op1.evaluate(ctx) != 0.f ? 1.f : (op2.evaluate(ctx) != 0.f ? 1.f : 0.f);
|
||||
case XOR_EXP:
|
||||
return ((op1.evaluate(ctx) != 0.f) ^ (op2.evaluate(ctx) != 0.f) ? 1.f : 0.f);
|
||||
case AND_EXP:
|
||||
return op1.evaluate(ctx) != 0.f ? (op2.evaluate(ctx) != 0.f ? 1.f : 0.f) : 0.f;
|
||||
case ADD_EXP:
|
||||
return op1.evaluate(ctx) + op2.evaluate(ctx);
|
||||
case SUB_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 MIN_EXP:
|
||||
return min(op1.evaluate(ctx), op2.evaluate(ctx));
|
||||
case EQUAL_EXP:
|
||||
return op1.evaluate(ctx) == op2.evaluate(ctx) ? 1.f : 0.f;
|
||||
case GREATER_EXP:
|
||||
return op1.evaluate(ctx) > op2.evaluate(ctx) ? 1.f : 0.f;
|
||||
case LESSER_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);
|
||||
case NUMBER_EXP:
|
||||
return numberValue;
|
||||
case VARIABLE_EXP:
|
||||
return ctx.getVariableValue(variableIdx);
|
||||
case FOREIGN_VARIABLE_EXP:
|
||||
return ctx.getForeignVariableValue(variableIdx);
|
||||
case VARIABLE_GET_EXP:
|
||||
return ctx.getLookupValue(lookupNameIdx);
|
||||
case NOT_EXP:
|
||||
return op1.evaluate(ctx) == 0.f ? 1.f : 0.f;
|
||||
default:
|
||||
throw new IllegalArgumentException("unknown op-code: " + typ);
|
||||
}
|
||||
}
|
||||
|
||||
private float max(float v1, float v2) {
|
||||
return v1 > v2 ? v1 : v2;
|
||||
}
|
||||
|
||||
private float min(float v1, float v2) {
|
||||
return v1 < v2 ? v1 : v2;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -7,32 +7,29 @@
|
|||
package btools.expressions;
|
||||
|
||||
|
||||
|
||||
public final class BExpressionContextNode extends BExpressionContext
|
||||
{
|
||||
public final class BExpressionContextNode extends BExpressionContext {
|
||||
private static String[] buildInVariables =
|
||||
{ "initialcost" };
|
||||
|
||||
protected String[] getBuildInVariableNames()
|
||||
{
|
||||
{"initialcost"};
|
||||
|
||||
protected String[] getBuildInVariableNames() {
|
||||
return buildInVariables;
|
||||
}
|
||||
|
||||
public float getInitialcost() { return getBuildInVariable(0); }
|
||||
public float getInitialcost() {
|
||||
return getBuildInVariable(0);
|
||||
}
|
||||
|
||||
|
||||
public BExpressionContextNode( BExpressionMetaData meta )
|
||||
{
|
||||
super( "node", meta );
|
||||
public BExpressionContextNode(BExpressionMetaData meta) {
|
||||
super("node", meta);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an Expression-Context for way context
|
||||
*
|
||||
* @param hashSize size of hashmap for result caching
|
||||
* @param hashSize size of hashmap for result caching
|
||||
*/
|
||||
public BExpressionContextNode( int hashSize, BExpressionMetaData meta )
|
||||
{
|
||||
super( "node", hashSize, meta );
|
||||
public BExpressionContextNode(int hashSize, BExpressionMetaData meta) {
|
||||
super("node", hashSize, meta);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,66 +8,93 @@ package btools.expressions;
|
|||
|
||||
import btools.codec.TagValueValidator;
|
||||
|
||||
public final class BExpressionContextWay extends BExpressionContext implements TagValueValidator
|
||||
{
|
||||
public final class BExpressionContextWay extends BExpressionContext implements TagValueValidator {
|
||||
private boolean decodeForbidden = true;
|
||||
|
||||
private static String[] buildInVariables =
|
||||
{ "costfactor", "turncost", "uphillcostfactor", "downhillcostfactor", "initialcost", "nodeaccessgranted", "initialclassifier", "trafficsourcedensity", "istrafficbackbone", "priorityclassifier", "classifiermask", "maxspeed" };
|
||||
|
||||
protected String[] getBuildInVariableNames()
|
||||
{
|
||||
{"costfactor", "turncost", "uphillcostfactor", "downhillcostfactor", "initialcost", "nodeaccessgranted", "initialclassifier", "trafficsourcedensity", "istrafficbackbone", "priorityclassifier", "classifiermask", "maxspeed"};
|
||||
|
||||
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 float getInitialClassifier() { return getBuildInVariable(6); }
|
||||
public float getTrafficSourceDensity() { return getBuildInVariable(7); }
|
||||
public float getIsTrafficBackbone() { return getBuildInVariable(8); }
|
||||
public float getPriorityClassifier() { return getBuildInVariable(9); }
|
||||
public float getClassifierMask() { return getBuildInVariable(10); }
|
||||
public float getMaxspeed() { return getBuildInVariable(11); }
|
||||
public float getCostfactor() {
|
||||
return getBuildInVariable(0);
|
||||
}
|
||||
|
||||
public BExpressionContextWay( BExpressionMetaData meta )
|
||||
{
|
||||
super( "way", meta );
|
||||
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 float getInitialClassifier() {
|
||||
return getBuildInVariable(6);
|
||||
}
|
||||
|
||||
public float getTrafficSourceDensity() {
|
||||
return getBuildInVariable(7);
|
||||
}
|
||||
|
||||
public float getIsTrafficBackbone() {
|
||||
return getBuildInVariable(8);
|
||||
}
|
||||
|
||||
public float getPriorityClassifier() {
|
||||
return getBuildInVariable(9);
|
||||
}
|
||||
|
||||
public float getClassifierMask() {
|
||||
return getBuildInVariable(10);
|
||||
}
|
||||
|
||||
public float getMaxspeed() {
|
||||
return getBuildInVariable(11);
|
||||
}
|
||||
|
||||
public BExpressionContextWay(BExpressionMetaData meta) {
|
||||
super("way", meta);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an Expression-Context for way context
|
||||
*
|
||||
* @param hashSize size of hashmap for result caching
|
||||
* @param hashSize size of hashmap for result caching
|
||||
*/
|
||||
public BExpressionContextWay( int hashSize, BExpressionMetaData meta )
|
||||
{
|
||||
super( "way", hashSize, meta );
|
||||
public BExpressionContextWay(int hashSize, BExpressionMetaData meta) {
|
||||
super("way", hashSize, meta);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int accessType( byte[] description )
|
||||
{
|
||||
evaluate( false, description );
|
||||
public int accessType(byte[] description) {
|
||||
evaluate(false, description);
|
||||
float minCostFactor = getCostfactor();
|
||||
if ( minCostFactor >= 9999.f )
|
||||
{
|
||||
if (minCostFactor >= 9999.f) {
|
||||
setInverseVars();
|
||||
float reverseCostFactor = getCostfactor();
|
||||
if ( reverseCostFactor < minCostFactor )
|
||||
{
|
||||
if (reverseCostFactor < minCostFactor) {
|
||||
minCostFactor = reverseCostFactor;
|
||||
}
|
||||
}
|
||||
return minCostFactor < 9999.f ? 2 : decodeForbidden ? (minCostFactor < 10000.f ? 1 : 0) : 0;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void setDecodeForbidden( boolean decodeForbidden )
|
||||
{
|
||||
this.decodeForbidden= decodeForbidden;
|
||||
public void setDecodeForbidden(boolean decodeForbidden) {
|
||||
this.decodeForbidden = decodeForbidden;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,66 +1,56 @@
|
|||
/**
|
||||
* A lookup value with optional aliases
|
||||
*
|
||||
* toString just gives the primary value,
|
||||
* equals just compares against primary value
|
||||
* matches() also compares aliases
|
||||
*
|
||||
* @author ab
|
||||
*/
|
||||
package btools.expressions;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
final class BExpressionLookupValue
|
||||
{
|
||||
String value;
|
||||
ArrayList<String> aliases;
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
public BExpressionLookupValue( String value )
|
||||
{
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public void addAlias( String alias )
|
||||
{
|
||||
if ( aliases == null ) aliases = new ArrayList<String>();
|
||||
aliases.add( alias );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals( Object o )
|
||||
{
|
||||
if ( o instanceof String )
|
||||
{
|
||||
String v = (String)o;
|
||||
return value.equals( v );
|
||||
}
|
||||
if ( o instanceof BExpressionLookupValue )
|
||||
{
|
||||
BExpressionLookupValue v = (BExpressionLookupValue)o;
|
||||
|
||||
return value.equals( v.value );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean matches( String s )
|
||||
{
|
||||
if ( value.equals( s ) ) return true;
|
||||
if ( aliases != null )
|
||||
{
|
||||
for( String alias : aliases )
|
||||
{
|
||||
if ( alias.equals( s ) ) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* A lookup value with optional aliases
|
||||
* <p>
|
||||
* toString just gives the primary value,
|
||||
* equals just compares against primary value
|
||||
* matches() also compares aliases
|
||||
*
|
||||
* @author ab
|
||||
*/
|
||||
package btools.expressions;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
final class BExpressionLookupValue {
|
||||
String value;
|
||||
ArrayList<String> aliases;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public BExpressionLookupValue(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public void addAlias(String alias) {
|
||||
if (aliases == null) aliases = new ArrayList<String>();
|
||||
aliases.add(alias);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (o instanceof String) {
|
||||
String v = (String) o;
|
||||
return value.equals(v);
|
||||
}
|
||||
if (o instanceof BExpressionLookupValue) {
|
||||
BExpressionLookupValue v = (BExpressionLookupValue) o;
|
||||
|
||||
return value.equals(v.value);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean matches(String s) {
|
||||
if (value.equals(s)) return true;
|
||||
if (aliases != null) {
|
||||
for (String alias : aliases) {
|
||||
if (alias.equals(s)) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,9 +21,8 @@ import btools.util.BitCoderContext;
|
|||
import btools.util.Crc32;
|
||||
|
||||
|
||||
public final class BExpressionMetaData
|
||||
{
|
||||
private static final String CONTEXT_TAG = "---context:";
|
||||
public final class BExpressionMetaData {
|
||||
private static final String CONTEXT_TAG = "---context:";
|
||||
private static final String VERSION_TAG = "---lookupversion:";
|
||||
private static final String MINOR_VERSION_TAG = "---minorversion:";
|
||||
private static final String VARLENGTH_TAG = "---readvarlength";
|
||||
|
|
@ -31,59 +30,49 @@ public final class BExpressionMetaData
|
|||
public short lookupVersion = -1;
|
||||
public short lookupMinorVersion = -1;
|
||||
|
||||
private HashMap<String,BExpressionContext> listeners = new HashMap<String,BExpressionContext>();
|
||||
|
||||
public void registerListener( String context, BExpressionContext ctx )
|
||||
{
|
||||
listeners.put( context, ctx );
|
||||
private HashMap<String, BExpressionContext> listeners = new HashMap<String, BExpressionContext>();
|
||||
|
||||
public void registerListener(String context, BExpressionContext ctx) {
|
||||
listeners.put(context, ctx);
|
||||
}
|
||||
|
||||
public void readMetaData( File lookupsFile )
|
||||
{
|
||||
try
|
||||
{
|
||||
BufferedReader br = new BufferedReader( new FileReader( lookupsFile ) );
|
||||
|
||||
BExpressionContext ctx = null;
|
||||
|
||||
for(;;)
|
||||
{
|
||||
String line = br.readLine();
|
||||
if ( line == null ) break;
|
||||
line = line.trim();
|
||||
if ( line.length() == 0 || line.startsWith( "#" ) ) continue;
|
||||
if ( line.startsWith( CONTEXT_TAG ) )
|
||||
{
|
||||
ctx = listeners.get( line.substring( CONTEXT_TAG.length() ) );
|
||||
continue;
|
||||
|
||||
public void readMetaData(File lookupsFile) {
|
||||
try {
|
||||
BufferedReader br = new BufferedReader(new FileReader(lookupsFile));
|
||||
|
||||
BExpressionContext ctx = null;
|
||||
|
||||
for (; ; ) {
|
||||
String line = br.readLine();
|
||||
if (line == null) break;
|
||||
line = line.trim();
|
||||
if (line.length() == 0 || line.startsWith("#")) continue;
|
||||
if (line.startsWith(CONTEXT_TAG)) {
|
||||
ctx = listeners.get(line.substring(CONTEXT_TAG.length()));
|
||||
continue;
|
||||
}
|
||||
if (line.startsWith(VERSION_TAG)) {
|
||||
lookupVersion = Short.parseShort(line.substring(VERSION_TAG.length()));
|
||||
continue;
|
||||
}
|
||||
if (line.startsWith(MINOR_VERSION_TAG)) {
|
||||
lookupMinorVersion = Short.parseShort(line.substring(MINOR_VERSION_TAG.length()));
|
||||
continue;
|
||||
}
|
||||
if (line.startsWith(VARLENGTH_TAG)) // tag removed...
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (ctx != null) ctx.parseMetaLine(line);
|
||||
}
|
||||
if ( line.startsWith( VERSION_TAG ) )
|
||||
{
|
||||
lookupVersion = Short.parseShort( line.substring( VERSION_TAG.length() ) );
|
||||
continue;
|
||||
br.close();
|
||||
|
||||
for (BExpressionContext c : listeners.values()) {
|
||||
c.finishMetaParsing();
|
||||
}
|
||||
if ( line.startsWith( MINOR_VERSION_TAG ) )
|
||||
{
|
||||
lookupMinorVersion = Short.parseShort( line.substring( MINOR_VERSION_TAG.length() ) );
|
||||
continue;
|
||||
}
|
||||
if ( line.startsWith( VARLENGTH_TAG ) ) // tag removed...
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( ctx != null ) ctx.parseMetaLine( line );
|
||||
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
br.close();
|
||||
|
||||
for( BExpressionContext c : listeners.values() )
|
||||
{
|
||||
c.finishMetaParsing();
|
||||
}
|
||||
|
||||
}
|
||||
catch( Exception e )
|
||||
{
|
||||
throw new RuntimeException( e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,29 +4,24 @@ import java.util.Arrays;
|
|||
|
||||
import btools.util.LruMapNode;
|
||||
|
||||
public final class CacheNode extends LruMapNode
|
||||
{
|
||||
public final class CacheNode extends LruMapNode {
|
||||
byte[] ab;
|
||||
float[] vars;
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
public int hashCode() {
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals( Object o )
|
||||
{
|
||||
public boolean equals(Object o) {
|
||||
CacheNode n = (CacheNode) o;
|
||||
if ( hash != n.hash )
|
||||
{
|
||||
if (hash != n.hash) {
|
||||
return false;
|
||||
}
|
||||
if ( ab == null )
|
||||
{
|
||||
if (ab == null) {
|
||||
return true; // hack: null = crc match only
|
||||
}
|
||||
return Arrays.equals( ab, n.ab );
|
||||
return Arrays.equals(ab, n.ab);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,45 +3,40 @@ package btools.expressions;
|
|||
import java.io.File;
|
||||
import java.util.Random;
|
||||
|
||||
public final class ProfileComparator
|
||||
{
|
||||
public static void main( String[] args )
|
||||
{
|
||||
if ( args.length != 4 )
|
||||
{
|
||||
System.out.println( "usage: java ProfileComparator <lookup-file> <profile1> <profile2> <nsamples>" );
|
||||
public final class ProfileComparator {
|
||||
public static void main(String[] args) {
|
||||
if (args.length != 4) {
|
||||
System.out.println("usage: java ProfileComparator <lookup-file> <profile1> <profile2> <nsamples>");
|
||||
return;
|
||||
}
|
||||
|
||||
File lookupFile = new File( args[0] );
|
||||
File profile1File = new File( args[1] );
|
||||
File profile2File = new File( args[2] );
|
||||
int nsamples = Integer.parseInt( args[3] );
|
||||
testContext( lookupFile, profile1File, profile2File, nsamples, false );
|
||||
testContext( lookupFile, profile1File, profile2File, nsamples, true );
|
||||
File lookupFile = new File(args[0]);
|
||||
File profile1File = new File(args[1]);
|
||||
File profile2File = new File(args[2]);
|
||||
int nsamples = Integer.parseInt(args[3]);
|
||||
testContext(lookupFile, profile1File, profile2File, nsamples, false);
|
||||
testContext(lookupFile, profile1File, profile2File, nsamples, true);
|
||||
|
||||
}
|
||||
|
||||
private static void testContext( File lookupFile, File profile1File, File profile2File, int nsamples, boolean nodeContext )
|
||||
{
|
||||
|
||||
private static void testContext(File lookupFile, File profile1File, File profile2File, int nsamples, boolean nodeContext) {
|
||||
// read lookup.dat + profiles
|
||||
BExpressionMetaData meta1 = new BExpressionMetaData();
|
||||
BExpressionMetaData meta2 = new BExpressionMetaData();
|
||||
BExpressionContext expctx1 = nodeContext ? new BExpressionContextNode( meta1 ) : new BExpressionContextWay( meta1 );
|
||||
BExpressionContext expctx2 = nodeContext ? new BExpressionContextNode( meta2 ) : new BExpressionContextWay( meta2 );
|
||||
meta1.readMetaData( lookupFile );
|
||||
meta2.readMetaData( lookupFile );
|
||||
expctx1.parseFile( profile1File, "global" );
|
||||
expctx2.parseFile( profile2File, "global" );
|
||||
BExpressionContext expctx1 = nodeContext ? new BExpressionContextNode(meta1) : new BExpressionContextWay(meta1);
|
||||
BExpressionContext expctx2 = nodeContext ? new BExpressionContextNode(meta2) : new BExpressionContextWay(meta2);
|
||||
meta1.readMetaData(lookupFile);
|
||||
meta2.readMetaData(lookupFile);
|
||||
expctx1.parseFile(profile1File, "global");
|
||||
expctx2.parseFile(profile2File, "global");
|
||||
|
||||
Random rnd = new Random();
|
||||
for( int i=0; i<nsamples; i++ )
|
||||
{
|
||||
int[] data = expctx1.generateRandomValues( rnd );
|
||||
expctx1.evaluate( data );
|
||||
expctx2.evaluate( data );
|
||||
|
||||
expctx1.assertAllVariablesEqual( expctx2 );
|
||||
for (int i = 0; i < nsamples; i++) {
|
||||
int[] data = expctx1.generateRandomValues(rnd);
|
||||
expctx1.evaluate(data);
|
||||
expctx2.evaluate(data);
|
||||
|
||||
expctx1.assertAllVariablesEqual(expctx2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,24 +4,20 @@ import java.util.Arrays;
|
|||
|
||||
import btools.util.LruMapNode;
|
||||
|
||||
public final class VarWrapper extends LruMapNode
|
||||
{
|
||||
public final class VarWrapper extends LruMapNode {
|
||||
float[] vars;
|
||||
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
public int hashCode() {
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals( Object o )
|
||||
{
|
||||
public boolean equals(Object o) {
|
||||
VarWrapper n = (VarWrapper) o;
|
||||
if ( hash != n.hash )
|
||||
{
|
||||
if (hash != n.hash) {
|
||||
return false;
|
||||
}
|
||||
return Arrays.equals( vars, n.vars );
|
||||
return Arrays.equals(vars, n.vars);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,54 +7,52 @@ import java.net.URL;
|
|||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
public class EncodeDecodeTest
|
||||
{
|
||||
public class EncodeDecodeTest {
|
||||
@Test
|
||||
public void encodeDecodeTest()
|
||||
{
|
||||
URL testpurl = this.getClass().getResource( "/dummy.txt" );
|
||||
public void encodeDecodeTest() {
|
||||
URL testpurl = this.getClass().getResource("/dummy.txt");
|
||||
File workingDir = new File(testpurl.getFile()).getParentFile();
|
||||
File profileDir = new File( workingDir, "/../../../../misc/profiles2" );
|
||||
File profileDir = new File(workingDir, "/../../../../misc/profiles2");
|
||||
//File lookupFile = new File( profileDir, "lookups.dat" );
|
||||
// add a test lookup
|
||||
URL testlookup = this.getClass().getResource( "/lookups_test.dat" );
|
||||
File lookupFile = new File( testlookup.getPath() );
|
||||
|
||||
// add a test lookup
|
||||
URL testlookup = this.getClass().getResource("/lookups_test.dat");
|
||||
File lookupFile = new File(testlookup.getPath());
|
||||
|
||||
// read lookup.dat + trekking.brf
|
||||
BExpressionMetaData meta = new BExpressionMetaData();
|
||||
BExpressionContextWay expctxWay = new BExpressionContextWay( meta );
|
||||
meta.readMetaData( lookupFile );
|
||||
expctxWay.parseFile( new File( profileDir, "trekking.brf" ), "global" );
|
||||
BExpressionContextWay expctxWay = new BExpressionContextWay(meta);
|
||||
meta.readMetaData(lookupFile);
|
||||
expctxWay.parseFile(new File(profileDir, "trekking.brf"), "global");
|
||||
|
||||
String[] tags = {
|
||||
"highway=residential",
|
||||
"oneway=yes",
|
||||
"depth=1'6\"",
|
||||
"highway=residential",
|
||||
"oneway=yes",
|
||||
"depth=1'6\"",
|
||||
// "depth=6 feet",
|
||||
"maxheight=5.1m",
|
||||
"maxdraft=~3 mt",
|
||||
"reversedirection=yes"
|
||||
"maxheight=5.1m",
|
||||
"maxdraft=~3 mt",
|
||||
"reversedirection=yes"
|
||||
};
|
||||
|
||||
// encode the tags into 64 bit description word
|
||||
int[] lookupData = expctxWay.createNewLookupData();
|
||||
for( String arg: tags )
|
||||
{
|
||||
int idx = arg.indexOf( '=' );
|
||||
if ( idx < 0 ) throw new IllegalArgumentException( "bad argument (should be <tag>=<value>): " + arg );
|
||||
String key = arg.substring( 0, idx );
|
||||
String value = arg.substring( idx+1 );
|
||||
|
||||
expctxWay.addLookupValue( key, value, lookupData );
|
||||
for (String arg : tags) {
|
||||
int idx = arg.indexOf('=');
|
||||
if (idx < 0)
|
||||
throw new IllegalArgumentException("bad argument (should be <tag>=<value>): " + arg);
|
||||
String key = arg.substring(0, idx);
|
||||
String value = arg.substring(idx + 1);
|
||||
|
||||
expctxWay.addLookupValue(key, value, lookupData);
|
||||
}
|
||||
byte[] description = expctxWay.encode(lookupData);
|
||||
|
||||
// calculate the cost factor from that description
|
||||
expctxWay.evaluate( true, description ); // true = "reversedirection=yes" (not encoded in description anymore)
|
||||
expctxWay.evaluate(true, description); // true = "reversedirection=yes" (not encoded in description anymore)
|
||||
|
||||
System.out.println( "description: " + expctxWay.getKeyValueDescription(true, description) );
|
||||
System.out.println("description: " + expctxWay.getKeyValueDescription(true, description));
|
||||
|
||||
float costfactor = expctxWay.getCostfactor();
|
||||
Assert.assertTrue( "costfactor mismatch", Math.abs( costfactor - 5.15 ) < 0.00001 );
|
||||
Assert.assertTrue("costfactor mismatch", Math.abs(costfactor - 5.15) < 0.00001);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue