Skip to main content

pyOptiGTest

Python 3.9+ License: MIT DOI

A Python library of 282+ classical optimization test functions for benchmarking optimization and metaheuristic algorithms. Includes unconstrained, constrained, and multi-objective problems. All functions support vectorized NumPy evaluation and analytical gradient computation.

Features

  • 282 test functions — Ackley, Beale, Branin, Rosenbrock, Rastrigin, Griewank, Schwefel, Sphere, and many more
  • Analytical gradients — every function provides exact gradient computation via the grad parameter
  • Vectorized evaluation — efficient batch evaluation using NumPy arrays
  • Known global optima — each problem includes reference global minimum values and locations
  • Variable dimensionality — many functions support arbitrary dimensions; fixed-dimension functions are also included
  • Problem types — unconstrained, constrained, and multi-objective problems
  • Lightweight — only depends on NumPy

Installation

pip install pyOptiGTest

Or install from source:

git clone https://github.com/luclaurent/optigtest.git
cd optigtest
pip install .

For testing:

pip install -e ".[test]"

and run

pytest 

or

pytest --pyargs pyOptiGTest

Quick Start

Using the optigtest class

import pyOptiGTest as PO
import numpy as np

# Load a test problem
obj = PO.optigtest('Ackley1', dim=2)

# Get design space bounds
xmin = obj.getXmin()
xmax = obj.getXmax()

# Create evaluation points
X = np.random.uniform(xmin, xmax, size=(100, 2))

# Evaluate the objective function
Z = obj.evalObj(X)

# Access known global minimum
print("Global minimum value:", obj.getGlobZmin())
print("Global minimum location:", obj.getGlobXmin())

Calling functions directly

Each function can also be called directly from the functions submodule:

from pyOptiGTest.functions.funRosenbrock import funRosenbrock
import numpy as np

X = np.array([[1.0, 1.0], [0.0, 0.0], [2.0, 3.0]])

# Function values only
Z = funRosenbrock(X)

# Function values and gradients
Z, dZ = funRosenbrock(X, grad=True)
# Z shape:  (3,)
# dZ shape: (3, 2)

Visualizing a test function

import pyOptiGTest as PO
import numpy as np
import matplotlib.pyplot as plt

obj = PO.optigtest('Ackley1', dim=2)

# Build evaluation grid
x = np.linspace(obj.getXmin()[0], obj.getXmax()[0], 200)
y = np.linspace(obj.getXmin()[1], obj.getXmax()[1], 200)
Xm, Ym = np.meshgrid(x, y)
XX = np.column_stack([Xm.ravel(), Ym.ravel()])

Z = obj.evalObj(XX)
Zm = Z.reshape(Xm.shape)

# Contour plot
plt.contourf(Xm, Ym, Zm, levels=50, cmap='viridis')
plt.colorbar()
plt.title('Ackley1')
plt.xlabel('$x_1$')
plt.ylabel('$x_2$')
plt.show()

Function Interface

All test functions follow a consistent interface:

def funName(X, grad=False):
    """
    Parameters
    ----------
    X : numpy.ndarray
        Input array of shape (n_samples, n_dimensions).
    grad : bool, optional
        If True, also compute and return analytical gradients.

    Returns
    -------
    p : numpy.ndarray
        Function values, shape (n_samples,).
    dp : numpy.ndarray (only if grad=True)
        Gradient array, shape (n_samples, n_dimensions).
    """

optigtest Class API

Method Description
optigtest(namePb, dim=None, X=None) Create a problem instance
evalObj(X, grad=False, num=None) Evaluate objective function(s) at points X
evalCons(X, grad=False, num=None) Evaluate constraint function(s) at points X
checkCons(X) Check constraint feasibility (returns boolean array)
getDesignSpace() Get bounds array of shape (dim, 2)
getXmin() / getXmax() Get lower / upper bounds
getGlobZmin() / getGlobXmin() Get global minimum value / location
getNbObj() / getNbCons() Get number of objectives / constraints
getTypePb() Get problem type (Unconstrained, Constrained, MultiObjective)
setDim(dim) Change problem dimensionality
listPb(pbType=None) List all available problems (optionally filtered by type)
showDetails() Print problem details

Constrained Problems

5 constrained test problems with analytical constraints:

