evolib 0.2.0b2.dev5__tar.gz → 0.2.0b2.dev7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {evolib-0.2.0b2.dev5/evolib.egg-info → evolib-0.2.0b2.dev7}/PKG-INFO +3 -3
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/README.md +2 -2
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/api.py +4 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/config/schema.py +29 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/individual.py +3 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/population.py +29 -12
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/evonet_initializers.py +50 -1
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/registry.py +2 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/io/checkpoint.py +8 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/utils/benchmarks.py +99 -1
- evolib-0.2.0b2.dev7/evolib/utils/parallel.py +100 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7/evolib.egg-info}/PKG-INFO +3 -3
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib.egg-info/SOURCES.txt +8 -1
- evolib-0.2.0b2.dev7/examples/07_evonet/00_identity_test.py +63 -0
- evolib-0.2.0b2.dev7/examples/07_evonet/05_recurrent_timeseries.py +176 -0
- evolib-0.2.0b2.dev7/examples/07_evonet/06_recurrent_indicator.py +198 -0
- evolib-0.2.0b2.dev7/examples/07_evonet/06_recurrent_indicator_01.py +181 -0
- evolib-0.2.0b2.dev7/examples/07_evonet/06_recurrent_indicator_02.py +198 -0
- evolib-0.2.0b2.dev7/examples/07_evonet/06_recurrent_trading.py +241 -0
- evolib-0.2.0b2.dev7/examples/07_evonet/07_recurrent_trading_01.py +232 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/pyproject.toml +1 -1
- evolib-0.2.0b2.dev5/examples/07_evonet/resize_all_images.py +0 -28
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/LICENSE +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/MANIFEST.in +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_core_individual.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_core_population.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_operators_crossover.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_operators_evonet_structural_mutation.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_operators_mutation.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_operators_replacement.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_operators_reproduction.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_operators_selection.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_operators_strategy.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_public_api.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_representation_evonet.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_representation_netvector.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_representation_vector.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_utils_benchmarks.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_utils_history_logger.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_utils_loss_functions.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/api_utils_plotting.rst +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/conf.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/config_guide.md +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/config_parameter.md +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/getting_started.md +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/docs/index.md +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/PIL/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/_typeshed/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/annotated_types/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/asyncio/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/collections/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/concurrent/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/concurrent/futures/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/ctypes/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/cycler/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/email/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/evolib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/evolib/config/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/evolib/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/evolib/globals/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/evolib/initializers/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/evolib/interfaces/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/evolib/operators/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/evolib/registry/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/evolib/representation/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/evolib/utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/html/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/importlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/importlib/metadata/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/importlib/resources/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/jinja2/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/json/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/logging/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/markdown_it/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/markdown_it/common/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/markdown_it/helpers/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/markdown_it/presets/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/markdown_it/rules_block/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/markdown_it/rules_core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/markdown_it/rules_inline/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/markupsafe/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/matplotlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/matplotlib/_api/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/matplotlib/axes/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/matplotlib/backends/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/matplotlib/projections/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/matplotlib/style/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/matplotlib/tri/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/mdurl/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/multiprocessing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/_core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/_typing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/_utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/char/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/f2py/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/fft/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/lib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/linalg/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/ma/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/matrixlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/polynomial/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/random/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/rec/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/strings/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/testing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/testing/_private/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/numpy/typing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/os/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/packaging/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/pydantic/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/pydantic/_internal/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/pydantic/deprecated/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/pydantic/plugin/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/pydantic/v1/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/pydantic_core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/pyexpat/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/pyparsing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/pyparsing/diagram/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/rich/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/sys/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/typing_inspection/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/unittest/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/urllib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/xml/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/xml/etree/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/xml/parsers/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/xml/parsers/expat/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/yaml/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/zipfile/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/zipfile/_path/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/3.12/zoneinfo/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/.mypy_cache/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/config/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/config/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/config/base_component_config.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/config/component_registry.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/config/evonet_component_config.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/config/vector_component_config.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/PIL/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/_typeshed/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/asyncio/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/collections/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/concurrent/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/concurrent/futures/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/ctypes/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/cycler/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/email/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/evolib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/evolib/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/evolib/globals/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/evolib/interfaces/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/evolib/operators/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/evolib/utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/html/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/importlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/importlib/metadata/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/importlib/resources/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/jinja2/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/json/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/logging/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/markupsafe/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/matplotlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/matplotlib/_api/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/matplotlib/axes/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/matplotlib/backends/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/matplotlib/projections/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/matplotlib/style/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/matplotlib/tri/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/multiprocessing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/_core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/_typing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/_utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/char/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/f2py/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/fft/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/lib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/linalg/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/ma/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/matrixlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/polynomial/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/random/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/rec/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/strings/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/testing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/testing/_private/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/numpy/typing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/os/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/packaging/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/pyexpat/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/pyparsing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/pyparsing/diagram/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/sys/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/unittest/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/urllib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/xml/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/xml/etree/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/xml/parsers/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/xml/parsers/expat/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/yaml/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/zipfile/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/3.12/zipfile/_path/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/.mypy_cache/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/README.md +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/core/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/globals/README.md +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/globals/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/globals/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/globals/numeric.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/PIL/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/_typeshed/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/asyncio/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/collections/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/concurrent/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/concurrent/futures/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/ctypes/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/cycler/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/email/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/evolib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/evolib/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/evolib/globals/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/evolib/initializers/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/evolib/interfaces/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/evolib/operators/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/evolib/utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/html/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/importlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/importlib/metadata/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/importlib/resources/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/jinja2/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/json/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/logging/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/markupsafe/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/matplotlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/matplotlib/_api/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/matplotlib/axes/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/matplotlib/backends/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/matplotlib/projections/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/matplotlib/style/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/matplotlib/tri/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/multiprocessing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/_core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/_typing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/_utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/char/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/f2py/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/fft/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/lib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/linalg/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/ma/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/matrixlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/polynomial/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/random/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/rec/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/strings/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/testing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/testing/_private/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/numpy/typing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/os/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/packaging/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/pyexpat/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/pyparsing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/pyparsing/diagram/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/sys/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/unittest/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/urllib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/xml/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/xml/etree/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/xml/parsers/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/xml/parsers/expat/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/yaml/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/zipfile/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/3.12/zipfile/_path/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/.mypy_cache/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/net_initializers.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/initializers/vector_initializers.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/interfaces/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/interfaces/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/interfaces/enum_helpers.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/interfaces/enums.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/interfaces/structs.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/interfaces/types.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/io/serialization.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/operators/README.md +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/operators/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/operators/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/operators/crossover.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/operators/evonet_structural_mutation.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/operators/mutation.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/operators/replacement.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/operators/reproduction.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/operators/selection.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/operators/strategy.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/registry/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/registry/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/registry/replacement_registry.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/registry/selection_registry.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/registry/strategy_registry.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/PIL/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/_typeshed/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/annotated_types/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/asyncio/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/collections/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/concurrent/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/concurrent/futures/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/ctypes/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/cycler/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/email/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/evolib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/evolib/config/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/evolib/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/evolib/globals/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/evolib/initializers/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/evolib/interfaces/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/evolib/operators/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/evolib/registry/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/evolib/representation/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/evolib/utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/html/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/importlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/importlib/metadata/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/importlib/resources/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/jinja2/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/json/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/logging/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/markdown_it/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/markdown_it/common/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/markdown_it/helpers/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/markdown_it/presets/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/markdown_it/rules_block/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/markdown_it/rules_core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/markdown_it/rules_inline/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/markupsafe/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/matplotlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/matplotlib/_api/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/matplotlib/axes/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/matplotlib/backends/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/matplotlib/projections/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/matplotlib/style/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/matplotlib/tri/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/mdurl/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/multiprocessing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/_core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/_typing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/_utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/char/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/f2py/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/fft/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/lib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/linalg/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/ma/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/matrixlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/polynomial/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/random/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/rec/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/strings/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/testing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/testing/_private/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/numpy/typing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/os/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/packaging/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/pydantic/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/pydantic/_internal/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/pydantic/deprecated/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/pydantic/plugin/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/pydantic/v1/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/pydantic_core/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/pyexpat/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/pyparsing/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/pyparsing/diagram/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/rich/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/sys/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/typing_inspection/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/unittest/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/urllib/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/xml/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/xml/etree/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/xml/parsers/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/xml/parsers/expat/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/yaml/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/zipfile/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/zipfile/_path/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/3.12/zoneinfo/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/.mypy_cache/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/_apply_config_mapping.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/base.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/composite.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/dummy.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/evo_params.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/evonet.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/netvector.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/representation/vector.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/utils/README.md +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/utils/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/utils/config_loader.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/utils/fitness.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/utils/history_logger.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/utils/loss_functions.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/utils/plotting.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/utils/random.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib/utils/registry.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib.egg-info/dependency_links.txt +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib.egg-info/requires.txt +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/evolib.egg-info/top_level.txt +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/01_basic_usage/01_getting_started.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/01_basic_usage/02_mutation.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/01_basic_usage/03_population_mutation.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/01_basic_usage/04_fitness.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/02_strategies/01_step_by_step_evolution.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/02_strategies/02_mu_lambda_step.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/02_strategies/03_mu_lambda.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/02_strategies/04_flexible.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/03_comparisons/01_history.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/03_comparisons/02_plotting.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/03_comparisons/03_compare_runs.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/03_comparisons/04_exponential_decay_vs_static.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/03_comparisons/05_adaptive_global_vs_static.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/03_comparisons/06_adaptive_individual_vs_static.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/03_comparisons/07_selection_comparison.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/03_comparisons/08_selection_pressure.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/03_comparisons/09_selection_vs_mutation_pressure.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/03_comparisons/10_selection_stochastic_vs_deterministic.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/03_comparisons/11_crossover_comparison.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/04_function_approximation/01_polynomial_sine.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/04_function_approximation/02_sine_point_approximation.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/04_function_approximation/03_approximation_with_noise.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/05_advanced_topics/01_fitness_landscape_exploration.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/05_advanced_topics/02_rosenbrock_surface_path.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/05_advanced_topics/03_vector_control.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/05_advanced_topics/04_vector_control_with_obstacles.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/05_advanced_topics/05_piecewise_linear_xsys.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/05_advanced_topics/06_evolving_mutation_strength_as_a_module.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/06_netvector/01_netvector_sine_approximation.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/06_netvector/02_netvector_modulated_output.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/06_netvector/03_netvector_gain_and_bias.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/07_evonet/01_sine_approximation.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/07_evonet/02_image_approximation.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/07_evonet/03_structural_xor.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/examples/07_evonet/04_recurrent_bit_prediction.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/setup.cfg +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/tests/test_benchmarks.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/tests/test_config_loader.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/tests/test_elitism_preserves_best_fitness.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/tests/test_evonet_vector_io.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/tests/test_initializer_evonet.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/tests/test_initializer_net.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/tests/test_mutation.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/tests/test_population.py +0 -0
- {evolib-0.2.0b2.dev5 → evolib-0.2.0b2.dev7}/tests/test_selection.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: evolib
|
|
3
|
-
Version: 0.2.0b2.
|
|
3
|
+
Version: 0.2.0b2.dev7
|
|
4
4
|
Summary: A modular framework for evolutionary strategies and neuroevolution.
|
|
5
5
|
Author-email: EvoLib <evolib@dismail.de>
|
|
6
6
|
License: MIT License
|
|
@@ -76,6 +76,7 @@ EvoLib is a lightweight and transparent framework for evolutionary computation,
|
|
|
76
76
|
- **Modularity**: mutation, selection, crossover, and parameter representations can be freely combined.
|
|
77
77
|
- **Educational value**: examples and a clean API make it practical for illustrating evolutionary concepts.
|
|
78
78
|
- **Neuroevolution support**: structural mutations (adding/removing neurons and connections) and evolvable networks via EvoNet.
|
|
79
|
+
- **Parallel evaluation (optional)**: basic support for [Ray](https://www.ray.io/) to speed up fitness evaluations.
|
|
79
80
|
- **Type-checked**: PEP8 compliant, and consistent code style.
|
|
80
81
|
|
|
81
82
|
|
|
@@ -251,10 +252,9 @@ For deeper exploration, see the [full examples directory](examples/)
|
|
|
251
252
|
- [X] Composite Parameters (multi-module individuals)
|
|
252
253
|
- [X] Neuroevolution
|
|
253
254
|
- [X] Topological Evolution (neurons, edges)
|
|
254
|
-
- [
|
|
255
|
+
- [X] Ray Support for Parallel Evaluation (early prototypes)
|
|
255
256
|
- [ ] Advanced Visualization
|
|
256
257
|
- [ ] Game Environment Integration (pygame, PettingZoo - early prototypes)
|
|
257
|
-
- [ ] Ray Support for Parallel Evaluation (early prototypes)
|
|
258
258
|
|
|
259
259
|
|
|
260
260
|
---
|
|
@@ -20,6 +20,7 @@ EvoLib is a lightweight and transparent framework for evolutionary computation,
|
|
|
20
20
|
- **Modularity**: mutation, selection, crossover, and parameter representations can be freely combined.
|
|
21
21
|
- **Educational value**: examples and a clean API make it practical for illustrating evolutionary concepts.
|
|
22
22
|
- **Neuroevolution support**: structural mutations (adding/removing neurons and connections) and evolvable networks via EvoNet.
|
|
23
|
+
- **Parallel evaluation (optional)**: basic support for [Ray](https://www.ray.io/) to speed up fitness evaluations.
|
|
23
24
|
- **Type-checked**: PEP8 compliant, and consistent code style.
|
|
24
25
|
|
|
25
26
|
|
|
@@ -195,10 +196,9 @@ For deeper exploration, see the [full examples directory](examples/)
|
|
|
195
196
|
- [X] Composite Parameters (multi-module individuals)
|
|
196
197
|
- [X] Neuroevolution
|
|
197
198
|
- [X] Topological Evolution (neurons, edges)
|
|
198
|
-
- [
|
|
199
|
+
- [X] Ray Support for Parallel Evaluation (early prototypes)
|
|
199
200
|
- [ ] Advanced Visualization
|
|
200
201
|
- [ ] Game Environment Integration (pygame, PettingZoo - early prototypes)
|
|
201
|
-
- [ ] Ray Support for Parallel Evaluation (early prototypes)
|
|
202
202
|
|
|
203
203
|
|
|
204
204
|
---
|
|
@@ -15,9 +15,11 @@ from evolib.utils.benchmarks import (
|
|
|
15
15
|
ackley,
|
|
16
16
|
ackley_2d,
|
|
17
17
|
ackley_3d,
|
|
18
|
+
generate_timeseries,
|
|
18
19
|
griewank,
|
|
19
20
|
griewank_2d,
|
|
20
21
|
griewank_3d,
|
|
22
|
+
lfsr_sequence,
|
|
21
23
|
rastrigin,
|
|
22
24
|
rastrigin_2d,
|
|
23
25
|
rastrigin_3d,
|
|
@@ -90,6 +92,8 @@ __all__ = [
|
|
|
90
92
|
"sphere_3d",
|
|
91
93
|
"rosenbrock_3d",
|
|
92
94
|
"schwefel_3d",
|
|
95
|
+
"lfsr_sequence",
|
|
96
|
+
"generate_timeseries",
|
|
93
97
|
"save_checkpoint",
|
|
94
98
|
"resume_from_checkpoint",
|
|
95
99
|
"save_best_indiv",
|
|
@@ -88,6 +88,30 @@ class StoppingCriteria(BaseModel):
|
|
|
88
88
|
)
|
|
89
89
|
|
|
90
90
|
|
|
91
|
+
class ParallelConfig(BaseModel):
|
|
92
|
+
"""
|
|
93
|
+
Optional parallelization backend.
|
|
94
|
+
|
|
95
|
+
Controls whether fitness evaluation is run sequentially or distributed (currently
|
|
96
|
+
only Ray is supported).
|
|
97
|
+
"""
|
|
98
|
+
|
|
99
|
+
backend: str = Field(
|
|
100
|
+
default="none",
|
|
101
|
+
description="Parallel backend to use: 'none' (default) or 'ray'.",
|
|
102
|
+
)
|
|
103
|
+
num_cpus: Optional[int] = Field(
|
|
104
|
+
default=None,
|
|
105
|
+
description="Number of CPUs to allocate (Ray only). "
|
|
106
|
+
"If None, Ray chooses automatically.",
|
|
107
|
+
)
|
|
108
|
+
address: Optional[str] = Field(
|
|
109
|
+
default=None,
|
|
110
|
+
description="Ray cluster address (e.g. 'auto' or '127.0.0.1:6379'). "
|
|
111
|
+
"If None, starts a local Ray instance.",
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
|
|
91
115
|
class FullConfig(BaseModel):
|
|
92
116
|
"""
|
|
93
117
|
Main configuration model for an evolutionary run.
|
|
@@ -141,6 +165,11 @@ class FullConfig(BaseModel):
|
|
|
141
165
|
default=None, description="Survivor selection (replacement) configuration."
|
|
142
166
|
)
|
|
143
167
|
|
|
168
|
+
# Optional parallelization backend
|
|
169
|
+
parallel: Optional[ParallelConfig] = Field(
|
|
170
|
+
default=None, description="Optional parallelization backend configuration."
|
|
171
|
+
)
|
|
172
|
+
|
|
144
173
|
@model_validator(mode="before")
|
|
145
174
|
@classmethod
|
|
146
175
|
def resolve_component_configs(cls, data: dict[str, Any]) -> dict[str, Any]:
|
|
@@ -30,6 +30,9 @@ from evolib.representation.dummy import ParaDummy
|
|
|
30
30
|
class Indiv:
|
|
31
31
|
"""Represents an individual in an evolutionary optimization algorithm."""
|
|
32
32
|
|
|
33
|
+
#: unique identifier (UUID)
|
|
34
|
+
id: str
|
|
35
|
+
|
|
33
36
|
#: para (Any): Parameter values of the individual. Default: None.
|
|
34
37
|
para: Any
|
|
35
38
|
|
|
@@ -49,6 +49,7 @@ from evolib.registry.selection_registry import build_selection_registry
|
|
|
49
49
|
from evolib.registry.strategy_registry import strategy_registry
|
|
50
50
|
from evolib.utils.config_loader import load_config
|
|
51
51
|
from evolib.utils.history_logger import HistoryLogger
|
|
52
|
+
from evolib.utils.parallel import map_fitness
|
|
52
53
|
from evolib.utils.random import set_random_seed
|
|
53
54
|
|
|
54
55
|
|
|
@@ -128,6 +129,16 @@ class Pop:
|
|
|
128
129
|
self._replacement_registry = {}
|
|
129
130
|
self._replacement_fn = None
|
|
130
131
|
|
|
132
|
+
# Parallel backend
|
|
133
|
+
if cfg.parallel:
|
|
134
|
+
self.parallel_backend = cfg.parallel.backend
|
|
135
|
+
self.parallel_num_cpus = cfg.parallel.num_cpus
|
|
136
|
+
self.parallel_address = cfg.parallel.address
|
|
137
|
+
else:
|
|
138
|
+
self.parallel_backend = "none"
|
|
139
|
+
self.parallel_num_cpus = None
|
|
140
|
+
self.parallel_address = None
|
|
141
|
+
|
|
131
142
|
# Statistics
|
|
132
143
|
self.history_logger = HistoryLogger(
|
|
133
144
|
columns=[
|
|
@@ -242,21 +253,27 @@ class Pop:
|
|
|
242
253
|
"""Evaluate the fitness function for all individuals in the population."""
|
|
243
254
|
if self.fitness_function is None:
|
|
244
255
|
raise ValueError("No fitness function has been set.")
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
256
|
+
|
|
257
|
+
map_fitness(
|
|
258
|
+
self.indivs,
|
|
259
|
+
self.fitness_function,
|
|
260
|
+
backend=self.parallel_backend,
|
|
261
|
+
num_cpus=self.parallel_num_cpus,
|
|
262
|
+
address=self.parallel_address,
|
|
263
|
+
)
|
|
250
264
|
|
|
251
265
|
def evaluate_indivs(self, indivs: list[Indiv]) -> None:
|
|
252
266
|
"""Evaluate fitness for a custom list of individuals."""
|
|
253
267
|
if self.fitness_function is None:
|
|
254
268
|
raise ValueError("No fitness function has been set.")
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
269
|
+
|
|
270
|
+
map_fitness(
|
|
271
|
+
indivs,
|
|
272
|
+
self.fitness_function,
|
|
273
|
+
backend=self.parallel_backend,
|
|
274
|
+
num_cpus=self.parallel_num_cpus,
|
|
275
|
+
address=self.parallel_address,
|
|
276
|
+
)
|
|
260
277
|
|
|
261
278
|
def get_elites(self) -> list[Indiv]:
|
|
262
279
|
"""Return a list of elite individuals and set their is_elite flag."""
|
|
@@ -408,14 +425,14 @@ class Pop:
|
|
|
408
425
|
|
|
409
426
|
self.indivs.sort(key=lambda indivs: indivs.fitness, reverse=reverse)
|
|
410
427
|
|
|
411
|
-
def best(self, sort: bool =
|
|
428
|
+
def best(self, sort: bool = True) -> Indiv:
|
|
412
429
|
"""
|
|
413
430
|
Return the best individual (lowest fitness).
|
|
414
431
|
|
|
415
432
|
Args:
|
|
416
433
|
sort (bool): If True, sort the population before returning the best.
|
|
417
434
|
If False, return first individual as-is.
|
|
418
|
-
Default:
|
|
435
|
+
Default: True.
|
|
419
436
|
"""
|
|
420
437
|
|
|
421
438
|
if not self.indivs:
|
|
@@ -8,7 +8,7 @@ initialized EvoNet instance.
|
|
|
8
8
|
|
|
9
9
|
import numpy as np
|
|
10
10
|
from evonet.activation import random_function_name
|
|
11
|
-
from evonet.enums import NeuronRole
|
|
11
|
+
from evonet.enums import ConnectionType, NeuronRole
|
|
12
12
|
|
|
13
13
|
from evolib.config.evonet_component_config import EvoNetComponentConfig
|
|
14
14
|
from evolib.config.schema import FullConfig
|
|
@@ -142,3 +142,52 @@ def initializer_zero_evonet(config: FullConfig, module: str) -> EvoNet:
|
|
|
142
142
|
para.net.set_weights(np.zeros(para.net.num_weights))
|
|
143
143
|
para.net.set_biases(np.zeros(para.net.num_biases))
|
|
144
144
|
return para
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def initializer_identity_evonet(config: FullConfig, module: str) -> EvoNet:
|
|
148
|
+
"""
|
|
149
|
+
Initialize EvoNet with damped self-recurrence and zeroed weights elsewhere.
|
|
150
|
+
|
|
151
|
+
- All feedforward weights are near-zero
|
|
152
|
+
- Self-recurrent connections get weight ~0.8 (memory)
|
|
153
|
+
- Biases are randomized slightly to break symmetry
|
|
154
|
+
|
|
155
|
+
This initializer encourages stable internal state retention from the start,
|
|
156
|
+
making recurrent behavior immediately available to evolution.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
config (FullConfig): Full experiment configuration
|
|
160
|
+
module (str): Name of the EvoNet module in the config
|
|
161
|
+
|
|
162
|
+
Returns:
|
|
163
|
+
EvoNet: Initialized network with identity-style dynamics
|
|
164
|
+
"""
|
|
165
|
+
|
|
166
|
+
SELF_LOOP_WEIGHT = 0.8
|
|
167
|
+
ALPHA = 0.01
|
|
168
|
+
|
|
169
|
+
para = EvoNet()
|
|
170
|
+
cfg = config.modules[module].model_copy(deep=True)
|
|
171
|
+
para.apply_config(cfg)
|
|
172
|
+
|
|
173
|
+
_build_architecture(para, cfg)
|
|
174
|
+
|
|
175
|
+
para.net.set_weights(np.zeros(para.net.num_weights))
|
|
176
|
+
para.net.set_biases(np.zeros(para.net.num_biases))
|
|
177
|
+
|
|
178
|
+
for neuron in para.net.get_all_neurons():
|
|
179
|
+
# Small random bias to break symmetry
|
|
180
|
+
neuron.bias = np.random.uniform(-ALPHA, ALPHA)
|
|
181
|
+
for connection in neuron.outgoing:
|
|
182
|
+
# Damped self-recurrence: acts like memory cell
|
|
183
|
+
if (
|
|
184
|
+
connection.type == ConnectionType.RECURRENT
|
|
185
|
+
and connection.source.id == connection.target.id
|
|
186
|
+
):
|
|
187
|
+
connection.weight = SELF_LOOP_WEIGHT
|
|
188
|
+
|
|
189
|
+
# Small random feedforward weight to allow weak stimulus flow
|
|
190
|
+
if connection.type == ConnectionType.STANDARD:
|
|
191
|
+
connection.weight = np.random.uniform(-ALPHA, ALPHA)
|
|
192
|
+
|
|
193
|
+
return para
|
|
@@ -17,6 +17,7 @@ from evolib.config.schema import FullConfig
|
|
|
17
17
|
|
|
18
18
|
# EvoNet-based initializer
|
|
19
19
|
from evolib.initializers.evonet_initializers import (
|
|
20
|
+
initializer_identity_evonet,
|
|
20
21
|
initializer_normal_evonet,
|
|
21
22
|
initializer_random_evonet,
|
|
22
23
|
initializer_zero_evonet,
|
|
@@ -51,6 +52,7 @@ INITIALIZER_REGISTRY: dict[str, InitializerFunction] = {
|
|
|
51
52
|
"normal_evonet": initializer_normal_evonet,
|
|
52
53
|
"random_evonet": initializer_random_evonet,
|
|
53
54
|
"zero_evonet": initializer_zero_evonet,
|
|
55
|
+
"identity_evonet": initializer_identity_evonet,
|
|
54
56
|
}
|
|
55
57
|
|
|
56
58
|
|
|
@@ -14,6 +14,7 @@ All files are stored in the 'checkpoints/' directory by default.
|
|
|
14
14
|
from pathlib import Path
|
|
15
15
|
from typing import Any, Optional, cast
|
|
16
16
|
|
|
17
|
+
from evolib.config.schema import FullConfig
|
|
17
18
|
from evolib.core.individual import Indiv
|
|
18
19
|
from evolib.core.population import Pop
|
|
19
20
|
from evolib.initializers.registry import build_composite_initializer
|
|
@@ -24,6 +25,8 @@ from evolib.io.serialization import (
|
|
|
24
25
|
save_indiv,
|
|
25
26
|
save_population_pickle,
|
|
26
27
|
)
|
|
28
|
+
from evolib.utils.config_loader import load_config
|
|
29
|
+
from evolib.utils.random import set_random_seed
|
|
27
30
|
|
|
28
31
|
# Internal checkpoint directory
|
|
29
32
|
_CHECKDIR = Path("checkpoints")
|
|
@@ -116,8 +119,13 @@ def resume_or_create(
|
|
|
116
119
|
)
|
|
117
120
|
|
|
118
121
|
if pop is not None:
|
|
122
|
+
print(f"[Resume] Loaded checkpoint for run_name={run_name}")
|
|
123
|
+
cfg: FullConfig = load_config(config_path)
|
|
124
|
+
random_seed = cfg.random_seed
|
|
125
|
+
set_random_seed(random_seed)
|
|
119
126
|
return pop
|
|
120
127
|
|
|
128
|
+
print(f"[Create] New population for run_name={run_name}")
|
|
121
129
|
return Pop(config_path=config_path, fitness_function=fitness_fn)
|
|
122
130
|
|
|
123
131
|
|
|
@@ -1,9 +1,107 @@
|
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
|
2
2
|
"""Common mathematical benchmark functions for optimization tasks."""
|
|
3
3
|
|
|
4
|
-
from typing import Sequence
|
|
4
|
+
from typing import Literal, Sequence
|
|
5
5
|
|
|
6
6
|
import numpy as np
|
|
7
|
+
from numpy.random import default_rng
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def generate_timeseries(
|
|
11
|
+
length: int,
|
|
12
|
+
normalize: bool = True,
|
|
13
|
+
pattern: Literal[
|
|
14
|
+
"default", "trend_switch", "parabolic", "zigzag", "shock"
|
|
15
|
+
] = "default",
|
|
16
|
+
seed: int | None = None,
|
|
17
|
+
) -> np.ndarray:
|
|
18
|
+
"""
|
|
19
|
+
Generate synthetic time series data for evolution or forecasting. Uses local RNG to
|
|
20
|
+
avoid modifying global numpy random state.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
length (int): Number of time steps.
|
|
24
|
+
normalize (bool): Whether to scale the output to [-1, 1].
|
|
25
|
+
pattern (str): Pattern to generate:
|
|
26
|
+
- "default": Trend + Sinus + Noise
|
|
27
|
+
- "trend_switch": Linear trend up, then down
|
|
28
|
+
- "parabolic": Smooth U-shaped curve (trend reversal)
|
|
29
|
+
- "zigzag": Periodic linear up/down pattern
|
|
30
|
+
- "shock": Trend followed by sharp reversal
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
np.ndarray: The generated time series.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
if seed is not None:
|
|
37
|
+
rng = default_rng(seed)
|
|
38
|
+
else:
|
|
39
|
+
# Use global np.random set via config
|
|
40
|
+
rng = np.random.default_rng(np.random.randint(0, 2**32 - 1))
|
|
41
|
+
|
|
42
|
+
t = np.arange(length)
|
|
43
|
+
|
|
44
|
+
if pattern == "shock":
|
|
45
|
+
# Random switch point + optional shock slope variation
|
|
46
|
+
switch_point = rng.integers(length // 3, 2 * length // 3)
|
|
47
|
+
slope_up = rng.uniform(0.005, 0.015)
|
|
48
|
+
slope_down = rng.uniform(-0.015, -0.005)
|
|
49
|
+
shock = np.where(
|
|
50
|
+
t < switch_point, slope_up * t, slope_down * (t - switch_point)
|
|
51
|
+
)
|
|
52
|
+
phase = rng.uniform(0, 2 * np.pi)
|
|
53
|
+
seasonal = np.sin(t * 0.1 + phase)
|
|
54
|
+
noise = rng.normal(0.05, 0.1, size=length)
|
|
55
|
+
series = shock + seasonal + noise
|
|
56
|
+
|
|
57
|
+
elif pattern == "parabolic":
|
|
58
|
+
# Random shift of parabola + curvature
|
|
59
|
+
center = rng.integers(length // 3, 2 * length // 3)
|
|
60
|
+
curvature = rng.uniform(0.0002, 0.0004)
|
|
61
|
+
trend = -curvature * (t - center) ** 2 + 1.0
|
|
62
|
+
phase = rng.uniform(0, 2 * np.pi)
|
|
63
|
+
seasonal = 0.5 * np.sin(t * 0.1 + phase)
|
|
64
|
+
noise = rng.normal(0, 0.02, size=length)
|
|
65
|
+
series = trend + seasonal + noise
|
|
66
|
+
|
|
67
|
+
elif pattern == "zigzag":
|
|
68
|
+
# Random zigzag period and slope
|
|
69
|
+
period = rng.integers(20, 60)
|
|
70
|
+
slope = rng.uniform(0.008, 0.015)
|
|
71
|
+
trend = slope * ((t // period) % 2 * 2 - 1) * (t % period)
|
|
72
|
+
phase = rng.uniform(0, 2 * np.pi)
|
|
73
|
+
seasonal = 0.3 * np.sin(t * 0.2 + phase)
|
|
74
|
+
noise = rng.normal(0, 0.03, size=length)
|
|
75
|
+
series = trend + seasonal + noise
|
|
76
|
+
|
|
77
|
+
elif pattern == "trend_switch":
|
|
78
|
+
# Random trend_switch position + strength
|
|
79
|
+
trend_switch_pos = rng.integers(length // 3, 2 * length // 3)
|
|
80
|
+
trend_switch_strength = rng.uniform(-0.04, -0.02)
|
|
81
|
+
trend = 0.01 * t
|
|
82
|
+
trend_switch = np.where(
|
|
83
|
+
t > trend_switch_pos, trend_switch_strength * (t - trend_switch_pos), 0.0
|
|
84
|
+
)
|
|
85
|
+
phase = rng.uniform(0, 2 * np.pi)
|
|
86
|
+
seasonal = 0.5 * np.sin(t * 0.1 + phase)
|
|
87
|
+
noise = rng.normal(0, 0.04, size=length)
|
|
88
|
+
series = trend + trend_switch + seasonal + noise
|
|
89
|
+
|
|
90
|
+
else: # "default"
|
|
91
|
+
# Minor phase + trend variation
|
|
92
|
+
slope = rng.uniform(0.008, 0.012)
|
|
93
|
+
phase = rng.uniform(0, 2 * np.pi)
|
|
94
|
+
trend = slope * t
|
|
95
|
+
seasonal = np.sin(t * 0.1 + phase)
|
|
96
|
+
noise = rng.normal(0, 0.05, size=length)
|
|
97
|
+
series = trend + seasonal + noise
|
|
98
|
+
|
|
99
|
+
if normalize: # Normalize to [-1, 1]
|
|
100
|
+
min_val = np.min(series)
|
|
101
|
+
max_val = np.max(series)
|
|
102
|
+
series = 2 * (series - min_val) / (max_val - min_val) - 1
|
|
103
|
+
|
|
104
|
+
return series
|
|
7
105
|
|
|
8
106
|
|
|
9
107
|
def lfsr_sequence(
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
"""
|
|
3
|
+
Parallelization helpers for EvoLib.
|
|
4
|
+
|
|
5
|
+
Currently supports optional Ray integration for fitness evaluation. Falls back to
|
|
6
|
+
sequential evaluation if Ray is not available or not requested.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from typing import TYPE_CHECKING, Any, Callable, Optional
|
|
12
|
+
|
|
13
|
+
from evolib.core.individual import Indiv
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
import ray
|
|
17
|
+
else:
|
|
18
|
+
try:
|
|
19
|
+
import ray
|
|
20
|
+
except ImportError:
|
|
21
|
+
ray = None # type: ignore[assignment]
|
|
22
|
+
|
|
23
|
+
# Global flag to avoid repeated init/shutdown
|
|
24
|
+
_ray_initialized = False
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _ensure_ray_initialized(
|
|
28
|
+
num_cpus: Optional[int] = None, address: Optional[str] = None
|
|
29
|
+
) -> None:
|
|
30
|
+
"""Initialize Ray once with given resources."""
|
|
31
|
+
global _ray_initialized
|
|
32
|
+
|
|
33
|
+
if ray is None:
|
|
34
|
+
raise RuntimeError("Ray is not installed. Install with `pip install ray`.")
|
|
35
|
+
|
|
36
|
+
if not _ray_initialized:
|
|
37
|
+
init_kwargs: dict[str, Any] = {}
|
|
38
|
+
if num_cpus is not None:
|
|
39
|
+
init_kwargs["num_cpus"] = num_cpus
|
|
40
|
+
if address is not None:
|
|
41
|
+
init_kwargs["address"] = address
|
|
42
|
+
ray.init(**init_kwargs)
|
|
43
|
+
_ray_initialized = True
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def shutdown_ray() -> None:
|
|
47
|
+
"""Shutdown Ray if it was started by EvoLib."""
|
|
48
|
+
global _ray_initialized
|
|
49
|
+
if ray is not None and _ray_initialized:
|
|
50
|
+
ray.shutdown()
|
|
51
|
+
_ray_initialized = False
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def map_fitness(
|
|
55
|
+
indivs: list[Indiv],
|
|
56
|
+
fitness_fn: Callable[[Indiv], float | None],
|
|
57
|
+
*,
|
|
58
|
+
backend: str = "none",
|
|
59
|
+
num_cpus: Optional[int] = None,
|
|
60
|
+
address: Optional[str] = None,
|
|
61
|
+
) -> None:
|
|
62
|
+
"""
|
|
63
|
+
Evaluate a list of individuals using the chosen backend.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
indivs: List of individuals to evaluate (modified in-place).
|
|
67
|
+
fitness_fn: Fitness function that assigns indiv.fitness.
|
|
68
|
+
backend: "none" (sequential) or "ray".
|
|
69
|
+
num_cpus: Number of CPUs for Ray (optional).
|
|
70
|
+
address: Ray cluster address (optional).
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
if backend != "ray":
|
|
74
|
+
# Sequential fallback
|
|
75
|
+
for indiv in indivs:
|
|
76
|
+
result = fitness_fn(indiv)
|
|
77
|
+
if result is not None:
|
|
78
|
+
indiv.fitness = float(result)
|
|
79
|
+
indiv.is_evaluated = True
|
|
80
|
+
return
|
|
81
|
+
|
|
82
|
+
# Ray backend
|
|
83
|
+
_ensure_ray_initialized(num_cpus=num_cpus, address=address)
|
|
84
|
+
|
|
85
|
+
@ray.remote
|
|
86
|
+
def _eval_remote(indiv: Indiv) -> Indiv:
|
|
87
|
+
result = fitness_fn(indiv)
|
|
88
|
+
if result is not None:
|
|
89
|
+
indiv.fitness = float(result)
|
|
90
|
+
indiv.is_evaluated = True
|
|
91
|
+
return indiv
|
|
92
|
+
|
|
93
|
+
futures = [_eval_remote.remote(ind) for ind in indivs]
|
|
94
|
+
results = ray.get(futures)
|
|
95
|
+
|
|
96
|
+
# Update original objects in-place
|
|
97
|
+
for orig, res in zip(indivs, results):
|
|
98
|
+
orig.fitness = res.fitness
|
|
99
|
+
orig.extra_metrics = getattr(res, "extra_metrics", {})
|
|
100
|
+
orig.is_evaluated = True
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: evolib
|
|
3
|
-
Version: 0.2.0b2.
|
|
3
|
+
Version: 0.2.0b2.dev7
|
|
4
4
|
Summary: A modular framework for evolutionary strategies and neuroevolution.
|
|
5
5
|
Author-email: EvoLib <evolib@dismail.de>
|
|
6
6
|
License: MIT License
|
|
@@ -76,6 +76,7 @@ EvoLib is a lightweight and transparent framework for evolutionary computation,
|
|
|
76
76
|
- **Modularity**: mutation, selection, crossover, and parameter representations can be freely combined.
|
|
77
77
|
- **Educational value**: examples and a clean API make it practical for illustrating evolutionary concepts.
|
|
78
78
|
- **Neuroevolution support**: structural mutations (adding/removing neurons and connections) and evolvable networks via EvoNet.
|
|
79
|
+
- **Parallel evaluation (optional)**: basic support for [Ray](https://www.ray.io/) to speed up fitness evaluations.
|
|
79
80
|
- **Type-checked**: PEP8 compliant, and consistent code style.
|
|
80
81
|
|
|
81
82
|
|
|
@@ -251,10 +252,9 @@ For deeper exploration, see the [full examples directory](examples/)
|
|
|
251
252
|
- [X] Composite Parameters (multi-module individuals)
|
|
252
253
|
- [X] Neuroevolution
|
|
253
254
|
- [X] Topological Evolution (neurons, edges)
|
|
254
|
-
- [
|
|
255
|
+
- [X] Ray Support for Parallel Evaluation (early prototypes)
|
|
255
256
|
- [ ] Advanced Visualization
|
|
256
257
|
- [ ] Game Environment Integration (pygame, PettingZoo - early prototypes)
|
|
257
|
-
- [ ] Ray Support for Parallel Evaluation (early prototypes)
|
|
258
258
|
|
|
259
259
|
|
|
260
260
|
---
|
|
@@ -408,6 +408,7 @@ evolib/utils/config_loader.py
|
|
|
408
408
|
evolib/utils/fitness.py
|
|
409
409
|
evolib/utils/history_logger.py
|
|
410
410
|
evolib/utils/loss_functions.py
|
|
411
|
+
evolib/utils/parallel.py
|
|
411
412
|
evolib/utils/plotting.py
|
|
412
413
|
evolib/utils/random.py
|
|
413
414
|
evolib/utils/registry.py
|
|
@@ -443,11 +444,17 @@ examples/05_advanced_topics/06_evolving_mutation_strength_as_a_module.py
|
|
|
443
444
|
examples/06_netvector/01_netvector_sine_approximation.py
|
|
444
445
|
examples/06_netvector/02_netvector_modulated_output.py
|
|
445
446
|
examples/06_netvector/03_netvector_gain_and_bias.py
|
|
447
|
+
examples/07_evonet/00_identity_test.py
|
|
446
448
|
examples/07_evonet/01_sine_approximation.py
|
|
447
449
|
examples/07_evonet/02_image_approximation.py
|
|
448
450
|
examples/07_evonet/03_structural_xor.py
|
|
449
451
|
examples/07_evonet/04_recurrent_bit_prediction.py
|
|
450
|
-
examples/07_evonet/
|
|
452
|
+
examples/07_evonet/05_recurrent_timeseries.py
|
|
453
|
+
examples/07_evonet/06_recurrent_indicator.py
|
|
454
|
+
examples/07_evonet/06_recurrent_indicator_01.py
|
|
455
|
+
examples/07_evonet/06_recurrent_indicator_02.py
|
|
456
|
+
examples/07_evonet/06_recurrent_trading.py
|
|
457
|
+
examples/07_evonet/07_recurrent_trading_01.py
|
|
451
458
|
tests/test_benchmarks.py
|
|
452
459
|
tests/test_config_loader.py
|
|
453
460
|
tests/test_elitism_preserves_best_fitness.py
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from evolib import Population, Individual, plot_approximation
|
|
3
|
+
|
|
4
|
+
# Fixed test sequence
|
|
5
|
+
SEQ_LEN = 100
|
|
6
|
+
WARMUP_STEPS = 0
|
|
7
|
+
CONFIG_FILE = "./configs/00_identity_test.yaml"
|
|
8
|
+
FRAME_FOLDER = "00_frames"
|
|
9
|
+
|
|
10
|
+
# Generate simple linear sequence
|
|
11
|
+
full_seq = np.linspace(-1.0, 1.0, SEQ_LEN)
|
|
12
|
+
input_seq = full_seq
|
|
13
|
+
target_seq = full_seq
|
|
14
|
+
|
|
15
|
+
# Fitness: MSE between predicted and actual (no shift)
|
|
16
|
+
def eval_identity_fitness(indiv: Individual) -> float:
|
|
17
|
+
net = indiv.para["brain"].net
|
|
18
|
+
net.reset(full=True)
|
|
19
|
+
|
|
20
|
+
preds = []
|
|
21
|
+
for i in range(WARMUP_STEPS, len(input_seq)):
|
|
22
|
+
y_pred = net.calc([input_seq[i]])[0]
|
|
23
|
+
preds.append(y_pred)
|
|
24
|
+
|
|
25
|
+
y_true = target_seq[WARMUP_STEPS:]
|
|
26
|
+
preds = np.array(preds)
|
|
27
|
+
mse = np.mean((preds - y_true) ** 2)
|
|
28
|
+
|
|
29
|
+
indiv.extra_metrics["mse"] = mse
|
|
30
|
+
indiv.fitness = mse # minimize error → maximize -mse
|
|
31
|
+
return indiv.fitness
|
|
32
|
+
|
|
33
|
+
# Plot best prediction
|
|
34
|
+
def plot_prediction(pop: Population) -> None:
|
|
35
|
+
best = pop.best()
|
|
36
|
+
net = best.para["brain"].net
|
|
37
|
+
net.reset(full=True)
|
|
38
|
+
|
|
39
|
+
preds = []
|
|
40
|
+
for i in range(WARMUP_STEPS, len(input_seq)):
|
|
41
|
+
y_pred = net.calc([input_seq[i]])[0]
|
|
42
|
+
preds.append(y_pred)
|
|
43
|
+
|
|
44
|
+
plot_approximation(
|
|
45
|
+
preds,
|
|
46
|
+
target_seq[WARMUP_STEPS:],
|
|
47
|
+
title=(
|
|
48
|
+
f"Identity Test: x[t] → x[t]\n"
|
|
49
|
+
f"gen={pop.generation_num}, MSE={best.extra_metrics['mse']:.6f}"
|
|
50
|
+
),
|
|
51
|
+
pred_label="Prediction",
|
|
52
|
+
true_label="Target",
|
|
53
|
+
show=False,
|
|
54
|
+
show_grid=False,
|
|
55
|
+
save_path=f"{FRAME_FOLDER}/gen_{pop.generation_num:03d}.png",
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
def main():
|
|
59
|
+
pop = Population(CONFIG_FILE, fitness_function=eval_identity_fitness)
|
|
60
|
+
pop.run(verbosity=1, on_generation_end=plot_prediction)
|
|
61
|
+
|
|
62
|
+
if __name__ == "__main__":
|
|
63
|
+
main()
|