def mk_ampl_data(filename, unvisited, D):
    if filename == "-":
        f = sys.stdout
    else:
        f = open(filename, "w")
    n = len(unvisited)
    f.write("param n := %d;\n" % n)
    f.write("param c :	" + " ".join("%r" % (i+1) for i in range(n)) + " :=\n")
    for i in unvisited:
        f.write("%r\t" % (i+1) + " ".join("%r" % D[i,j] for j in unvisited) + "\n")
    f.write(";\nend;\n")

if __name__ == "__main__":
    """Solve the Fixed-Start Asymetric Hamiltonian Path with gurobi
    (with glpsol for preparing the MPS file)
    """
    
    #
    # input data from an ATSP benchmark file
    #

    import atsp
    import time
    import sys
    if len(sys.argv) == 3:
        instance = sys.argv[1]
        maxcpu = float(sys.argv[2])
    else:
        print "usage:", sys.argv[0], "[instance maxcpu]"
        exit(-1)

    n, D = atsp.read_atsplib(instance)

    # modify data for handling the fixed-start asymetric hamiltonian path
    start = 0
    for i in range(n):
        D[i,start] = 0
    mk_ampl_data("atsp.dat", range(n), D)

    # prepare MPS file for input to gurobi
    import os
    os.system("glpsol --math atsp.mod --data atsp.dat --wmps atsp.mps --check > /dev/null")

    # solve it with one thread, and the given time limit
    import gurobipy
    # setParam("LogfileName", "/home/jpp/gurobi.log")
    # setParam("OutputFlag", 0)
    m = gurobipy.read("atsp.mps")
    m.Params.Threads = 1
    m.Params.TimeLimit = maxcpu
    m.optimize()

    import time
    print "%r\t%r\t%r" % (time.clock(), m.ObjVal, m.ObjBound)

exit(0)
