Parallel Evaluation

On linux and macos, it is possible to perform evaluation in parallel, using multiple cores.

To enable such behaviour, you should replace the default SequentialEvaluator with ParallelEvaluator

class geneticengine.evaluation.parallel.ParallelEvaluator

Evaluates individuals in parallel, each time they are needed.

Sub-tree caching

A good way of implementing sub-tree caching is to use a fitness function (separate from methods) that uses @lru_cache. Notice that your dataclasses need the unsafe_hash parameter.