From 619c2c652420729c830736e6dfd0b0f4fe0ad0be Mon Sep 17 00:00:00 2001 From: Marcell Vazquez-Chanlatte Date: Fri, 8 Jul 2016 20:59:56 -0700 Subject: [PATCH] absorb coefficients into sympy expr --- stl.py | 15 +++------------ stl_parser.py | 8 ++------ 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/stl.py b/stl.py index 3537585..557a1aa 100644 --- a/stl.py +++ b/stl.py @@ -17,12 +17,9 @@ t_sym = Symbol('t', positive=True) class LinEq(namedtuple("LinEquality", ["terms", "op", "const"])): def __repr__(self): - n = len(self.terms) - rep = "{}" - if n > 1: - rep += " + {}"*(n - 1) - rep += " {op} {c}" - return rep.format(*self.terms, op=self.op, c=self.const) + rep = "{lhs} {op} {c}" + lhs = sum(t.id for t in self.terms) + return rep.format(lhs=lhs, op=self.op, c=self.const) def children(self): return [] @@ -34,12 +31,6 @@ class Var(namedtuple("Var", ["kind", "id", "time"])): return "{i}{t}".format(k=self.kind.name, i=self.id, t=time_str) -class Term(namedtuple("Term", ["coeff", "var"])): - def __repr__(self): - coeff = str(self.coeff) + "*" if self.coeff != 1 else "" - return "{c}{v}".format(c=coeff, v=self.var) - - class Interval(namedtuple('I', ['lower', 'upper'])): def __repr__(self): return "[{},{}]".format(self.lower, self.upper) diff --git a/stl_parser.py b/stl_parser.py index 28fc5a0..e19ee55 100644 --- a/stl_parser.py +++ b/stl_parser.py @@ -2,16 +2,12 @@ # TODO: consider using sympy to interpret stuff # TODO: break out into seperate library -# TODO: allow matrix to be symbolically parsed in STL_GRAMMAR # TODO: allow multiplication to be distributive # TODO: support reference specific time points # TODO: add Implies and Iff syntactic sugar # TODO: add support for parsing Until # TODO: support variables on both sides of ineq # TODO: Allow -x = -1*x -# TODO: change way of parsing dt -# - Allow inside of time index -# - Allow dt*x rather than dt*1*x from functools import partialmethod from collections import namedtuple @@ -137,7 +133,7 @@ class STLVisitor(NodeVisitor): def visit_term(self, _, children): coeffs, var = children c = coeffs[0] if coeffs else 1 - return stl.Term(c, var) + return lens(var).id*c def visit_coeff(self, _, children): dt, coeff, *_ = children @@ -147,7 +143,7 @@ class STLVisitor(NodeVisitor): def visit_terms(self, _, children): if isinstance(children[0], list): term, _1, sgn ,_2, terms = children[0] - terms = lens(terms)[0].coeff * sgn + terms = lens(terms)[0].id * sgn return [term] + terms else: return children