Coupled autocatalytic reactors can keep producing through repeated harvesting even when the model includes an additional reaction intermediate. Its stored material must be tracked through recovery and collection. This example implements the paper's reversible seven-species exporter, common molecular exchange, withdrawal/loss/refill pulses, and repeated recovery from actual returned states.

The code distinguishes productive stock, collected inventory, free product, carried intermediate, food input, and gross reaction service. Product marks are existing washout events in the last unit of each four-unit cycle. Intermediate washout is not credited as product, and free-X collection is already included in inventory collection.

Productive stock recovers during the first coupled flow while the intermediate remains nonzero and below its plotted bound.
Numerical first-cycle trajectories of the literal seven-species network. Dashed lines are the theorem's conditional good-event bounds; the shaded interval is the collection window. These curves are not stochastic failure estimates.
Inventory and free-X outputs are collected over repeated cycles from actual endpoints; sufficient count scale rises with mission length and weighted exchange degree.
Left: deterministic missions with intermediate carryover; free-X output is part of inventory output. Right: the theorem's sufficient sizing bound for two nodes and 1% failure allowance, with the paper's connected 100-cycle witness marked.

For the paper's connected two-reactor, 100-cycle instance, the finite-mission theorem gives a success probability above 99.5% at the stated count scale. Fresh rational arithmetic separately checks a sufficient exponential bound proving more than 99%. The example exposes the scale calculation and integer quotas instead of attempting to simulate that enormous molecular population.

The seven-species model carries the intermediate through every reaction, pulse, and cycle. A separate six-species donor solver demonstrates the exact reduction driven by the recorded material inventories: four productive phases plus the actual material histories recover the full trajectory. An explicit pair of ready states shows why simply deleting the refined intermediate cannot give the same closed dynamics or projected jump law.

Every successful mission of at least 55 cycles must create net new inventory beyond its initial supply. The code checks the inventory balance summed across all cycles, including intermediate storage, all washout, withdrawal, and pulse loss. For the worked mission the worst-ready lower bound is 3.652 × 10¹⁴ newly created inventory equivalents.

Editable inputs and composable classes support new symmetric graphs, node rates, admitted policies, deterministic missions, and optional small-count molecular simulations. Event-budget exhaustion is reported as unfinished, and failed cycles remain in the simulated law. The package includes source, scientific checks, full-state CSV outputs, theorem sizing, and reusable accounting components.

The probability theorem is imported from the manuscript; Lean is not rerun. Numerical trajectories illustrate the literal equations and do not estimate failure probabilities. The scale is sufficient rather than optimized or experimentally calibrated, and the result concerns finite missions beginning in readiness.

Python source

"""Coupled refined reactors: useful operation, exact ledgers, and honest certificates."""
# EDITABLE INPUTS: normalized paper example, not calibrated chemistry.
COUNT_SCALE=224_000_000_000_000
MISSION_CYCLES=100
FAILURE_ALLOWANCE='1/100'
EXCHANGE=((0.,1.),(1.,0.))       # same symmetric graph for every species
RELEASE=('20','20')
CLEAVAGE=('3/100','3/100')
THETA='1/100'                    # stochastic theorem fixes this value
INITIAL=(('19/20','19/20','1/20','0','0','0','0'),
         ('13/14','13/14','0','0','1/28','0','0'))
DENSITY_CYCLES=10
FEEDBACK_POLICY=False           # True retains more after a small actual prior collection
SMALL_COUNT_SCALE=1400          # optional SSA, far below useful theorem scale
SMALL_CYCLES=2
EVENT_BUDGET=200000
RANDOM_SEED=51092026
CONCENTRATION_MOLAR='1/1000'     # illustrative unit conversion
TIME_UNIT_SECONDS=60.

import argparse
from fractions import Fraction as F
import csv
import hashlib
import json
import math
from pathlib import Path
import platform
import numpy as np
from mpmath import iv
import sympy as sp
from reactor import (Chemistry,CommonExchange,Intervention,HistoryPolicy,ReactorNetwork,
    DeterministicMission,MolecularMission,ready,A,B,I,J,Y,EPS,ETA,ACCOUNTS,SPECIES)

