diff --git a/wta/bench.py b/wta/bench.py index b07ce67cde076704380fa1c85d4c2e56249e54eb..d5795ca16cd8728bdf3d0ba9d14a318f5129057b 100755 --- a/wta/bench.py +++ b/wta/bench.py @@ -258,6 +258,60 @@ def bisect_states(args): print("First bad state count: %d" % bad) +def test_trans(args, transitions): + print("Trying %d..." % transitions) + + args.transitions = str(transitions) + + generate(args) + + for i in range(0, samples): + try: + run_one_simple(args, i) + except subprocess.CalledProcessError: + return False + + return True + + +def find_bad_trans(args, good): + transitions = good*2 + + if test_trans(args, transitions): + return find_bad(args, transitions) + else: + return (good, transitions) + + +def bisect_trans(args): + # Hacks and hacks and hacks + args.zero_frequency = None + args.out_degree = None + + transitions = args.start_transitions + + good = args.good or 0 + bad = args.bad + + if bad is None: + if good and transitions < good: + transitions = good+1 + + if test_trans(args, transitions): + (good, bad) = find_bad_trans(args, transitions) + else: + bad = transitions + + while good+1 < bad: + transitions = good + (bad-good)//2 + if test_trans(args, transitions): + good = transitions + else: + bad = transitions + + print("First bad transition count: %d" % bad) + + def main(): parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(required=True) @@ -304,6 +358,18 @@ def main(): bisect_parser.set_defaults(func=bisect_states) + bisect_trans_parser = subparsers.add_parser('bisect-trans') + bisect_trans_parser.add_argument('generator') + bisect_trans_parser.add_argument('copar') + bisect_trans_parser.add_argument('--monoid', required=True) + bisect_trans_parser.add_argument('--symbols', required=True) + bisect_trans_parser.add_argument('--different-values') + bisect_trans_parser.add_argument('--states', required=True) + bisect_trans_parser.add_argument('--start-transitions', type=int, default=100) + bisect_trans_parser.add_argument('--good', type=int) + bisect_trans_parser.add_argument('--bad', type=int) + bisect_trans_parser.set_defaults(func=bisect_trans) + args = parser.parse_args() args.func(args)