Skip to main content

Python implementation of optimization test functions for benchmarking

Project description

pyOptiGTest

Python 3.9+ License: MIT

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 Laurentluc.laurent@lecnam.net

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyoptigtest-0.1.0.tar.gz (88.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyoptigtest-0.1.0-py3-none-any.whl (277.1 kB view details)

Uploaded Python 3

File details

Details for the file pyoptigtest-0.1.0.tar.gz.

File metadata

  • Download URL: pyoptigtest-0.1.0.tar.gz
  • Upload date:
  • Size: 88.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: Hatch/1.16.5 cpython/3.13.7 HTTPX/0.28.1

File hashes

Hashes for pyoptigtest-0.1.0.tar.gz
Algorithm Hash digest
SHA256 f1338f995dba4df90bcd7251be3ed044d45831de6351af463aa9c5096e1ad65e
MD5 986c1d80ca124ebe0106f0519a40a42a
BLAKE2b-256 f5e63eb799c3a51894df4173d91d4609069fb151f402184deb3e80ae9025d701

See more details on using hashes here.

File details

Details for the file pyoptigtest-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: pyoptigtest-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 277.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: Hatch/1.16.5 cpython/3.13.7 HTTPX/0.28.1

File hashes

Hashes for pyoptigtest-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b0211f387db385b064dc61065615caa8a035705eff3f1d58c0ad65851d0ebfb4
MD5 1b3e3dfd25f73851184b0af13d3321d6
BLAKE2b-256 03c9d7712f3e00e66e0882956f872a823c5f0ced013d7018d600bdffdb597a3e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page