@@ -45,7 +45,7 @@ Limbo (LIbrary for Model-Based Optimization) is an open-source C++11 library for

The implementation of Limbo follows a policy-based design [@alexandrescu2001modern] that leverages C++ templates: this allows it to be highly flexible without the cost induced by classic object-oriented designs [@driesen1996direct] (cost of virtual functions). The regression benchmarks^[<http://www.resibots.eu/limbo/reg_benchmarks.html>] show that the query time of Limbo's Gaussian processes is several orders of magnitude better than the one of GPy (a state-of-the-art Python library for Gaussian processes^[<https://sheffieldml.github.io/GPy/>]) for a similar accuracy (the learning time highly depends on the optimization algorithm chosen to optimize the hyper-parameters). The black-box optimization benchmarks^[<http://www.resibots.eu/limbo/bo_benchmarks.html>] demonstrate that Limbo is about 2 times faster than BayesOpt (a C++ library for data-efficient optimization, [@martinezcantin14a]) for a similar accuracy and data-efficiency. In practice, changing one of the components of the algorithms in Limbo (e.g., changing the acquisition function) usually requires changing only a template definition in the source code. This design allows users to rapidly experiment and test new ideas while keeping the software as fast as specialized code.

Limbo takes advantage of multi-core architectures to parallelize the internal optimization processes (optimization of the acquisition function, optimization of the hyper-parameters of a Gaussian process) and it vectorizes many of the linear algebra operations (via the Eigen 3 library^[<http://eigen.tuxfamily.org/index.php?title=Main_Page>] and optional bindings to Intel's MKL). To keep the library lightweight, most of the optimizers in Limbo are wrappers around external optimization libraries:

Limbo takes advantage of multi-core architectures to parallelize the internal optimization processes (optimization of the acquisition function, optimization of the hyper-parameters of a Gaussian process) and it vectorizes many of the linear algebra operations (via the Eigen 3 library^[<http://eigen.tuxfamily.org/>] and optional bindings to Intel's MKL). To keep the library lightweight, most of the optimizers in Limbo are wrappers around external optimization libraries:

* NLOpt^[<http://ab-initio.mit.edu/nlopt>] (which provides many local, global, gradient-based, gradient-free algorithms)

* libcmaes^[<https://github.com/beniz/libcmaes>] (which provides the Covariance Matrix Adaptation Evolutionary Strategy (CMA-ES), and several variants of it [@hansen1996adapting])