Create and import custom config

"""How to create a NePS configuration manually which can then be used as imported trial."""

import neps
from pprint import pprint
import logging


# This example space demonstrates all types of parameters available in NePS.
class ExampleSpace(neps.PipelineSpace):
    int1 = neps.IntegerFidelity(1, 10)
    float1 = neps.Float(0.0, 1.0)
    cat1 = neps.Categorical(["a", "b", "c"])
    cat2 = neps.Categorical(["x", "y", float1])
    operation1 = neps.Categorical(
        choices=[
            "option1",
            "option2",
            neps.Operation(
                operator="option3",
                args=(float1, cat1.resample()),
                kwargs={"param1": float1.resample()},
            ),
        ]
    )


if __name__ == "__main__":
    # We create a configuration interactively and receive both
    # the configuration dictionary and a dictionary of the sampled parameters.
    config, pipeline = neps.create_config(ExampleSpace())
    print("Created configuration:")
    pprint(config)

    logging.basicConfig(level=logging.INFO)
    # The created configuration can then be used as an imported trial in NePS optimizers.
    # We demonstrate this with the fictional result of objective_to_minimize = 0.5
    neps.import_trials(
        evaluated_trials=[(config, neps.UserResultDict(objective_to_minimize=0.5))],
        root_directory="results/created_config_example",
        pipeline_space=ExampleSpace(),
        overwrite_root_directory=True,
    )