#!/usr/bin/env python2.3
# post-process a results file

import os
import re
import sys

MINSIZE = int(os.environ.get("MINSIZE", 0))
CLIP = int(os.environ.get("CLIP", 0))

def val(s):
    try:
        return float(s)
    except ValueError:
        return s

def pp(fn, fixed, blocked, xvar, yvar, gvars):
    f = open(fn, 'r')
    data = {}
    for line in f.xreadlines():
        line = re.sub(r':\s*',':', line)
        line = line.replace("%","")
        items = line.split()
        xval=yval=None
        gvals = []
        skip = 0
        drop = 0
        for item in items:
            c = item.split(":")
            if len(c) == 2:
                if fixed.has_key(c[0]):
                    if not fixed[c[0]].has_key(c[1]):
                        #print >>sys.stderr, fixed[c[0]], '!=', c[1]
                        skip = 1
                        break
                    #else:
                    #    print >>sys.stderr, c[0], '==', c[1]
                elif blocked.has_key(c[0]):
                    if blocked[c[0]].has_key(c[1]):
                        skip = 1
                        break
                if c[0] == xvar and xval is None:
                    xval = float(c[1])
                elif c[0] == yvar:
                    if c[1] == 'None':
                        yval = None
                    else:
                        yval = float(c[1])
                elif c[0] in gvars:
                    gvals.append((gvars.index(c[0]),c[0],val(c[1])))
        if skip: continue
        gvals.sort()
        if xval == None:
            print >>sys.stderr, "missing",xvar,"for",gvals
            continue
        if yval == None:
            print >>sys.stderr, "missing",yvar,"for",gvals
            continue
        data.setdefault(tuple(gvals), []).append((xval,yval))
    ks = data.keys()
    ks.sort()
    for group in ks:
        d = data[group]
        d.sort()
        if CLIP:
            values = [ v for k,v in d ]
            values.reverse()
            for i in xrange(1,len(values)):
                if values[i] == values[0]:
                    del d[len(values)-1-i]
                else:
                    break

        if len(d) < MINSIZE:
            continue
        print "\n\n# ","; ".join(["%s=%s"%(k,v) for idx,k,v in group])

        for x,y in d:
            if y is None:
                continue
            else:
                print x,y

if __name__ == '__main__':
    import sys
    fn = sys.argv[1]
    fixed = {}
    blocked = {}
    while 1:
        if "=" in sys.argv[2]:
            k,v= sys.argv[2].split("=")
            for i in v.split(","):
                fixed.setdefault(k,{})[i]=1
            del sys.argv[2]
        elif "#" in sys.argv[2]:
            k,v= sys.argv[2].split("#")
            for i in v.split(","):
                blocked.setdefault(k,{})[i]=1
            del sys.argv[2]
        else:
            break
    xv = sys.argv[2]
    yv = sys.argv[3]
    gv = sys.argv[4:]
    print "# Post-processed from",fn
    print "# x variable:",xv
    print "# y variable:",yv
    print "# grouped by:",gv
    for k,vals in fixed.iteritems():
        vallist = vals.keys()
        vallist.sort()
        print "#     %s in %s"%(k,vallist)
    for k,vals in blocked.iteritems():
        vallist = vals.keys()
        vallist.sort()
        print "#     %s not in %s"%(k,vallist)
    pp(fn,fixed,blocked,xv,yv,gv)
    print

