##// END OF EJS Templates
compare-disco: move case parsing into its own function...
marmoute -
r50357:ef0b0f94 default
parent child Browse files
Show More
@@ -1,217 +1,221 b''
1 #!/usr/bin/env python3
1 #!/usr/bin/env python3
2 # compare various algorithm variants for a given case
2 # compare various algorithm variants for a given case
3 #
3 #
4 # search-discovery-case REPO LOCAL_CASE REMOTE_CASE
4 # search-discovery-case REPO LOCAL_CASE REMOTE_CASE
5 #
5 #
6 # The description for the case input uses the same format as the ouput of
6 # The description for the case input uses the same format as the ouput of
7 # search-discovery-case
7 # search-discovery-case
8
8
9 import json
9 import json
10 import os
10 import os
11 import subprocess
11 import subprocess
12 import sys
12 import sys
13
13
14 this_script = os.path.abspath(sys.argv[0])
14 this_script = os.path.abspath(sys.argv[0])
15 script_name = os.path.basename(this_script)
15 script_name = os.path.basename(this_script)
16 this_dir = os.path.dirname(this_script)
16 this_dir = os.path.dirname(this_script)
17 hg_dir = os.path.join(this_dir, '..', '..')
17 hg_dir = os.path.join(this_dir, '..', '..')
18 HG_REPO = os.path.normpath(hg_dir)
18 HG_REPO = os.path.normpath(hg_dir)
19 HG_BIN = os.path.join(HG_REPO, 'hg')
19 HG_BIN = os.path.join(HG_REPO, 'hg')
20
20
21
21
22 SUBSET_PATH = os.path.join(HG_REPO, 'contrib', 'perf-utils', 'subsetmaker.py')
22 SUBSET_PATH = os.path.join(HG_REPO, 'contrib', 'perf-utils', 'subsetmaker.py')
23
23
24 CMD_BASE = (
24 CMD_BASE = (
25 HG_BIN,
25 HG_BIN,
26 'debugdiscovery',
26 'debugdiscovery',
27 '--template',
27 '--template',
28 'json',
28 'json',
29 '--config',
29 '--config',
30 'extensions.subset=%s' % SUBSET_PATH,
30 'extensions.subset=%s' % SUBSET_PATH,
31 )
31 )
32
32
33 # --old
33 # --old
34 # --nonheads
34 # --nonheads
35 #
35 #
36 # devel.discovery.exchange-heads=True
36 # devel.discovery.exchange-heads=True
37 # devel.discovery.grow-sample=True
37 # devel.discovery.grow-sample=True
38 # devel.discovery.grow-sample.dynamic=True
38 # devel.discovery.grow-sample.dynamic=True
39
39
40 VARIANTS = {
40 VARIANTS = {
41 'tree-discovery': ('--old',),
41 'tree-discovery': ('--old',),
42 'set-discovery-basic': (
42 'set-discovery-basic': (
43 '--config',
43 '--config',
44 'devel.discovery.exchange-heads=no',
44 'devel.discovery.exchange-heads=no',
45 '--config',
45 '--config',
46 'devel.discovery.grow-sample=no',
46 'devel.discovery.grow-sample=no',
47 '--config',
47 '--config',
48 'devel.discovery.grow-sample.dynamic=no',
48 'devel.discovery.grow-sample.dynamic=no',
49 '--config',
49 '--config',
50 'devel.discovery.randomize=yes',
50 'devel.discovery.randomize=yes',
51 ),
51 ),
52 'set-discovery-heads': (
52 'set-discovery-heads': (
53 '--config',
53 '--config',
54 'devel.discovery.exchange-heads=yes',
54 'devel.discovery.exchange-heads=yes',
55 '--config',
55 '--config',
56 'devel.discovery.grow-sample=no',
56 'devel.discovery.grow-sample=no',
57 '--config',
57 '--config',
58 'devel.discovery.grow-sample.dynamic=no',
58 'devel.discovery.grow-sample.dynamic=no',
59 '--config',
59 '--config',
60 'devel.discovery.randomize=yes',
60 'devel.discovery.randomize=yes',
61 ),
61 ),
62 'set-discovery-grow-sample': (
62 'set-discovery-grow-sample': (
63 '--config',
63 '--config',
64 'devel.discovery.exchange-heads=yes',
64 'devel.discovery.exchange-heads=yes',
65 '--config',
65 '--config',
66 'devel.discovery.grow-sample=yes',
66 'devel.discovery.grow-sample=yes',
67 '--config',
67 '--config',
68 'devel.discovery.grow-sample.dynamic=no',
68 'devel.discovery.grow-sample.dynamic=no',
69 '--config',
69 '--config',
70 'devel.discovery.randomize=yes',
70 'devel.discovery.randomize=yes',
71 ),
71 ),
72 'set-discovery-dynamic-sample': (
72 'set-discovery-dynamic-sample': (
73 '--config',
73 '--config',
74 'devel.discovery.exchange-heads=yes',
74 'devel.discovery.exchange-heads=yes',
75 '--config',
75 '--config',
76 'devel.discovery.grow-sample=yes',
76 'devel.discovery.grow-sample=yes',
77 '--config',
77 '--config',
78 'devel.discovery.grow-sample.dynamic=yes',
78 'devel.discovery.grow-sample.dynamic=yes',
79 '--config',
79 '--config',
80 'devel.discovery.randomize=yes',
80 'devel.discovery.randomize=yes',
81 ),
81 ),
82 'set-discovery-default': (
82 'set-discovery-default': (
83 '--config',
83 '--config',
84 'devel.discovery.randomize=yes',
84 'devel.discovery.randomize=yes',
85 ),
85 ),
86 }
86 }
87
87
88 VARIANTS_KEYS = [
88 VARIANTS_KEYS = [
89 'tree-discovery',
89 'tree-discovery',
90 'set-discovery-basic',
90 'set-discovery-basic',
91 'set-discovery-heads',
91 'set-discovery-heads',
92 'set-discovery-grow-sample',
92 'set-discovery-grow-sample',
93 'set-discovery-dynamic-sample',
93 'set-discovery-dynamic-sample',
94 'set-discovery-default',
94 'set-discovery-default',
95 ]
95 ]
96
96
97 assert set(VARIANTS.keys()) == set(VARIANTS_KEYS)
97 assert set(VARIANTS.keys()) == set(VARIANTS_KEYS)
98
98
99
99
100 def parse_case(case):
101 case_type, case_args = case.split('-', 1)
102 case = (case_type,) + tuple(int(x) for x in case_args.split('-'))
103 return case
104
105
100 def format_case(case):
106 def format_case(case):
101 return '-'.join(str(s) for s in case)
107 return '-'.join(str(s) for s in case)
102
108
103
109
104 def to_revsets(case):
110 def to_revsets(case):
105 t = case[0]
111 t = case[0]
106 if t == 'scratch':
112 if t == 'scratch':
107 return 'not scratch(all(), %d, "%d")' % (case[1], case[2])
113 return 'not scratch(all(), %d, "%d")' % (case[1], case[2])
108 elif t == 'randomantichain':
114 elif t == 'randomantichain':
109 return '::randomantichain(all(), "%d")' % case[1]
115 return '::randomantichain(all(), "%d")' % case[1]
110 elif t == 'rev':
116 elif t == 'rev':
111 return '::%d' % case[1]
117 return '::%d' % case[1]
112 else:
118 else:
113 assert False
119 assert False
114
120
115
121
116 def compare(
122 def compare(
117 repo,
123 repo,
118 local_case,
124 local_case,
119 remote_case,
125 remote_case,
120 display_header=True,
126 display_header=True,
121 display_case=True,
127 display_case=True,
122 ):
128 ):
123 case = (repo, local_case, remote_case)
129 case = (repo, local_case, remote_case)
124 if display_header:
130 if display_header:
125 pieces = ['#']
131 pieces = ['#']
126 if display_case:
132 if display_case:
127 pieces += [
133 pieces += [
128 "repo",
134 "repo",
129 "local-subset",
135 "local-subset",
130 "remote-subset",
136 "remote-subset",
131 ]
137 ]
132
138
133 pieces += [
139 pieces += [
134 "discovery-variant",
140 "discovery-variant",
135 "roundtrips",
141 "roundtrips",
136 "queries",
142 "queries",
137 "revs",
143 "revs",
138 "local-heads",
144 "local-heads",
139 "common-heads",
145 "common-heads",
140 "undecided-initial",
146 "undecided-initial",
141 "undecided-common",
147 "undecided-common",
142 "undecided-missing",
148 "undecided-missing",
143 ]
149 ]
144 print(*pieces)
150 print(*pieces)
145 for variant in VARIANTS_KEYS:
151 for variant in VARIANTS_KEYS:
146 res = process(case, VARIANTS[variant])
152 res = process(case, VARIANTS[variant])
147 revs = res["nb-revs"]
153 revs = res["nb-revs"]
148 local_heads = res["nb-head-local"]
154 local_heads = res["nb-head-local"]
149 common_heads = res["nb-common-heads"]
155 common_heads = res["nb-common-heads"]
150 roundtrips = res["total-roundtrips"]
156 roundtrips = res["total-roundtrips"]
151 queries = res["total-queries"]
157 queries = res["total-queries"]
152 pieces = []
158 pieces = []
153 if display_case:
159 if display_case:
154 pieces += [
160 pieces += [
155 repo,
161 repo,
156 format_case(local_case),
162 format_case(local_case),
157 format_case(remote_case),
163 format_case(remote_case),
158 ]
164 ]
159 pieces += [
165 pieces += [
160 variant,
166 variant,
161 roundtrips,
167 roundtrips,
162 queries,
168 queries,
163 revs,
169 revs,
164 local_heads,
170 local_heads,
165 common_heads,
171 common_heads,
166 ]
172 ]
167 if 'tree-discovery' not in variant:
173 if 'tree-discovery' not in variant:
168 undecided_common = res["nb-ini_und-common"]
174 undecided_common = res["nb-ini_und-common"]
169 undecided_missing = res["nb-ini_und-missing"]
175 undecided_missing = res["nb-ini_und-missing"]
170 undecided = undecided_common + undecided_missing
176 undecided = undecided_common + undecided_missing
171 pieces += [
177 pieces += [
172 undecided,
178 undecided,
173 undecided_common,
179 undecided_common,
174 undecided_missing,
180 undecided_missing,
175 ]
181 ]
176 print(*pieces)
182 print(*pieces)
177 return 0
183 return 0
178
184
179
185
180 def process(case, variant):
186 def process(case, variant):
181 (repo, left, right) = case
187 (repo, left, right) = case
182 cmd = list(CMD_BASE)
188 cmd = list(CMD_BASE)
183 cmd.append('-R')
189 cmd.append('-R')
184 cmd.append(repo)
190 cmd.append(repo)
185 cmd.append('--local-as-revs')
191 cmd.append('--local-as-revs')
186 cmd.append(to_revsets(left))
192 cmd.append(to_revsets(left))
187 cmd.append('--remote-as-revs')
193 cmd.append('--remote-as-revs')
188 cmd.append(to_revsets(right))
194 cmd.append(to_revsets(right))
189 cmd.extend(variant)
195 cmd.extend(variant)
190 s = subprocess.Popen(cmd, stdout=subprocess.PIPE)
196 s = subprocess.Popen(cmd, stdout=subprocess.PIPE)
191 out, err = s.communicate()
197 out, err = s.communicate()
192 return json.loads(out)[0]
198 return json.loads(out)[0]
193
199
194
200
195 if __name__ == '__main__':
201 if __name__ == '__main__':
196
202
197 argv = sys.argv[:]
203 argv = sys.argv[:]
198
204
199 kwargs = {}
205 kwargs = {}
200 # primitive arg parsing
206 # primitive arg parsing
201 if '--no-header' in argv:
207 if '--no-header' in argv:
202 kwargs['display_header'] = False
208 kwargs['display_header'] = False
203 argv = [a for a in argv if a != '--no-header']
209 argv = [a for a in argv if a != '--no-header']
204 if '--no-case' in argv:
210 if '--no-case' in argv:
205 kwargs['display_case'] = False
211 kwargs['display_case'] = False
206 argv = [a for a in argv if a != '--no-case']
212 argv = [a for a in argv if a != '--no-case']
207
213
208 if len(argv) != 4:
214 if len(argv) != 4:
209 usage = f'USAGE: {script_name} REPO LOCAL_CASE REMOTE_CASE'
215 usage = f'USAGE: {script_name} REPO LOCAL_CASE REMOTE_CASE'
210 print(usage, file=sys.stderr)
216 print(usage, file=sys.stderr)
211 sys.exit(128)
217 sys.exit(128)
212 repo = argv[1]
218 repo = argv[1]
213 local_case = argv[2].split('-')
219 local_case = parse_case(argv[2])
214 local_case = (local_case[0],) + tuple(int(x) for x in local_case[1:])
220 remote_case = parse_case(argv[3])
215 remote_case = argv[3].split('-')
216 remote_case = (remote_case[0],) + tuple(int(x) for x in remote_case[1:])
217 sys.exit(compare(repo, local_case, remote_case, **kwargs))
221 sys.exit(compare(repo, local_case, remote_case, **kwargs))
General Comments 0
You need to be logged in to leave comments. Login now