示例#1
0
    def __init__(self,
                 n_inputs: int,
                 instruction_set: Union[InstructionSet, str],
                 literals: Sequence[Any],
                 erc_generators: Sequence[Callable],
                 distribution: DiscreteProbDistrib = "proportional"):
        self.n_inputs = n_inputs
        self.erc_generators = erc_generators

        self.instruction_set = instruction_set
        if self.instruction_set == "core":
            self.instruction_set = InstructionSet(register_core=True)
        self.type_library = self.instruction_set.type_library
        self.literals = [
            lit if isinstance(lit, Literal) else infer_literal(
                lit, self.type_library) for lit in literals
        ]

        if distribution == "proportional":
            self.distribution = (DiscreteProbDistrib().add(
                GeneTypes.INPUT, self.n_inputs).add(
                    GeneTypes.INSTRUCTION, len(self.instruction_set)).add(
                        GeneTypes.CLOSE,
                        sum([
                            i.code_blocks
                            for i in self.instruction_set.values()
                        ])).add(GeneTypes.LITERAL,
                                len(literals)).add(GeneTypes.ERC,
                                                   len(erc_generators)))
        else:
            self.distribution = distribution
示例#2
0
文件: search.py 项目: erp12/Pysh
    def __init__(self,
                 evaluator: Evaluator,
                 spawner: GeneSpawner,
                 selection: Union[Selector, DiscreteProbDistrib, str] = "lexicase",
                 variation: Union[VariationOperator, DiscreteProbDistrib, str] = "umad",
                 population_size: int = 500,
                 max_generations: int = 100,
                 error_threshold: float = 0.0,
                 initial_genome_size: Tuple[int, int] = (10, 50),
                 simplification_steps: int = 2000,
                 verbosity_config: Union[VerbosityConfig, str] = "default",
                 **kwargs):
        self.evaluator = evaluator
        self.spawner = spawner
        self.population_size = population_size
        self.max_generations = max_generations
        self.error_threshold = error_threshold
        self.initial_genome_size = initial_genome_size
        self.simplification_steps = simplification_steps
        self.ext = kwargs

        if isinstance(selection, Selector):
            self._selection = DiscreteProbDistrib().add(selection, 1.0)
        elif isinstance(selection, DiscreteProbDistrib):
            self._selection = selection
        else:
            selector = get_selector(selection, **self.ext)
            self._selection = DiscreteProbDistrib().add(selector, 1.0)

        if isinstance(variation, VariationOperator):
            self._variation = DiscreteProbDistrib().add(variation, 1.0)
        elif isinstance(variation, DiscreteProbDistrib):
            self._variation = variation
        else:
            variationOp = get_variation_operator(variation, **self.ext)
            self._variation = DiscreteProbDistrib().add(variationOp, 1.0)

        if verbosity_config == "default":
            self.verbosity_config = DEFAULT_VERBOSITY_LEVELS[0]
        else:
            self.verbosity_config = verbosity_config
        self.verbosity_config._update_log_level()
示例#3
0
    def __init__(self,
                 signature: ProgramSignature,
                 evaluator: Evaluator,
                 spawner: GeneSpawner,
                 selection: Union[Selector, DiscreteProbDistrib,
                                  str] = "lexicase",
                 variation: Union[VariationOperator, DiscreteProbDistrib,
                                  str] = "umad",
                 population_size: int = 500,
                 max_generations: int = 100,
                 error_threshold: float = 0.0,
                 initial_genome_size: Tuple[int, int] = (10, 50),
                 simplification_steps: int = 2000,
                 parallelism: Union[int, bool] = True,
                 verbose: int = 0,
                 **kwargs):
        self.signature = signature
        self.evaluator = evaluator
        self.spawner = spawner
        self.population_size = population_size
        self.max_generations = max_generations
        self.error_threshold = error_threshold
        self.initial_genome_size = initial_genome_size
        self.simplification_steps = simplification_steps
        self.verbose = verbose
        self.ext = kwargs
        set_verbosity(self.verbose)

        self.parallel_context = None
        if isinstance(parallelism, bool):
            if parallelism:
                self.parallel_context = ParallelContext(spawner, evaluator)
        elif parallelism > 1:
            self.parallel_context = ParallelContext(spawner, evaluator,
                                                    parallelism)

        if isinstance(selection, Selector):
            self.selection = DiscreteProbDistrib().add(selection, 1.0)
        elif isinstance(selection, DiscreteProbDistrib):
            self.selection = selection
        else:
            selector = get_selector(selection, **self.ext)
            self.selection = DiscreteProbDistrib().add(selector, 1.0)

        if isinstance(variation, VariationOperator):
            self.variation = DiscreteProbDistrib().add(variation, 1.0)
        elif isinstance(variation, DiscreteProbDistrib):
            self.variation = variation
        else:
            variation_op = get_variation_operator(variation, **self.ext)
            self.variation = DiscreteProbDistrib().add(variation_op, 1.0)
