// IOAI 2026 Β· ASTANA, KAZAKHSTAN Β· TEAM ZIMBABWE πΏπΌ
One skill, drilled under contest rules until it's automatic: driving Gemma to a scoring submission. No theory. No lessons. Drills with a scoreboard.
plan/01_lock_in.md
β
Drills #1β3 ALL validated vs gemma-4-31b-it
π€ Official chatbot live & verified β chat.ioai2026.kz
π§ GALBOT practice window ended Jul 22 β may reopen, watch Discord
π Rules re-audited Jul 11 β see Intel
GAITE is designed for chatbot-driven solving: Gemma 4, 2000-token replies, generous chat access (exact quotas TBA β confirm at the Aug 3 practice round), hints allowed, its own scoreboard. Heavy chatbot use isn't a hack β it's the intended playstyle. So the prep trains exactly that.
Viktor solves all 3 At-Home Tasks using only prompts to Gemma 4 β no expert knowledge injected. Output: paste-ready prompt scripts per task.
All 3 tasks β done10 prompt templates + 5 recovery moves, validated live vs Gemma 4. Short enough to memorize. Lives at plan/playbook.md in the repo.
45 min: Colab + Gemma + drill card β submit to the Kaggle leaderboard. Review after: max 3 corrections. The leaderboard is the honest signal.
Jul 14 β Aug 1Yandex Contest example task (the real on-site platform), one timed mock contest day, and a GALBOT Team Challenge practice session.
late Julplan/snippets.md.Contest Day 1's three tasks will each connect to one of these. Master these, master the contest.
A 16-class audio classifier (AST) must learn 13 new classes without forgetting the old 16. Score = Β½Β·old accuracy + Β½Β·new accuracy β forgetting costs as much as failing.
submission.csv pathsA robot on an 8Γ8 grid learns pick-up-and-deliver from expert demonstrations only (observation β action). Officially supervised learning β not RL.
20 Questions vs an LLM oracle (1,472 animals, 559 questions, 15 queries). Run locally; a Yandex Contest hosting is "being worked on". Pretrained models (incl. LLMs & embeddings) are allowed.
Home Task 1, start to Kaggle submission, in 6 prompts. Every prompt below was tested live against Gemma 4 and produced correct working code. Time box: 45 minutes.
Code only, max 30 lines. Reply with ONLY a single python code block β no explanation, no reasoning, no bullet points.I'm working in a Colab notebook. I have a Hugging Face `ASTForAudioClassification` checkpoint trained on 16 audio classes, loaded from a local folder. I must extend it to 29 classes (16 old + 13 new) and fine-tune on ~10 GPU minutes without forgetting the old classes. Data: `train.csv` (old classes) and `fine_tune.csv` (new classes), columns include filepath, target, split. Metric: mean of old-class accuracy and new-class accuracy.
Write code that replaces the model's 16-output classifier head with a 29-output head, copying the original 16 rows of weights and bias into the first 16 outputs and randomly initializing the rest. Code only, max 30 lines. Reply with ONLY a single python code block β no explanation, no reasoning, no bullet points.
Write a PyTorch Dataset that loads both CSVs' train splits into one dataframe, loads each audio file with librosa at 16 kHz, and returns the AST feature extractor's output plus the integer label. Code only, max 30 lines. Reply with ONLY a single python code block β no explanation, no reasoning, no bullet points.
Write a training loop (AdamW, lr 1e-5 for the encoder and 1e-3 for the head, ~3 epochs, batch size 8) over a mix of ALL new-class training clips and an equal number of randomly sampled old-class clips per epoch, so the model learns new classes without forgetting old ones. Code only, max 30 lines. Reply with ONLY a single python code block β no explanation, no reasoning, no bullet points.
Write evaluation code that predicts on the val splits of both CSVs and prints accuracy on old classes (targets 0-15), accuracy on new classes (targets 16-28), and their mean. Code only, max 30 lines. Reply with ONLY a single python code block β no explanation, no reasoning, no bullet points.
Write code that runs the model on every filepath listed in the Kaggle `submission.csv`, writes the predicted class index into its target column, and saves it. Code only, max 30 lines. Reply with ONLY a single python code block β no explanation, no reasoning, no bullet points.
processor/train_df exist.)Log: baseline score β your score β Kaggle LB position β what broke β which prompt saved you. DM Viktor for review (max 3 corrections).
Home Task 2, start to Kaggle submission, in 6 prompts. Behavioral cloning on an 8Γ8 grid β the baseline flattens the grid into an MLP; you replace it with a small CNN + class weights + action masking. Time box: 45 minutes. Full card with all traps: drill_02_robot.md.
Code only, max 30 lines. Reply with ONLY a single python code block β no explanation, no reasoning, no draft versions, no bullet points.I'm working in the official IOAI 'Robot Delivery Academy' Colab notebook. A robot on an 8x8 grid must pick up a package at one depot and deliver it to another. I train by behavioral cloning on expert demonstrations only (pure supervised learning β no RL, no search or planning). Each observation is a dict: obs['grid'] is a numpy array of shape (6, 8, 8) (channels: walls, depots, robot, package, destination, carrying flag), obs['vector'] is 13 floats, obs['action_mask'] is 6 booleans marking valid actions. Actions 0-5 = south, north, east, west, pickup, dropoff. The notebook already defines: train_trajectories (list of dicts, each with 'observations' and 'actions' lists), valid_scenarios, test_scenarios, DEVICE, ACTION_NAMES, run_episode(scenario, action_fn), evaluate_action_model(scenarios, action_fn, limit) which returns a dict with success_rate/avg_steps/avg_invalid_pickup_or_dropoff/results, generate_predictions(scenarios, action_fn, limit), and save_predictions_zip(predictions, path). The baseline flattens the grid into an MLP; I am replacing it with a small CNN.
Write a PyTorch Dataset class GridDemoDataset that collects every (observation, action) pair from all trajectories in train_trajectories and, for one index, returns four tensors: the grid as float32 of shape (6, 8, 8), the vector as float32 of shape (13,), the action_mask as bool of shape (6,), and the action as a long. Then create grid_dataset = GridDemoDataset(train_trajectories) and grid_loader = DataLoader(grid_dataset, batch_size=128, shuffle=True). Code only, max 30 lines. Reply with ONLY a single python code block β no explanation, no reasoning, no draft versions, no bullet points.
Write a PyTorch nn.Module named CNNActionModel whose forward takes (grid, vector): two Conv2d layers on the (6, 8, 8) grid (6->32 then 32->64 channels, kernel 3, padding 1, ReLU after each), flatten, concatenate the 13-feature vector, then Linear to 128 with ReLU and Linear to 6 action logits. Then create cnn_model = CNNActionModel().to(DEVICE) and print the parameter count. Code only, max 30 lines. Reply with ONLY a single python code block β no explanation, no reasoning, no draft versions, no bullet points.
My grid_loader yields four tensors per batch in this order: grid (B, 6, 8, 8) float, vector (B, 13) float, action_mask (B, 6) bool, action (B,) long β and cnn_model's forward is called as cnn_model(grid, vector). Write a training loop: 30 epochs, Adam lr 1e-3. First collect all action labels by iterating grid_dataset (the fourth element of each sample), use torch.bincount to count the 6 actions, and build class weights = 1/counts, normalized, for nn.CrossEntropyLoss so rare pickup/dropoff actions are not under-learned. In each batch compute logits = cnn_model(grid, vector), then set logits where action_mask is False to -1e9 before the loss. Print the average loss every 5 epochs. Code only, max 30 lines. Reply with ONLY a single python code block β no explanation, no reasoning, no draft versions, no bullet points.
Write, in one short script: a function cnn_action(obs) that makes float32 tensors from obs['grid'] and obs['vector'] on DEVICE each with unsqueeze(0), runs cnn_model(grid, vector) in eval mode under torch.no_grad, sets logits where obs['action_mask'] is False to -1e9, and returns int(logits.argmax()). Then cnn_eval = evaluate_action_model(valid_scenarios, cnn_action, limit=100); print success_rate, avg_steps, avg_invalid_pickup_or_dropoff. Then from the failed results in cnn_eval['results'] print how many have no action 4 in r['actions'] (failed before pickup) and how many do (failed after pickup). Code only, max 25 lines. Reply with ONLY a single python code block and nothing else β no explanation, no reasoning, no plan, no draft version, no self-check, no line counting. Write the final code directly.
Write code that generates the Kaggle submission: test_predictions = generate_predictions(test_scenarios, cnn_action, limit=None), then save_predictions_zip(test_predictions, 'predictions.zip'), then open predictions.zip with zipfile, read predictions.jsonl and print its first line and the total line count to verify the format. Code only, max 30 lines. Reply with ONLY a single python code block β no explanation, no reasoning, no draft versions, no bullet points.
Home Task 3: a hidden animal (of 1,472) behind an LLM oracle; 15 queries, asks AND guesses both cost 1. The trick the notebook itself teaches: precompute the oracle's answers offline (free), then ask the question that best splits the remaining candidates. Local notebook only β the deliverable is a screenshot of the final summary table. Full card: drill_03_oracle.md.
oracle model -> float16 ran.You are my code generator inside a Colab session. Standing rule for EVERY reply in this chat: output ONLY one python code block and absolutely nothing else β no reasoning, no bullet points, no checklists, no text before or after the block. Start your reply with ```python.
Context: I'm working in the IOAI Colab notebook "The Analytical Language of John Wilkins". A hidden animal sits behind an oracle object: `interactor.ask(question)` returns 'yes' or 'no' (the question must be a line from the question pool), `interactor.guess(animal)` returns 'correct' or 'wrong'; BOTH cost 1 query from a budget of 15; per-row score = max(0, (1 if solved else 0) - 0.02*queries_used). I have `animals_pool` (list of 1472 lowercase animal names) and `questions_pool` (list of 559 lowercase yes/no questions). The oracle is Qwen/Qwen2.5-3B-Instruct at temperature 0, already loaded in memory as `Interactor._model` (a Hugging Face CausalLM on cuda, float16) and `Interactor._tokenizer`. For each question it builds this exact user message: "You are answering a question about one specific animal.\nThe animal is: {animal}.\nAnswer with a single word, yes or no.\nQuestion: {question}", applies the chat template with add_generation_prompt=True, generates with max_new_tokens=5, do_sample=False, and checks whether the reply starts with "yes".
Your reply must be nothing but one python code block. Write a function `predict_answers(animal, questions)` that predicts the oracle's answers using the already-loaded `Interactor._model` and `Interactor._tokenizer`: build the exact prompt described above for each question, apply the chat template per prompt (tokenize=False, add_generation_prompt=True), set tokenizer.padding_side='left', tokenize all prompts as one padded batch, run ONE batched `generate(max_new_tokens=5, do_sample=False, pad_token_id=tokenizer.eos_token_id)`, decode only the newly generated tokens, and return a list with 1 if a reply starts with "yes" (case-insensitive) else 0, one per question. Code only, max 30 lines. Reply with ONLY a single python code block β no explanation, no reasoning, no bullet points.
QUESTIONS = questions_pool[:120]
I defined `QUESTIONS = questions_pool[:120]` and I have the `predict_answers(animal, questions)` function from before. Write code that builds a numpy int8 array `table` of shape (len(animals_pool), len(QUESTIONS)), one row per animal in animals_pool order, by calling `predict_answers(animal, QUESTIONS)`. It must mount Google Drive, use checkpoint path '/content/drive/MyDrive/wilkins_table.npz': if the file exists, load it and resume from the first unfinished row (store a `done` count in the file); save the checkpoint every 25 animals and at the end; print progress with elapsed time every 25 animals. Code only, max 30 lines. Your ENTIRE reply must be exactly one python code block starting with ```python β no text, no bullet points, no reasoning before or after it.
Answer immediately with code β do not deliberate. I have two globals in memory: `QUESTIONS` (a 120-question subset of questions_pool) and `table` (numpy 0/1 array of shape (len(animals_pool), len(QUESTIONS)): rows = animals in `animals_pool` order, columns = QUESTIONS, values = the oracle's predicted answers). Write class `MySolution` with `__init__(self, animals_pool, questions_pool)` and `solve(self, interactor)` implementing exactly this: 1. weights w = numpy ones(len(animals_pool)). 2. While `interactor.remaining_budget()` > 4 and best weight < 0.9 * w.sum(): loop j over range(len(QUESTIONS)) (the global QUESTIONS, NOT questions_pool) and pick the unasked j minimizing abs(weighted yes-fraction of table[:, j] - 0.5); ans = 1 if interactor.ask(QUESTIONS[j]) == 'yes' else 0; w = w * where(table[:, j] == ans, 0.9, 0.1). Never zero out a weight β the oracle is sometimes wrong. 3. Then guess animals in descending weight order until `interactor.is_done()`. Code only, max 30 lines. Reply with ONLY a single python code block β no explanation, no reasoning, no bullet points.
import numpy as np
rng = np.random.default_rng(0)
counts = []
for i in rng.integers(0, len(animals_pool), size=40):
w = np.ones(len(animals_pool)); asked = set(); c = 0
for _ in range(15):
j = min((q for q in range(len(QUESTIONS)) if q not in asked),
key=lambda q: abs((w * table[:, q]).sum() / w.sum() - 0.5))
asked.add(j); c += 1
w *= np.where(table[:, j] == table[i, j], 0.9, 0.1)
if np.argmax(w) == i: break
counts.append(c)
counts = np.array(counts)
print(f"mean {counts.mean():.1f} max {counts.max()} <=11 questions: {(counts <= 11).mean():.0%}")
Run the notebook's own Step 4 cell (evaluate on dev.csv β real oracle calls, ~15-30 min), then the Step 5 final-scoring cell unchanged. Screenshot the summary table with the FINAL row β that IS your submission.
Log: P4 sim mean β dev score β FINAL score β what broke β which prompt saved you. DM Viktor for review (max 3 corrections).
research/10.plan/01_lock_in.md.research/09.