#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os, sys
sys.path.append(os.path.abspath(os.path.dirname(os.path.abspath(__file__))+"/../scripts"))

import fileinput
import numpy as np
import matplotlib as mpl

show = len(sys.argv) > 1 and sys.argv[1] == 'show'
if not show:
	mpl.use('pgf')

import matplotlib.pyplot as plt
import matplotlib.lines as lines
from common import set_size, config_plt, get_colors

config_plt()


def loadData(fn):
	content = []

	with open(fn) as f:
		content = f.readlines()

	values = {}
	for line in content:
		method, ncores, strtime = [x for x in line.split(':')]
		time = float(strtime)
		if method != "seq":
			time = time/float(ncores)
		if not ncores in values:
			values[ncores] = []
		values[ncores].append(time);

	return values


def figCores(title, xlabel, xticks, output, datasrcs, error=False):
	fig = plt.figure()

	plt.title(title)
	plt.xlabel(xlabel)
	plt.ylabel(u"temps (s)")
	plt.xticks(xticks)

	nd = len(datasrcs)

	width = .4
	pos = .5-.5*nd
	for f, label in datasrcs:
		values = loadData(f)
		barcolor, errcolor = get_colors(['seq', 'omp', 'gen_omp', 'gen_thread'], label)

		if "1" in values:
			values.pop("1")

		for k, a in values.items():
			x = int(k)
			m = np.mean(a)
			s = 2.5758 * np.std(a) / np.sqrt(len(a))  # confiance 99 %

			x = x + pos*width

			plt.bar(x, m, width=width, color=barcolor, label=label)
			if error:
				plt.errorbar(x, m, s, elinewidth=.8, capsize=1, ecolor=errcolor)
			label=''

		pos = pos + 1

	plt.legend(bbox_to_anchor=(1, 1))

	fig.set_size_inches(set_size(455.24408, .8))
	if not show:
		plt.savefig(output, format='pdf', bbox_inches='tight')
	return plt


def figSpeedUp(title, xlabel, xticks, output, basetime, datasrcs):
	fig = plt.figure()

	plt.title(title)
	plt.xlabel(xlabel)
	plt.ylabel(u"accélération")
	plt.xticks(xticks)

	nd = len(datasrcs)

	width = .4
	pos = .5-.5*nd
	for f, label in datasrcs:
		values = loadData(f)
		barcolor, errcolor = get_colors(['seq', 'omp', 'gen_omp', 'gen_thread'], label)

		if "1" in values:
			values.pop("1")

		for k, a in values.items():
			x = int(k)
			m = basetime/np.mean(a)

			x = x + pos*width

			plt.bar(x, m, width=width, color=barcolor, label=label)
			label=''

		pos = pos + 1

	plt.legend(bbox_to_anchor=(0.38, 1))

	fig.set_size_inches(set_size(455.24408, .8))
	if not show:
		plt.savefig(output, format='pdf', bbox_inches='tight')
	return plt


# script
values = loadData('data_imgpro/rt_cores_seq')
basetime = np.mean(values["1"])
plts = []

plt = figCores(u"", u"nombre de cœurs", [2, 4, 6, 8, 10, 12, 14, 16, 18],
		"plots/rt_cores.pdf", [
			#  ['data_imgpro/rt_cores_seq', 'seq'],
			['data_imgpro/rt_cores_gen_omp', 'omp'],
			['data_imgpro/rt_cores_gen_omp', 'gen_omp'],
			['data_imgpro/rt_cores_gen_thread', 'gen_thread'],
			],
		error=False
		)
plts.append(plt)

plt = figSpeedUp(u"", u"nombre de cœurs", [2, 4, 6, 8, 10, 12, 14, 16, 18],
		"plots/rt_speedup.pdf", basetime, [
			['data_imgpro/rt_cores_gen_omp', 'omp'],
			['data_imgpro/rt_cores_gen_omp', 'gen_omp'],
			['data_imgpro/rt_cores_gen_thread', 'gen_thread'],
			]
		)
plts.append(plt)

if show:
	for plt in plts:
		plt.show()
