byte-vortex commited on
Commit
9cf6ce6
·
verified ·
1 Parent(s): fa8e928

Update logbook: Repro - NonZero: Interaction-Guided Exploration for Multi-Agent Monte Carlo Tree Search

Browse files
logbook.json CHANGED
@@ -10,7 +10,7 @@
10
  "icml2026-repro",
11
  "paper-Jh6gq9QsFa"
12
  ],
13
- "updated_at": "2026-08-03T03:19:03+00:00",
14
  "root": {
15
  "slug": "index",
16
  "title": "Repro - NonZero: Interaction-Guided Exploration for Multi-Agent Monte Carlo Tree Search",
@@ -73,10 +73,10 @@
73
  "total_size": 0,
74
  "bucket_id": null
75
  },
76
- "agent_view_tokens": 5018,
77
  "trace_view_tokens": 10,
78
  "workspace_view_tokens": 8,
79
- "revision": "5273477ba2d77dcfd419",
80
  "workspace_ref": {
81
  "repo_id": "byte-vortex/nonzero-repro-artifacts",
82
  "repo_type": "bucket",
 
10
  "icml2026-repro",
11
  "paper-Jh6gq9QsFa"
12
  ],
13
+ "updated_at": "2026-08-03T06:36:58+00:00",
14
  "root": {
15
  "slug": "index",
16
  "title": "Repro - NonZero: Interaction-Guided Exploration for Multi-Agent Monte Carlo Tree Search",
 
73
  "total_size": 0,
74
  "bucket_id": null
75
  },
76
+ "agent_view_tokens": 2969,
77
  "trace_view_tokens": 10,
78
  "workspace_view_tokens": 8,
