summaryrefslogtreecommitdiff
path: root/math/tools/plot.py
diff options
context:
space:
mode:
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)