예제 #1
0
 def __init__(self, config: BeamNGConfig, archive: Archive):
     self.config: BeamNGConfig = config
     self._evaluator: BeamNGEvaluator = None
     super().__init__(config, archive)
     if self.config.generator_name == self.config.GEN_RANDOM:
         seed_pool = SeedPoolRandom(self, config.POPSIZE)
     else:
         seed_pool = SeedPoolFolder(self, config.seed_folder)
     self._seed_pool_strategy = SeedPoolAccessStrategy(seed_pool)
     self.experiment_path = folders.experiments.joinpath(
         self.config.experiment_name)
     delete_folder_recursively(self.experiment_path)
예제 #2
0
 def __init__(self, config: BeamNGConfig):
     self.config: BeamNGConfig = config
     self._evaluator: BeamNGEvaluator = None
     super().__init__(config)
     if self.config.generator_name == self.config.GEN_RANDOM:
         seed_pool = SeedPoolRandom(self, config.POPSIZE)
     elif self.config.generator_name == self.config.GEN_DIVERSITY:
         path = initial_pool_generator(self.config, self)
         initial_population_generator(path, self.config, self)
         seed_pool = SeedPoolFolder(self, config.initial_population_folder)
     else:
         seed_pool = SeedPoolFolder(self, config.seed_folder)
     self._seed_pool_strategy = SeedPoolAccessStrategy(seed_pool)
     self.experiment_path = folders.experiments.joinpath(
         self.config.experiment_name)
     delete_folder_recursively(self.experiment_path)
    def __init__(self, _type, problem, log_dir_path, run_id, minimization):
        """
        :param minimization: True if solving a minimization problem. False if solving a maximization problem.
        """
        self.problem = problem
        self.config: BeamNGConfig = problem.config
        if self.config.generator_name == self.config.GEN_RANDOM:
            seed_pool = SeedPoolRandom(self.problem, self.config.POPSIZE)
        else:
            seed_pool = SeedPoolFolder(self.problem, self.config.seed_folder)
        self._seed_pool_strategy = SeedPoolAccessStrategy(seed_pool)
        self.experiment_path = folders.experiments.joinpath(
            self.config.experiment_name)
        self.elapsed_time = 0
        self.log_dir_path = log_dir_path
        self.minimization = minimization
        # set the choice operator either to do a minimization or a maximization
        if self.minimization:
            self.place_operator = operator.lt
        else:
            self.place_operator = operator.ge

        self.ITERATIONs = self.config.NUM_GENERATIONS
        self.config.EXECTIME = 0
        self.random_solutions = self.config.POPSIZE
        self.feature_dimensions = self.generate_feature_dimensions(_type)

        # get number of bins for each feature dimension
        ft_bins = [ft.bins for ft in self.feature_dimensions]

        # Map of Elites: Initialize data structures to store solutions and fitness values
        self.solutions = dict()
        self.performances = dict()
        self.run_id = run_id
        for ft in self.feature_dimensions:
            log.info(f"Feature: {ft.name}")
        log.info("Configuration completed.")
예제 #4
0
class BeamNGProblem(Problem):
    def __init__(self, config: BeamNGConfig, archive: Archive):
        self.config: BeamNGConfig = config
        self._evaluator: BeamNGEvaluator = None
        super().__init__(config, archive)
        # TODO: export this decision to config file
        if self.config.generator_name == self.config.GEN_RANDOM:
            seed_pool = SeedPoolRandom(self, config.POPSIZE)
        else:
            seed_pool = SeedPoolFolder(self, config.seed_folder)

        self._seed_pool_strategy = SeedPoolAccessStrategy(seed_pool)
        self.experiment_path = folders.experiments.joinpath(
            self.config.experiment_name)
        delete_folder_recursively(self.experiment_path)

    def deap_generate_individual(self):
        seed = self._seed_pool_strategy.get_seed()
        road1 = seed.clone()
        road2 = seed.clone().mutate()
        road1.config = self.config
        road2.config = self.config
        individual: BeamNGIndividual = creator.Individual(
            road1, road2, self.config, self.archive)
        individual.seed = seed
        log.info(f'generated {individual}')

        return individual

    def deap_evaluate_individual(self, individual: BeamNGIndividual):
        return individual.evaluate()

    def on_iteration(self, idx, pop: List[BeamNGIndividual], logbook):
        # self.archive.process_population(pop)

        self.experiment_path.mkdir(parents=True, exist_ok=True)
        self.experiment_path.joinpath('config.json').write_text(
            json.dumps(self.config.__dict__))

        gen_path = self.experiment_path.joinpath(f'gen{idx}')
        gen_path.mkdir(parents=True, exist_ok=True)

        # Generate final report at the end of the last iteration.
        if idx % 10 == 0 or idx + 1 == self.config.NUM_GENERATIONS:
            covered_seeds = self.archive.get_covered_seeds()
            report = {
                'archive_len':
                len(self.archive),
                'radius':
                get_radius_seed(self.archive),
                'diameter':
                get_diameter(
                    [ind.members_by_sign()[0] for ind in self.archive]),
                'covered_seeds':
                len(covered_seeds)
            }
            gen_path.joinpath(f'report{idx}.json').write_text(
                json.dumps(report))

        BeamNGIndividualSetStore(gen_path.joinpath('population')).save(pop)
        BeamNGIndividualSetStore(gen_path.joinpath('archive')).save(
            self.archive)

    def generate_random_member(self) -> Member:
        result = RoadGenerator(num_control_nodes=self.config.num_control_nodes,
                               seg_length=self.config.SEG_LENGTH).generate()
        result.config = self.config
        result.problem = self
        return result

    def deap_individual_class(self):
        return BeamNGIndividual

    def member_class(self):
        return BeamNGMember

    def reseed(self, pop, offspring):
        if len(self.archive) > 0:
            stop = self.config.RESEED_UPPER_BOUND + 1
            seed_range = min(random.randrange(0, stop), len(pop))
            log.info(f'reseed{seed_range}')
            for i in range(0, seed_range):
                ind1 = self.deap_generate_individual()
                rem_idx = -(i + 1)
                log.info(f'reseed rem {pop[rem_idx]}')
                pop[rem_idx] = ind1

    def _get_evaluator(self):
        if self._evaluator:
            return self._evaluator
        ev_name = self.config.beamng_evaluator
        if ev_name == BeamNGConfig.EVALUATOR_FAKE:
            from self_driving.beamng_evaluator_fake import BeamNGFakeEvaluator
            self._evaluator = BeamNGFakeEvaluator(self.config)
        elif ev_name == BeamNGConfig.EVALUATOR_LOCAL_BEAMNG:
            from self_driving.beamng_nvidia_runner import BeamNGNvidiaOob
            self._evaluator = BeamNGNvidiaOob(self.config)
        elif ev_name == BeamNGConfig.EVALUATOR_REMOTE_BEAMNG:
            from self_driving.beamng_evaluator_remote import BeamNGRemoteEvaluator
            self._evaluator = BeamNGRemoteEvaluator(self.config)
        else:
            raise NotImplemented(self.config.beamng_evaluator)

        return self._evaluator

    def pre_evaluate_members(self, individuals: List[BeamNGIndividual]):
        all_members = list(
            itertools.chain(*[(ind.m1, ind.m2) for ind in individuals]))
        log.info('----evaluation warmup')
        self._get_evaluator().evaluate(all_members)
        log.info('----warmpup completed')
