Skip to content

Possible numerical underflow during quantization of log sampled UniformFloat #186

Closed
@NeoChaos12

Description

@NeoChaos12

I noticed that in the case of UniformFloatHyperparameter types that have log-sampling enabled, there is a possible numerical underflow issue with using a quantization factor. To illustrate this, consider the following minimum working example:

import ConfigSpace as CS
p = CS.UniformFloatHyperparameter("param", 0.0001, 1.0, log=True, q=0.0001)

:1: RuntimeWarning: invalid value encountered in log

space = CS.ConfigurationSpace("sp1")
space.add_hyperparameter(p)

Traceback (most recent call last):
File "", line 1, in
File "ConfigSpace/configuration_space.pyx", line 186, in ConfigSpace.configuration_space.ConfigurationSpace.add_hyperparameter
File "ConfigSpace/configuration_space.pyx", line 1062, in ConfigSpace.configuration_space.ConfigurationSpace._check_default_configuration
File "ConfigSpace/configuration_space.pyx", line 1427, in ConfigSpace.configuration_space.Configuration.init
File "ConfigSpace/configuration_space.pyx", line 1457, in ConfigSpace.configuration_space.Configuration.is_valid_configuration
File "ConfigSpace/c_util.pyx", line 38, in ConfigSpace.c_util.check_configuration
File "ConfigSpace/c_util.pyx", line 103, in ConfigSpace.c_util.check_configuration
ValueError: Active hyperparameter 'param' not specified!

More cases that fail:

p = CS.UniformFloatHyperparameter("param", 0.0001, 1.0, log=True, q=0.00001)
:1: RuntimeWarning: invalid value encountered in log

p = CS.UniformFloatHyperparameter("param", 0.00001, 1.0, log=True, q=0.00001)
:1: RuntimeWarning: invalid value encountered in log

This persists even when the upper bound is smaller, such as here:

p = CS.UniformFloatHyperparameter("param", 0.0001, 0.01, log=True, q=0.0001)
:1: RuntimeWarning: invalid value encountered in log

Reducing the lower bound, however, fixes this. That is, this works fine:

p = CS.UniformFloatHyperparameter("param", 0.001, 1.0, log=True, q=0.0001) # but lower=0.0001 does not!

and removing the quantization factor works fine as well, even for a very small lower bound:

p = CS.UniformFloatHyperparameter("param", 0.00001, 1.0, log=True)

I haven't tested other numerical hyperparameters for similar cases, but it is definitely possible that they will run into similar issues.

My environment information:

OS: Ubuntu 18.04
Python: 3.7
ConfigSpace version: 0.4.19
NumPy version: 1.21.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions