use of uk.me.parabola.mkgmap.osmstyle.eval.Op in project mkgmap by openstreetmap.
the class RulesTest method runArrangeTest.
private boolean runArrangeTest(String rule, int id) {
TokenScanner scanner = new TokenScanner("test.file", new StringReader(rule));
ExpressionReader er = new ExpressionReader(scanner, FeatureKind.POLYLINE);
Op op = er.readConditions();
boolean[] orig = evalWays(op);
Op result = arranger.arrange(op);
if (!isSolved(result))
throw new SyntaxException("Could not solve rule expression: best attempt was " + fmtExpr(result));
boolean[] after = evalWays(result);
boolean ok = Arrays.equals(after, orig);
if (ok) {
if (!onlyErrors)
System.out.println("OK: " + rule);
} else {
System.out.println("ERROR: FAILED test: " + rule);
System.out.println(" new expr: " + op);
for (int i = 0; i < orig.length; i++) {
if (orig[i] != after[i]) {
System.out.println(" way " + testWays.get(i) + ", orig=" + orig[i] + ", arranged=" + after[i]);
}
}
checkStopOnFail();
}
return ok;
}
use of uk.me.parabola.mkgmap.osmstyle.eval.Op in project mkgmap by openstreetmap.
the class RulesTest method run.
private void run() {
initTestWays();
int errors = 0;
int count;
for (count = 0; count < maxRules && errors < maxErrors; ) {
Op expr = generateExpr(true);
boolean invalid = checkEmpty(expr);
if (!invalid) {
count++;
String rule = expr + String.format(" {name 'n%d'} [0x2]", count);
boolean ok = testRule(rule, count);
if (!ok)
errors++;
}
}
executor.shutdownNow();
System.out.printf("Tests: %s, errors=%d (%d non-syntax failures), passed=%d. ", count, errors, errors - syntaxErrors, count - errors);
System.out.printf("Seed was %d\n", seed);
}
use of uk.me.parabola.mkgmap.osmstyle.eval.Op in project mkgmap by openstreetmap.
the class RuleSet method compileOp.
private Op compileOp(HashMap<String, Op> tests, Op op) {
if (op instanceof AbstractBinaryOp) {
AbstractBinaryOp binOp = (AbstractBinaryOp) op;
binOp.setFirst(compileOp(tests, binOp.getFirst()));
binOp.setSecond(compileOp(tests, binOp.getSecond()));
}
if (op instanceof LinkedOp) {
// LinkedOp is referenced by other OPs, don't replace it
return op;
}
String test = op.toString();
Op commonOp = tests.get(test);
if (commonOp == null) {
if (op instanceof AbstractOp)
((AbstractOp) op).resetCache();
tests.put(test, op);
commonOp = op;
}
return commonOp;
}
use of uk.me.parabola.mkgmap.osmstyle.eval.Op in project mkgmap by openstreetmap.
the class RuleSet method compile.
/**
* Compile the rules and reset caches. Detect common sub-expressions and
* make sure that all rules use the same instance of these common
* sub-expressions.
*/
private void compile() {
HashMap<String, Op> tests = new HashMap<String, Op>();
for (Rule rule : rules) {
Op op;
if (rule instanceof ExpressionRule)
op = ((ExpressionRule) rule).getOp();
else if (rule instanceof ActionRule)
op = ((ActionRule) rule).getOp();
else {
log.error("unexpected rule instance");
continue;
}
if (op instanceof AbstractBinaryOp) {
AbstractBinaryOp binOp = (AbstractBinaryOp) op;
binOp.setFirst(compileOp(tests, binOp.getFirst()));
binOp.setSecond(compileOp(tests, binOp.getSecond()));
op = compileOp(tests, binOp);
} else if (op instanceof AbstractOp) {
op = compileOp(tests, op);
} else if (op instanceof LinkedBinaryOp) {
((LinkedBinaryOp) op).setFirst(compileOp(tests, ((LinkedBinaryOp) op).getFirst()));
((LinkedBinaryOp) op).setSecond(compileOp(tests, ((LinkedBinaryOp) op).getSecond()));
} else if (op instanceof LinkedOp) {
Op wrappedOp = compileOp(tests, ((LinkedOp) op).getFirst());
op.setFirst(wrappedOp);
} else {
log.error("unexpected op instance");
continue;
}
if (rule instanceof ExpressionRule)
((ExpressionRule) rule).setOp(op);
else if (rule instanceof ActionRule)
((ActionRule) rule).setOp(op);
else {
log.error("unexpected rule instance");
continue;
}
}
cacheId = 0;
compiled = true;
}
use of uk.me.parabola.mkgmap.osmstyle.eval.Op in project mkgmap by openstreetmap.
the class ExpressionArranger method distribute.
/**
* Create a new OR expression from OR and an other expression.
*
* Starting point is a node of the form (a|b|...) & c
*
* The output is (a & c) | (b & c) | ...
*/
private Op distribute(Op op) {
Op ab = op.getFirst();
Op a = ab.getFirst();
Op b = ab.getSecond();
Op c = op.getSecond();
assert a != b : "ab";
assert b != c : "bc";
// Collect the OR terms into a list
List<Op> orterms = new ArrayList<>();
while (b.isType(OR)) {
orterms.add(b.getFirst());
b = b.getSecond();
}
OrOp topOR = new OrOp();
topOR.setFirst(new AndOp().set(a, c));
OrOp current = topOR;
for (Op orterm : orterms) {
AndOp and = new AndOp().set(orterm, c.copy());
OrOp newOr = new OrOp().set(and, null);
current.setSecond(newOr);
current = newOr;
}
current.setSecond(new AndOp().set(b, c.copy()));
return topOR;
}
Aggregations