"""Reynolds NDE (Case C.5) – direct DPR injection of saw pattern during cardiac arrest."""
import matplotlib.pyplot as plt
import numpy as np
from mercurial.core.jansen_rit import JansenRitColumn, JansenRitParams
from mercurial.core.neural_field import NeuralField2D
from mercurial.simulation.engine import SimulationEngine
[docs]
def run_reynolds_nde():
engine = SimulationEngine(dim=20)
engine.apply_empirical_parameters()
# 1. Jansen‑Rit column for patient's EEG
jr_params = JansenRitParams()
jr_column = JansenRitColumn(jr_params=jr_params, noise_amp=0.01)
eeg_vals = []
# 2. 2D neural field for visual cortex (size 32x32)
nx, ny = 32, 32
visual_field = NeuralField2D(nx, ny, dx=0.5, wc_params=engine.wc_params.__dict__)
# 3. Saw pattern (to be injected via DPR)
X, Y = np.meshgrid(np.linspace(-2, 2, nx), np.linspace(-2, 2, ny))
saw_pattern = np.exp(-((X - 0.5) ** 2 + Y**2) / 0.2) + 0.5 * np.exp(
-((X + 0.5) ** 2 + Y**2) / 0.3
)
dt = 0.001
t_span = (0.0, 2.0)
steps = int((t_span[1] - t_span[0]) / dt)
for step in range(steps):
t = step * dt
# Simulate cardiac arrest: normal input before 0.5 s, then flat EEG
if t < 0.5:
jr_column.step(dt, p_ext=100.0)
else:
jr_column.step(dt, p_ext=0.0)
eeg = jr_column.get_EEG()
eeg_vals.append(eeg)
# DPR: direct injection of saw pattern into visual field during cardiac arrest
if t >= 0.5:
# Inject the saw pattern as external input (strong coupling)
P_ext = 5.0 * saw_pattern
else:
P_ext = np.zeros((nx, ny))
visual_field.step(dt, P_ext=P_ext)
# Correlation between final visual field and saw pattern
final_vis = visual_field.E
correlation = np.corrcoef(final_vis.flatten(), saw_pattern.flatten())[0, 1]
print(f"Correlation between final visual field and saw pattern: {correlation:.3f}")
# Plot EEG
plt.figure()
plt.plot(np.arange(len(eeg_vals)) * dt, eeg_vals)
plt.xlabel("Time (s)")
plt.ylabel("EEG (mV)")
plt.title("Reynolds NDE – Simulated EEG (flat after 0.5s)")
plt.grid(True)
plt.show()
# Plot final visual field
plt.figure()
plt.imshow(final_vis, cmap="hot")
plt.colorbar()
plt.title("Final visual cortex activity (should resemble saw)")
plt.show()
return correlation
if __name__ == "__main__":
run_reynolds_nde()