diff --git a/fuzzers/007-timing/perf_test.py b/experiments/timfuz/perf_test.py similarity index 97% rename from fuzzers/007-timing/perf_test.py rename to experiments/timfuz/perf_test.py index cb400809..77d0aefe 100644 --- a/fuzzers/007-timing/perf_test.py +++ b/experiments/timfuz/perf_test.py @@ -119,7 +119,7 @@ def run( def main(): import argparse - parser = argparse.ArgumentParser(description='Timing fuzzer') + parser = argparse.ArgumentParser(description='Matrix solving performance tests') parser.add_argument('--verbose', action='store_true', help='') parser.add_argument('--sparse', action='store_true', help='') diff --git a/fuzzers/007-timing/checksub.py b/fuzzers/007-timing/checksub.py index 7a307e14..977d5b6f 100644 --- a/fuzzers/007-timing/checksub.py +++ b/fuzzers/007-timing/checksub.py @@ -108,11 +108,11 @@ def main(): import argparse parser = argparse.ArgumentParser( - description='Check sub.json solution feasibility') + description='Check if sub.json would make a linear equation solvable') parser.add_argument('--verbose', action='store_true', help='') parser.add_argument('--sub-json', help='') - parser.add_argument('fns_in', nargs='*', help='timing3.csv input files') + parser.add_argument('fns_in', nargs='+', help='timing3.csv input files') args = parser.parse_args() # Store options in dict to ease passing through functions bench = Benchmark() diff --git a/fuzzers/007-timing/corner_csv.py b/fuzzers/007-timing/corner_csv.py index 429e1e55..a4ccbf84 100644 --- a/fuzzers/007-timing/corner_csv.py +++ b/fuzzers/007-timing/corner_csv.py @@ -31,7 +31,7 @@ def main(): '--auto-name', action='store_true', help='timing3.csv => timing3c.csv') parser.add_argument('--out', default=None, help='Output csv') parser.add_argument('--corner', help='Output csv') - parser.add_argument('fns_in', nargs='*', help='timing3.csv input files') + parser.add_argument('fns_in', nargs='+', help='timing3.csv input files') args = parser.parse_args() bench = Benchmark() diff --git a/fuzzers/007-timing/csv_flat2group.py b/fuzzers/007-timing/csv_flat2group.py index 4cde0e61..4cdc04fd 100644 --- a/fuzzers/007-timing/csv_flat2group.py +++ b/fuzzers/007-timing/csv_flat2group.py @@ -34,7 +34,8 @@ def run(fns_in, fnout, sub_json, strict=False, verbose=False): def main(): import argparse - parser = argparse.ArgumentParser(description='Solve timing solution') + parser = argparse.ArgumentParser( + description='Substitute .csv to group correlated symbols') parser.add_argument('--verbose', action='store_true', help='') parser.add_argument('--strict', action='store_true', help='') @@ -44,7 +45,7 @@ def main(): required=True, help='Group substitutions to make fully ranked') parser.add_argument('--out', help='Output sub.json substitution result') - parser.add_argument('fns_in', nargs='*', help='timing3.txt input files') + parser.add_argument('fns_in', nargs='+', help='timing3.csv input files') args = parser.parse_args() # Store options in dict to ease passing through functions bench = Benchmark() diff --git a/fuzzers/007-timing/csv_group2flat.py b/fuzzers/007-timing/csv_group2flat.py index 438be40e..45aacdb1 100644 --- a/fuzzers/007-timing/csv_group2flat.py +++ b/fuzzers/007-timing/csv_group2flat.py @@ -52,37 +52,44 @@ def gen_flat(fnin, sub_json, corner=None): yield zero, zero_row -def run(fnin, fnout, sub_json, corner=None, sort=False, verbose=False): +def run(fns_in, fnout, sub_json, corner=None, sort=False, verbose=False): + ''' if sort: sortf = sorted else: sortf = lambda x: x + ''' with open(fnout, 'w') as fout: fout.write('ico,fast_max fast_min slow_max slow_min,rows...\n') - #for name, corners in sortf(gen_flat(fnin, sub_json)): - for name, corners in gen_flat(fnin, sub_json, corner=corner): - row_ico = 1 - items = [str(row_ico), corners2csv(corners)] - items.append('%u %s' % (1, name)) - fout.write(','.join(items) + '\n') + for fnin in fns_in: + #for name, corners in sortf(gen_flat(fnin, sub_json)): + for name, corners in gen_flat(fnin, sub_json, corner=corner): + row_ico = 1 + items = [str(row_ico), corners2csv(corners)] + items.append('%u %s' % (1, name)) + fout.write(','.join(items) + '\n') def main(): import argparse - parser = argparse.ArgumentParser(description='Solve timing solution') + parser = argparse.ArgumentParser( + description='Substitute .csv to ungroup correlated symbols') parser.add_argument('--verbose', action='store_true', help='') - parser.add_argument('--sort', action='store_true', help='') + #parser.add_argument('--sort', action='store_true', help='') parser.add_argument('--sub-csv', help='') parser.add_argument( '--sub-json', required=True, help='Group substitutions to make fully ranked') parser.add_argument('--corner', default=None, help='') - parser.add_argument('fnin', default=None, help='input timing delay .csv') - parser.add_argument('fnout', default=None, help='output timing delay .csv') + parser.add_argument('--out', default=None, help='output timing delay .csv') + parser.add_argument( + 'fns_in', + default=None, + help='input timing delay .csv (NOTE: must be single column)') args = parser.parse_args() # Store options in dict to ease passing through functions bench = Benchmark() @@ -91,10 +98,10 @@ def main(): try: run( - args.fnin, - args.fnout, + args.fns_in, + args.out, sub_json=sub_json, - sort=args.sort, + #sort=args.sort, verbose=args.verbose, corner=args.corner) finally: diff --git a/fuzzers/007-timing/projects/corner.mk b/fuzzers/007-timing/projects/corner.mk index aaa3cbf2..3ed37050 100644 --- a/fuzzers/007-timing/projects/corner.mk +++ b/fuzzers/007-timing/projects/corner.mk @@ -37,7 +37,7 @@ build/$(CORNER)/linprog.csv: build/$(CORNER)/leastsq.csv build/grouped.csv build/$(CORNER)/flat.csv: build/$(CORNER)/linprog.csv # Take separated variables and back-annotate them to the original timing variables - python3 $(TIMFUZ_DIR)/csv_group2flat.py --sub-json build/sub.json --corner $(CORNER) --sort build/$(CORNER)/linprog.csv build/$(CORNER)/flat.csv.tmp + python3 $(TIMFUZ_DIR)/csv_group2flat.py --sub-json build/sub.json --corner $(CORNER) --sort --out build/$(CORNER)/flat.csv.tmp build/$(CORNER)/linprog.csv mv build/$(CORNER)/flat.csv.tmp build/$(CORNER)/flat.csv build/$(CORNER)/tilea.json: build/$(CORNER)/flat.csv diff --git a/fuzzers/007-timing/rref.py b/fuzzers/007-timing/rref.py index 97b4efa0..6db813b4 100644 --- a/fuzzers/007-timing/rref.py +++ b/fuzzers/007-timing/rref.py @@ -14,28 +14,12 @@ from collections import OrderedDict from fractions import Fraction -def fracr(r): - DELTA = 0.0001 - - for i, x in enumerate(r): - if type(x) is float: - xi = int(x) - assert abs(xi - x) < DELTA - r[i] = xi - return [Fraction(x) for x in r] - - -def fracm(m): - return [fracr(r) for r in m] - - def fracr_quick(r): return [Fraction(numerator=int(x), denominator=1) for x in r] -# the way I'm doing thing they should all be even integers -# hmm this was only slightly faster def fracm_quick(m): + '''Convert integer matrix to Fraction matrix''' t = type(m[0][0]) print('fracm_quick type: %s' % t) return [fracr_quick(r) for r in m] @@ -149,7 +133,6 @@ def state_rref(state, verbose=False): #msym = sympy.MutableSparseMatrix(mfrac) msym = sympy.Matrix(mfrac) # internal encoding has significnat performance implications - #print(type(msym[3])) #assert type(msym[0]) is sympy.Integer if verbose: @@ -221,7 +204,10 @@ def run(fnout, fn_ins, simplify=False, corner=None, verbose=0): def main(): import argparse - parser = argparse.ArgumentParser(description='Timing fuzzer') + parser = argparse.ArgumentParser( + description= + 'Compute reduced row echelon (RREF) to form sub.json (variable groups)' + ) parser.add_argument('--verbose', action='store_true', help='') parser.add_argument('--simplify', action='store_true', help='') @@ -231,14 +217,10 @@ def main(): default='build_speed/speed.json', help='Provides speed index to name translation') parser.add_argument('--out', help='Output sub.json substitution result') - parser.add_argument('fns_in', nargs='+', help='timing3.txt input files') + parser.add_argument('fns_in', nargs='+', help='timing3.csv input files') args = parser.parse_args() bench = Benchmark() - fns_in = args.fns_in - if not fns_in: - fns_in = glob.glob('specimen_*/timing3.csv') - try: run( fnout=args.out, diff --git a/fuzzers/007-timing/solve_leastsq.py b/fuzzers/007-timing/solve_leastsq.py index 1a1b55e6..5bd1f7b0 100644 --- a/fuzzers/007-timing/solve_leastsq.py +++ b/fuzzers/007-timing/solve_leastsq.py @@ -156,13 +156,16 @@ def main(): 'Solve timing solution using least squares objective function') parser.add_argument('--verbose', action='store_true', help='') - parser.add_argument('--massage', action='store_true', help='') + parser.add_argument( + '--massage', + action='store_true', + help='Derive additional constraints to improve solution') parser.add_argument( '--sub-json', help='Group substitutions to make fully ranked') - parser.add_argument('--corner', default="slow_max", help='') + parser.add_argument('--corner', required=True, default="slow_max", help='') parser.add_argument( '--out', default=None, help='output timing delay .json') - parser.add_argument('fns_in', nargs='+', help='timing3.csv input files') + parser.add_argument('fns_in', nargs='+', 'timing3.csv input files') args = parser.parse_args() # Store options in dict to ease passing through functions bench = Benchmark() diff --git a/fuzzers/007-timing/solve_linprog.py b/fuzzers/007-timing/solve_linprog.py index 29e4d826..28f181a6 100644 --- a/fuzzers/007-timing/solve_linprog.py +++ b/fuzzers/007-timing/solve_linprog.py @@ -195,10 +195,10 @@ def main(): parser.add_argument('--sub-csv', help='') parser.add_argument( '--sub-json', help='Group substitutions to make fully ranked') - parser.add_argument('--corner', default=None, required=True, help='') + parser.add_argument('--corner', required=True, default="slow_max", help='') parser.add_argument( '--out', default=None, help='output timing delay .json') - parser.add_argument('fns_in', nargs='*', help='timing3.csv input files') + parser.add_argument('fns_in', nargs='+', help='timing3.csv input files') args = parser.parse_args() # Store options in dict to ease passing through functions bench = Benchmark() @@ -216,7 +216,7 @@ def main(): run_corner=run_corner, sub_json=sub_json, sub_csv=args.sub_csv, - fns_in=fns_in, + fn_in=fn_in, corner=args.corner, massage=args.massage, outfn=args.out, diff --git a/fuzzers/007-timing/sub2csv.py b/fuzzers/007-timing/sub2csv.py index 8567d5e3..dfb65227 100644 --- a/fuzzers/007-timing/sub2csv.py +++ b/fuzzers/007-timing/sub2csv.py @@ -91,7 +91,7 @@ def main(): parser.add_argument('--verbose', action='store_true', help='') parser.add_argument('--out', help='Output csv') - parser.add_argument('fns_in', nargs='*', help='sub.json input files') + parser.add_argument('fns_in', nargs='+', help='sub.json input files') args = parser.parse_args() bench = Benchmark() diff --git a/fuzzers/007-timing/tile_annotate.py b/fuzzers/007-timing/tile_annotate.py index 58b89235..7e87f2fa 100644 --- a/fuzzers/007-timing/tile_annotate.py +++ b/fuzzers/007-timing/tile_annotate.py @@ -9,16 +9,10 @@ import time import json -# corner wokraround -def quad(x): - return [x for _ in range(4)] - - def run(fnin, fnout, tile_json_fn, verbose=False): # modified in place tilej = json.load(open(tile_json_fn, 'r')) - # FIXME: all corners Ads, bs = loadc_Ads_bs([fnin], ico=True) bounds = Ads2bounds(Ads, bs) @@ -71,9 +65,12 @@ def run(fnin, fnout, tile_json_fn, verbose=False): def main(): import argparse - parser = argparse.ArgumentParser(description='') + parser = argparse.ArgumentParser( + description= + 'Substitute timgrid timing model names for real timing values') parser.add_argument('--tile-json', default='tiles.json', help='') - parser.add_argument('fnin', default=None, help='Flattened timing csv') + parser.add_argument( + 'fnin', default=None, help='Input flattened timing csv (flat.json)') parser.add_argument('fnout', default=None, help='output tile .json') args = parser.parse_args() diff --git a/fuzzers/007-timing/timing_txt2csv.py b/fuzzers/007-timing/timing_txt2csv.py index 1a4891eb..ebdda26d 100644 --- a/fuzzers/007-timing/timing_txt2csv.py +++ b/fuzzers/007-timing/timing_txt2csv.py @@ -255,14 +255,15 @@ def main(): ) parser.add_argument('--verbose', type=int, help='') + # made a bulk conversion easier...keep? parser.add_argument( '--auto-name', action='store_true', help='timing3.txt => timing3.csv') parser.add_argument( '--speed-json', default='build_speed/speed.json', help='Provides speed index to name translation') - parser.add_argument('--out', default=None, help='Output csv') - parser.add_argument('fns_in', nargs='*', help='timing3.txt input files') + parser.add_argument('--out', default=None, help='Output timing3.csv file') + parser.add_argument('fns_in', nargs='+', help='Input timing3.txt files') args = parser.parse_args() bench = Benchmark() @@ -274,6 +275,8 @@ def main(): fnout = fnin.replace('.txt', '.csv') assert fnout != fnin, 'Expect .txt in' else: + # practically there are too many stray prints to make this work as expected + assert 0, 'File name required' fnout = '/dev/stdout' print("Writing to %s" % fnout) fout = open(fnout, 'w')