#!/usr/bin/env python

# ULP error plot tool.
#
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

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)
