Ejemplo n.º 1
0
    def run(self, cycle, verbose = 2):
        self.verbose = verbose

        goals = self.mem.get(self.mem.CURRENT_GOALS)
        
        midcaPlan = 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)
            
            # check to see that midcaPlan has not been finished
            if midcaPlan.finished():
                # remove from goals and trigger replanning
                self.mem.get(self.mem.GOALGRAPH).removePlan(midcaPlan)
                if self.verbose >= 1: print "Old plan finished, will re-plan"
                midcaPlan = None
        except AttributeError:
            midcaPlan = None
            if verbose >= 2:
                print "Did not retrieve plan, will plan from scratch"
            
        # ensure goals is a collection to simplify things later.
        if not isinstance(goals, collections.Iterable):
            goals = [goals]

        if midcaPlan:
            if self.verbose >= 1: print "Retrieved current plan. Skipping planning."
            return

        if not midcaPlan:
            #use pyhop to generate new plan
            if verbose >= 2:
                print "Planning..."
            #try:
            self.mem.set(self.mem.PLANNING_COUNT, 1+self.mem.get(self.mem.PLANNING_COUNT))
            #print "Goals are "+str(map(str,goals))
            
            hsp_plan = self.heuristic_search(goals, decompose=self.brute_force_decompose_nbeacons)
            if self.verbose >= 1: 
                print "planning finished: "
                for p in hsp_plan:
                    print "  "+str(p.operator.name)+"("+str(map(lambda o:o.name,p.args))+")"
            
            midcaPlan = plans.Plan([plans.Action(action.operator.name, *map(lambda o:o.name,action.args)) for action in hsp_plan], goals)
            
            if verbose >= 2:
                print "Plan: "#, midcaPlan
                for a in midcaPlan:
                    print("  "+str(a))
                
            if midcaPlan != None:
                self.mem.get(self.mem.GOAL_GRAPH).addPlan(midcaPlan)
Ejemplo n.º 2
0
    def run(self, cycle, verbose=2):
        state = self.mem.get(self.mem.STATE)
        if not state:
            states = self.mem.get(self.mem.STATES)
            if states:
                state = states[-1]
            else:
                if verbose >= 1:
                    print "No world state loaded. Skipping planning."
                return
        #now state is the most recent (or only) state and is non-null

        goals = self.mem.get(self.mem.CURRENT_GOALS)
        if not goals:
            if verbose >= 2:
                print "No goals received by planner. Skipping planning."
            return
        plan = self.get_old_plan(state, goals, verbose)
        if verbose > 2:
            if plan:
                print "Will not replan"
            else:
                print "Will replan"
        if plan:
            return
        if not plan:
            plan = self.get_new_plan(state, goals, verbose)
        if not plan:
            return
        midcaPlan = plans.Plan(plan, goals)
        asynchPlan = asynch.asynch_plan(self.mem, midcaPlan)
        if verbose >= 1:
            print "Planning complete."
            if verbose >= 2:
                print "Plan: ", asynchPlan
        #save new plan
        if asynchPlan != None:
            self.mem.get(self.mem.GOAL_GRAPH).addPlan(asynchPlan)
Ejemplo n.º 3
0
 def run(self, cycle, verbose=2):
     state = self.mem.get(self.mem.STATE)
     if not state:
         states = self.mem.get(self.mem.STATES)
         if states:
             state = states[-1]
         else:
             if verbose >= 1:
                 print "No world state loaded. Skipping planning."
             return
     #now state is the most recent (or only) state and is non-null
     goals = self.mem.get(self.mem.CURRENT_GOALS)
     if not goals:
         if verbose >= 2:
             print "No goals received by planner. Skipping planning."
         return
     plan = self.get_old_plan(state, goals, verbose)
     if verbose >= 2:
         if plan:
             print "Will not replan"
         else:
             print "Planning from scratch"
     if not plan:
         plan = self.get_new_plan(state, goals, verbose)
         if not plan and plan != []:
             return
         #convert to MIDCA plan format
         plan = plans.Plan(
             [plans.Action(action[0], *action[1:]) for action in plan],
             goals)
         if verbose >= 1:
             print "Planning complete."
     if verbose >= 2:
         print "Plan: ", plan
     #save new plan
     if plan != None:
         self.mem.get(self.mem.GOAL_GRAPH).addPlan(plan)
Ejemplo n.º 4
0
    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)