/
run_experiment.py
executable file
·176 lines (140 loc) · 6.04 KB
/
run_experiment.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#!/usr/bin/env pypy3
import argparse
import time
import domain_koza_apptree
import domain_koza_stack
import domain_parity_apptree
import domain_parity_stack
import domain_physics
import domain_physics_smart
import domain_primes_apptree
import stack
from app_tree import UnfinishedLeaf
from mcts import MCTNode, mct_search, C_UCT_EXPLORE_DEFAULT
from nmcs import nested_mc_search
from tree_node import ChooseKTNode, StackNode, UFTNode, MaxKTNode
from utils import experiment_eval
D_PARITY = 'parity'
D_PRIMES = 'primes'
D_KOZA_POLY = 'koza_poly'
D_PHYSICS = 'physics'
D_PHYSICS_SMART = 'physics_smart'
APP_T_MAX_K = 'max_k'
APP_T_FIXED_K = 'fix_k'
APP_T_CHOOSE_K = 'choose_k'
import random
random.seed(3)
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument('--proc', type=int, default=1)
parser.add_argument('--repeat', type=int, default=10)
parser.add_argument('--k', type=int, default=5)
parser.add_argument('--smart-uf', '-s', action='store_true', default=False)
parser.add_argument('--mcts', action='store_true', default=False)
parser.add_argument('--nmcs', action='store_true', default=False)
parser.add_argument('--domain', type=str, choices=[D_KOZA_POLY, D_PRIMES, D_PARITY, D_PHYSICS_SMART, D_PHYSICS], default=D_KOZA_POLY)
parser.add_argument('--stack', action='store_true', default=False)
parser.add_argument('--app-tree', type=str, choices=['', APP_T_CHOOSE_K, APP_T_FIXED_K, APP_T_MAX_K],
default='')
parser.add_argument('--nmcs-level', type=int, default=1)
parser.add_argument('--mcts-expand', type=int, default=8)
parser.add_argument('--mcts-num-steps', type=int, default=100)
parser.add_argument('--mcts-sample-by-urgency', action='store_true', default=False)
parser.add_argument('--mcts-urgency-method', choices=['best', 'avg', '(avg+best)/2'], default='best')
parser.add_argument('--mcts-urgency-c-uct', type=float, default=C_UCT_EXPLORE_DEFAULT)
parser.add_argument('--print-size-hist', action='store_true', default=False)
return parser.parse_args()
def print_k_histogram(domain):
#print()
#print(len(stack.missings))
#print(sum(stack.missings)/len(stack.missings))
print("k-size histogram, sum=", sum(domain.size_d.values()))
print('\n'.join("%s = %s" % (a, b) for a, b in sorted(domain.size_d.items())))
def construct_root_node(args, env):
if args.app_tree == APP_T_CHOOSE_K:
root = ChooseKTNode(uf_factory(env), args.k)
elif args.app_tree == APP_T_FIXED_K:
root = UFTNode(uf_factory(env), args.k)
elif args.app_tree == APP_T_MAX_K:
root = MaxKTNode(uf_factory(env), args.k)
elif args.stack:
root = StackNode([])
else:
assert False
return root
if __name__ == "__main__":
args = parse_args()
print(args)
assert not (args.mcts and args.nmcs)
assert args.mcts or args.nmcs
assert not (args.stack and args.app_tree)
if args.app_tree:
if args.domain == D_KOZA_POLY:
domain = domain_koza_apptree
elif args.domain == D_PARITY:
domain = domain_parity_apptree
elif args.domain == D_PRIMES:
domain = domain_primes_apptree
elif args.domain == D_PHYSICS:
domain = domain_physics
elif args.domain == D_PHYSICS_SMART:
domain = domain_physics_smart
else:
assert False
make_env = lambda: domain.make_env_app_tree(smart=args.smart_uf)
elif args.stack:
if args.domain == D_KOZA_POLY:
domain = domain_koza_stack
elif args.domain == D_PARITY:
domain = domain_parity_stack
else:
assert False
make_env = lambda: domain.make_env_stack(args.k)
else:
assert False
uf_factory = lambda env: UnfinishedLeaf()
if args.smart_uf:
uf_factory = lambda env: UnfinishedLeaf(typ=env.goal)
if args.nmcs:
# Nested MC Search
def one_iteration(worker_env):
env = make_env()
evals_before = env.count_evals()
assert not evals_before
time_before = time.time()
root = construct_root_node(args, env)
indiv = nested_mc_search(root,
max_level=args.nmcs_level,
fitness=env.fitness,
finish=env.finish,
is_finished=env.is_finished,
successors=env.successors,
advance=env.advance,
early_end_test=env.early_end_test)
env.cache.print_self("AT END")
if args.print_size_hist:
print_k_histogram(domain)
return env.fitness(indiv), env.count_evals() - evals_before, time.time() - time_before
experiment_eval(one_iteration, repeat=args.repeat, processes=args.proc, make_env=lambda: None)
if args.mcts:
# MCTS
def one_iteration(worker_env):
env = make_env()
evals_before = env.count_evals()
time_before = time.time()
root = construct_root_node(args, env)
mct_root = MCTNode(root)
mct_search(mct_root, expand_visits=args.mcts_expand, num_steps=args.mcts_num_steps,
fitness=env.fitness,
finish=env.finish,
is_finished=env.is_finished,
successors=env.successors,
early_end_test=env.early_end_test,
sample_by_urgency=args.mcts_sample_by_urgency,
urgency_method=args.mcts_urgency_method,
urgency_c_uct_explore=args.mcts_urgency_c_uct)
env.cache.print_self("AT END")
if args.print_size_hist:
print_k_histogram(domain)
return mct_root.best_score, env.count_evals() - evals_before, time.time() - time_before
experiment_eval(one_iteration, repeat=args.repeat, processes=args.proc, make_env=lambda: None)