FAILURE MAP
← Case archive

FA-65761 / Ecological population dynamics / Open access

MacArthur-Wilson island equilibrium: equilibrium richness · case 01

Predicted richness can exceed the mainland pool.

Verified by executionVariant 1 · 7 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The equilibrium omits I0 from the denominator.

VERIFIED REPAIR

Restore the equilibrium richness rule: `s_eq = i0 * pool / (i0 + e0)`.

Unsuccessful approach: Using E0 in the numerator predicts richness falling with immigration.

Case contract

I0 = imax*exp(-distance/d0); E0 = emax*a0/area; S* = I0*P/(I0+E0); turnover = I0*E0/(I0+E0); return [S*, turnover, I0, E0] rounded 4; None for non-positive parameters or negative distance.

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(pool, imax, emax, distance, d0, area, a0):
    if min(pool, imax, emax, d0, a0, area) <= 0 or distance < 0:
        return None
    i0 = imax * math.exp(-distance / d0)
    e0 = emax * a0 / area
    s_eq = i0 * pool / e0
    turnover = i0 * e0 / (i0 + e0)
    return [round(s_eq, 4), round(turnover, 4), round(i0, 4), round(e0, 4)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: near large island', (200, 5.0, 2.0, 10, 50, 100, 10), [190.6839, 0.1907, 4.0937, 0.2]),
  ('regression: remote small island', (200, 5.0, 2.0, 300, 50, 2, 10), [0.2476, 0.0124, 0.0124, 10.0]),
  ('regression: mainland adjacent', (120, 3.0, 1.0, 0, 40, 10, 10), [90.0, 0.75, 3.0, 1.0]),
  ('regression: reference area', (80, 2.0, 2.0, 40, 40, 10, 10), [21.5153, 0.5379, 0.7358, 2.0]),
  ('control: invalid area', (80, 2.0, 2.0, 40, 40, 0, 10), None),
  ('control: negative distance', (80, 2.0, 2.0, -5, 40, 10, 10), None),
  ('regression: archipelago mid', (150, 4.0, 3.0, 60, 30, 25, 5), [71.1454, 0.2846, 0.5413, 0.6])],
 [('regression: near large island', (200, 5.0, 2.0, 10, 50, 100, 10), [190.6839, 0.1907, 4.0937, 0.2]),
  ('regression: remote small island', (200, 5.0, 2.0, 300, 50, 2, 10), [0.2476, 0.0124, 0.0124, 10.0]),
  ('regression: mainland adjacent', (120, 3.0, 1.0, 0, 40, 10, 10), [90.0, 0.75, 3.0, 1.0]),
  ('regression: reference area', (80, 2.0, 2.0, 40, 40, 10, 10), [21.5153, 0.5379, 0.7358, 2.0]),
  ('control: invalid area', (80, 2.0, 2.0, 40, 40, 0, 10), None),
  ('control: negative distance', (80, 2.0, 2.0, -5, 40, 10, 10), None),
  ('regression: archipelago mid', (150, 4.0, 3.0, 60, 30, 25, 5), [71.1454, 0.2846, 0.5413, 0.6])],
 [('regression: near large island', (200, 5.0, 2.0, 10, 50, 100, 10), [190.6839, 0.1907, 4.0937, 0.2]),
  ('regression: remote small island', (200, 5.0, 2.0, 300, 50, 2, 10), [0.2476, 0.0124, 0.0124, 10.0]),
  ('regression: mainland adjacent', (120, 3.0, 1.0, 0, 40, 10, 10), [90.0, 0.75, 3.0, 1.0]),
  ('regression: reference area', (80, 2.0, 2.0, 40, 40, 10, 10), [21.5153, 0.5379, 0.7358, 2.0]),
  ('control: invalid area', (80, 2.0, 2.0, 40, 40, 0, 10), None),
  ('control: negative distance', (80, 2.0, 2.0, -5, 40, 10, 10), None),
  ('regression: archipelago mid', (150, 4.0, 3.0, 60, 30, 25, 5), [71.1454, 0.2846, 0.5413, 0.6])],
 [('regression: near large island', (200, 5.0, 2.0, 10, 50, 100, 10), [190.6839, 0.1907, 4.0937, 0.2]),
  ('regression: remote small island', (200, 5.0, 2.0, 300, 50, 2, 10), [0.2476, 0.0124, 0.0124, 10.0]),
  ('regression: mainland adjacent', (120, 3.0, 1.0, 0, 40, 10, 10), [90.0, 0.75, 3.0, 1.0]),
  ('regression: reference area', (80, 2.0, 2.0, 40, 40, 10, 10), [21.5153, 0.5379, 0.7358, 2.0]),
  ('control: invalid area', (80, 2.0, 2.0, 40, 40, 0, 10), None),
  ('control: negative distance', (80, 2.0, 2.0, -5, 40, 10, 10), None),
  ('regression: archipelago mid', (150, 4.0, 3.0, 60, 30, 25, 5), [71.1454, 0.2846, 0.5413, 0.6])],
 [('regression: near large island', (200, 5.0, 2.0, 10, 50, 100, 10), [190.6839, 0.1907, 4.0937, 0.2]),
  ('regression: remote small island', (200, 5.0, 2.0, 300, 50, 2, 10), [0.2476, 0.0124, 0.0124, 10.0]),
  ('regression: mainland adjacent', (120, 3.0, 1.0, 0, 40, 10, 10), [90.0, 0.75, 3.0, 1.0]),
  ('regression: reference area', (80, 2.0, 2.0, 40, 40, 10, 10), [21.5153, 0.5379, 0.7358, 2.0]),
  ('control: invalid area', (80, 2.0, 2.0, 40, 40, 0, 10), None),
  ('control: negative distance', (80, 2.0, 2.0, -5, 40, 10, 10), None),
  ('regression: archipelago mid', (150, 4.0, 3.0, 60, 30, 25, 5), [71.1454, 0.2846, 0.5413, 0.6])]]
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 fixtureActualExpectedOutcome
regression: near large island[4093.6538, 0.1907, 4.0937, 0.2][190.6839, 0.1907, 4.0937, 0.2]Failed
regression: remote small island[0.2479, 0.0124, 0.0124, 10.0][0.2476, 0.0124, 0.0124, 10.0]Failed
regression: mainland adjacent[360.0, 0.75, 3.0, 1.0][90.0, 0.75, 3.0, 1.0]Failed
regression: reference area[29.4304, 0.5379, 0.7358, 2.0][21.5153, 0.5379, 0.7358, 2.0]Failed
control: invalid areaNoneNonePassed
control: negative distanceNoneNonePassed
regression: archipelago mid[135.3353, 0.2846, 0.5413, 0.6][71.1454, 0.2846, 0.5413, 0.6]Failed

