def initialize_model(self, task, model_dir, model_name): domain_filepath = pathlib.Path(task.domain_file) problem_filepath = pathlib.Path(task.problem_file) self._problem = Problem(domain_filepath.name, problem_filepath.name, problem_filepath.parent) from generalized_learning.search.heuristic.nn_plact import NNPLACT self._nnplact = NNPLACT(self._problem, model_dir, model_name)
def _get_training_data(self, domain_filepath, problem_file_list, solver_name, abstract_domain): if abstract_domain is None: abstract_domain = AbstractDomain() nn_pkgs_list = [] for problem_filepath in problem_file_list: solution_filepath = "%s.%s.%s" % (problem_filepath, solver_name, constants.SOLUTION_FILE_EXT) problem = Problem(domain_filepath.name, problem_filepath.name, problem_filepath.parent) if not problem._is_relaxed_reachable: continue try: solution = Solution.parse(solution_filepath) except Exception: continue current_state = problem.get_initial_state() action_list = solution.get_action_list() plan_length = len(action_list) for i in range(plan_length): abstract_state = AbstractState(problem, current_state) action_name = action_list[i] action = problem.get_action(action_name) nn_pkg = abstract_domain.encode_nn_training_data( abstract_state, action, plan_length - i) nn_pkgs_list.append(nn_pkg) assert action.is_applicable(current_state) current_state = action.apply(current_state) return [(abstract_domain, nn_pkgs_list)]
def search(self, domain_filepath, problem_filepath): self._reset() assert domain_filepath.parent == problem_filepath.parent problem = Problem(domain_filepath.name, problem_filepath.name, problem_filepath.parent) heuristic = InformedSearch.get_heuristic(self._search_param_dict, problem, self._parent_dir) initial_state = problem.get_initial_state() root_node = Node(initial_state, None, None, 0, 0) fringe_list = [] self._push_to_fringe(fringe_list, root_node) progress_bar = tqdm.tqdm(unit=" nodes") progress_bar.update(1) goal_node = None while len(fringe_list) > 0: node = self._pop_from_fringe(fringe_list) action = node.get_action() print(action) concrete_state = node.get_concrete_state() if problem.is_goal_satisfied(concrete_state): goal_node = node break else: self._total_nodes_expanded += 1 new_children = heuristic.expand(node) for child in new_children: self._push_to_fringe(fringe_list, child) progress_bar.update(1) progress_bar.close() return self._create_solution(problem, goal_node)
def search(self, domain_filepath, problem_filepath): start_time = time.time() end_time = start_time + self._time_limit_in_sec self._reset() assert domain_filepath.parent == problem_filepath.parent problem = Problem(domain_filepath.name, problem_filepath.name, problem_filepath.parent) heuristic = AStar.get_heuristic(self._search_param_dict, problem, self._parent_dir) initial_state = problem.get_initial_state() root_node = Node(initial_state, None, None, 0, 0) root_node.artificial_g = 0.0 root_node._h = 0 state_node_dict = {} fringe = PriorityQ() fringe.push(initial_state, 0.0) state_node_dict[initial_state] = root_node # progress_bar = tqdm.tqdm(unit=" nodes") goal_node = None true_g = {} true_g[initial_state] = 0 while not fringe.is_empty() \ and time.time() < end_time \ and self._total_nodes_expanded < self._nodes_expanded_limit: # progress_bar.update(1) current_state = fringe.pop() current_node = state_node_dict[current_state] del state_node_dict[current_state] action = current_node.get_action() # print("picked:", action) if problem.is_goal_satisfied(current_state): goal_node = current_node break else: self._total_nodes_expanded += 1 applicable_actions = problem.get_applicable_actions( current_state) candidates = [] # print("***************************") for action in applicable_actions: next_state = action.apply(current_state) assert action.get_cost() == 1 # g_scores for the current state must always be available. assert current_state in true_g temp_g_score = true_g[current_state] + action.get_cost() if temp_g_score < true_g.get(next_state, float("inf")): # Better path found, update priority in fringe # (invalidate the old value) and also update the # node reference for this state in the open set. h = heuristic.compute_h(current_state, next_state, action) # print("a:", action, "g:", temp_g_score, # "h:", h, "f:", f_score) child_node = Node(next_state, current_node, action, temp_g_score, 0) state_node_dict[next_state] = child_node true_g[next_state] = temp_g_score candidates.append(child_node) if len(candidates) > 0: heuristic.update_candidates(current_node, candidates) for child_node in candidates: fringe.push(child_node.get_concrete_state(), (child_node.get_fscore(), child_node.get_h())) # progress_bar.close() solution = self._create_solution(problem, goal_node, start_time, heuristic) solution.write(self.get_solution_filepath(problem_filepath)) return []
def search(self, domain_filepath, problem_filepath): temp_logfile_handle = tempfile.NamedTemporaryFile("w+", delete=False) ff_cmd = "%s -o %s -f %s" % (self._FF_EXECUTABLE, domain_filepath, problem_filepath) logger.debug("Running ff_cmd=%s" % (ff_cmd)) ff_cmd = ff_cmd.split(" ") start_time = time.time() timeout = False failed = False try: completed_process = subprocess.Popen(ff_cmd, stdout=temp_logfile_handle) completed_process.wait(timeout=self._time_limit_in_sec) # If we did not timeout, then the command must have run # successfully. # # Currently, we do not support internal errors. if completed_process.returncode != 0: failed = True except subprocess.TimeoutExpired: self._terminate(completed_process) self._kill(completed_process) timeout = True pass total_time = time.time() - start_time total_time = min(total_time, self._time_limit_in_sec) # Get the problem parsed out. assert domain_filepath.parent == problem_filepath.parent problem = Problem(domain_filepath.name, problem_filepath.name, problem_filepath.parent) # Parse the solution. solution = self._parse_log(temp_logfile_handle, problem, timeout, failed) solution.set_solution_property("time_taken", "%.2f" % (total_time)) # Set the algorithm properties. algorithm_properties = { "time_limit": self.get_time_limit_in_sec(), "nodes_expanded_limit": self.get_nodes_expanded_limit(), } for key in algorithm_properties: solution.set_algorithm_property(key, algorithm_properties[key]) # Finally, check if we need to save the logfiile. temp_logfile_handle.close() if self._save_logs: log_filename = "%s.%s.%s" % (problem_filepath.name, self._name, constants.LOG_FILE_EXT) log_filepath = pathlib.Path(problem_filepath.parent, log_filename) shutil.move(temp_logfile_handle.name, log_filepath) else: try: os.remove(temp_logfile_handle.name) except FileNotFoundError: pass try: # ff also creates a <problem>.soln file. # delete that file. # # TODO: What if a solution could not be found and consequently this # file does not exist? os.remove("%s/%s.%s" % (problem_filepath.parent, problem_filepath.name, constants.SOLUTION_FILE_EXT)) except FileNotFoundError: pass # Save the solution to a compliant file. solution_filename = "%s.%s.%s" % (problem_filepath.name, self._name, constants.SOLUTION_FILE_EXT) solution_filepath = pathlib.Path(problem_filepath.parent, solution_filename) solution.set_name(self._name) solution.write(solution_filepath) # Return nothing since the solution has already been written to the # disk. # # Returning nothing ensures that the phase system does not rely upon # results from this phase. return []
def _search(self, domain_filepath, problem_filepath): pyperplan_cmd = self._get_pyperplan_cmd(domain_filepath, problem_filepath) temp_logfile_handle = tempfile.NamedTemporaryFile("w+", delete=False) logger.debug("Running pyperplan_cmd=%s" % (pyperplan_cmd)) pyperplan_cmd = pyperplan_cmd.split(" ") start_time = time.time() timeout = False failed = False try: completed_process = subprocess.Popen(pyperplan_cmd, stdout=temp_logfile_handle) completed_process.wait(timeout=self._time_limit_in_sec) except subprocess.TimeoutExpired: self._terminate(completed_process) self._kill(completed_process) timeout = True failed = True pass total_time = time.time() - start_time total_time = min(total_time, self._time_limit_in_sec) # Get the problem parsed out. assert domain_filepath.parent == problem_filepath.parent problem = Problem(domain_filepath.name, problem_filepath.name, problem_filepath.parent) # Parse the solution. solution = self._parse_log(temp_logfile_handle, problem, self._mode, timeout, failed) solution.set_solution_property("time_taken", "%.2f" % (total_time)) # Set the algorithm properties. algorithm_properties = { "time_limit": self.get_time_limit_in_sec(), "nodes_expanded_limit": self.get_nodes_expanded_limit(), } for key in algorithm_properties: solution.set_algorithm_property(key, algorithm_properties[key]) # Finally, check if we need to save the logfiile. temp_logfile_handle.close() if self._save_logs: log_filename = "%s.%s.%s.%s" % (problem_filepath.name, self._mode, self._name, constants.LOG_FILE_EXT) log_filepath = pathlib.Path(problem_filepath.parent, log_filename) shutil.move(temp_logfile_handle.name, log_filepath) else: os.remove(temp_logfile_handle.name) # Save the solution to a compliant file. solution_filename = "%s.%s.%s" % (problem_filepath.name, self._name, constants.SOLUTION_FILE_EXT) solution_filepath = pathlib.Path(problem_filepath.parent, solution_filename) solution.set_name(self._name) solution.write(solution_filepath) # Return nothing since the solution has already been written to the # disk. # # Returning nothing ensures that the phase system does not rely upon # results from this phase. return []