TTT-Discover clean run (v3) β€” ac2 β€” step 1

LoRA adapter (rank 32, all-linear) from the upstream-faithful local reproduction of TTT-Discover on autoresearch-bench ac2. Checkpoint saved after training step 0 (0-indexed). Strict upstream eval parity: 1100s hard kill, verbatim prompts/entrypoints, group 64x8, T=1.0, kl 0.1.

Step metrics

{
  "step": 0,
  "progress/batch": 0,
  "optim/lr": 4e-05,
  "progress/done_frac": 0.02,
  "puct/buffer_size": 8,
  "puct/sampled_size": 8,
  "puct/T": 0,
  "puct/scale_last": 1e-06,
  "puct/buffer_value/mean": 0.666666666666666,
  "puct/buffer_value/std": 2.1297770317619676e-15,
  "puct/buffer_value/min": 0.6666666666666612,
  "puct/buffer_value/max": 0.6666666666666689,
  "puct/buffer_timestep/mean": -1.0,
  "puct/buffer_timestep/std": 0.0,
  "puct/buffer_timestep/min": -1.0,
  "puct/buffer_timestep/max": -1.0,
  "puct/buffer_construction_len/mean": 4773.375,
  "puct/buffer_construction_len/std": 1995.2797383763009,
  "puct/buffer_construction_len/min": 1726.0,
  "puct/buffer_construction_len/max": 7414.0,
  "puct/sampled_value/mean": 0.666666666666666,
  "puct/sampled_value/std": 2.1297770317619676e-15,
  "puct/sampled_value/min": 0.6666666666666612,
  "puct/sampled_value/max": 0.6666666666666689,
  "puct/sampled_timestep/mean": -1.0,
  "puct/sampled_timestep/std": 0.0,
  "puct/sampled_timestep/min": -1.0,
  "puct/sampled_timestep/max": -1.0,
  "puct/sampled_construction_len/mean": 4773.375,
  "puct/sampled_construction_len/std": 1995.2797383763009,
  "puct/sampled_construction_len/min": 1726.0,
  "puct/sampled_construction_len/max": 7414.0,
  "time/sampling": 3206.3807678222656,
  "env/all/ac_tokens_per_turn": 7496.861328125,
  "env/all/ob_tokens_per_turn": 4862.0,
  "env/all/turns_per_episode": 1.0,
  "env/all/total_episodes": 512,
  "env/all/total_turns": 512,
  "env/all/total_ac_tokens": 3838393,
  "env/all/total_ob_tokens": 2489344,
  "env/all/time/sampling_mean": 517.772373217158,
  "env/all/time/sampling_max": 695.4104588031769,
  "env/all/time/env_step_mean": 817.8070086957887,
  "env/all/time/env_step_max": 2513.324860572815,
  "env/all/reward/mean": 0.36427114852027276,
  "env/all/reward/max": 0.9242990420297577,
  "env/all/reward/min": 0.0,
  "env/all/format": 1.0,
  "env/all/format/min": 1.0,
  "env/all/format/max": 1.0,
  "env/all/reward": 0.36427114852027276,
  "env/all/correctness": 0.4140625,
  "env/all/correctness/min": 0.0,
  "env/all/correctness/max": 1.0,
  "env/all/raw_score": 0.8797491888791493,
  "env/all/raw_score/min": 0.02341711901022973,
  "env/all/raw_score/max": 0.9242990420297577,
  "env/all/initial_raw_score": 0.666666666666666,
  "env/all/initial_raw_score/min": 0.6666666666666612,
  "env/all/initial_raw_score/max": 0.6666666666666689,
  "env/all/msg": "Success; raw_score=0.9057502175519645",
  "env/all/parsed_code": "```python\n# EVOLVE-BLOCK-START\n\"\"\"Enhanced gradient-based population search with adaptive exploration/exploitation and refined upsampling for maximizing the C2 lower bound.\"\"\"\nimport numpy as np\nfrom typing import Tuple\n\n\ndef _simpson_l2sq(conv: np.ndarray) -> Tuple[float, np.ndarray]:\n    \"\"\"\n    Compute ||f*f||_2^2 via Simpson-like piecewise-linear rule with endpoint zeros,\n    and return its gradient w.r.t conv (same length as conv).\n    \"\"\"\n    m = conv.size\n    if m == 0:\n        return 0.0, np.zeros_like(conv)\n\n    dx = 1.0 / (m + 1)\n\n    y = np.empty(m + 2, dtype=conv.dtype)\n    y[0] = 0.0\n    y[1:-1] = conv\n    y[-1] = 0.0\n\n    lhs = y[:-1]\n    rhs = y[1:]\n    l2_sq = (dx / 3.0) * np.sum(lhs * lhs + lhs * rhs + rhs * rhs)\n\n    grad_y = (dx / 3.0) * (4.0 * y + np.roll(y, 1) + np.roll(y, -1))\n    grad_conv = grad_y[1:-1]\n\n    return float(l2_sq), grad_conv\n\n\ndef _l1(conv: np.ndarray) -> Tuple[float, np.ndarray]:\n    \"\"\"||f*f||_1 = dx * sum(conv); gradient is dx * ones.\"\"\"\n    m = conv.size\n    dx = 1.0 / (m + 1) if m > 0 else 1.0\n    val = dx * float(np.sum(conv)) if m > 0 else 0.0\n    grad = np.full_like(conv, dx)\n    return val, grad\n\n\ndef _linf(conv: np.ndarray) -> Tuple[float, np.ndarray]:\n    \"\"\"||f*f||_inf = max(conv); subgradient: uniform over argmax set.\"\"\"\n    if conv.size == 0:\n        return 0.0, np.zeros_like(conv)\n    m = float(np.max(conv))\n    mask = conv == m\n    count = int(mask.sum())\n    if count == 0 or m <= 0.0:\n        return m, np.zeros_like(conv)\n    grad = mask.astype(conv.dtype) / count\n    return m, grad\n\n\ndef _objective_and_grad_conv(conv: np.ndarray) -> Tuple[float, np.ndarray]:\n    \"\"\"\n    Compute C = l2_sq / (l1 * linf) and gradient dC/d(conv) using quotient rule.\n    \"\"\"\n    l2_sq, g_l2 = _simpson_l2sq(conv)\n    l1, g_l1 = _l1(conv)\n    linf, g_linf = _linf(conv)\n\n    if l1 <= 0.0 or linf <= 0.0:\n        return 0.0, np.zeros_like(conv)\n\n    denom = l1 * linf\n    c_value = l2_sq / denom\n\n    num_grad = g_l2 * denom - l2_sq * (g_l1 * linf + l1 * g_linf)\n    g_conv = num_grad / (denom * denom)\n\n    return float(c_value), g_conv\n\n\ndef _grad_h_from_conv_grad(h: np.ndarray, g_conv: np.ndarray) -> np.ndarray:\n    \"\"\"\n    Given dC/d(conv) and conv = h * h (full convolution),\n    dC/dh = 2 * (g_conv convolved with reverse(h)) in valid mode (length N).\n    \"\"\"\n    h_rev = h[::-1]\n    g_h = np.convolve(g_conv, h_rev, mode=\"valid\")\n    return 2.0 * g_h\n\n\nclass _Adam:\n    \"\"\"Lightweight Adam optimizer for numpy arrays (per-candidate).\"\"\"\n\n    def __init__(self, shape, lr=3e-2, beta1=0.9, beta2=0.999, eps=1e-8, dtype=np.float32):\n        self.m = np.zeros(shape, dtype=dtype)\n        self.v = np.zeros(shape, dtype=dtype)\n        self.t = 0\n        self.lr = lr\n        self.b1 = beta1\n        self.b2 = beta2\n        self.eps = eps\n\n    def step(self, params, grad):\n        self.t += 1\n        self.m = self.b1 * self.m + (1 - self.b1) * grad\n        self.v = self.b2 * self.v + (1 - self.b2) * (grad * grad)\n        m_hat = self.m / (1 - self.b1 ** self.t)\n        v_hat = self.v / (1 - self.b2 ** self.t)\n        return params + self.lr * m_hat / (np.sqrt(v_hat) + self.eps)\n\n\ndef _batch_objective(h_batch: np.ndarray) -> Tuple[np.ndarray, list[np.ndarray]]:\n    \"\"\"Vectorized objective/conv-grad evaluation over a batch.\"\"\"\n    bsz = h_batch.shape[0]\n    c_vals = np.zeros(bsz, dtype=np.float32)\n    conv_grads = [None] * bsz\n    for b in range(bsz):\n        h = np.clip(h_batch[b], 0.0, None)\n        conv = np.convolve(h, h, mode=\"full\")\n        c_val, g_conv = _objective_and_grad_conv(conv)\n        c_vals[b] = c_val\n        conv_grads[b] = g_conv\n    return c_vals, conv_grads\n\n\ndef _phase_update(h_batch, opt_list, lr, add_noise=False, t=0, eta=1e-2, gamma=0.6):\n    \"\"\"One optimization step for the whole batch.\"\"\"\n    bsz = h_batch.shape[0]\n    c_vals, conv_grads = _batch_objective(h_batch)\n    grads = np.zeros_like(h_batch, dtype=h_batch.dtype)\n    for b in range(bsz):\n        clipped = np.clip(h_batch[b], 0.0, None)\n        grads[b] = _grad_h_from_conv_grad(clipped, conv_grads[b])\n\n    if add_noise:\n        sigma = eta / ((t + 1) ** gamma)\n        grads = grads + sigma * np.random.normal(size=grads.shape).astype(grads.dtype)\n\n    for b in range(bsz):\n        opt = opt_list[b]\n        opt.lr = lr\n        h_new = opt.step(h_batch[b], grads[b].astype(h_batch.dtype))\n        h_batch[b] = np.clip(h_new, 0.0, None)\n\n    return h_batch, c_vals\n\n\ndef _elitist_respawn(h_batch, c_vals, keep_frac, init_sampler, opt_list):\n    \"\"\"Keep top fraction and respawn the rest.\"\"\"\n    bsz = h_batch.shape[0]\n    keep_n = max(1, int(bsz * keep_frac))\n    idx = np.argsort(c_vals)[-keep_n:]\n    survivors = h_batch[idx].copy()\n\n    fresh = init_sampler(bsz - keep_n)\n    new_batch = np.concatenate([survivors, fresh], axis=0)\n\n    new_opts = []\n    for i in range(keep_n):\n        new_opts.append(opt_list[idx[i]])\n    for _ in range(bsz - keep_n):\n        new_opts.append(_Adam(shape=h_batch.shape[1:], lr=opt_list[0].lr, dtype=h_batch.dtype))\n\n    return new_batch, new_opts\n\n\ndef _upsample_1d(h: np.ndarray) -> np.ndarray:\n    \"\"\"Linear 2x upsampling on the search grid.\"\"\"\n    n = h.shape[0]\n    x_old = np.linspace(-0.5, 0.5, n)\n    x_new = np.linspace(-0.5, 0.5, 2 * n)\n    return np.interp(x_new, x_old, h)\n\n\ndef _single_candidate_finetune(h0: np.ndarray, lr=3e-3, steps=50_000) -> Tuple[np.ndarray, float]:\n    \"\"\"Pure exploitation (no noise) on a single vector with Adam + projection.\"\"\"\n    h = h0.astype(np.float32).copy()\n    opt = _Adam(h.shape, lr=lr, dtype=h.dtype)\n    last_c = 0.0\n    for _ in range(steps):\n        h_clip = np.clip(h, 0.0, None)\n        conv = np.convolve(h_clip, h_clip, mode=\"full\")\n        c_val, g_conv = _objective_and_grad_conv(conv)\n        g_h = _grad_h_from_conv_grad(h_clip, g_conv)\n        h = np.clip(opt.step(h, g_h.astype(h.dtype)), 0.0, None)\n        last_c = c_val\n    return h, float(last_c)\n\n\ndef construct_function():\n    \"\"\"\n    Enhanced four-phase gradient-based search with adaptive exploration/exploitation, refined hyperparameters,\n    and multi-stage upsample-refinement for maximizing R(f) = ||f*f||_2^2 / (||f*f||_1 * ||f*f||_inf).\n    \"\"\"\n    n = 512\n    bsz = 64\n    total_iter = 20_000\n    explore_steps = 10_000\n    drop_every = 10_000\n    keep_frac = 0.6\n    lr_explore = 5e-2\n    lr_exploit = 1e-3\n    eta, gamma = 1e-2, 0.6\n    dtype = np.float32\n\n    prev = globals().get(\"GLOBAL_BEST_CONSTRUCTION\")\n    if isinstance(prev, (list, tuple, np.ndarray)) and len(prev) > 0:\n        h_prev_best = np.array(prev, dtype=dtype)\n    else:\n        h_prev_best = np.ones(n, dtype=dtype)\n    h_prev_best = np.clip(h_prev_best, 0.0, None)\n\n    if h_prev_best.shape[0] != n:\n        x_old = np.linspace(-0.5, 0.5, h_prev_best.shape[0])\n        x_new = np.linspace(-0.5, 0.5, n)\n        h_prev_best = np.interp(x_new, x_old, h_prev_best).astype(dtype)\n\n    rng = np.random.default_rng()\n\n    def init_sampler(m):\n        out = rng.uniform(0.0, 1.0, size=(m, n)).astype(dtype)\n        if m > 0:\n            out[0] = h_prev_best\n        return out\n\n    h_batch = init_sampler(bsz)\n    opt_list = [_Adam(shape=(n,), lr=lr_explore, dtype=dtype) for _ in range(bsz)]\n    best_h = h_batch.copy()\n    best_c = np.full(bsz, -np.inf, dtype=dtype)\n\n    print(\"Starting population-based optimization...\")\n    for t in range(total_iter):\n        if t < explore_steps:\n            h_batch, c_vals = _phase_update(\n                h_batch, opt_list, lr=lr_explore, add_noise=True, t=t, eta=eta, gamma=gamma\n            )\n            print(f\"Exploration phase iteration {t+1}/{total_iter}: Best score {np.max(best_c):.6f}\")\n        else:\n            h_batch, c_vals = _phase_update(\n                h_batch, opt_list, lr=lr_exploit, add_noise=False, t=t, eta=eta, gamma=gamma\n            )\n            print(f\"Exploitation phase iteration {t+1}/{total_iter}: Best score {np.max(best_c):.6f}\")\n\n        improved = c_vals > best_c\n        best_c = np.where(improved, c_vals, best_c)\n        best_h[improved] = h_batch[improved]\n\n        if (t + 1) % drop_every == 0:\n            print(f\"Elitist respawn at iteration {t+1}\")\n            h_batch, opt_list = _elitist_respawn(\n                h_batch, c_vals, keep_frac=keep_frac, init_sampler=init_sampler, opt_list=opt_list\n            )\n\n    idx = int(np.argmax(best_c))\n    h_star = np.clip(best_h[idx].astype(np.float32), 0.0, None)\n\n    print(\"Starting first upsampling and fine-tuning...\")\n    h_up1 = _upsample_1d(h_star)\n    h_up1, _ = _single_candidate_finetune(h_up1, lr=3e-3, steps=60_000)\n    print(f\"First fine-tune score: {evaluate_sequence(h_up1.tolist()):.6f}\")\n\n    print(\"Starting second upsampling and fine-tuning...\")\n    h_up2 = _upsample_1d(h_up1)\n    h_up2, _ = _single_candidate_finetune(h_up2, lr=3e-3, steps=60_000)\n    print(f\"Second fine-tune score: {evaluate_sequence(h_up2.tolist()):.6f}\")\n\n    print(\"Starting third upsampling and fine-tuning...\")\n    h_up3 = _upsample_1d(h_up2)\n    h_up3, _ = _single_candidate_finetune(h_up3, lr=3e-3, steps=60_000)\n    print(f\"Third fine-tune score: {evaluate_sequence(h_up3.tolist()):.6f}\")\n\n    heights = np.clip(h_up3, 0.0, None)\n    r_value = evaluate_sequence(heights.tolist())\n    print(f\"Final C2 lower bound: {r_value:.6f}\")\n    return heights.tolist()\n# EVOLVE-BLOCK-END\n```",
  "env/all/time/policy": 517.772373217158,
  "env/all/time/policy/min": 232.84041047096252,
  "env/all/time/policy/max": 695.4104588031769,
  "env/all/time/env_step": 817.8070086957887,
  "env/all/time/env_step/min": 0.0064237117767333984,
  "env/all/time/env_step/max": 2513.324860572815,
  "env/all/time/reward_compute": 3.501772880554199e-07,
  "env/all/time/reward_compute/min": 2.2724270820617676e-07,
  "env/all/time/reward_compute/max": 8.866190910339355e-07,
  "env/all/by_group/frac_mixed": 1.0,
  "env/all/by_group/frac_all_good": 0.0,
  "env/all/by_group/frac_all_bad": 0.0,
  "advantage/mean": 0.02090245857834816,
  "advantage/min": -0.9966553449630737,
  "advantage/max": 2.1692190170288086,
  "time/assemble_training_data": 10.06288743019104,
  "time/kl_vs_base": 149.8704798221588,
  "kl_policy_base": 0.0004154869238846004,
  "time/train": 1185.0928881168365,
  "time/save_checkpoint": 18.647024869918823,
  "time/total": 4574.345517873764
}

Hardware provenance

[2026-07-09T06:38:34+00:00] job=1812632 node=node-30 ngpu=3 ntrain=1 replicas=2 flash_attn=no
[2026-07-09T06:45:52+00:00] job=1812704 node=node-30 ngpu=3 ntrain=1 replicas=2 flash_attn=no
[2026-07-09T07:00:42+00:00] job=1812735 node=node-1 ngpu=3 ntrain=1 replicas=2 flash_attn=no
[2026-07-09T07:26:33+00:00] job=1812827 node=node-14 ngpu=3 ntrain=1 replicas=2 flash_attn=yes
[2026-07-09T09:21:09+00:00] job=1813131 node=node-1 ngpu=3 ntrain=1 replicas=2 flash_attn=yes
[2026-07-09T14:53:48+00:00] job=1813132 node=node-2 ngpu=6 ntrain=2 replicas=4 flash_attn=yes
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for EdwardoSunny/ttt-discover-v3-qwen3-8b-ac2-step1

Finetuned
Qwen/Qwen3-8B
Adapter
(2033)
this model