Key Concepts#

This page introduces the core concepts underlying PyOED. It is intended as a bridge between the Getting Started guide and the full API reference.

What is Optimal Experimental Design?#

Optimal Experimental Design (OED) is the problem of choosing where, when, or how to collect data so that the resulting observations are maximally informative. In a model-constrained setting the experiment involves a simulation model that maps parameters (or state) to observable quantities, and the goal is to reduce uncertainty in those parameters.

Formally, the OED problem seeks a design \(\zeta^*\) that optimizes an objective \(\Phi\):

\[\zeta^* = \arg\min_{\zeta \in \mathcal{D}} \; \Phi(\zeta)\]

where \(\mathcal{D}\) is the design space and \(\Phi\) is an optimality criterion (or, equivalently, a utility function when maximizing).

Inverse Problems and Data Assimilation#

An inverse problem consists of recovering model parameters (or state) from noisy, indirect observations. In PyOED the inverse-problem hierarchy is:

  • InverseProblem – abstract base.

  • Filter – time-independent (single observation): Kalman filter, 3D-Var, EnKF.

  • Smoother – time-dependent (multiple observations): 4D-Var, Kalman smoother.

Each inverse problem registers a simulation model, observation operator, error models (prior and observation noise), and observational data.

Design Variables#

A design variable \(\zeta\) encodes what the experimenter controls. Common forms include:

  • Binary vector – each entry indicates whether a sensor is active (sensor-placement OED).

  • Continuous vector – weights or relaxation of the binary design.

  • Dictionary of designs – for time-dependent designs with different sensor configurations at each observation time.

Optimality Criteria#

PyOED supports several classical and information-theoretic criteria implemented in pyoed.oed.core.utility_functions:

Criterion

Objective

Interpretation

A-optimal

\(\operatorname{Tr}(\mathbf{A})\)

Minimize average posterior variance

D-optimal

\(\log\det(\mathbf{A})\)

Minimize volume of posterior uncertainty ellipsoid

E-optimal

\(\lambda_{\max}(\mathbf{A})\)

Minimize worst-case posterior variance

G-optimal

\(\max_i [\mathbf{A}]_{ii}\)

Minimize maximum prediction variance

where \(\mathbf{A}\) denotes the posterior covariance matrix.

Information-theoretic criteria (expected information gain, KL divergence, Hellinger distance) are also available for Bayesian OED formulations.

Configuration-Driven Objects#

All major PyOED classes follow a configuration-driven pattern:

  1. A *Configs dataclass (inheriting PyOEDConfigs) defines all tuneable parameters with sensible defaults.

  2. The object class (inheriting PyOEDObject) accepts this dataclass (or a plain dict) at construction time.

  3. Configurations can be updated after construction via update_configurations().

This pattern ensures that every object is fully introspectable, validatable, and reconfigurable without re-instantiation.

See Also#

  • Quick Start — hands-on 5-minute OED workflow.

  • Getting Started — step-by-step guide through PyOED components with annotated code.

  • Architecture — module dependencies, data flow, and design-pattern reference for contributors.

  • Glossary — definitions of all key terms used in this page and throughout the documentation.

  • API Reference — complete class and method documentation.