def run_on_one_instance(file):

        print file
        cmd = 'rm -rf *.log report.txt agent-*-plan.txt hyp-*-probs_over_time.csv *.res *.soln *.csv *.res.* *.pddl *.dat prob-*-PR'
        os.system(cmd)

	human_file = 'iros/test.tar.bz2'
	cmd = 'python prob_PR.py -e ' + str(human_file) + '> stdout.txt'
        os.system(cmd)

	cmd = 'mkdir -p results && tar -jxvf results.tar.bz2 -C results/ > stdout.txt'
	os.system(cmd)

        hyps = []
	instream = open('results/hyps.dat','r')
        line = instream.readline().strip()
	while line != '':
                line  = line.split(',') 
                hyps.append([ll[ll.find('(')+1:ll.find(')')].strip().replace(' ','_').upper() for ll in line])
                line = instream.readline().strip()
        instream.close()

        instream = open('flag.txt','r')
        curr = ast.literal_eval(instream.read().strip())
        instream.close()
        curr = [float(i)/sum(curr) for i in curr]

        T = 25
        num_kits = 5
        medkits = ['MK1','MK2','MK3','MK4','MK5']
        medkits = medkits[0:num_kits]
        mk_groundings = ['AT_?_ROOM1','AT_?_ROOM2','AT_?_ROOM3','AT_?_ROOM4','AT_?_ROOM5','AT_?_HALL1','AT_?_HALL2','AT_?_HALL3','AT_?_HALL4','AT_?_HALL5']
        globalVAR.resource_profiles_use = {}
        globalVAR.resource_profiles_grnd = {}
        for mk in medkits:
                globalVAR.resource_profiles_use[mk,'IN_USE'] = numpy.zeros(T+1)
                for grnd in mk_groundings:
                        tt = grnd.replace('?',mk)
                        globalVAR.resource_profiles_grnd[tt] = numpy.zeros(T+1)
                        
                
        for idx in range(len(hyps)):
                goal    = hyps[idx]
                #print '\nGoal : ', goal, ' :: probability = ', curr[idx]
                gotodir = 'results/prob-' + str(idx) + '-PR/O/'
                domainFile   = gotodir +  'pr-domain.pddl'
                problemFile  = gotodir + 'pr-problem.pddl'
                readFiles.read_input(domainFile, problemFile,'human') 

                #print '\nPlan: '
                cmd = '~/Desktop/FAST-DOWNWARD/src/translate/translate.py ' + str(domainFile) + ' ' + str(problemFile) + '> stdout.txt'
                os.system(cmd) 
                cmd = '~/Desktop/FAST-DOWNWARD/src/preprocess/preprocess < output.sas > stdout.txt'
                os.system(cmd) 
                cmd = '~/Desktop/FAST-DOWNWARD/src/fast-downward.py --plan-file plan_' + str(idx) + '.dat output --search "astar(lmcut())" > stdout.txt'
                os.system(cmd) 
                planFile = 'plan_' + str(idx) + '.dat'
                instream = open(planFile, 'r')
                current_plan = []
                while True:
                        line = instream.readline().strip()
                        if 'cost' in line:
                                break
                        current_plan.append(line[line.find('(')+1:line.find(')')].strip().replace(' ','_').upper())

                #for action in current_plan:
                #        print action

                temp_profiles_use = {}
                temp_profiles_grnd = {}
                for mk in medkits:

                        temp_profiles_use[mk] = numpy.zeros(T+1)
                        for grnd in mk_groundings:
                                tt = grnd.replace('?',mk)
                                temp_profiles_grnd[tt] = numpy.zeros(T+1)
                                temp_profiles_grnd[tt][0] = globalVAR.initState_human[globalVAR.listOfPredicates_human.index(tt)]*curr[idx]
                                
                        flag = 0
                        for action in current_plan:
                                step = current_plan.index(action)
                                if 'PICK_UP' in action and mk in action:
                                        flag = 1
                                if 'DROP_OFF' in action and mk in action:
                                        flag = 0
                                temp_profiles_use[mk][step] = flag*curr[idx]
                                
                                for grnd in mk_groundings:
                                        tt = grnd.replace('?',mk)
                                        temp_profiles_grnd[tt][step+1] = temp_profiles_grnd[tt][step]
                                
                                if flag == 1:

                                        if 'MOVE' in action:
                                                ext = ''
                                                if 'OBS' in action:
                                                        ext = action.split('_')[-2]
                                                else:
                                                        ext = action.split('_')[-1]
                                                ext = 'AT_' + mk + '_' + ext

                                                for grnd in mk_groundings:
                                                        tt = grnd.replace('?',mk)
                                                        temp_profiles_grnd[tt][step+1] = 0
                                                temp_profiles_grnd[ext][step+1] = flag*curr[idx]

                        for step in range(len(current_plan),T+1):
                                temp_profiles_use[mk][step] = temp_profiles_use[mk][step-1]
                                for grnd in mk_groundings:
                                        tt = grnd.replace('?',mk)
                                        temp_profiles_grnd[tt][step] = temp_profiles_grnd[tt][step-1]
                                                
                for step in range(T+1):
                        for mk in medkits:
                                globalVAR.resource_profiles_use[mk,'IN_USE'][step] += temp_profiles_use[mk][step]
                                for grnd in mk_groundings:
                                        tt = grnd.replace('?',mk)
                                        globalVAR.resource_profiles_grnd[tt][step] += temp_profiles_grnd[tt][step]
                
                                        
        domainFile = 'iros/robot/mk'+str(num_kits)+'/domain.pddl'
        problemFile = 'iros/robot/mk'+str(num_kits)+'/problem.pddl'
        time = [10, 15, 20, 25]
        for tt in time:
                resource_plan.run_ip(domainFile, problemFile, tt)