79
+ "revision": "fed69f4f76049e0148bb",
80
  "workspace_ref": {
81
  "repo_id": "byte-vortex/nonzero-repro-artifacts",
82
  "repo_type": "bucket",
pages/claim-1-low-dimensional-nonlinear-surrogate/page.md CHANGED
@@ -3,300 +3,6 @@
3
 
4
  ---
5
  <!-- trackio-cell
6
- {"type": "markdown", "id": "cell_435cbf8fde4f", "created_at": "2026-08-03T03:14:57+00:00", "title": "Implemented the asinh-GLM surrogate eta(theta,a) = casinh(alpha<theta,a) exactl…"}
7
  -->
8
  Implemented the asinh-GLM surrogate eta(theta,a) = c*asinh(alpha*<theta,a>) exactly per Section 3.1, Eq. 2, plus the first-order (Eq. 3) and mixed second-order (Eq. 4) finite-difference operators. **Verified the paper's stated identity exactly**: eta(a^(u,v)) - eta(a) = Delta_u eta(a) + Delta_v eta(a) + Delta^2_{u,v} eta(a), confirmed to floating-point precision (error ~1.19e-7) via unit test. **[toy]** Verified the surrogate can learn real reward structure: trained on the 8-agent/10-action nonlinear MatGame environment, converged to R2=0.900 on held-out data, matching the theoretical ceiling set by the environment's injected noise variance (Gaussian sigma^2=4 + Uniform(-3,3)) -- essentially recovering all learnable signal. This used a simplified single-global-theta setup rather than the full state-conditioned hypernetwork architecture, so it validates the model family's expressiveness rather than the complete Claim 4 pipeline.
9
-
10
-
11
- ---
12
- <!-- trackio-cell
13
- {"type": "code", "id": "cell_34d10e611c5e", "created_at": "2026-08-03T03:17:33+00:00", "title": "Run: hf claim1_mechanism_test.py (exit 0)", "command": ["hf", "jobs", "uv", "run", "--flavor", "cpu-basic", "--secrets", "HF_TOKEN", "claim1_mechanism_test.py"], "exit_code": 0, "duration_s": 137.193}
14
- -->
15
- ````bash
16
- $ hf jobs uv run --flavor cpu-basic --secrets HF_TOKEN claim1_mechanism_test.py
17
- ````
18
-
19
- exit 0 · 137.2s
20
-
21
-
22
- ````python title=claim1_mechanism_test.py
23
- # /// script
24
- # dependencies = ["torch", "numpy"]
25
- # ///
26
- """
27
- Claim 1 -- toy-scale test of NonZero's actual proposal mechanism.
28
-
29
- The paper's real claim isn't just "the surrogate can fit rewards" -- it's
30
- that using the surrogate's first-order (single-agent) and second-order
31
- (two-agent) difference operators to PROPOSE candidate action changes finds
32
- good joint actions more efficiently than enumerating/random-sampling the
33
- full joint-action space (Section 3, Section 3.1).
34
-
35
- This script tests that directly: under an EQUAL evaluation budget, does
36
- NonUCT-style guided local search find better joint actions than random
37
- sampling, on the 8-agent/10-action nonlinear MatGame environment?
38
- """
39
-
40
- import torch
41
- import torch.nn as nn
42
- import numpy as np
43
-
44
-
45
- class MatgameNonZeroEnv:
46
- def __init__(self, n_agents=8, n_actions=10, reward_type="nonlinear",
47
- noise_std=2.0, noise_uniform_range=3.0, seed=None):
48
- self.n_agents = n_agents
49
- self.n_actions = n_actions
50
- self.reward_type = reward_type
51
- self.noise_std = noise_std
52
- self.noise_uniform_range = noise_uniform_range
53
- self._rng = np.random.default_rng(seed)
54
-
55
- def joint_reward(self, actions):
56
- base = float(np.sum(actions))
57
- if self.reward_type == "linear":
58
- return base
59
- u = self._rng.normal(0.0, self.noise_std)
60
- v = self._rng.uniform(-self.noise_uniform_range, self.noise_uniform_range)
61
- return base + u + v
62
-
63
-
64
- class AsinhGLMSurrogate:
65
- def __init__(self, n_agents, n_actions, c=1.0, alpha=1.0):
66
- self.n_agents, self.n_actions = n_agents, n_actions
67
- self.nd = n_agents * n_actions
68
- self.c, self.alpha = c, alpha
69
-
70
- def one_hot(self, agent_actions):
71
- agent_actions = torch.as_tensor(agent_actions, dtype=torch.long)
72
- oh = torch.nn.functional.one_hot(agent_actions, num_classes=self.n_actions)
73
- return oh.reshape(*agent_actions.shape[:-1], self.nd).float()
74
-
75
- def eta(self, theta, a):
76
- return self.c * torch.asinh(self.alpha * (theta * a).sum(dim=-1))
77
-
78
- def neighbor(self, a, agent_idx, new_action):
79
- a = a.clone()
80
- s = agent_idx * self.n_actions
81
- a[..., s:s + self.n_actions] = 0.0
82
- a[..., s + new_action] = 1.0
83
- return a
84
-
85
- def neighbor_pair(self, a, agent_i, action_i, agent_j, action_j):
86
- a = self.neighbor(a, agent_i, action_i)
87
- a = self.neighbor(a, agent_j, action_j)
88
- return a
89
-
90
-
91
- def fit_surrogate(env, surrogate, n_samples=4000, n_epochs=1500, rng=None):
92
- actions = rng.integers(0, env.n_actions, size=(n_samples, env.n_agents))
93
- rewards = torch.tensor([env.joint_reward(a) for a in actions], dtype=torch.float32)
94
- a_enc = surrogate.one_hot(torch.tensor(actions, dtype=torch.long))
95
-
96
- theta = nn.Parameter(torch.zeros(surrogate.nd))
97
- log_c, log_alpha = nn.Parameter(torch.zeros(())), nn.Parameter(torch.zeros(()))
98
- opt = torch.optim.Adam([theta, log_c, log_alpha], lr=0.05)
99
- sched = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=n_epochs)
100
-
101
- def predict(a_batch):
102
- return torch.exp(log_c) * torch.asinh(torch.exp(log_alpha) * (theta * a_batch).sum(dim=-1))
103
-
104
- for _ in range(n_epochs):
105
- opt.zero_grad()
106
- loss = ((predict(a_enc) - rewards) ** 2).mean()
107
- loss.backward()
108
- opt.step()
109
- sched.step()
110
- return theta.detach()
111
-
112
-
113
- def nonuct_guided_search(env, surrogate, theta, eval_budget, rng):
114
- n_agents, n_actions = env.n_agents, env.n_actions
115
- current = rng.integers(0, n_actions, size=n_agents)
116
- best_reward = env.joint_reward(current)
117
- evals_used = 1
118
-
119
- while evals_used < eval_budget:
120
- cur_enc = surrogate.one_hot(torch.tensor(current, dtype=torch.long))
121
- cur_eta = surrogate.eta(theta, cur_enc).item()
122
-
123
- best_candidate, best_delta, best_kind = None, -float("inf"), None
124
- for agent_idx in range(n_agents):
125
- for new_action in range(n_actions):
126
- if new_action == current[agent_idx]:
127
- continue
128
- cand_enc = surrogate.neighbor(cur_enc, agent_idx, new_action)
129
- delta = (surrogate.eta(theta, cand_enc) - cur_eta).item()
130
- if delta > best_delta:
131
- best_delta, best_candidate, best_kind = delta, (agent_idx, new_action), "first"
132
-
133
- for i in range(n_agents):
134
- for j in range(i + 1, n_agents):
135
- for ai in range(n_actions):
136
- if ai == current[i]:
137
- continue
138
- for aj in range(n_actions):
139
- if aj == current[j]:
140
- continue
141
- cand_enc = surrogate.neighbor_pair(cur_enc, i, ai, j, aj)
142
- delta = (surrogate.eta(theta, cand_enc) - cur_eta).item()
143
- if delta > best_delta:
144
- best_delta, best_candidate, best_kind = delta, (i, ai, j, aj), "second"
145
-
146
- if best_candidate is None or evals_used >= eval_budget:
147
- break
148
-
149
- candidate_actions = current.copy()
150
- if best_kind == "first":
151
- agent_idx, new_action = best_candidate
152
- candidate_actions[agent_idx] = new_action
153
- else:
154
- i, ai, j, aj = best_candidate
155
- candidate_actions[i] = ai
156
- candidate_actions[j] = aj
157
-
158
- real_reward = env.joint_reward(candidate_actions)
159
- evals_used += 1
160
-
161
- if real_reward > best_reward:
162
- current = candidate_actions
163
- best_reward = real_reward
164
- else:
165
- break
166
-
167
- return best_reward, evals_used
168
-
169
-
170
- def random_search(env, eval_budget, rng):
171
- best_reward = -float("inf")
172
- for _ in range(eval_budget):
173
- actions = rng.integers(0, env.n_actions, size=env.n_agents)
174
- r = env.joint_reward(actions)
175
- if r > best_reward:
176
- best_reward = r
177
- return best_reward
178
-
179
-
180
- def main():
181
- print("=" * 70)
182
- print("NonZero reproduction -- Claim 1 mechanism test (toy scale)")
183
- print("Testing: does surrogate-guided proposal beat random search")
184
- print("under an EQUAL real-environment evaluation budget?")
185
- print("=" * 70)
186
-
187
- n_trials = 200
188
- eval_budget = 15
189
-
190
- rng_fit = np.random.default_rng(0)
191
- env_fit = MatgameNonZeroEnv(n_agents=8, n_actions=10, reward_type="nonlinear", seed=1)
192
- surrogate = AsinhGLMSurrogate(8, 10)
193
- theta = fit_surrogate(env_fit, surrogate, rng=rng_fit)
194
- print(f"\nSurrogate fit complete (theta trained on 4000 samples).")
195
-
196
- guided_rewards, random_rewards = [], []
197
- for trial in range(n_trials):
198
- rng = np.random.default_rng(1000 + trial)
199
- env = MatgameNonZeroEnv(n_agents=8, n_actions=10, reward_type="nonlinear", seed=2000 + trial)
200
-
201
- g_reward, g_evals = nonuct_guided_search(env, surrogate, theta, eval_budget, rng)
202
- guided_rewards.append(g_reward)
203
-
204
- env2 = MatgameNonZeroEnv(n_agents=8, n_actions=10, reward_type="nonlinear", seed=2000 + trial)
205
- rng2 = np.random.default_rng(1000 + trial)
206
- r_reward = random_search(env2, eval_budget, rng2)
207
- random_rewards.append(r_reward)
208
-
209
- guided_mean, guided_std = np.mean(guided_rewards), np.std(guided_rewards)
210
- random_mean, random_std = np.mean(random_rewards), np.std(random_rewards)
211
- improvement = (guided_mean - random_mean) / abs(random_mean) * 100
212
-
213
- print(f"\n[Results over {n_trials} trials, eval_budget={eval_budget}]")
214
- print(f" Surrogate-guided search: {guided_mean:.2f} +/- {guided_std:.2f}")
215
- print(f" Random search (baseline): {random_mean:.2f} +/- {random_std:.2f}")
216
- print(f" Improvement: {improvement:+.1f}%")
217
-
218
- print("\n" + "=" * 70)
219
- print("SUMMARY")
220
- if guided_mean > random_mean:
221
- print(f" PASS: surrogate-guided proposal outperforms random search")
222
- print(f" by {improvement:.1f}% under equal evaluation budget.")
223
- print(f" This supports Claim 1's core mechanism at toy scale.")
224
- else:
225
- print(f" FAIL: surrogate-guided proposal did NOT outperform random search")
226
- print(f" in this toy setting.")
227
- print("=" * 70)
228
-
229
-
230
- if __name__ == "__main__":
231
- main()
232
-
233
- ````
234
-
235
-
236
- ````output
237
- /usr/local/lib/python3.12/dist-packages/huggingface_hub/utils/_experimental.py:59: UserWarning: 'HfApi.run_uv_job' is experimental and might be subject to breaking changes in the future without prior notice. You can disable this warning by setting `HF_HUB_DISABLE_EXPERIMENTAL_WARNING=1` as environment variable.
238
- warnings.warn(
239
- Job started with ID: 6a7007c56b79c09949c20232
240
- View at: https://huggingface.co/jobs/byte-vortex/6a7007c56b79c09949c20232
241
- Downloading nvidia-nvshmem-cu13 (57.6MiB)
242
- Downloading nvidia-nvjitlink (38.9MiB)
243
- Downloading cuda-bindings (6.3MiB)
244
- Downloading nvidia-cufile (1.2MiB)
245
- Downloading numpy (15.9MiB)
246
- Downloading nvidia-cublas (403.5MiB)
247
- Downloading nvidia-cuda-cupti (10.2MiB)
248
- Downloading nvidia-cudnn-cu13 (349.2MiB)
249
- Downloading sympy (6.0MiB)
250
- Downloading nvidia-curand (56.8MiB)
251
- Downloading nvidia-cusolver (191.6MiB)
252
- Downloading nvidia-nccl-cu13 (196.4MiB)
253
- Downloading triton (188.6MiB)
254
- Downloading networkx (2.0MiB)
255
- Downloading nvidia-cusparselt-cu13 (162.3MiB)
256
- Downloading torch (502.2MiB)
257
- Downloading nvidia-cuda-runtime (2.1MiB)
258
- Downloading nvidia-cufft (204.2MiB)
259
- Downloading nvidia-cuda-nvrtc (86.0MiB)
260
- Downloading nvidia-cusparse (139.2MiB)
261
- Downloaded nvidia-cufile
262
- Downloaded nvidia-cuda-runtime
263
- Downloaded networkx
264
- Downloaded cuda-bindings
265
- Downloaded nvidia-cuda-cupti
266
- Downloaded numpy
267
- Downloaded sympy
268
- Downloaded nvidia-nvjitlink
269
- Downloaded nvidia-curand
270
- Downloaded nvidia-nvshmem-cu13
271
- Downloaded nvidia-cuda-nvrtc
272
- Downloaded nvidia-cusparse
273
- Downloaded nvidia-cusparselt-cu13
274
- Downloaded nvidia-cusolver
275
- Downloaded nvidia-nccl-cu13
276
- Downloaded nvidia-cufft
277
- Downloaded triton
278
- Downloaded nvidia-cudnn-cu13
279
- Downloaded nvidia-cublas
280
- Downloaded torch
281
- Installed 30 packages in 224ms
282
- ======================================================================
283
- NonZero reproduction -- Claim 1 mechanism test (toy scale)
284
- Testing: does surrogate-guided proposal beat random search
285
- under an EQUAL real-environment evaluation budget?
286
- ======================================================================
287
-
288
- Surrogate fit complete (theta trained on 4000 samples).
289
-
290
- [Results over 200 trials, eval_budget=15]
291
- Surrogate-guided search: 73.19 +/- 2.59
292
- Random search (baseline): 51.04 +/- 4.58
293
- Improvement: +43.4%
294
-
295
- ======================================================================
296
- SUMMARY
297
- PASS: surrogate-guided proposal outperforms random search
298
- by 43.4% under equal evaluation budget.
299
- This supports Claim 1's core mechanism at toy scale.
300
- ======================================================================
301
-
302
- ````
 
3
 
4
  ---
5
  <!-- trackio-cell
6
+ {"type": "markdown", "id": "cell_6cef8451dcb9", "created_at": "2026-08-03T06:36:45+00:00", "title": "Implemented the asinh-GLM surrogate eta(theta,a) = casinh(alpha<theta,a) exactl…"}
7
  -->
8
  Implemented the asinh-GLM surrogate eta(theta,a) = c*asinh(alpha*<theta,a>) exactly per Section 3.1, Eq. 2, plus the first-order (Eq. 3) and mixed second-order (Eq. 4) finite-difference operators. **Verified the paper's stated identity exactly**: eta(a^(u,v)) - eta(a) = Delta_u eta(a) + Delta_v eta(a) + Delta^2_{u,v} eta(a), confirmed to floating-point precision (error ~1.19e-7) via unit test. **[toy]** Verified the surrogate can learn real reward structure: trained on the 8-agent/10-action nonlinear MatGame environment, converged to R2=0.900 on held-out data, matching the theoretical ceiling set by the environment's injected noise variance (Gaussian sigma^2=4 + Uniform(-3,3)) -- essentially recovering all learnable signal. This used a simplified single-global-theta setup rather than the full state-conditioned hypernetwork architecture, so it validates the model family's expressiveness rather than the complete Claim 4 pipeline.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
pages/claim-2-regret-bound-theorem-3-5/page.md CHANGED
@@ -3,7 +3,7 @@
3
 
4
  ---
5
  <!-- trackio-cell
6
- {"type": "markdown", "id": "cell_7d821d584dc1", "created_at": "2026-08-03T03:14:58+00:00", "title": "Proof review (not a numerical claim)"}
7
  -->
8
  Actually reviewed the proof this time (arXiv:2605.00751v1, Appendix A.2-A.5), rather than skipping it -- this claim needs no compute, just reading.
9
 
 
3
 
4
  ---
5
  <!-- trackio-cell
6
+ {"type": "markdown", "id": "cell_c5a16f27e326", "created_at": "2026-08-03T06:36:46+00:00", "title": "Proof review (not a numerical claim)"}
7
  -->
8
  Actually reviewed the proof this time (arXiv:2605.00751v1, Appendix A.2-A.5), rather than skipping it -- this claim needs no compute, just reading.
9
 
pages/claim-3-efficiency-separation-theorem-3-7/page.md CHANGED
@@ -3,13 +3,6 @@
3
 
4
  ---
5
  <!-- trackio-cell
6
- {"type": "markdown", "id": "cell_3dd934c2a67c", "created_at": "2026-08-03T03:14:59+00:00", "title": "Not attempted. Same reasoning as Claim 2 -- theoretical claim (Appendix A.6), p…"}
7
  -->
8
  Not attempted. Same reasoning as Claim 2 -- theoretical claim (Appendix A.6), proof review deprioritized given time constraints.
9
-
10
-
11
- ---
12
- <!-- trackio-cell
13
- {"type": "markdown", "id": "cell_5335e20a3e7b", "created_at": "2026-08-03T03:19:02+00:00", "title": "Toy numerical illustration"}
14
- -->
15
- [toy numerical illustration] Not a formal proof-check of Theorem 3.7's exact bound (that would require verifying the proof in Appendix A.6, not code). Instead, numerically measured the guided-search budget needed to reach a near-optimal joint action as the number of agents (n) grows from 3 to 8, and compared against the size of the full joint-action space (d^n) that a standard UCB-style method would need to enumerate for comparable coverage. Measured separation ratios: n=3 -> 160.0x, n=4 -> 1,032.6x, n=5 -> 7,447.3x, n=6 -> 90,394.5x, n=7 -> 533,174.2x, n=8 -> 7,190,235.4x. The ratio grew ~44,939x from n=3 to n=8 while the full joint-action space itself only grew 32,768x over the same range -- i.e. the separation ratio is growing faster than the space itself, consistent with an exponential-in-n advantage as claimed by Theorem 3.7, though this illustrates the qualitative trend rather than verifying the theorem's precise constants.
 
3
 
4
  ---
5
  <!-- trackio-cell
6
+ {"type": "markdown", "id": "cell_fc84cbd6fd77", "created_at": "2026-08-03T06:36:47+00:00", "title": "Not attempted. Same reasoning as Claim 2 -- theoretical claim (Appendix A.6), p…"}
7
  -->
8
  Not attempted. Same reasoning as Claim 2 -- theoretical claim (Appendix A.6), proof review deprioritized given time constraints.
 
 
 
 
 
 
 
pages/claim-4-matgame-8-agent-10-action-nonlinear/page.md CHANGED
@@ -3,327 +3,6 @@
3
 
4
  ---
5
  <!-- trackio-cell
6
- {"type": "markdown", "id": "cell_bc24ae0bf5e1", "created_at": "2026-08-03T03:15:00+00:00", "title": "[toy / partial] Built a generalized N-agent MatGame environment implementing th…"}
7
  -->
8
  **[toy / partial]** Built a generalized N-agent MatGame environment implementing the exact reward rule from Appendix D (linear = sum of agent action indices; nonlinear = linear sum + Gaussian(0,2^2) + Uniform(-3,3) noise). Sanity-checked reward scale against Table 1: random-policy episodes on the 8x10 nonlinear config average ~370-380 out of a 720 max, consistent with the paper's trained-baseline range of 587-712 sitting well above random. Confirmed the underlying MAZero codebase (which NonZero extends, per the paper's own Appendix C) builds and trains successfully on a single Kaggle T4 GPU, converging to the optimal joint policy (test score 100.0 +/- 0.0) on the repo's built-in matgame3 config. Began implementing NonUCT's selection rule as a C++ patch to MAZero's MCTS node scoring (cnode.h/cnode.cpp): added hooks for a precomputed surrogate score, blended additively into the existing pUCT formula, gated by a weight defaulting to 0 so baseline behavior is unaffected unless explicitly enabled. This patch compiles successfully. **Not completed**: the Cython bindings (cytree.pyx) needed to call these new C++ hooks from Python were not implemented, so no NonZero-vs-MAZero training comparison was run, and Table 1's actual numbers (697.1 vs 672.3) were not reproduced or falsified.
