Skip to content

Commit 52ff2a8

Browse files
committed
Incremental Popper fixes.
1 parent 93cbd8d commit 52ff2a8

File tree

4 files changed

+36
-20
lines changed

4 files changed

+36
-20
lines changed

popper/abs_generate.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
import abc
2+
from typing import FrozenSet, Tuple, TYPE_CHECKING
23

4+
if TYPE_CHECKING:
5+
from . util import Literal, Settings
6+
7+
Rule = Tuple['Literal', FrozenSet['Literal']]
8+
RuleBase = FrozenSet[Rule]
39

410
class Generator(abc.ABC):
11+
settings: 'Settings'
512

613
# @profile
7-
def get_prog(self):
14+
def get_prog(self) -> RuleBase:
815
pass
916

1017
def gen_symbol(self, literal, backend):

popper/generate.py

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
1-
import time
21
import re
3-
from pysat.formula import CNF
4-
from pysat.solvers import Solver
5-
from pysat.card import *
6-
import clingo
7-
import operator
2+
from typing import Optional, Sequence, Set
3+
84
import numbers
5+
import operator
6+
import re
7+
from collections import defaultdict
8+
from typing import Optional, Sequence, Set
9+
10+
import clingo
911
import clingo.script
1012
import pkg_resources
11-
from collections import defaultdict
12-
from . util import rule_is_recursive, Constraint, Literal, format_rule, remap_variables
13+
14+
from .util import rule_is_recursive, Constraint, Literal, remap_variables
15+
1316
clingo.script.enable_python()
14-
from clingo import Function, Number, Tuple_
17+
from clingo import Function, Number, Tuple_, Model, Symbol
1518
from itertools import permutations
1619
import dataclasses
1720
from . abs_generate import Generator as AbstractGenerator
21+
from . abs_generate import Rule, RuleBase
1822

1923
@dataclasses.dataclass(frozen=True)
2024
class Var:
@@ -78,6 +82,7 @@ def build_rule_literals(rule, rule_var, pi=False):
7882

7983
class Generator(AbstractGenerator):
8084

85+
model: Optional[Model]
8186
def __init__(self, settings, bkcons=[]):
8287
self.savings = 0
8388
self.settings = settings
@@ -245,13 +250,13 @@ def __init__(self, settings, bkcons=[]):
245250
self.solver = solver
246251

247252
# @profile
248-
def get_prog(self):
253+
def get_prog(self) -> Optional[RuleBase]:
249254
if self.handle is None:
250255
self.handle = iter(self.solver.solve(yield_ = True))
251256
self.model = next(self.handle, None)
252257
if self.model is None:
253258
return None
254-
atoms = self.model.symbols(shown = True)
259+
atoms: Sequence[Symbol] = self.model.symbols(shown = True)
255260

256261
if self.settings.single_solve:
257262
return self.parse_model_single_rule(atoms)
@@ -271,7 +276,7 @@ def gen_symbol(self, literal, backend):
271276
self.seen_symbols[k] = symbol
272277
return symbol
273278

274-
def parse_model_recursion(self, model):
279+
def parse_model_recursion(self, model) -> RuleBase:
275280
settings = self.settings
276281
rule_index_to_body = defaultdict(set)
277282
head = settings.head_literal
@@ -293,21 +298,21 @@ def parse_model_recursion(self, model):
293298

294299
return frozenset(prog)
295300

296-
def parse_model_single_rule(self, model):
301+
def parse_model_single_rule(self, model: Sequence[Symbol]) -> RuleBase:
297302
settings = self.settings
298-
head = settings.head_literal
299-
body = set()
303+
head: Literal = settings.head_literal
304+
body: Set[Literal] = set()
300305
cached_literals = settings.cached_literals
301306
for atom in model:
302307
args = atom.arguments
303308
predicate = args[1].name
304309
atom_args = tuple(args[3].arguments)
305310
literal = cached_literals[(predicate, atom_args)]
306311
body.add(literal)
307-
rule = head, frozenset(body)
312+
rule: Rule = head, frozenset(body)
308313
return frozenset([rule])
309314

310-
def parse_model_pi(self, model):
315+
def parse_model_pi(self, model) -> RuleBase:
311316
settings = self.settings
312317
# directions = defaultdict(lambda: defaultdict(lambda: '?'))
313318
rule_index_to_body = defaultdict(set)

popper/loop.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ def run(self, bkcons):
186186
new_cons = []
187187

188188
# generate a program
189+
# prog: Optional[Program]
189190
with settings.stats.duration('generate'):
190191
prog = generator.get_prog()
191192
settings.logger.info("Generated prog: {}".format(prog))

popper/util.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
from contextlib import contextmanager
66
from itertools import permutations
77
from time import perf_counter
8-
from typing import NamedTuple, Optional, Dict
8+
from typing import NamedTuple, Optional, Dict, Tuple, Any
99

1010
import clingo
1111
import clingo.script
1212

13+
from popper.abs_generate import Rule
14+
1315

1416
class Literal(NamedTuple):
1517
predicate: str
@@ -260,6 +262,7 @@ class Settings:
260262
showcons: bool
261263
datalog: bool
262264
show_failures: bool # display detailed FP and FN information
265+
cached_literals: Dict[Tuple[str, Any], Literal]
263266

264267
def __init__(self, cmd_line=False, info=True, debug=False, show_stats=True, max_literals=MAX_LITERALS,
265268
timeout=TIMEOUT, quiet=False, eval_timeout=EVAL_TIMEOUT, max_examples=MAX_EXAMPLES, max_body=None,
@@ -814,7 +817,7 @@ def prog_hash(prog):
814817
return hash(new_prog)
815818

816819

817-
def remap_variables(rule):
820+
def remap_variables(rule: Tuple[Any, Any]) -> Rule:
818821
head, body = rule
819822

820823
head_vars = frozenset(head.arguments) if head else frozenset()

0 commit comments

Comments
 (0)