Preliminaries

Organization of the library

pagmo consists of a set of header files and a single compiled library. The headers are collected hierarchically in the pagmo/ subdirectory. There is a global pagmo/pagmo.hpp header which includes the public API in its entirety. In order to reduce compilation times, however, we recommend to include only the header files which are actually needed in your code (e.g., pagmo/problem.hpp, pagmo/algorithms/de.hpp, etc.).

Warning

Do not include headers from the pagmo/detail subdirectory! They contain implementation details which may change from version to version in incompatible ways.

Namespaces

All of pagmo’s public classes and functions are located directly in the pagmo:: namespace. There are no other namespaces in pagmo’s public API.

API and ABI stability

Currently, pagmo guarantees API and ABI stability across patch versions. That is, version x.y.n of the pagmo library is both API and ABI compatible with version x.y.m.

While the binary interface is very likely to change across minor versions (e.g., from 2.11 to 2.12), incompatible API changes between minor versions are less frequent, and they are always explicitly documented in the changelog with the BREAKING tag.

Type erasure

The current incarnation of pagmo eschews traditional object-oriented programming (OOP) techniques in favour of a more modern approach based on type erasure. What does that mean exactly?

A widely-used approach in C++ optimisation libraries is to leverage the language’s OOP facilities in order to allow the users to define their own optimisation problems 1. In practical terms, this means that the definition of an optimisation problem requires the user to write a new class which derives from a “base” optimisation problem class (e.g., see the TNLP class from the Ipopt optimisation library). Pure virtual methods from the base class need then to be implemented in the derived class in order to provide the implementation of the objective function, of its gradient, etc.

Although perfectly valid, the OOP approach has a couple of serious drawbacks:

  • it introduces a tight coupling between the user’s code and the optimisation library’s code,

  • due to the way traditional OOP is implemented in C++, it forces the use of reference semantics (i.e., you have to deal with “pointers to base objects” rather than “regular” objects).

By contrast, in the type erasure approach, there are no inheritance relationships and value semantics are employed. The fundamental idea is that any class can “act as” an optimisation problem as long as it conforms to a pre-determined interface. Specifically, in the case of pagmo, any class that implements a certain set of member functions can be used to represent an optimisation problem.

In pagmo, type erasure is used pervasively not only in the implementation of optimisation problems, but also in the implementation of optimisation algorithms, in the parallelisation strategies, in the migration framework, etc. In the lingo of pagmo, we refer to classes that conform to specific type-erased interfaces as user-defined classes (e.g., user-defined problem, or UDP, user-defined algorithm, or UDA, etc.).

1

In C, where OOP is not natively supported, one can use function pointers to emulate some aspects of OOP.

Compiling the tutorials

The source code of the tutorials can be found in the tutorials/ directory in the pagmo source tree. The tutorials can be compiled by enabling the PAGMO_BUILD_TUTORIALS CMake option (see the installation instructions).