def test_recursive_set_rng_kwarg(): uniform = scope.uniform a = as_apply([uniform(0, 1), uniform(2, 3)]) rng = np.random.RandomState(234) recursive_set_rng_kwarg(a, rng) print(a) val_a = rec_eval(a) assert 0 < val_a[0] < 1 assert 2 < val_a[1] < 3
def test_clone(): config = config0() config2 = clone(config) nodeset = set(dfs(config)) assert not any(n in nodeset for n in dfs(config2)) foo = recursive_set_rng_kwarg(config, scope.rng_from_seed(5)) r = rec_eval(foo) print r r2 = rec_eval(recursive_set_rng_kwarg(config2, scope.rng_from_seed(5))) print r2 assert r == r2
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 test_vectorize_simple(): N = as_apply(15) p0 = hp_uniform('p0', 0, 1) loss = p0 ** 2 print(loss) expr_idxs = scope.range(N) vh = VectorizeHelper(loss, expr_idxs, build=True) vloss = vh.v_expr full_output = as_apply([vloss, vh.idxs_by_label(), vh.vals_by_label()]) fo2 = replace_repeat_stochastic(full_output) new_vc = recursive_set_rng_kwarg( fo2, as_apply(np.random.RandomState(1)), ) #print new_vc losses, idxs, vals = rec_eval(new_vc) print('losses', losses) print('idxs p0', idxs['p0']) print('vals p0', vals['p0']) p0dct = dict(list(zip(idxs['p0'], vals['p0']))) for ii, li in enumerate(losses): assert p0dct[ii] ** 2 == li
def test_vectorize_multipath(): N = as_apply(15) p0 = hp_uniform('p0', 0, 1) loss = hp_choice('p1', [1, p0, -p0]) ** 2 expr_idxs = scope.range(N) vh = VectorizeHelper(loss, expr_idxs, build=True) vloss = vh.v_expr print(vloss) full_output = as_apply([vloss, vh.idxs_by_label(), vh.vals_by_label()]) new_vc = recursive_set_rng_kwarg( full_output, as_apply(np.random.RandomState(1)), ) losses, idxs, vals = rec_eval(new_vc) print('losses', losses) print('idxs p0', idxs['p0']) print('vals p0', vals['p0']) print('idxs p1', idxs['p1']) print('vals p1', vals['p1']) p0dct = dict(list(zip(idxs['p0'], vals['p0']))) p1dct = dict(list(zip(idxs['p1'], vals['p1']))) for ii, li in enumerate(losses): print(ii, li) if p1dct[ii] != 0: assert li == p0dct[ii] ** 2 else: assert li == 1
def test_vectorize_simple(): N = as_apply(15) p0 = hp_uniform('p0', 0, 1) loss = p0**2 print loss expr_idxs = scope.range(N) vh = VectorizeHelper(loss, expr_idxs, build=True) vloss = vh.v_expr full_output = as_apply([vloss, vh.idxs_by_label(), vh.vals_by_label()]) fo2 = replace_repeat_stochastic(full_output) new_vc = recursive_set_rng_kwarg( fo2, as_apply(np.random.RandomState(1)), ) #print new_vc losses, idxs, vals = rec_eval(new_vc) print 'losses', losses print 'idxs p0', idxs['p0'] print 'vals p0', vals['p0'] p0dct = dict(zip(idxs['p0'], vals['p0'])) for ii, li in enumerate(losses): assert p0dct[ii]**2 == li
def test_vectorize_multipath(): N = as_apply(15) p0 = hp_uniform('p0', 0, 1) loss = hp_choice('p1', [1, p0, -p0])**2 expr_idxs = scope.range(N) vh = VectorizeHelper(loss, expr_idxs, build=True) vloss = vh.v_expr print vloss full_output = as_apply([vloss, vh.idxs_by_label(), vh.vals_by_label()]) new_vc = recursive_set_rng_kwarg( full_output, as_apply(np.random.RandomState(1)), ) losses, idxs, vals = rec_eval(new_vc) print 'losses', losses print 'idxs p0', idxs['p0'] print 'vals p0', vals['p0'] print 'idxs p1', idxs['p1'] print 'vals p1', vals['p1'] p0dct = dict(zip(idxs['p0'], vals['p0'])) p1dct = dict(zip(idxs['p1'], vals['p1'])) for ii, li in enumerate(losses): print ii, li if p1dct[ii] != 0: assert li == p0dct[ii]**2 else: assert li == 1
def test_vectorize_multipath(): N = as_apply(15) p0 = hp_uniform("p0", 0, 1) loss = hp_choice("p1", [1, p0, -p0])**2 expr_idxs = scope.range(N) vh = VectorizeHelper(loss, expr_idxs, build=True) vloss = vh.v_expr print(vloss) full_output = as_apply([vloss, vh.idxs_by_label(), vh.vals_by_label()]) new_vc = recursive_set_rng_kwarg(full_output, as_apply(np.random.RandomState(1))) losses, idxs, vals = rec_eval(new_vc) print("losses", losses) print("idxs p0", idxs["p0"]) print("vals p0", vals["p0"]) print("idxs p1", idxs["p1"]) print("vals p1", vals["p1"]) p0dct = dict(list(zip(idxs["p0"], vals["p0"]))) p1dct = dict(list(zip(idxs["p1"], vals["p1"]))) for ii, li in enumerate(losses): print(ii, li) if p1dct[ii] != 0: assert li == p0dct[ii]**2 else: assert li == 1
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_clone(): config = config0() config2 = clone(config) nodeset = set(dfs(config)) assert not any(n in nodeset for n in dfs(config2)) foo = recursive_set_rng_kwarg( config, scope.rng_from_seed(5)) r = rec_eval(foo) print(r) r2 = rec_eval( recursive_set_rng_kwarg( config2, scope.rng_from_seed(5))) print(r2) assert r == r2
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)
def test_vectorize_trivial(): N = as_apply(15) p0 = hp_uniform("p0", 0, 1) loss = p0 print(loss) expr_idxs = scope.range(N) vh = VectorizeHelper(loss, expr_idxs, build=True) vloss = vh.v_expr full_output = as_apply([vloss, vh.idxs_by_label(), vh.vals_by_label()]) fo2 = replace_repeat_stochastic(full_output) new_vc = recursive_set_rng_kwarg(fo2, as_apply(np.random.RandomState(1))) # print new_vc losses, idxs, vals = rec_eval(new_vc) print("losses", losses) print("idxs p0", idxs["p0"]) print("vals p0", vals["p0"]) p0dct = dict(list(zip(idxs["p0"], vals["p0"]))) for ii, li in enumerate(losses): assert p0dct[ii] == li
def test_vectorize_config0(): p0 = hp_uniform('p0', 0, 1) p1 = hp_loguniform('p1', 2, 3) p2 = hp_choice('p2', [-1, p0]) p3 = hp_choice('p3', [-2, p1]) p4 = 1 p5 = [3, 4, p0] p6 = hp_choice('p6', [-3, p1]) d = locals() d['p1'] = None # -- don't sample p1 all the time, only if p3 says so config = as_apply(d) N = as_apply('N:TBA') expr = config expr_idxs = scope.range(N) vh = VectorizeHelper(expr, expr_idxs, build=True) vconfig = vh.v_expr full_output = as_apply([vconfig, vh.idxs_by_label(), vh.vals_by_label()]) if 1: print('=' * 80) print('VECTORIZED') print(full_output) print('\n' * 1) fo2 = replace_repeat_stochastic(full_output) if 0: print('=' * 80) print('VECTORIZED STOCHASTIC') print(fo2) print('\n' * 1) new_vc = recursive_set_rng_kwarg( fo2, as_apply(np.random.RandomState(1)) ) if 0: print('=' * 80) print('VECTORIZED STOCHASTIC WITH RNGS') print(new_vc) Nval = 10 foo, idxs, vals = rec_eval(new_vc, memo={N: Nval}) print('foo[0]', foo[0]) print('foo[1]', foo[1]) assert len(foo) == Nval if 0: # XXX refresh these values to lock down sampler assert foo[0] == { 'p0': 0.39676747423066994, 'p1': None, 'p2': 0.39676747423066994, 'p3': 2.1281244479293568, 'p4': 1, 'p5': (3, 4, 0.39676747423066994) } assert foo[1] != foo[2] print(idxs) print(vals['p3']) print(vals['p6']) print(idxs['p1']) print(vals['p1']) assert len(vals['p3']) == Nval assert len(vals['p6']) == Nval assert len(idxs['p1']) < Nval p1d = dict(list(zip(idxs['p1'], vals['p1']))) for ii, (p3v, p6v) in enumerate(zip(vals['p3'], vals['p6'])): if p3v == p6v == 0: assert ii not in idxs['p1'] if p3v: assert foo[ii]['p3'] == p1d[ii] if p6v: print('p6', foo[ii]['p6'], p1d[ii]) assert foo[ii]['p6'] == p1d[ii]
def test_vectorize_config0(): p0 = hp_uniform('p0', 0, 1) p1 = hp_loguniform('p1', 2, 3) p2 = hp_choice('p2', [-1, p0]) p3 = hp_choice('p3', [-2, p1]) p4 = 1 p5 = [3, 4, p0] p6 = hp_choice('p6', [-3, p1]) d = locals() d['p1'] = None # -- don't sample p1 all the time, only if p3 says so config = as_apply(d) N = as_apply('N:TBA') expr = config expr_idxs = scope.range(N) vh = VectorizeHelper(expr, expr_idxs, build=True) vconfig = vh.v_expr full_output = as_apply([vconfig, vh.idxs_by_label(), vh.vals_by_label()]) if 1: print '=' * 80 print 'VECTORIZED' print full_output print '\n' * 1 fo2 = replace_repeat_stochastic(full_output) if 0: print '=' * 80 print 'VECTORIZED STOCHASTIC' print fo2 print '\n' * 1 new_vc = recursive_set_rng_kwarg(fo2, as_apply(np.random.RandomState(1))) if 0: print '=' * 80 print 'VECTORIZED STOCHASTIC WITH RNGS' print new_vc Nval = 10 foo, idxs, vals = rec_eval(new_vc, memo={N: Nval}) print 'foo[0]', foo[0] print 'foo[1]', foo[1] assert len(foo) == Nval if 0: # XXX refresh these values to lock down sampler assert foo[0] == { 'p0': 0.39676747423066994, 'p1': None, 'p2': 0.39676747423066994, 'p3': 2.1281244479293568, 'p4': 1, 'p5': (3, 4, 0.39676747423066994) } assert foo[1] != foo[2] print idxs print vals['p3'] print vals['p6'] print idxs['p1'] print vals['p1'] assert len(vals['p3']) == Nval assert len(vals['p6']) == Nval assert len(idxs['p1']) < Nval p1d = dict(zip(idxs['p1'], vals['p1'])) for ii, (p3v, p6v) in enumerate(zip(vals['p3'], vals['p6'])): if p3v == p6v == 0: assert ii not in idxs['p1'] if p3v: assert foo[ii]['p3'] == p1d[ii] if p6v: print 'p6', foo[ii]['p6'], p1d[ii] assert foo[ii]['p6'] == p1d[ii]
def test_vectorize_config0(): p0 = hp_uniform("p0", 0, 1) p1 = hp_loguniform("p1", 2, 3) p2 = hp_choice("p2", [-1, p0]) p3 = hp_choice("p3", [-2, p1]) p4 = 1 p5 = [3, 4, p0] p6 = hp_choice("p6", [-3, p1]) d = locals() d["p1"] = None # -- don't sample p1 all the time, only if p3 says so config = as_apply(d) N = as_apply("N:TBA") expr = config expr_idxs = scope.range(N) vh = VectorizeHelper(expr, expr_idxs, build=True) vconfig = vh.v_expr full_output = as_apply([vconfig, vh.idxs_by_label(), vh.vals_by_label()]) if 1: print("=" * 80) print("VECTORIZED") print(full_output) print("\n" * 1) fo2 = replace_repeat_stochastic(full_output) if 0: print("=" * 80) print("VECTORIZED STOCHASTIC") print(fo2) print("\n" * 1) new_vc = recursive_set_rng_kwarg(fo2, as_apply(np.random.RandomState(1))) if 0: print("=" * 80) print("VECTORIZED STOCHASTIC WITH RNGS") print(new_vc) Nval = 10 foo, idxs, vals = rec_eval(new_vc, memo={N: Nval}) print("foo[0]", foo[0]) print("foo[1]", foo[1]) assert len(foo) == Nval if 0: # XXX refresh these values to lock down sampler assert foo[0] == { "p0": 0.39676747423066994, "p1": None, "p2": 0.39676747423066994, "p3": 2.1281244479293568, "p4": 1, "p5": (3, 4, 0.39676747423066994), } assert (foo[1].keys() != foo[2].keys()) or (foo[1].values() != foo[2].values()) print(idxs) print(vals["p3"]) print(vals["p6"]) print(idxs["p1"]) print(vals["p1"]) assert len(vals["p3"]) == Nval assert len(vals["p6"]) == Nval assert len(idxs["p1"]) < Nval p1d = dict(list(zip(idxs["p1"], vals["p1"]))) for ii, (p3v, p6v) in enumerate(zip(vals["p3"], vals["p6"])): if p3v == p6v == 0: assert ii not in idxs["p1"] if p3v: assert foo[ii]["p3"] == p1d[ii] if p6v: print("p6", foo[ii]["p6"], p1d[ii]) assert foo[ii]["p6"] == p1d[ii]
def node2sampled_dimention(node, rng, sample_size): recursive_set_rng_kwarg(node, rng) samples = [node.eval() for _ in range(sample_size)] return Categorical(samples, transform="identity")