Command-Line Interface

The command-line interface enables the user to run target functions which are non-python code. The passed and further called script (using Popen) needs to return a standard output which is then interpreted to perform the optimization process.

Note

In SMAC v2.0, SMAC can not be called from the command-line directly. Instead, the user should use the python interface to call SMAC. The command-line interface is still available in SMAC v1.4.

Call of the Target Function

The following example shows how the script is called:

filename --instance=test --instance_features=test --seed=0 --hyperparameter1=5323

However, as for the python target function, the arguments like instance or budget are depending on which components are used. The hyperparameters are depending on the configuration space. The variable filename could be something like ./path/to/your/script.sh.

We recommend using following code to receive the arguments in a bash script. Please note, that the user is not limited to bash scripts but can also use executables, python scripts or anything else.

Note

Since the script is called wih the filename only, make sure to mark the type of the file (e.g., #!/bin/bash or #!/usr/bin/env python).

Warning

Everytime an instance is passed, also an instance feature in form of a comma-separated list (no spaces) of floats is passed. If no instance feature for the instance is given, an empty list is passed.

#!/bin/bash

# Set arguments first
for argument in "$@"
do
    key=$(echo $argument | cut -f1 -d=)
    value=$(echo $argument | cut -f2 -d=)

    if [[ $key == *"--"* ]]; then
        v="${key/--/}"
        declare $v="${value}"
    fi
done

echo $instance
echo $hyperparameter1

Return of the Target Function

The script must return an stdout (echo or print) in the following form (white-spaces are ignored):

cost=0.5; runtime=0.01; status=SUCCESS; additional_info=test (single-objective)
cost=0.5, 0.4; runtime=0.01; status=SUCCESS; additional_info=test (multi-objective)

All arguments are optional except cost and are separated by a semicolon. The string of the status must match one of the values from StatusType.

Start the Optimization

The optimization will be started by the normal python interface. The only difference is that you need to pass a string as target function instead of a python function.

Warning

Your script needs to have rights to be executed (e.g., update the rights with chmod).

...
smac = BlackBoxFacade(scenario, target_function="./path/to/your/script.sh")
incumbent = smac.optimize()
...