Skip to content

Commit 10a5389

Browse files
committed
feat: v3.5.0 commits 3+4 -- quality adjustment + docs
quality.py Signal run weights adjusted: stability 0.3→0.2, retention 0.2→0.3. Creatures with nonzero beta_modulation produce mild descriptor variance during solo rollout due to the signal feedback loop -- the old stability weight penalised this even though it is ecologically desirable behaviour. Retention at 0.3 more directly rewards creatures that don't bleed mass through adaptive emission, creating better selection pressure for the alpha/beta parameter space we now search. Non-signal weights unchanged (0.6 compactness / 0.4 stability). docs/signal-field.svg Full redraw showing alpha and beta in the diagram. Eight nodes total: left column (mass → convolve → growth G → α coupling → emission → mass t+1) and right column (signal → convolve → reception → β modulation → decay → signal t+1). Three cross-arrows: α (reception → growth multiplier, teal dashed), β (mean reception → modulate emission rate, purple dashed), emission drain (amber dashed). Parameter legend lists all six key signal params with ranges and ecological roles (chemotaxis/repulsion, quorum/inhibition). index.html (System tab) Signal field parameter math block: alpha_coupling [-1,1] and beta_modulation [-1,1] rows added with ecological descriptions. Physics step-by-step updated: steps (4) and (5) now describe alpha multiplicative coupling and beta adaptive emission modulation. Descriptors grid: three new signal-only descriptor cards with teal/purple SIGNAL ONLY badges -- emission_activity, receptor_sensitivity, signal_retention -- each with ecological interpretation and zero-for-non-signal note. README.md Signal parameter table: alpha_coupling and beta_modulation rows added. Physics paragraph: updated to describe alpha chemotaxis/chemorepulsion and beta quorum sensing/feedback inhibition. Quality metric: signal weights updated to match (0.5/0.2/0.3). Test count: 422.
1 parent c6b3969 commit 10a5389

4 files changed

Lines changed: 109 additions & 112 deletions

File tree

README.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,20 +156,22 @@ This adds six signal parameters to each creature's searchable parameter space:
156156
| `receptor_profile` | `(16,)` | `[-1, 1]` | Channel weights for sensing. Negative values produce inhibitory (aversive) responses |
157157
| `emission_rate` | scalar | `[0.001, 0.05]` | Fraction of positive growth activity converted to signal per step. Lower values reduce mass bleed over long ecosystem runs |
158158
| `decay_rates` | `(16,)` | `[0, 0.9]` | Per-channel decay rate applied each step. Creatures with low decay on key channels maintain longer-range chemical gradients |
159+
| `alpha_coupling` | scalar | `[-1, 1]` | Reception-to-growth coupling. Positive = chemotaxis (grow into favorable signal, enables cross-species predation). Negative = chemorepulsion. Zero = no coupling |
160+
| `beta_modulation` | scalar | `[-1, 1]` | Adaptive emission. Positive = quorum sensing (amplify emission when receiving signal). Negative = feedback inhibition (suppress emission). Zero = static rate |
159161
| `signal_kernel_r` | scalar | `[0.2, 1.0]` | Signal kernel radius scale |
160162
| `signal_kernel_a/b/w` | `(3,)` each | same as mass kernels | Ring function parameters for signal diffusion |
161163

162164
![signal field mechanics](docs/signal-field.svg)
163165

164-
**Physics.** At each step: (1) the creature emits signal proportional to local positive growth activity scaled by `emission_rate`, draining from the mass field into the signal field; (2) the signal field is convolved with the creature's signal kernel; (3) the dot product of the convolved field with `receptor_profile` boosts (or inhibits) the growth field; (4) the signal field decays per-channel at the creature's own `decay_rates`. The total conserved quantity is `mass + signal`. Decay is the only leak.
166+
**Physics.** At each step: (1) convolve mass to get G(H,W); (2) convolve signal field; (3) compute reception `dot(convolved_signal, receptor_profile)`; (4) apply `alpha_coupling`: `G *= (1 + alpha * reception).clamp(min=0)` -- positive alpha is chemotaxis (grow into favorable signal, including other species' territory, enabling cross-species predation); negative alpha is chemorepulsion; (5) modulate emission rate via `beta_modulation`: `rate_eff = rate * (1 + beta * mean(reception))` clipped to [0, 0.1] -- positive beta is quorum sensing, negative beta is feedback inhibition; (6) emit `G_pos * rate_eff * emission_vector`, draining mass into signal field; (7) reintegrate mass; (8) decay signal at `decay_rates`. Total conserved: mass + signal.
165167

166168
**Archive compatibility.** An archive produced with `--signal-field` is tagged `"signal_field": true` in `manifest.json`. Ecosystem runs detect this automatically from the creature params -- no YAML flag needed. If any source creature comes from a signal-enabled archive, all sources must too; mixing signal and non-signal archives raises an error at load time.
167169

168170
**Quality metric.** Three hard filters gate entry: (1) conserved mass within [0.5, 2.0] × initial; (2) bounding-box fraction < 0.6 (not scattered); (3) descriptor drift across adjacent 50-step windows ≤ 0.2. Survivors are ranked by a three-component score:
169171

170172
```
171173
non-signal: q = 0.6 × compactness + 0.4 × stability
172-
signal: q = 0.5 × compactness + 0.3 × stability + 0.2 × retention
174+
signal: q = 0.5 × compactness + 0.2 × stability + 0.3 × retention
173175

174176
compactness = min( compact(state_T/2), compact(state_T) )
175177
stability = clip( 1 − drift / 0.2, 0, 1 )
@@ -283,7 +285,7 @@ ecosystem/20260415-104007-096-dense-population/
283285
## Development
284286

285287
```bash
286-
just check # ruff + pyright + pytest (406 tests, 0 warnings)
288+
just check # ruff + pyright + pytest (422 tests, 0 warnings)
287289
just smoke-ray # local-Ray integration smoke test
288290
```
289291

docs/signal-field.svg

Lines changed: 86 additions & 103 deletions
Loading

src/biota/search/quality.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
3131
Weights:
3232
Non-signal: w_c = 0.6, w_s = 0.4, w_r = 0.0
33-
Signal: w_c = 0.5, w_s = 0.3, w_r = 0.2
33+
Signal: w_c = 0.5, w_s = 0.2, w_r = 0.3
3434
3535
The midpoint compactness term is the key addition over the old single-point
3636
metric. Most Flow-Lenia solitons score >0.95 compactness at the final step,
@@ -64,8 +64,8 @@
6464
_W_COMPACT_BASE = 0.6
6565
_W_STABLE_BASE = 0.4
6666
_W_COMPACT_SIG = 0.5
67-
_W_STABLE_SIG = 0.3
68-
_W_RETAIN_SIG = 0.2
67+
_W_STABLE_SIG = 0.2
68+
_W_RETAIN_SIG = 0.3
6969

7070

7171
@dataclass(frozen=True)
@@ -194,7 +194,7 @@ def evaluate(
194194
retention final_mass / initial_mass, clipped [0,1] (signal only)
195195
196196
Weights (non-signal): compactness=0.6, stability=0.4
197-
Weights (signal): compactness=0.5, stability=0.3, retention=0.2
197+
Weights (signal): compactness=0.5, stability=0.2, retention=0.3
198198
"""
199199
if not _alive(eval_input):
200200
return EvaluationResult(descriptors=None, quality=None, rejection_reason="dead")

0 commit comments

Comments
 (0)