示例#4
0
    def __init__(self,
                 evaluator: Evaluator,
                 spawner: GeneSpawner,
                 selection: Union[Selector, DiscreteProbDistrib,
                                  str] = "lexicase",
                 variation: Union[VariationOperator, DiscreteProbDistrib,
                                  str] = "umad",
                 population_size: int = 500,
                 max_generations: int = 100,
                 error_threshold: float = 0.0,
                 initial_genome_size: Tuple[int, int] = (10, 50),
                 simplification_steps: int = 2000,
                 verbosity_config: Union[VerbosityConfig, str] = "default",
                 **kwargs):
        self.evaluator = evaluator
        self.spawner = spawner
        self.population_size = population_size
        self.max_generations = max_generations
        self.error_threshold = error_threshold
        self.initial_genome_size = initial_genome_size
        self.simplification_steps = simplification_steps
        self.ext = kwargs

        if isinstance(selection, Selector):
            self._selection = DiscreteProbDistrib().add(selection, 1.0)
        elif isinstance(selection, DiscreteProbDistrib):
            self._selection = selection
        else:
            selector = get_selector(selection, **self.ext)
            self._selection = DiscreteProbDistrib().add(selector, 1.0)

        if isinstance(variation, VariationOperator):
            self._variation = DiscreteProbDistrib().add(variation, 1.0)
        elif isinstance(variation, DiscreteProbDistrib):
            self._variation = variation
        else:
            variationOp = get_variation_operator(variation, **self.ext)
            self._variation = DiscreteProbDistrib().add(variationOp, 1.0)

        if verbosity_config == "default":
            self.verbosity_config = DEFAULT_VERBOSITY_LEVELS[0]
        else:
            self.verbosity_config = verbosity_config
示例#5
0
    def __init__(self,
                 instruction_set: InstructionSet,
                 literals: Sequence[Union[Literal, Any]],
                 erc_generators: Sequence[Callable],
                 distribution: DiscreteProbDistrib = "proportional"):
        self.instruction_set = instruction_set
        self.literals = [
            lit if isinstance(lit, Literal) else Literal(lit)
            for lit in literals
        ]
        self.erc_generators = erc_generators

        if distribution == "proportional":
            self.distribution = (DiscreteProbDistrib().add(
                "instruction", len(instruction_set)).add(
                    "close",
                    sum([i.code_blocks for i in instruction_set.values()
                         ])).add("literal",
                                 len(literals)).add("erc",
                                                    len(erc_generators)))
        else:
            self.distribution = distribution
