Skip to content

ABM Sugarscape — does an LLM f reproduce a rule f?

studies/abm_sugarscape/ · not a reference study · an umbrella shell over the sibling SocioVerse-ABM benchmark

Does foraging on an uneven sugar field produce wealth inequality, and does an LLM agent reproduce it? Sugarscape is the worked example of a family of eleven abm_* studies that all exist to ask one question: swap the rule behaviour function for an LLM one, hold P and E fixed, and see whether the macro pattern survives. This is deliberately the thinnest page in the gallery, because the study directory is deliberately the thinnest thing in studies/.

What is actually here

studies/abm_sugarscape/ contains exactly two files: an 18-line study.yaml and an __init__.py whose make_bundles() delegates to studies/_abm_common/make_abm_bundles("sugarscape", …). The shared umbrella machinery lives in studies/_abm_common/; the task itself — grid, agents, rule_f, llm_f, evaluation — lives in the sibling repository under SocioVerse-ABM/tasks/market/sugarscape/.

Needs the sibling checkout

The umbrella resolves SocioVerse-ABM from $SV_ABM_ROOT, else as a sibling directory of the beta repo. Without it, nothing runs — and tests/test_abm_sugarscape.py skips rather than fails, the same contract the Chicago study uses when its census data is absent.

P / E / B

what it is
P 200 citizens on a 50×50 toroidal grid, ids sugarscape-0000 …, each with metabolism drawn from 1–4, vision from 1–6, and initial sugar from 5–25. interaction: none. Agents starve and leave the grid; beta's persona pool stays fixed and the umbrella returns an empty Observation for a departed agent.
E The sugar landscape: patch capacity max 4, regrowth rate 1 per step.
B One action kind: move. mode is rule | llm | hybrid, defaulting to rule.

The LLM branch is worth looking at because of how narrow it is: the agent is shown its current sugar and a numbered menu of reachable cells (each with the cell's sugar and distance) and returns only an index. That is the whole interface. Nothing about the comparison depends on the LLM writing prose — it picks from the same candidate set the rule function picks from, which is what makes the comparison clean.

Metrics: alive, mean_sugar, gini. There are no metric_descriptions and no display_metrics — another sign of how minimal an umbrella shell is meant to be.

One step, and the horizon

One step is one forage-and-metabolize round: every surviving citizen moves to a reachable cell, harvests it, pays its metabolism, and the patches regrow. n_steps: 30 in study.yaml, seed: 42.

advance_to() in the umbrella provider returns []there are no interventions at all, in this study or any of its ten siblings. That is not an omission; it is the design. A benchmark that is asking whether one f reproduces another must not have an exogenous shock confounding the comparison.

Results

No committed results, no grounding sidecar, no report

This study ships as structure only. There is no trajectory/, no reports/, no grounding/ — to get numbers you run it yourself against the sibling checkout.

The only asserted facts about its behaviour live in tests/test_abm_sugarscape.py:

assertion what it pins down
31 metric rows for n_steps=30 the t=0 baseline plus one row per step
alive at the last step < alive at the first citizens do starve; the disappearing-agent path is exercised
final gini within [0, 1] the inequality metric is well-formed
exact parity with the native SocioVerse-ABM trajectory on alive, mean_sugar and gini, step by step the umbrella is a faithful re-host, not a reimplementation

That last test is the real content of the page. Parity is exact — not approximate — because the active agent set and the action ordering are identical (agent-id order, same seed) on both sides. It means any difference you later observe between mode: rule and mode: llm is attributable to the behaviour function and to nothing else in the stack.

And the proposition scales beyond sugarscape. Across the full SocioVerse-ABM benchmark — the eleven classic models this family mirrors — LLM behaviour functions reproduce the rule dynamics with an average consistency around 0.90, fairly evenly across model families and across GPT-4o / DeepSeek-V3 / Qwen3:

LLM-f vs rule-f consistency across the 11 SocioVerse-ABM benchmark models, three LLMs plus controlled groups

Grounding

There is no grounding/grounding.json here, and that is consistent rather than sloppy: a benchmark study is not making a claim about the world. Its parameters are the task's published defaults, and its validity claim is internal — parity against the original implementation, enforced by a test in CI rather than by a citation in a ledger.

Contrast that with the research cases on the other pages, where the whole point of the sidecar is that load-bearing numbers about the real world must cite a fact or declare an assumption. See Grounding & Provenance for when a sidecar is doing work and when it would be ceremony.

What you can fork

adjustable_params from study.yaml:

param the question it opens
mode (rule\|llm\|hybrid) the question this family exists for: does the LLM f reproduce the rule f's inequality curve? hybrid mixes the two populations.
n_steps 30 steps is short for a Gini to settle; the task's own default config runs longer.
seed how much of any rule-vs-LLM gap is seed noise?
grid size / n_citizens density is the main driver of starvation pressure.
vision / metabolism ranges the classic Sugarscape levers on who survives and who accumulates.
regrowth scarcity vs abundance — the strongest single lever on whether inequality emerges at all.

The ten sibling studies (abm_schelling, abm_sir, abm_boids, abm_nasch, abm_social_force, abm_lux_marchesi, abm_minority_game, abm_axelrod, abm_civil_violence, abm_hegselmann_krause) follow the identical shell-plus-umbrella shape, so anything you learn about forking this one transfers directly.