Skip to content

Commit 2e7c7da

Browse files
authored
Add --fail-fast and --maintainence-rate pyk flags (#900)
- `--fail-fast` will terminate a proof if any branch fails (instead of continuing on other branches); - `--maintainence-rate <RATE>` where `RATE` is an integer and `1 <= RATE` and `RATE` is how many steps between writing to proof state to disc. Writing to disc is slow, so this increases performance at the cost of an interrupted proof needing to redo work that was not written to disc.
1 parent 9b38e26 commit 2e7c7da

3 files changed

Lines changed: 32 additions & 1 deletion

File tree

kmir/src/kmir/__main__.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,20 @@ def _arg_parser() -> ArgumentParser:
245245
'--max-iterations', metavar='ITERATIONS', type=int, help='max number of proof iterations to take'
246246
)
247247
prove_args.add_argument('--reload', action='store_true', help='Force restarting proof')
248+
prove_args.add_argument(
249+
'--fail-fast',
250+
dest='fail_fast',
251+
action='store_true',
252+
help='Halt execution early if the proof is failing',
253+
)
254+
prove_args.add_argument(
255+
'--maintenance-rate',
256+
dest='maintenance_rate',
257+
type=int,
258+
default=1,
259+
metavar='RATE',
260+
help='Number of iterations between proof maintenance (writing to disk). Default: 1',
261+
)
248262
prove_args.add_argument(
249263
'--break-on-calls', dest='break_on_calls', action='store_true', help='Break on all function and intrinsic calls'
250264
)
@@ -496,6 +510,8 @@ def _parse_args(ns: Namespace) -> KMirOpts:
496510
max_depth=ns.max_depth,
497511
max_iterations=ns.max_iterations,
498512
reload=ns.reload,
513+
fail_fast=ns.fail_fast,
514+
maintenance_rate=ns.maintenance_rate,
499515
save_smir=ns.save_smir,
500516
smir=ns.smir,
501517
start_symbol=ns.start_symbol,

kmir/src/kmir/kmir.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,12 @@ def prove_rs(opts: ProveRSOpts) -> APRProof:
268268

269269
with kmir.kcfg_explore(label, terminate_on_thunk=opts.terminate_on_thunk) as kcfg_explore:
270270
prover = APRProver(kcfg_explore, execute_depth=opts.max_depth, cut_point_rules=cut_point_rules)
271-
prover.advance_proof(apr_proof, max_iterations=opts.max_iterations)
271+
prover.advance_proof(
272+
apr_proof,
273+
max_iterations=opts.max_iterations,
274+
fail_fast=opts.fail_fast,
275+
maintenance_rate=opts.maintenance_rate,
276+
)
272277
return apr_proof
273278

274279

kmir/src/kmir/options.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ class ProveOpts(KMirOpts):
4141
max_depth: int | None
4242
max_iterations: int | None
4343
reload: bool
44+
fail_fast: bool
45+
maintenance_rate: int
4446
break_on_calls: bool
4547
break_on_function_calls: bool
4648
break_on_intrinsic_calls: bool
@@ -64,6 +66,8 @@ def __init__(
6466
max_depth: int | None = None,
6567
max_iterations: int | None = None,
6668
reload: bool = False,
69+
fail_fast: bool = False,
70+
maintenance_rate: int = 1,
6771
break_on_calls: bool = False,
6872
break_on_function_calls: bool = False,
6973
break_on_intrinsic_calls: bool = False,
@@ -85,6 +89,8 @@ def __init__(
8589
self.max_depth = max_depth
8690
self.max_iterations = max_iterations
8791
self.reload = reload
92+
self.fail_fast = fail_fast
93+
self.maintenance_rate = maintenance_rate
8894
self.break_on_calls = break_on_calls
8995
self.break_on_function_calls = break_on_function_calls
9096
self.break_on_intrinsic_calls = break_on_intrinsic_calls
@@ -117,6 +123,8 @@ def __init__(
117123
max_depth: int | None = None,
118124
max_iterations: int | None = None,
119125
reload: bool = False,
126+
fail_fast: bool = False,
127+
maintenance_rate: int = 1,
120128
save_smir: bool = False,
121129
smir: bool = False,
122130
start_symbol: str = 'main',
@@ -142,6 +150,8 @@ def __init__(
142150
self.max_depth = max_depth
143151
self.max_iterations = max_iterations
144152
self.reload = reload
153+
self.fail_fast = fail_fast
154+
self.maintenance_rate = maintenance_rate
145155
self.save_smir = save_smir
146156
self.smir = smir
147157
self.start_symbol = start_symbol

0 commit comments

Comments
 (0)