2121from . 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
7980class 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
180193def main ():
0 commit comments