{"abstract":"Dispersal numbers ignore this year's reproduction.","category":"Ecological population dynamics","checks":7,"contract":"Each year each patch grows by its lambda and is capped at its own ceiling, then fraction disperse of each post-growth patch moves to the other simultaneously; return yearly [N1, N2] rounded 4.","evaluation_group":"w2-ecopop-source-sink","failed_approach":"Emigration proportional to the ceiling ignores actual abundance.","family":"w2-ecopop-source-sink-dispersal-base","id":"FA-65711","implementations":{"attempt":{"sha256":"dafa552bc5937b2062f5c75e25138a252d2ebb8c3676029e2555541eb6b07cc9","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(n0s, lambdas, caps, disperse, years):\n    n = [float(x) for x in n0s]\n    traj = []\n    for _ in range(years):\n        grown = [min(n[j] * lambdas[j], caps[j]) for j in range(2)]\n        out = [caps[j] * disperse for j in range(2)]\n        n = [grown[0] - out[0] + out[1], grown[1] - out[1] + out[0]]\n        traj.append([round(x, 4) for x in n])\n    return traj\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('regression: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('regression: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('regression: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('regression: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('regression: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('regression: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('regression: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('regression: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('regression: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('regression: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"e11d1dfa743e53cf6ca9de9abf7b91711ac7a44172849c63b5a2c1af1e366fb5","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(n0s, lambdas, caps, disperse, years):\n    n = [float(x) for x in n0s]\n    traj = []\n    for _ in range(years):\n        grown = [min(n[j] * lambdas[j], caps[j]) for j in range(2)]\n        out = [n[j] * disperse for j in range(2)]\n        n = [grown[0] - out[0] + out[1], grown[1] - out[1] + out[0]]\n        traj.append([round(x, 4) for x in n])\n    return traj\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('regression: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('regression: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('regression: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('regression: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('regression: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('regression: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('regression: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('regression: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('regression: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('regression: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"20af016fbef8f8e5bddedad7ba05623f3842a2b921716977f7f68d125d613c3b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(n0s, lambdas, caps, disperse, years):\n    n = [float(x) for x in n0s]\n    traj = []\n    for _ in range(years):\n        grown = [min(n[j] * lambdas[j], caps[j]) for j in range(2)]\n        out = [grown[j] * disperse for j in range(2)]\n        n = [grown[0] - out[0] + out[1], grown[1] - out[1] + out[0]]\n        traj.append([round(x, 4) for x in n])\n    return traj\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('regression: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('regression: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('regression: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('regression: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('regression: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('regression: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('regression: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('regression: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])],\n [('regression: meadow source woodland sink',\n   ([100, 20], [1.5, 0.7], [200, 200], 0.2, 5),\n   [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]]),\n  ('regression: ceiling binding in source',\n   ([180, 10], [1.4, 0.8], [200, 50], 0.1, 4),\n   [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]]),\n  ('control: no dispersal',\n   ([50, 50], [1.2, 0.9], [100, 100], 0.0, 3),\n   [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]]),\n  ('regression: full exchange',\n   ([60, 0], [1.1, 0.5], [100, 100], 1.0, 3),\n   [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]]),\n  ('regression: both sinks',\n   ([100, 100], [0.8, 0.6], [150, 150], 0.3, 4),\n   [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]]),\n  ('regression: sink ceiling binding',\n   ([10, 120], [1.3, 1.2], [300, 100], 0.25, 4),\n   [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]]),\n  ('regression: unequal ceilings',\n   ([90, 40], [2.0, 1.5], [120, 60], 0.05, 5),\n   [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]])]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-ecopop-source-sink-dispersal-base","generated_at":"2026-09-29T14:47:36.598542+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Population projections set harvest quotas, conservation status and pest-control timing; a wrong update order, boundary or rate conversion silently changes management advice.","repair":"Restore the dispersal base rule: `out = [grown[j] * disperse`.","root_cause":"Emigration is computed from the pre-growth population.","sha256":"7c1f9dab41a4c8aaa4470f28a7b866fdda43fbb913342efb5210351d7bccfe67","title":"Two-patch source-sink dispersal with ceilings: dispersal base · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.25,"exit_code":1,"observations":[{"actual":[[150.0,14.0],[200.0,9.8],[200.0,6.86],[200.0,4.802],[200.0,3.3614]],"check":"regression: meadow source woodland sink","expected":[[122.8,41.2],[153.128,59.912],[168.3877,73.5507],[170.2971,81.1884],[171.3664,85.4655]],"passed":false},{"actual":[[185.0,23.0],[185.0,33.4],[185.0,41.72],[185.0,48.376]],"check":"regression: ceiling binding in source","expected":[[180.8,27.2],[182.176,39.584],[183.1667,48.5005],[183.88,54.9203]],"passed":false},{"actual":[[60.0,45.0],[72.0,40.5],[86.4,36.45]],"check":"control: no dispersal","expected":[[60.0,45.0],[72.0,40.5],[86.4,36.45]],"passed":true},{"actual":[[66.0,0.0],[72.6,0.0],[79.86,0.0]],"check":"regression: full exchange","expected":[[0.0,66.0],[33.0,0.0],[0.0,36.3]],"passed":false},{"actual":[[80.0,60.0],[64.0,36.0],[51.2,21.6],[40.96,12.96]],"check":"regression: both sinks","expected":[[74.0,66.0],[53.32,45.48],[38.0456,31.8984],[27.0472,22.5283]],"passed":false},{"actual":[[-37.0,150.0],[-98.1,150.0],[-177.53,150.0],[-280.789,150.0]],"check":"regression: sink ceiling binding","expected":[[34.75,78.25],[57.3563,81.7188],[80.438,92.1877],[103.427,101.1423]],"passed":false},{"actual":[[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0]],"check":"regression: unequal ceilings","expected":[[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: meadow source woodland sink\", \"actual\": [[150.0, 14.0], [200.0, 9.8], [200.0, 6.86], [200.0, 4.802], [200.0, 3.3614]], \"expected\": [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]], \"passed\": false}, {\"check\": \"regression: ceiling binding in source\", \"actual\": [[185.0, 23.0], [185.0, 33.4], [185.0, 41.72], [185.0, 48.376]], \"expected\": [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]], \"passed\": false}, {\"check\": \"control: no dispersal\", \"actual\": [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]], \"expected\": [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]], \"passed\": true}, {\"check\": \"regression: full exchange\", \"actual\": [[66.0, 0.0], [72.6, 0.0], [79.86, 0.0]], \"expected\": [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]], \"passed\": false}, {\"check\": \"regression: both sinks\", \"actual\": [[80.0, 60.0], [64.0, 36.0], [51.2, 21.6], [40.96, 12.96]], \"expected\": [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]], \"passed\": false}, {\"check\": \"regression: sink ceiling binding\", \"actual\": [[-37.0, 150.0], [-98.1, 150.0], [-177.53, 150.0], [-280.789, 150.0]], \"expected\": [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]], \"passed\": false}, {\"check\": \"regression: unequal ceilings\", \"actual\": [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]], \"expected\": [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.609,"exit_code":1,"observations":[{"actual":[[134.0,30.0],[179.2,41.8],[172.52,56.74],[176.844,62.874],[177.206,66.8058]],"check":"regression: meadow source woodland sink","expected":[[122.8,41.2],[153.128,59.912],[168.3877,73.5507],[170.2971,81.1884],[171.3664,85.4655]],"passed":false},{"actual":[[183.0,25.0],[184.2,35.8],[185.16,43.48],[185.832,48.952]],"check":"regression: ceiling binding in source","expected":[[180.8,27.2],[182.176,39.584],[183.1667,48.5005],[183.88,54.9203]],"passed":false},{"actual":[[60.0,45.0],[72.0,40.5],[86.4,36.45]],"check":"control: no dispersal","expected":[[60.0,45.0],[72.0,40.5],[86.4,36.45]],"passed":true},{"actual":[[6.0,60.0],[60.6,-24.0],[-17.94,72.6]],"check":"regression: full exchange","expected":[[0.0,66.0],[33.0,0.0],[0.0,36.3]],"passed":false},{"actual":[[80.0,60.0],[58.0,42.0],[41.6,30.0],[29.8,21.48]],"check":"regression: both sinks","expected":[[74.0,66.0],[53.32,45.48],[38.0456,31.8984],[27.0472,22.5283]],"passed":false},{"actual":[[40.5,72.5],[60.65,79.0],[83.4325,90.2125],[110.1573,98.305]],"check":"regression: sink ceiling binding","expected":[[34.75,78.25],[57.3563,81.7188],[80.438,92.1877],[103.427,101.1423]],"passed":false},{"actual":[[117.5,62.5],[117.25,62.75],[117.275,62.725],[117.2725,62.7275],[117.2728,62.7272]],"check":"regression: unequal ceilings","expected":[[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: meadow source woodland sink\", \"actual\": [[134.0, 30.0], [179.2, 41.8], [172.52, 56.74], [176.844, 62.874], [177.206, 66.8058]], \"expected\": [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]], \"passed\": false}, {\"check\": \"regression: ceiling binding in source\", \"actual\": [[183.0, 25.0], [184.2, 35.8], [185.16, 43.48], [185.832, 48.952]], \"expected\": [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]], \"passed\": false}, {\"check\": \"control: no dispersal\", \"actual\": [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]], \"expected\": [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]], \"passed\": true}, {\"check\": \"regression: full exchange\", \"actual\": [[6.0, 60.0], [60.6, -24.0], [-17.94, 72.6]], \"expected\": [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]], \"passed\": false}, {\"check\": \"regression: both sinks\", \"actual\": [[80.0, 60.0], [58.0, 42.0], [41.6, 30.0], [29.8, 21.48]], \"expected\": [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]], \"passed\": false}, {\"check\": \"regression: sink ceiling binding\", \"actual\": [[40.5, 72.5], [60.65, 79.0], [83.4325, 90.2125], [110.1573, 98.305]], \"expected\": [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]], \"passed\": false}, {\"check\": \"regression: unequal ceilings\", \"actual\": [[117.5, 62.5], [117.25, 62.75], [117.275, 62.725], [117.2725, 62.7275], [117.2728, 62.7272]], \"expected\": [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.153,"exit_code":0,"observations":[{"actual":[[122.8,41.2],[153.128,59.912],[168.3877,73.5507],[170.2971,81.1884],[171.3664,85.4655]],"check":"regression: meadow source woodland sink","expected":[[122.8,41.2],[153.128,59.912],[168.3877,73.5507],[170.2971,81.1884],[171.3664,85.4655]],"passed":true},{"actual":[[180.8,27.2],[182.176,39.584],[183.1667,48.5005],[183.88,54.9203]],"check":"regression: ceiling binding in source","expected":[[180.8,27.2],[182.176,39.584],[183.1667,48.5005],[183.88,54.9203]],"passed":true},{"actual":[[60.0,45.0],[72.0,40.5],[86.4,36.45]],"check":"control: no dispersal","expected":[[60.0,45.0],[72.0,40.5],[86.4,36.45]],"passed":true},{"actual":[[0.0,66.0],[33.0,0.0],[0.0,36.3]],"check":"regression: full exchange","expected":[[0.0,66.0],[33.0,0.0],[0.0,36.3]],"passed":true},{"actual":[[74.0,66.0],[53.32,45.48],[38.0456,31.8984],[27.0472,22.5283]],"check":"regression: both sinks","expected":[[74.0,66.0],[53.32,45.48],[38.0456,31.8984],[27.0472,22.5283]],"passed":true},{"actual":[[34.75,78.25],[57.3563,81.7188],[80.438,92.1877],[103.427,101.1423]],"check":"regression: sink ceiling binding","expected":[[34.75,78.25],[57.3563,81.7188],[80.438,92.1877],[103.427,101.1423]],"passed":true},{"actual":[[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0]],"check":"regression: unequal ceilings","expected":[[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0],[117.0,63.0]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: meadow source woodland sink\", \"actual\": [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]], \"expected\": [[122.8, 41.2], [153.128, 59.912], [168.3877, 73.5507], [170.2971, 81.1884], [171.3664, 85.4655]], \"passed\": true}, {\"check\": \"regression: ceiling binding in source\", \"actual\": [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]], \"expected\": [[180.8, 27.2], [182.176, 39.584], [183.1667, 48.5005], [183.88, 54.9203]], \"passed\": true}, {\"check\": \"control: no dispersal\", \"actual\": [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]], \"expected\": [[60.0, 45.0], [72.0, 40.5], [86.4, 36.45]], \"passed\": true}, {\"check\": \"regression: full exchange\", \"actual\": [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]], \"expected\": [[0.0, 66.0], [33.0, 0.0], [0.0, 36.3]], \"passed\": true}, {\"check\": \"regression: both sinks\", \"actual\": [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]], \"expected\": [[74.0, 66.0], [53.32, 45.48], [38.0456, 31.8984], [27.0472, 22.5283]], \"passed\": true}, {\"check\": \"regression: sink ceiling binding\", \"actual\": [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]], \"expected\": [[34.75, 78.25], [57.3563, 81.7188], [80.438, 92.1877], [103.427, 101.1423]], \"passed\": true}, {\"check\": \"regression: unequal ceilings\", \"actual\": [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]], \"expected\": [[117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0], [117.0, 63.0]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}