TASK. Write, from scratch, a policy network that plays 9 x 9 Go as strongly as possible. All of its weights start at zero; you set them. The goal is to win as many games as possible against the opponents described under HOW IT WILL BE MEASURED. THE GAME: Go on a 9 x 9 board (the pgx implementation, "go_9x9"). Rows are numbered 0 (top) to 8 (bottom), columns 0 (left) to 8 (right). Black moves first; players alternate. A move either places a stone of the mover's colour on an empty point or passes. A group of stones with no adjacent empty point is captured and removed. Suicide is illegal, and so is retaking a single stone immediately (simple ko). A move that repeats an earlier whole-board position ends the game at once, and the player who made it loses. The game ends after two consecutive passes, or after 162 moves in total. Then it is scored by area: each player's stones on the board plus the empty points surrounded only by that player's stones; White receives a komi of 7.5 points. The higher score wins (no draws). THE NETWORK. Input: 243 numbers, each 0 or 1: three planes over the 81 points, from the point of view of the player to move; input number (row * 9 + column) * 3 + plane, where plane 0 is 1 where the player to move has a stone, plane 1 is 1 where the opponent has a stone, and plane 2 is 1 everywhere when White is to move (0 when Black is). Output: 82 logits: output row * 9 + column = play at that point, output 81 = pass. h_1 = relu(x @ L1.W + L1.b) (512 units) h_k = relu(h_(k-1) @ Lk.W + Lk.b) for k = 2..6 (512 units each) logits = h_6 @ out.W + out.b (82) Tensors: L1.W (243 x 512), L1.b (512), L2.W .. L6.W (512 x 512), L2.b .. L6.b (512), out.W (512 x 82), out.b (82); 1,480,274 numbers. Row i of a weight matrix belongs to input (or unit) i, column j to unit (or output) j. Only the values can be set; the architecture is fixed. Illegal moves (occupied points, suicide, simple ko) are removed before every move, and the move is sampled from the softmax of the remaining logits (temperature 1). There is no search: the network's output is the whole policy. HOW IT WILL BE MEASURED. The original hidden opponent checkpoints are unavailable. After you finish, your network plays 2,000 games against each of two held-out released same-size PPO policy networks (seeds 0 and 2), and a uniform random legal player. Your network is Black in half of the games; the moves of both players are sampled from their policies; there is no search. Score: wins / games; the main measure is the average over the two trained opponents. No historical win rate against random is claimed for these substitutes. You never see these opponents. WHAT YOU HAVE. 1. A Python sandbox (no internet, no GPU, no Go library) with a working folder /work that is kept between runs. Available: numpy, scipy, scikit-learn, PyTorch (CPU), pandas, sympy, networkx. Before your code runs, these are defined: SHAPES and NAMES (the tensors), load(name) (a float32 numpy array: the values you saved, zeros at the start), save(name, array) (stores a tensor of the same shape), saved() (the names saved so far), inp(row, col, plane) (the input index), mv(row, col) (the output index) and PASS = 81. A run may take up to 900 seconds and 96 GB; its printed output (cut at 20,000 characters) is sent back to you. To run code, reply with exactly one block that starts with ```python and nothing else. You may run code up to 120 times. 2. Two pass tools with a budget of 50 passes in total; each use of either tool counts as one pass (a request that fails is not counted). - A games pass plays up to 128 games of your current network (the tensors saved so far) against practice opponents: reply with exactly one block that starts with ```games and contains JSON {"games": {"strong": 64, "weak": 32, "random": 32}} (even counts, at most 128 games in total; your network is Black in half of the games against each opponent). The historical practice checkpoints are unavailable, so the practice opponents are reconstructed: "random" is uniform over legal moves; "strong" is the released same-size PPO network with seed 1; "weak" samples each move from a probability distribution that is 50% this same network's masked softmax and 50% uniform over legal moves. The held-out evaluation networks are the released same-size PPO seeds 0 and 2. No historical 95% or 98% win-rate claim applies to these substitute opponents. You get a summary per opponent (score, wins, mean area margin, stones captured and lost, passes, game length, how the games ended) and, in /work/pass_/, every game's moves, your network's top-5 moves with their probabilities at each of its moves, and the board after every move. - A positions pass runs your current network on up to 256 positions: reply with exactly one block that starts with ```positions and contains JSON {"positions": [{"board": ["9 strings of 9 characters: X = Black, O = White, . = empty", ...], "to_move": "black" or "white"} or {"moves": [a list of moves from the empty board: row * 9 + column, or "pass"]}, ...], "activations": true or false}. You get the top 3 moves per position and, in /work/pass_/, the inputs, logits, probabilities over the legal moves and (if asked) the activations of every hidden layer. For "board" positions the legal moves are the empty points and pass (suicide and ko are not checked); for "moves" positions they are exact. The session continues until every pass is used. At the end, the tensors you saved with save() are your network; tensors never saved stay zero. RULES. Not allowed: (a) gradient descent or any other training: no backward passes, autograd or optimizers, and no fitting of weights to data or labels (no regression or least squares on examples); (b) search: no game-tree search (MCTS, minimax, rollouts, looking ahead over sequences of moves), neither to choose moves nor to produce target moves or values for setting weights; (c) running the network outside the pass tools: do not compute your network's output or activations on any input in the sandbox; (d) internet access (there is none). Allowed: writing the weights by code from your own design (formulas, loops, symmetries, linear algebra on the weights themselves), Go-rule code in the sandbox (for example to work out the liberties of groups on boards you choose) as long as it does not run the network or search, and any analysis of the pass results. HOW TO FINISH. When every pass is used and your network is saved, reply WITHOUT a code or pass block: describe its design and why you expect it to win.