Problem Constraints Known Minimum
RosenbrockCubicLine 2 (<=) 0.0
RosenbrockDisk 1 (<=) 0.0
BirdDisk 1 (<) -106.76
Townsend 1 (<) -2.024
Simionescu 1 (<=) -0.072
from pyOptiGTest.pyOptiGTest import optigtest
import numpy as np

pb = optigtest("Simionescu")
X = np.array([[0.5, 0.5]])
obj = pb.evalObj(X)
cons = pb.evalCons(X)
feasible = pb.checkCons(X)

Multi-Objective Problems

17 multi-objective test problems (BinhKorn, ChakongHaimes, FonsecaFleming, Kursawe, ZDT1–6, Viennet, etc.):

from pyOptiGTest.pyOptiGTest import optigtest
import numpy as np

pb = optigtest("BinhKorn")
X = np.array([[1.0, 1.0]])
results = pb.evalObj(X)  # returns [f1, f2]
feasible = pb.checkCons(X)

See examples.md for detailed usage examples.

Available Functions (selection)

Below is a non-exhaustive list of included test functions (almost complete list can be found here):

Function Dimensions Global Minimum
Ackley (1–4) any 0
Alpine (1–2) any 0
Beale 2 0
Booth 2 0
Branin (1–2) 2 0
Bukin (01–20) 2 varies
Camelback (3-hump, 6-hump) 2 0
Colville 4 0
Cross-in-Tray 2 −2.0626
Dixon-Price any 0
Drop-Wave 2 −1
Easom 2 −1
Egg Holder 2 −959.6407
Goldstein-Price 2 3
Griewank any 0
Hartmann (3, 6) 3, 6 varies
Levy any 0
Michalewicz any varies
Rastrigin any 0
Rosenbrock any 0
Schwefel any 0
Sphere any 0
Styblinski-Tang any varies
... and 250+ more

Running Tests

# Run all tests
pytest tests/

# Run with coverage
pytest --cov=pyOptiGTest --cov-report=term-missing tests/

Project Structure

pyOptiGTest/
├── pyOptiGTest/
│   ├── __init__.py
│   ├── pyOptiGTest.py        # Main optigtest class
│   ├── dbProblems.py          # Problem database
│   ├── dbFunctions.py         # Function registry
│   ├── dbConstrained.py       # Constrained problem definitions
│   ├── dbUnconstrained.py     # Unconstrained problem definitions
│   ├── dbMultiObj.py          # Multi-objective problem definitions
│   └── functions/             # 282 individual test functions
│       ├── funAckley2.py
│       ├── funBeale.py
│       ├── funRosenbrock.py
│       └── ...
├── tests/                     # Test suite
├── pyproject.toml
├── LICENSE
└── README.md

MATLAB/Octave version

A similar MATLAB/Octave toolbox can be found here.

References

This toolbox is inspired by many existing codes and papers

License

This project is licensed under the MIT License — see the LICENSE file for details.

Author

Luc Laurent — luc.laurent@lecnam.net

Metadata

Release files for pyOptiGTest 0.1.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyOptiGTest 0.1.7
File Size Uploaded Provenance
pyoptigtest-0.1.7.tar.gz 88.1 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for pyOptiGTest 0.1.7
File Interpreter ABI Platform
pyoptigtest-0.1.7-py3-none-any.whl Python 3 none any Details

Total release size: 365.2 kB

Release files / pyoptigtest-0.1.7.tar.gz

Download URL pyoptigtest-0.1.7.tar.gz
Size 88.1 kB
Tags Source
SHA-256 checksum
How to use checksums
499225197a59e18a0753e396f51382f390144c2497a55d7bf695a58917750ab5
BLAKE2b-256 checksum
How to use checksums
a018b998018995ba94e9eb74eeeee6b5ea7837731be04ce7981a6ec59b5a947a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 22, 2026.

Transparency log

Release files / pyoptigtest-0.1.7-py3-none-any.whl

Download URL pyoptigtest-0.1.7-py3-none-any.whl
Size 277.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7fe4cbb32af2e1c5a829c24ef7b4ce4f7807f9e94bd4e060e352eddd7ab51353
BLAKE2b-256 checksum
How to use checksums
c9a331c2bf9bcf1c478534f463b9f6afc83029ac25460ea0656fbf412e91c2c1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 22, 2026.

Transparency log

Security for pyOptiGTest 0.1.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for pyoptigtest-0.1.7.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 22, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.7 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page