Source code for EvaluateFitness.EvaluateFitness

 1"""Generic fitness evaluation wrapper.
 2
 3Delegates to a :class:`FitnessEvaluator` strategy for computing fitness
 4from measurement results. Connects the measurement pipeline to the
 5population's fitness slots.
 6"""
 7
 8from abc import ABC
 9from typing import Any, Protocol
10from BitstreamEvolutionProtocols import Fitness, Measurement, Population
11from returns.result import Success # type: ignore
12
[docs] 13class FitnessEvaluator(Protocol): 14 """Strategy protocol for computing fitness from measurement data.""" 15 def start_eval(self) -> None: ... 16 17 def end_eval(self) -> None: ... 18 19 def calculate_success(self, data: Any, index: int, src_pop: str) -> Fitness: ... 20 21 def calculate_error(self, err: Exception, index: int, src_pop: str) -> Fitness: ...
22
[docs] 23class EvaluateFitness: 24 ''' 25 A generic evaluate fitness class that has protocols for defining behavior more simply 26 ''' 27 def __init__(self, evaluator: FitnessEvaluator): 28 self.__evaluator = evaluator 29 30 def evaluate(self, population: Population, measurements: list[Measurement]) -> None: 31 self.__evaluator.start_eval() 32 for i in range(len(measurements)): 33 m = measurements[i] 34 if isinstance(m.result, Success): 35 data = m.result.unwrap() 36 fit = self.__evaluator.calculate_success(data, i, '') 37 population.set_fitness_by_index(i, fit) 38 else: 39 err = m.result.failure() 40 fit = self.__evaluator.calculate_error(err, i, '') 41 population.set_fitness_by_index(i, fit) 42 self.__evaluator.end_eval()