# The GEMSEO concepts¶

## Design space¶

A design space is used to represent the optimization’s unknowns,
a.k.a. design variables. A `DesignSpace`

describes
this design space at a given state, in terms of names, sizes, types, bounds
and current values of the design variables. Variables can easily be added to
the `DesignSpace`

using the `DesignSpace.add_variable()`

method
or removed using the `DesignSpace.remove_variable()`

method. We can also
filter the design variables using the `DesignSpace.filter()`

method.
Getters and setters are also available to get or set the value of a given
variable property. Lastly, an instance of `DesignSpace`

can be stored
in a txt or HDF file.

## Optimization problem¶

The `OptimizationProblem`

class is used to define
the optimization problem from a `DesignSpace`

defining:

Initial guess \(x_0\)

Bounds \(l_b \leq x \leq u_b\)

(Possible vector) objective function is defined as a `MDOFunction`

and set using the `objective`

attribute.
If the optimization problem looks for the maximum of this objective
function, the `OptimizationProblem.change_objective_sign()`

changes
the objective function sign because the optimization drivers seek to
minimize this objective function.

Equality and inequality constraints are also `MDOFunction`

s
provided to the `OptimizationProblem`

by means of its
`OptimizationProblem.add_constraint()`

method.

The `OptimizationProblem`

allows to evaluate the different
functions for a given design parameters vector
(see `OptimizationProblem.evaluate_functions()`

). Note that
this evaluation step relies on an automated scaling of function wrt bounds
so that optimizers and DOE algorithms work with scaled inputs
between 0 and 1 for all variables.
The `OptimizationProblem`

has also a `Database`

storing
the calls to all functions so that no function is called twice
with the same inputs. Concerning the derivatives computation,
the `OptimizationProblem`

automates the generation of finite
differences or complex step wrappers on functions,
when analytical gradient is not available.

Lastly, various getters and setters are available, as well as methods
to export the `Database`

to an HDF file or to a `Dataset`

for future post-processing.

## Driver library¶

A driver library aims to solve an `DriverLib`

using a particular algorithm from a particular family of numerical methods.
This algorithm will be in charge of evaluating the objective and constraints
functions at different points of the design space, using the
`DriverLib.execute()`

method.
The most famous kinds of numerical methods to solve an optimization problem
are optimization algorithms and design of experiments (DOE). A DOE driver
browses the design space agnostically, i.e. without taking into
account the function evaluations. On the contrary, an optimization algorithm
uses this information to make the journey through design space
as relevant as possible in order to reach as soon as possible the optimum.
These families are implemented in `DOELibrary`

and `OptimizationLibrary`

.