evolib 0.2.0b2.dev3__tar.gz → 0.2.0b2.dev4__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.dev3/evolib.egg-info → evolib-0.2.0b2.dev4}/PKG-INFO +1 -1
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/individual.py +39 -7
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/population.py +37 -21
- evolib-0.2.0b2.dev4/evolib/interfaces/enum_helpers.py +31 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/operators/evonet_structural_mutation.py +2 -14
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/operators/reproduction.py +7 -8
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/operators/selection.py +14 -17
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/operators/strategy.py +10 -10
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/evonet.py +8 -6
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4/evolib.egg-info}/PKG-INFO +1 -1
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib.egg-info/SOURCES.txt +1 -1
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/07_evonet/04_recurrent_bitseq.py +64 -23
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/pyproject.toml +1 -1
- evolib-0.2.0b2.dev3/evolib/utils/copy_indiv.py +0 -20
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/LICENSE +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/MANIFEST.in +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/README.md +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_core_individual.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_core_population.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_operators_crossover.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_operators_evonet_structural_mutation.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_operators_mutation.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_operators_replacement.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_operators_reproduction.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_operators_selection.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_operators_strategy.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_public_api.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_representation_evonet.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_representation_netvector.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_representation_vector.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_utils_benchmarks.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_utils_history_logger.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_utils_loss_functions.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/api_utils_plotting.rst +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/conf.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/config_guide.md +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/config_parameter.md +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/getting_started.md +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/docs/index.md +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/PIL/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/_typeshed/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/annotated_types/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/asyncio/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/collections/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/concurrent/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/concurrent/futures/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/ctypes/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/cycler/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/email/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/evolib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/evolib/config/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/evolib/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/evolib/globals/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/evolib/initializers/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/evolib/interfaces/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/evolib/operators/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/evolib/registry/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/evolib/representation/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/evolib/utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/html/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/importlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/importlib/metadata/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/importlib/resources/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/jinja2/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/json/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/logging/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/markdown_it/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/markdown_it/common/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/markdown_it/helpers/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/markdown_it/presets/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/markdown_it/rules_block/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/markdown_it/rules_core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/markdown_it/rules_inline/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/markupsafe/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/matplotlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/matplotlib/_api/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/matplotlib/axes/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/matplotlib/backends/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/matplotlib/projections/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/matplotlib/style/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/matplotlib/tri/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/mdurl/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/multiprocessing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/_core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/_typing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/_utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/char/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/f2py/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/fft/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/lib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/linalg/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/ma/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/matrixlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/polynomial/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/random/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/rec/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/strings/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/testing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/testing/_private/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/numpy/typing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/os/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/packaging/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/pydantic/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/pydantic/_internal/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/pydantic/deprecated/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/pydantic/plugin/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/pydantic/v1/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/pydantic_core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/pyexpat/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/pyparsing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/pyparsing/diagram/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/rich/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/sys/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/typing_inspection/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/unittest/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/urllib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/xml/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/xml/etree/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/xml/parsers/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/xml/parsers/expat/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/yaml/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/zipfile/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/zipfile/_path/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/3.12/zoneinfo/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/.mypy_cache/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/api.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/config/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/config/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/config/base_component_config.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/config/component_registry.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/config/evonet_component_config.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/config/schema.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/config/vector_component_config.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/PIL/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/_typeshed/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/asyncio/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/collections/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/concurrent/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/concurrent/futures/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/ctypes/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/cycler/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/email/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/evolib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/evolib/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/evolib/globals/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/evolib/interfaces/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/evolib/operators/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/evolib/utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/html/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/importlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/importlib/metadata/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/importlib/resources/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/jinja2/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/json/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/logging/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/markupsafe/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/matplotlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/matplotlib/_api/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/matplotlib/axes/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/matplotlib/backends/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/matplotlib/projections/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/matplotlib/style/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/matplotlib/tri/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/multiprocessing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/_core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/_typing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/_utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/char/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/f2py/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/fft/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/lib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/linalg/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/ma/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/matrixlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/polynomial/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/random/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/rec/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/strings/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/testing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/testing/_private/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/numpy/typing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/os/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/packaging/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/pyexpat/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/pyparsing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/pyparsing/diagram/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/sys/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/unittest/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/urllib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/xml/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/xml/etree/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/xml/parsers/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/xml/parsers/expat/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/yaml/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/zipfile/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/3.12/zipfile/_path/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/.mypy_cache/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/README.md +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/core/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/globals/README.md +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/globals/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/globals/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/globals/numeric.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/PIL/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/_typeshed/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/asyncio/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/collections/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/concurrent/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/concurrent/futures/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/ctypes/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/cycler/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/email/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/evolib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/evolib/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/evolib/globals/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/evolib/initializers/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/evolib/interfaces/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/evolib/operators/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/evolib/utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/html/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/importlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/importlib/metadata/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/importlib/resources/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/jinja2/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/json/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/logging/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/markupsafe/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/matplotlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/matplotlib/_api/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/matplotlib/axes/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/matplotlib/backends/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/matplotlib/projections/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/matplotlib/style/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/matplotlib/tri/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/multiprocessing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/_core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/_typing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/_utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/char/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/f2py/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/fft/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/lib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/linalg/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/ma/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/matrixlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/polynomial/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/random/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/rec/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/strings/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/testing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/testing/_private/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/numpy/typing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/os/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/packaging/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/pyexpat/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/pyparsing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/pyparsing/diagram/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/sys/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/unittest/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/urllib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/xml/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/xml/etree/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/xml/parsers/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/xml/parsers/expat/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/yaml/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/zipfile/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/3.12/zipfile/_path/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/.mypy_cache/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/evonet_initializers.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/net_initializers.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/registry.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/initializers/vector_initializers.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/interfaces/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/interfaces/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/interfaces/enums.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/interfaces/structs.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/interfaces/types.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/io/checkpoint.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/io/serialization.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/operators/README.md +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/operators/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/operators/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/operators/crossover.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/operators/mutation.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/operators/replacement.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/registry/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/registry/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/registry/replacement_registry.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/registry/selection_registry.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/registry/strategy_registry.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/PIL/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/_typeshed/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/annotated_types/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/asyncio/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/collections/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/concurrent/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/concurrent/futures/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/ctypes/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/cycler/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/email/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/evolib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/evolib/config/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/evolib/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/evolib/globals/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/evolib/initializers/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/evolib/interfaces/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/evolib/operators/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/evolib/registry/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/evolib/representation/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/evolib/utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/html/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/importlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/importlib/metadata/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/importlib/resources/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/jinja2/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/json/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/logging/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/markdown_it/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/markdown_it/common/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/markdown_it/helpers/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/markdown_it/presets/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/markdown_it/rules_block/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/markdown_it/rules_core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/markdown_it/rules_inline/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/markupsafe/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/matplotlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/matplotlib/_api/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/matplotlib/axes/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/matplotlib/backends/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/matplotlib/projections/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/matplotlib/style/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/matplotlib/tri/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/mdurl/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/multiprocessing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/_core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/_typing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/_utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/char/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/f2py/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/fft/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/lib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/linalg/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/ma/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/matrixlib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/polynomial/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/random/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/rec/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/strings/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/testing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/testing/_private/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/numpy/typing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/os/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/packaging/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/pydantic/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/pydantic/_internal/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/pydantic/deprecated/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/pydantic/plugin/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/pydantic/v1/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/pydantic_core/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/pyexpat/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/pyparsing/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/pyparsing/diagram/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/rich/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/sys/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/typing_inspection/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/unittest/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/urllib/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/xml/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/xml/etree/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/xml/parsers/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/xml/parsers/expat/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/yaml/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/zipfile/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/zipfile/_path/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/3.12/zoneinfo/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/.mypy_cache/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/_apply_config_mapping.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/base.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/composite.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/evo_params.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/netvector.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/representation/vector.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/utils/README.md +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/utils/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/utils/__pycache__/__init__.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/utils/benchmarks.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/utils/config_loader.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/utils/fitness.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/utils/history_logger.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/utils/loss_functions.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/utils/plotting.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/utils/random.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib/utils/registry.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib.egg-info/dependency_links.txt +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib.egg-info/requires.txt +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/evolib.egg-info/top_level.txt +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/01_basic_usage/01_getting_started.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/01_basic_usage/02_mutation.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/01_basic_usage/03_population_mutation.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/01_basic_usage/04_fitness.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/02_strategies/01_step_by_step_evolution.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/02_strategies/02_mu_lambda_step.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/02_strategies/03_mu_lambda.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/02_strategies/04_flexible.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/03_comparisons/01_history.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/03_comparisons/02_plotting.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/03_comparisons/03_compare_runs.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/03_comparisons/04_exponential_decay_vs_static.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/03_comparisons/05_adaptive_global_vs_static.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/03_comparisons/06_adaptive_individual_vs_static.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/03_comparisons/07_selection_comparison.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/03_comparisons/08_selection_pressure.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/03_comparisons/09_selection_vs_mutation_pressure.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/03_comparisons/10_selection_stochastic_vs_deterministic.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/03_comparisons/11_crossover_comparison.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/04_function_approximation/01_polynomial_sine.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/04_function_approximation/02_sine_point_approximation.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/04_function_approximation/03_approximation_with_noise.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/05_advanced_topics/01_fitness_landscape_exploration.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/05_advanced_topics/02_rosenbrock_surface_path.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/05_advanced_topics/03_vector_control.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/05_advanced_topics/04_vector_control_with_obstacles.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/05_advanced_topics/05_piecewise_linear_xsys.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/05_advanced_topics/06_evolving_mutation_strength_as_a_module.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/06_netvector/01_netvector_sine_approximation.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/06_netvector/02_netvector_modulated_output.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/06_netvector/03_netvector_gain_and_bias.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/07_evonet/01_sine_approximation.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/07_evonet/02_image_approximation.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/07_evonet/03_structural_xor.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/examples/07_evonet/resize_all_images.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/setup.cfg +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/tests/test_benchmarks.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/tests/test_config_loader.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/tests/test_elitism_preserves_best_fitness.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/tests/test_evonet_vector_io.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/tests/test_initializer_evonet.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/tests/test_initializer_net.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/tests/test_mutation.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/tests/test_population.py +0 -0
- {evolib-0.2.0b2.dev3 → evolib-0.2.0b2.dev4}/tests/test_selection.py +0 -0
|
@@ -21,6 +21,7 @@ Classes:
|
|
|
21
21
|
|
|
22
22
|
from copy import deepcopy
|
|
23
23
|
from typing import Any, Dict, Optional
|
|
24
|
+
from uuid import uuid4
|
|
24
25
|
|
|
25
26
|
from evolib.interfaces.enums import Origin
|
|
26
27
|
|
|
@@ -60,6 +61,7 @@ class Indiv:
|
|
|
60
61
|
extra_metrics: dict[str, float]
|
|
61
62
|
|
|
62
63
|
__slots__ = (
|
|
64
|
+
"id",
|
|
63
65
|
"para",
|
|
64
66
|
"fitness",
|
|
65
67
|
"is_evaluated",
|
|
@@ -71,7 +73,8 @@ class Indiv:
|
|
|
71
73
|
"is_elite",
|
|
72
74
|
)
|
|
73
75
|
|
|
74
|
-
def __init__(self, para: Any = None):
|
|
76
|
+
def __init__(self, para: Any | None = None):
|
|
77
|
+
self.id: str = str(uuid4())
|
|
75
78
|
self.para = para
|
|
76
79
|
self.fitness = None
|
|
77
80
|
self.is_evaluated = False
|
|
@@ -160,14 +163,43 @@ class Indiv:
|
|
|
160
163
|
"""Return True if the individual is an offspring."""
|
|
161
164
|
return self.origin == Origin.OFFSPRING
|
|
162
165
|
|
|
163
|
-
def copy(
|
|
166
|
+
def copy(
|
|
167
|
+
self,
|
|
168
|
+
*,
|
|
169
|
+
reset_id: bool = True,
|
|
170
|
+
reset_fitness: bool = False,
|
|
171
|
+
reset_age: bool = False,
|
|
172
|
+
reset_evaluation: bool = False,
|
|
173
|
+
reset_origin: bool = False,
|
|
174
|
+
) -> "Indiv":
|
|
164
175
|
"""
|
|
165
|
-
Create a copy of the individual.
|
|
176
|
+
Create a copy of the individual, with optional resets.
|
|
166
177
|
|
|
167
|
-
|
|
168
|
-
|
|
178
|
+
Args:
|
|
179
|
+
reset_id (bool): If True (default), assign a new unique ID to the copy.
|
|
180
|
+
reset_fitness (bool): If True, set fitness to None in the copy.
|
|
181
|
+
reset_age (bool): If True, set age to 0 in the copy.
|
|
182
|
+
reset_evaluation (bool): If True, set is_evaluated = False in the copy.
|
|
183
|
+
reset_origin (bool): If True, set origin = Origin.OFFSPRING
|
|
184
|
+
and parent_idx = None in the copy.
|
|
169
185
|
|
|
170
186
|
Returns:
|
|
171
|
-
Indiv: A copy of this individual.
|
|
187
|
+
Indiv: A (possibly reset) copy of this individual.
|
|
172
188
|
"""
|
|
173
|
-
|
|
189
|
+
new_indiv: Indiv = deepcopy(self)
|
|
190
|
+
|
|
191
|
+
if reset_id:
|
|
192
|
+
new_indiv.id = str(uuid4())
|
|
193
|
+
if reset_fitness:
|
|
194
|
+
new_indiv.fitness = None
|
|
195
|
+
if reset_age:
|
|
196
|
+
new_indiv.age = 0
|
|
197
|
+
if reset_evaluation:
|
|
198
|
+
new_indiv.is_evaluated = False
|
|
199
|
+
if reset_origin:
|
|
200
|
+
from evolib.interfaces.enums import Origin
|
|
201
|
+
|
|
202
|
+
new_indiv.origin = Origin.OFFSPRING
|
|
203
|
+
new_indiv.parent_idx = None
|
|
204
|
+
|
|
205
|
+
return new_indiv
|
|
@@ -208,6 +208,10 @@ class Pop:
|
|
|
208
208
|
para = init_fn(self)
|
|
209
209
|
self.add_indiv(Indiv(para=para))
|
|
210
210
|
|
|
211
|
+
# initialize adaptive parameters for initial parents
|
|
212
|
+
if self.indivs:
|
|
213
|
+
self.update_parameters(self.indivs)
|
|
214
|
+
|
|
211
215
|
def set_fitness_function(self, func: FitnessFunction) -> None:
|
|
212
216
|
"""
|
|
213
217
|
Sets the fitness function to be used for evaluating individuals.
|
|
@@ -567,7 +571,7 @@ class Pop:
|
|
|
567
571
|
|
|
568
572
|
self.history_logger.reset()
|
|
569
573
|
|
|
570
|
-
def update_parameters(self) -> None:
|
|
574
|
+
def update_parameters(self, indivs: list[Indiv]) -> None:
|
|
571
575
|
"""
|
|
572
576
|
Update all strategy-dependent parameters for the current generation.
|
|
573
577
|
|
|
@@ -577,43 +581,54 @@ class Pop:
|
|
|
577
581
|
ValueError or AttributeError if the population or its individuals
|
|
578
582
|
are invalid.
|
|
579
583
|
"""
|
|
580
|
-
self.update_mutation_parameters()
|
|
581
|
-
self.update_crossover_parameters()
|
|
584
|
+
self.update_mutation_parameters(indivs)
|
|
585
|
+
self.update_crossover_parameters(indivs)
|
|
582
586
|
|
|
583
|
-
def update_mutation_parameters(self) -> None:
|
|
587
|
+
def update_mutation_parameters(self, indivs: list[Indiv]) -> None:
|
|
584
588
|
"""
|
|
585
|
-
|
|
586
|
-
|
|
589
|
+
Update mutation-related parameters for a given set of individuals via their
|
|
590
|
+
`para` objects.
|
|
587
591
|
|
|
588
|
-
|
|
589
|
-
|
|
592
|
+
Typical usage:
|
|
593
|
+
- During population initialization: called once on all parents to ensure
|
|
594
|
+
they start with valid adaptive parameters.
|
|
595
|
+
- During evolution: called on offspring *before* mutation, so that new
|
|
596
|
+
individuals use up-to-date parameters (e.g. annealing schedules).
|
|
590
597
|
|
|
591
|
-
|
|
592
|
-
|
|
598
|
+
Notes:
|
|
599
|
+
- Parents are not updated in every generation. They keep the parameters
|
|
600
|
+
assigned at initialization, ensuring selection acts on stable values.
|
|
601
|
+
- Offspring are updated once per generation, prior to mutation.
|
|
593
602
|
"""
|
|
594
|
-
|
|
603
|
+
|
|
604
|
+
for indiv in indivs:
|
|
605
|
+
assert indiv.para is not None
|
|
595
606
|
indiv.para.update_mutation_parameters(
|
|
596
607
|
self.generation_num, self.max_generations, self.diversity_ema
|
|
597
608
|
)
|
|
598
609
|
|
|
599
|
-
def update_crossover_parameters(self) -> None:
|
|
610
|
+
def update_crossover_parameters(self, indivs: list[Indiv]) -> None:
|
|
600
611
|
"""
|
|
601
|
-
|
|
612
|
+
Update crossover-related parameters for a given set of individuals.
|
|
602
613
|
|
|
603
|
-
|
|
604
|
-
|
|
614
|
+
Typical usage:
|
|
615
|
+
- During population initialization: called once on all parents to ensure
|
|
616
|
+
they start with valid crossover parameters.
|
|
617
|
+
- During evolution: called on offspring *before* crossover, so that new
|
|
618
|
+
individuals use up-to-date parameters (e.g. annealing schedules or
|
|
619
|
+
adaptive rates).
|
|
605
620
|
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
621
|
+
Notes:
|
|
622
|
+
- Parents are not updated in every generation. They keep the parameters
|
|
623
|
+
assigned at initialization, ensuring selection acts on stable values.
|
|
624
|
+
- Offspring are updated once per generation, prior to crossover.
|
|
610
625
|
"""
|
|
611
|
-
if not
|
|
626
|
+
if not indivs:
|
|
612
627
|
raise ValueError(
|
|
613
628
|
"Population is empty – cannot update crossover parameters."
|
|
614
629
|
)
|
|
615
630
|
|
|
616
|
-
for indiv in
|
|
631
|
+
for indiv in indivs:
|
|
617
632
|
if not hasattr(indiv, "para") or not hasattr(
|
|
618
633
|
indiv.para, "update_crossover_parameters"
|
|
619
634
|
):
|
|
@@ -622,6 +637,7 @@ class Pop:
|
|
|
622
637
|
"with 'update_crossover_parameters' method."
|
|
623
638
|
)
|
|
624
639
|
|
|
640
|
+
assert indiv.para is not None
|
|
625
641
|
indiv.para.update_crossover_parameters(
|
|
626
642
|
self.generation_num,
|
|
627
643
|
self.max_generations,
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
from typing import Optional, Set
|
|
4
|
+
|
|
5
|
+
from evonet.enums import RecurrentKind
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def resolve_recurrent_kinds(preset: Optional[str]) -> Set[RecurrentKind]:
|
|
9
|
+
"""
|
|
10
|
+
Map a preset string to the corresponding set of recurrent connection types.
|
|
11
|
+
|
|
12
|
+
Parameters
|
|
13
|
+
----------
|
|
14
|
+
preset : Optional[str]
|
|
15
|
+
One of: "none", "direct", "local", "all", or None.
|
|
16
|
+
|
|
17
|
+
Returns
|
|
18
|
+
-------
|
|
19
|
+
Set[RecurrentKind]
|
|
20
|
+
A set of recurrent kinds to use.
|
|
21
|
+
"""
|
|
22
|
+
if preset is None or preset == "none":
|
|
23
|
+
return set()
|
|
24
|
+
elif preset == "direct":
|
|
25
|
+
return {RecurrentKind.DIRECT}
|
|
26
|
+
elif preset == "local":
|
|
27
|
+
return {RecurrentKind.DIRECT, RecurrentKind.LATERAL}
|
|
28
|
+
elif preset == "all":
|
|
29
|
+
return {RecurrentKind.DIRECT, RecurrentKind.LATERAL, RecurrentKind.INDIRECT}
|
|
30
|
+
else:
|
|
31
|
+
raise ValueError(f"Unknown recurrent preset: {preset}")
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import numpy as np
|
|
4
4
|
from evonet.core import Nnet
|
|
5
|
-
from evonet.enums import NeuronRole
|
|
5
|
+
from evonet.enums import NeuronRole
|
|
6
6
|
from evonet.mutation import (
|
|
7
7
|
add_random_connection,
|
|
8
8
|
add_random_neuron,
|
|
@@ -12,19 +12,7 @@ from evonet.mutation import (
|
|
|
12
12
|
)
|
|
13
13
|
|
|
14
14
|
from evolib.config.base_component_config import StructuralMutationConfig
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def resolve_recurrent_kinds(preset: str | None) -> set[RecurrentKind]:
|
|
18
|
-
if preset == "none" or preset is None:
|
|
19
|
-
return set()
|
|
20
|
-
elif preset == "direct":
|
|
21
|
-
return {RecurrentKind.DIRECT}
|
|
22
|
-
elif preset == "local":
|
|
23
|
-
return {RecurrentKind.DIRECT, RecurrentKind.LATERAL}
|
|
24
|
-
elif preset == "all":
|
|
25
|
-
return {RecurrentKind.DIRECT, RecurrentKind.LATERAL, RecurrentKind.INDIRECT}
|
|
26
|
-
else:
|
|
27
|
-
raise ValueError(f"Unknown recurrent preset: {preset}")
|
|
15
|
+
from evolib.interfaces.enum_helpers import resolve_recurrent_kinds
|
|
28
16
|
|
|
29
17
|
|
|
30
18
|
def mutate_structure(net: Nnet, cfg: StructuralMutationConfig) -> None:
|
|
@@ -4,9 +4,6 @@ from typing import Any, List
|
|
|
4
4
|
|
|
5
5
|
import numpy as np
|
|
6
6
|
|
|
7
|
-
from evolib.interfaces.enums import Origin
|
|
8
|
-
from evolib.utils.copy_indiv import copy_indiv
|
|
9
|
-
|
|
10
7
|
|
|
11
8
|
def generate_cloned_offspring(parents: List[Any], lambda_: int) -> List[Any]:
|
|
12
9
|
"""
|
|
@@ -37,11 +34,13 @@ def generate_cloned_offspring(parents: List[Any], lambda_: int) -> List[Any]:
|
|
|
37
34
|
|
|
38
35
|
for idx in parent_indices:
|
|
39
36
|
parent = parents[idx]
|
|
40
|
-
child =
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
37
|
+
child = parent.copy(
|
|
38
|
+
reset_id=True,
|
|
39
|
+
reset_fitness=True,
|
|
40
|
+
reset_age=True,
|
|
41
|
+
reset_evaluation=True,
|
|
42
|
+
reset_origin=True,
|
|
43
|
+
)
|
|
45
44
|
child.parent_idx = idx
|
|
46
45
|
offspring.append(child)
|
|
47
46
|
|
|
@@ -12,10 +12,9 @@ Included methods:
|
|
|
12
12
|
- Truncation Selection
|
|
13
13
|
|
|
14
14
|
All methods operate on a population of individuals with assigned fitness values and
|
|
15
|
-
return
|
|
15
|
+
return copies of selected parents.
|
|
16
16
|
"""
|
|
17
17
|
|
|
18
|
-
import copy
|
|
19
18
|
import random
|
|
20
19
|
from typing import TYPE_CHECKING, Any, List, Optional
|
|
21
20
|
|
|
@@ -124,7 +123,7 @@ def selection_tournament(
|
|
|
124
123
|
)
|
|
125
124
|
|
|
126
125
|
# Kopie des besten Individuums hinzufuegen
|
|
127
|
-
selected_parents.append(
|
|
126
|
+
selected_parents.append(pop.indivs[best_idx].copy())
|
|
128
127
|
|
|
129
128
|
# Entfernen, falls gewuenscht
|
|
130
129
|
if remove_selected:
|
|
@@ -159,7 +158,7 @@ def selection_rank_based(
|
|
|
159
158
|
Default: False (minimization).
|
|
160
159
|
|
|
161
160
|
Returns:
|
|
162
|
-
List[Any]: List of selected individuals (
|
|
161
|
+
List[Any]: List of selected individuals (copies).
|
|
163
162
|
|
|
164
163
|
Raises:
|
|
165
164
|
ValueError: If parameters are invalid (e.g., empty population,
|
|
@@ -181,8 +180,6 @@ def selection_rank_based(
|
|
|
181
180
|
if mode == "exponential" and exp_base is None:
|
|
182
181
|
raise ValueError("exp_base must be set when using exponential rank selection.")
|
|
183
182
|
|
|
184
|
-
exp_base = 1.0
|
|
185
|
-
|
|
186
183
|
fitnesses = [indiv.fitness for indiv in pop.indivs]
|
|
187
184
|
if any(f is None or np.isnan(f) for f in fitnesses):
|
|
188
185
|
raise TypeError("All fitness values must be valid (not None or NaN)")
|
|
@@ -222,7 +219,7 @@ def selection_rank_based(
|
|
|
222
219
|
# Select an individual based on rank probability
|
|
223
220
|
list_index = np.random.choice(population_size, p=probabilities)
|
|
224
221
|
selected_idx = available_indices[list_index]
|
|
225
|
-
selected_parents.append(
|
|
222
|
+
selected_parents.append(pop.indivs[selected_idx].copy())
|
|
226
223
|
|
|
227
224
|
# Optionally remove selected individual
|
|
228
225
|
if remove_selected:
|
|
@@ -260,13 +257,13 @@ def selection_random(pop: "Pop", remove_selected: bool = False) -> List[Indiv]:
|
|
|
260
257
|
|
|
261
258
|
# Randomly select individual from the population
|
|
262
259
|
selected_parent = random.choice(available_indivs)
|
|
263
|
-
parent = copy
|
|
260
|
+
parent = selected_parent.copy()
|
|
264
261
|
|
|
265
262
|
# Append the best individual to offspring
|
|
266
263
|
selected_parents.append(parent)
|
|
267
264
|
|
|
268
265
|
if remove_selected:
|
|
269
|
-
available_indivs.remove(
|
|
266
|
+
available_indivs.remove(selected_parent)
|
|
270
267
|
|
|
271
268
|
return selected_parents
|
|
272
269
|
|
|
@@ -282,7 +279,7 @@ def selection_roulette(
|
|
|
282
279
|
fitness_maximization (bool): If True, higher fitness is better.
|
|
283
280
|
|
|
284
281
|
Returns:
|
|
285
|
-
List[Any]: List of selected individuals (
|
|
282
|
+
List[Any]: List of selected individuals (copies).
|
|
286
283
|
"""
|
|
287
284
|
if not pop.indivs:
|
|
288
285
|
raise ValueError("Population is empty")
|
|
@@ -302,7 +299,7 @@ def selection_roulette(
|
|
|
302
299
|
probabilities = fitnesses / total_fitness
|
|
303
300
|
indices = np.random.choice(len(pop.indivs), size=num_parents, p=probabilities)
|
|
304
301
|
|
|
305
|
-
return [
|
|
302
|
+
return [pop.indivs[i].copy() for i in indices]
|
|
306
303
|
|
|
307
304
|
|
|
308
305
|
def selection_sus(
|
|
@@ -316,7 +313,7 @@ def selection_sus(
|
|
|
316
313
|
fitness_maximization (bool): If True, higher fitness is better.
|
|
317
314
|
|
|
318
315
|
Returns:
|
|
319
|
-
List[Any]: Selected individuals (
|
|
316
|
+
List[Any]: Selected individuals (copies).
|
|
320
317
|
"""
|
|
321
318
|
if not pop.indivs:
|
|
322
319
|
raise ValueError("Population is empty")
|
|
@@ -345,7 +342,7 @@ def selection_sus(
|
|
|
345
342
|
for p in pointers:
|
|
346
343
|
while p > cumulative[i]:
|
|
347
344
|
i += 1
|
|
348
|
-
selected.append(
|
|
345
|
+
selected.append(pop.indivs[i].copy())
|
|
349
346
|
|
|
350
347
|
return selected
|
|
351
348
|
|
|
@@ -365,7 +362,7 @@ def selection_boltzmann(
|
|
|
365
362
|
fitness_maximization (bool): If True, higher fitness is better.
|
|
366
363
|
|
|
367
364
|
Returns:
|
|
368
|
-
List[Any]: Selected individuals (
|
|
365
|
+
List[Any]: Selected individuals (copies).
|
|
369
366
|
"""
|
|
370
367
|
if not pop.indivs:
|
|
371
368
|
raise ValueError("Population is empty")
|
|
@@ -388,7 +385,7 @@ def selection_boltzmann(
|
|
|
388
385
|
probabilities = exp_values / np.sum(exp_values)
|
|
389
386
|
|
|
390
387
|
indices = np.random.choice(len(pop.indivs), size=num_parents, p=probabilities)
|
|
391
|
-
return [
|
|
388
|
+
return [pop.indivs[i].copy() for i in indices]
|
|
392
389
|
|
|
393
390
|
|
|
394
391
|
def selection_truncation(
|
|
@@ -402,7 +399,7 @@ def selection_truncation(
|
|
|
402
399
|
fitness_maximization (bool): If True, selects best fitness; else lowest.
|
|
403
400
|
|
|
404
401
|
Returns:
|
|
405
|
-
List[Any]: Selected individuals (
|
|
402
|
+
List[Any]: Selected individuals (copies).
|
|
406
403
|
"""
|
|
407
404
|
|
|
408
405
|
if not pop.indivs:
|
|
@@ -419,4 +416,4 @@ def selection_truncation(
|
|
|
419
416
|
sorted_indices = sorted_indices[::-1]
|
|
420
417
|
|
|
421
418
|
selected_indices = sorted_indices[:num_parents]
|
|
422
|
-
return [
|
|
419
|
+
return [pop.indivs[i].copy() for i in selected_indices]
|
|
@@ -47,12 +47,12 @@ def evolve_mu_plus_lambda(pop: "Pop") -> None:
|
|
|
47
47
|
# Age all current individuals
|
|
48
48
|
pop.age_indivs()
|
|
49
49
|
|
|
50
|
-
# Update mutation/crossover parameters
|
|
51
|
-
pop.update_parameters()
|
|
52
|
-
|
|
53
50
|
# CREATE OFFSPRING
|
|
54
51
|
offspring = generate_cloned_offspring(pop.indivs, pop.offspring_pool_size)
|
|
55
52
|
|
|
53
|
+
# Update mutation/crossover parameters
|
|
54
|
+
pop.update_parameters(offspring)
|
|
55
|
+
|
|
56
56
|
# Crossover
|
|
57
57
|
crossover_offspring(pop, offspring)
|
|
58
58
|
|
|
@@ -90,12 +90,12 @@ def evolve_mu_comma_lambda(pop: "Pop") -> None:
|
|
|
90
90
|
|
|
91
91
|
pop.evaluate_fitness()
|
|
92
92
|
|
|
93
|
-
# Update mutation/crossover parameters
|
|
94
|
-
pop.update_parameters()
|
|
95
|
-
|
|
96
93
|
# CREATE OFFSPRING
|
|
97
94
|
offspring = generate_cloned_offspring(pop.indivs, pop.offspring_pool_size)
|
|
98
95
|
|
|
96
|
+
# Update mutation/crossover parameters
|
|
97
|
+
pop.update_parameters(offspring)
|
|
98
|
+
|
|
99
99
|
# Crossover
|
|
100
100
|
crossover_offspring(pop, offspring)
|
|
101
101
|
|
|
@@ -164,7 +164,7 @@ def evolve_steady_state(pop: "Pop") -> None:
|
|
|
164
164
|
offspring = generate_cloned_offspring(parents, pop.lambda_)
|
|
165
165
|
|
|
166
166
|
# Update mutation/crossover parameters
|
|
167
|
-
pop.update_parameters()
|
|
167
|
+
pop.update_parameters(offspring)
|
|
168
168
|
|
|
169
169
|
# Crossover
|
|
170
170
|
crossover_offspring(pop, offspring)
|
|
@@ -226,12 +226,12 @@ def evolve_flexible(pop: "Pop") -> None:
|
|
|
226
226
|
# Reproduction
|
|
227
227
|
offspring = generate_cloned_offspring(parents, pop.lambda_)
|
|
228
228
|
|
|
229
|
+
# Mutation & Crossover Parameters
|
|
230
|
+
pop.update_parameters(offspring)
|
|
231
|
+
|
|
229
232
|
# Crossover
|
|
230
233
|
crossover_offspring(pop, offspring)
|
|
231
234
|
|
|
232
|
-
# Mutation & Crossover Parameters
|
|
233
|
-
pop.update_parameters()
|
|
234
|
-
|
|
235
235
|
# Mutation
|
|
236
236
|
mutate_offspring(pop, offspring)
|
|
237
237
|
|
|
@@ -17,12 +17,10 @@ from evonet.mutation import mutate_activations, mutate_bias, mutate_weight
|
|
|
17
17
|
|
|
18
18
|
from evolib.config.base_component_config import StructuralMutationConfig
|
|
19
19
|
from evolib.config.evonet_component_config import EvoNetComponentConfig
|
|
20
|
+
from evolib.interfaces.enum_helpers import resolve_recurrent_kinds
|
|
20
21
|
from evolib.interfaces.enums import MutationStrategy
|
|
21
22
|
from evolib.interfaces.types import ModuleConfig
|
|
22
|
-
from evolib.operators.evonet_structural_mutation import
|
|
23
|
-
mutate_structure,
|
|
24
|
-
resolve_recurrent_kinds,
|
|
25
|
-
)
|
|
23
|
+
from evolib.operators.evonet_structural_mutation import mutate_structure
|
|
26
24
|
from evolib.operators.mutation import (
|
|
27
25
|
adapt_mutation_probability_by_diversity,
|
|
28
26
|
adapt_mutation_strength,
|
|
@@ -317,7 +315,8 @@ class EvoNet(ParaBase):
|
|
|
317
315
|
)
|
|
318
316
|
|
|
319
317
|
# Perform adaptive update
|
|
320
|
-
|
|
318
|
+
bounds = (ep.min_mutation_strength, ep.max_mutation_strength)
|
|
319
|
+
ep.mutation_strength = adapt_mutation_strength(ep, bounds)
|
|
321
320
|
|
|
322
321
|
# If Bias-Override exists
|
|
323
322
|
if self.bias_evo_params is not None:
|
|
@@ -366,7 +365,10 @@ class EvoNet(ParaBase):
|
|
|
366
365
|
bep.mutation_strength = np.random.uniform(
|
|
367
366
|
bep.min_mutation_strength, bep.max_mutation_strength
|
|
368
367
|
)
|
|
369
|
-
|
|
368
|
+
|
|
369
|
+
# Perform adaptive update
|
|
370
|
+
bounds = (bep.min_mutation_strength, bep.max_mutation_strength)
|
|
371
|
+
bep.mutation_strength = adapt_mutation_strength(bep, bounds)
|
|
370
372
|
|
|
371
373
|
def get_vector(self) -> np.ndarray:
|
|
372
374
|
"""Return a flat vector containing all weights and biases."""
|
|
@@ -280,6 +280,7 @@ evolib/initializers/.mypy_cache/3.12/zipfile/__init__.py
|
|
|
280
280
|
evolib/initializers/.mypy_cache/3.12/zipfile/_path/__init__.py
|
|
281
281
|
evolib/initializers/__pycache__/__init__.py
|
|
282
282
|
evolib/interfaces/__init__.py
|
|
283
|
+
evolib/interfaces/enum_helpers.py
|
|
283
284
|
evolib/interfaces/enums.py
|
|
284
285
|
evolib/interfaces/structs.py
|
|
285
286
|
evolib/interfaces/types.py
|
|
@@ -403,7 +404,6 @@ evolib/utils/README.md
|
|
|
403
404
|
evolib/utils/__init__.py
|
|
404
405
|
evolib/utils/benchmarks.py
|
|
405
406
|
evolib/utils/config_loader.py
|
|
406
|
-
evolib/utils/copy_indiv.py
|
|
407
407
|
evolib/utils/fitness.py
|
|
408
408
|
evolib/utils/history_logger.py
|
|
409
409
|
evolib/utils/loss_functions.py
|
|
@@ -3,9 +3,12 @@ Example: Recurrent Bit Sequence Prediction
|
|
|
3
3
|
|
|
4
4
|
This example demonstrates how an EvoNet with recurrent connections
|
|
5
5
|
can be evolved to predict the next bit in a fixed binary sequence.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
|
|
7
|
+
Key details:
|
|
8
|
+
- The bit sequence is repeated twice.
|
|
9
|
+
- The first pass is used as a warm-up so the recurrent state can settle.
|
|
10
|
+
- Fitness and accuracy are evaluated only on the second pass.
|
|
11
|
+
- Visualization shows input, target, and predictions for the evaluated phase.
|
|
9
12
|
"""
|
|
10
13
|
|
|
11
14
|
from evolib import Population, Individual, plot_bit_prediction
|
|
@@ -14,8 +17,8 @@ from evolib.representation.evonet import EvoNet
|
|
|
14
17
|
FRAME_FOLDER = "04_frames"
|
|
15
18
|
CONFIG_FILE = "configs/04_recurrent_bitseq.yaml"
|
|
16
19
|
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
SEQ_LENGTH = 31
|
|
21
|
+
warmup_steps = SEQ_LENGTH
|
|
19
22
|
|
|
20
23
|
def lfsr_sequence(length: int, seed: int = 0b10011, taps=(5, 2)) -> list[int]:
|
|
21
24
|
"""
|
|
@@ -45,55 +48,93 @@ def lfsr_sequence(length: int, seed: int = 0b10011, taps=(5, 2)) -> list[int]:
|
|
|
45
48
|
bit = state & 1
|
|
46
49
|
seq.append(bit)
|
|
47
50
|
# compute feedback from taps
|
|
48
|
-
fb =
|
|
51
|
+
fb = 1
|
|
49
52
|
for t in taps:
|
|
50
53
|
fb ^= (state >> (t - 1)) & 1
|
|
51
54
|
state = (state >> 1) | (fb << (n - 1))
|
|
52
55
|
return seq
|
|
53
56
|
|
|
54
57
|
|
|
55
|
-
input_seq = lfsr_sequence(44)
|
|
56
|
-
target_seq = input_seq[1:] + [input_seq[0]] # nächstes Bit als Ziel
|
|
57
|
-
warmup_steps = 5
|
|
58
|
-
|
|
59
|
-
|
|
60
58
|
def fitness_bitseq(indiv: Individual) -> float:
|
|
61
59
|
"""
|
|
62
60
|
Evaluate how well the EvoNet predicts the next bit in a fixed sequence.
|
|
63
|
-
|
|
61
|
+
Returns mean squared error (to minimize).
|
|
62
|
+
Additionally logs classification accuracy in indiv.extra_metrics.
|
|
64
63
|
"""
|
|
65
64
|
net: EvoNet = indiv.para["brain"].net
|
|
66
65
|
net.reset(full=True)
|
|
67
66
|
|
|
68
67
|
total_error = 0.0
|
|
68
|
+
correct = 0
|
|
69
|
+
count = 0
|
|
70
|
+
|
|
71
|
+
|
|
69
72
|
for t in range(len(input_seq)):
|
|
70
73
|
output = net.calc([input_seq[t]])[0]
|
|
71
74
|
if t >= warmup_steps:
|
|
72
|
-
|
|
75
|
+
target = target_seq[t]
|
|
76
|
+
# --- MSE ---
|
|
77
|
+
error = output - target
|
|
73
78
|
total_error += error**2
|
|
74
79
|
|
|
75
|
-
|
|
80
|
+
# --- Accuracy ---
|
|
81
|
+
pred_bit = 1 if output > 0.5 else 0
|
|
82
|
+
if pred_bit == target:
|
|
83
|
+
correct += 1
|
|
84
|
+
count += 1
|
|
85
|
+
|
|
86
|
+
mse = total_error / count
|
|
87
|
+
acc = correct / count if count > 0 else 0.0
|
|
88
|
+
|
|
89
|
+
# Log extra metrics
|
|
90
|
+
indiv.extra_metrics = {"accuracy": acc, "mse": mse}
|
|
91
|
+
|
|
92
|
+
return mse + (1-acc) / 4
|
|
76
93
|
|
|
77
94
|
|
|
78
95
|
def save_plot(pop: Population) -> None:
|
|
79
|
-
"""
|
|
80
|
-
Save visualization of the best individual's predictions
|
|
81
|
-
at the current generation.
|
|
82
|
-
"""
|
|
83
96
|
best = pop.best()
|
|
84
|
-
|
|
97
|
+
net = best.para["brain"].net
|
|
98
|
+
net.reset(full=True)
|
|
99
|
+
|
|
100
|
+
print(
|
|
101
|
+
f"id: {best.id[:6]} "
|
|
102
|
+
f"ms: {best.para["brain"].evo_params.mutation_strength} "
|
|
103
|
+
f"mse: {best.extra_metrics.get("mse", best.fitness):.5} "
|
|
104
|
+
f"acc: {best.extra_metrics.get("accuracy", 0.0):.3%}")
|
|
105
|
+
|
|
106
|
+
# Warmup
|
|
107
|
+
for bit in input_seq[:SEQ_LENGTH]:
|
|
108
|
+
net.calc([bit])
|
|
109
|
+
|
|
110
|
+
# Prediction
|
|
111
|
+
y_preds = [net.calc([bit])[0] for bit in input_seq[SEQ_LENGTH:]]
|
|
112
|
+
|
|
113
|
+
true_bits = target_seq[SEQ_LENGTH:]
|
|
114
|
+
input_bits = input_seq[SEQ_LENGTH:]
|
|
115
|
+
|
|
116
|
+
acc = best.extra_metrics.get("accuracy", 0.0)
|
|
117
|
+
mse = best.extra_metrics.get("mse", best.fitness)
|
|
85
118
|
|
|
86
119
|
plot_bit_prediction(
|
|
87
|
-
true_bits=
|
|
120
|
+
true_bits=true_bits,
|
|
88
121
|
pred_values=y_preds,
|
|
89
|
-
input_bits=
|
|
90
|
-
title=
|
|
122
|
+
input_bits=input_bits,
|
|
123
|
+
title=(
|
|
124
|
+
f"Bit Prediction (gen={pop.generation_num}, "
|
|
125
|
+
f"MSE={mse:.5f}, Acc={acc:.3%})"
|
|
126
|
+
),
|
|
91
127
|
save_path=f"{FRAME_FOLDER}/gen_{pop.generation_num:03d}.png",
|
|
92
128
|
)
|
|
93
|
-
|
|
129
|
+
|
|
130
|
+
best = pop.best()
|
|
94
131
|
best.para["brain"].net.print_graph("test.png",fillcolors_on=True)
|
|
95
132
|
|
|
96
133
|
|
|
134
|
+
input_seq = lfsr_sequence(SEQ_LENGTH) * 2
|
|
135
|
+
target_seq = input_seq[1:] + [input_seq[0]]
|
|
136
|
+
|
|
137
|
+
|
|
97
138
|
if __name__ == "__main__":
|
|
98
139
|
pop = Population(CONFIG_FILE, fitness_function=fitness_bitseq)
|
|
99
140
|
pop.run(verbosity=1, on_generation_end=save_plot)
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "evolib"
|
|
7
|
-
version = "0.2.0b2.
|
|
7
|
+
version = "0.2.0b2.dev4"
|
|
8
8
|
description = "A modular framework for evolutionary strategies and neuroevolution."
|
|
9
9
|
authors = [
|
|
10
10
|
{ name = "EvoLib", email = "evolib@dismail.de" }
|