FA-65416 / Ecological population dynamics / Open access
Lotka-Volterra predator-prey Euler integration: predator mortality · case 01
Predator mortality is a constant loss that drives small populations negative.
ROOT CAUSE
Mortality is not per-capita.
VERIFIED REPAIR
Restore the predator mortality rule: `- gamma * y`.
Unsuccessful approach: Scaling predator mortality by prey density has no biological basis.
Case contract
dx = alpha*x - beta*x*y, dy = delta*x*y - gamma*y evaluated from the same start-of-step state; Euler update with each population floored at 0; return [path of [x,y] rounded 4 including start, coexistence equilibrium [gamma/delta, alpha/beta] rounded 4 or None when beta or delta is not positive].
Why this case matters
Population projections set harvest quotas, conservation status and pest-control timing; a wrong update order, boundary or rate conversion silently changes management advice.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(prey0, pred0, alpha, beta, delta, gamma, dt, steps):
x, y = float(prey0), float(pred0)
path = [[round(x, 4), round(y, 4)]]
for _ in range(steps):
dx = alpha * x - beta * x * y
dy = delta * x * y - gamma
x = max(x + dx * dt, 0.0)
y = max(y + dy * dt, 0.0)
path.append([round(x, 4), round(y, 4)])
eq = [round(gamma / delta, 4), round(alpha / beta, 4)] if beta > 0 and delta > 0 else None
return [path, eq]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: hare and lynx',
(40, 9, 0.1, 0.02, 0.01, 0.1, 0.5, 6),
[[[40.0, 9.0],
[38.4, 10.35],
[36.3456, 11.8197],
[33.8669, 13.3767],
[31.03, 14.973],
[27.9354, 16.5474],
[24.7096, 18.0313]],
[10.0, 5.0]]),
('regression: large step overshoot',
(10, 50, 0.5, 0.1, 0.02, 0.4, 1.0, 4),
[[[10.0, 50.0], [0.0, 40.0], [0.0, 24.0], [0.0, 14.4], [0.0, 8.64]], [20.0, 5.0]]),
('control: predators absent',
(20, 0, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]]),
('regression: prey absent',
(0, 10, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[0.0, 10.0], [0.0, 9.0], [0.0, 8.1], [0.0, 7.29], [0.0, 6.561]], [10.0, 6.0]]),
('regression: no interaction',
(30, 5, 0.2, 0.0, 0.0, 0.1, 1.0, 3),
[[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None]),
('regression: at equilibrium',
(10, 5, 0.5, 0.1, 0.02, 0.2, 0.25, 4),
[[[10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0]], [10.0, 5.0]]),
('regression: fine steps',
(15, 4, 0.8, 0.1, 0.05, 0.6, 0.1, 8),
[[[15.0, 4.0],
[15.6, 4.06],
[16.2146, 4.1331],
[16.8416, 4.2202],
[17.4782, 4.3223],
[18.121, 4.4407],
[18.766, 4.5766],
[19.4084, 4.7315],
[20.0428, 4.9067]],
[12.0, 8.0]])],
[('regression: hare and lynx',
(40, 9, 0.1, 0.02, 0.01, 0.1, 0.5, 6),
[[[40.0, 9.0],
[38.4, 10.35],
[36.3456, 11.8197],
[33.8669, 13.3767],
[31.03, 14.973],
[27.9354, 16.5474],
[24.7096, 18.0313]],
[10.0, 5.0]]),
('control: predators absent',
(20, 0, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]]),
('regression: prey absent',
(0, 10, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[0.0, 10.0], [0.0, 9.0], [0.0, 8.1], [0.0, 7.29], [0.0, 6.561]], [10.0, 6.0]]),
('regression: no interaction',
(30, 5, 0.2, 0.0, 0.0, 0.1, 1.0, 3),
[[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None]),
('regression: at equilibrium',
(10, 5, 0.5, 0.1, 0.02, 0.2, 0.25, 4),
[[[10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0]], [10.0, 5.0]]),
('regression: fine steps',
(15, 4, 0.8, 0.1, 0.05, 0.6, 0.1, 8),
[[[15.0, 4.0],
[15.6, 4.06],
[16.2146, 4.1331],
[16.8416, 4.2202],
[17.4782, 4.3223],
[18.121, 4.4407],
[18.766, 4.5766],
[19.4084, 4.7315],
[20.0428, 4.9067]],
[12.0, 8.0]]),
('regression: predator crash',
(5, 30, 0.4, 0.2, 0.01, 0.9, 1.0, 3),
[[[5.0, 30.0], [0.0, 4.5], [0.0, 0.45], [0.0, 0.045]], [90.0, 2.0]])],
[('regression: hare and lynx',
(40, 9, 0.1, 0.02, 0.01, 0.1, 0.5, 6),
[[[40.0, 9.0],
[38.4, 10.35],
[36.3456, 11.8197],
[33.8669, 13.3767],
[31.03, 14.973],
[27.9354, 16.5474],
[24.7096, 18.0313]],
[10.0, 5.0]]),
('regression: large step overshoot',
(10, 50, 0.5, 0.1, 0.02, 0.4, 1.0, 4),
[[[10.0, 50.0], [0.0, 40.0], [0.0, 24.0], [0.0, 14.4], [0.0, 8.64]], [20.0, 5.0]]),
('control: predators absent',
(20, 0, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]]),
('regression: prey absent',
(0, 10, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[0.0, 10.0], [0.0, 9.0], [0.0, 8.1], [0.0, 7.29], [0.0, 6.561]], [10.0, 6.0]]),
('regression: no interaction',
(30, 5, 0.2, 0.0, 0.0, 0.1, 1.0, 3),
[[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None]),
('regression: fine steps',
(15, 4, 0.8, 0.1, 0.05, 0.6, 0.1, 8),
[[[15.0, 4.0],
[15.6, 4.06],
[16.2146, 4.1331],
[16.8416, 4.2202],
[17.4782, 4.3223],
[18.121, 4.4407],
[18.766, 4.5766],
[19.4084, 4.7315],
[20.0428, 4.9067]],
[12.0, 8.0]]),
('regression: predator crash',
(5, 30, 0.4, 0.2, 0.01, 0.9, 1.0, 3),
[[[5.0, 30.0], [0.0, 4.5], [0.0, 0.45], [0.0, 0.045]], [90.0, 2.0]])],
[('regression: large step overshoot',
(10, 50, 0.5, 0.1, 0.02, 0.4, 1.0, 4),
[[[10.0, 50.0], [0.0, 40.0], [0.0, 24.0], [0.0, 14.4], [0.0, 8.64]], [20.0, 5.0]]),
('control: predators absent',
(20, 0, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]]),
('regression: prey absent',
(0, 10, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[0.0, 10.0], [0.0, 9.0], [0.0, 8.1], [0.0, 7.29], [0.0, 6.561]], [10.0, 6.0]]),
('regression: no interaction',
(30, 5, 0.2, 0.0, 0.0, 0.1, 1.0, 3),
[[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None]),
('regression: at equilibrium',
(10, 5, 0.5, 0.1, 0.02, 0.2, 0.25, 4),
[[[10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0]], [10.0, 5.0]]),
('regression: fine steps',
(15, 4, 0.8, 0.1, 0.05, 0.6, 0.1, 8),
[[[15.0, 4.0],
[15.6, 4.06],
[16.2146, 4.1331],
[16.8416, 4.2202],
[17.4782, 4.3223],
[18.121, 4.4407],
[18.766, 4.5766],
[19.4084, 4.7315],
[20.0428, 4.9067]],
[12.0, 8.0]]),
('regression: predator crash',
(5, 30, 0.4, 0.2, 0.01, 0.9, 1.0, 3),
[[[5.0, 30.0], [0.0, 4.5], [0.0, 0.45], [0.0, 0.045]], [90.0, 2.0]])],
[('regression: hare and lynx',
(40, 9, 0.1, 0.02, 0.01, 0.1, 0.5, 6),
[[[40.0, 9.0],
[38.4, 10.35],
[36.3456, 11.8197],
[33.8669, 13.3767],
[31.03, 14.973],
[27.9354, 16.5474],
[24.7096, 18.0313]],
[10.0, 5.0]]),
('regression: large step overshoot',
(10, 50, 0.5, 0.1, 0.02, 0.4, 1.0, 4),
[[[10.0, 50.0], [0.0, 40.0], [0.0, 24.0], [0.0, 14.4], [0.0, 8.64]], [20.0, 5.0]]),
('control: predators absent',
(20, 0, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]]),
('regression: no interaction',
(30, 5, 0.2, 0.0, 0.0, 0.1, 1.0, 3),
[[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None]),
('regression: at equilibrium',
(10, 5, 0.5, 0.1, 0.02, 0.2, 0.25, 4),
[[[10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0]], [10.0, 5.0]]),
('regression: fine steps',
(15, 4, 0.8, 0.1, 0.05, 0.6, 0.1, 8),
[[[15.0, 4.0],
[15.6, 4.06],
[16.2146, 4.1331],
[16.8416, 4.2202],
[17.4782, 4.3223],
[18.121, 4.4407],
[18.766, 4.5766],
[19.4084, 4.7315],
[20.0428, 4.9067]],
[12.0, 8.0]]),
('regression: predator crash',
(5, 30, 0.4, 0.2, 0.01, 0.9, 1.0, 3),
[[[5.0, 30.0], [0.0, 4.5], [0.0, 0.45], [0.0, 0.045]], [90.0, 2.0]])]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: hare and lynx | [[[40.0, 9.0], [38.4, 10.75], [36.192, 12.764], [33.3821, 15.0238], [30.0359, 17.4814], [26.287, 20.0567], [22.329, 22.6429]], [10.0, 5.0]] | [[[40.0, 9.0], [38.4, 10.35], [36.3456, 11.8197], [33.8669, 13.3767], [31.03, 14.973], [27.9354, 16.5474], [24.7096, 18.0313]], [10.0, 5.0]] | Failed |
| regression: large step overshoot | [[[10.0, 50.0], [0.0, 59.6], [0.0, 59.2], [0.0, 58.8], [0.0, 58.4]], [20.0, 5.0]] | [[[10.0, 50.0], [0.0, 40.0], [0.0, 24.0], [0.0, 14.4], [0.0, 8.64]], [20.0, 5.0]] | Failed |
| control: predators absent | [[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]] | [[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]] | Passed |
| regression: prey absent | [[[0.0, 10.0], [0.0, 9.9], [0.0, 9.8], [0.0, 9.7], [0.0, 9.6]], [10.0, 6.0]] | [[[0.0, 10.0], [0.0, 9.0], [0.0, 8.1], [0.0, 7.29], [0.0, 6.561]], [10.0, 6.0]] | Failed |
| regression: no interaction | [[[30.0, 5.0], [36.0, 4.9], [43.2, 4.8], [51.84, 4.7]], None] | [[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None] | Failed |
| regression: at equilibrium | [[[10.0, 5.0], [10.0, 5.2], [9.95, 5.41], [9.848, 5.6291], [9.6931, 5.8563]], [10.0, 5.0]] | [[[10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0]], [10.0, 5.0]] | Failed |
| regression: fine steps | [[[15.0, 4.0], [15.6, 4.24], [16.1866, 4.5107], [16.7514, 4.8158], [17.2848, 5.1591], [17.7758, 5.545], [18.2122, 5.9778], [18.5805, 6.4622], [18.8662, 7.0025]], [12.0, 8.0]] | [[[15.0, 4.0], [15.6, 4.06], [16.2146, 4.1331], [16.8416, 4.2202], [17.4782, 4.3223], [18.121, 4.4407], [18.766, 4.5766], [19.4084, 4.7315], [20.0428, 4.9067]], [12.0, 8.0]] | Failed |
SHA-256 / 453b45bcfbc1b20d35ca4eeb9e5f2d58309a2d5034eb8c987146da1e323e2731
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(prey0, pred0, alpha, beta, delta, gamma, dt, steps):
x, y = float(prey0), float(pred0)
path = [[round(x, 4), round(y, 4)]]
for _ in range(steps):
dx = alpha * x - beta * x * y
dy = delta * x * y - gamma * x
x = max(x + dx * dt, 0.0)
y = max(y + dy * dt, 0.0)
path.append([round(x, 4), round(y, 4)])
eq = [round(gamma / delta, 4), round(alpha / beta, 4)] if beta > 0 and delta > 0 else None
return [path, eq]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: hare and lynx',
(40, 9, 0.1, 0.02, 0.01, 0.1, 0.5, 6),
[[[40.0, 9.0],
[38.4, 10.35],
[36.3456, 11.8197],
[33.8669, 13.3767],
[31.03, 14.973],
[27.9354, 16.5474],
[24.7096, 18.0313]],
[10.0, 5.0]]),
('regression: large step overshoot',
(10, 50, 0.5, 0.1, 0.02, 0.4, 1.0, 4),
[[[10.0, 50.0], [0.0, 40.0], [0.0, 24.0], [0.0, 14.4], [0.0, 8.64]], [20.0, 5.0]]),
('control: predators absent',
(20, 0, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]]),
('regression: prey absent',
(0, 10, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[0.0, 10.0], [0.0, 9.0], [0.0, 8.1], [0.0, 7.29], [0.0, 6.561]], [10.0, 6.0]]),
('regression: no interaction',
(30, 5, 0.2, 0.0, 0.0, 0.1, 1.0, 3),
[[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None]),
('regression: at equilibrium',
(10, 5, 0.5, 0.1, 0.02, 0.2, 0.25, 4),
[[[10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0]], [10.0, 5.0]]),
('regression: fine steps',
(15, 4, 0.8, 0.1, 0.05, 0.6, 0.1, 8),
[[[15.0, 4.0],
[15.6, 4.06],
[16.2146, 4.1331],
[16.8416, 4.2202],
[17.4782, 4.3223],
[18.121, 4.4407],
[18.766, 4.5766],
[19.4084, 4.7315],
[20.0428, 4.9067]],
[12.0, 8.0]])],
[('regression: hare and lynx',
(40, 9, 0.1, 0.02, 0.01, 0.1, 0.5, 6),
[[[40.0, 9.0],
[38.4, 10.35],
[36.3456, 11.8197],
[33.8669, 13.3767],
[31.03, 14.973],
[27.9354, 16.5474],
[24.7096, 18.0313]],
[10.0, 5.0]]),
('control: predators absent',
(20, 0, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]]),
('regression: prey absent',
(0, 10, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[0.0, 10.0], [0.0, 9.0], [0.0, 8.1], [0.0, 7.29], [0.0, 6.561]], [10.0, 6.0]]),
('regression: no interaction',
(30, 5, 0.2, 0.0, 0.0, 0.1, 1.0, 3),
[[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None]),
('regression: at equilibrium',
(10, 5, 0.5, 0.1, 0.02, 0.2, 0.25, 4),
[[[10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0]], [10.0, 5.0]]),
('regression: fine steps',
(15, 4, 0.8, 0.1, 0.05, 0.6, 0.1, 8),
[[[15.0, 4.0],
[15.6, 4.06],
[16.2146, 4.1331],
[16.8416, 4.2202],
[17.4782, 4.3223],
[18.121, 4.4407],
[18.766, 4.5766],
[19.4084, 4.7315],
[20.0428, 4.9067]],
[12.0, 8.0]]),
('regression: predator crash',
(5, 30, 0.4, 0.2, 0.01, 0.9, 1.0, 3),
[[[5.0, 30.0], [0.0, 4.5], [0.0, 0.45], [0.0, 0.045]], [90.0, 2.0]])],
[('regression: hare and lynx',
(40, 9, 0.1, 0.02, 0.01, 0.1, 0.5, 6),
[[[40.0, 9.0],
[38.4, 10.35],
[36.3456, 11.8197],
[33.8669, 13.3767],
[31.03, 14.973],
[27.9354, 16.5474],
[24.7096, 18.0313]],
[10.0, 5.0]]),
('regression: large step overshoot',
(10, 50, 0.5, 0.1, 0.02, 0.4, 1.0, 4),
[[[10.0, 50.0], [0.0, 40.0], [0.0, 24.0], [0.0, 14.4], [0.0, 8.64]], [20.0, 5.0]]),
('control: predators absent',
(20, 0, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]]),
('regression: prey absent',
(0, 10, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[0.0, 10.0], [0.0, 9.0], [0.0, 8.1], [0.0, 7.29], [0.0, 6.561]], [10.0, 6.0]]),
('regression: no interaction',
(30, 5, 0.2, 0.0, 0.0, 0.1, 1.0, 3),
[[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None]),
('regression: fine steps',
(15, 4, 0.8, 0.1, 0.05, 0.6, 0.1, 8),
[[[15.0, 4.0],
[15.6, 4.06],
[16.2146, 4.1331],
[16.8416, 4.2202],
[17.4782, 4.3223],
[18.121, 4.4407],
[18.766, 4.5766],
[19.4084, 4.7315],
[20.0428, 4.9067]],
[12.0, 8.0]]),
('regression: predator crash',
(5, 30, 0.4, 0.2, 0.01, 0.9, 1.0, 3),
[[[5.0, 30.0], [0.0, 4.5], [0.0, 0.45], [0.0, 0.045]], [90.0, 2.0]])],
[('regression: large step overshoot',
(10, 50, 0.5, 0.1, 0.02, 0.4, 1.0, 4),
[[[10.0, 50.0], [0.0, 40.0], [0.0, 24.0], [0.0, 14.4], [0.0, 8.64]], [20.0, 5.0]]),
('control: predators absent',
(20, 0, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]]),
('regression: prey absent',
(0, 10, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[0.0, 10.0], [0.0, 9.0], [0.0, 8.1], [0.0, 7.29], [0.0, 6.561]], [10.0, 6.0]]),
('regression: no interaction',
(30, 5, 0.2, 0.0, 0.0, 0.1, 1.0, 3),
[[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None]),
('regression: at equilibrium',
(10, 5, 0.5, 0.1, 0.02, 0.2, 0.25, 4),
[[[10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0]], [10.0, 5.0]]),
('regression: fine steps',
(15, 4, 0.8, 0.1, 0.05, 0.6, 0.1, 8),
[[[15.0, 4.0],
[15.6, 4.06],
[16.2146, 4.1331],
[16.8416, 4.2202],
[17.4782, 4.3223],
[18.121, 4.4407],
[18.766, 4.5766],
[19.4084, 4.7315],
[20.0428, 4.9067]],
[12.0, 8.0]]),
('regression: predator crash',
(5, 30, 0.4, 0.2, 0.01, 0.9, 1.0, 3),
[[[5.0, 30.0], [0.0, 4.5], [0.0, 0.45], [0.0, 0.045]], [90.0, 2.0]])],
[('regression: hare and lynx',
(40, 9, 0.1, 0.02, 0.01, 0.1, 0.5, 6),
[[[40.0, 9.0],
[38.4, 10.35],
[36.3456, 11.8197],
[33.8669, 13.3767],
[31.03, 14.973],
[27.9354, 16.5474],
[24.7096, 18.0313]],
[10.0, 5.0]]),
('regression: large step overshoot',
(10, 50, 0.5, 0.1, 0.02, 0.4, 1.0, 4),
[[[10.0, 50.0], [0.0, 40.0], [0.0, 24.0], [0.0, 14.4], [0.0, 8.64]], [20.0, 5.0]]),
('control: predators absent',
(20, 0, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]]),
('regression: no interaction',
(30, 5, 0.2, 0.0, 0.0, 0.1, 1.0, 3),
[[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None]),
('regression: at equilibrium',
(10, 5, 0.5, 0.1, 0.02, 0.2, 0.25, 4),
[[[10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0]], [10.0, 5.0]]),
('regression: fine steps',
(15, 4, 0.8, 0.1, 0.05, 0.6, 0.1, 8),
[[[15.0, 4.0],
[15.6, 4.06],
[16.2146, 4.1331],
[16.8416, 4.2202],
[17.4782, 4.3223],
[18.121, 4.4407],
[18.766, 4.5766],
[19.4084, 4.7315],
[20.0428, 4.9067]],
[12.0, 8.0]]),
('regression: predator crash',
(5, 30, 0.4, 0.2, 0.01, 0.9, 1.0, 3),
[[[5.0, 30.0], [0.0, 4.5], [0.0, 0.45], [0.0, 0.045]], [90.0, 2.0]])]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: hare and lynx | [[[40.0, 9.0], [38.4, 8.8], [36.9408, 8.5696], [35.6222, 8.3054], [34.4447, 8.0036], [33.4101, 7.6597], [32.5215, 7.2688]], [10.0, 5.0]] | [[[40.0, 9.0], [38.4, 10.35], [36.3456, 11.8197], [33.8669, 13.3767], [31.03, 14.973], [27.9354, 16.5474], [24.7096, 18.0313]], [10.0, 5.0]] | Failed |
| regression: large step overshoot | [[[10.0, 50.0], [0.0, 56.0], [0.0, 56.0], [0.0, 56.0], [0.0, 56.0]], [20.0, 5.0]] | [[[10.0, 50.0], [0.0, 40.0], [0.0, 24.0], [0.0, 14.4], [0.0, 8.64]], [20.0, 5.0]] | Failed |
| control: predators absent | [[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]] | [[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]] | Passed |
| regression: prey absent | [[[0.0, 10.0], [0.0, 10.0], [0.0, 10.0], [0.0, 10.0], [0.0, 10.0]], [10.0, 6.0]] | [[[0.0, 10.0], [0.0, 9.0], [0.0, 8.1], [0.0, 7.29], [0.0, 6.561]], [10.0, 6.0]] | Failed |
| regression: no interaction | [[[30.0, 5.0], [36.0, 2.0], [43.2, 0.0], [51.84, 0.0]], None] | [[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None] | Failed |
| regression: at equilibrium | [[[10.0, 5.0], [10.0, 4.75], [10.0625, 4.4875], [10.1914, 4.2102], [10.3927, 3.9151]], [10.0, 5.0]] | [[[10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0]], [10.0, 5.0]] | Failed |
| regression: fine steps | [[[15.0, 4.0], [15.6, 3.4], [16.3176, 2.7292], [17.1777, 1.9728], [18.213, 1.1116], [19.4676, 0.12], [21.0016, 0.0], [22.6817, 0.0], [24.4963, 0.0]], [12.0, 8.0]] | [[[15.0, 4.0], [15.6, 4.06], [16.2146, 4.1331], [16.8416, 4.2202], [17.4782, 4.3223], [18.121, 4.4407], [18.766, 4.5766], [19.4084, 4.7315], [20.0428, 4.9067]], [12.0, 8.0]] | Failed |
SHA-256 / 7f98fa7ea3e26ceaf30e055affc0bb277e7688bd3f288f12a83c43f9eb6e8a1c
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(prey0, pred0, alpha, beta, delta, gamma, dt, steps):
x, y = float(prey0), float(pred0)
path = [[round(x, 4), round(y, 4)]]
for _ in range(steps):
dx = alpha * x - beta * x * y
dy = delta * x * y - gamma * y
x = max(x + dx * dt, 0.0)
y = max(y + dy * dt, 0.0)
path.append([round(x, 4), round(y, 4)])
eq = [round(gamma / delta, 4), round(alpha / beta, 4)] if beta > 0 and delta > 0 else None
return [path, eq]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: hare and lynx',
(40, 9, 0.1, 0.02, 0.01, 0.1, 0.5, 6),
[[[40.0, 9.0],
[38.4, 10.35],
[36.3456, 11.8197],
[33.8669, 13.3767],
[31.03, 14.973],
[27.9354, 16.5474],
[24.7096, 18.0313]],
[10.0, 5.0]]),
('regression: large step overshoot',
(10, 50, 0.5, 0.1, 0.02, 0.4, 1.0, 4),
[[[10.0, 50.0], [0.0, 40.0], [0.0, 24.0], [0.0, 14.4], [0.0, 8.64]], [20.0, 5.0]]),
('control: predators absent',
(20, 0, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]]),
('regression: prey absent',
(0, 10, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[0.0, 10.0], [0.0, 9.0], [0.0, 8.1], [0.0, 7.29], [0.0, 6.561]], [10.0, 6.0]]),
('regression: no interaction',
(30, 5, 0.2, 0.0, 0.0, 0.1, 1.0, 3),
[[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None]),
('regression: at equilibrium',
(10, 5, 0.5, 0.1, 0.02, 0.2, 0.25, 4),
[[[10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0]], [10.0, 5.0]]),
('regression: fine steps',
(15, 4, 0.8, 0.1, 0.05, 0.6, 0.1, 8),
[[[15.0, 4.0],
[15.6, 4.06],
[16.2146, 4.1331],
[16.8416, 4.2202],
[17.4782, 4.3223],
[18.121, 4.4407],
[18.766, 4.5766],
[19.4084, 4.7315],
[20.0428, 4.9067]],
[12.0, 8.0]])],
[('regression: hare and lynx',
(40, 9, 0.1, 0.02, 0.01, 0.1, 0.5, 6),
[[[40.0, 9.0],
[38.4, 10.35],
[36.3456, 11.8197],
[33.8669, 13.3767],
[31.03, 14.973],
[27.9354, 16.5474],
[24.7096, 18.0313]],
[10.0, 5.0]]),
('control: predators absent',
(20, 0, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]]),
('regression: prey absent',
(0, 10, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[0.0, 10.0], [0.0, 9.0], [0.0, 8.1], [0.0, 7.29], [0.0, 6.561]], [10.0, 6.0]]),
('regression: no interaction',
(30, 5, 0.2, 0.0, 0.0, 0.1, 1.0, 3),
[[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None]),
('regression: at equilibrium',
(10, 5, 0.5, 0.1, 0.02, 0.2, 0.25, 4),
[[[10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0]], [10.0, 5.0]]),
('regression: fine steps',
(15, 4, 0.8, 0.1, 0.05, 0.6, 0.1, 8),
[[[15.0, 4.0],
[15.6, 4.06],
[16.2146, 4.1331],
[16.8416, 4.2202],
[17.4782, 4.3223],
[18.121, 4.4407],
[18.766, 4.5766],
[19.4084, 4.7315],
[20.0428, 4.9067]],
[12.0, 8.0]]),
('regression: predator crash',
(5, 30, 0.4, 0.2, 0.01, 0.9, 1.0, 3),
[[[5.0, 30.0], [0.0, 4.5], [0.0, 0.45], [0.0, 0.045]], [90.0, 2.0]])],
[('regression: hare and lynx',
(40, 9, 0.1, 0.02, 0.01, 0.1, 0.5, 6),
[[[40.0, 9.0],
[38.4, 10.35],
[36.3456, 11.8197],
[33.8669, 13.3767],
[31.03, 14.973],
[27.9354, 16.5474],
[24.7096, 18.0313]],
[10.0, 5.0]]),
('regression: large step overshoot',
(10, 50, 0.5, 0.1, 0.02, 0.4, 1.0, 4),
[[[10.0, 50.0], [0.0, 40.0], [0.0, 24.0], [0.0, 14.4], [0.0, 8.64]], [20.0, 5.0]]),
('control: predators absent',
(20, 0, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]]),
('regression: prey absent',
(0, 10, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[0.0, 10.0], [0.0, 9.0], [0.0, 8.1], [0.0, 7.29], [0.0, 6.561]], [10.0, 6.0]]),
('regression: no interaction',
(30, 5, 0.2, 0.0, 0.0, 0.1, 1.0, 3),
[[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None]),
('regression: fine steps',
(15, 4, 0.8, 0.1, 0.05, 0.6, 0.1, 8),
[[[15.0, 4.0],
[15.6, 4.06],
[16.2146, 4.1331],
[16.8416, 4.2202],
[17.4782, 4.3223],
[18.121, 4.4407],
[18.766, 4.5766],
[19.4084, 4.7315],
[20.0428, 4.9067]],
[12.0, 8.0]]),
('regression: predator crash',
(5, 30, 0.4, 0.2, 0.01, 0.9, 1.0, 3),
[[[5.0, 30.0], [0.0, 4.5], [0.0, 0.45], [0.0, 0.045]], [90.0, 2.0]])],
[('regression: large step overshoot',
(10, 50, 0.5, 0.1, 0.02, 0.4, 1.0, 4),
[[[10.0, 50.0], [0.0, 40.0], [0.0, 24.0], [0.0, 14.4], [0.0, 8.64]], [20.0, 5.0]]),
('control: predators absent',
(20, 0, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]]),
('regression: prey absent',
(0, 10, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[0.0, 10.0], [0.0, 9.0], [0.0, 8.1], [0.0, 7.29], [0.0, 6.561]], [10.0, 6.0]]),
('regression: no interaction',
(30, 5, 0.2, 0.0, 0.0, 0.1, 1.0, 3),
[[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None]),
('regression: at equilibrium',
(10, 5, 0.5, 0.1, 0.02, 0.2, 0.25, 4),
[[[10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0]], [10.0, 5.0]]),
('regression: fine steps',
(15, 4, 0.8, 0.1, 0.05, 0.6, 0.1, 8),
[[[15.0, 4.0],
[15.6, 4.06],
[16.2146, 4.1331],
[16.8416, 4.2202],
[17.4782, 4.3223],
[18.121, 4.4407],
[18.766, 4.5766],
[19.4084, 4.7315],
[20.0428, 4.9067]],
[12.0, 8.0]]),
('regression: predator crash',
(5, 30, 0.4, 0.2, 0.01, 0.9, 1.0, 3),
[[[5.0, 30.0], [0.0, 4.5], [0.0, 0.45], [0.0, 0.045]], [90.0, 2.0]])],
[('regression: hare and lynx',
(40, 9, 0.1, 0.02, 0.01, 0.1, 0.5, 6),
[[[40.0, 9.0],
[38.4, 10.35],
[36.3456, 11.8197],
[33.8669, 13.3767],
[31.03, 14.973],
[27.9354, 16.5474],
[24.7096, 18.0313]],
[10.0, 5.0]]),
('regression: large step overshoot',
(10, 50, 0.5, 0.1, 0.02, 0.4, 1.0, 4),
[[[10.0, 50.0], [0.0, 40.0], [0.0, 24.0], [0.0, 14.4], [0.0, 8.64]], [20.0, 5.0]]),
('control: predators absent',
(20, 0, 0.3, 0.05, 0.02, 0.2, 0.5, 4),
[[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]]),
('regression: no interaction',
(30, 5, 0.2, 0.0, 0.0, 0.1, 1.0, 3),
[[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None]),
('regression: at equilibrium',
(10, 5, 0.5, 0.1, 0.02, 0.2, 0.25, 4),
[[[10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0]], [10.0, 5.0]]),
('regression: fine steps',
(15, 4, 0.8, 0.1, 0.05, 0.6, 0.1, 8),
[[[15.0, 4.0],
[15.6, 4.06],
[16.2146, 4.1331],
[16.8416, 4.2202],
[17.4782, 4.3223],
[18.121, 4.4407],
[18.766, 4.5766],
[19.4084, 4.7315],
[20.0428, 4.9067]],
[12.0, 8.0]]),
('regression: predator crash',
(5, 30, 0.4, 0.2, 0.01, 0.9, 1.0, 3),
[[[5.0, 30.0], [0.0, 4.5], [0.0, 0.45], [0.0, 0.045]], [90.0, 2.0]])]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: hare and lynx | [[[40.0, 9.0], [38.4, 10.35], [36.3456, 11.8197], [33.8669, 13.3767], [31.03, 14.973], [27.9354, 16.5474], [24.7096, 18.0313]], [10.0, 5.0]] | [[[40.0, 9.0], [38.4, 10.35], [36.3456, 11.8197], [33.8669, 13.3767], [31.03, 14.973], [27.9354, 16.5474], [24.7096, 18.0313]], [10.0, 5.0]] | Passed |
| regression: large step overshoot | [[[10.0, 50.0], [0.0, 40.0], [0.0, 24.0], [0.0, 14.4], [0.0, 8.64]], [20.0, 5.0]] | [[[10.0, 50.0], [0.0, 40.0], [0.0, 24.0], [0.0, 14.4], [0.0, 8.64]], [20.0, 5.0]] | Passed |
| control: predators absent | [[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]] | [[[20.0, 0.0], [23.0, 0.0], [26.45, 0.0], [30.4175, 0.0], [34.9801, 0.0]], [10.0, 6.0]] | Passed |
| regression: prey absent | [[[0.0, 10.0], [0.0, 9.0], [0.0, 8.1], [0.0, 7.29], [0.0, 6.561]], [10.0, 6.0]] | [[[0.0, 10.0], [0.0, 9.0], [0.0, 8.1], [0.0, 7.29], [0.0, 6.561]], [10.0, 6.0]] | Passed |
| regression: no interaction | [[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None] | [[[30.0, 5.0], [36.0, 4.5], [43.2, 4.05], [51.84, 3.645]], None] | Passed |
| regression: at equilibrium | [[[10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0]], [10.0, 5.0]] | [[[10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0], [10.0, 5.0]], [10.0, 5.0]] | Passed |
| regression: fine steps | [[[15.0, 4.0], [15.6, 4.06], [16.2146, 4.1331], [16.8416, 4.2202], [17.4782, 4.3223], [18.121, 4.4407], [18.766, 4.5766], [19.4084, 4.7315], [20.0428, 4.9067]], [12.0, 8.0]] | [[[15.0, 4.0], [15.6, 4.06], [16.2146, 4.1331], [16.8416, 4.2202], [17.4782, 4.3223], [18.121, 4.4407], [18.766, 4.5766], [19.4084, 4.7315], [20.0428, 4.9067]], [12.0, 8.0]] | Passed |
SHA-256 / a14a6c3b84ebf1a1ca4069bda99c6ce519b5e1d5bed4d411b9f4c56c7e73c001
Verification & scope
Deterministic bounded teaching model with a stipulated contract; not a validated scientific or public-health modelling library. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:47:33.867005+00:00.
Case digest / 3149b8695af5cf527abe1a413334191176fab23cda6b320f4b5633b35655b54e