# Experiment Design Algorithms¶

## Optimization¶

### ExperimentDesigner - Greedy Risk Minimization Algorithm¶

#### Class Reference¶

class qinfer.ExperimentDesigner(updater, opt_algo=1)[source]

Bases: object

Designs new experiments using the current best information provided by a Bayesian updater.

Parameters: updater (qinfer.smc.SMCUpdater) – A Bayesian updater to design experiments for. opt_algo (OptimizationAlgorithms) – Algorithm to be used to perform local optimization.
new_exp()[source]

Resets this ExperimentDesigner instance and prepares for designing the next experiment.

design_expparams_field(guess, field, cost_scale_k=1.0, disp=False, maxiter=None, maxfun=None, store_guess=False, grad_h=None, cost_mult=False)[source]

Designs a new experiment by varying a single field of a shape (1,) record array and minimizing the objective function

$O(\vec{e}) = r(\vec{e}) + k $$\vec{e}),$ where \(r$$ is the Bayes risk as calculated by the updater, and where $$\$$ is the cost function specified by the model. Here, $$k$$ is a parameter specified to relate the units of the risk and the cost. See Experiment Design Algorithms for more details.

Parameters: guess (Instance of Heuristic, callable or ndarray of dtype expparams_dtype) – Either a record array with a single guess, or a callable function that generates guesses. field (str) – The name of the expparams field to be optimized. All other fields of guess will be held constant. cost_scale_k (float) – A scale parameter $$k$$ relating the Bayes risk to the experiment cost. See Experiment Design Algorithms. disp (bool) – If True, the optimization will print additional information as it proceeds. maxiter (int) – For those optimization algorithms which support it (currently, only CG and NELDER_MEAD), limits the number of optimization iterations used for each guess. maxfun (int) – For those optimization algorithms which support it (currently, only NCG and NELDER_MEAD), limits the number of objective calls that can be made. store_guess (bool) – If True, will compare the outcome of this guess to previous guesses and then either store the optimization of this experiment, or the previous best-known experiment design. grad_h (float) – Step size to use in estimating gradients. Used only if opt_algo is NCG. An array representing the best experiment design found so far for the current experiment.

## Heuristics¶

### Heuristic - Base class for heuristic experiment designers.¶

class qinfer.Heuristic(updater)[source]

Bases: object

Defines a heuristic used for selecting new experiments without explicit optimization of the risk. As an example, the $$t_k = (9/8)^k$$ heuristic discussed by [FGC12] does not make explicit reference to the risk, and so would be appropriate as a Heuristic subclass. In particular, the [FGC12] heuristic is implemented by the ExpSparseHeuristic class.

### ExpSparseHeuristic - Exponentially-sparse time-sampling heuristic.¶

class qinfer.ExpSparseHeuristic(updater, scale=1, base=1.125, t_field=None, other_fields=None)[source]

Bases: qinfer.expdesign.Heuristic

Implements the exponentially-sparse time evolution heuristic of [FGC12], under which $$t_k = A b^k$$, where $$A$$ and $$b$$ are parameters of the heuristic.

Parameters: updater (qinfer.smc.SMCUpdater) – Posterior updater for which experiments should be heuristicly designed. scale (float) – The value of $$A$$, implicitly setting the frequency scale for the problem. base (float) – The base of the exponent; in general, should be closer to 1 for higher-dimensional models. t_field (str) – Name of the expparams field representing time. If None, then the generated expparams are taken to be scalar, and not a record. other_fields (dict) – Values of the other fields to be used in designed experiments.

### PGH - Particle Guess Heuristic¶

class qinfer.PGH(updater, inv_field='x_', t_field='t', inv_func=<function identity>, t_func=<function identity>, maxiters=10, other_fields=None)[source]

Bases: qinfer.expdesign.Heuristic

Implements the particle guess heuristic (PGH) of [WGFC13a], which selects two particles from the current posterior, selects one as an inversion hypothesis and sets the time parameter to be the inverse of the distance between the particles. In this way, the PGH adapts to the current uncertianty without additional simulation resources.

Parameters: updater (qinfer.smc.SMCUpdater) – Posterior updater for which experiments should be heuristicly designed. inv_field (str) – Name of the expparams field corresponding to the inversion hypothesis. t_field (str) – Name of the expparams field corresponding to the evolution time. inv_func (callable) – Function to be applied to modelparameter vectors to produce an inversion field x_. t_func (callable) – Function to be applied to the evolution time to produce a time field t. maxiters (int) – Number of times to try and choose distinct particles before giving up. other_fields (dict) – Values to set for fields not given by the PGH.

Once initialized, a PGH object can be called to generate a new experiment parameter vector:

>>> pgh = PGH(updater)
>>> expparams = pgh()


If the posterior weights are very highly peaked (that is, if the effective sample size is too small, as measured by n_ess), then it may be the case that the two particles chosen by the PGH are identical, such that the time would be determined by 1 / 0. In this case, the PGH class will instead draw new pairs of particles until they are not identical, up to maxiters attempts. If that limit is reached, a RuntimeError will be raised.