9
-
10
-
11
- ---
12
- <!-- trackio-cell
13
- {"type": "code", "id": "cell_e6b23a9eda0a", "created_at": "2026-08-03T03:18:41+00:00", "title": "Run: hf claim4_toy_comparison.py (exit 0)", "command": ["hf", "jobs", "uv", "run", "--flavor", "cpu-basic", "--secrets", "HF_TOKEN", "claim4_toy_comparison.py"], "exit_code": 0, "duration_s": 55.853}
14
- -->
15
- ````bash
16
- $ hf jobs uv run --flavor cpu-basic --secrets HF_TOKEN claim4_toy_comparison.py
17
- ````
18
-
19
- exit 0 · 55.9s
20
-
21
-
22
- ````python title=claim4_toy_comparison.py
23
-
24
- # /// script
25
- # dependencies = ["torch", "numpy"]
26
- # ///
27
- """
28
- Claim 4 -- toy-scale head-to-head comparison on the paper's exact
29
- 8-agent, 10-action nonlinear MatGame setting (Table 1). Vectorized
30
- version: candidate generation uses precomputed batched tensor masks
31
- instead of per-candidate Python loops, since the naive version is too
32
- slow for 2000 decisions.
33
- """
34
-
35
- import torch
36
- import torch.nn as nn
37
- import numpy as np
38
-
39
-
40
- class MatgameNonZeroEnv:
41
- def __init__(self, n_agents=8, n_actions=10, reward_type="nonlinear",
42
- noise_std=2.0, noise_uniform_range=3.0, seed=None):
43
- self.n_agents = n_agents
44
- self.n_actions = n_actions
45
- self.reward_type = reward_type
46
- self.noise_std = noise_std
47
- self.noise_uniform_range = noise_uniform_range
48
- self._rng = np.random.default_rng(seed)
49
-
50
- def joint_reward(self, actions):
51
- base = float(np.sum(actions))
52
- if self.reward_type == "linear":
53
- return base
54
- u = self._rng.normal(0.0, self.noise_std)
55
- v = self._rng.uniform(-self.noise_uniform_range, self.noise_uniform_range)
56
- return base + u + v
57
-
58
-
59
- class VectorizedProposer:
60
- def __init__(self, n_agents, n_actions, c=1.0, alpha=1.0):
61
- self.n_agents, self.n_actions = n_agents, n_actions
62
- self.nd = n_agents * n_actions
63
- self.c, self.alpha = c, alpha
64
-
65
- rows1 = n_agents * n_actions
66
- self.agent1 = torch.zeros(rows1, dtype=torch.long)
67
- self.action1 = torch.zeros(rows1, dtype=torch.long)
68
- self.block_mask1 = torch.zeros(rows1, self.nd)
69
- self.target1 = torch.zeros(rows1, self.nd)
70
- r = 0
71
- for i in range(n_agents):
72
- for j in range(n_actions):
73
- self.agent1[r], self.action1[r] = i, j
74
- self.block_mask1[r, i * n_actions:(i + 1) * n_actions] = 1.0
75
- self.target1[r, i * n_actions + j] = 1.0
76
- r += 1
77
-
78
- pairs = [(i, j) for i in range(n_agents) for j in range(i + 1, n_agents)]
79
- rows2 = len(pairs) * n_actions * n_actions
80
- self.pair_i = torch.zeros(rows2, dtype=torch.long)
81
- self.pair_j = torch.zeros(rows2, dtype=torch.long)
82
- self.action_i = torch.zeros(rows2, dtype=torch.long)
83
- self.action_j = torch.zeros(rows2, dtype=torch.long)
84
- self.block_mask2 = torch.zeros(rows2, self.nd)
85
- self.target2 = torch.zeros(rows2, self.nd)
86
- r = 0
87
- for (i, j) in pairs:
88
- for ai in range(n_actions):
89
- for aj in range(n_actions):
90
- self.pair_i[r], self.pair_j[r] = i, j
91
- self.action_i[r], self.action_j[r] = ai, aj
92
- self.block_mask2[r, i * n_actions:(i + 1) * n_actions] = 1.0
93
- self.block_mask2[r, j * n_actions:(j + 1) * n_actions] = 1.0
94
- self.target2[r, i * n_actions + ai] = 1.0
95
- self.target2[r, j * n_actions + aj] = 1.0
96
- r += 1
97
-
98
- def one_hot(self, agent_actions):
99
- agent_actions = torch.as_tensor(agent_actions, dtype=torch.long)
100
- oh = torch.nn.functional.one_hot(agent_actions, num_classes=self.n_actions)
101
- return oh.reshape(-1).float()
102
-
103
- def eta(self, theta, a_batch):
104
- return self.c * torch.asinh(self.alpha * (theta.unsqueeze(0) * a_batch).sum(dim=-1))
105
-
106
- def best_candidate(self, theta, cur_enc, current_actions):
107
- cur_eta = self.eta(theta, cur_enc.unsqueeze(0)).item()
108
-
109
- cand1 = cur_enc.unsqueeze(0) * (1 - self.block_mask1) + self.target1
110
- eta1 = self.eta(theta, cand1)
111
- current_action1 = torch.as_tensor(current_actions)[self.agent1]
112
- self_mask1 = (self.action1 == current_action1)
113
- eta1 = eta1.masked_fill(self_mask1, -float("inf"))
114
- delta1 = eta1 - cur_eta
115
- best1_val, best1_idx = delta1.max(dim=0)
116
-
117
- cand2 = cur_enc.unsqueeze(0) * (1 - self.block_mask2) + self.target2
118
- eta2 = self.eta(theta, cand2)
119
- cur_ai = torch.as_tensor(current_actions)[self.pair_i]
120
- cur_aj = torch.as_tensor(current_actions)[self.pair_j]
121
- self_mask2 = (self.action_i == cur_ai) | (self.action_j == cur_aj)
122
- eta2 = eta2.masked_fill(self_mask2, -float("inf"))
123
- delta2 = eta2 - cur_eta
124
- best2_val, best2_idx = delta2.max(dim=0)
125
-
126
- if best1_val.item() >= best2_val.item():
127
- agent_idx, new_action = self.agent1[best1_idx].item(), self.action1[best1_idx].item()
128
- candidate_actions = current_actions.copy()
129
- candidate_actions[agent_idx] = new_action
130
- else:
131
- i, j = self.pair_i[best2_idx].item(), self.pair_j[best2_idx].item()
132
- ai, aj = self.action_i[best2_idx].item(), self.action_j[best2_idx].item()
133
- candidate_actions = current_actions.copy()
134
- candidate_actions[i], candidate_actions[j] = ai, aj
135
-
136
- return candidate_actions
137
-
138
-
139
- def fit_surrogate(env, n_agents, n_actions, n_samples=4000, n_epochs=1500, rng=None):
140
- actions = rng.integers(0, n_actions, size=(n_samples, n_agents))
141
- rewards = torch.tensor([env.joint_reward(a) for a in actions], dtype=torch.float32)
142
- onehots = torch.nn.functional.one_hot(torch.tensor(actions, dtype=torch.long), num_classes=n_actions)
143
- a_enc = onehots.reshape(n_samples, -1).float()
144
-
145
- nd = n_agents * n_actions
146
- theta = nn.Parameter(torch.zeros(nd))
147
- log_c, log_alpha = nn.Parameter(torch.zeros(())), nn.Parameter(torch.zeros(()))
148
- opt = torch.optim.Adam([theta, log_c, log_alpha], lr=0.05)
149
- sched = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=n_epochs)
150
-
151
- for _ in range(n_epochs):
152
- opt.zero_grad()
153
- pred = torch.exp(log_c) * torch.asinh(torch.exp(log_alpha) * (theta * a_enc).sum(dim=-1))
154
- loss = ((pred - rewards) ** 2).mean()
155
- loss.backward()
156
- opt.step()
157
- sched.step()
158
- return theta.detach()
159
-
160
-
161
- def nonzero_style_decision(env, proposer, theta, budget, rng):
162
- n_agents, n_actions = env.n_agents, env.n_actions
163
- current = rng.integers(0, n_actions, size=n_agents)
164
- best_reward = env.joint_reward(current)
165
- evals_used = 1
166
-
167
- while evals_used < budget:
168
- cur_enc = proposer.one_hot(current)
169
- candidate_actions = proposer.best_candidate(theta, cur_enc, current)
170
- real_reward = env.joint_reward(candidate_actions)
171
- evals_used += 1
172
-
173
- if real_reward > best_reward:
174
- current = candidate_actions
175
- best_reward = real_reward
176
- else:
177
- break
178
-
179
- return best_reward
180
-
181
-
182
- def mazero_style_decision(env, budget, rng):
183
- best_reward = -float("inf")
184
- for _ in range(budget):
185
- actions = rng.integers(0, env.n_actions, size=env.n_agents)
186
- r = env.joint_reward(actions)
187
- if r > best_reward:
188
- best_reward = r
189
- return best_reward
190
-
191
-
192
- def main():
193
- print("=" * 70)
194
- print("NonZero reproduction -- Claim 4 toy comparison (vectorized)")
195
- print("Setting: 8 agents, 10 actions, nonlinear (Table 1's hardest config)")
196
- print("2000 sequential decisions, equal real-eval budget per decision")
197
- print("=" * 70)
198
-
199
- n_agents, n_actions = 8, 10
200
- n_steps = 2000
201
- budget_per_step = 15
202
-
203
- rng_fit = np.random.default_rng(0)
204
- env_fit = MatgameNonZeroEnv(n_agents=n_agents, n_actions=n_actions,
205
- reward_type="nonlinear", seed=1)
206
- theta = fit_surrogate(env_fit, n_agents, n_actions, rng=rng_fit)
207
- proposer = VectorizedProposer(n_agents, n_actions)
208
- print(f"\nSurrogate fit complete. Candidate masks precomputed "
209
- f"({proposer.block_mask1.shape[0]} first-order + "
210
- f"{proposer.block_mask2.shape[0]} second-order candidates/decision).")
211
-
212
- nonzero_rewards, mazero_rewards = [], []
213
- for step in range(n_steps):
214
- env_a = MatgameNonZeroEnv(n_agents=n_agents, n_actions=n_actions,
215
- reward_type="nonlinear", seed=5000 + step)
216
- rng_a = np.random.default_rng(3000 + step)
217
- nonzero_rewards.append(nonzero_style_decision(env_a, proposer, theta, budget_per_step, rng_a))
218
-
219
- env_b = MatgameNonZeroEnv(n_agents=n_agents, n_actions=n_actions,
220
- reward_type="nonlinear", seed=5000 + step)
221
- rng_b = np.random.default_rng(3000 + step)
222
- mazero_rewards.append(mazero_style_decision(env_b, budget_per_step, rng_b))
223
-
224
- if (step + 1) % 400 == 0:
225
- print(f" ...{step + 1}/{n_steps} decisions completed")
226
-
227
- nz_mean, nz_std = np.mean(nonzero_rewards), np.std(nonzero_rewards)
228
- mz_mean, mz_std = np.mean(mazero_rewards), np.std(mazero_rewards)
229
- improvement = (nz_mean - mz_mean) / abs(mz_mean) * 100
230
-
231
- print(f"\n[Results over {n_steps} decisions, budget={budget_per_step}/decision]")
232
- print(f" NonZero-style (guided proposal): {nz_mean:.2f} +/- {nz_std:.2f}")
233
- print(f" MAZero-style (random sampled): {mz_mean:.2f} +/- {mz_std:.2f}")
234
- print(f" Improvement: {improvement:+.1f}%")
235
-
236
- print("\n" + "=" * 70)
237
- print("SUMMARY")
238
- if nz_mean > mz_mean:
239
- print(f" PASS (toy scale): NonZero-style guided proposal outperforms")
240
- print(f" MAZero-style random sampling by {improvement:.1f}% under equal budget.")
241
- else:
242
- print(f" FAIL: guided proposal did NOT outperform the baseline.")
243
- print("=" * 70)
244
-
245
-
246
- if __name__ == "__main__":
247
- main()
248
-
249
- ````
250
-
251
-
252
- ````output
253
- /usr/local/lib/python3.12/dist-packages/huggingface_hub/utils/_experimental.py:59: UserWarning: 'HfApi.run_uv_job' is experimental and might be subject to breaking changes in the future without prior notice. You can disable this warning by setting `HF_HUB_DISABLE_EXPERIMENTAL_WARNING=1` as environment variable.
254
- warnings.warn(
255
- Job started with ID: 6a70085a6b79c09949c20239
256
- View at: https://huggingface.co/jobs/byte-vortex/6a70085a6b79c09949c20239
257
- Downloading nvidia-cuda-runtime (2.1MiB)
258
- Downloading nvidia-cudnn-cu13 (349.2MiB)
259
- Downloading nvidia-nvjitlink (38.9MiB)
260
- Downloading numpy (15.9MiB)
261
- Downloading nvidia-cuda-cupti (10.2MiB)
262
- Downloading nvidia-nvshmem-cu13 (57.6MiB)
263
- Downloading torch (502.2MiB)
264
- Downloading nvidia-cublas (403.5MiB)
265
- Downloading sympy (6.0MiB)
266
- Downloading nvidia-cusolver (191.6MiB)
267
- Downloading triton (188.6MiB)
268
- Downloading nvidia-cusparse (139.2MiB)
269
- Downloading nvidia-cuda-nvrtc (86.0MiB)
270
- Downloading nvidia-cusparselt-cu13 (162.3MiB)
271
- Downloading nvidia-curand (56.8MiB)
272
- Downloading nvidia-cufile (1.2MiB)
273
- Downloading nvidia-nccl-cu13 (196.4MiB)
274
- Downloading cuda-bindings (6.3MiB)
275
- Downloading nvidia-cufft (204.2MiB)
276
- Downloading networkx (2.0MiB)
277
- Downloaded nvidia-cufile
278
- Downloaded nvidia-cuda-runtime
279
- Downloaded networkx
280
- Downloaded cuda-bindings
281
- Downloaded nvidia-cuda-cupti
282
- Downloaded numpy
283
- Downloaded nvidia-nvjitlink
284
- Downloaded sympy
285
- Downloaded nvidia-curand
286
- Downloaded nvidia-nvshmem-cu13
287
- Downloaded nvidia-cuda-nvrtc
288
- Downloaded nvidia-cusparse
289
- Downloaded nvidia-cusparselt-cu13
290
- Downloaded nvidia-cusolver
291
- Downloaded nvidia-nccl-cu13
292
- Downloaded nvidia-cufft
293
- Downloaded triton
294
- Downloaded nvidia-cudnn-cu13
295
- Downloaded nvidia-cublas
296
- Downloaded torch
297
- Installed 30 packages in 233ms
298
- ======================================================================
299
- NonZero reproduction -- Claim 4 toy comparison (vectorized)
300
- Setting: 8 agents, 10 actions, nonlinear (Table 1's hardest config)
301
- 2000 sequential decisions, equal real-eval budget per decision
302
- ======================================================================
303
-
304
- Surrogate fit complete. Candidate masks precomputed (80 first-order + 2800 second-order candidates/decision).
305
- ...400/2000 decisions completed
306
- ...800/2000 decisions completed
307
- ...1200/2000 decisions completed
308
- ...1600/2000 decisions completed
309
- ...2000/2000 decisions completed
310
-
311
- [Results over 2000 decisions, budget=15/decision]
312
- NonZero-style (guided proposal): 72.97 +/- 2.59
313
- MAZero-style (random sampled): 50.84 +/- 4.51
314
- Improvement: +43.5%
315
-
316
- ======================================================================
317
- SUMMARY
318
- PASS (toy scale): NonZero-style guided proposal outperforms
319
- MAZero-style random sampling by 43.5% under equal budget.
320
- ======================================================================
321
-
322
- ````
323
-
324
-
325
- ---
326
- <!-- trackio-cell
327
- {"type": "markdown", "id": "cell_f8bf8352bab1", "created_at": "2026-08-03T03:18:46+00:00", "title": "NonUCT integration -- deeper findings (not completed)"}
328
- -->
329
- Deeper investigation into wiring NonUCT into the real MCTS search (beyond the toy comparison above): confirmed each C++ tree node stores its own joint action (`int *action`) that led to it, and that Python-to-C++ bindings for setting a NonUCT weight/scores were successfully built and tested (see the batch-bindings patch). However, full integration requires more than initially scoped: child actions are sampled and deduplicated internally in C++ (variable count per node, unknown to Python in advance), meaning real wiring needs additional getters to query actual sampled actions per node after each expansion, a trained state-conditioned theta-head network (a real architecture/training-loop change), and careful indexing into the node pool. This was assessed as a substantial additional engineering effort beyond what could be safely completed and verified without live debugging capability, and was not completed. Documenting this honestly rather than shipping unverified wiring.
 
3
 
4
  ---
5
  <!-- trackio-cell
6
+ {"type": "markdown", "id": "cell_47caf832ba70", "created_at": "2026-08-03T06:36:47+00:00", "title": "[toy / partial] Built a generalized N-agent MatGame environment implementing th…"}
7
  -->
8
  **[toy / partial]** Built a generalized N-agent MatGame environment implementing the exact reward rule from Appendix D (linear = sum of agent action indices; nonlinear = linear sum + Gaussian(0,2^2) + Uniform(-3,3) noise). Sanity-checked reward scale against Table 1: random-policy episodes on the 8x10 nonlinear config average ~370-380 out of a 720 max, consistent with the paper's trained-baseline range of 587-712 sitting well above random. Confirmed the underlying MAZero codebase (which NonZero extends, per the paper's own Appendix C) builds and trains successfully on a single Kaggle T4 GPU, converging to the optimal joint policy (test score 100.0 +/- 0.0) on the repo's built-in matgame3 config. Began implementing NonUCT's selection rule as a C++ patch to MAZero's MCTS node scoring (cnode.h/cnode.cpp): added hooks for a precomputed surrogate score, blended additively into the existing pUCT formula, gated by a weight defaulting to 0 so baseline behavior is unaffected unless explicitly enabled. This patch compiles successfully. **Not completed**: the Cython bindings (cytree.pyx) needed to call these new C++ hooks from Python were not implemented, so no NonZero-vs-MAZero training comparison was run, and Table 1's actual numbers (697.1 vs 672.3) were not reproduced or falsified.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
pages/claim-5-smac-win-rate/page.md CHANGED
@@ -3,6 +3,6 @@
3
 
4
  ---
5
  <!-- trackio-cell
6
- {"type": "markdown", "id": "cell_b2d27aa58fe1", "created_at": "2026-08-03T03:15:01+00:00", "title": "Not attempted. The official MAZero training recipe (which NonZero extends) targ…"}
7
  -->
8
  Not attempted. The official MAZero training recipe (which NonZero extends) targets an NVIDIA A100 80GB per the repository documentation; free-tier compute available (Kaggle T4/P100, 16GB) is well below this, and SMAC training runs reported in the paper likely require many hours even for baseline methods. A heavily reduced/short-horizon smoke test was considered but would not produce numbers comparable to Figure 1's claims, so was not attempted rather than reporting a misleading partial result.
 
3
 
4
  ---
5
  <!-- trackio-cell
6
+ {"type": "markdown", "id": "cell_c196a0862a2f", "created_at": "2026-08-03T06:36:48+00:00", "title": "Not attempted. The official MAZero training recipe (which NonZero extends) targ…"}
7
  -->
8
  Not attempted. The official MAZero training recipe (which NonZero extends) targets an NVIDIA A100 80GB per the repository documentation; free-tier compute available (Kaggle T4/P100, 16GB) is well below this, and SMAC training runs reported in the paper likely require many hours even for baseline methods. A heavily reduced/short-horizon smoke test was considered but would not produce numbers comparable to Figure 1's claims, so was not attempted rather than reporting a misleading partial result.
pages/claim-6-smacv2-win-rate-ablations/page.md CHANGED
@@ -3,6 +3,6 @@
3
 
4
  ---
5
  <!-- trackio-cell
6
- {"type": "markdown", "id": "cell_3ceab82f71e9", "created_at": "2026-08-03T03:15:02+00:00", "title": "Not attempted. Same reasoning as Claim 5 -- SMACv2 has the same compute require…"}
7
  -->
8
  Not attempted. Same reasoning as Claim 5 -- SMACv2 has the same compute requirements as SMAC, out of reach on available free-tier GPU.
 
3
 
4
  ---
5
  <!-- trackio-cell
6
+ {"type": "markdown", "id": "cell_5e797dcc3d36", "created_at": "2026-08-03T06:36:49+00:00", "title": "Not attempted. Same reasoning as Claim 5 -- SMACv2 has the same compute require…"}
7
  -->
8
  Not attempted. Same reasoning as Claim 5 -- SMACv2 has the same compute requirements as SMAC, out of reach on available free-tier GPU.
pages/conclusion/page.md CHANGED
@@ -3,26 +3,8 @@
3
 
4
  ---
5
  <!-- trackio-cell
6
- {"type": "artifact", "id": "cell_0b5825058957", "created_at": "2026-08-03T03:15:03+00:00", "title": "Reproduction bundle (environment, surrogate, validation script, C++ patch)", "artifact": "nonzero-repro/repro-bundle:v1", "artifact_type": "dataset"}
7
  -->
8
  **📦 Artifact** `nonzero-repro/repro-bundle:v1` · dataset
9
 
10
  trackio-artifact://nonzero-repro/repro-bundle:v1
11
-
12
-
13
- ---
14
- <!-- trackio-cell
15
- {"type": "markdown", "id": "cell_23f926b46ab4", "created_at": "2026-08-03T03:15:12+00:00", "title": "Acknowledgments"}
16
- -->
17
- This reproduction was completed with assistance from Claude (Anthropic), used as a coding/research agent throughout: reading and interpreting the paper, writing and debugging the environment/surrogate/C++ code, diagnosing build and Kaggle environment issues, and drafting this logbook. All claims of what was and wasn't verified reflect the actual code that was run and its outputs, checked at each step before being reported here.
18
-
19
-
20
- ---
21
- <!-- trackio-cell
22
- {"type": "markdown", "id": "cell_eb82b0dcf26b", "created_at": "2026-08-03T03:17:40+00:00", "title": "Supporting code (corrected)"}
23
- -->
24
- All supporting code for this reproduction (the MatGame environment, asinh-GLM surrogate, validation script, and the NonUCT C++ patch) is available in this reproduction's Hugging Face Bucket:
25
-
26
- hf://buckets/byte-vortex/nonzero-repro-artifacts
27
-
28
- Browsable at: https://huggingface.co/buckets/byte-vortex/nonzero-repro-artifacts
 
3
 
4
  ---
5
  <!-- trackio-cell
6
+ {"type": "artifact", "id": "cell_d56cc802b908", "created_at": "2026-08-03T06:36:50+00:00", "title": "Reproduction bundle (environment, surrogate, validation script, C++ patch)", "artifact": "nonzero-repro/repro-bundle:v1", "artifact_type": "dataset"}
7
  -->
8
  **📦 Artifact** `nonzero-repro/repro-bundle:v1` · dataset
9
 
10
  trackio-artifact://nonzero-repro/repro-bundle:v1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
pages/executive-summary/page.md CHANGED
@@ -3,7 +3,7 @@
3
 
4
  ---
5
  <!-- trackio-cell
6
- {"type": "markdown", "id": "cell_136a6c0f90f6", "created_at": "2026-08-03T03:15:04+00:00", "title": "Executive summary", "pinned": true, "pinned_at": "2026-08-03T03:15:05+00:00"}
7
  -->
8
  Partial reproduction of NonZero. Of the paper's 6 claims, Claim 1's core mathematical formulation was verified exactly (finite-difference identity holds to floating-point precision), and the surrogate model was shown to learn true reward structure at its theoretical noise ceiling (R2=0.90) on a toy-scale test. Claim 4's supporting infrastructure (environment, baseline training pipeline, and a compiling but not-yet-wired C++ patch for NonUCT) was built and validated at the component level, but no end-to-end NonZero-vs-baseline comparison was completed, so Table 1's reported numbers were neither reproduced nor falsified. Claims 2-3 (theoretical proofs) and Claims 5-6 (SMAC/SMACv2) were not attempted: the former due to time constraints, the latter because the paper's own training recipe requires A100-class GPU hardware unavailable on free-tier compute. All work was done on a single Kaggle T4 GPU, free tier, over approximately 3 hours.
9
 
@@ -20,7 +20,7 @@ Partial reproduction of NonZero. Of the paper's 6 claims, Claim 1's core mathema
20
 
21
  ---
22
  <!-- trackio-cell
23
- {"type": "figure", "id": "cell_5e6639f110f0", "created_at": "2026-08-03T03:15:07+00:00", "title": "Poster", "pinned": true, "pinned_at": "2026-08-03T03:15:08+00:00"}
24
  -->
25
  ````html
26
  <!DOCTYPE html>
@@ -69,20 +69,3 @@ Partial reproduction of NonZero. Of the paper's 6 claims, Claim 1's core mathema
69
  <footer>Full logbook: <a href="https://huggingface.co/spaces/byte-vortex/nonzero-repro">huggingface.co/spaces/byte-vortex/nonzero-repro</a></footer>
70
  </body></html>
71
  ````
72
-
73
-
74
- ---
75
- <!-- trackio-cell
76
- {"type": "markdown", "id": "cell_a5ec59b3a5d2", "created_at": "2026-08-03T03:18:45+00:00", "title": "Executive summary (updated)"}
77
- -->
78
- Partial reproduction of NonZero. Of the paper's 6 claims: Claim 1 was verified at toy scale with genuine evidence -- the finite-difference identity holds exactly, and a real Hugging Face Job run showed the paper's full proposal mechanism (first- and second-order difference operators) outperforming random search by 43.4% under equal evaluation budget. Claim 2 (regret bound, Theorem 3.5) was reviewed against the actual proof in the paper (Appendix A.2-A.5): the proof strategy and algebra are internally consistent and use standard techniques, but it analyzes an idealized continuous-update proxy for NonUCT rather than the literal discrete finite-difference mechanism in Algorithm 1, and its complexity constants aren't derived for the paper's actual hypernetwork architecture -- so the proof holds as written but leaves an unverified gap between theory and the described algorithm. Claim 3 (efficiency separation, Theorem 3.7) has a toy numerical illustration extended to n=3..8 agents: the guided-search-budget-vs-full-space separation ratio grew from 160x (n=3) to ~7.19 million x (n=8), a ~44,939x growth while the full joint-action space itself only grew 32,768x over the same range -- consistent with the theorem's claimed exponential-in-n advantage, though this is a qualitative illustration, not a check of the theorem's exact constants. Claim 4 has a toy-scale empirical result (a real HF Job showing the same mechanism outperforming a MAZero-style random-sampling baseline by 43.5% on the paper's exact 8-agent/10-action/nonlinear configuration) plus validated supporting infrastructure (environment, baseline training pipeline, and a compiling C++ patch for NonUCT) -- but no full trained NonZero-vs-baseline comparison was completed, so Table 1's exact reported numbers (697.1 vs 672.3) were neither reproduced nor falsified. Claims 5-6 (SMAC/SMACv2) were not attempted: the paper's own training recipe requires A100-class GPU hardware unavailable on free-tier compute.
79
-
80
- ## Scope & cost
81
-
82
- | | This reproduction | Full replication |
83
- |---|---|---|
84
- | Scope | Claim 1 (verified, toy) + Claim 2 (proof reviewed) + Claim 3 (extended toy illustration) + Claim 4 (toy empirical result + infrastructure) | All 6 claims incl. SMAC/SMACv2 |
85
- | Hardware | Kaggle T4 (free tier) + Hugging Face Jobs (cpu-basic) | Cluster of NVIDIA A100/A6000 GPUs |
86
- | Compute time | ~3-4 hours | Many GPU-days |
87
- | Cost | $0 | Thousands of dollars |
88
- | Outcome | Claim 1 verified (toy scale, real evidence); Claim 2 proof reviewed (gap noted, not a numerical claim); Claim 3 toy illustration extended (n=3..8); Claim 4 toy result + infrastructure validated, full comparison not completed; Claims 5-6 not attempted (compute-bound) |
 
3
 
4
  ---
5
  <!-- trackio-cell
6
+ {"type": "markdown", "id": "cell_d88acdf95264", "created_at": "2026-08-03T06:36:51+00:00", "title": "Executive summary", "pinned": true, "pinned_at": "2026-08-03T06:36:52+00:00"}
7
  -->
8
  Partial reproduction of NonZero. Of the paper's 6 claims, Claim 1's core mathematical formulation was verified exactly (finite-difference identity holds to floating-point precision), and the surrogate model was shown to learn true reward structure at its theoretical noise ceiling (R2=0.90) on a toy-scale test. Claim 4's supporting infrastructure (environment, baseline training pipeline, and a compiling but not-yet-wired C++ patch for NonUCT) was built and validated at the component level, but no end-to-end NonZero-vs-baseline comparison was completed, so Table 1's reported numbers were neither reproduced nor falsified. Claims 2-3 (theoretical proofs) and Claims 5-6 (SMAC/SMACv2) were not attempted: the former due to time constraints, the latter because the paper's own training recipe requires A100-class GPU hardware unavailable on free-tier compute. All work was done on a single Kaggle T4 GPU, free tier, over approximately 3 hours.
9
 
 
20
 
21
  ---
22
  <!-- trackio-cell
23
+ {"type": "figure", "id": "cell_735d6e9d1f35", "created_at": "2026-08-03T06:36:56+00:00", "title": "Poster", "pinned": true, "pinned_at": "2026-08-03T06:36:56+00:00"}
24
  -->
25
  ````html
26
  <!DOCTYPE html>
 
69
  <footer>Full logbook: <a href="https://huggingface.co/spaces/byte-vortex/nonzero-repro">huggingface.co/spaces/byte-vortex/nonzero-repro</a></footer>
70
  </body></html>
71
  ````
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
workspace.json CHANGED
@@ -8,21 +8,6 @@
8
  "url": "https://huggingface.co/spaces/byte-vortex/nonzero-repro",
9
  "type": "Spaces",
10
  "label": "byte-vortex/nonzero-repro"
11
- },
12
- {
13
- "url": "https://huggingface.co/jobs/byte-vortex/6a7007c56b79c09949c20232",
14
- "type": "Jobs",
15
- "label": "byte-vortex/6a7007c56b79c09949c20232"
16
- },
17
- {
18
- "url": "https://huggingface.co/jobs/byte-vortex/6a70085a6b79c09949c20239",
19
- "type": "Jobs",
20
- "label": "byte-vortex/6a70085a6b79c09949c20239"
21
- },
22
- {
23
- "url": "https://huggingface.co/buckets/byte-vortex/nonzero-repro-artifacts",
24
- "type": "Buckets",
25
- "label": "byte-vortex/nonzero-repro-artifacts"
26
  }
27
  ],
28
  "reference_only": true
 
8
  "url": "https://huggingface.co/spaces/byte-vortex/nonzero-repro",
9
  "type": "Spaces",
10
  "label": "byte-vortex/nonzero-repro"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  }
12
  ],
13
  "reference_only": true