Search in sources :

Example 26 with Op

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;
}
Also used : NotExistsOp(uk.me.parabola.mkgmap.osmstyle.eval.NotExistsOp) Op(uk.me.parabola.mkgmap.osmstyle.eval.Op) GTEOp(uk.me.parabola.mkgmap.osmstyle.eval.GTEOp) LTOp(uk.me.parabola.mkgmap.osmstyle.eval.LTOp) NotEqualOp(uk.me.parabola.mkgmap.osmstyle.eval.NotEqualOp) BinaryOp(uk.me.parabola.mkgmap.osmstyle.eval.BinaryOp) OrOp(uk.me.parabola.mkgmap.osmstyle.eval.OrOp) NotOp(uk.me.parabola.mkgmap.osmstyle.eval.NotOp) ValueOp(uk.me.parabola.mkgmap.osmstyle.eval.ValueOp) EqualsOp(uk.me.parabola.mkgmap.osmstyle.eval.EqualsOp) RegexOp(uk.me.parabola.mkgmap.osmstyle.eval.RegexOp) ExistsOp(uk.me.parabola.mkgmap.osmstyle.eval.ExistsOp) AndOp(uk.me.parabola.mkgmap.osmstyle.eval.AndOp) TokenScanner(uk.me.parabola.mkgmap.scan.TokenScanner) SyntaxException(uk.me.parabola.mkgmap.scan.SyntaxException) StringReader(java.io.StringReader) ExpressionReader(uk.me.parabola.mkgmap.osmstyle.eval.ExpressionReader)

Example 27 with Op

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);
}
Also used : NotExistsOp(uk.me.parabola.mkgmap.osmstyle.eval.NotExistsOp) Op(uk.me.parabola.mkgmap.osmstyle.eval.Op) GTEOp(uk.me.parabola.mkgmap.osmstyle.eval.GTEOp) LTOp(uk.me.parabola.mkgmap.osmstyle.eval.LTOp) NotEqualOp(uk.me.parabola.mkgmap.osmstyle.eval.NotEqualOp) BinaryOp(uk.me.parabola.mkgmap.osmstyle.eval.BinaryOp) OrOp(uk.me.parabola.mkgmap.osmstyle.eval.OrOp) NotOp(uk.me.parabola.mkgmap.osmstyle.eval.NotOp) ValueOp(uk.me.parabola.mkgmap.osmstyle.eval.ValueOp) EqualsOp(uk.me.parabola.mkgmap.osmstyle.eval.EqualsOp) RegexOp(uk.me.parabola.mkgmap.osmstyle.eval.RegexOp) ExistsOp(uk.me.parabola.mkgmap.osmstyle.eval.ExistsOp) AndOp(uk.me.parabola.mkgmap.osmstyle.eval.AndOp)

Example 28 with Op

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;
}
Also used : LinkedBinaryOp(uk.me.parabola.mkgmap.osmstyle.eval.LinkedBinaryOp) AbstractBinaryOp(uk.me.parabola.mkgmap.osmstyle.eval.AbstractBinaryOp) AbstractOp(uk.me.parabola.mkgmap.osmstyle.eval.AbstractOp) Op(uk.me.parabola.mkgmap.osmstyle.eval.Op) LinkedOp(uk.me.parabola.mkgmap.osmstyle.eval.LinkedOp) AbstractOp(uk.me.parabola.mkgmap.osmstyle.eval.AbstractOp) LinkedOp(uk.me.parabola.mkgmap.osmstyle.eval.LinkedOp) AbstractBinaryOp(uk.me.parabola.mkgmap.osmstyle.eval.AbstractBinaryOp)

Example 29 with Op

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;
}
Also used : LinkedBinaryOp(uk.me.parabola.mkgmap.osmstyle.eval.LinkedBinaryOp) AbstractBinaryOp(uk.me.parabola.mkgmap.osmstyle.eval.AbstractBinaryOp) AbstractOp(uk.me.parabola.mkgmap.osmstyle.eval.AbstractOp) Op(uk.me.parabola.mkgmap.osmstyle.eval.Op) LinkedOp(uk.me.parabola.mkgmap.osmstyle.eval.LinkedOp) AbstractOp(uk.me.parabola.mkgmap.osmstyle.eval.AbstractOp) HashMap(java.util.HashMap) LinkedOp(uk.me.parabola.mkgmap.osmstyle.eval.LinkedOp) AbstractBinaryOp(uk.me.parabola.mkgmap.osmstyle.eval.AbstractBinaryOp) LinkedBinaryOp(uk.me.parabola.mkgmap.osmstyle.eval.LinkedBinaryOp) Rule(uk.me.parabola.mkgmap.reader.osm.Rule)