SHA-256 / defda69167dcc6e358bf589eb244620fcd4caf09a5ce8c316df1cfbc52e5c4f5

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(pool, imax, emax, distance, d0, area, a0):
    if min(pool, imax, emax, d0, a0, area) <= 0 or distance < 0:
        return None
    i0 = imax * math.exp(-distance / d0)
    e0 = emax * a0 / area
    s_eq = pool * e0 / (i0 + e0)
    turnover = i0 * e0 / (i0 + e0)
    return [round(s_eq, 4), round(turnover, 4), round(i0, 4), round(e0, 4)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: near large island', (200, 5.0, 2.0, 10, 50, 100, 10), [190.6839, 0.1907, 4.0937, 0.2]),
  ('regression: remote small island', (200, 5.0, 2.0, 300, 50, 2, 10), [0.2476, 0.0124, 0.0124, 10.0]),
  ('regression: mainland adjacent', (120, 3.0, 1.0, 0, 40, 10, 10), [90.0, 0.75, 3.0, 1.0]),
  ('regression: reference area', (80, 2.0, 2.0, 40, 40, 10, 10), [21.5153, 0.5379, 0.7358, 2.0]),
  ('control: invalid area', (80, 2.0, 2.0, 40, 40, 0, 10), None),
  ('control: negative distance', (80, 2.0, 2.0, -5, 40, 10, 10), None),
  ('regression: archipelago mid', (150, 4.0, 3.0, 60, 30, 25, 5), [71.1454, 0.2846, 0.5413, 0.6])],
 [('regression: near large island', (200, 5.0, 2.0, 10, 50, 100, 10), [190.6839, 0.1907, 4.0937, 0.2]),
  ('regression: remote small island', (200, 5.0, 2.0, 300, 50, 2, 10), [0.2476, 0.0124, 0.0124, 10.0]),
  ('regression: mainland adjacent', (120, 3.0, 1.0, 0, 40, 10, 10), [90.0, 0.75, 3.0, 1.0]),
  ('regression: reference area', (80, 2.0, 2.0, 40, 40, 10, 10), [21.5153, 0.5379, 0.7358, 2.0]),
  ('control: invalid area', (80, 2.0, 2.0, 40, 40, 0, 10), None),
  ('control: negative distance', (80, 2.0, 2.0, -5, 40, 10, 10), None),
  ('regression: archipelago mid', (150, 4.0, 3.0, 60, 30, 25, 5), [71.1454, 0.2846, 0.5413, 0.6])],
 [('regression: near large island', (200, 5.0, 2.0, 10, 50, 100, 10), [190.6839, 0.1907, 4.0937, 0.2]),
  ('regression: remote small island', (200, 5.0, 2.0, 300, 50, 2, 10), [0.2476, 0.0124, 0.0124, 10.0]),
  ('regression: mainland adjacent', (120, 3.0, 1.0, 0, 40, 10, 10), [90.0, 0.75, 3.0, 1.0]),
  ('regression: reference area', (80, 2.0, 2.0, 40, 40, 10, 10), [21.5153, 0.5379, 0.7358, 2.0]),
  ('control: invalid area', (80, 2.0, 2.0, 40, 40, 0, 10), None),
  ('control: negative distance', (80, 2.0, 2.0, -5, 40, 10, 10), None),
  ('regression: archipelago mid', (150, 4.0, 3.0, 60, 30, 25, 5), [71.1454, 0.2846, 0.5413, 0.6])],
 [('regression: near large island', (200, 5.0, 2.0, 10, 50, 100, 10), [190.6839, 0.1907, 4.0937, 0.2]),
  ('regression: remote small island', (200, 5.0, 2.0, 300, 50, 2, 10), [0.2476, 0.0124, 0.0124, 10.0]),
  ('regression: mainland adjacent', (120, 3.0, 1.0, 0, 40, 10, 10), [90.0, 0.75, 3.0, 1.0]),
  ('regression: reference area', (80, 2.0, 2.0, 40, 40, 10, 10), [21.5153, 0.5379, 0.7358, 2.0]),
  ('control: invalid area', (80, 2.0, 2.0, 40, 40, 0, 10), None),
  ('control: negative distance', (80, 2.0, 2.0, -5, 40, 10, 10), None),
  ('regression: archipelago mid', (150, 4.0, 3.0, 60, 30, 25, 5), [71.1454, 0.2846, 0.5413, 0.6])],
 [('regression: near large island', (200, 5.0, 2.0, 10, 50, 100, 10), [190.6839, 0.1907, 4.0937, 0.2]),
  ('regression: remote small island', (200, 5.0, 2.0, 300, 50, 2, 10), [0.2476, 0.0124, 0.0124, 10.0]),
  ('regression: mainland adjacent', (120, 3.0, 1.0, 0, 40, 10, 10), [90.0, 0.75, 3.0, 1.0]),
  ('regression: reference area', (80, 2.0, 2.0, 40, 40, 10, 10), [21.5153, 0.5379, 0.7358, 2.0]),
  ('control: invalid area', (80, 2.0, 2.0, 40, 40, 0, 10), None),
  ('control: negative distance', (80, 2.0, 2.0, -5, 40, 10, 10), None),
  ('regression: archipelago mid', (150, 4.0, 3.0, 60, 30, 25, 5), [71.1454, 0.2846, 0.5413, 0.6])]]
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 fixtureActualExpectedOutcome
regression: near large island[9.3161, 0.1907, 4.0937, 0.2][190.6839, 0.1907, 4.0937, 0.2]Failed
regression: remote small island[199.7524, 0.0124, 0.0124, 10.0][0.2476, 0.0124, 0.0124, 10.0]Failed
regression: mainland adjacent[30.0, 0.75, 3.0, 1.0][90.0, 0.75, 3.0, 1.0]Failed
regression: reference area[58.4847, 0.5379, 0.7358, 2.0][21.5153, 0.5379, 0.7358, 2.0]Failed
control: invalid areaNoneNonePassed
control: negative distanceNoneNonePassed
regression: archipelago mid[78.8546, 0.2846, 0.5413, 0.6][71.1454, 0.2846, 0.5413, 0.6]Failed