def run_ip(domainFile, problemFile, T):
    
    #print '\nReading domain and problem files...'
    readFiles.read_input(domainFile, problemFile,'robot') 

    #print_actions()
    #print_predicates()

    start = time.time()
    #print 'Building model...'
    # parameters #
    num_kits = 5
    res = ['MK1','MK2','MK3','MK4','MK5']
    res_grnd = ['AT_MK1_','AT_MK2_','AT_MK3_','AT_MK4_','AT_MK5_']
    res = res[0:num_kits]
    res_grnd = res_grnd[0:num_kits]

    #print 'Building resource-action lists...'
    res_act = build_resource_action_relations(res)

    # Model #
    m = Model("resourceplan")
    
    # Optimization criterion  #
    m.modelSense = GRB.MINIMIZE

    #print 'Adding variables...'
    # define variables - y_a_t  #
    var = {}
    var_grnd = {}
    switchList = []
    for vv in globalVAR.listOfPredicates_robot:
        for t in range(T):
            var[vv,t] = m.addVar(vtype=GRB.BINARY, name=str(vv) + '_%s' % (str(t)))
            if True in [rg in vv for rg in res_grnd]:
                var_grnd['res_'+vv,t] = m.addVar(vtype=GRB.BINARY, name='res_' + str(vv) + '_%s' % (str(t)))
                if vv not in switchList:
                    switchList.append(vv)
                    
    # define variables - x_a_t  #
    act = {}  
    for aa in globalVAR.listOfActions_robot:
        for t in range(1,T):
            act[aa[0],t] = m.addVar(vtype=GRB.BINARY, name=str(aa[0]) + '_%s' % (str(t)))
    
    # define variables - g_mk?_t #
    res_var = {}
    res_use = {}
    for r in res:
        for t in range(T):
           res_var[r,t] = m.addVar(vtype=GRB.BINARY, name=str(r) + '_%s' % (str(t)))
           res_use[r,t] = m.addVar(vtype=GRB.CONTINUOUS, name='use_' + str(r) + '_%s' % (str(t)))

    # Update model with variables #
    m.update()
    
    #print 'Adding constraints...'
    for r in res:
        for t in range(T):
            m.addConstr(res_use[r,t] <= globalVAR.resource_profiles_use[r,'IN_USE'][t])

    # define constraints - initial state #
    for vv in globalVAR.listOfPredicates_robot:
        if True not in [pp in vv for pp in res_grnd]:
            m.addConstr(var[vv,0] == globalVAR.initState_robot[globalVAR.listOfPredicates_robot.index(vv)])
        else:
            m.addConstr(var[vv,0] == 0)

    for r in res:
        m.addConstr(res_var[r,0] == 0)

    # define constraints - goal state #
    for vv in globalVAR.listOfPredicates_robot:
        if globalVAR.goalState_robot[globalVAR.listOfPredicates_robot.index(vv)] != -1:
            m.addConstr(var[vv,T-1] == globalVAR.goalState_robot[globalVAR.listOfPredicates_robot.index(vv)])

    # define constraints - preconditions #
    for t in range(1,T):
        for aa in globalVAR.listOfActions_robot:
            for precondition in aa[1]:
                if True not in [pp in precondition for pp in res_grnd]:
                    m.addConstr(act[aa[0],t] <= var[precondition,t-1])                    
                else:
                    m.addConstr(var_grnd['res_'+precondition,t-1] == act[aa[0],t])
                    #m.addConstr(var[precondition,T-1] >= var_grnd['res_'+precondition,t-1])

    for switch in switchList:
        m.addConstr(var_grnd['res_'+switch,T-1] == 0)

    # define constraints - add effects #
    for t in range(1,T):
        for vv in globalVAR.listOfPredicates_robot:
            tempList1 = []
            tempList2 = []
            for aa in globalVAR.listOfActions_robot:
                if vv in aa[2]:
                    tempList1.append(aa[0])
                if vv in aa[3]:
                    tempList2.append(aa[0])
            m.addConstr(var[vv,t] == quicksum(act[aa,t] for aa in tempList1) + (1-quicksum(act[aa,t] for aa in tempList1)-quicksum(act[aa,t] for aa in tempList2))*var[vv,t-1])
            m.addConstr(var[vv,t] <= quicksum(act[aa,t] for aa in tempList1) + (1-quicksum(act[aa,t] for aa in tempList1))*var[vv,t-1])
            #m.addConstr(var[vv,t] <= 1-quicksum(act[aa,t] for aa in tempList2))

    # define constraints - no concurrency #
    for t in range(1,T):
        m.addConstr(quicksum(act[aa[0],t] for aa in globalVAR.listOfActions_robot) == 1)

    # define constraints - no repetitions #
    for r in res:
        m.addConstr(quicksum(quicksum(act[aa,t] for aa in res_act[r][0]) for t in range(1,T)) <= 1)  

    # define constraints - resource profiles #
    m.update()
    for t in range(1,T):
        for r in res:
            m.addConstr(res_var[r,t] == quicksum(act[aa,t] for aa in res_act[r][0]) + (1-quicksum(act[aa,t] for aa in res_act[r][0]) - quicksum(act[aa,t] for aa in res_act[r][1]))*res_var[r,t-1])
            #m.addConstr(res_var[r,t] <= quicksum(act[aa,t] for aa in res_act[r][0]))
    
    #for t in range(1,T):
        #m.addConstr(quicksum(var[vv,t] for vv in switchList) == 1)
    
    for t in range(T):
        for rg in switchList:
            m.addConstr(globalVAR.resource_profiles_grnd[rg][t]*var_grnd['res_'+rg,t] + (1-var_grnd['res_'+rg,t]) >= 0.001)
    
    # set optimization objective function #
    m.setObjective(objective_function(act, var, res, res_use, res_var, var_grnd, switchList, T))

    # optimize #
    #print "Optimizing..."
    m.params.OutputFlag = 0
    m.optimize()
    end = time.time()
    
    # print solution #
    status = m.status
    if status == GRB.OPTIMAL:
        ret = print_plan(m, res, T)
        print 'Time: ', (end-start), 'Cost: ', ret[0], 'Conflict: ', ret[1], 'Success', ret[2], 'T = ', T  
        #print '\nTime Taken:', (end - start), ' sec'
        #print('Obj: %g' % m.ObjVal)
    else:
        print 'Optimization was stopped with status %d' %status