From 146484d5bfb953e021dc6f65724c7dfce59e3e49 Mon Sep 17 00:00:00 2001 From: Pierre Delaunay Date: Mon, 28 Nov 2022 12:48:55 -0500 Subject: [PATCH] Fix #1018 --- src/orion/algo/space/configspace.py | 39 ++++++++++++++++++------ tests/unittests/algo/test_configspace.py | 18 +++++++---- 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/src/orion/algo/space/configspace.py b/src/orion/algo/space/configspace.py index f36980490..5ea91812d 100644 --- a/src/orion/algo/space/configspace.py +++ b/src/orion/algo/space/configspace.py @@ -71,12 +71,19 @@ def dimension(self, dim: Dimension) -> None: def real(self, dim: Real) -> FloatHyperparameter: """Convert a real dimension into a configspace equivalent""" if dim.prior_name in ("reciprocal", "uniform"): - a, b = dim._args + + # NB: scipy uniform [loc, scale], configspace [min, max] with max = loc + scale, loc = min + if dim.prior_name == "uniform": + loc, scale = dim._args + lower = loc + upper = loc + scale + else: + lower, upper = dim._args return UniformFloatHyperparameter( name=dim.name, - lower=a, - upper=b, + lower=lower, + upper=upper, default_value=dim.default_value, q=_qantization(dim), log=dim.prior_name == "reciprocal", @@ -102,13 +109,19 @@ def real(self, dim: Real) -> FloatHyperparameter: def integer(self, dim: Integer) -> IntegerHyperparameter: """Convert a integer dimension into a configspace equivalent""" + if dim.prior_name in ("int_uniform", "int_reciprocal"): - a, b = dim._args + if dim.prior_name == "int_uniform": + loc, scale = dim._args + lower = loc + upper = loc + scale + else: + lower, upper = dim._args return UniformIntegerHyperparameter( name=dim.name, - lower=a, - upper=b, + lower=lower, + upper=upper, default_value=dim.default_value, q=_qantization(dim), log=dim.prior_name == "int_reciprocal", @@ -203,12 +216,18 @@ def _from_uniform(dim: Hyperparameter) -> Integer | Real: else: kwargs["precision"] = int(-log10(dim.q)) if dim.q else 4 - dist = "uniform" - args.append(dim.lower) - args.append(dim.upper) - if dim.log: dist = "reciprocal" + args.append(dim.lower) + args.append(dim.upper) + else: + # NB: scipy uniform [loc, scale], configspace [min, max] with max = loc + scale, loc = min + loc = dim.lower + scale = dim.upper - dim.lower + + dist = "uniform" + args.append(loc) + args.append(scale) return klass(dim.name, dist, *args, **kwargs) diff --git a/tests/unittests/algo/test_configspace.py b/tests/unittests/algo/test_configspace.py index b3084d758..a4055657a 100644 --- a/tests/unittests/algo/test_configspace.py +++ b/tests/unittests/algo/test_configspace.py @@ -10,15 +10,21 @@ def test_orion_configspace(): space = Space() + # NB: scipy uniform [loc, scale], configspace [min, max] with max = loc + scale, loc = min + def uniform(type, name, low, high, **kwargs): + return type(name, "uniform", low, high - low, **kwargs) + space.register(Integer("r1i", "reciprocal", 1, 6)) - space.register(Integer("u1i", "uniform", -3, 6)) - space.register(Integer("u2i", "uniform", -3, 6)) - space.register(Integer("u3i", "uniform", -3, 6, default_value=2)) + space.register(uniform(Integer, "u1i", -3, 6)) + space.register(uniform(Integer, "u2i", -3, 6)) + space.register(uniform(Integer, "u4i", -4, 0, default_value=-1)) + space.register(uniform(Integer, "u3i", -3, 6, default_value=2)) space.register(Real("r1f", "reciprocal", 1, 6)) - space.register(Real("u1f", "uniform", -3, 6)) - space.register(Real("u2f", "uniform", -3, 6)) - space.register(Real("name.u2f", "uniform", -3, 6)) + space.register(uniform(Real, "u1f", -3, 6)) + space.register(uniform(Real, "u2f", -3, 6)) + space.register(uniform(Real, "u4f", -4, 0, default_value=-0.2)) + space.register(uniform(Real, "name.u2f", -3, 6)) space.register(Categorical("c1", ("asdfa", 2))) space.register(Categorical("c2", dict(a=0.2, b=0.8)))