Noise-state game explorer
Dynamic games with dispersed private information look hard, even when linearized, because each player needs forecasts of others' forecasts, without end. The regress comes from a loop: actions move the state, the state generates observations, observations update beliefs, and beliefs determine actions. My dissertation builds a calculus that keeps the loop intact. Pick one of its games, move a slider, and the equilibrium is solved again in your browser.
- computed live, nothing precomputed
- games from Chapters 1, 3, 4, 5 and 6
- C++ port of noisestate, compiled to WebAssembly
- PyPI
- most games solve in under a second
- loading the solver
How it works
The loop, and the cuts. Every tractable approach beyond the Kyle line severs the loop somewhere: on the privacy of beliefs, on what actions can teach, on the weight of one player, on the flow from observations to beliefs, or on time itself. Cutting it tends to hand back the separation principle, where learning and acting can be treated apart, and with it removes the interaction between information and incentives the model set out to study.
The noise-state. (illustrated) Each player keeps estimates of the primitive shocks instead of belief hierarchies about the endogenous state. Every linear quantity is a deterministic mean plus an impulse-response kernel against those shocks, and taking a player's expectation changes the integrator and nothing else, so the tower of expectations closes. Under perfect information the estimates are the shocks themselves and the kernels are the model's ordinary impulse responses.
The information wedge. (illustrated) The shadow price of changing another player's beliefs. It breaks separation and vanishes when the loop is cut. In the plots it is the part of a player's first-order condition that exists only because the others read its actions in their signals.
The solver. Equilibrium is a deterministic fixed point in the kernels. It iterates best responses, with Anderson acceleration, on piecewise Chebyshev nodes in shock age, or on a triangle of dates and shock times for a finite horizon, until the kernels stop moving.
The games. The tabs follow the chapters: the finite-horizon baseline (1), the stationary game (3), Kyle–Back trading with several informed traders (4), a cycle of local markets (5), and monitored deviations, naive against privy (6). Chapter 2, on delayed signals, has no tab yet; the model editor takes any game the solver supports.
The model file format of noisestate: channels, states, agents with controls, signal rows and losses, a
horizon (stationary with a window, finite with T, or
transition with a past) and numerics. A top-level naive_observers makes some agents'
strategies ignore another agent's deviations (Chapter 6).
Sweep a parameter
The solver is a C++ port of noisestate 1.0.1 (MIT licence) with the same equations and algorithms: the stationary, spectral and cell engines, transitions with their past, band, buffer and march in T, naive observers, and the refinement and stability checks. On its test grid its costs, kernels, loss paths and first-order-condition terms agree with the Python package to 1e-10 or better.
To solve games yourself, the Python package is on PyPI:
pip install noisestate (source on GitHub).
A model saved from the “Your model” tab runs there as noisestate solve model.yaml.
Where the browser allows it (the page reloads once on a first visit to turn it on), the solver runs agents' best responses on their own threads; a solve after a parameter change starts from the last equilibrium, and the page address keeps the game and its parameters, so a link reproduces a solve. Plots by Plotly, YAML by js-yaml.
Also on this site: a mesh that knows when to stop, my decision-mesh estimators fitting coin flips, and four meshes racing on the same noisy surface.
Cite it
@misc{Babichenko2026Forecasting,
author = {Babichenko, Samuel},
title = {Forecasting and Manipulating the Forecasts of Others},
year = {2026},
eprint = {2603.12140},
archivePrefix = {arXiv},
url = {https://arxiv.org/abs/2603.12140}
}
@software{noisestate,
author = {Babichenko, Samuel},
title = {noisestate: equilibrium solver for linear-quadratic-Gaussian games with private information},
version = {1.0.1},
year = {2026},
url = {https://pypi.org/project/noisestate/}
}