]> hydra-www.ietfng.org Git - dyna2/commitdiff
Try a new definition for := in python backend
authorNathaniel Wesley Filardo <nwf@cs.jhu.edu>
Sat, 1 Jun 2013 23:00:37 +0000 (19:00 -0400)
committerNathaniel Wesley Filardo <nwf@cs.jhu.edu>
Sat, 1 Jun 2013 23:00:37 +0000 (19:00 -0400)
src/Dyna/Backend/Python/defn.py
src/Dyna/Backend/Python/interpreter.py

index 1e0603b75fdde7d1e148bdfe5100045960bbcc3e..f81b5833374b211401b6d0b2d86fd6bc97042bac 100644 (file)
@@ -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
index a30ad4a86b70a60cda7143ee9f0a3bb0796bbb37..8d1f26d189866e88840ab7eb03c05f49a12110f6 100644 (file)
@@ -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)