Beispiel #1
0
    def launch_task_world(self, task_name, world_name, agents):
        """
        Launch a task world.

        Return the job's future.

        :param task_name:
            string. the name of the job thread
        :param world_name:
            string. the name of the task world in the module file
        :param agents:
            list. the list of agents to install in the world

        :return:
            the Futures object corresponding to this launched task
        """
        task = utils.TaskState(task_name, world_name, agents)
        self.tasks[task_name] = task

        def _world_fn():
            log_utils.print_and_log(logging.INFO,
                                    'Starting task {}...'.format(task_name))
            return self._run_world(task, world_name, agents)

        fut = self.executor.submit(_world_fn)
        task.future = fut
        return fut
Beispiel #2
0
    def launch_overworld(self, task_name, overworld_name, onboard_map,
                         overworld_agent):
        """
        Launch an overworld and a subsequent onboarding world.

        Return the job's future

        :param task_name:
            string. the name of the job thread
        :param overworld_name:
            string. the name of the overworld in the module file
        :param onboard_map:
            map. a mapping of overworld return values to the names
            of onboarding worlds in the module file.
        :param overworld_agent:
            The agent to run the overworld with

        :return:
            the Futures object corresponding to running the overworld
        """
        task = utils.TaskState(
            task_name,
            overworld_name,
            [overworld_agent],
            is_overworld=True,
            world_type=None,
        )
        self.tasks[task_name] = task
        agent_state = self.manager.get_agent_state(overworld_agent.id)

        def _world_function():
            world_generator = utils.get_world_fn_attr(self._world_module,
                                                      overworld_name,
                                                      "generate_world")
            overworld = world_generator(self.opt, [overworld_agent])
            while not overworld.episode_done() and not self.system_done:
                world_type = overworld.parley()
                if world_type is None:
                    time.sleep(0.5)
                    continue

                if world_type == self.manager.EXIT_STR:
                    self.manager._remove_agent(overworld_agent.id)
                    return world_type

                # perform onboarding
                onboard_type = onboard_map.get(world_type)
                if onboard_type:
                    onboard_id = 'onboard-{}-{}'.format(
                        overworld_agent.id, time.time())
                    agent = self.manager._create_agent(onboard_id,
                                                       overworld_agent.id)
                    agent.data = overworld_agent.data
                    agent_state.set_active_agent(agent)
                    agent_state.assign_agent_to_task(agent, onboard_id)
                    _, onboard_data = self._run_world(task, onboard_type,
                                                      [agent])
                    agent_state.onboard_data = onboard_data
                    agent_state.data = agent.data
                self.manager.add_agent_to_pool(agent_state, world_type)
                log_utils.print_and_log(logging.INFO,
                                        'onboarding/overworld complete')

            return world_type

        fut = self.executor.submit(_world_function)
        task.future = fut
        return fut