From: Nathaniel Wesley Filardo Date: Sat, 1 Jun 2013 23:00:37 +0000 (-0400) Subject: Try a new definition for := in python backend X-Git-Url: https://hydra-www.ietfng.org/gitweb/?a=commitdiff_plain;h=a68f81da5bf5ac32dfa848dbfff4ccb5911e6ac3;p=dyna2 Try a new definition for := in python backend --- diff --git a/src/Dyna/Backend/Python/defn.py b/src/Dyna/Backend/Python/defn.py index 1e0603b..f81b583 100644 --- a/src/Dyna/Backend/Python/defn.py +++ b/src/Dyna/Backend/Python/defn.py @@ -9,9 +9,9 @@ class Aggregator(object): self.name = name def fold(self): raise NotImplementedError - def inc(self, val): + def inc(self, val, ruleix, variables): raise NotImplementedError - def dec(self, val): + def dec(self, val, ruleix, variables): raise NotImplementedError def clear(self): raise NotImplementedError @@ -23,9 +23,9 @@ class BAggregator(Counter, Aggregator): def __init__(self, item, name): Aggregator.__init__(self, item, name) Counter.__init__(self) - def inc(self, val): + def inc(self, val, ruleix, variables): self[val] += 1 - def dec(self, val): + def dec(self, val, ruleix, variables): self[val] -= 1 def fold(self): return self @@ -43,23 +43,31 @@ class MultisetAggregator(BAggregator): class LastEquals(Aggregator): def __init__(self, item, name): - self.list = [] + self.values = {} Aggregator.__init__(self, item, name) - def inc(self, val): - self.list.append(val) - def dec(self, val): - raise NotImplementedError('dec on last equal not defined.') + def inc(self, val, ruleix, variables): + if ruleix not in self.values: + self.values[ruleix] = [] + self.values[ruleix].append(val) + def dec(self, val, ruleix, variables): + self.values[ruleix].delete(val) + def clear(self): + self.values = {} def fold(self): - return self.list[-1] + maxrix = max(self.values.keys(), key=int) + if len(self.values[maxrix]) == 1: + return self.values[maxrix][0] + else: + return None class SetEquals(Aggregator): def __init__(self, item, name): self.set = set([]) Aggregator.__init__(self, item, name) - def inc(self, val): + def inc(self, val, ruleix, variables): self.set.add(val) - def dec(self, val): + def dec(self, val, ruleix, variables): self.set.remove(val) def fold(self): return self.set diff --git a/src/Dyna/Backend/Python/interpreter.py b/src/Dyna/Backend/Python/interpreter.py index a30ad4a..8d1f26d 100644 --- a/src/Dyna/Backend/Python/interpreter.py +++ b/src/Dyna/Backend/Python/interpreter.py @@ -352,9 +352,9 @@ def emit(item, val, ruleix=None, variables=None): '%s (val %s; curr: %s)' % (pretty(item), val, item.value) if _delete: - aggregator[item].dec(val) + aggregator[item].dec(val,ruleix,variables) else: - aggregator[item].inc(val) + aggregator[item].inc(val,ruleix,variables) agenda.add(item)