Example 30 with Op

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;
}
Also used : NotExistsOp(uk.me.parabola.mkgmap.osmstyle.eval.NotExistsOp) AbstractOp(uk.me.parabola.mkgmap.osmstyle.eval.AbstractOp) Op(uk.me.parabola.mkgmap.osmstyle.eval.Op) GTEOp(uk.me.parabola.mkgmap.osmstyle.eval.GTEOp) ValueOp(uk.me.parabola.mkgmap.osmstyle.eval.ValueOp) LTEOp(uk.me.parabola.mkgmap.osmstyle.eval.LTEOp) LTOp(uk.me.parabola.mkgmap.osmstyle.eval.LTOp) NotEqualOp(uk.me.parabola.mkgmap.osmstyle.eval.NotEqualOp) EqualsOp(uk.me.parabola.mkgmap.osmstyle.eval.EqualsOp) RegexOp(uk.me.parabola.mkgmap.osmstyle.eval.RegexOp) ExistsOp(uk.me.parabola.mkgmap.osmstyle.eval.ExistsOp) BinaryOp(uk.me.parabola.mkgmap.osmstyle.eval.BinaryOp) GTOp(uk.me.parabola.mkgmap.osmstyle.eval.GTOp) NotRegexOp(uk.me.parabola.mkgmap.osmstyle.eval.NotRegexOp) OrOp(uk.me.parabola.mkgmap.osmstyle.eval.OrOp) AndOp(uk.me.parabola.mkgmap.osmstyle.eval.AndOp) LinkedOp(uk.me.parabola.mkgmap.osmstyle.eval.LinkedOp) OrOp(uk.me.parabola.mkgmap.osmstyle.eval.OrOp) ArrayList(java.util.ArrayList) AndOp(uk.me.parabola.mkgmap.osmstyle.eval.AndOp)

Aggregations

Op (uk.me.parabola.mkgmap.osmstyle.eval.Op)35 LinkedOp (uk.me.parabola.mkgmap.osmstyle.eval.LinkedOp)28 Test (org.junit.Test)17 EqualsOp (uk.me.parabola.mkgmap.osmstyle.eval.EqualsOp)16 ValueOp (uk.me.parabola.mkgmap.osmstyle.eval.ValueOp)16 AndOp (uk.me.parabola.mkgmap.osmstyle.eval.AndOp)12 BinaryOp (uk.me.parabola.mkgmap.osmstyle.eval.BinaryOp)12 ExistsOp (uk.me.parabola.mkgmap.osmstyle.eval.ExistsOp)12 GTEOp (uk.me.parabola.mkgmap.osmstyle.eval.GTEOp)12 LTOp (uk.me.parabola.mkgmap.osmstyle.eval.LTOp)12 NotEqualOp (uk.me.parabola.mkgmap.osmstyle.eval.NotEqualOp)12 NotExistsOp (uk.me.parabola.mkgmap.osmstyle.eval.NotExistsOp)12 OrOp (uk.me.parabola.mkgmap.osmstyle.eval.OrOp)12 RegexOp (uk.me.parabola.mkgmap.osmstyle.eval.RegexOp)12 AbstractOp (uk.me.parabola.mkgmap.osmstyle.eval.AbstractOp)11 GTOp (uk.me.parabola.mkgmap.osmstyle.eval.GTOp)9 LTEOp (uk.me.parabola.mkgmap.osmstyle.eval.LTEOp)9 NotRegexOp (uk.me.parabola.mkgmap.osmstyle.eval.NotRegexOp)9 NotOp (uk.me.parabola.mkgmap.osmstyle.eval.NotOp)7 ArrayList (java.util.ArrayList)5