Skip to content

MDOToolbox

Multi-Disciplinary Optimization with Bayesian Collaborative Frameworks

MDOToolbox is a Python library for solving multi-disciplinary optimization (MDO) problems using hierarchical decomposition and Bayesian optimization. It provides five optimization frameworks, Gaussian Process surrogates, and a suite of built-in benchmark problems for rapid prototyping and research.

Cite Us

@inproceedings{baco2026,
    author      = {Belhafnaoui, Mohamed Ali and Diouane, Youssef},
    title       = {{A Bayesian Algorithm for Collaborative Optimization with Application to Aircraft Design}},
    booktitle   = {{AIAA Aviation 2026}},
    year        = {2026},
    address     = {San-Diego, California},
    month       = jun,
    publisher   = {American Institute of Aeronautics and Astronautics},
    % doi         = {xxx} 
}

Features

  • Multiple MDO frameworks — CO, BACO, ICO, MCO, and ECO for different problem classes
  • Bayesian optimization with Gaussian Process surrogates for expensive black-box functions
  • 7 built-in benchmark problems covering analytical, mechanical, thermal, biomedical, and chemical domains
  • Parallel multi-start acquisition optimization for robust global search
  • Support for constrained and unconstrained optimization

Installation

Basic install:

pip install .

Development install (with test dependencies):

pip install -e ".[test]"

Dependencies: numpy, scipy, smt, joblib

Quick Start

This example solves the classic Sellar benchmark problem using the Bayesian Collaborative Optimization (BACO) framework:

import numpy as np
from mdotoolbox.benchmarking import sellar_problem
from mdotoolbox.frameworks import (
    BayesianCollaborativeOptimization,
    BACOSubsystem,
    BACOSystem,
)

# Load benchmark problem
problem_dict = sellar_problem()

# Build system
subsystems = [BACOSubsystem(**sub) for sub in problem_dict["subsystems"]]
system = BACOSystem(
    problem=problem_dict["system_problem"],
    subsystems=subsystems,
)

# Create and run solver
solver = BayesianCollaborativeOptimization(
    system=system,
    subsystem_optimizer="cobyqa",
    system_optimizer="cobyqa",
    epsilon_J=1e-6,
    epsilon_h=1e-6,
    max_eval=50,
    n_multistart=5,
    n_initial=8,
)

z0 = np.array([5.0, 2.0])
x0 = np.array([1.0])
y0 = np.array([1.0, 1.0])
results = solver.solve(z0, x0, y0)
print(results)

Framework Selection Guide

Framework Description Best For
CO (Collaborative Optimization) Classical bilevel formulation Well-behaved problems; fastest when it works
BACO (Bayesian Collaborative Optimization) CO with GP surrogates Expensive simulations; efficient with function evaluations
ICO (Improved Collaborative Optimization) Enhanced convergence When CO has convergence issues
MCO (Modified Collaborative Optimization) Alternative formulation Experimental problems
ECO (Enhanced Collaborative Optimization) Advanced convergence criteria Best convergence guarantees; slowest but most reliable

Built-in Benchmark Problems

Function Description
sellar_problem() Classic 2-discipline analytical benchmark
scalable_mdo_problem() Configurable scalable problem with adjustable size
speed_reducer_problem() Mechanical engineering design problem
electronic_packaging_problem() Thermal management problem
heart_dipole_problem() Biomedical application
power_converter_problem() Power electronics design
propane_combustion_problem() Chemical process optimization

All benchmark functions return a dictionary with system_problem and subsystems keys, ready to pass into any framework.

Project Structure

src/mdotoolbox/
├── core/           # Base classes (Problem, Function, Constraint, DoE)
├── frameworks/     # CO, BACO, ICO, MCO, ECO implementations
├── benchmarking/   # Built-in test problems
├── optimizers/     # Optimizer wrappers
├── surrogates/     # GP model builders and configurations
└── process/        # Process management utilities

Contributing

See CONTRIBUTING.md for development setup, testing instructions, and contribution guidelines.

License

Apache License Version 2.0 — see LICENSE.md for details.