示例#6
0
class SearchConfiguration:
    """Configuration of an search algorithm.

    @todo change to a PClass

    Parameters
    ----------
    evaluator : Evaluator
        The Evaluator to use when evaluating individuals.
    spawning : GeneSpawner
        The GeneSpawner to use when producing Genomes during initialization and
        variation.
    selection : Union[Selector, DiscreteProbDistrib, str], optional
        A Selector, or DiscreteProbDistrib of selectors, to use when selecting
        parents. The default is lexicase selection.
    variation : Union[VariationOperator, DiscreteProbDistrib, str], optional
        A VariationOperator, or DiscreteProbDistrib of VariationOperators, to
        use during variation. Default is SIZE_NEUTRAL_UMAD.
    population_size : int, optional
        The number of individuals hold in the population each generation. Default
        is 300.
    max_generations : int, optional
        The number of generations to run the search algorithm. Default is 100.
    error_threshold : float, optional
        If the search algorithm finds an Individual with a total error less
        than this values, stop searching. Default is 0.0.
    initial_genome_size : Tuple[int, int], optional
        The range of genome sizes to produce during initialization. Default is
        (20, 100)
    simplification_steps : int, optional
        The number of simplification iterations to apply to the best Push program
        produced by the search algorithm. Default is 2000.
    parallelism : Union[Int, bool], optional
        Set the number of processes to spawn for use when performing embarrassingly
        parallel tasks. If false, no processes will spawn and compuation will be
        serial. Default is true, which spawns one process per available cpu.
    verbosity_config :  Union[VerbosityConfig, str], optional
        A VerbosityConfig controlling what is logged during the search. Default
        is no verbosity.

    """
    def __init__(self,
                 signature: ProgramSignature,
                 evaluator: Evaluator,
                 spawner: GeneSpawner,
                 selection: Union[Selector, DiscreteProbDistrib,
                                  str] = "lexicase",
                 variation: Union[VariationOperator, DiscreteProbDistrib,
                                  str] = "umad",
                 population_size: int = 500,
                 max_generations: int = 100,
                 error_threshold: float = 0.0,
                 initial_genome_size: Tuple[int, int] = (10, 50),
                 simplification_steps: int = 2000,
                 parallelism: Union[int, bool] = True,
                 verbose: int = 0,
                 **kwargs):
        self.signature = signature
        self.evaluator = evaluator
        self.spawner = spawner
        self.population_size = population_size
        self.max_generations = max_generations
        self.error_threshold = error_threshold
        self.initial_genome_size = initial_genome_size
        self.simplification_steps = simplification_steps
        self.verbose = verbose
        self.ext = kwargs
        set_verbosity(self.verbose)

        self.parallel_context = None
        if isinstance(parallelism, bool):
            if parallelism:
                self.parallel_context = ParallelContext(spawner, evaluator)
        elif parallelism > 1:
            self.parallel_context = ParallelContext(spawner, evaluator,
                                                    parallelism)

        if isinstance(selection, Selector):
            self.selection = DiscreteProbDistrib().add(selection, 1.0)
        elif isinstance(selection, DiscreteProbDistrib):
            self.selection = selection
        else:
            selector = get_selector(selection, **self.ext)
            self.selection = DiscreteProbDistrib().add(selector, 1.0)

        if isinstance(variation, VariationOperator):
            self.variation = DiscreteProbDistrib().add(variation, 1.0)
        elif isinstance(variation, DiscreteProbDistrib):
            self.variation = variation
        else:
            variation_op = get_variation_operator(variation, **self.ext)
            self.variation = DiscreteProbDistrib().add(variation_op, 1.0)

    def get_selector(self):
        """Return a Selector."""
        return self.selection.sample()

    def get_variation_op(self):
        """Return a VariationOperator."""
        return self.variation.sample()
示例#7
0
文件: search.py 项目: erp12/Pysh
class SearchConfiguration:
    """Configuration of an search algorithm.

    Parameters
    ----------
    evaluator : Evaluator
        The Evaluator to use when evaluating individuals.
    spawning : GeneSpawner
        The GeneSpawner to use when producing Genomes during initialization and
        variation.
    selection : Union[Selector, DiscreteProbDistrib, str], optional
        A Selector, or DiscreteProbDistrib of selectors, to use when selecting
        parents. The default is lexicase selection.
    variation : Union[VariationOperator, DiscreteProbDistrib, str], optional
        A VariationOperator, or DiscreteProbDistrib of VariationOperators, to
        use during variation. Default is SIZE_NEUTRAL_UMAD.
    population_size : int, optional
        The number of individuals hold in the population each generation. Default
        is 300.
    max_generations : int, optional
        The number of generations to run the search algorithm. Default is 100.
    error_threshold : float, optional
        If the search algorithm finds an Individual with a total error less
        than this values, stop searching. Default is 0.0.
    initial_genome_size : Tuple[int, int], optional
        The range of genome sizes to produce during initialization. Default is
        (20, 100)
    simplification_steps : int, optional
        The number of simplification iterations to apply to the best Push program
        produced by the search algorithm. Default is 2000.
    verbosity_config :  Union[VerbosityConfig, str], optional
        A VerbosityConfig controling what is logged during the search. Default
        is no verbosity.

    """

    def __init__(self,
                 evaluator: Evaluator,
                 spawner: GeneSpawner,
                 selection: Union[Selector, DiscreteProbDistrib, str] = "lexicase",
                 variation: Union[VariationOperator, DiscreteProbDistrib, str] = "umad",
                 population_size: int = 500,
                 max_generations: int = 100,
                 error_threshold: float = 0.0,
                 initial_genome_size: Tuple[int, int] = (10, 50),
                 simplification_steps: int = 2000,
                 verbosity_config: Union[VerbosityConfig, str] = "default",
                 **kwargs):
        self.evaluator = evaluator
        self.spawner = spawner
        self.population_size = population_size
        self.max_generations = max_generations
        self.error_threshold = error_threshold
        self.initial_genome_size = initial_genome_size
        self.simplification_steps = simplification_steps
        self.ext = kwargs

        if isinstance(selection, Selector):
            self._selection = DiscreteProbDistrib().add(selection, 1.0)
        elif isinstance(selection, DiscreteProbDistrib):
            self._selection = selection
        else:
            selector = get_selector(selection, **self.ext)
            self._selection = DiscreteProbDistrib().add(selector, 1.0)

        if isinstance(variation, VariationOperator):
            self._variation = DiscreteProbDistrib().add(variation, 1.0)
        elif isinstance(variation, DiscreteProbDistrib):
            self._variation = variation
        else:
            variationOp = get_variation_operator(variation, **self.ext)
            self._variation = DiscreteProbDistrib().add(variationOp, 1.0)

        if verbosity_config == "default":
            self.verbosity_config = DEFAULT_VERBOSITY_LEVELS[0]
        else:
            self.verbosity_config = verbosity_config
        self.verbosity_config._update_log_level()

    def get_selector(self):
        """Return a Selector."""
        return self._selection.sample()

    def get_variation_op(self):
        """Return a VariationOperator."""
        return self._variation.sample()
