chemart / random-catalytic-networks
View on GitHubRandom catalytic reaction networks — The null model the more elaborate chemistries all instantiate. Species have no internal structure at all; instead, for every pair, a randomly drawn coefficient says how strongly that pair catalyses the production of a th…
How it works
The null model the more elaborate chemistries all instantiate. Species have no internal structure at all; instead, for every pair, a randomly drawn coefficient says how strongly that pair catalyses the production of a third. With a dilution flux, the system settles onto a stable fixed point; in sparse networks only a mutually-catalysing subset survives there and the rest dies out. Because it contains the replicator and Lotka-Volterra equations as special cases, it is the baseline against which structured chemistries have to justify their structure.
- S
- n abstract species X_1..X_n with no internal structure · explicit
- R
- X_i + X_j --alpha^k_ij--> X_i + X_j + X_k (both reactants catalytic) · arity 2
- A
- ode · non-specific dilution flux phi
Parameters
| name | default | meaning |
|---|---|---|
| n int · structural |
10 | number of species [2, 60] |
| density float · structural |
0.1 | probability that a given reaction X_i + X_j -> X_i + X_j + X_k exists; sparse to dense [0, 1] |
| allow_direct_replication bool · structural |
false | allow k = i or k = j; the book's interesting case forbids direct self-replication |
| alpha_distribution enum · kinetic |
"uniform" | distribution of the rate alpha of an existing reaction: uniform on [0, 1) or exponential with mean 1 uniform | exponential |
Random catalytic reaction networks
One of the artificial chemistries of Banzhaf & Yamamoto, Artificial Chemistries (MIT Press, 2015), §7.2.9; first proposed by Stadler, Fontana & Miller, 1993.
Its generator ships with the chemart library, so loading it runs no code from the hub and needs no trust_remote_code.
import chemart
net = chemart.generate_network("chemart/random-catalytic-networks", seed=0) # same as "random-catalytic-networks"
print(net.summary())
What to look for
- convergence to a stable fixpoint (interior when the network is dense; in sparse networks only a mutually catalytic subset survives) - later recognised as a chemical organisation
- contains the replicator and Lotka-Volterra equations as special cases
Implementation decisions
- The book gives the reaction scheme, the ODE and the direct-replication switch, but not how alpha is drawn. Each existing reaction gets alpha from `alpha_distribution` (default uniform on [0, 1)).
- Reactions are sampled per unordered reactant pair {i, j}. In the ODE the ordered terms alpha^k_ij and alpha^k_ji describe the same reaction, so one rate per pair loses nothing. The dilution phi is outflow = 'constant-total'.
Banzhaf & Yamamoto, Artificial Chemistries (2015), §7.2.9
Preview at default parameters
10 species · 42 reactions · status complete · seed 1
X1 + X2 -> X1 + X2 + X3 [mass-action k=0.7535131086748066] X1 + X5 -> X1 + X5 + X4 [mass-action k=0.5285892632600216] X1 + X5 -> X1 + X5 + X7 [mass-action k=0.641328169139375] X1 + X7 -> X1 + X7 + X5 [mass-action k=0.8552269742870702] X1 + X8 -> X1 + X8 + X2 [mass-action k=0.6457208955749478] X1 + X9 -> X1 + X9 + X7 [mass-action k=0.6734598871529389] X1 + X10 -> X1 + X10 + X8 [mass-action k=0.8254878133935558] 2 X2 -> 2 X2 + X7 [mass-action k=0.2624947127501015] X2 + X4 -> X2 + X4 + X8 [mass-action k=0.2578031189967366] X2 + X8 -> X2 + X8 + X3 [mass-action k=0.48844922708552385] X3 + X4 -> X3 + X4 + X6 [mass-action k=0.4935715599433962] X3 + X5 -> X3 + X5 + X4 [mass-action k=0.3035089265995107] X3 + X6 -> X3 + X6 + X5 [mass-action k=0.4468129517344519] X3 + X8 -> X3 + X8 + X4 [mass-action k=0.9628645784432278] X3 + X8 -> X3 + X8 + X10 [mass-action k=0.18679367935380853] X3 + X10 -> X3 + X10 + X4 [mass-action k=0.17483553789762363] 2 X4 -> 2 X4 + X6 [mass-action k=0.1181052271508587] 2 X4 -> 2 X4 + X8 [mass-action k=0.5995244730532772] X4 + X5 -> X4 + X5 + X2 [mass-action k=0.7409444532381589] X4 + X5 -> X4 + X5 + X7 [mass-action k=0.4294641446388775] X4 + X6 -> X4 + X6 + X1 [mass-action k=0.08185799707724206] X4 + X6 -> X4 + X6 + X9 [mass-action k=0.8262233467711652] X4 + X6 -> X4 + X6 + X10 [mass-action k=0.09299199266222835] X4 + X8 -> X4 + X8 + X1 [mass-action k=0.9268052023585862] X4 + X8 -> X4 + X8 + X7 [mass-action k=0.6317521922027585] X4 + X8 -> X4 + X8 + X10 [mass-action k=0.8074227810412945] X4 + X9 -> X4 + X9 + X7 [mass-action k=0.06556315241841992] X4 + X10 -> X4 + X10 + X5 [mass-action k=0.16620516559297116] 2 X5 -> 2 X5 + X7 [mass-action k=0.3855872572300576] X5 + X6 -> X5 + X6 + X7 [mass-action k=0.052176257643147705] X5 + X7 -> X5 + X7 + X1 [mass-action k=0.3658435291805171] X5 + X7 -> X5 + X7 + X2 [mass-action k=0.6400105583176766] X5 + X7 -> X5 + X7 + X3 [mass-action k=0.0684096355417223] X5 + X7 -> X5 + X7 + X4 [mass-action k=0.2717851313028795] 2 X6 -> 2 X6 + X1 [mass-action k=0.8330947688085336] 2 X6 -> 2 X6 + X2 [mass-action k=0.8275951638592104] X7 + X8 -> X7 + X8 + X3 [mass-action k=0.09171473713390443] X7 + X8 -> X7 + X8 + X10 [mass-action k=0.6814384526526729] X8 + X10 -> X8 + X10 + X5 [mass-action k=0.1622873344023199] X9 + X10 -> X9 + X10 + X6 [mass-action k=0.3764060873778814] … 2 more
Generated by the uploader with chemart push; the hub never runs uploaded code.