diff --git a/mtl/evaluator.py b/mtl/evaluator.py index 9650df5..69e0e41 100644 --- a/mtl/evaluator.py +++ b/mtl/evaluator.py @@ -33,6 +33,11 @@ def interp(sig, t, tag=None): return sig[key][tag] +def interp_all(sig, t, end=OO): + v = fn.map(lambda u: signal([(t, interp(sig, t, u))], t, end, u), sig.tags) + return reduce(op.__or__, v) + + def dense_compose(sig1, sig2, init=None): sig12 = sig1 | sig2 tags = sig12.tags @@ -110,6 +115,7 @@ def eval_mtl_until(phi, dt): def _eval(x): sig = dense_compose(f1(x), f2(x), init=-OO) + sig = sig | interp_all(sig, x.start, OO) # Force valuation at start data = apply_weak_until(phi.arg1, phi.arg2, sig) return signal(data, x.start, OO, tag=phi) diff --git a/mtl/test_eval.py b/mtl/test_eval.py index dcbb896..9bd3683 100644 --- a/mtl/test_eval.py +++ b/mtl/test_eval.py @@ -20,3 +20,13 @@ def test_eval_regression_next_neg(): v = f(d, quantitative=False, dt=1, time=None) assert not f(d, quantitative=False, dt=1) assert min(t for t, _ in v) >= 0 + + +def test_eval_regression_until_start(): + """From issue #221""" + x = { + "ap1": [(0, True), (0.1, True), (0.2, False)], + } + + phi = (mtl.parse("(X TRUE W X TRUE)")) + phi(x, 0, quantitative=False)