def get_plan(domain_file, problem_file): """ This method calls the planner. The planner can be either FF Planner (ff) or Madagascar (mg). It needs to be set in config.py in the root directory. :param domain_file: domain file (operator file) for the planner :type domain_file: str :param problem_file: problem file (fact file) for the planner :type problem_file: str :param result_file: result file to store output of the planner :type result_file: str :rtype: list """ plan = "" if PLANNER == "FF": result_file = temp_output_file param = FF_PATH + "ff" param += " -o " + domain_file param += " -f " + problem_file param += " > " + result_file p = subprocess.Popen([param], shell=True) p.wait() plan = FileUtils.get_plan_from_file(result_file) elif PLANNER == "FD": cmd = FD_PATH + 'fast-downward.py ' + domain_file + ' ' + problem_file + ' --search "astar(lmcut())"' plan = os.popen(cmd).read() proc_plan = plan.split('\n') cost = [i for i, s in enumerate(proc_plan) if 'Plan cost:' in s] if 'Solution found!' not in proc_plan: print("No Solution") return [], 0 plan = proc_plan[proc_plan.index('Solution found!') + 2:cost[0] - 1] return plan
def get_plan_from_query(self, init_state, domain_name, objects, pred_type_mapping, action_parameters): f = open(Q_DOMAIN_FILE, "w") self.write_query_to_file(f, domain_name, objects, pred_type_mapping, action_parameters) f.close() f = open(Q_PROBLEM_FILE, "w") FileUtils.writeProblemToFile(self, f, domain_name, domain_name + "-1", True, objects, pred_type_mapping) f.close() self.call_planner(Q_DOMAIN_FILE, Q_PROBLEM_FILE, Q_RESULT_FILE) self.plan = FileUtils.get_plan_from_file(Q_RESULT_FILE) planRaw = self.plan if len(planRaw) != 0: f = open(Q_PLAN_FILE, "w") FileUtils.writePlanToFile(self, f, init_state, domain_name, domain_name + "-1", objects) f.close() return planRaw