def test_variable_substitution(): """Test that variable substitution works correctly.""" x = variable(name='x', value_type=int) y = variable(name='y', value_type=float) p = as_pp({3: x, x: [y, [y]], y: 4}) # Currently no type-checking. This will fail when we add it and need to be # updated. e = evaluate(p, x='hey', y=5) assert e[3] == 'hey' assert e['hey'] == [5, [5]] assert e[5] == 4
def test_choice(): p = choice(partial(int, 15.5), (15, 4), (3, 2)) assert evaluate(p) == 4 p = choice(variable('x', value_type=['a', 'b', 'c']), ('a', 'b'), ('b', 'c')) assert evaluate(p, x='a') == 'b' assert evaluate(p, x='b') == 'c'
def test_randint(): v = variable('some_random_int', value_type=int, distribution='randint', maximum=5) p = as_pyll(v) assert p.name == 'hyperopt_param' assert p.pos_args[0].obj == 'some_random_int' assert p.pos_args[1].name == 'randint' assert p.pos_args[1].arg['upper'].obj == 6 # upper is not a constant v2 = variable('some_other_int', value_type=int, distribution='randint', maximum=partial(operator.add, 2, 3)) p2 = as_pyll(v2) assert p2.name == 'hyperopt_param' assert p2.pos_args[0].obj == 'some_other_int' assert p2.pos_args[1].name == 'randint' assert p2.pos_args[1].arg['upper'].name == 'add'
def test_uniform_categorical(): p = as_pyll(variable('foo', value_type=[-1, 1, 4])) assert p.name == 'getitem' assert p.pos_args[0].name == 'pos_args' assert p.pos_args[1].name == 'hyperopt_param' assert p.pos_args[1].pos_args[0].name == 'literal' assert p.pos_args[1].pos_args[0].obj == 'foo' assert p.pos_args[1].pos_args[1].name == 'randint' # Make sure this executes and yields a value in the right domain. recursive_set_rng_kwarg(p, np.random) try: values = [rec_eval(p) for _ in xrange(10)] except Exception: assert False assert all(v in [-1, 1, 4] for v in values)
def check_continuous_variable(label, dist_name, **params): v = variable(label, value_type=float, distribution=dist_name, **params) p = as_pyll(v) assert p.name == 'float' # Implementation detail assert p.pos_args[0].name == 'hyperopt_param' assert p.pos_args[0].pos_args[0].obj == label assert p.pos_args[0].pos_args[1].name == dist_name if 'minimum' in params: params['low'] = params['minimum'] del params['minimum'] if 'maximum' in params: params['high'] = params['maximum'] del params['maximum'] for key in params: assert p.pos_args[0].pos_args[1].arg[key].obj == params[key]
def test_uniform_choice(): p = as_pyll(choice(variable('foo', value_type=[7, 9, 11]), (7, 'rst'), (9, 'uvw'), (11, 'xyz'))) assert p.name == 'switch' assert p.pos_args[0].name == 'hyperopt_param' assert p.pos_args[0].pos_args[0].obj == 'foo' assert p.pos_args[0].pos_args[1].name == 'randint' assert p.pos_args[0].pos_args[1].arg['upper'].obj == 3 # Make sure this executes and yields a value in the right domain. recursive_set_rng_kwarg(p, np.random) try: values = [rec_eval(p) for _ in xrange(10)] except Exception: assert False assert all(v in ['rst', 'uvw', 'xyz'] for v in values)
def test_nonuniform_categorical(): p = as_pyll(variable('baz', value_type=[3, 5, 9], distribution='categorical', p=[0.1, 0.4, 0.5])) assert p.name == 'getitem' assert p.pos_args[0].name == 'pos_args' assert p.pos_args[1].name == 'hyperopt_param' assert p.pos_args[1].pos_args[0].name == 'literal' assert p.pos_args[1].pos_args[0].obj == 'baz' assert p.pos_args[1].pos_args[1].name == 'categorical' assert p.pos_args[1].pos_args[1].arg['p'].name == 'pos_args' assert p.pos_args[1].pos_args[1].arg['p'].pos_args[0].obj == 0.1 assert p.pos_args[1].pos_args[1].arg['p'].pos_args[1].obj == 0.4 assert p.pos_args[1].pos_args[1].arg['p'].pos_args[2].obj == 0.5 # Make sure this executes and yields a value in the right domain. recursive_set_rng_kwarg(p, np.random) try: values = [rec_eval(p) for _ in xrange(10)] except Exception: assert False assert all(v in [3, 5, 9] for v in values)
def test_nonuniform_choice(): var = variable('blu', value_type=[2, 4, 8], distribution='categorical', p=[0.2, 0.7, 0.1]) p = as_pyll(choice(var, (2, 'abc'), (4, 'def'), (8, 'ghi'))) assert p.name == 'switch' assert p.pos_args[0].name == 'hyperopt_param' assert p.pos_args[0].pos_args[0].obj == 'blu' assert p.pos_args[0].pos_args[1].name == 'categorical' assert p.pos_args[0].pos_args[1].arg['p'].name == 'pos_args' assert p.pos_args[0].pos_args[1].arg['p'].pos_args[0].obj == 0.2 assert p.pos_args[0].pos_args[1].arg['p'].pos_args[1].obj == 0.7 assert p.pos_args[0].pos_args[1].arg['p'].pos_args[2].obj == 0.1 # Make sure this executes and yields a value in the right domain. recursive_set_rng_kwarg(p, np.random) try: values = [rec_eval(p) for _ in xrange(10)] except Exception: assert False assert all(v in ['abc', 'def', 'ghi'] for v in values)