iv.dps=60
MANUSCRIPT_SHA256='6939f07afd2c656577771d525062a8375f3ec59a0a20e453f06c736e638d0820'


def interval(q):
    q=F(q);return iv.mpf(q.numerator)/q.denominator


def lower(x):return math.nextafter(float(x.a),-math.inf)
def upper(x):return math.nextafter(float(x.b),math.inf)


class MissionCertificate:
    """Imported theorem interface; numerical tail evaluated with outward bounds."""
    def __init__(self,network):self.network=network
    def bound(self,V,cycles,initial):
        if type(V) is not int or V<10000 or type(cycles) is not int or cycles<0:raise ValueError('Theorem requires integer V>=10000 and cycles>=0')
        net=self.network
        if not all(c.scope(True) for c in net.chemistries):raise ValueError('Rates or theta outside stochastic theorem')
        if not ready(initial,net.chemistries[0].theta,V):raise ValueError('Every initial node must be ready')
        refined=net.size==7;pref=29 if refined else 27;C=2*10**12 if refined else 2*10**14
        degree=net.exchange.exact_degree;exponent=F(V)/(C*(1+degree)**3)
        if cycles==0:prob=1.;tail=0.
        else:
            tail=upper(interval(pref*net.n*cycles)*iv.exp(-interval(exponent)))
            prob=max(0.,math.nextafter(1-tail,-math.inf))
        synthesis=net.n*cycles*(-(-V//56))+net.n*F(V,28)-sum(int(row@J[:net.size]) for row in initial)
        worst=net.n*V*(F(cycles,56)+F(1,28)-F(161,160)) if cycles else None
        return dict(lower_probability=prob,failure_union_upper=tail,exponent=exponent,
            node_count=net.n,degree_bound=degree,cycles=cycles,V=V,refined=refined,
            required_QI_per_node_cycle=-(-V//56),required_QX_per_node_cycle=-(-V//1080),
            max_each_food=5*V,max_gross_service=V//5,
            net_synthesis_lower_using_initial=synthesis if cycles else None,
            net_synthesis_lower_worst_ready=worst,
            scope='Theorem applied to ready initial counts and admitted literal history policy; not estimated from trajectories')

    def sufficient_scale(self,cycles,delta):
        if type(cycles) is not int or cycles<1 or not 0<F(delta)<1:raise ValueError('Positive mission and failure allowance in (0,1)')
        net=self.network;pref=29 if net.size==7 else 27;C=2*10**12 if net.size==7 else 2*10**14
        q=F(1)+net.exchange.exact_degree
        val=interval(C*q**3)*iv.ln(interval(F(pref*net.n*cycles)/F(delta)))
        return max(10000,math.ceil(upper(val)))


def exact_checks():
    chemistry=Chemistry();s=sp.symbols('u w x c1 c2 z h');V=sp.Symbol('V',positive=True)
    rates=[sp.Rational(c.k.numerator,c.k.denominator)*sp.prod(s[i] for i in c.inputs) for c in chemistry.channels]
    f=[sp.expand(sum(rate*c.jump[i] for rate,c in zip(rates,chemistry.channels))) for i in range(7)]
    assert sp.expand(sum(int(a)*v for a,v in zip(A,f))-(1-sum(int(a)*x for a,x in zip(A,s)) ))==0
    assert sp.expand(sum(int(a)*v for a,v in zip(B,f))-(1-sum(int(a)*x for a,x in zip(B,s)) ))==0
    count_rates=[]
    for c in chemistry.channels:
        count_rates.append(sp.Rational(c.k.numerator,c.k.denominator)*V**(1-len(c.inputs))*sp.prod(V*s[i]-c.inputs[:k].count(i) for k,i in enumerate(c.inputs)))
    correction=[sp.simplify(sum(rate*c.jump[i]/V for rate,c in zip(count_rates,chemistry.channels))-f[i]) for i in range(7)]
    assert correction==[0,0,40*s[2]/V,0,0,-20*s[2]/V,0]
    yw=[F(0),F(0),F(1),F(9,8),F(7,5),F(9,5),F(0)]
    assert sp.simplify(sum(w*c for w,c in zip(yw,correction))-4*s[2]/V)==0
    increments=[sum(int(w)*v for w,v in zip(J,c.jump)) for c in chemistry.channels if c.direction==1]
    assert increments==[1,0,0,1,0,0,-1]
    # Finite adjoint: polynomial row, rational exponential upper bound, and noise margins.
    H=sp.Matrix([[0,20,0,38],[0,5,20,0],[0,0,7,2],[0,0,20,24]])
    row=(sum((H**j*sp.Rational(1,28)**j/math.factorial(j) for j in range(5)),sp.zeros(4)))[0,:]
    expect=[F(1),F(961355,1229312),F(1847785,1843968),F(665611,307328)]
    assert list(row)==[sp.Rational(q.numerator,q.denominator) for q in expect]
    expupper=sum(F(6,7)**j/math.factorial(j) for j in range(8))+F(6,7)**8*F(9,8)/math.factorial(8)
    assert expupper<=F(2357,1000) and F(2357,1000)**2<=F(961355,172872)
    assert min(a/b for a,b in zip(expect,yw[2:6]))==F(961355,1382976)
    freeX=F(5145,100000)/8-F(8,10000)
    assert freeX==F(901,160000)
    assert F(3575,100000)>F(1,56) and freeX-F(1,1000)>F(1,1080) and F(181,1000)<F(1,5)
    # Multiplying by (1+Delta) makes the graph-noise inequality affine; coefficients suffice.
    D=sp.Symbol('D',nonnegative=True)
    eps=1/(10000*(1+D));eta=sp.Rational(11,2)*eps
    surplus=sp.expand((sp.Rational(2,3)-sp.Rational(11,20))*sp.Rational(59,5000)*(1+D)-(2*D+sp.Rational(2,3))*sp.Rational(11,20000))
    assert all(c>0 for c in sp.Poly(surplus,D).all_coeffs())
    assert F(361,5120000*10**8)>=F(1,2*10**12)
    taylor=sum(F(14)**j/math.factorial(j) for j in range(16))
    assert taylor>600000 and 1-F(5800,600000)>F(99,100)
    assert F(54,56)+F(1,28)-F(161,160)<0<F(55,56)+F(1,28)-F(161,160)
    # Same six coordinates, distinct h: exact projected derivatives and projected event rates.
    h=F(1,200);d=F(3,100);beta=theta=F(1,100)
    projection_difference=[d*h/theta,d*h/theta,d*beta*h/theta,F(0),F(0),F(0)]
    assert projection_difference[:3]==[F(3,200),F(3,200),F(3,20000)]
    return dict(material_identities=True,falling_factorial_correction=[str(v) for v in correction],
        inventory_forward_increments=increments,phase_polynomial_row=expect,exp_6_over_7_upper=expupper,
        phase_free_X_floor=freeX,noise_margin_polynomial=str(surplus),witness_exp14_lower=taylor,
        witness_probability_rational_lower=1-F(5800,600000),net_synthesis_positive_from_cycle=55,
        nonclosure_projected_derivative_difference=projection_difference,
        evidence='Fresh symbolic/rational identities; probability theorem imported, Lean not rerun')


def literal_initial(V,refined=True):
    vals=[[F(x)*V for x in row] for row in INITIAL]
    if any(v.denominator!=1 for row in vals for v in row):raise ValueError('Initial density is not integral at this V')
    return np.array([[int(v) for v in row[:7 if refined else 6]] for row in vals],dtype=np.int64)


def main():
    parser=argparse.ArgumentParser(description=__doc__);parser.add_argument('--output',default='outputs');parser.add_argument('--simulate',action='store_true');args=parser.parse_args()
    out=Path(args.output);out.mkdir(parents=True,exist_ok=True)
    graph=CommonExchange(EXCHANGE);net=ReactorNetwork([Chemistry(r,d,THETA) for r,d in zip(RELEASE,CLEAVAGE)],graph)
    policy=HistoryPolicy(7,FEEDBACK_POLICY);initial=np.array([[float(F(v)) for v in row] for row in INITIAL])
    certificate=MissionCertificate(net);bound=certificate.bound(COUNT_SCALE,MISSION_CYCLES,literal_initial(COUNT_SCALE))
    run=DeterministicMission(net,policy).run(initial,DENSITY_CYCLES)
    donor=ReactorNetwork([Chemistry(r,d,refined=False) for r,d in zip(RELEASE,CLEAVAGE)],graph)
    post=np.array([Intervention(survival=('49/50',)*6).deterministic(row[:6])[0] for row in initial])
    full=donor.evolve(post);reduced=donor.donor_reduced(post)
    reduction_error=float(np.max(abs(full['end']-reduced)))
    refined_first=run['traces'][0]
    # Finite theta is retained: compare the illustrative endpoints, without convergence claims.
    theta_rows=[]
    for theta in ['1/100','1/1000','1/10000']:
        other=ReactorNetwork([Chemistry(r,d,theta) for r,d in zip(RELEASE,CLEAVAGE)],graph)
        after=np.array([Intervention().deterministic(row)[0] for row in initial]);flow=other.evolve(after)
        theta_rows.append(dict(theta=theta,max_endpoint_difference_to_donor=float(np.max(abs(flow['end'][:,:6]-full['end']))),
            carried_intermediate=flow['end'][:,6].tolist()))
    result=dict(inputs=dict(V=COUNT_SCALE,mission_cycles=MISSION_CYCLES,theta=THETA,release=RELEASE,cleavage=CLEAVAGE,exchange=EXCHANGE,initial=INITIAL),
        exact=exact_checks(),refined_certificate=bound,
        donor_certificate=MissionCertificate(donor).bound(COUNT_SCALE,MISSION_CYCLES,literal_initial(COUNT_SCALE,False)),
        sufficient_scale=certificate.sufficient_scale(MISSION_CYCLES,FAILURE_ALLOWANCE),
        donor_reduction_endpoint_error=reduction_error,theta_illustrations=theta_rows,
        numerical_mission={k:v for k,v in run.items() if k not in ('traces','final')},
        units=dict(concentration_molar=CONCENTRATION_MOLAR,cycle_seconds=4*TIME_UNIT_SECONDS,
            node_volume_liters=float(F(COUNT_SCALE)/(F('6.02214076e23')*F(CONCENTRATION_MOLAR)))))
    if args.simulate:
        result['small_count_path']=MolecularMission(net,policy,SMALL_COUNT_SCALE,RANDOM_SEED).run(literal_initial(SMALL_COUNT_SCALE),SMALL_CYCLES,EVENT_BUDGET)
    dump=lambda name,obj:(out/name).write_text(json.dumps(obj,indent=2,default=lambda v:v.tolist() if isinstance(v,np.ndarray) else str(v) if isinstance(v,F) else float(v))+'\n',encoding='utf-8')
    dump('results.json',result)
    def table(name,header,rows):
        with (out/name).open('w',newline='') as f:w=csv.writer(f);w.writerow(header);w.writerows(rows)
    table('cycles.csv',['cycle','node',*ACCOUNTS,'food_U','food_W',*SPECIES],
        [(h['cycle'],i,*h['accounts'][i],*h['food'][i],*h['endpoint'][i]) for h in run['history'] for i in range(graph.n)])
    table('first_cycle.csv',['t','node',*SPECIES,'material_A','material_B','stock_Y','inventory_I'],
        [(t,i,*row,row@A,row@B,row@Y,row@I) for t,cs in zip(refined_first['times'],refined_first['states']) for i,row in enumerate(cs)])
    sizes=[]
    for degree in [0,1,4]:
        other=ReactorNetwork(net.chemistries,CommonExchange([[0,degree],[degree,0]]));cert=MissionCertificate(other)
        for m in [1,3,10,30,100,300,1000,3000,10000]:sizes.append([degree,m,cert.sufficient_scale(m,'1/100')])
    table('sizing.csv',['maximum_weighted_degree','cycles','sufficient_V'],sizes)
    lines=[f'Refined mission lower probability: {bound["lower_probability"]:.10f}; donor bound at the same scale: {result["donor_certificate"]["lower_probability"]:.10f}.',
        f'Sufficient V for failure allowance {FAILURE_ALLOWANCE}: {result["sufficient_scale"]}.',
        f'Worst-ready net synthesis lower bound: {bound["net_synthesis_lower_worst_ready"]} inventory equivalents.',
        f'Donor full versus material-forced reduction endpoint gap: {reduction_error:.3g}.',
        f'Deterministic ledger residuals: inventory {run["inventory_telescope_residual"]:.3g}, intermediate storage {run["storage_telescope_residual"]:.3g}.',
        'Illustrations are deterministic; the probability theorem is imported. Lean is not rerun.']
    (out/'console.txt').write_text('\n'.join(lines)+'\n');print('\n'.join(lines))
    plot(out,run,sizes)
    digest=lambda p:hashlib.sha256(p.read_bytes()).hexdigest()
    dump('run_metadata.json',dict(manuscript_sha256=MANUSCRIPT_SHA256,python=platform.python_version(),
        source_sha256=digest(Path(__file__)),module_sha256={p.name:digest(p) for p in Path(__file__).parent.glob('*.py')},
        output_sha256={p.name:digest(p) for p in sorted(out.iterdir()) if p.is_file() and p.name!='run_metadata.json'}))


def plot(out,run,sizes):
    import matplotlib
    matplotlib.use('Agg')
    import matplotlib.pyplot as plt
    first=run['traces'][0];t=first['times'];c=first['states']
    fig,axs=plt.subplots(1,2,figsize=(10,4),layout='constrained')
    for i in range(c.shape[1]):
        axs[0].plot(t,(c@Y)[:,i],label=f'Node {i+1}')
        axs[1].plot(t,c[:,i,6],label=f'Node {i+1}')
    axs[0].plot(t,np.minimum(.0118*np.exp(.55*t),.052)-.00055,'--',color='k',label='Good-event stock bound')
    axs[1].plot(t,.009+.00201*np.exp(-3.02*t)+.0003,'--',color='k',label='Good-event intermediate bound')
    for ax,title,yl in zip(axs,['Catalytic stock during recovery','Intermediate concentration during recovery'],['Stock Y','Intermediate D']):
        ax.set(title=title,xlabel='Normalized time',ylabel=yl);ax.axvspan(3,4,alpha=.08);ax.grid(alpha=.2);ax.legend(fontsize=7)
    fig.savefig(out/'refined_flow.png',dpi=180);fig.savefig(out/'refined_flow.svg');plt.close(fig)
    fig,axs=plt.subplots(1,2,figsize=(10,4),layout='constrained')
    h=run['history'];k=[v['cycle'] for v in h]
    for i in range(c.shape[1]):
        axs[0].plot(k,[v['accounts'][i][0] for v in h],'-o',label=f'Inventory, node {i+1}')
        axs[0].plot(k,[v['accounts'][i][1] for v in h],'--',label=f'Free X, node {i+1}')
    axs[0].set(title='Collected output over successive reactor\ncycles',xlabel='Cycle',ylabel='Collected normalized amount');axs[0].legend(fontsize=7)
    for degree in [0,1,4]:
        a=np.array([r for r in sizes if r[0]==degree]);axs[1].loglog(a[:,1],a[:,2],label=f'Degree ≤ {degree}')
    axs[1].scatter([100],[224000000000000],color='k',s=20,label='Paper witness')
    axs[1].set(title='A sufficient count scale',xlabel='Mission cycles',ylabel='Sufficient count scale V');axs[1].legend(fontsize=7)
    for ax in axs:ax.grid(alpha=.2)
    fig.savefig(out/'mission.png',dpi=180);fig.savefig(out/'mission.svg');plt.close(fig)


if __name__=='__main__':main()
Run output
Refined mission lower probability: 0.9951771334; donor bound at the same scale: 0.0000000000.
Sufficient V for failure allowance 1/100: 212332534120362.
Worst-ready net synthesis lower bound: 365200000000000 inventory equivalents.
Donor full versus material-forced reduction endpoint gap: 1.88e-12.
Deterministic ledger residuals: inventory -1.67e-13, intermediate storage 0.
Illustrations are deterministic; the probability theorem is imported. Lean is not rerun.