diff --git a/wta/bench.py b/wta/bench.py index b36c4a9b9dc49e03bf83d0dec2cc19874f3e588f..22377310ace3908a9f250402a0b2c56355be39cb 100755 --- a/wta/bench.py +++ b/wta/bench.py @@ -2,6 +2,7 @@ import argparse import os +import sys import subprocess import json import numpy as np @@ -10,33 +11,51 @@ import scipy.stats as st samples = 5 -def coalg_file(states, monoid, symbols, zero_frequency, different_values, i): - return "bench/wta_%s_%s_%s_%s_%s_%d" % (monoid, symbols, zero_frequency, +# Edge Spec should be ("transitions", str) or ("zero-frequency", str) +def coalg_file(states, monoid, symbols, edge_spec, different_values, i): + if edge_spec[0] == "transitions": + return "bench/wta_%s_%s_t%s_%s_%s_%d" % (monoid, symbols, edge_spec[1], different_values, states, i) + else: + return "bench/wta_%s_%s_%s_%s_%s_%d" % (monoid, symbols, edge_spec[1], + different_values, states, i) + + +def check_zerotrans(args): + if args.zero_frequency: + edge_spec = ("zero-frequency", args.zero_frequency) + elif args.transitions: + edge_spec = ("transitions", args.transitions) + else: + print("One of --zero-frequency and --transitions must be provided") + sys.exit(1) + + args.edge_spec = edge_spec def generate(args): + check_zerotrans(args) + generator = args.generator states = args.states monoid = args.monoid symbols = args.symbols - zero_frequency = args.zero_frequency different_values = args.different_values + edge_spec = args.edge_spec os.makedirs("bench", exist_ok=True) for i in range(0, samples): - f = coalg_file(states, monoid, symbols, zero_frequency, different_values, + f = coalg_file(states, monoid, symbols, edge_spec, different_values, i) + ".coalgebra" if os.path.exists(f): continue - cmd = [ - generator, "--states", states, "--monoid", monoid, "--symbols", - symbols, "--zero-frequency", zero_frequency, - "--different-values", different_values - ] + cmd = [generator, "--states", states, "--monoid", monoid, "--symbols", symbols] + cmd += ["--" + edge_spec[0], edge_spec[1]] + cmd += ["--different-values", different_values] + subprocess.run(cmd, stdout=open(f, "w+")) @@ -45,10 +64,10 @@ def run_one(args, i): states = args.states monoid = args.monoid symbols = args.symbols - zero_frequency = args.zero_frequency different_values = args.different_values + edge_spec = args.edge_spec - f = coalg_file(states, monoid, symbols, zero_frequency, different_values, i) + ".coalgebra" + f = coalg_file(states, monoid, symbols, edge_spec, different_values, i) + ".coalgebra" copar_args = [copar, 'refine', '--stats-json', f] @@ -62,7 +81,7 @@ def run_one(args, i): stats['monoid'] = monoid stats['symbols'] = symbols - stats['zero-freq'] = zero_frequency + stats['edge-spec'] = str(edge_spec) stats['mon-values'] = different_values stats['i'] = i @@ -74,10 +93,10 @@ def run_one_simple(args, i): states = args.states monoid = args.monoid symbols = args.symbols - zero_frequency = args.zero_frequency + edge_spec = args.edge_spec different_values= args.different_values - f = coalg_file(states, monoid, symbols, zero_frequency, different_values, i) + ".coalgebra" + f = coalg_file(states, monoid, symbols, edge_spec, different_values, i) + ".coalgebra" copar_args = [copar, 'refine', f] @@ -144,6 +163,8 @@ def print_row(d, header, stddev): def run(args): + check_zerotrans(args) + results = [run_one(args, i) for i in range(0, samples)] def confidencekey(vals, k): @@ -199,6 +220,8 @@ def find_bad(args, good): def bisect_states(args): + check_zerotrans(args) + states = args.start_states good = args.good or 0 @@ -232,7 +255,8 @@ def main(): gen_parser.add_argument('--states', required=True) gen_parser.add_argument('--monoid', required=True) gen_parser.add_argument('--symbols', required=True) - gen_parser.add_argument('--zero-frequency', required=True) + gen_parser.add_argument('--zero-frequency') + gen_parser.add_argument('--transitions') gen_parser.add_argument('--different-values', required=True) gen_parser.set_defaults(func=generate) @@ -241,7 +265,8 @@ def main(): run_parser.add_argument('--states', required=True) run_parser.add_argument('--monoid', required=True) run_parser.add_argument('--symbols', required=True) - run_parser.add_argument('--zero-frequency', required=True) + run_parser.add_argument('--zero-frequency') + run_parser.add_argument('--transitions') run_parser.add_argument('--different-values', required=True) run_parser.add_argument( '--stddev', action='store_true', help="report stddev for timings") @@ -256,7 +281,8 @@ def main(): bisect_parser.add_argument('copar') bisect_parser.add_argument('--monoid', required=True) bisect_parser.add_argument('--symbols', required=True) - bisect_parser.add_argument('--zero-frequency', required=True) + bisect_parser.add_argument('--zero-frequency') + bisect_parser.add_argument('--transitions') bisect_parser.add_argument('--different-values', required=True) bisect_parser.add_argument('--start-states', type=int, default=50) bisect_parser.add_argument('--good', type=int)