Skip to main content

Tasty front end for PyRibs.

Project description

Software License

BBQ. A Tasty Front-End for PyRibs.

Purpose

BBQ is a collection of scripts designed to reduce the amount of boilerplate needed for setting up new MAP-Elites domains with the PyRibs library without extensive knowledge of PyRibs or MAP-Elites. The core of BBQ is:

  • Domain class: The only python code necessary to write is the optimization domain
  • Configuration: All algorithm settings are stored in a yaml file, allowing easy changes in a central human readable format, and for simpler handling of experiments
  • Visualization: Visualization of key metrics is automatically performed during a run, and visualization functions are provided for more indepth exploration in notebooks.

Installation

NOTE: This is based on pyribs 0.4 -- the current version is 0.5. Many non-backwards compatibile bits have been added (renaming core parameters and such), and lot of functionality that is included here (batch addition, dumping archive) is now in core pyribs. It looks great! When I have time I will move this over and take advantage of all of their hard work.

Supported Python versions are 3.6 or later. Just go in the base directory and:

$ pip install -e .

To make sure everything works:

python tests/rast_test.py

A log directory should be created from this brief run filled with plots, metrics, recorded archives, and the configuration files used in the run.

Workflow

This library provides some ready made recipes for MAP-Elites using the pyRibs library to test out ideas with minimal setup and boilerplate. To get started just:

  1. Define Problem Domain
    • Fitness function (objective)
    • *Descriptor function *(behavior/feature/measure)
    • Expression function: how to go from floats between 0 and 1 to something your fitness and descriptor can evaluate. If the encoding and mutation is more complicated than that an individual can be defined as object instead (see here).
  2. Set Hyperparameters
    • Just edit the .yaml file
  3. Run MAP-Elites
    • archive = map_elites(domain, p, logger)
    • Takes problem domain a hyperparameter dict p, and a logger that handles the results.
  4. Visualize Results

Problem Domains

The simplest definition of domain can be created by defining only a fitness function and a descriptor function. This assumes that all genomes are 0-1 scaled to a predefined range. The output of the expressed genome is saved as metadata. To add other values to the metadata the inherited evaluate parent function will have to be rewritten.

If the hyperparameter for n_workers equal 1 batch evaluation is done with a list comprehension, if greater than 1 a dask instance will be created and used to evaluate in parallel.

An example is here: bbq/examples/rastrigin.py

class Rastrigin(BbqDomain):
    def __init__(self, param_bounds=[-5.12, 5.12], **kwargs):
        self.param_bounds = param_bounds
        BbqDomain.__init__(self, **kwargs)        
    
    def _fitness(self, x):        
        f = 10 * x.shape[0] + (x * x - 10 * np.cos(2 * math.pi * x)).sum()
        return -f + 2*x.shape[0]**2 # Shift to make QD score increasing    
        
    def _desc(self, x):
        return np.array(x[0:2])

    def express(self, x):
        return scale(x, self.param_bounds)

Configuration Files

To speed up running experiments, replicates, and tweaking hyperparameters all settings of an experiment are kept in a human readable configuration file and passed into the code. A sample configuration file looks like this:

task_name: 'rastrigin'

# -- Optimization -- #
n_init: 100
n_gens: 500

# -- Parameters -- #
n_dof: 10             # Dimensions in Rastrigin
param_bounds: [-2, 2] # Overwrite domain default

# -- Archive -- #
archive:
  type: "Grid"
  grid_res: [20,20]
  desc_bounds:
  - [-2, 2]
  - [-2, 2]
  desc_labels:
  - Param 1
  - Param 2  

# -- Emitters -- #
emitters:
  -
    name: "Gaussian1"
    type: "Gauss"
    batch_size: 25
    sigma0: 0.01
  -
    name: "Gaussian2"
    type: "Gauss"
    batch_size: 25
    sigma0: 0.05    


# -- Logging -- #
print_rate: 5  # Print to console
plot_rate: 25  # Plot graphs
save_rate: 50  # Save archive

To run an experiment comparing these settings, the updated fields can be placed in an additional yaml file and loaded to overwrite those fields. Replacing the gaussian emitters with a CMA-ME improvement emitter and a Line emitter in the config/line_cma_mix.yaml file.

# -- Emitters -- #
exp_name: 'line_cma_mix'

emitters:
  -
    name: "CMA-1"
    type: "Cma"
    batch_size: 25
    sigma0: 0.005
  -
    name: "Line1"
    type: "Line"
    batch_size: 25
    iso_sigma: 0.005
    line_sigma: 0.1

Then run python rast_test.py config/line_cma_mix.yaml

Visualization

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bbq-0.2.0.tar.gz (25.5 kB view details)

Uploaded Source

Built Distribution

bbq-0.2.0-py3-none-any.whl (27.9 kB view details)

Uploaded Python 3

File details

Details for the file bbq-0.2.0.tar.gz.

File metadata

  • Download URL: bbq-0.2.0.tar.gz
  • Upload date:
  • Size: 25.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.16

File hashes

Hashes for bbq-0.2.0.tar.gz
Algorithm Hash digest
SHA256 56c39b6335621c69c2289a733bc5c248b5a3a260abc8cd571069a86d7c9231c2
MD5 9b537ce4f6f95c2db6e8d5d4f49bd557
BLAKE2b-256 07dae1c16ada01ed3dbc8c7abeacd0736df3607cd497fe83372ee22c7623b6f3

See more details on using hashes here.

File details

Details for the file bbq-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: bbq-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 27.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.16

File hashes

Hashes for bbq-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 47e0e1d6300603f5a4fc571e7cbd8a297b5d059e496cae81525c0c1b479249b8
MD5 dbc93e3ae8c1c082b411199680b53eb3
BLAKE2b-256 c8715204828dbeca3e73da93f2a0420159ec0dae18498dc10f913ef2659b7c9f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page