diff options
Diffstat (limited to 'perf/solve_poly.py')
-rw-r--r-- | perf/solve_poly.py | 246 |
1 files changed, 0 insertions, 246 deletions
diff --git a/perf/solve_poly.py b/perf/solve_poly.py deleted file mode 100644 index 083dc544..00000000 --- a/perf/solve_poly.py +++ /dev/null @@ -1,246 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -# Given empirical data from perf_measure.py, calculate the coefficients of the -# polynomials for file, call, and line operation counts. -# -# Written by Kyle Altendorf. - -import attr -import itertools -import numpy -import scipy.optimize - - -def f(*args, simplify=False): - p = ((),) - for l in range(len(args)): - l += 1 - p = itertools.chain(p, itertools.product(*(args,), repeat=l)) - - if simplify: - p = {tuple(sorted(set(x))) for x in p} - p = sorted(p, key=lambda x: (len(x), x)) - - return p - -def m(*args): - if len(args) == 0: - return 0 - - r = 1 - for arg in args: - r *= arg - - return r - - -class Poly: - def __init__(self, *names): - self.names = names - - self.terms = f(*self.names, simplify=True) - - def calculate(self, coefficients, **name_values): - for name in name_values: - if name not in self.names: - raise Exception('bad parameter') - - substituted_terms = [] - for term in self.terms: - substituted_terms.append(tuple(name_values[name] for name in term)) - - c_tuples = ((c,) for c in coefficients) - - terms = tuple(a + b for a, b in zip(c_tuples, substituted_terms)) - - multiplied = tuple(m(*t) for t in terms) - total = sum(multiplied) - - return total - - -poly = Poly('f', 'c', 'l') - -#print('\n'.join(str(t) for t in poly.terms)) - -@attr.s -class FCL: - f = attr.ib() - c = attr.ib() - l = attr.ib() - -INPUT = """\ -1,1,1,18,242,1119 -1,1,2,18,242,1121 -1,1,3,18,242,1123 -1,1,4,18,242,1125 -1,1,5,18,242,1127 -1,2,1,18,243,1124 -1,2,2,18,243,1128 -1,2,3,18,243,1132 -1,2,4,18,243,1136 -1,2,5,18,243,1140 -1,3,1,18,244,1129 -1,3,2,18,244,1135 -1,3,3,18,244,1141 -1,3,4,18,244,1147 -1,3,5,18,244,1153 -1,4,1,18,245,1134 -1,4,2,18,245,1142 -1,4,3,18,245,1150 -1,4,4,18,245,1158 -1,4,5,18,245,1166 -1,5,1,18,246,1139 -1,5,2,18,246,1149 -1,5,3,18,246,1159 -1,5,4,18,246,1169 -1,5,5,18,246,1179 -2,1,1,19,399,1893 -2,1,2,19,399,1897 -2,1,3,19,399,1901 -2,1,4,19,399,1905 -2,1,5,19,399,1909 -2,2,1,19,401,1903 -2,2,2,19,401,1911 -2,2,3,19,401,1919 -2,2,4,19,401,1927 -2,2,5,19,401,1935 -2,3,1,19,403,1913 -2,3,2,19,403,1925 -2,3,3,19,403,1937 -2,3,4,19,403,1949 -2,3,5,19,403,1961 -2,4,1,19,405,1923 -2,4,2,19,405,1939 -2,4,3,19,405,1955 -2,4,4,19,405,1971 -2,4,5,19,405,1987 -2,5,1,19,407,1933 -2,5,2,19,407,1953 -2,5,3,19,407,1973 -2,5,4,19,407,1993 -2,5,5,19,407,2013 -3,1,1,20,556,2667 -3,1,2,20,556,2673 -3,1,3,20,556,2679 -3,1,4,20,556,2685 -3,1,5,20,556,2691 -3,2,1,20,559,2682 -3,2,2,20,559,2694 -3,2,3,20,559,2706 -3,2,4,20,559,2718 -3,2,5,20,559,2730 -3,3,1,20,562,2697 -3,3,2,20,562,2715 -3,3,3,20,562,2733 -3,3,4,20,562,2751 -3,3,5,20,562,2769 -3,4,1,20,565,2712 -3,4,2,20,565,2736 -3,4,3,20,565,2760 -3,4,4,20,565,2784 -3,4,5,20,565,2808 -3,5,1,20,568,2727 -3,5,2,20,568,2757 -3,5,3,20,568,2787 -3,5,4,20,568,2817 -3,5,5,20,568,2847 -4,1,1,21,713,3441 -4,1,2,21,713,3449 -4,1,3,21,713,3457 -4,1,4,21,713,3465 -4,1,5,21,713,3473 -4,2,1,21,717,3461 -4,2,2,21,717,3477 -4,2,3,21,717,3493 -4,2,4,21,717,3509 -4,2,5,21,717,3525 -4,3,1,21,721,3481 -4,3,2,21,721,3505 -4,3,3,21,721,3529 -4,3,4,21,721,3553 -4,3,5,21,721,3577 -4,4,1,21,725,3501 -4,4,2,21,725,3533 -4,4,3,21,725,3565 -4,4,4,21,725,3597 -4,4,5,21,725,3629 -4,5,1,21,729,3521 -4,5,2,21,729,3561 -4,5,3,21,729,3601 -4,5,4,21,729,3641 -4,5,5,21,729,3681 -5,1,1,22,870,4215 -5,1,2,22,870,4225 -5,1,3,22,870,4235 -5,1,4,22,870,4245 -5,1,5,22,870,4255 -5,2,1,22,875,4240 -5,2,2,22,875,4260 -5,2,3,22,875,4280 -5,2,4,22,875,4300 -5,2,5,22,875,4320 -5,3,1,22,880,4265 -5,3,2,22,880,4295 -5,3,3,22,880,4325 -5,3,4,22,880,4355 -5,3,5,22,880,4385 -5,4,1,22,885,4290 -5,4,2,22,885,4330 -5,4,3,22,885,4370 -5,4,4,22,885,4410 -5,4,5,22,885,4450 -5,5,1,22,890,4315 -5,5,2,22,890,4365 -5,5,3,22,890,4415 -5,5,4,22,890,4465 -5,5,5,22,890,4515 -""" - -inputs_outputs = {} -for row in INPUT.splitlines(): - row = [int(v) for v in row.split(",")] - inputs_outputs[FCL(*row[:3])] = FCL(*row[3:]) - -#print('\n'.join(str(t) for t in inputs_outputs.items())) - -def calc_poly_coeff(poly, coefficients): - c_tuples = list((c,) for c in coefficients) - poly = list(f(*poly)) - poly = list(a + b for a, b in zip(c_tuples, poly)) - multiplied = list(m(*t) for t in poly) - total = sum(multiplied) - return total - -def calc_error(inputs, output, coefficients): - result = poly.calculate(coefficients, **inputs) - return result - output - - -def calc_total_error(inputs_outputs, coefficients, name): - total_error = 0 - for inputs, outputs in inputs_outputs.items(): - total_error += abs(calc_error(attr.asdict(inputs), attr.asdict(outputs)[name], coefficients)) - - return total_error - -coefficient_count = len(poly.terms) -#print('count: {}'.format(coefficient_count)) -x0 = numpy.array((0,) * coefficient_count) - -#print(x0) - -with open('results', 'w') as f: - for name in sorted(attr.asdict(FCL(0,0,0))): - c = scipy.optimize.minimize( - fun=lambda c: calc_total_error(inputs_outputs, c, name), - x0=x0 - ) - - coefficients = [int(round(x)) for x in c.x] - terms = [''.join(t) for t in poly.terms] - message = f"{name}' = " - message += ' + '.join("{}{}".format(coeff if coeff != 1 else '', term) for coeff, term in reversed(list(zip(coefficients, terms))) if coeff != 0) - print(message) - f.write(message) |