Skip to content

Commit 99a6a94

Browse files
committed
chore: doc polish
1 parent 10a5389 commit 99a6a94

3 files changed

Lines changed: 120 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,119 @@
11
# Changelog
22

3+
## v3.5.0 - 2026-04-18
4+
5+
Chemical coupling and adaptive signal. alpha_coupling and beta_modulation added as searchable
6+
signal parameters. Three signal-only behavioral descriptors. Descriptor library 15→18.
7+
8+
### alpha_coupling [-1, 1]
9+
10+
New Params field. Reception-to-growth coupling: G *= (1 + alpha * reception).clamp(min=0).
11+
Applied globally (no ownership gating) -- species B grows into species A's territory when B's
12+
receptor_profile aligns with A's emission_vector. Positive = chemotaxis (predation pathway).
13+
Negative = chemorepulsion. Zero = no coupling (previous behavior).
14+
15+
### beta_modulation [-1, 1]
16+
17+
New Params field. Adaptive emission: rate_eff = clip(emission_rate * (1 + beta * mean(reception)), 0, 0.1).
18+
Reception computed before emission each step. Positive = quorum sensing (amplify when stimulated).
19+
Negative = feedback inhibition (suppress when stimulated). Zero = static emission rate.
20+
21+
### Signal-only descriptors
22+
23+
Three new Descriptor objects with signal_only=True registered in REGISTRY:
24+
- emission_activity: mean G_pos * emission_rate over trace tail, normalized to [0,1]
25+
- receptor_sensitivity: mean |dot(convolved_signal, receptor_profile)| over trace tail, [0,1]
26+
- signal_retention: final_mass / initial_mass clipped to [0,1]; 1.0 for non-signal traces
27+
28+
Descriptor dataclass gains signal_only: bool = False field. loop.py validates at search startup:
29+
raises ValueError if any signal_only descriptor is active without signal_field=True.
30+
RolloutTrace gains signal_emission_history, signal_reception_history, signal_retention fields.
31+
rollout.py captures these per-step during signal rollouts.
32+
33+
### Quality metric adjustment
34+
35+
Signal run weights: stability 0.3→0.2, retention 0.2→0.3. Non-signal unchanged (0.6/0.4).
36+
37+
---
38+
39+
## v3.4.0 - 2026-04-18
40+
41+
Signal physics corrections, multi-component quality metric, signal observables, signal GIF,
42+
viewer improvements across archive and ecosystem pages.
43+
44+
### Signal physics
45+
46+
emission_rate and decay_rates made per-creature searchable (were hardcoded constants).
47+
standard_preset 300→500 steps. signal_preset auto-selects 800 steps with --signal-field.
48+
CREATURE_MASS_FLOOR raised 0.1→0.2. Reception moved before emission in localized.py.
49+
50+
### Multi-component quality metric
51+
52+
q = 0.6·min(compact(T/2), compact(T)) + 0.4·stability (non-signal)
53+
q = 0.5·min(compact(T/2), compact(T)) + 0.2·stability + 0.3·retention (signal)
54+
midpoint_state captured in rollout loop and stored on RolloutTrace.
55+
stability = clip(1 - drift/0.2, 0, 1) -- continuous version of persistent filter.
56+
57+
### Signal observables
58+
59+
SimOutput captures signal_total_history, signal_channel_snapshots, species_signal_received,
60+
signal_sum_snapshots (downsampled 4x spatial signal for GIF). EcosystemMeasures gains 6 new
61+
fields: signal_total_history, signal_mass_fraction, signal_channel_snapshots,
62+
dominant_channel_history, receptor_alignment, emission_reception_matrix. All in summary.json.
63+
64+
### Signal GIF
65+
66+
signal.gif generated alongside ecosystem.gif using species-colored teal colormap.
67+
Mass/Signal tab toggle in ecosystem viewer. signal.gif checked in smoke_ecosystem.sh.
68+
69+
### Viewer improvements
70+
71+
Archive: SIGNAL badge, alpha/beta in creature modal, per-channel bar charts for signal params.
72+
Ecosystem: SIGNAL badge, outcome tooltips, signal charts sidebar, corrected mass chart label.
73+
Index: System tab anchor nav, quality metric section with formula, signal field section with
74+
diagram, signal descriptors in descriptor grid, SIGNAL/TORUS badges on run cards.
75+
docs/signal-field.svg: new diagram showing one-step signal mechanics with alpha/beta.
76+
77+
---
78+
79+
## v3.3.0 - 2026-04-18
80+
81+
Signal field: per-creature emission and sensing in a shared (H,W,16) chemical field.
82+
83+
Per-creature parameters: emission_vector (C,), receptor_profile (C,), signal_kernel (ring),
84+
emission_rate scalar, decay_rates (C,). --signal-field flag in CLI. Archive tagged
85+
signal_field: true/false in manifest.json. Quality filter updated for mass+signal conservation.
86+
Both homogeneous and heterogeneous ecosystem paths signal-aware. validate_signal_consistency()
87+
enforces archive compatibility (signal and non-signal archives cannot be mixed).
88+
89+
---
90+
91+
## v3.2.0 - 2026-04-18
92+
93+
Temporal outcome classifier with separate taxonomies per run mode.
94+
95+
Heterogeneous: merger, coexistence, exclusion, fragmentation -- now as temporal label sequence
96+
(list of OutcomeWindow with from_step, to_step, label) per species. Fragmentation uses patch
97+
count from v3.1.0 HeteroSpatial. Homogeneous taxonomy: full_merger, stable_isolation,
98+
partial_clustering, cannibalism, fragmentation -- all measurable from patch count dynamics.
99+
Outcome timeline visualization in ecosystem viewer. outcome_sequence stored in summary.json.
100+
101+
---
102+
103+
## v3.1.0 - 2026-04-18
104+
105+
Spatial observables for both run modes from existing snapshot data (no new simulation code).
106+
107+
Heterogeneous: patch count per species per snapshot, interface area per pair per snapshot,
108+
Euclidean COM distance per pair per snapshot, spatial entropy per species per snapshot,
109+
contact_occurred S×S bool matrix. Interaction coefficients gated to windows where
110+
interface_area > 0. 4-connected component labeling via scipy.ndimage.label.
111+
Homogeneous: patch count over time, mass spatial entropy, initial patch sizes, patch size
112+
distribution per snapshot. scipy declared as explicit dependency. HeteroSpatial /
113+
HomoSpatial typed dataclasses in analytics.py.
114+
115+
---
116+
3117
## v3.0.0 - 2026-04-17
4118

