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()