timfuz: misc cleanup

Signed-off-by: John McMaster <johndmcmaster@gmail.com>
This commit is contained in:
John McMaster 2018-09-17 14:39:58 -07:00
parent 43ccabe815
commit d5c9f1d857
10 changed files with 34 additions and 79 deletions

View File

@ -58,10 +58,9 @@ def pds(Ads, s):
def run(fns_in, sub_json=None, verbose=False):
# arbitrary...data is thrown away
corner = "slow_max"
Ads, b = loadc_Ads_b(fns_in, corner, ico=True)
assert len(fn_ins) > 0
# arbitrary corner...data is thrown away
Ads, b = loadc_Ads_b(fns_in, "slow_max", ico=True)
if sub_json:
print('Subbing JSON %u rows' % len(Ads))
@ -112,7 +111,7 @@ def main():
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()

View File

@ -50,11 +50,15 @@ def main():
# Store options in dict to ease passing through functions
bench = Benchmark()
fns_in = args.fns_in
if not fns_in:
fns_in = glob.glob('specimen_*/timing3.csv')
sub_json = load_sub(args.sub_json)
try:
run(
args.fns_in,
fns_in,
args.out,
sub_json=sub_json,
strict=args.strict,

View File

@ -1,19 +1,6 @@
#!/usr/bin/env python3
# https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.linprog.html
from scipy.optimize import linprog
from timfuz import Benchmark, loadc_Ads_bs, load_sub, Ads2bounds, corners2csv, corner_s2i
from timfuz_massage import massage_equations
import numpy as np
import glob
import json
import math
from collections import OrderedDict
from fractions import Fraction
import sys
import datetime
import os
import time
def gen_flat(fnin, sub_json, corner=None):

View File

@ -1,8 +1,4 @@
#!/usr/bin/env python3
'''
Triaging tool to help understand where we need more timing coverage
Finds correlated variables to help make better test cases
'''
from timfuz import Benchmark, Ar_di2np, loadc_Ads_b, index_names, A_ds2np, simplify_rows
import numpy as np
@ -193,6 +189,7 @@ def state_rref(state, verbose=False):
def run(fnout, fn_ins, simplify=False, corner=None, verbose=0):
print('Loading data')
assert len(fn_ins) > 0
state = State.load(fn_ins, simplify=simplify, corner=corner)
state_rref(state, verbose=verbose)
state.print_stats()
@ -217,14 +214,18 @@ 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.csv 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,
fn_ins=args.fns_in,
fn_ins=fns_in,
simplify=args.simplify,
corner=args.corner,
verbose=args.verbose)

View File

@ -1,19 +1,14 @@
#!/usr/bin/env python3
# https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.linprog.html
from scipy.optimize import linprog
from timfuz import Benchmark, load_sub, corner_s2i, acorner2csv
import timfuz
import numpy as np
import glob
import math
from fractions import Fraction
import sys
import os
import time
import timfuz_solve
import scipy.optimize as optimize
from scipy.optimize import least_squares
def mkestimate(Anp, b):
@ -141,7 +136,7 @@ def run_corner(
x0 = mkestimate(Anp, b)
print('Solving')
res = least_squares(func, x0, bounds=(0, float('inf')))
res = optimize.least_squares(func, x0, bounds=(0, float('inf')))
print('Done')
if outfn:

View File

@ -1,7 +1,6 @@
#!/usr/bin/env python3
# https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.linprog.html
from scipy.optimize import linprog
import scipy.optimize as optimize
from timfuz import Benchmark, load_sub, A_ub_np2d, acorner2csv, corner_s2i
import numpy as np
import glob
@ -151,8 +150,9 @@ def run_corner(
print('')
# Now find smallest values for delay constants
# Due to input bounds (ex: column limit), some delay elements may get eliminated entirely
# https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.linprog.html
print('Running linprog w/ %d r, %d c (%d name)' % (rows, cols, len(names)))
res = linprog(
res = optimize.linprog(
c,
A_ub=A_ub,
b_ub=b_ub,

View File

@ -1,25 +1,7 @@
#!/usr/bin/env python3
from timfuz import Benchmark, Ar_di2np, loadc_Ads_b, index_names, A_ds2np, simplify_rows
import numpy as np
import glob
import math
from timfuz import Benchmark
import json
import sympy
from collections import OrderedDict
from fractions import Fraction
def mlcm(xs):
'''
Find the LCM between elements in a group
'''
l = xs[0]
for n in xs:
for m in xs:
lthis = lcm(n, m)
l = int(max(lthis, l))
return ret
def write_state(state, fout):

View File

@ -339,6 +339,16 @@ def massage_equations(Ads, b, verbose=False, corner=None):
Subtract equations from each other to generate additional constraints
Helps provide additional guidance to solver for realistic delays
Ex: given:
a >= 10
a + b >= 100
A valid solution is:
a = 100
However, a better solution is something like
a = 10
b = 90
This creates derived constraints to provide more realistic results
Equation pipeline
Some operations may generate new equations
Simplify after these to avoid unnecessary overhead on redundant constraints

View File

@ -1,19 +1,9 @@
#!/usr/bin/env python3
# https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.linprog.html
from scipy.optimize import linprog
from timfuz import Benchmark, simplify_rows, loadc_Ads_b, index_names, A_ds2np, run_sub_json, print_eqns, Ads2bounds, instances, SimplifiedToZero, allow_zero_eqns
from timfuz import simplify_rows, loadc_Ads_b, index_names, A_ds2np, run_sub_json, print_eqns, Ads2bounds, instances, SimplifiedToZero, allow_zero_eqns
from timfuz_massage import massage_equations
import numpy as np
import glob
import json
import math
from collections import OrderedDict
from fractions import Fraction
import sys
import datetime
import os
import time
def check_feasible(A_ub, b_ub):
@ -162,18 +152,6 @@ def run(
#print
#col_dist(A_ubd, 'final', names)
print('b10', b[0:100])
'''
Given:
a >= 10
a + b >= 100
A valid solution is:
a = 100
However, a better solution is something like
a = 10
b = 90
This creates derived constraints to provide more realistic results
'''
if massage:
try:
Ads, b = massage_equations(Ads, b, corner=corner)

View File

@ -12,12 +12,11 @@ from collections import OrderedDict
# Speed index: some sort of special value
SI_NONE = 0xFFFF
# prefix to make easier to track
# models do not overlap between PIPs and WIREs
PREFIX_W = 'WIRE_'
PREFIX_P = 'PIP_'
#PREFIX_W = ''
#PREFIX_P = ''
def parse_pip(s):
# Entries like