Beispiel #1
0
    def run(self) -> List[Individual]:
        gen = 0
        while self.budget_manager.is_budget_available():
            logger.log_progress(
                f"\n---> Starting generation {str(gen)} "
                f"at {str(self.budget_manager.get_time_budget_used())}")

            new_individuals = self.population_generator.generate(
                self.sampling_size, gen=gen)
            if new_individuals is None:
                # Timeout occurred
                break

            success = self.parallel_evaluator.evaluate(new_individuals)
            if not success:
                # Timeout occurred
                break

            # update logbook
            self.parallel_evaluator.test_suite_evaluator.update_logbook(
                gen, new_individuals)
            history = RequiredFeature('history').request()
            history.update(self.population)

            # select best individuals between current population and new one
            self.population[:] = self.toolbox.selectBest(
                self.population + new_individuals, self.population_size)
            gen += 1

        return self.population
    def set_empty_fitness(self, individual: IndividualMultiObjective) -> None:
        individual.fitness.values = (0, sys.maxsize, 0)

        individual.evaluation_finish_timestamp = time.time()
        individual.evaluation_elapsed_time = 0

        hall_of_fame = RequiredFeature('hall_of_fame').request()
        hall_of_fame.update([individual])
    def evaluate(
            self, device: Device,
            individual: IndividualMultiObjective) -> IndividualMultiObjective:
        assert not individual.fitness.valid

        coverage_fetcher = RequiredFeature('coverage_fetcher').request()

        start_time = time.time()
        device.mark_work_start()
        script_path, suite_lengths = self.dump_individual_to_files(individual)

        coverage, unique_crashes, scripts_crash_status = coverage_fetcher.get_suite_coverage(
            script_path, device, individual.generation,
            individual.index_in_generation)

        # remove from suite lengths the scripts that did NOT cause a crash
        for script, had_crash in scripts_crash_status.items():
            if not had_crash:
                suite_lengths.pop(script, None)

        # 1st obj: coverage, 2nd: average seq length of the suite, 3rd: #crashes
        if suite_lengths:
            length = numpy.mean(list(suite_lengths.values()))
        else:
            length = sys.maxsize

        crashes = len(unique_crashes)

        individual.fitness.values = (coverage, length, crashes)

        finish_time = time.time()
        individual.evaluation_finish_timestamp = finish_time
        individual.evaluation_elapsed_time = finish_time - start_time

        individual.length = length
        individual.crashes = crashes

        hall_of_fame = RequiredFeature('hall_of_fame').request()
        hall_of_fame.update([individual])

        budget_manager = RequiredFeature('budget_manager').request()
        budget_manager.increase_evaluations_used()

        device.mark_work_stop()

        return individual
    def evaluate(
            self, device: Device, individual: IndividualSingleObjective
    ) -> IndividualSingleObjective:
        assert not individual.fitness.valid

        coverage_fetcher = RequiredFeature('coverage_fetcher').request()

        start_time = time.time()
        device.mark_work_start()
        script_path, suite_lengths = self.dump_individual_to_files(individual)
        coverage, unique_crashes, scripts_crash_status = coverage_fetcher.get_suite_coverage(
            script_path, device, individual.generation,
            individual.index_in_generation)

        # remove from suite lengths the scripts that did NOT cause a crash
        for script, had_crash in scripts_crash_status.items():
            if not had_crash:
                suite_lengths.pop(script, None)

        individual.fitness.values = (coverage, )

        finish_time = time.time()
        individual.evaluation_finish_timestamp = finish_time
        individual.evaluation_elapsed_time = finish_time - start_time

        # Save crashes and length info outside fitness, to avoid messing up with the "wvalues" and "dominates" function
        # inside Deap's Fitness base class.
        if suite_lengths:
            individual.length = numpy.mean(list(suite_lengths.values()))
        else:
            individual.length = sys.maxsize

        individual.crashes = len(unique_crashes)

        hall_of_fame = RequiredFeature('hall_of_fame').request()
        hall_of_fame.update([individual])

        budget_manager = RequiredFeature('budget_manager').request()
        budget_manager.increase_evaluations_used()

        device.mark_work_stop()

        return individual
    def initPopulation(self) -> bool:
        verbose_level: bool = RequiredFeature('verbose_level').request()

        if verbose_level > 0:
            logger.log_progress(
                f"\n---> Starting to generate initial population "
                f"at {str(self.budget_manager.get_time_budget_used())}")

        self.population = self.population_generator.generate(
            self.population_size, gen=0)
        if self.population is None or len(
                self.population) < self.population_size:
            logger.log_progress(
                "\nFailed to initialise population with proper size, exiting setup"
            )
            return False

        if verbose_level > 0:
            logger.log_progress(
                f"\n---> Starting to evaluate initial population "
                f"at {str(self.budget_manager.get_time_budget_used())}")

        success = self.parallel_evaluator.evaluate(self.population)

        if not success:
            logger.log_progress(
                "\nBudget ran out during parallel evaluation, exiting setup")
            return False

        self.parallel_evaluator.test_suite_evaluator.update_logbook(
            0, self.population)

        history = RequiredFeature('history').request()
        history.update(self.population)

        if verbose_level > 0:
            logger.log_progress(
                f"\n---> Finished creating initial population "
                f"at {str(self.budget_manager.get_time_budget_used())}")

        return True