Mesh Adaptive Direct Search (MADS)
Project description
OMADS
MADS: A python implementation for the mesh adaptive direct search (MADS) method; ORTHO-MADS algorithm.
For technical and code documentation, please visit OMADS Webpage.
Version 2.1.0
License & copyright
© Ahmed H. Bayoumy
Citation
If you use this code, please cite it as below.
@software{OMADS_AB,
author = {Bayoumy, A.},
title = {OMADS},
year = 2022,
publisher = {Github},
version = {2.1.0},
url = {https://github.com/Ahmed-Bayoumy/OMADS}
}
How to use OMADS package
After installing the OMADS
package from PYPI website, the functions and classes of OMADS
basic
module can be imported directly to the python script as follows:
from OMADS import *
How to run OMADS from terminal
After installing OMADS
the SEARCH
, POLL
, and MADS
modules can be called directly from a
terminal window under the src directory. The path of the JSON template, which contains the problem input parameters,
should be entered as an input argument to the aforementioned modules call.
python ./OMADS/POLL.py ../../tests/unconstrained/rosenbrock.json
python ./OMADS/SEARCH.py ../../tests/unconstrained/rosenbrock.json
python ./OMADS/MADS.py ../../tests/unconstrained/rosenbrock.json
Input parameters
Input parameters are serialized in a JSON
template using predefined attributes (keywords) under four dictionaries;
evaluator
, param
, options
and search
. Here is a brief description of each dictionary and its key attributes.
evaluator
: in this dictionary, we define the blackbox location and the name of input and output files (if exist)blackbox
: blackbox executable file name, or the function name if this is an internal function defined within the BM_suiteinternal
: the name of the testing category that holds your internal/external test function or blackbox evaluatorcon
: internal constrained single-objective functionuncon
: internal unconctrained single-objective functionexe
: external executable blackbox evaluator
input
: the name of the input file (considered if external executable was defined)output
: the name of the output file (considered if external executable was defined)
param
: problem setupbaseline
: this is the initial starting point (initial design vector)lb
: lower bounds vectorub
: upper bounds vectorvar_names
: list of design variables namevar_types
: list of the variables typeR
: real variableI
: integer variableC_<set name>
: categorical variable. A set name from the sets dict should be added after the underscore that followsC
D_<set name>
: discrete variable. A set name from the sets dict should be added after the underscore that followsD
Sets
: a dictionary where its keys refer to the set name and their value should be assigned to a list of values (the values can be of heterogeneous type)scaling
: scaling factorpost_dir
: the location of the post directory where the results file shall be saved if requestedconstraints_type
: list of the constraints barrier type, i.e., progressive barrier (PB) and extreme barrier (EB)LAMBDA
: list of the initial Lagrangian multipliers assigned to the constraintsRHO
: list of the initial penalty parameterhmax
: the maximum feasibility threshold
options
: algorithmic optionsseed
: the random generator seed that ensures results reproducibility. This should be an integer valuebudget
: the evaluation budget; the maximum number of evaluations for the blackbox definedtol
: the minimum poll size tolerance; the algorithm terminates once the poll size falls below this valuepsize_init
: initial poll sizedisplay
: a boolean for displaying verbose outputs per iteration in the terminal windowopportunistic
: a boolean for enabling opportunistic searchcheck_cache
: a boolean for checking if the current point is a duplicate by checking its hashed address (integer signature)store_cache
: a boolean for saving evaluated designs in the cache memorycollect_y
: currently inactive (to be used when the code is integrated with the PyADMM MDO module)rich_direction
: a boolean that enables capturing a rich set of directions in a generalized patternprecision
: a string character input that controls thedtype
decimal resolution used by the numerical librarynumpy
high
:float128
1e-18medium
:float64
1e-15low
:float32
1e-8
save_results
: a boolean for generating aMADS.csv
file for the output results under the post directorysave_coordinates
: saving poll coordinates (spinners) of each iteration in a JASON dictionary template that can be used for visualizationsave_all_best
: a boolean for saving only incumbent solutionsparallel_mode
: a boolean for parallel computation of the poll set
search
: the search step optionstype
: search type can take one of the following valuesVNS
: variable neighbor searchsampling
: sampling searchBO
: Bayesian optimization (TODO: not published yet as it is still in the testing and BM phase)NM
: Nelder-Mead (TODO: not published yet as it is still in the testing and BM phase)PSO
: particle swarm optimization (TODO: not published yet as it is in the testing phase)CMA-ES
: covariance matrix adaptation evolution strategy (TODO: not published yet as it is in the testing phase)
s_method
: can take one of the following valuesLH
: Latin Hypercube sampling\RS
: random samplingHALTON
: Halton sampling
ns
: number of samples
Benchmarking
To benchmark OMADS
, per se, you need to install the non-linear optimization benchmarking project NOBM
(will be installed automatically when you install OMADS
) from
PYPI. Two benchmarking suits are provided under the BMDFO
package -- BMDFO
stands for
benchmarking derivative-free optimization algorithms. The benchmarking suits have different constrained and
unconstrained optimization problems with various characteristics. The BMDFO
modules can be imported directly
to the python script as shown below:
from BMDFO import toy
For more details about the NOBM
project and its use, check this link.
After running the benchmarking suite using various seed values, which are used to initialize the random number generator,
a BM_report.csv
file will be created in the post directory under the examples
folder.
Example
import OMADS
import numpy as np
def rosen(x, *argv):
x = np.asarray(x)
y = [np.sum(100.0 * (x[1:] - x[:-1] ** 2.0) ** 2.0 + (1 - x[:-1]) ** 2.0,
axis=0), [0]]
return y
eval = {"blackbox": rosen}
param = {"baseline": [-2.0, -2.0],
"lb": [-5, -5],
"ub": [10, 10],
"var_names": ["x1", "x2"],
"scaling": 10.0,
"post_dir": "./post"}
options = {"seed": 0, "budget": 100000, "tol": 1e-12, "display": True}
data = {"evaluator": eval, "param": param, "options":options}
out = {}
# out is a dictionary that will hold output data of the final solution. The out dictionary has three keys: "xmin", "fmin" and "hmin"
out = OMADS.main(data)
Results
--- Run Summary ---
Run completed in 0.0303 seconds
Random numbers generator's seed 0
xmin = [1.0, 1.0]
hmin = 1e-30
fmin = 0.0
#bb_eval = 185
#iteration = 46
nb_success = 4
psize = 9.094947017729282e-13
psize_success = 1.0
psize_max = 2.0
https://github.com/Ahmed-Bayoumy/OMADS/assets/22842095/5dc72c34-4722-4d93-8c84-d17f5595556d
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file OMADS-2401-py3-none-any.whl
.
File metadata
- Download URL: OMADS-2401-py3-none-any.whl
- Upload date:
- Size: 63.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 722fa8aa48127b01b0e73006b5e51a2f3e079037c5b73a891d757c2c5b284417 |
|
MD5 | 008245d74eb3f27b24080e50c705b4fa |
|
BLAKE2b-256 | d81b564ddb743d962f131ed60738656ae091cabdfeae9e5ccb9ea51bf3e28e82 |