#!/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)