timfuz: cleanup help

Signed-off-by: John McMaster <johndmcmaster@gmail.com>
This commit is contained in:
John McMaster 2018-09-17 14:23:00 -07:00
parent 3b686de46f
commit bf5b435a69
12 changed files with 55 additions and 62 deletions

View File

@ -119,7 +119,7 @@ def run(
def main(): def main():
import argparse 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('--verbose', action='store_true', help='')
parser.add_argument('--sparse', action='store_true', help='') parser.add_argument('--sparse', action='store_true', help='')

View File

@ -108,11 +108,11 @@ def main():
import argparse import argparse
parser = argparse.ArgumentParser( 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('--verbose', action='store_true', help='')
parser.add_argument('--sub-json', 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() args = parser.parse_args()
# Store options in dict to ease passing through functions # Store options in dict to ease passing through functions
bench = Benchmark() bench = Benchmark()

View File

@ -31,7 +31,7 @@ def main():
'--auto-name', action='store_true', help='timing3.csv => timing3c.csv') '--auto-name', action='store_true', help='timing3.csv => timing3c.csv')
parser.add_argument('--out', default=None, help='Output csv') parser.add_argument('--out', default=None, help='Output csv')
parser.add_argument('--corner', 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() args = parser.parse_args()
bench = Benchmark() bench = Benchmark()

View File

@ -34,7 +34,8 @@ def run(fns_in, fnout, sub_json, strict=False, verbose=False):
def main(): def main():
import argparse 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('--verbose', action='store_true', help='')
parser.add_argument('--strict', action='store_true', help='') parser.add_argument('--strict', action='store_true', help='')
@ -44,7 +45,7 @@ def main():
required=True, required=True,
help='Group substitutions to make fully ranked') help='Group substitutions to make fully ranked')
parser.add_argument('--out', help='Output sub.json substitution result') 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() args = parser.parse_args()
# Store options in dict to ease passing through functions # Store options in dict to ease passing through functions
bench = Benchmark() bench = Benchmark()

View File

