Skip to content

Source code for the ICLR2026 paper titled "Sampling-based Pareto Front Refinement via Efficient Adaptive Diffusion"

License

Notifications You must be signed in to change notification settings

safe-autonomous-systems/moo-spread

Repository files navigation


PyPI version Documentation

[ICLR 2026] SPREAD: Sampling-based Pareto front Refinement via Efficient Adaptive Diffusion

SPREAD is a novel sampling-based approach for multi-objective optimization that leverages diffusion models to efficiently refine and generate well-spread Pareto front approximations. It combines the expressiveness of diffusion models with multi-objective optimization principles to achieve both high convergence to the Pareto front and excellent diversity across the objective space. SPREAD demonstrates competitive performance against state-of-the-art methods while providing a flexible framework for different optimization contexts.

🚀 Getting Started

Installation

conda create -n moospread python=3.11
conda activate moospread
pip install moospread

Or, to install the latest code from GitHub:

conda create -n moospread python=3.11
conda activate moospread
git clone https://github.com/safe-autonomous-systems/moo-spread.git
cd moo-spread
pip install -e .

Basic usage

This example shows how to solve a standard multi-objective optimization benchmark (ZDT2) using the SPREAD solver.

import numpy as np
import torch

# Import the SPREAD solver
from moospread import SPREAD

# Import a test problem
from moospread.tasks import ZDT2

# Define the problem
problem = ZDT2(n_var=30)

# Initialize the SPREAD solver
solver = SPREAD(
    problem,
    data_size=10000,
    timesteps=1000,
    num_epochs=1000,
    train_tol=100,
    mode="online",
    seed=2026,
    verbose=True
)

# Solve the problem
res_x, res_y = solver.solve(
    num_points_sample=200,
    iterative_plot=True,
    plot_period=10,
    max_backtracks=25,
    save_results=True,
    samples_store_path="./samples_dir/",
    images_store_path="./images_dir/"
)

This will train a diffusion-based multi-objective solver, approximate the Pareto front of the ZDT2 problem, and store generated samples and plots in the specified directories.


📚 Next steps

For more advanced examples (offline mode, mobo mode, tutorials), see the full documentation.

🔬 Experiments

All experiment code is contained in the /experiments directory:

  • Online setting: /experiments/spread/
  • Offline setting: /experiments/spread_offline/
  • Bayesian setting: /experiments/spread_bayesian/

The following Jupyter notebooks reproduce the plots shown in our paper:

  • /experiments/spread/notebook_online_spread.ipynb
  • /experiments/spread_bayesian/notebook_bayesian_spread.ipynb

Environment Setup

Each experiment setting comes with its own environment file located in the corresponding folder:

  • Online setting: experiments/spread/spread.yml
  • Offline setting: experiments/spread_offline/spread_off.yml
  • Bayesian setting: experiments/spread_bayesian/spread_bay.yml

To create the environment for a given setting, run:

conda env create -f experiments/<folder>/<env_name>.yml
conda activate <env_name>

For example, to run the online experiments:

conda env create -f experiments/spread/spread.yml
conda activate spread

The offline experiments require installing Off-MOO-Bench from the authors’ public repository: https://github.com/lamda-bbo/offline-moo. The datasets should be downloaded into the folder: experiments/spread_offline/offline_moo/data/.

📃 Citation

If you find moospread useful in your research, please consider citing:

@inproceedings{
  hotegni2026spread,
  title={{SPREAD}: Sampling-based Pareto front Refinement via Efficient Adaptive Diffusion},
  author={Hotegni, Sedjro Salomon and Peitz, Sebastian},
  booktitle={The Fourteenth International Conference on Learning Representations},
  year={2026},
  url={https://openreview.net/forum?id=4731mIqv89}
}