FAILURE MAP
← Case archive

FA-65751 / Ecological population dynamics / Open access

MacArthur-Wilson island equilibrium: distance decay · case 01

Remote islands receive more immigrants than near ones.

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

ROOT CAUSE

The distance decay uses d0/distance, which increases with distance.

VERIFIED REPAIR

Restore the distance decay rule: `math.exp(-distance / d0)`.

Unsuccessful approach: The hyperbolic decay is a different contract from the exponential one.

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(-d0 / (distance + 1))
    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[41.9452, 0.0419, 0.0531, 0.2][190.6839, 0.1907, 4.0937, 0.2]Failed
regression: remote small island[59.4988, 2.9749, 4.2348, 10.0][0.2476, 0.0124, 0.0124, 10.0]Failed
regression: mainland adjacent[0.0, 0.0, 0.0, 1.0][90.0, 0.75, 3.0, 1.0]Failed
regression: reference area[21.9011, 0.5475, 0.7539, 2.0][21.5153, 0.5379, 0.7358, 2.0]Failed
control: invalid areaNoneNonePassed
control: negative distanceNoneNonePassed
regression: archipelago mid[120.4539, 0.4818, 2.4461, 0.6][71.1454, 0.2846, 0.5413, 0.6]Failed

SHA-256 / 08f7212a7dfacea3f6174982bb45fbb04aa107d6119fea3d46fef31446f67517

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 * (1 - distance / (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.8397, 0.1908, 4.1667, 0.2][190.6839, 0.1907, 4.0937, 0.2]Failed
regression: remote small island[13.3333, 0.6667, 0.7143, 10.0][0.2476, 0.0124, 0.0124, 10.0]Failed
regression: mainland adjacent[90.0, 0.75, 3.0, 1.0][90.0, 0.75, 3.0, 1.0]Passed
regression: reference area[26.6667, 0.6667, 1.0, 2.0][21.5153, 0.5379, 0.7358, 2.0]Failed
control: invalid areaNoneNonePassed
control: negative distanceNoneNonePassed
regression: archipelago mid[103.4483, 0.4138, 1.3333, 0.6][71.1454, 0.2846, 0.5413, 0.6]Failed

SHA-256 / f8988f2462ceea00085310fe0c74a2cb93b48a1607903b169a529727b6422f2f

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

Case digest / dccfa654f0e1a0b875742b5c01d951c6812b51ffb0ed3fad6e7789b5210355ca