예제 #5
0
class BeamNGProblem(Problem):
    def __init__(self, config: BeamNGConfig):
        self.config: BeamNGConfig = config
        self._evaluator: BeamNGEvaluator = None
        super().__init__(config)
        if self.config.generator_name == self.config.GEN_RANDOM:
            seed_pool = SeedPoolRandom(self, config.POPSIZE)
        elif self.config.generator_name == self.config.GEN_DIVERSITY:
            path = initial_pool_generator(self.config, self)
            initial_population_generator(path, self.config, self)
            seed_pool = SeedPoolFolder(self, config.initial_population_folder)
        else:
            seed_pool = SeedPoolFolder(self, config.seed_folder)
        self._seed_pool_strategy = SeedPoolAccessStrategy(seed_pool)
        self.experiment_path = folders.experiments.joinpath(
            self.config.experiment_name)
        delete_folder_recursively(self.experiment_path)

    def deap_generate_individual(self):
        seed = self._seed_pool_strategy.get_seed()
        road = seed.clone().mutate()
        road.config = self.config
        individual: BeamNGIndividual = creator.Individual(road, self.config)
        individual.seed = seed
        log.info(f'generated {individual}')
        return individual

    def deap_evaluate_individual(self, individual: BeamNGIndividual):
        return individual.evaluate()

    def generate_random_member(self, _max_angle) -> Member:
        result = RoadGenerator(num_control_nodes=self.config.num_control_nodes,
                               max_angle=_max_angle,
                               seg_length=self.config.SEG_LENGTH).generate()
        result.config = self.config
        result.problem = self
        return result

    def deap_individual_class(self):
        return BeamNGIndividual

    def member_class(self):
        return BeamNGMember

    def _get_evaluator(self):
        if self._evaluator:
            return self._evaluator
        ev_name = self.config.beamng_evaluator
        if ev_name == BeamNGConfig.EVALUATOR_FAKE:
            from self_driving.beamng_evaluator_fake import BeamNGFakeEvaluator
            self._evaluator = BeamNGFakeEvaluator(self.config)
        elif ev_name == BeamNGConfig.CONFIDENCE_EVALUATOR:
            from self_driving.beamng_confidence_evaluator import BeamNGConfidenceEvaluator
            self._evaluator = BeamNGConfidenceEvaluator(self.config)
        elif ev_name == BeamNGConfig.EVALUATOR_LOCAL_BEAMNG:
            from self_driving.beamng_nvidia_runner import BeamNGNvidiaOob
            self._evaluator = BeamNGNvidiaOob(self.config)
        elif ev_name == BeamNGConfig.EVALUATOR_REMOTE_BEAMNG:
            from self_driving.beamng_evaluator_remote import BeamNGRemoteEvaluator
            self._evaluator = BeamNGRemoteEvaluator(self.config)
        else:
            raise NotImplemented(self.config.beamng_evaluator)

        return self._evaluator

    def pre_evaluate_members(self, individuals: List[BeamNGIndividual]):
        # return
        # the following code does not work as wanted or expected!
        all_members = list(itertools.chain(*[(ind.m, )
                                             for ind in individuals]))
        log.debug('----evaluation warmup')
        self._get_evaluator().evaluate(all_members)
        log.debug('----warmpup completed')