from npp import mk_part, differencing_construct, longest_processing_time
from npp_dfs import mk_part_II, Infinity, display
from chrono import clock
import sys

from npp_mk_inst import EASY, HARD, DECIMAL
INST = EASY + HARD + DECIMAL

DIR = "INSTANCES/NPP/"
output = open("RESULTS/NPP/npp-dfs.csv","a")
# output = sys.stdout

print >>output, "%-20s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s" % \
      ("Instance", "n", "DFS: eta", "DFS: E", "t", "DIFF: eta", "DIFF: E", "t", "LPT: eta", "LPT: E", "t")
for inst in INST:
    print "\ninstance", inst
    
    
    filename = DIR+inst
    f = open(filename)
    data = f.readlines()
    data = [int(i) for i in data]
    # print "initial data:", data, "sum=", sum(data)

    K,star,t, K1, t1, K2, t2, K3, t3, K4, t4 = -1,'',0, -1,0, -1,0, -1,0, -1,0



    from npp_dfs import differencing_dfs
    cpu = clock()
    if inst in DECIMAL:
        limit = 600
    else:
        limit = 3600
    opt,K,d1,d2 = differencing_dfs(data, cpu+limit)
    S = display(K)
    if opt == True:
        star = '*'
    t = clock() - cpu
    c = d1+d2
    c.sort()
    assert c == data
    print "B&B:", K

            

    cpu = clock()
    K1, d1, d2 = differencing_construct(data)
    S1 = display(K1)
    t1 = clock() - cpu
    c = d1+d2
    c.sort()
    assert c == data
    print "Differencing:", K1



    cpu = clock()
    part = longest_processing_time(data,2)
    t2 = clock() - cpu
    pmax = 0
    pmin = Infinity
    c = []
    for p in part:
        s = sum(p)
        # print p, s
        pmin = min(pmin,s)
        pmax = max(pmax,s)
        c += p
    c.sort()
    assert c == data
    # print "objective:", pmax - pmin
    K2 = pmax - pmin
    S2 = display(K2)
    print "LPT:", K2



    print >>output, "%-20s\t%d\t%s\t%d%2s\t%.2f\t%s\t%d\t%.2f\t%s\t%d\t%.2f" % \
          (inst, len(data), S,K,star,t, S1,K1,t1, S2,K2,t2)
    output.flush()
    sys.stdout.flush()
    
output.close()
