chemart / random-catalytic-networks

View on GitHub

Random 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

namedefaultmeaning
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.