assembly-economics/simulations/gadm02/grounding.py
tegwick 1b0a28361e ASSEMBLY-WP-0009-T01/T02: adoption band B1-B4 and probe across it
- gadm04: optional self-enhancement loop (selfenh, default off)
- grounding.py: band anchors slow/central/fast/aggressive (B4 selfenh 3.0)
- band_probe.py: 36 readings across the band - 22 robust, 7 quantitative
  shifts, 7 qualitative breaks; core claims robust; moderate reforms suffice
  only under conservative adoption; under B4 lineage control dominates even
  in the generative regime (structural candidate)
- models/AdoptionBand.md, research/BreakRegister.md (BR-001..004)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 1494246@bnt-lap001
Assistant-Session: caf6de6f-f9e4-47ce-a584-49baa271fa4b
2026-10-12 10:58:47 +02:00

57 lines
2.6 KiB
Python

"""Evidence-grounded parameter sets for GADM-0.4 (ASSEMBLY-WP-0008).
Each override is justified in models/ParameterGrounding.md. The sets are kept
separate from gadm04.PARAMS so the effect of grounding stays visible and
reversible. Each set comes with its own equilibrium start (W, cohort attention,
cohort agency) and recalibrated channel counters.
Usage:
from grounding import variant
params, init = variant("central")
gadm04.simulate(params, init)
"""
from __future__ import annotations
import sys
sys.dont_write_bytecode = True
import gadm04 as g # noqa: E402
# T01: organism adoption. The default reaches K_Omega = 0.50 by year 10, faster
# than even the LLM+tooling exposure ceiling (47-56 % of tasks, Eloundou et al.
# 2023) could plausibly be adopted. Central path: ~0.27 at year 10, ~0.29 at 25.
SELFENH = 3.0 # B4: tuned so K_Omega reaches ~0.8 within about 10 years
ADOPTION = {
"central": {"aO": 0.25, "ell": 0.415, "oseed": 0.0165}, # x0.5 of default
"slow": {"aO": 0.10, "ell": 0.166, "oseed": 0.0066}, # x0.2, towards Acemoglu (2024)
# adoption band (research/ScenarioBandMethod.md § 2): B3 fast = GADM-0.4
# adoption defaults; B4 aggressive = B3 plus the self-enhancement loop
"fast": {"aO": 0.50, "ell": 0.83, "oseed": 0.033},
"aggressive": {"aO": 0.50, "ell": 0.83, "oseed": 0.033, "selfenh": SELFENH},
}
BAND = {"B1": "slow", "B2": "central", "B3": "fast", "B4": "aggressive"}
# T03: leader persistence rose since 2000 with proprietary software and
# intangibles (Bessen et al.); learning-by-doing superstars (Ma, Pugsley,
# Zimmermann): digital channels self-reinforce more strongly than the market.
POWER = {"r_i": 0.45, "r_d": 0.60, "r_mem": 0.45, "r_lin": 0.45}
# T05: care claims ~5 h/week per adult on average (AARP 2025: 1 in 5 adults,
# 26 h/week) vs. ~35 h/week of engagement media: care load ~1/4 of the default.
CARE = {"care_load": 0.03}
# Joint attention calibration: with the grounded care load, present-day
# attention headroom should still be ~0.5 (engagement media take about half of
# leisure, ATUS 2023 / DataReportal). That requires aext ~0.58; the earlier
# 0.275 compensated for an overstated care load.
ATTENTION = {"aext": 0.58}
EQ_KEYS = ("W", "Aw", "As", "Gw", "Gs")
def variant(name: str = "central") -> tuple[dict, dict]:
"""(params, init) for a grounded variant: 'slow', 'central', 'fast' or 'aggressive'."""
params = {**ADOPTION[name], **POWER, **CARE, **ATTENTION}
init = g.equilibrium_init(EQ_KEYS, steps=4000, h=0.25, params=params)
params.update(g.calibrate(params, init))
return params, init