Icon for

pyribs: A Bare-Bones Python Library for Quality Diversity Optimization

Bryon Tjanaka
University of Southern California
tjanaka@usc.edu

Matthew C. Fontaine
University of Southern California
mfontain@usc.edu

David H. Lee
University of Southern California
dhlee@usc.edu

Yulun Zhang
Carnegie Mellon University
yulunzhang@cmu.edu

Nivedit Reddy Balam
University of Southern California
nbalam@usc.edu

Nathaniel Dennler
University of Southern California
dennler@usc.edu

Sujay S. Garlanka
University of Southern California
garlanka@usc.edu

Nikitas Dimitri Klapsis
University of Southern California
nklapsis@usc.edu

Stefanos Nikolaidis
University of Southern California
stefanosnikolaidis@gmail.com

Abstract

Recent years have seen a rise in the popularity of quality diversity (QD) optimization, a branch of optimization that seeks to find a collection of diverse, high-performing solutions to a given problem. To grow further, we believe the QD community faces two challenges: developing a framework to represent the field's growing array of algorithms, and implementing that framework in software that supports a range of researchers and practitioners. To address these challenges, we have developed pyribs, a library built on a highly modular conceptual QD framework. By replacing components in the conceptual framework, and hence in pyribs, users can compose algorithms from across the QD literature; equally important, they can identify unexplored algorithm variations. Furthermore, pyribs makes this framework simple, flexible, and accessible, with a user-friendly API supported by extensive documentation and tutorials. This paper overviews the creation of pyribs, focusing on the conceptual framework that it implements and the design principles that have guided the library's development.

Pyribs implements the RIBS framework for QD optimization. The user first ask()'s for solutions from a scheduler. The scheduler selects emitters to ask() for solutions and returns the solutions to the user. After evaluating the solutions, the user tell()'s the results to the scheduler. The scheduler add()'s the solutions to the archive and receives information that it tell()'s to the emitters, enabling the emitters to update their internal search state.