5119
Growth field capture, empirical interaction coefficients, ecosystem outcome classification, interaction heatmap in viewer.

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,9 @@ The test suite runs entirely in no-Ray mode. `just smoke-ray` exercises the Ray
314314
quality term; signal observables (total history, mass fraction, receptor alignment,
315315
emission-reception matrix); SIGNAL badge on archives; signal params in creature modal;
316316
signal overlay checkbox on ecosystem GIF; outcome label tooltips
317-
- [ ] v3.5.0 - Ecosystem viewer overhaul: all new charts, signal GIF overlay, mode-specific panels, temporal outcome sequence
317+
- [x] v3.5.0 - Chemical coupling (alpha_coupling [-1,1]: multiplicative growth, enables
318+
cross-species predation) + adaptive emission (beta_modulation [-1,1]: quorum sensing /
319+
feedback inhibition); 3 signal-only descriptors; descriptor library 15→18
318320

319321
## References
320322

src/biota/viz/templates/index.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -499,13 +499,13 @@ <h2 id="sys-arch">Architecture</h2>
499499
</div>
500500
<div class="stat">
501501
<div class="stat-label">descriptor library</div>
502-
<div class="stat-value">15 <span class="stat-unit">built-in axes</span></div>
502+
<div class="stat-value">18 <span class="stat-unit">built-in axes</span></div>
503503
</div>
504504
</div>
505505

506506
<h2 id="sys-search">MAP-Elites search</h2>
507507
<p><a class="pill amber" href="https://arxiv.org/abs/1504.04909" target="_blank" style="display:inline;padding:2px 6px;border-radius:3px;font-size:inherit;">MAP-Elites</a> runs a loop: sample parameters, simulate a creature, measure its behavior, insert it into the matching archive cell if it beats whatever is already there. After thousands of rollouts the archive fills with creatures covering the behavioral space as broadly as possible — not optimizing toward one solution, but toward diversity.</p>
508-
<p>The archive is a three-dimensional behavioral grid. Each axis holds one descriptor chosen from a library of fifteen, all normalized to [0, 1] and empirically calibrated against real cluster runs. Each cell holds the highest-quality creature found with that behavioral fingerprint.</p>
508+
<p>The archive is a three-dimensional behavioral grid. Each axis holds one descriptor chosen from a library of eighteen, all normalized to [0, 1] and empirically calibrated against real cluster runs. Each cell holds the highest-quality creature found with that behavioral fingerprint.</p>
509509

510510
<div class="diagram-frame">{{ svg_archive_grid | safe }}</div>
511511

@@ -823,7 +823,7 @@ <h2>GPU and cluster</h2>
823823
<span class="cmd"> --signal-field</span></pre>
824824

825825
<h2>Choosing descriptors</h2>
826-
<p>Pass <code style="font-family:monospace;font-size:12px;color:#e4e4e7;">--descriptors</code> with three comma-separated names to control which behavioral axes the archive uses. With 15 built-ins there are 455 possible configurations. You can also supply your own via <code style="font-family:monospace;font-size:12px;color:#e4e4e7;">--descriptor-module path/to/file.py</code> — the file must define a list named <code style="font-family:monospace;font-size:12px;color:#e4e4e7;">DESCRIPTORS</code> containing <code style="font-family:monospace;font-size:12px;color:#e4e4e7;">Descriptor</code> objects.</p>
826+
<p>Pass <code style="font-family:monospace;font-size:12px;color:#e4e4e7;">--descriptors</code> with three comma-separated names to control which behavioral axes the archive uses. With 18 built-ins (15 general + 3 signal-only) there are 816 possible configurations. You can also supply your own via <code style="font-family:monospace;font-size:12px;color:#e4e4e7;">--descriptor-module path/to/file.py</code> — the file must define a list named <code style="font-family:monospace;font-size:12px;color:#e4e4e7;">DESCRIPTORS</code> containing <code style="font-family:monospace;font-size:12px;color:#e4e4e7;">Descriptor</code> objects.</p>
827827
<pre class="code-block"><span class="comment"># Default axes</span>
828828
<span class="cmd">uv run biota search --descriptors velocity,gyradius,spectral_entropy</span>
829829

0 commit comments

Comments
 (0)