evokit.evolvables package
Submodules
evokit.evolvables.algorithms module
- class evokit.evolvables.algorithms.HomogeneousAlgorithm[source]
Bases:
Algorithm,ABC,Generic[T]An algorithm with one population. Exists primarily for typing purposes.
Algorithms that use one homogeneous population should derive this class.
- step()
- class evokit.evolvables.algorithms.SimpleLinearAlgorithm[source]
Bases:
HomogeneousAlgorithm[T]A very simple evolutionary algorithm.
An evolutionary algorithm that maintains one population and performs one round of selection in each step.
- Each step includes the following operations:
evaluate
populationevent:
POST_VARIATION- select from
population update
populationwith result
- select from
event:
POST_EVALUATION- vary
population update
populationwith result
- vary
event:
POST_SELECTION
- __init__(population: Population[T], evaluator: Evaluator[T], selector: Selector[T], variator: Variator[T]) None[source]
- events: list[str] = ['POST_VARIATION', 'POST_EVALUATION', 'POST_SELECTION']
- class evokit.evolvables.algorithms.LinearAlgorithm[source]
Bases:
HomogeneousAlgorithm[T]A general evolutionary algorithm [SIMPLE_GA].
An evolutionary algorithm that maintains one population. Each step includes two rounds of selection.
- Each step includes the following operations:
evaluate
populationevent:
POST_PARENT_EVALUATION- select parents from
population update
populationwith result
- select parents from
event:
POST_PARENT_SELECTIONvary
populationevent:
POST_VARIATIONevaluate
populationevent:
POST_OFFSPRING_EVALUATION- select survivors from
population update
populationwith result
- select survivors from
event:
POST_OFFSPRING_SELECTION
[SIMPLE_GA]Introduction to Evolutionary Computing [2nd ed.], A. E. Eiben and J. E. Smith (2015), Fig 3.1
- __init__(population: Population[T], parent_evaluator: Evaluator[T], parent_selector: Selector[T], variator: Variator[T], survivor_evaluator: Evaluator[T], survivor_selector: Selector[T]) None[source]
- events: list[str] = ['POST_PARENT_EVALUATION', 'POST_PARENT_SELECTION', 'POST_VARIATION', 'POST_OFFSPRING_EVALUATION', 'POST_OFFSPRING_SELECTION']
- class evokit.evolvables.algorithms.CanonicalGeneticAlgorithm[source]
Bases:
HomogeneousAlgorithm[T]The canonical genetic algorithm [CANON_GA].
An evolutionary algorithm that consecutively apply two variators. In Holland’s foundational algorithm, these are crossover followed by mutation.
- Each step includes the following operations:
vary
populationwithvariator1event:
POST_VARIATION_1vary
populationwithvariator2event:
POST_VARIATION_2evaluate
populationevent:
POST_EVALUATION- select survivors from
population update
populationwith result
- select survivors from
event:
POST_SELECTION
[CANON_GA]Adaptation in Natural and Artificial Systems, Holland (1975)
- __init__(population: Population[T], evaluator: Evaluator[T], selector: Selector[T], variator1: Variator[T], variator2: Variator[T]) None[source]
- events: list[str] = ['POST_VARIATION_1', 'POST_VARIATION_2', 'POST_EVALUATION', 'POST_SELECTION']
evokit.evolvables.binstring module
- class evokit.evolvables.binstring.BinaryString[source]
Bases:
Individual[int]A string of bits.
Tutorial: Getting Started with OneMax.
- __init__(value: int, size: int) None[source]
- Parameters:
value – Integer whose binary representation is used.
size – Length of the binary string
- static random(size: int) BinaryString[source]
Return a random binary string.
Each item in the returned value may be either 1 or 0 with equal probability.
- Parameters:
size – Size of the generated binary string.
- copy() Self[source]
Return a copy of this object.
Operations performed on the returned value do not affect this object.
- get(pos: int) Literal[1] | Literal[0][source]
Return the bit at position
pos.- Parameters:
pos – Position of the returned bit value.
- Raises:
IndexError – If
posis out of range.`
- set(pos: int) None[source]
Set the bit at position
posto 0.- Parameters:
pos – Position of the bit value to set.
- Effect:
Change
genome.
- Raises:
IndexError – If
posis out of range.`
- clear(pos: int) None[source]
Set the bit at position
posto 0.- Parameters:
pos – Position of the bit value to clear.
- Effect:
Change
genome.
- Raises:
IndexError – If
posis out of range.`
- flip(pos: int) None[source]
Flip the bit at position
pos.- Parameters:
pos – Position of the bit value to flip.
- Effect:
Change
genome.
- Raises:
IndexError – If
posis outside of range.
- classmethod from_bit_list(bit_list: list[int]) BinaryString[source]
Return a
BinaryStringwhosegenomeis the value of bit_list parsed as binary.- Parameters:
bit_list – A string of values
0or1.- Warns:
For efficiency, this method does not check if each item in
:arg:`bit_list` is one of ``1`` and ``0``.
Effectively, even numbers will be treated as ``1``s whereas
odd numbers will be treated as ``0``s.
- class evokit.evolvables.binstring.CountBits[source]
Bases:
Evaluator[BinaryString]Count the number of
1s.Evaluator for
BinaryString. For each1in the binary string, incur a reward of 1.- evaluate(individual: BinaryString) tuple[float][source]
- class evokit.evolvables.binstring.MutateBits[source]
Bases:
Variator[BinaryString]Randomly flip each bit in the parent.
1-to-1 variator for
BinaryString. At each bit in the parent, flip it with probabilitymutation_rate`.- __init__(mutation_rate: float, *, processes: int | ProcessPoolExecutor | None = None, share_self: bool = False)[source]
- Parameters:
mutation_rate – Probability to flip each bit in the parent.
- Raises:
ValueError – If
mutation_rateis not in range[0,1].
- vary(parents: Sequence[BinaryString]) tuple[BinaryString, ...][source]
- class evokit.evolvables.binstring.OnePointCrossover[source]
Bases:
Variator[BinaryString]Split and recombine parents.
2-to-1 variator for
BinaryString. Split parents at position k, then interleave the segments.- __init__(crossover_probability: float)[source]
- Arg:
crossover_probability: Probability that crossover is performed.
- vary(parents: Sequence[BinaryString]) tuple[BinaryString, ...][source]
- evokit.evolvables.binstring.trial_run() list[BinaryString][source]
evokit.evolvables.funcs module
This module contains a small set of protected functions.
evokit.evolvables.gp module
- class evokit.evolvables.gp.Expression[source]
Bases:
Generic[T]A node in an expression tree.
Recursive data structure that implements program trees. An
Expressionis also aCallablethat only accepts arguments passed by position.The attribute
value- __init__(arity: int, value: T | Callable[..., T] | Symbol, children: list[Expression[T]], factory: ExpressionFactory[T] | None = None)[source]
- arity: int
Arity of the expression node.
- children
Children of the expression node.
- property factory: ExpressionFactory[T]
The
ExpressionFactory, if any, that built this object.The
ExpressionFactorymaintains hyperparameters that instruct the construction of this object.
- __call__(*args: T) T[source]
Evaluate the expression tree with arguments.
Recursively evaluate expression nodes in
children. Then, applyvalueto the results, in the same order as thechildrenthey are resolved from.- Parameters:
*args – Arguments to the program.
- copy() Self[source]
Return a deep copy.
Call the python:copy(self, …): method on
value, each item inchildren, andvalue(ifvalueimplements a method namedcopy). Use the results to create a newExpression
- nodes() tuple[Expression[T], ...][source]
Return a flat list view of all nodes and subnodes.
Note that operations performed on items in the returned list affect the original objects.
- class evokit.evolvables.gp.Symbol[source]
Bases:
objectDummy object used by
ExpressionFactory.- See:
??? TODO
- pos: int
- class evokit.evolvables.gp.ExpressionFactory[source]
Bases:
Generic[T]Factory class for
Expression.Build
Expressioninstances with supplied hyperparameters. Register the factory itself with each expression built by settingExpression.factory.Please see
evolvables.funcsfor a set of primitives, or define custom functions.Note
If
arity = 0, thenprimitivesmust include at least one literal. Otherwise, the tree cannot be built, as no terminal node can be drawn.- __init__(primitives: tuple[T | Callable[..., T], ...], arity: int)[source]
- Parameters:
primitives – instructions and terminals that occupy nodes of the
its (expression tree. Listing a primitive more than once increases)
selected. (chance of being)
arity – arity of constructed
Expressioninstances.
- Raises:
ValueError if arity=0 and primitives does not contain –
nullary values. The tree cannot be built without terminals. –
- build(node_budget: int, layer_budget: int, nullary_ratio: float | None = None) Expression[T][source]
Build an expression tree to specifications.
The parameters
node_budgetandlayer_budgetare no constraints. Rather, if the tree exceeds these budgets, then only nullary values can be drawn. This ensures that the tree does not exceed these budgets by too much.Costs are incurred after a batch nodes are drawn.
- Parameters:
node_budget – Total number of nodes in the tree.
layer_budget – Depth of the tree.
nullary_ratio – Probability of drawing a nullary node.
- Raises:
ValueError` if nullary_ratio is not in range [0...1] –
- draw_primitive(nullary_ratio: float | None = None, free_draw: bool = False) T | Callable[..., T] | Symbol[source]
Return an item from
primitive_pool- Parameters:
nullary_ratio – probability of drawing terminals. If set, non-terminals are drawn with probability (
1-nullary_ratio).free_draw – if
True, then the call does not affect or respect constraints on node counts. For example, it can still draw non-terminal nodes, even while exceeding node count and depth constraints.
- class evokit.evolvables.gp.Program[source]
Bases:
Individual[Expression[T]]A tree-based genetic program.
Tutorial: Symbolic Regression with Genetic Programming.
- __init__(expr: Expression[T])[source]
- class evokit.evolvables.gp.ProgramFactory[source]
Bases:
Generic[T]Convenience factory class for
Program.Contain an :class`ExpressionFactory` instance. Delete storage of hyperparameters and
ProgramFactory.build()to the internal :class`ExpressionFactory`.
- class evokit.evolvables.gp.CrossoverSubtree[source]
-
Crossover operator that randomly exchange subtrees of parents.
Select an internal node from each parent. Then, select one child of each internal node and exchange these child nodes. Doing so also exchanges subtrees that begin at these child nodes.
- class evokit.evolvables.gp.MutateNode[source]
-
Mutator that changes the primitive in a uniformly random node to a uniformly selected primitive of the same arity.
- class evokit.evolvables.gp.MutateSubtree[source]
-
Mutation operator that randomly mutates subtrees.
Uniformly select an internal node, then uniformly select a child of that node. Replace that child with a subtree, constructed by calling
ExpressionFactory.build()of the associatedExpressionFactoryfound inExpression.factory.
- class evokit.evolvables.gp.SymbolicEvaluator[source]
Bases:
Evaluator[Program[float]]Evaluator for symbolic regression.
Compare the output of a program tree against a given objective function, over a fixed set of points. Assign higher fitness to programs whose output is closer to that of the objective function.
- __init__(objective: Callable[..., float], support: tuple[tuple[float, ...], ...])[source]
- Parameters:
objective – function that
support – collection of points on which the program
objective. (is compared against)
- Raises:
TypeError if the first item in support does not –
match the arity of objective. –
- class evokit.evolvables.gp.PenaliseNodeCount[source]
Bases:
Evaluator[Program[float]]Evaluator that favours smaller program trees.
For each node in the given program tree, incur a penalty of
coefficient.
evokit.evolvables.gp_visualiser module
- evokit.evolvables.gp_visualiser.ident = 0
Global counter of the number of dispatched identifiers.
- evokit.evolvables.gp_visualiser.p2dot(gp: ~evokit.evolvables.gp.Program[~typing.Any], dispatcher: ~typing.Callable[[], str] = <function _dispatch_ident>) Digraph[source]
Visualise a tree-based genetic program.
Return a
graphviz.Digraphthat represents the given tree-based genetic program.- Parameters:
gp – Genetic program to visualise.
dispatcher –
Callablethat should return a uniquecalled. (identifier when)
evokit.evolvables.lgp module
- class evokit.evolvables.lgp.StructureType[source]
Bases:
ABCBase class for all structure scopes.
Control structures consist of a
StructureTypeand aStructureScope. TheStructureTypedecides how the structure is executed: for example, whether it is an if statement (If), a for loop (For), or a while loop (While).Derive this class to create custom structure scopes.
- abstract __call__(lgp: LinearProgram, instructions: Sequence[Instruction]) None[source]
Invoke instructions in the context of a linear program.
- Parameters:
lgp – Context of execution.
instructions – Instructions to execute.
- class evokit.evolvables.lgp.StructureScope[source]
Bases:
ABC,InstructionBase class for all structure scopes.
Control structures consist of a
StructureTypeand aStructureScope. TheStructureScopedecides how many lines following the current line become part of the structure.Derive this class to create custom structure types.
- abstract __init__(stype: StructureType, *args: Any, **kwargs: Any) None[source]
- Parameters:
stype – Type of the control structure.
- class evokit.evolvables.lgp.StructOverLines[source]
Bases:
StructureScopeControl structure that spans multiple lines.
- __init__(stype: StructureType, line_count: int) None[source]
- Parameters:
stype – Type of the control structure.
line_count – Number of lines that the control structure spans.
- class evokit.evolvables.lgp.StructUntilLabel[source]
Bases:
StructureScopeControl structure that extends to the given label.
- __init__(stype: StructureType, label: str)[source]
- Parameters:
stype – Type of the control structure.
label – Text of label that terminates this control structure.
- class evokit.evolvables.lgp.StructNextLine[source]
Bases:
StructureScopeControl structure that spans one line.
- __init__(stype: StructureType)[source]
- Parameters:
stype – Type of the control structure.
- class evokit.evolvables.lgp.Label[source]
Bases:
objectText label.
Use with
StructUntilLabel.
- class evokit.evolvables.lgp.For[source]
Bases:
StructureTypeSimple “for” loop.
A control structure with this type repeats its body for
counttimes.
- class evokit.evolvables.lgp.While[source]
Bases:
StructureTypeWhile loop.
A control structure with this type repeats its body until
conditionalis satisfied.Warning
This control structure may execute indefinitely. To prevent this, the class variable
loop_capimposes a bound to how many times a while loop may be repeated for.
- class evokit.evolvables.lgp.If[source]
Bases:
StructureTypeStructure with conditional execution.
A control structure with this type executes once if
conditionalis satisfied. Otherwise, the structure is skipped and does nothing.
- class evokit.evolvables.lgp.ValueRange[source]
Bases:
objectValueRange(min: ‘float’, max: ‘float’)
- min: float
- max: float
- __init__(min: float, max: float) None
- class evokit.evolvables.lgp.StateVectorType[source]
Bases:
EnumType of a state vector.
A linear program stores three state vectors: the input vector
LinearProgram.inputs, the mutable registerLinearProgram.registers, and the constant registerLinearProgram.constants,- input = 1
- register = 2
- constant = 3
- evokit.evolvables.lgp.CellSpecifier
Tuple that locates an item in a state vector. The first item (
StateVectorType) specifies the state vector, thenthe second item (
int) gives the index.alias of
tuple[StateVectorType,Annotated[int]]
- class evokit.evolvables.lgp.Operation[source]
Bases:
InstructionAlgebraic operation.
Call
functionwithargsas arguments. Assign the result to the register at positiontarget.The argument
operandscan index constants and registers. Registers start at index 0; constants are represented as negative numbers starting at index -1. SeeLinearProgramfor the source of this behaviour.- __init__(function: Callable[[...], float], target: int, operands: tuple[tuple[StateVectorType, int], ...])[source]
- Parameters:
function – Function to apply to
operands.target – Register to deposit the result to.
operands – Arguments to
function.
- class evokit.evolvables.lgp.Condition[source]
Bases:
objectBase class for predicates, or conditions.
Conditions are used by conditional control structures, such as
IfandWhile.
- class evokit.evolvables.lgp.LinearProgram[source]
Bases:
objectContext for executing linear programs.
A
LinearProgramstores states (such as registers and constants) of the program.- __init__(registers: Iterable[float], constants: Iterable[float], inputs: Iterable[float])[source]
- Parameters:
coarity – Size of the output vector, taken from the end of the register vector.
inputs – Input registers.
input_can_change – If True, then append
inputsto the register vector. Otherwise, appendinputsto the constant vector.initialiser – Initialiser for the register vector. Can be one of: * a number, which populates each register; * a sequence of numbers, which is converted to the register; or * a nullary function, whose return value populates each register.
reg_length – Length of the register vector. If
initialiseris a sequence, then its length must matchs.constants – The constant vector.
Note
Both constants and registers are indexed by integers.
Indices for registers begin at 0. Examples: 0, 1, 2, …
Indices for constants begin at -1. Examples: -1, -2, -3, …
- registers: ndarray[Any, dtype[float64]]
The register vector stores mutable state variables. Set with
set_register().
- constants: ndarray[Any, dtype[float64]]
The constant vector stores immutable state variables. Set with
set_constants().
- get_state_vector(celltype: StateVectorType) ndarray[Any, dtype[float64]][source]
Return the state vector specified by
cellspec.
- run(instructions: Sequence[Instruction]) None[source]
Execute
instructionsin this context.- Effect:
Instructions, for example
Operations, may alter the state of this context.
- run_instruction(instruction: Instruction, instructions: Sequence[Instruction], pos: int) int[source]
Execute an instruction.
Execute the instruction
instructionin sequenceinstructionsat positionpos.Return the number of lines advanced as a result. Running a single operation advances the execution pointer by 1; running control structures may skip more lines.
- Arg:
instruction: Instruction to run. instructions: Sequence of instruction to run
instructionin. pos: Position of current execution pointer.
evokit.evolvables.selectors module
- class evokit.evolvables.selectors.NullSelector[source]
Bases:
Selector[D]Selector that does nothing.
- select_population(from_population: Population[D]) Population[D][source]
Return all items in
from_populationin new population.
- class evokit.evolvables.selectors.TruncationSelector[source]
Bases:
Selector[D]Simple selector that select individuals with highest fitness.
- select_population(from_population: Population[D]) Population[D][source]
- class evokit.evolvables.selectors.TournamentSelector[source]
Bases:
Selector[D]Tournament selector:
From the population, select uniform sample of size
bracket_size.Iterate through the sample, stop when a selection is made. At index
i, select that item with probability \(p * (1- p)^i\). If no selection is made when reaching the end of the sample, select the last item.Repeat until
budgetitems are selected.
- evokit.evolvables.selectors.Elitist(sel: Selector[D]) Selector[D][source]
Decorator that adds elitism to a selector.
Retain and update the highest-fitness individual encountered so far. Each time the selector is called, append that individual to the end of the output population.
Modify select_population of sel to use elitism. If sel already overrides select_population, that implementation is destroyed.
- Parameters:
sel – A selector
- Returns:
A selector