示例#8
0
class SearchConfiguration:
    """Configuration of an search algorithm.

    Parameters
    ----------
    evaluator : Evaluator
        The Evaluator to use when evaluating individuals.
    spawning : GeneSpawner
        The GeneSpawner to use when producing Genomes during initialization and
        variation.
    selection : Union[Selector, DiscreteProbDistrib, str], optional
        A Selector, or DiscreteProbDistrib of selectors, to use when selecting
        parents. The default is lexicase selection.
    variation : Union[VariationOperator, DiscreteProbDistrib, str], optional
        A VariationOperator, or DiscreteProbDistrib of VariationOperators, to
        use during variation. Default is SIZE_NEUTRAL_UMAD.
    population_size : int, optional
        The number of individuals hold in the population each generation. Default
        is 300.
    max_generations : int, optional
        The number of generations to run the search algorithm. Default is 100.
    error_threshold : float, optional
        If the search algorithm finds an Individual with a total error less
        than this values, stop searching. Default is 0.0.
    initial_genome_size : Tuple[int, int], optional
        The range of genome sizes to produce during initialization. Default is
        (20, 100)
    simplification_steps : int, optional
        The number of simplification iterations to apply to the best Push program
        produced by the search algorithm. Default is 2000.
    verbosity_config :  Union[VerbosityConfig, str], optional
        A VerbosityConfig controling what is logged during the search. Default
        is no verbosity.

    """
    def __init__(self,
                 evaluator: Evaluator,
                 spawner: GeneSpawner,
                 selection: Union[Selector, DiscreteProbDistrib,
                                  str] = "lexicase",
                 variation: Union[VariationOperator, DiscreteProbDistrib,
                                  str] = "umad",
                 population_size: int = 500,
                 max_generations: int = 100,
                 error_threshold: float = 0.0,
                 initial_genome_size: Tuple[int, int] = (10, 50),
                 simplification_steps: int = 2000,
                 verbosity_config: Union[VerbosityConfig, str] = "default",
                 **kwargs):
        self.evaluator = evaluator
        self.spawner = spawner
        self.population_size = population_size
        self.max_generations = max_generations
        self.error_threshold = error_threshold
        self.initial_genome_size = initial_genome_size
        self.simplification_steps = simplification_steps
        self.ext = kwargs

        if isinstance(selection, Selector):
            self._selection = DiscreteProbDistrib().add(selection, 1.0)
        elif isinstance(selection, DiscreteProbDistrib):
            self._selection = selection
        else:
            selector = get_selector(selection, **self.ext)
            self._selection = DiscreteProbDistrib().add(selector, 1.0)

        if isinstance(variation, VariationOperator):
            self._variation = DiscreteProbDistrib().add(variation, 1.0)
        elif isinstance(variation, DiscreteProbDistrib):
            self._variation = variation
        else:
            variationOp = get_variation_operator(variation, **self.ext)
            self._variation = DiscreteProbDistrib().add(variationOp, 1.0)

        if verbosity_config == "default":
            self.verbosity_config = DEFAULT_VERBOSITY_LEVELS[0]
        else:
            self.verbosity_config = verbosity_config

    def get_selector(self):
        """Return a Selector."""
        return self._selection.sample()

    def get_variation_op(self):
        """Return a VariationOperator."""
        return self._variation.sample()