Skip to content

Commit 32fa56a

Browse files
committed
Switch to accepting lambd as horizon parameter, grounding until it is hit.
1 parent 7f4a944 commit 32fa56a

1 file changed

Lines changed: 21 additions & 8 deletions

File tree

telingo/__init__.py

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from . import theory as _ty
2222

2323

24-
def imain(prg, future_sigs, program_parts, on_model, imin=0, imax=None, istop="SAT"):
24+
def imain(prg, future_sigs, program_parts, on_model, imin=0, imax=None, lambd=0, istop="SAT"):
2525
"""
2626
Take a program object and runs the incremental main solving loop.
2727
@@ -46,15 +46,12 @@ def imain(prg, future_sigs, program_parts, on_model, imin=0, imax=None, istop="S
4646
program_parts -- Program parts to ground.
4747
imin -- Minimum number of iterations.
4848
imax -- Maximum number of iterations.
49+
lambd -- Number of steps to ground, then solve a single time (non-iterative)
4950
istop -- When to stop.
5051
"""
5152
thy = _ty.Theory()
5253
step, ret = 0, None
53-
while ((imax is None or step < imax) and
54-
(step == 0 or step < imin or (
55-
(istop == "SAT" and not ret.satisfiable) or
56-
(istop == "UNSAT" and not ret.unsatisfiable) or
57-
(istop == "UNKNOWN" and not ret.unknown)))):
54+
while True:
5855
parts = []
5956
for root_name, part_name, rng in program_parts:
6057
for i in rng:
@@ -73,7 +70,11 @@ def imain(prg, future_sigs, program_parts, on_model, imin=0, imax=None, istop="S
7370
for atom in prg.symbolic_atoms.by_signature(name, arity, positive):
7471
if atom.symbol.arguments[-1].number > step:
7572
assumptions.append(-atom.literal)
76-
ret, step = prg.solve(on_model=lambda m: on_model(m, step), assumptions=assumptions), step+1
73+
if step < lambd:
74+
step += 1
75+
continue
76+
prg.solve(on_model=lambda m: on_model(m, step), assumptions=assumptions)
77+
break
7778

7879

7980
class TelApp(Application):
@@ -95,6 +96,7 @@ def __init__(self):
9596
self.__imin = 0
9697
self.__imax = None
9798
self.__istop = "SAT"
99+
self.__lambd = 0
98100
self.__horizon = 0
99101

100102
def __on_model(self, model, horizon):
@@ -125,6 +127,16 @@ def __parse_imax(self, value):
125127
self.__imax = None
126128
return True
127129

130+
def __parse_lambd(self, value):
131+
"""
132+
Parse lambd argument.
133+
"""
134+
if len(value) > 0:
135+
self.__lambd = int(value)
136+
return self.__lambd >= 0
137+
self.__lambd = None
138+
return True
139+
128140
def __parse_istop(self, value):
129141
"""
130142
Parse istop argument.
@@ -157,6 +169,7 @@ def register_options(self, options):
157169
group = "Telingo Options"
158170
options.add(group, "imin", "Minimum number of solving steps [0]", self.__parse_imin, argument="<n>")
159171
options.add(group, "imax", "Maximum number of solving steps []", self.__parse_imax, argument="<n>")
172+
options.add(group, "lambd", "Initial number of steps ground before single solve []", self.__parse_lambd, argument="<n>")
160173
options.add(group, "istop", dedent("""\
161174
Stop criterion [sat]
162175
<arg>: {sat|unsat|unknown}"""), self.__parse_istop)
@@ -174,7 +187,7 @@ def main(self, control, files):
174187
files.append(sys.stdin)
175188
future_sigs, program_parts = _tf.transform([path.read() for path in files], bld.add)
176189

177-
imain(control, future_sigs, program_parts, self.__on_model, self.__imin, self.__imax, self.__istop)
190+
imain(control, future_sigs, program_parts, self.__on_model, self.__imin, self.__imax, self.__lambd, self.__istop)
178191

179192

180193
def main():

0 commit comments

Comments
 (0)