T04 — Multi-Objective BED and Pareto Exploration¶
Goal: Simultaneously optimise Titer and VCD viability as competing objectives, track the Pareto front, and reproduce Fig. 7.
Script: examples/04_multiobjective_bed.py
What the script does¶
Trains a two-output
SingleTaskGPon 16 random initial runs.Computes the Pareto front via
compute_pareto_front(train_Y).Calculates the hypervolume indicator.
Builds a
qNEHVIacquisition using BoTorch’sFastNondominatedPartitioning.Optimises and recommends the next batch.
Plots and saves
fig7_pareto_front.pdf.
Running¶
python examples/04_multiobjective_bed.py
# → fig7_pareto_front.pdf
Key code¶
from perfusio.bed.acquisitions import build_acquisition
from perfusio.bed.pareto import compute_pareto_front, hypervolume
from perfusio.viz.static import fig7_pareto_front
from botorch.utils.multi_objective.box_decompositions.non_dominated import (
FastNondominatedPartitioning,
)
ref_point = torch.zeros(2, dtype=torch.float64)
partitioning = FastNondominatedPartitioning(ref_point=ref_point, Y=train_Y)
acqf = build_acquisition("qNEHVI", gp, ref_point=ref_point, partitioning=partitioning)
mask = compute_pareto_front(train_Y) # shape (N,) boolean
hv = hypervolume(train_Y[mask], ref_point)
Pareto dominance criterion¶
A point \(\mathbf{y}^*\) dominates \(\mathbf{y}\) if:
compute_pareto_front implements this correctly using:
(Y[i] <= Y).all(dim=1) & (Y[i] < Y).any(dim=1)
Multi-objective acquisitions¶
Acquisition |
Notes |
|---|---|
|
Fast; assumes noiseless observations |
|
Handles noisy observations; recommended default |
|
Scalarisation; faster for 3+ objectives |
Next step¶
Proceed to T05 — Transfer Learning Across Cell Lines.