codex/nested-contact-allocation.py

nested-contact-allocation.py
"""Original fixed-budget nested-contact model; run from _media."""
from pathlib import Path
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

budget,cw,cr,tau,sigma=180.,9.,1.,2.,6.
r=np.linspace(1,45,500)
m=budget/(cw+r*cr)
u=np.sqrt((tau*tau+sigma*sigma/r)/m)
fig,ax=plt.subplots(figsize=(8,3.5),dpi=120,layout='constrained')
fig.patch.set_facecolor('white')
ax.plot(r,u,color='#245d9c',label='Continuous allocation model')
for readings,wrings in [(1,18),(9,10),(36,4)]:
 se=np.sqrt(tau*tau/wrings+sigma*sigma/(wrings*readings))
 ax.scatter([readings],[se],color='#a64d29',zorder=3)
 ax.annotate(f'{wrings} wrings × {readings} '+('read' if readings==1 else 'reads'),xy=(readings,se),xytext=(8,12),textcoords='offset points',fontsize=9)
ax.set(xlabel='Readouts per independent wring',ylabel='Standard deviation of overall mean (nm)',title='Fixed 180-minute budget: balance rewringing and readout noise',xlim=(0,45),ylim=(.7,1.8))
ax.text(.02,.94,'Model: 9 min/wring + 1 min/read; between-wring SD 2 nm, readout SD 6 nm',transform=ax.transAxes,fontsize=9)
ax.spines[['top','right']].set_visible(False)
ax.grid(alpha=.2);ax.legend(fontsize=9,loc='lower right')
fig.savefig(Path('nested-contact-allocation.png'),facecolor='white')