summaryrefslogtreecommitdiff
path: root/math/tools/plot.py
diff options
context:
space:
mode:
authorAlex Richardson <arichardson@FreeBSD.org>2021-02-22 11:59:12 +0000
committerAlex Richardson <arichardson@FreeBSD.org>2021-02-22 11:59:12 +0000
commitf9f37c002ab5a580accfe26b731eef45e798b435 (patch)
tree6c5f3a7746c1d8a0d7a04012d47b6428c7b3057e /math/tools/plot.py
Import Arm Optimized Routines v21.02vendor/arm-optimized-routines/v21.02
We already have copies of some of these files in the repository without a vendor import and we should really be using contrib/ instead. We should also be able to use some of the math functions to allow the tests to pass on AArch64 (and other architectures) instead of just x86. We should also be able to reuse some of the tests for the kyua testsuite. Imported using ``` curl -L https://github.com/ARM-software/optimized-routines/tarball/e823e3abf5f89ecba58a10fc0fd82c13d9984b6b | tar --strip-components=1 -xvzf - git add . ```
Diffstat (limited to 'math/tools/plot.py')
-rwxr-xr-xmath/tools/plot.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/math/tools/plot.py b/math/tools/plot.py
new file mode 100755
index 000000000000..6c8b89ff284b
--- /dev/null
+++ b/math/tools/plot.py
@@ -0,0 +1,61 @@
+#!/usr/bin/python
+
+# ULP error plot tool.
+#
+# Copyright (c) 2019, Arm Limited.
+# SPDX-License-Identifier: MIT
+
+import numpy as np
+import matplotlib.pyplot as plt
+import sys
+import re
+
+# example usage:
+# build/bin/ulp -e .0001 log 0.5 2.0 2345678 | math/tools/plot.py
+
+def fhex(s):
+ return float.fromhex(s)
+
+def parse(f):
+ xs = []
+ gs = []
+ ys = []
+ es = []
+ # Has to match the format used in ulp.c
+ r = re.compile(r'[^ (]+\(([^ )]*)\) got ([^ ]+) want ([^ ]+) [^ ]+ ulp err ([^ ]+)')
+ for line in f:
+ m = r.match(line)
+ if m:
+ x = fhex(m.group(1))
+ g = fhex(m.group(2))
+ y = fhex(m.group(3))
+ e = float(m.group(4))
+ xs.append(x)
+ gs.append(g)
+ ys.append(y)
+ es.append(e)
+ elif line.startswith('PASS') or line.startswith('FAIL'):
+ # Print the summary line
+ print(line)
+ return xs, gs, ys, es
+
+def plot(xs, gs, ys, es):
+ if len(xs) < 2:
+ print('not enough samples')
+ return
+ a = min(xs)
+ b = max(xs)
+ fig, (ax0,ax1) = plt.subplots(nrows=2)
+ es = np.abs(es) # ignore the sign
+ emax = max(es)
+ ax0.text(a+(b-a)*0.7, emax*0.8, '%s\n%g'%(emax.hex(),emax))
+ ax0.plot(xs,es,'r.')
+ ax0.grid()
+ ax1.plot(xs,ys,'r.',label='want')
+ ax1.plot(xs,gs,'b.',label='got')
+ ax1.grid()
+ ax1.legend()
+ plt.show()
+
+xs, gs, ys, es = parse(sys.stdin)
+plot(xs, gs, ys, es)