Figure adapted from Navarro-Brul et al., React. Chem. Eng., 2022
The Design of Experiments is the theory of conceiving the optimal set of trials for model-testing experimentation. DOE packages may have 4 different capabilities:
- Generation of the design, e.g., generating factorial designs, latin hypercube, etc., upon the user request
- Analysis of the design, e.g., the ability of comparing the sampling optimality of different designs for the model hypothesis, evaluating the aliasing of factors, etc.
- Analysis of the response, e.g., the ability of testing the model and fitting the coefficients. Most of open-source DOE packages lack this ability, relying on well-established statistic packages such as statsmodels and scikit-learn.
- Design augmentation, which is the typical pipeline of Active Learning (or Bayesian Optimization), using the response of the early trials to suggest a new set of trials that are a promising compromise between exploitation and exploration toward an optimum goal.
In the following we list a number of open-source packages that focus on the generation and analysis of designs.
Don't hesitate to open an issue to report any package (with a reasonable users base) that is missing from this list
These statistics are refreshed automatically on the first day of every month. First and last commit dates and commit counts use each repository's default branch. Contributor counts include anonymous contributors reported by GitHub. Lines of code exclude blanks and comments.
Last refreshed: 2026-08-01
| Package | Stars | First Commit | Last Commit | Commits | Lines of code | Contributors |
|---|---|---|---|---|---|---|
| PyDOE | 328 | 2013-08-27 | 2026-07-29 | 185 | 13,737 | 12 |
| DOEPY | 166 | 2019-07-21 | 2020-09-25 | 56 | 7,943 | 2 |
| dexpy | 31 | 2016-09-17 | 2018-06-17 | 247 | 6,549 | 2 |
| diversipy | 9 | 2020-02-19 | 2020-03-09 | 39 | 1,709 | 1 |
| Definitive Screening Design | 14 | 2022-05-10 | 2026-07-25 | 53 | 1,871 | 3 |
| pyLHD | 1 | 2021-08-12 | 2024-03-21 | 88 | 72,747 | 1 |
| BoFire | 399 | 2022-10-06 | 2026-07-31 | 689 | 64,330 | 41 |
| OApackage | 39 | 2015-01-29 | 2026-02-04 | 959 | 128,482 | 7 |
| PyOptEx | 23 | 2023-11-09 | 2026-06-10 | 341 | 24,512 | 6 |
| Pyomo.DoE | 2,495 | 2014-10-09 | 2026-07-13 | 31,310 | 431,740 | 201 |
| OpenTURNS | 340 | 2015-08-14 | 2026-07-30 | 7,780 | 569,041 | 49 |
| SciPy QMC | 14,872 | 2001-02-01 | 2026-07-31 | 37,989 | 664,676 | 1,953 |
| Pyro OED | 9,032 | 2017-06-16 | 2026-07-10 | 2,516 | 100,342 | 163 |
| OpenMDAO DOE Driver | 761 | 2016-09-20 | 2026-07-17 | 20,871 | 196,186 | 86 |
| IDAES PySMO Sampling | 332 | 2018-12-11 | 2026-07-23 | 9,488 | 620,479 | 106 |
| SALib | 997 | 2013-04-02 | 2026-07-17 | 2,074 | 65,885 | 58 |
| SMT | 903 | 2016-11-08 | 2026-06-22 | 1,665 | 136,013 | 43 |
| UQpy | 361 | 2017-12-01 | 2025-08-19 | 3,058 | 33,252 | 24 |
| DoEgen | 102 | 2020-11-17 | 2025-04-24 | 80 | 4,386 | 4 |
This section contains packages whose primary purpose, or a substantial standalone part of their public API, is the generation and analysis of experimental designs.
An actively maintained collection of classical, optimal, space-filling, mixture,
screening, and sequential designs. This is the successor to the older pyDOE2
fork previously linked here.
- Factorial designs:
fullfact(),ff2n(),fracfact(),fracfact_by_res(),fracfact_opt(),pbdesign(),gsd(),fold(),john_three_quarter_design(),block_full_factorial() - Latin-square designs:
latin_square(),graeco_latin_square(),hyper_graeco_latin_square() - Mixture designs:
simplex_lattice_design(),simplex_centroid_design(),mixture_axial_design(),extreme_vertices_design(),mixture_process_design() - Response-surface designs:
bbdesign(),ccdesign(),doehlert_shell_design(),doehlert_simplex_design(),star(),block_ccdesign(),small_composite_design() - Space-filling designs:
lhs(),oa_lhd(),sliced_lhs(),nested_lhs(),maximin_design(),minimax_design(),maxpro_design(),nearly_orthogonal_lhs() - Low-discrepancy sequences:
sobol_sequence(),halton_sequence(),hammersley_sequence(),rank1_lattice(),korobov_sequence(),faure_sequence(),niederreiter_sequence() - Sensitivity and robust designs:
morris_sampling(),saltelli_sampling(),taguchi_design(),definitive_screening_design(),supersaturated_design() - Optimal designs:
optimal_design()witha_optimality(),c_optimality(),d_optimality(),e_optimality(),g_optimality(),i_optimality(),s_optimality(),t_optimality(), andv_optimality()criteria; search algorithms includefedorov(),modified_fedorov(),detmax(), andsequential_dykstra() - Sequential designs:
sequential_design(),expected_improvement(),probability_of_improvement(),upper_confidence_bound()
Another collection of "classical" design of experiments.
- Full factorial:
build.full_fact() - 2-level fractional factorial:
build.frac_fact_res() - Plackett-Burman:
build.plackett_burman() - Sukharev grid:
build.sukharev() - Box-Behnken:
build.box_behnken() - Box-Wilson (Central-composite)
- with center-faced option:
build.central_composite()withface='ccf'option - with center-inscribed option:
build.central_composite()withface='cci'option - with center-circumscribed option:
build.central_composite()withface='ccc'option
- with center-faced option:
- Latin hypercube (simple):
build.lhs() - Latin hypercube (space-filling):
build.space_filling_lhs() - Random k-means cluster:
build.random_k_means() - Maximin reconstruction:
build.maximin() - Halton sequence based:
build.halton() - Uniform random matrix:
build.uniform_random()
Yet another collection of "classical" design of experiments.
- Fractional Factorial:
build_factorial(factor_count, run_count) - Full Factorial:
build_full_factorial(factor_count) - Central Composite:
build_ccd(factor_count, alpha='rotatable', center_points=1) - Mixture Simplex Lattice:
build_simplex_lattice(factor_count, model_order=<ModelOrder.quadratic: 2>) - Mixture Simplex Centroid:
build_simplex_centroid(factor_count) - Optimal Designs:
build_optimal(factor_count, **kwargs)
Analysis of the design:
- Statistical Power:
f_power(model, design, effect_size, alpha) - Alias list:
alias_list(model, design)
Collection of algorithms for uniform sampling, and related topics.
cube- Uniform sampling from the unit hypercubecube.stratify_conventional: stratification of the unit hypercubestratify_generalized: generalized stratification of the unit hypercubecube.latin_design: generate a random latin hypercube design matrixcube.improved_latin_design: generate an ‘improved’ latin hypercube design matrixcube.rank1_design: design matrix for a rank-1 latticecube.sample_halton: generate a Halton point setcube.sample_maximin: maximize the minimal distance in the unit hypercube with extensionscube.sample_k_means: in its default setup, this algorithm converges to a centroidal Voronoi tesselation of the unit hypercubecube.grid: create conventional grid in the unit hypercube
simplex- Uniform sampling on the unit simplexpolytope- Uniform sampling from convex polytopessubset- Select diverse subsetssubset.psa_partition: partition the data set into the given number of clusters with the part-and-select algorithmsubset.psa_select: select representatives points with the part-and-select algorithmsubset.select_greedy_maximin: greedily select a subset according to maximin criterionsubset.select_greedy_maxisum: greedily select a subset according to maxisum criterion.
Analysis of the design:
indicator.solow_polasky_diversity: Solow-Polasky diversityindicator.weitzman_diversity: Weitzman diversityindicator.sum_of_dists: square root of the sum of all pairwise distancesindicator.average_inverse_dist: average inverse distanceindicator.separation_dist: minimal pairwise distanceindicator.wmh_index: quality index of Wahl, Mercadier, and Helbertindicator.sum_of_nn_dists: sum of nearest-neighbor distancesindicator.unanchored_L2_discrepancy: unanchored L2 discrepancy
Definitive Screening Design - GitHub
Implementation of the DSD in python: a small design aimed to screen all factors for second order models.
dsd.generate(n_num, n_cat, factors_dict=None, method='dsd', min_13=True, n_fake_factors=0)
Analysis of the design:
dsd.analysis.get_map_of_correlations(X, effects)
Package focused on the Latin Hypercube Design (LHD), to generate and analyze several variants of this design.
- Classical latin hypercube:
pyLHD.LatinHypercube(size, seed, scramble)
Analysis of the design:
Average Absolute Correlation, Maximum Absolute Correlation, Maximum Projection Criterion (Joseph 2015), Coverage measure, Inter-site Distance, Discrepancy, MaxiMin, Mesh Ratio, Phi_p Criterion.
BoFire is a Bayesian Optimization Framework Intended for Real Experiments. It contains nice features to generate a DoE when starting from scratch.
- D-, A-, G-, E-, K- optimization in a constrained design space
- Space filling in a constrained design space
Analysis of the design:
bofire.utils.doe.get_confounding_matrix()
The Orthogonal Array package contains functionality to generate and analyse orthogonal arrays, optimal designs and conference designs.
- Generate (
oapackage.arraydata_t()) and extend (oapackage.extend_array()) orthogonal arrays - Conference designs (
oapackage.conference_t()) - D-Efficient optimized design (
oapackage.Doptimize())
Analysis of the design:
- D-, Ds-, A-, E- efficiency of the design (
.Defficiency(),.DsEfficiency(),.Aefficiency(),.Eefficiency())
Package for model-based optimal experimental design with continuous, categorical, mixture, constrained, blocked, split-plot, strip-plot, and staggered-level experiments.
- Fixed-structure designs:
create_fixed_structure_design()withFactor,RandomEffect,create_parameters(), anddefault_fn() - Split-(k)-plot designs:
create_splitk_plot_design()with thePlotrandomization structure - Cost-optimal CODEX designs:
create_cost_optimal_codex_design(), which jointly optimizes the run count, run order, and factor transitions against a user-defined resource budget - Optimality criteria:
Dopt(),Aopt(), andIopt(); custom metrics and linear models are also supported - Design constraints and augmentation: factor-level constraints, custom categorical encodings, discrete numerical factors, covariates, Bayesian variance ratios, and prior designs
Analysis of the design:
evaluate_metrics(),estimation_variance(),plot_fraction_of_design_space(),plot_estimation_variance_matrix(),design_heatmap(), andplot_correlation_map()- Response analysis and model selection, including simulated annealing model selection (SAMS)
Model-based design of experiments integrated with Pyomo. It constructs and optimizes Fisher information matrices (FIMs) for algebraic and dynamic models, including models expressed with differential-algebraic equations.
- Main interface:
pyomo.contrib.doe.doe.DesignOfExperiments - Build and solve a design:
create_doe_model()andrun_doe() - Compute information:
compute_FIM()andget_FIM() - Explore a design grid:
compute_FIM_full_factorial()anddraw_factorial_figure() - Multiple experiments:
run_multi_doe_sequential()andrun_multi_doe_simultaneous() - Sequential information updates:
update_FIM_prior() - Available objectives through
objective_option:determinant(D-optimality),trace(A-optimality),pseudo_trace(pseudo-A-optimality),minimum_eigenvalue(E-optimality), andcondition_number(modified E-optimality)
Analysis of the design:
get_sensitivity_matrix(),get_experiment_input_values(),get_experiment_output_values(),get_measurement_error_values(), andget_unknown_parameter_values()
Uncertainty-quantification platform implemented in C++ with a comprehensive Python API for deterministic, randomized, space-filling, and sequential experimental designs.
- Classical designs:
Axial,Factorial,Composite, andBox - Randomized designs:
LHSExperiment,MonteCarloExperiment,BootstrapExperiment, andImportanceSamplingExperiment - Deterministic and quadrature designs:
FixedExperiment,GaussProductExperiment,TensorProductExperiment,SmolyakExperiment, andexperimental.FejerExperiment - Low-discrepancy designs:
LowDiscrepancyExperimentwithFaureSequence,HaltonSequence,ReverseHaltonSequence,HaselgroveSequence, orSobolSequence - Optimized Latin hypercubes:
MonteCarloLHSandSimulatedAnnealingLHS - Sequential designs:
experimental.SequentialSamplingAlgorithmandexperimental.LOLAVoronoi
Analysis of the design:
- Space-filling criteria:
SpaceFillingC2,SpaceFillingMinDist, andSpaceFillingPhiP - Optimized-LHS results are exposed through
LHSResult
The scipy.stats.qmc submodule provides mature, high-performance
space-filling and quasi-Monte Carlo designs.
- Sampling engines:
qmc.Sobol,qmc.Halton,qmc.LatinHypercube, andqmc.PoissonDisk - Distribution-specific engines:
qmc.MultinomialQMCandqmc.MultivariateNormalQMC qmc.LatinHypercubesupports ordinary and strength-2 orthogonal-array-based LHS designs, plusrandom-cdandlloydpost-optimization- Generate or extend designs with
random(),random_base2(),fast_forward(), andreset()on the relevantQMCEngine
Analysis of the design:
qmc.discrepancy(),qmc.geometric_discrepancy(), andqmc.update_discrepancy()qmc.scale()maps unit-hypercube samples to and from physical bounds
The packages below are included because they expose a substantial, explicit Python API for experimental design. They are not all standalone, general-purpose DOE packages: some are probabilistic-programming, engineering, sensitivity, surrogate-modeling, or uncertainty-quantification frameworks. Their repository statistics therefore describe the host project rather than adoption of the DOE submodule alone.
The dedicated pyro.contrib.oed module implements Bayesian optimal
experimental design for arbitrary Pyro probabilistic models. It is included for
its explicit DOE API, not for generic Bayesian optimization.
- Laplace expected information gain:
laplace_eig() - Nested Monte Carlo EIG:
nmc_eig() - Variational and posterior estimators:
posterior_eig()and the deprecated compatibility functionvi_eig() - Neural lower-bound estimators:
donsker_varadhan_eig(),marginal_eig(), andlfire_eig() - Variational nested Monte Carlo:
vnmc_eig() - Designs can be evaluated individually or batched as tensors to select the candidate with the highest expected information gain
Engineering design and multidisciplinary optimization framework whose
DOEDriver executes an OpenMDAO model over cases produced by interchangeable
DOE generators.
- Model execution:
DOEDriver(generator=...) - Random sampling:
UniformGenerator() - Classical designs:
FullFactorialGenerator(),PlackettBurmanGenerator(), andBoxBehnkenGenerator() - Space-filling designs:
LatinHypercubeGenerator()with random, centered, maximin, center-maximin, or correlation criteria - Reduced multilevel factorial designs:
GeneralizedSubsetGenerator(levels, reduction, n) - Existing designs:
ListGenerator()andCSVGenerator() - Cases may be distributed across processors using the driver's
run_parallelandprocs_per_modeloptions
One-shot sampling tools from the IDAES Process Systems Engineering framework, primarily intended to create training and validation sets for surrogate models.
- Latin hypercube:
LatinHypercubeSampling - Full factorial:
UniformSampling - Low-discrepancy sequences:
HaltonSamplingandHammersleySampling - Centroidal Voronoi tessellation:
CVTSampling - User-supplied distributions:
CustomSampling - Each sampler exposes
sample_points()and supports selection from supplied data or generation inside user-provided bounds
Sensitivity-analysis library with sampling plans specifically coupled to global sensitivity methods.
- Sobol/Saltelli designs:
SALib.sample.sobol.sample()and the deprecated compatibility functionSALib.sample.saltelli.sample() - Morris trajectories, including groups and optimized trajectories:
SALib.sample.morris.sample() - Fourier amplitude sensitivity test:
SALib.sample.fast_sampler.sample() - Fractional factorial designs:
SALib.sample.ff.sample() - Derivative-based global sensitivity sampling:
SALib.sample.finite_diff.sample() - Latin hypercube sampling:
SALib.sample.latin.sample() - The fluent
ProblemSpec.sample_*()interface connects generation directly to the matchinganalyze_*()methods
Surrogate Modeling Toolbox with a focused sampling API for computer experiments.
- Uniform random designs:
Random(xlimits=...)(nt) - Full factorial designs:
FullFactorial(xlimits=...)(nt), including dimension weights and optional clipping - Latin hypercube designs:
LHS(xlimits=..., criterion=...)(nt) - LHS criteria:
center,maximin,centermaximin,correlation, and enhanced stochastic evolutionary optimization (ese) - Adapted pyDOE designs:
BoxBehnken,PlackettBurman,Factorial, andGsd, all implementing thePyDoeSamplingMethodinterface
Uncertainty-quantification framework with classical, stratified, simplex, and adaptive sampling algorithms.
- Random sampling:
MonteCarloSampling - Latin hypercubes:
LatinHypercubeSamplingwithRandom,Centered,MaxiMin,MinCorrelation, or a user-definedCriterion - Stratification:
TrueStratifiedSamplingandRefinedStratifiedSampling - Uniform simplex designs:
SimplexSampling - Sequential surrogate-based sampling:
AdaptiveKrigingwith learning functions such asExpectedImprovementandExpectedFeasibility - Active learning for polynomial chaos:
ThetaCriterionPCE - Sampling is executed with
run()and generated points are available throughsamplesand, where applicable,samplesU01
Tool for generating and evaluating optimized mixed-level designs containing numerical and categorical factors, followed by experiment-result analysis.
- Optimize mixed-level designs:
doegen.doegen.optimize_design() - Construct supported high-dimensional orthogonal designs:
doegen.doegen.gen_highD() - Evaluate imported or generated designs:
doegen.doegen.evaluate_design2() - Configuration-driven generation:
python -m doegen.doegen settings_design.yaml - Response analysis:
python -m doegen.doeval settings_expresults.yaml
Analysis of the design:
- Center and level balance, orthogonality, two-way interaction balance and coverage, canonical correlations, and D-, D1-, D2-, A-, A1-, and A2-efficiency
- Automatic minimum, optimal, and best run-count suggestions
- Factor importance, response correlations, pairwise response maps, RMSE, and ranking of the best observed parameter combinations
These projects implement relevant DOE ideas but were not added to the main package statistics because they do not yet meet the same combined standard for adoption, packaging, documentation, and continuous testing. They are recorded here so they can be reassessed as they mature.
- discopt-doe — a promising JAX plugin with classical, model-based optimal, model-discrimination, and sequential designs. It was first released in July 2026 and currently has almost no independent adoption history.
- MIDDoE — an active, peer-reviewed model-identification and model-discrimination DOE package. Its user base is still very small, its documentation remains limited, and no continuous test workflow was found.
- PyOED — a broad scientific OED framework covering Fisher-information criteria, expected information gain, sensor placement, inverse problems, and data assimilation. It currently lacks a PyPI distribution and a visible continuous-integration pipeline, which makes installation and verification less accessible than the included packages.