def get_new_plan(self, state, goals, verbose = 2): ''' Calls the pyhop planner to generate a new plan. ''' if verbose >= 2: print "Planning..." try: plan = pyhop.pyhop(state, [("achieve_goals", goals)], verbose = 0) #note: MIDCA does not convert its state and goals to pyhop state and #goal objects. Therefore, pyhop will not print correctly if verbose is #set to other than 0. except: if verbose >= 1: print "Error in planning:", traceback.format_exc(), "\n-Planning failed." return None return plan
def run(self, cycle, verbose = 2): #world = self.mem.get(self.mem.STATES)[-1] world = self.mem.get(self.mem.STATE) goals = self.mem.get(self.mem.CURRENT_GOALS) trace = self.mem.trace if trace: trace.add_module(cycle,self.__class__.__name__) trace.add_data("WORLD", copy.deepcopy(world)) trace.add_data("GOALS", copy.deepcopy(goals)) trace.add_data("PLAN", None) if not goals: if verbose >= 2: print "No goals received by planner. Skipping planning." return try: midcaPlan = self.mem.get(self.mem.GOAL_GRAPH).getMatchingPlan(goals) except AttributeError: midcaPlan = None if midcaPlan: if verbose >= 2: print "Old plan retrieved. Checking validity...", valid = world.plan_correct(midcaPlan) if not valid: midcaPlan = None #if plan modification is added to MIDCA, do it here. if verbose >= 2: print "invalid." elif verbose >= 2: print "valid." if valid: if verbose >= 2: print "checking to see if all goals are achieved...", achieved = world.plan_goals_achieved(midcaPlan) if verbose >= 2: if len(achieved) == len(midcaPlan.goals): print "yes" else: print "no. Goals achieved: " + str({str(goal) for goal in achieved}) if len(achieved) != len(midcaPlan.goals): midcaPlan = None #triggers replanning. #ensure goals is a collection to simplify things later. if not isinstance(goals, collections.Iterable): goals = [goals] if not midcaPlan: #use pyhop to generate new plan if verbose >= 2: print "Planning..." try: pyhopState = self.pyhop_state_from_world(world) except Exception: print "Could not generate a valid pyhop state from current world state. Skipping planning" try: pyhopTasks = self.pyhop_tasks_from_goals(goals, pyhopState) except Exception as e: print e print "Could not generate a valid pyhop task from current goal set. Skipping planning" try: pyhopPlan = pyhop.pyhop(pyhopState, pyhopTasks, verbose = 0) except Exception: pyhopPlan = None if not pyhopPlan and pyhopPlan != []: if verbose >= 1: print "Planning failed for ", for goal in goals: print goal, " ", print if trace: trace.add_data("PLAN", pyhopPlan) return #change from pyhop plan to MIDCA plan midcaPlan = plans.Plan([plans.Action(action[0], *list(action[1:])) for action in pyhopPlan], goals) if verbose >= 1: print "Planning complete." if verbose >= 2: print "Plan: ", midcaPlan #save new plan if midcaPlan != None: self.mem.get(self.mem.GOAL_GRAPH).addPlan(midcaPlan) if trace: trace.add_data("PLAN",midcaPlan)
def run(self, cycle, verbose=2): world = self.mem.get(self.mem.STATES)[-1] goals = self.mem.get(self.mem.CURRENT_GOALS) trace = self.mem.trace if trace: trace.add_module(cycle, self.__class__.__name__) trace.add_data("WORLD", copy.deepcopy(world)) trace.add_data("GOALS", copy.deepcopy(goals)) if not goals: if verbose >= 2: print "No goals received by planner. Skipping planning." return try: midcaPlan = self.mem.get( self.mem.GOAL_GRAPH).getMatchingPlan(goals) except AttributeError: midcaPlan = None if midcaPlan: if verbose >= 2: print "Old plan retrieved. Checking validity...", valid = world.plan_correct(midcaPlan) if not valid: midcaPlan = None #if plan modification is added to MIDCA, do it here. if verbose >= 2: print "invalid." elif verbose >= 2: print "valid." if valid: if verbose >= 2: print "checking to see if all goals are achieved...", achieved = world.plan_goals_achieved(midcaPlan) if verbose >= 2: if len(achieved) == len(midcaPlan.goals): print "yes" else: print "no. Goals achieved: " + str( {str(goal) for goal in achieved}) if len(achieved) != len(midcaPlan.goals): midcaPlan = None #triggers replanning. #ensure goals is a collection to simplify things later. if not isinstance(goals, collections.Iterable): goals = [goals] if not midcaPlan: #use pyhop to generate new plan if verbose >= 2: print "Planning..." try: pyhopState = self.pyhop_state_from_world(world) except Exception: print "Could not generate a valid pyhop state from current world state. Skipping planning" try: pyhopTasks = self.pyhop_tasks_from_goals(goals, pyhopState) except Exception as e: print e print "Could not generate a valid pyhop task from current goal set. Skipping planning" try: pyhopPlan = pyhop.pyhop(pyhopState, pyhopTasks, verbose=0) except Exception: pyhopPlan = None if not pyhopPlan and pyhopPlan != []: if verbose >= 1: print "Planning failed for ", for goal in goals: print goal, " ", print if trace: trace.add_data("PLAN", pyhopPlan) return #change from pyhop plan to MIDCA plan midcaPlan = plans.Plan([ plans.Action(action[0], *list(action[1:])) for action in pyhopPlan ], goals) if verbose >= 1: print "Planning complete." if verbose >= 2: print "Plan: ", midcaPlan #save new plan if midcaPlan != None: self.mem.get(self.mem.GOAL_GRAPH).addPlan(midcaPlan) if trace: trace.add_data("PLAN", midcaPlan)