# Display a list of *.dat files in a bar chart.
# Based on an example from https://chrisalbon.com/python/matplotlib_grouped_bar_plot.html

import sys
import os
import matplotlib.pyplot as plt
import numpy as np

if len(sys.argv) > 3 and (len(sys.argv)-3) % 2 :
    print("usage: python3 {0} <benchmark> <image path> (<dat1> <legend1> [<dat2> <legend2>] .. [<datN> <legendN>] ) ".format(os.path.basename(sys.argv[0])))
    exit(1)

benchmark  = sys.argv[1]
image_path = sys.argv[2]
groups     = (len(sys.argv)-3)/2

# Load benchark
domains = ()
nb_setups = 0
for line in open(benchmark,'r'):
    n, snx, sny, snz = line.split()
    domains += ( "{0}x{1}x{2}".format(snx, sny, snz), )
    nb_setups += 1

# Setting the positions and width for the bars
pos = list(range(nb_setups)) 
width = 1 / (groups+2)

# Plotting the bars
fig, ax = plt.subplots(figsize=(10,5))

prop_iter = iter(plt.rcParams['axes.prop_cycle'])

legends = ()
maxLups = 0
for i, argi in enumerate(range(3, len(sys.argv), 2)):
    mlups = np.array(list(map(float, open(sys.argv[argi])))) / 1E6
    legends += ( sys.argv[argi+1], )
    maxLups = max(maxLups, max(mlups))
    plt.bar([p + width*i for p in pos], 
            mlups, 
            width, 
            alpha=0.5, 
            color=next(prop_iter)['color']) 

# Set the y axis label
ax.set_ylabel('MLUPS')

# Set the chart's title
#ax.set_title(title)

# Set the position of the x ticks
ax.set_xticks([p + 1.5 * width for p in pos])

# Set the labels for the x ticks
ax.set_xticklabels(domains)

# Setting the x-axis and y-axis limits
plt.xlim(min(pos)-width, max(pos)+width*4)
#plt.ylim([0, maxLups] )

# Adding the legend and showing the plot
plt.legend(legends, loc='upper left')
ax.yaxis.grid()
plt.savefig(image_path)
plt.tight_layout()
plt.show()