#!/usr/bin/env python
from os import listdir, getcwd, chdir, remove
from os.path import join, isdir
from re import match, search
from sys import argv
from subprocess import Popen, PIPE

plot_command="""\
set out "{name}.pdf"
set terminal pdf
set style fill solid border -1
set style data histograms
set style histogram columnstacked
set xtics ({tics})
set title "{title}"
set xlabel "{xlabel}"
set ylabel "{ylabel}"
{more}
{plot}
quit
"""

def plot(dir):
  prevdir=getcwd()
  chdir(dir)
  data={}
  mdata={}
  res_out={}
  # gather data
  for rundir in [d for d in listdir(getcwd()) if match('property-\d+-model-\d+',d) and isdir(d)]:
    m=match('property-(\d+)-model-(\d+)',rundir)
    prop=int(m.group(1))
    mod=int(m.group(2))
    if prop not in data:
      data[prop]={}
    if mod not in mdata:
      mdata[mod]={}
    if prop not in res_out:
      res_out[prop]={}
    data[prop][mod]=[time(join(rundir,d)) for d in listdir(rundir) if exitstatus(join(rundir,d)) is 0]
    mdata[mod][prop]=data[prop][mod]
    res_out[prop][mod]=float(len([d for d in listdir(rundir) if exitstatus(join(rundir,d)) != 0]))/float(len(listdir(rundir)))*100.0
  # make graphs
  for (prop,mods) in data.items():
    # min, max, and median
    datafile=open('data','w')
    datafile.write(' '.join([str(min(data[prop][mod]))
      for mod in sorted(mods.keys())])+'\n')
    datafile.write(' '.join([str(med(data[prop][mod])-min(data[prop][mod]))
      for mod in sorted(mods.keys())])+'\n')
    datafile.write(' '.join([str(max(data[prop][mod])-med(data[prop][mod]))
      for mod in sorted(mods.keys())])+'\n')
    datafile.close()
    gnuplot=Popen('gnuplot', stdin=PIPE)
    gnuplot.communicate(plot_command.format(name='formulae-'+str(prop),
      title='Formulae of size {size}'.format(size=prop),
      ylabel='Minimum, median, and maximum time',
      xlabel='Size of the model',
      more='set yrange [0:300]',
      tics=', '.join(['"{0}" {1}'.format(sorted(mods.keys())[i], i)
        for i in range(len(mods.keys()))]),
      plot='plot "data" using 1, "" using {0}'.format(
        ', "" using '.join([str(i+2) for i in range(len(mods.keys())-1)]))))
    # out of resource counts
    datafile=open('data','w')
    datafile.write(' '.join([str(res_out[prop][mod])
      for mod in sorted(mods.keys())])+'\n')
    datafile.close()
    gnuplot=Popen('gnuplot', stdin=PIPE)
    gnuplot.communicate(plot_command.format(name='res_out-'+str(prop),
      title='Formulae of size {size}'.format(size=prop),
      ylabel='Percentage of runs where time or memory limit was reached',
      xlabel='Size of the model',
      more='set yrange [0:50]',
      tics=', '.join(['"{0}" {1}'.format(sorted(mods.keys())[i], i)
        for i in range(len(mods.keys()))]),
      plot='plot "data" using 1, "" using {0}'.format(
        ', "" using '.join([str(i+2) for i in range(len(mods.keys())-1)]))))
    remove('data')
  for (mod,props) in mdata.items():
    # min, max, median for model size graphs
    datafile=open('data','w')
    datafile.write(' '.join([str(min(mdata[mod][prop]))
      for prop in sorted(props.keys())])+'\n')
    datafile.write(' '.join([str(med(mdata[mod][prop])-min(mdata[mod][prop]))
      for prop in sorted(props.keys())])+'\n')
    datafile.write(' '.join([str(max(mdata[mod][prop])-med(mdata[mod][prop]))
      for prop in sorted(props.keys())])+'\n')
    datafile.close()
    gnuplot=Popen('gnuplot', stdin=PIPE)
    gnuplot.communicate(plot_command.format(name='models-'+str(mod),
      title='Models of size {size}'.format(size=mod),
      ylabel='Minimum, median, and maximum time',
      xlabel='Size of the formula',
      more='set yrange [0:300]',
      tics=', '.join(['"{0}" {1}'.format(sorted(props.keys())[i], i)
        for i in range(len(props.keys()))]),
      plot='plot "data" using 1, "" using {0}'.format(
        ', "" using '.join([str(i+2) for i in range(len(props.keys())-1)]))))
    remove('data')

def time(dir):
  f=open(join(dir,'time'))
  t=float([search('[\d\.]+',l).group(0) for l in f.readlines() if match('\s*user',l)][0])
  f.close()
  return t

def exitstatus(dir):
  f=open(join(dir,'exitstatus'))
  s=int(f.readlines()[0])
  f.close()
  return s

def med(l):
  return sorted(l)[len(l)/2]

if __name__=='__main__':
  plot(argv[1])