# Closed-loop optimization

The closed-loop optimization module provides optimization tools that communicate directly with a given experimental apparatus. This is useful for optimization problems where a complete understanding of the quantum system is not available. Instead of building a detailed model of the system, the optimizer uses feedback from the system to converge to low values of a specified cost function.

To run a closed-loop optimization, begin by creating an optimizer using one of the boulderopal.closed_loop.ClosedLoopOptimizer classes. Then if the interface with your experimental apparatus can straightforwardly be defined through a function, you can use boulderopal.closed_loop.optimize to easily set up and run the whole optimization. If you need more flexibility, you can create the iteration loop yourself and use boulderopal.closed_loop.step to take an optimization step at each iteration.

For a quick introduction, see the Find optimal pulses with automated optimization tutorial and the How to automate closed-loop hardware optimization user guide.

## Classes

BoundType | Boundary type for parameter bounds. |

Bounds | A box constraint with which you can define the (inclusive) bounds and their type for each optimizable parameter in your optimization. |

ClosedLoopOptimizer | Abstract class for optimizers used in closed-loop optimization. |

Cmaes | The covariance matrix adaptation evolution strategy (CMA-ES) optimizer. |

GaussianProcess | The Gaussian process optimizer. |

NeuralNetwork | The neural network optimizer. |

Results | Results from evaluating the closed-loop optimization cost function. |

SimulatedAnnealing | The simulated annealing optimizer. |

## Functions

optimize | Run a closed-loop optimization to find a minimum of the given cost function. |

step | Perform a single step in a closed-loop optimization. |