Fig. 1B: information-flow taglines under each panel

Space: "information is passed on, but not easily stored: it fades with the
conversation". Time: "information is inherited, evolutionarily selected, and
passed on again — from parent model to child model — where population
genetics applies". The contrast that justifies the transfer, stated where the
reader's eye lands.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BkRLcc18rwT2Lysu6PbG7v
This commit is contained in:
Giorgio Gilestro 2026-09-07 13:03:41 +01:00
parent 3a41ee0c2e
commit f1970728cf
3 changed files with 29 additions and 26 deletions

Binary file not shown.

Binary file not shown.

View file

@ -179,7 +179,7 @@ def _robot(ax, x, y, fc="#e8eef5", dots=(), lost=(), w=0.52, h=0.52):
def fig1b(): def fig1b():
from matplotlib.patches import Circle, FancyArrowPatch from matplotlib.patches import Circle, FancyArrowPatch
W, H = 11.4, 4.5 W, H = 11.4, 4.75
fig, ax = plt.subplots(figsize=(W, H)) fig, ax = plt.subplots(figsize=(W, H))
ax.set_xlim(0, W) ax.set_xlim(0, W)
ax.set_ylim(0, H) ax.set_ylim(0, H)
@ -192,7 +192,7 @@ def fig1b():
lw=lw, linestyle=ls, shrinkA=shrink, shrinkB=shrink)) lw=lw, linestyle=ls, shrinkA=shrink, shrinkB=shrink))
# ---------------- left: a society in space (contemporaries exchanging messages) # ---------------- left: a society in space (contemporaries exchanging messages)
cx, cy, r = 2.45, 2.70, 0.95 cx, cy, r = 2.45, 2.95, 0.95
dotsets = [(BLUE, GOLD), (GREEN,), (BLUE, GREEN), (GOLD, GREEN), (BLUE,)] dotsets = [(BLUE, GOLD), (GREEN,), (BLUE, GREEN), (GOLD, GREEN), (BLUE,)]
pos = [] pos = []
for i, ds in enumerate(dotsets): for i, ds in enumerate(dotsets):
@ -204,45 +204,47 @@ def fig1b():
arrow(pos[i], pos[j2], color="#99a", lw=0.9, style="<|-|>", shrink=26, ls=(0, (4, 2))) arrow(pos[i], pos[j2], color="#99a", lw=0.9, style="<|-|>", shrink=26, ls=(0, (4, 2)))
ax.text(pos[0][0] + 0.72, pos[0][1] + 0.38, "hi!", fontsize=8, ha="center", ax.text(pos[0][0] + 0.72, pos[0][1] + 0.38, "hi!", fontsize=8, ha="center",
bbox=dict(boxstyle="round,pad=0.25", fc="white", ec="#99a", lw=0.8)) bbox=dict(boxstyle="round,pad=0.25", fc="white", ec="#99a", lw=0.8))
clk = (0.55, 4.08) clk = (0.55, 4.33)
ax.add_patch(Circle(clk, 0.21, fc="white", ec="#445", lw=1.1)) ax.add_patch(Circle(clk, 0.21, fc="white", ec="#445", lw=1.1))
ax.plot([clk[0], clk[0]], [clk[1], clk[1] + 0.13], color="#445", lw=1.0) ax.plot([clk[0], clk[0]], [clk[1], clk[1] + 0.13], color="#445", lw=1.0)
ax.plot([clk[0], clk[0] + 0.10], [clk[1], clk[1]], color="#445", lw=1.0) ax.plot([clk[0], clk[0] + 0.10], [clk[1], clk[1]], color="#445", lw=1.0)
ax.text(clk[0], clk[1] - 0.34, "one moment", ha="center", fontsize=7, style="italic", ax.text(clk[0], clk[1] - 0.34, "one moment", ha="center", fontsize=7, style="italic",
color="#555") color="#555")
ax.text(2.45, 0.55, "a society in space", ha="center", fontsize=11, fontweight="bold") ax.text(2.45, 0.80, "a society in space", ha="center", fontsize=11, fontweight="bold")
ax.text(2.45, 0.24, "contemporaries exchanging messages \u2014 multi-agent systems, agent economies", ax.text(2.45, 0.50, "contemporaries exchanging messages \u2014 multi-agent systems, agent economies",
ha="center", fontsize=7.5, style="italic", color="#555") ha="center", fontsize=7.2, style="italic", color="#555")
ax.text(2.45, 0.24, "information is passed on, but not easily stored: it fades with the conversation",
ha="center", fontsize=7.2, style="italic", color="#555")
# ---------------- middle: the shift of perspective # ---------------- middle: the shift of perspective
arrow((4.60, 2.50), (5.95, 2.50), color="#445", lw=2.0, style="-|>") arrow((4.60, 2.75), (5.95, 2.75), color="#445", lw=2.0, style="-|>")
ax.text(5.27, 2.66, "the same ecosystem,\nseen along its time axis", ha="center", ax.text(5.27, 2.91, "the same ecosystem,\nseen along its time axis", ha="center",
va="bottom", fontsize=8, style="italic", color="#334", linespacing=1.3) va="bottom", fontsize=8, style="italic", color="#334", linespacing=1.3)
# ---------------- right: a society in time (a pedigree) # ---------------- right: a society in time (a pedigree)
axx = 6.8 axx = 6.8
arrow((axx, 4.30), (axx, 1.00), color="#445", lw=1.3) arrow((axx, 4.55), (axx, 1.25), color="#445", lw=1.3)
for gy, lab in [(3.80, "gen 0"), (2.55, "gen 1"), (1.35, "gen 2")]: for gy, lab in [(4.05, "gen 0"), (2.80, "gen 1"), (1.60, "gen 2")]:
ax.text(axx - 0.12, gy, lab, ha="right", va="center", fontsize=7.5, color="#445") ax.text(axx - 0.12, gy, lab, ha="right", va="center", fontsize=7.5, color="#445")
p1, p2 = (8.0, 3.80), (9.5, 3.80) p1, p2 = (8.0, 4.05), (9.5, 4.05)
c1, c2 = (7.5, 2.55), (9.0, 2.55) c1, c2 = (7.5, 2.80), (9.0, 2.80)
g2 = (9.0, 1.35) g2 = (9.0, 1.60)
_robot(ax, *p1, dots=(BLUE, GOLD)) _robot(ax, *p1, dots=(BLUE, GOLD))
_robot(ax, *p2, dots=(GREEN, BLUE)) _robot(ax, *p2, dots=(GREEN, BLUE))
_robot(ax, *c1, dots=(BLUE,), lost=(GOLD,)) _robot(ax, *c1, dots=(BLUE,), lost=(GOLD,))
_robot(ax, *c2, dots=(BLUE, GREEN, GOLD)) _robot(ax, *c2, dots=(BLUE, GREEN, GOLD))
_robot(ax, *g2, dots=(BLUE, GREEN, GOLD)) _robot(ax, *g2, dots=(BLUE, GREEN, GOLD))
arrow((7.87, 3.26), (7.56, 3.04), color="#666") arrow((7.87, 3.51), (7.56, 3.29), color="#666")
ax.text(7.42, 3.16, "inherit", ha="right", fontsize=7, style="italic", color="#555") ax.text(7.42, 3.41, "inherit", ha="right", fontsize=7, style="italic", color="#555")
arrow((8.15, 3.24), (8.85, 3.04), color="#666") arrow((8.15, 3.49), (8.85, 3.29), color="#666")
arrow((9.40, 3.24), (9.13, 3.04), color="#666") arrow((9.40, 3.49), (9.13, 3.29), color="#666")
ax.text(9.0, 3.14, "merge (sex)", ha="center", fontsize=7, style="italic", color="#555", ax.text(9.0, 3.39, "merge (sex)", ha="center", fontsize=7, style="italic", color="#555",
bbox=dict(boxstyle="round,pad=0.12", fc="white", ec="none")) bbox=dict(boxstyle="round,pad=0.12", fc="white", ec="none"))
ax.text(7.5, 1.83, "rare skill lost", ha="center", fontsize=6.8, style="italic", ax.text(7.5, 2.08, "rare skill lost", ha="center", fontsize=6.8, style="italic",
color="#a33") color="#a33")
arrow((9.0, 1.99), (9.0, 1.81), color="#666") arrow((9.0, 2.24), (9.0, 2.06), color="#666")
globe = (10.55, 1.85) globe = (10.55, 2.10)
ax.add_patch(Circle(globe, 0.32, fc="#eaf4fb", ec="#2c7fb8", lw=1.2)) ax.add_patch(Circle(globe, 0.32, fc="#eaf4fb", ec="#2c7fb8", lw=1.2))
from matplotlib.patches import Arc as _Arc from matplotlib.patches import Arc as _Arc
ax.add_patch(_Arc(globe, 0.32, 0.64, theta1=90, theta2=270, ec="#2c7fb8", lw=0.8)) ax.add_patch(_Arc(globe, 0.32, 0.64, theta1=90, theta2=270, ec="#2c7fb8", lw=0.8))
@ -250,12 +252,13 @@ def fig1b():
ax.plot([globe[0] - 0.32, globe[0] + 0.32], [globe[1], globe[1]], color="#2c7fb8", lw=0.8) ax.plot([globe[0] - 0.32, globe[0] + 0.32], [globe[1], globe[1]], color="#2c7fb8", lw=0.8)
ax.text(globe[0], globe[1] - 0.44, "reality\n(verifier)", ha="center", va="top", fontsize=7, ax.text(globe[0], globe[1] - 0.44, "reality\n(verifier)", ha="center", va="top", fontsize=7,
color="#2c7fb8", linespacing=1.2) color="#2c7fb8", linespacing=1.2)
arrow((10.22, 1.70), (9.38, 1.45), color="#2c7fb8", lw=1.2) arrow((10.22, 1.95), (9.38, 1.70), color="#2c7fb8", lw=1.2)
ax.text(9.82, 1.78, "ground\n(immigrate)", ha="center", va="bottom", fontsize=7, ax.text(9.82, 2.03, "ground\n(immigrate)", ha="center", va="bottom", fontsize=7,
style="italic", color="#2c7fb8", linespacing=1.2) style="italic", color="#2c7fb8", linespacing=1.2)
ax.text(8.9, 0.55, "a society in time", ha="center", fontsize=11, fontweight="bold") ax.text(8.9, 0.80, "a society in time", ha="center", fontsize=11, fontweight="bold")
ax.text(8.9, 0.24, "generations coupled by inheritance, recombination, grounding \u2014 " ax.text(8.9, 0.50, "information is inherited, evolutionarily selected, and passed on again \u2014",
"where population genetics applies", ha="center", fontsize=7.2, style="italic", color="#555")
ax.text(8.9, 0.24, "from parent model to child model \u2014 where population genetics applies",
ha="center", fontsize=7.2, style="italic", color="#555") ha="center", fontsize=7.2, style="italic", color="#555")
save(fig, "fig1b") save(fig, "fig1b")