SHA-256 / 5ff33e8e2017ce51f439eb70d634b09cad20bc3e67c0554e409ef83d87bfe4c2

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(pool, imax, emax, distance, d0, area, a0):
    if min(pool, imax, emax, d0, a0, area) <= 0 or distance < 0:
        return None
    i0 = imax * math.exp(-distance / d0)
    e0 = emax * a0 / area
    s_eq = i0 * pool / (i0 + e0)
    turnover = i0 * e0 / (i0 + e0)
    return [round(s_eq, 4), round(turnover, 4), round(i0, 4), round(e0, 4)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: near large island', (200, 5.0, 2.0, 10, 50, 100, 10), [190.6839, 0.1907, 4.0937, 0.2]),
  ('regression: remote small island', (200, 5.0, 2.0, 300, 50, 2, 10), [0.2476, 0.0124, 0.0124, 10.0]),
  ('regression: mainland adjacent', (120, 3.0, 1.0, 0, 40, 10, 10), [90.0, 0.75, 3.0, 1.0]),
  ('regression: reference area', (80, 2.0, 2.0, 40, 40, 10, 10), [21.5153, 0.5379, 0.7358, 2.0]),
  ('control: invalid area', (80, 2.0, 2.0, 40, 40, 0, 10), None),
  ('control: negative distance', (80, 2.0, 2.0, -5, 40, 10, 10), None),
  ('regression: archipelago mid', (150, 4.0, 3.0, 60, 30, 25, 5), [71.1454, 0.2846, 0.5413, 0.6])],
 [('regression: near large island', (200, 5.0, 2.0, 10, 50, 100, 10), [190.6839, 0.1907, 4.0937, 0.2]),
  ('regression: remote small island', (200, 5.0, 2.0, 300, 50, 2, 10), [0.2476, 0.0124, 0.0124, 10.0]),
  ('regression: mainland adjacent', (120, 3.0, 1.0, 0, 40, 10, 10), [90.0, 0.75, 3.0, 1.0]),
  ('regression: reference area', (80, 2.0, 2.0, 40, 40, 10, 10), [21.5153, 0.5379, 0.7358, 2.0]),
  ('control: invalid area', (80, 2.0, 2.0, 40, 40, 0, 10), None),
  ('control: negative distance', (80, 2.0, 2.0, -5, 40, 10, 10), None),
  ('regression: archipelago mid', (150, 4.0, 3.0, 60, 30, 25, 5), [71.1454, 0.2846, 0.5413, 0.6])],
 [('regression: near large island', (200, 5.0, 2.0, 10, 50, 100, 10), [190.6839, 0.1907, 4.0937, 0.2]),
  ('regression: remote small island', (200, 5.0, 2.0, 300, 50, 2, 10), [0.2476, 0.0124, 0.0124, 10.0]),
  ('regression: mainland adjacent', (120, 3.0, 1.0, 0, 40, 10, 10), [90.0, 0.75, 3.0, 1.0]),
  ('regression: reference area', (80, 2.0, 2.0, 40, 40, 10, 10), [21.5153, 0.5379, 0.7358, 2.0]),
  ('control: invalid area', (80, 2.0, 2.0, 40, 40, 0, 10), None),
  ('control: negative distance', (80, 2.0, 2.0, -5, 40, 10, 10), None),
  ('regression: archipelago mid', (150, 4.0, 3.0, 60, 30, 25, 5), [71.1454, 0.2846, 0.5413, 0.6])],
 [('regression: near large island', (200, 5.0, 2.0, 10, 50, 100, 10), [190.6839, 0.1907, 4.0937, 0.2]),
  ('regression: remote small island', (200, 5.0, 2.0, 300, 50, 2, 10), [0.2476, 0.0124, 0.0124, 10.0]),
  ('regression: mainland adjacent', (120, 3.0, 1.0, 0, 40, 10, 10), [90.0, 0.75, 3.0, 1.0]),
  ('regression: reference area', (80, 2.0, 2.0, 40, 40, 10, 10), [21.5153, 0.5379, 0.7358, 2.0]),
  ('control: invalid area', (80, 2.0, 2.0, 40, 40, 0, 10), None),
  ('control: negative distance', (80, 2.0, 2.0, -5, 40, 10, 10), None),
  ('regression: archipelago mid', (150, 4.0, 3.0, 60, 30, 25, 5), [71.1454, 0.2846, 0.5413, 0.6])],
 [('regression: near large island', (200, 5.0, 2.0, 10, 50, 100, 10), [190.6839, 0.1907, 4.0937, 0.2]),
  ('regression: remote small island', (200, 5.0, 2.0, 300, 50, 2, 10), [0.2476, 0.0124, 0.0124, 10.0]),
  ('regression: mainland adjacent', (120, 3.0, 1.0, 0, 40, 10, 10), [90.0, 0.75, 3.0, 1.0]),
  ('regression: reference area', (80, 2.0, 2.0, 40, 40, 10, 10), [21.5153, 0.5379, 0.7358, 2.0]),
  ('control: invalid area', (80, 2.0, 2.0, 40, 40, 0, 10), None),
  ('control: negative distance', (80, 2.0, 2.0, -5, 40, 10, 10), None),
  ('regression: archipelago mid', (150, 4.0, 3.0, 60, 30, 25, 5), [71.1454, 0.2846, 0.5413, 0.6])]]
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 fixtureActualExpectedOutcome
regression: near large island[190.6839, 0.1907, 4.0937, 0.2][190.6839, 0.1907, 4.0937, 0.2]Passed
regression: remote small island[0.2476, 0.0124, 0.0124, 10.0][0.2476, 0.0124, 0.0124, 10.0]Passed
regression: mainland adjacent[90.0, 0.75, 3.0, 1.0][90.0, 0.75, 3.0, 1.0]Passed
regression: reference area[21.5153, 0.5379, 0.7358, 2.0][21.5153, 0.5379, 0.7358, 2.0]Passed
control: invalid areaNoneNonePassed
control: negative distanceNoneNonePassed
regression: archipelago mid[71.1454, 0.2846, 0.5413, 0.6][71.1454, 0.2846, 0.5413, 0.6]Passed

SHA-256 / 498500df6e0257cc451bc30a20ef0979f0b44463a7ebc02d35779f550cdec33c

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:37.102668+00:00.

Case digest / b5f685ebfe137621d513b1daaa4d5a9ad28a888264f036ca6905f44627738916