@ -52,37 +52,44 @@ def gen_flat(fnin, sub_json, corner=None):
yield zero, zero_row 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: if sort:
sortf = sorted sortf = sorted
else: else:
sortf = lambda x: x sortf = lambda x: x
'''
with open(fnout, 'w') as fout: with open(fnout, 'w') as fout:
fout.write('ico,fast_max fast_min slow_max slow_min,rows...\n') fout.write('ico,fast_max fast_min slow_max slow_min,rows...\n')
#for name, corners in sortf(gen_flat(fnin, sub_json)): for fnin in fns_in:
for name, corners in gen_flat(fnin, sub_json, corner=corner): #for name, corners in sortf(gen_flat(fnin, sub_json)):
row_ico = 1 for name, corners in gen_flat(fnin, sub_json, corner=corner):
items = [str(row_ico), corners2csv(corners)] row_ico = 1
items.append('%u %s' % (1, name)) items = [str(row_ico), corners2csv(corners)]
fout.write(','.join(items) + '\n') items.append('%u %s' % (1, name))
fout.write(','.join(items) + '\n')
def main(): def main():
import argparse 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('--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-csv', help='')
parser.add_argument( parser.add_argument(
'--sub-json', '--sub-json',
required=True, required=True,
help='Group substitutions to make fully ranked') help='Group substitutions to make fully ranked')
parser.add_argument('--corner', default=None, help='') parser.add_argument('--corner', default=None, help='')
parser.add_argument('fnin', default=None, help='input timing delay .csv') parser.add_argument('--out', default=None, help='output timing delay .csv')
parser.add_argument('fnout', 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() args = parser.parse_args()
# Store options in dict to ease passing through functions # Store options in dict to ease passing through functions
bench = Benchmark() bench = Benchmark()
@ -91,10 +98,10 @@ def main():
try: try:
run( run(
args.fnin, args.fns_in,
args.fnout, args.out,
sub_json=sub_json, sub_json=sub_json,
sort=args.sort, #sort=args.sort,
verbose=args.verbose, verbose=args.verbose,
corner=args.corner) corner=args.corner)
finally: finally:

View File

@ -37,7 +37,7 @@ build/$(CORNER)/linprog.csv: build/$(CORNER)/leastsq.csv build/grouped.csv
build/$(CORNER)/flat.csv: build/$(CORNER)/linprog.csv build/$(CORNER)/flat.csv: build/$(CORNER)/linprog.csv
# Take separated variables and back-annotate them to the original timing variables # 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 mv build/$(CORNER)/flat.csv.tmp build/$(CORNER)/flat.csv
build/$(CORNER)/tilea.json: build/$(CORNER)/flat.csv build/$(CORNER)/tilea.json: build/$(CORNER)/flat.csv

View File

@ -14,28 +14,12 @@ from collections import OrderedDict
from fractions import Fraction 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): def fracr_quick(r):
return [Fraction(numerator=int(x), denominator=1) for x in 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): def fracm_quick(m):
'''Convert integer matrix to Fraction matrix'''
t = type(m[0][0]) t = type(m[0][0])
print('fracm_quick type: %s' % t) print('fracm_quick type: %s' % t)
return [fracr_quick(r) for r in m] return [fracr_quick(r) for r in m]
@ -149,7 +133,6 @@ def state_rref(state, verbose=False):
#msym = sympy.MutableSparseMatrix(mfrac) #msym = sympy.MutableSparseMatrix(mfrac)
msym = sympy.Matrix(mfrac) msym = sympy.Matrix(mfrac)
# internal encoding has significnat performance implications # internal encoding has significnat performance implications
#print(type(msym[3]))
#assert type(msym[0]) is sympy.Integer #assert type(msym[0]) is sympy.Integer
if verbose: if verbose:
@ -221,7 +204,10 @@ def run(fnout, fn_ins, simplify=False, corner=None, verbose=0):
def main(): def main():
import argparse 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('--verbose', action='store_true', help='')
parser.add_argument('--simplify', action='store_true', help='') parser.add_argument('--simplify', action='store_true', help='')
@ -231,14 +217,10 @@ def main():
default='build_speed/speed.json', default='build_speed/speed.json',
help='Provides speed index to name translation') help='Provides speed index to name translation')
parser.add_argument('--out', help='Output sub.json substitution result') 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() args = parser.parse_args()
bench = Benchmark() bench = Benchmark()
fns_in = args.fns_in
if not fns_in:
fns_in = glob.glob('specimen_*/timing3.csv')
try: try:
run( run(
fnout=args.out, fnout=args.out,

View File

@ -156,13 +156,16 @@ def main():
'Solve timing solution using least squares objective function') 'Solve timing solution using least squares objective function')
parser.add_argument('--verbose', action='store_true', help='') 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( parser.add_argument(
'--sub-json', help='Group substitutions to make fully ranked') '--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( parser.add_argument(
'--out', default=None, help='output timing delay .json') '--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() args = parser.parse_args()
# Store options in dict to ease passing through functions # Store options in dict to ease passing through functions
bench = Benchmark() bench = Benchmark()

View File

@ -195,10 +195,10 @@ def main():
parser.add_argument('--sub-csv', help='') parser.add_argument('--sub-csv', help='')
parser.add_argument( parser.add_argument(
'--sub-json', help='Group substitutions to make fully ranked') '--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( parser.add_argument(
'--out', default=None, help='output timing delay .json') '--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() args = parser.parse_args()
# Store options in dict to ease passing through functions # Store options in dict to ease passing through functions
bench = Benchmark() bench = Benchmark()
@ -216,7 +216,7 @@ def main():
run_corner=run_corner, run_corner=run_corner,
sub_json=sub_json, sub_json=sub_json,
sub_csv=args.sub_csv, sub_csv=args.sub_csv,
fns_in=fns_in, fn_in=fn_in,
corner=args.corner, corner=args.corner,
massage=args.massage, massage=args.massage,
outfn=args.out, outfn=args.out,

View File

@ -91,7 +91,7 @@ def main():
parser.add_argument('--verbose', action='store_true', help='') parser.add_argument('--verbose', action='store_true', help='')
parser.add_argument('--out', help='Output csv') 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() args = parser.parse_args()
bench = Benchmark() bench = Benchmark()

View File

@ -9,16 +9,10 @@ import time
import json import json
# corner wokraround
def quad(x):
return [x for _ in range(4)]
def run(fnin, fnout, tile_json_fn, verbose=False): def run(fnin, fnout, tile_json_fn, verbose=False):
# modified in place # modified in place
tilej = json.load(open(tile_json_fn, 'r')) tilej = json.load(open(tile_json_fn, 'r'))
# FIXME: all corners
Ads, bs = loadc_Ads_bs([fnin], ico=True) Ads, bs = loadc_Ads_bs([fnin], ico=True)
bounds = Ads2bounds(Ads, bs) bounds = Ads2bounds(Ads, bs)
@ -71,9 +65,12 @@ def run(fnin, fnout, tile_json_fn, verbose=False):
def main(): def main():
import argparse 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('--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') parser.add_argument('fnout', default=None, help='output tile .json')
args = parser.parse_args() args = parser.parse_args()

View File

@ -255,14 +255,15 @@ def main():
) )
parser.add_argument('--verbose', type=int, help='') parser.add_argument('--verbose', type=int, help='')
# made a bulk conversion easier...keep?
parser.add_argument( parser.add_argument(
'--auto-name', action='store_true', help='timing3.txt => timing3.csv') '--auto-name', action='store_true', help='timing3.txt => timing3.csv')
parser.add_argument( parser.add_argument(
'--speed-json', '--speed-json',
default='build_speed/speed.json', default='build_speed/speed.json',
help='Provides speed index to name translation') help='Provides speed index to name translation')
parser.add_argument('--out', default=None, help='Output csv') parser.add_argument('--out', default=None, help='Output timing3.csv file')
parser.add_argument('fns_in', nargs='*', help='timing3.txt input files') parser.add_argument('fns_in', nargs='+', help='Input timing3.txt files')
args = parser.parse_args() args = parser.parse_args()
bench = Benchmark() bench = Benchmark()
@ -274,6 +275,8 @@ def main():
fnout = fnin.replace('.txt', '.csv') fnout = fnin.replace('.txt', '.csv')
assert fnout != fnin, 'Expect .txt in' assert fnout != fnin, 'Expect .txt in'
else: else:
# practically there are too many stray prints to make this work as expected
assert 0, 'File name required'
fnout = '/dev/stdout' fnout = '/dev/stdout'
print("Writing to %s" % fnout) print("Writing to %s" % fnout)
fout = open(fnout, 'w') fout = open(fnout, 'w')