{"abstract":"Catch ignores fish that die naturally before they can be caught.","category":"Ecological population dynamics","checks":7,"contract":"Z_a = F_a + M; catch_a = F_a/Z_a*N_a*(1-exp(-Z_a)) (0 when Z=0); survivors N_a*exp(-Z_a) age one year; the last class is a plus group; next year starts with recruits at age 0; return [catch rounded 3, next vector rounded 3, total catch rounded 3]; at least two age classes.","evaluation_group":"w2-ecopop-baranov-cohort","failed_approach":"Using the surviving fraction instead of the dead fraction inverts the equation.","family":"w2-ecopop-baranov-cohort-catch-fraction","id":"FA-65606","implementations":{"attempt":{"sha256":"3d07dce41092880da7a1bbfa8c388e6f1a033966e20f872e74d515da83d80ff9","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(numbers, f_by_age, m, recruits):\n    z = [f + m for f in f_by_age]\n    catch = [f / z_a * n * math.exp(-z_a) if z_a > 0 else 0.0 for f, z_a, n in zip(f_by_age, z, numbers)]\n    surv = [n * math.exp(-z_a) for n, z_a in zip(numbers, z)]\n    nxt = [float(recruits)] + surv[:-2] + [surv[-2] + surv[-1]]\n    return [[round(c, 3) for c in catch], [round(x, 3) for x in nxt], round(sum(catch), 3)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: haddock four ages',\n   ([1000, 600, 300, 150], [0.1, 0.3, 0.5, 0.5], 0.2, 900),\n   [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855]),\n  ('regression: two ages', ([500, 200], [0.2, 0.4], 0.3, 400), [[78.694, 57.533], [400.0, 402.582], 136.227]),\n  ('control: unfished',\n   ([800, 400, 200], [0.0, 0.0, 0.0], 0.2, 700),\n   [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0]),\n  ('regression: no natural mortality',\n   ([100, 80, 60], [0.3, 0.3, 0.3], 0.0, 100),\n   [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204]),\n  ('control: no mortality at all', ([50, 40], [0.0, 0.0], 0.0, 50), [[0.0, 0.0], [50.0, 90.0], 0.0]),\n  ('regression: heavy fishing',\n   ([400, 300, 200, 100, 50], [0.5, 1.0, 1.2, 1.2, 1.2], 0.25, 350),\n   [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652]),\n  ('regression: recruitment failure',\n   ([300, 250, 100], [0.2, 0.4, 0.4], 0.15, 0),\n   [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31])],\n [('regression: haddock four ages',\n   ([1000, 600, 300, 150], [0.1, 0.3, 0.5, 0.5], 0.2, 900),\n   [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855]),\n  ('regression: two ages', ([500, 200], [0.2, 0.4], 0.3, 400), [[78.694, 57.533], [400.0, 402.582], 136.227]),\n  ('control: unfished',\n   ([800, 400, 200], [0.0, 0.0, 0.0], 0.2, 700),\n   [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0]),\n  ('regression: no natural mortality',\n   ([100, 80, 60], [0.3, 0.3, 0.3], 0.0, 100),\n   [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204]),\n  ('control: no mortality at all', ([50, 40], [0.0, 0.0], 0.0, 50), [[0.0, 0.0], [50.0, 90.0], 0.0]),\n  ('regression: heavy fishing',\n   ([400, 300, 200, 100, 50], [0.5, 1.0, 1.2, 1.2, 1.2], 0.25, 350),\n   [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652]),\n  ('regression: recruitment failure',\n   ([300, 250, 100], [0.2, 0.4, 0.4], 0.15, 0),\n   [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31])],\n [('regression: haddock four ages',\n   ([1000, 600, 300, 150], [0.1, 0.3, 0.5, 0.5], 0.2, 900),\n   [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855]),\n  ('regression: two ages', ([500, 200], [0.2, 0.4], 0.3, 400), [[78.694, 57.533], [400.0, 402.582], 136.227]),\n  ('control: unfished',\n   ([800, 400, 200], [0.0, 0.0, 0.0], 0.2, 700),\n   [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0]),\n  ('regression: no natural mortality',\n   ([100, 80, 60], [0.3, 0.3, 0.3], 0.0, 100),\n   [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204]),\n  ('control: no mortality at all', ([50, 40], [0.0, 0.0], 0.0, 50), [[0.0, 0.0], [50.0, 90.0], 0.0]),\n  ('regression: heavy fishing',\n   ([400, 300, 200, 100, 50], [0.5, 1.0, 1.2, 1.2, 1.2], 0.25, 350),\n   [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652]),\n  ('regression: recruitment failure',\n   ([300, 250, 100], [0.2, 0.4, 0.4], 0.15, 0),\n   [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31])],\n [('regression: haddock four ages',\n   ([1000, 600, 300, 150], [0.1, 0.3, 0.5, 0.5], 0.2, 900),\n   [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855]),\n  ('regression: two ages', ([500, 200], [0.2, 0.4], 0.3, 400), [[78.694, 57.533], [400.0, 402.582], 136.227]),\n  ('control: unfished',\n   ([800, 400, 200], [0.0, 0.0, 0.0], 0.2, 700),\n   [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0]),\n  ('regression: no natural mortality',\n   ([100, 80, 60], [0.3, 0.3, 0.3], 0.0, 100),\n   [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204]),\n  ('control: no mortality at all', ([50, 40], [0.0, 0.0], 0.0, 50), [[0.0, 0.0], [50.0, 90.0], 0.0]),\n  ('regression: heavy fishing',\n   ([400, 300, 200, 100, 50], [0.5, 1.0, 1.2, 1.2, 1.2], 0.25, 350),\n   [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652]),\n  ('regression: recruitment failure',\n   ([300, 250, 100], [0.2, 0.4, 0.4], 0.15, 0),\n   [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31])],\n [('regression: haddock four ages',\n   ([1000, 600, 300, 150], [0.1, 0.3, 0.5, 0.5], 0.2, 900),\n   [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855]),\n  ('regression: two ages', ([500, 200], [0.2, 0.4], 0.3, 400), [[78.694, 57.533], [400.0, 402.582], 136.227]),\n  ('control: unfished',\n   ([800, 400, 200], [0.0, 0.0, 0.0], 0.2, 700),\n   [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0]),\n  ('regression: no natural mortality',\n   ([100, 80, 60], [0.3, 0.3, 0.3], 0.0, 100),\n   [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204]),\n  ('control: no mortality at all', ([50, 40], [0.0, 0.0], 0.0, 50), [[0.0, 0.0], [50.0, 90.0], 0.0]),\n  ('regression: heavy fishing',\n   ([400, 300, 200, 100, 50], [0.5, 1.0, 1.2, 1.2, 1.2], 0.25, 350),\n   [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652]),\n  ('regression: recruitment failure',\n   ([300, 250, 100], [0.2, 0.4, 0.4], 0.15, 0),\n   [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31])]]\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":"447eb2bf60d55b465e36a4ff71bf5c7d098fcd6dbf3dda86f0aca854ded5ba8a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(numbers, f_by_age, m, recruits):\n    z = [f + m for f in f_by_age]\n    catch = [n * (1 - math.exp(-f)) if z_a > 0 else 0.0 for f, z_a, n in zip(f_by_age, z, numbers)]\n    surv = [n * math.exp(-z_a) for n, z_a in zip(numbers, z)]\n    nxt = [float(recruits)] + surv[:-2] + [surv[-2] + surv[-1]]\n    return [[round(c, 3) for c in catch], [round(x, 3) for x in nxt], round(sum(catch), 3)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: haddock four ages',\n   ([1000, 600, 300, 150], [0.1, 0.3, 0.5, 0.5], 0.2, 900),\n   [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855]),\n  ('regression: two ages', ([500, 200], [0.2, 0.4], 0.3, 400), [[78.694, 57.533], [400.0, 402.582], 136.227]),\n  ('control: unfished',\n   ([800, 400, 200], [0.0, 0.0, 0.0], 0.2, 700),\n   [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0]),\n  ('regression: no natural mortality',\n   ([100, 80, 60], [0.3, 0.3, 0.3], 0.0, 100),\n   [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204]),\n  ('control: no mortality at all', ([50, 40], [0.0, 0.0], 0.0, 50), [[0.0, 0.0], [50.0, 90.0], 0.0]),\n  ('regression: heavy fishing',\n   ([400, 300, 200, 100, 50], [0.5, 1.0, 1.2, 1.2, 1.2], 0.25, 350),\n   [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652]),\n  ('regression: recruitment failure',\n   ([300, 250, 100], [0.2, 0.4, 0.4], 0.15, 0),\n   [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31])],\n [('regression: haddock four ages',\n   ([1000, 600, 300, 150], [0.1, 0.3, 0.5, 0.5], 0.2, 900),\n   [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855]),\n  ('regression: two ages', ([500, 200], [0.2, 0.4], 0.3, 400), [[78.694, 57.533], [400.0, 402.582], 136.227]),\n  ('control: unfished',\n   ([800, 400, 200], [0.0, 0.0, 0.0], 0.2, 700),\n   [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0]),\n  ('regression: no natural mortality',\n   ([100, 80, 60], [0.3, 0.3, 0.3], 0.0, 100),\n   [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204]),\n  ('control: no mortality at all', ([50, 40], [0.0, 0.0], 0.0, 50), [[0.0, 0.0], [50.0, 90.0], 0.0]),\n  ('regression: heavy fishing',\n   ([400, 300, 200, 100, 50], [0.5, 1.0, 1.2, 1.2, 1.2], 0.25, 350),\n   [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652]),\n  ('regression: recruitment failure',\n   ([300, 250, 100], [0.2, 0.4, 0.4], 0.15, 0),\n   [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31])],\n [('regression: haddock four ages',\n   ([1000, 600, 300, 150], [0.1, 0.3, 0.5, 0.5], 0.2, 900),\n   [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855]),\n  ('regression: two ages', ([500, 200], [0.2, 0.4], 0.3, 400), [[78.694, 57.533], [400.0, 402.582], 136.227]),\n  ('control: unfished',\n   ([800, 400, 200], [0.0, 0.0, 0.0], 0.2, 700),\n   [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0]),\n  ('regression: no natural mortality',\n   ([100, 80, 60], [0.3, 0.3, 0.3], 0.0, 100),\n   [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204]),\n  ('control: no mortality at all', ([50, 40], [0.0, 0.0], 0.0, 50), [[0.0, 0.0], [50.0, 90.0], 0.0]),\n  ('regression: heavy fishing',\n   ([400, 300, 200, 100, 50], [0.5, 1.0, 1.2, 1.2, 1.2], 0.25, 350),\n   [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652]),\n  ('regression: recruitment failure',\n   ([300, 250, 100], [0.2, 0.4, 0.4], 0.15, 0),\n   [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31])],\n [('regression: haddock four ages',\n   ([1000, 600, 300, 150], [0.1, 0.3, 0.5, 0.5], 0.2, 900),\n   [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855]),\n  ('regression: two ages', ([500, 200], [0.2, 0.4], 0.3, 400), [[78.694, 57.533], [400.0, 402.582], 136.227]),\n  ('control: unfished',\n   ([800, 400, 200], [0.0, 0.0, 0.0], 0.2, 700),\n   [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0]),\n  ('regression: no natural mortality',\n   ([100, 80, 60], [0.3, 0.3, 0.3], 0.0, 100),\n   [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204]),\n  ('control: no mortality at all', ([50, 40], [0.0, 0.0], 0.0, 50), [[0.0, 0.0], [50.0, 90.0], 0.0]),\n  ('regression: heavy fishing',\n   ([400, 300, 200, 100, 50], [0.5, 1.0, 1.2, 1.2, 1.2], 0.25, 350),\n   [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652]),\n  ('regression: recruitment failure',\n   ([300, 250, 100], [0.2, 0.4, 0.4], 0.15, 0),\n   [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31])],\n [('regression: haddock four ages',\n   ([1000, 600, 300, 150], [0.1, 0.3, 0.5, 0.5], 0.2, 900),\n   [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855]),\n  ('regression: two ages', ([500, 200], [0.2, 0.4], 0.3, 400), [[78.694, 57.533], [400.0, 402.582], 136.227]),\n  ('control: unfished',\n   ([800, 400, 200], [0.0, 0.0, 0.0], 0.2, 700),\n   [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0]),\n  ('regression: no natural mortality',\n   ([100, 80, 60], [0.3, 0.3, 0.3], 0.0, 100),\n   [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204]),\n  ('control: no mortality at all', ([50, 40], [0.0, 0.0], 0.0, 50), [[0.0, 0.0], [50.0, 90.0], 0.0]),\n  ('regression: heavy fishing',\n   ([400, 300, 200, 100, 50], [0.5, 1.0, 1.2, 1.2, 1.2], 0.25, 350),\n   [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652]),\n  ('regression: recruitment failure',\n   ([300, 250, 100], [0.2, 0.4, 0.4], 0.15, 0),\n   [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31])]]\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":"94b335b4af31fd4253723941643c2fe2104927e4b46cad9f521a976f452de98c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(numbers, f_by_age, m, recruits):\n    z = [f + m for f in f_by_age]\n    catch = [f / z_a * n * (1 - math.exp(-z_a)) if z_a > 0 else 0.0 for f, z_a, n in zip(f_by_age, z, numbers)]\n    surv = [n * math.exp(-z_a) for n, z_a in zip(numbers, z)]\n    nxt = [float(recruits)] + surv[:-2] + [surv[-2] + surv[-1]]\n    return [[round(c, 3) for c in catch], [round(x, 3) for x in nxt], round(sum(catch), 3)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: haddock four ages',\n   ([1000, 600, 300, 150], [0.1, 0.3, 0.5, 0.5], 0.2, 900),\n   [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855]),\n  ('regression: two ages', ([500, 200], [0.2, 0.4], 0.3, 400), [[78.694, 57.533], [400.0, 402.582], 136.227]),\n  ('control: unfished',\n   ([800, 400, 200], [0.0, 0.0, 0.0], 0.2, 700),\n   [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0]),\n  ('regression: no natural mortality',\n   ([100, 80, 60], [0.3, 0.3, 0.3], 0.0, 100),\n   [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204]),\n  ('control: no mortality at all', ([50, 40], [0.0, 0.0], 0.0, 50), [[0.0, 0.0], [50.0, 90.0], 0.0]),\n  ('regression: heavy fishing',\n   ([400, 300, 200, 100, 50], [0.5, 1.0, 1.2, 1.2, 1.2], 0.25, 350),\n   [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652]),\n  ('regression: recruitment failure',\n   ([300, 250, 100], [0.2, 0.4, 0.4], 0.15, 0),\n   [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31])],\n [('regression: haddock four ages',\n   ([1000, 600, 300, 150], [0.1, 0.3, 0.5, 0.5], 0.2, 900),\n   [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855]),\n  ('regression: two ages', ([500, 200], [0.2, 0.4], 0.3, 400), [[78.694, 57.533], [400.0, 402.582], 136.227]),\n  ('control: unfished',\n   ([800, 400, 200], [0.0, 0.0, 0.0], 0.2, 700),\n   [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0]),\n  ('regression: no natural mortality',\n   ([100, 80, 60], [0.3, 0.3, 0.3], 0.0, 100),\n   [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204]),\n  ('control: no mortality at all', ([50, 40], [0.0, 0.0], 0.0, 50), [[0.0, 0.0], [50.0, 90.0], 0.0]),\n  ('regression: heavy fishing',\n   ([400, 300, 200, 100, 50], [0.5, 1.0, 1.2, 1.2, 1.2], 0.25, 350),\n   [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652]),\n  ('regression: recruitment failure',\n   ([300, 250, 100], [0.2, 0.4, 0.4], 0.15, 0),\n   [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31])],\n [('regression: haddock four ages',\n   ([1000, 600, 300, 150], [0.1, 0.3, 0.5, 0.5], 0.2, 900),\n   [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855]),\n  ('regression: two ages', ([500, 200], [0.2, 0.4], 0.3, 400), [[78.694, 57.533], [400.0, 402.582], 136.227]),\n  ('control: unfished',\n   ([800, 400, 200], [0.0, 0.0, 0.0], 0.2, 700),\n   [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0]),\n  ('regression: no natural mortality',\n   ([100, 80, 60], [0.3, 0.3, 0.3], 0.0, 100),\n   [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204]),\n  ('control: no mortality at all', ([50, 40], [0.0, 0.0], 0.0, 50), [[0.0, 0.0], [50.0, 90.0], 0.0]),\n  ('regression: heavy fishing',\n   ([400, 300, 200, 100, 50], [0.5, 1.0, 1.2, 1.2, 1.2], 0.25, 350),\n   [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652]),\n  ('regression: recruitment failure',\n   ([300, 250, 100], [0.2, 0.4, 0.4], 0.15, 0),\n   [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31])],\n [('regression: haddock four ages',\n   ([1000, 600, 300, 150], [0.1, 0.3, 0.5, 0.5], 0.2, 900),\n   [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855]),\n  ('regression: two ages', ([500, 200], [0.2, 0.4], 0.3, 400), [[78.694, 57.533], [400.0, 402.582], 136.227]),\n  ('control: unfished',\n   ([800, 400, 200], [0.0, 0.0, 0.0], 0.2, 700),\n   [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0]),\n  ('regression: no natural mortality',\n   ([100, 80, 60], [0.3, 0.3, 0.3], 0.0, 100),\n   [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204]),\n  ('control: no mortality at all', ([50, 40], [0.0, 0.0], 0.0, 50), [[0.0, 0.0], [50.0, 90.0], 0.0]),\n  ('regression: heavy fishing',\n   ([400, 300, 200, 100, 50], [0.5, 1.0, 1.2, 1.2, 1.2], 0.25, 350),\n   [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652]),\n  ('regression: recruitment failure',\n   ([300, 250, 100], [0.2, 0.4, 0.4], 0.15, 0),\n   [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31])],\n [('regression: haddock four ages',\n   ([1000, 600, 300, 150], [0.1, 0.3, 0.5, 0.5], 0.2, 900),\n   [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855]),\n  ('regression: two ages', ([500, 200], [0.2, 0.4], 0.3, 400), [[78.694, 57.533], [400.0, 402.582], 136.227]),\n  ('control: unfished',\n   ([800, 400, 200], [0.0, 0.0, 0.0], 0.2, 700),\n   [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0]),\n  ('regression: no natural mortality',\n   ([100, 80, 60], [0.3, 0.3, 0.3], 0.0, 100),\n   [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204]),\n  ('control: no mortality at all', ([50, 40], [0.0, 0.0], 0.0, 50), [[0.0, 0.0], [50.0, 90.0], 0.0]),\n  ('regression: heavy fishing',\n   ([400, 300, 200, 100, 50], [0.5, 1.0, 1.2, 1.2, 1.2], 0.25, 350),\n   [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652]),\n  ('regression: recruitment failure',\n   ([300, 250, 100], [0.2, 0.4, 0.4], 0.15, 0),\n   [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31])]]\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-baranov-cohort-catch-fraction","generated_at":"2026-09-29T14:47:35.448517+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 catch fraction rule: `f / z_a * n * (1 - math.exp(-z_a))`.","root_cause":"Catch is computed as if fishing were the only hazard.","sha256":"e3339ff19d42e186cb0c848a01add33e3a453af08ca61bb393a93ecd011b6b28","title":"Baranov catch and age-structured survival: catch fraction · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":45.142,"exit_code":1,"observations":[{"actual":[[246.939,218.351,106.411,53.206],[900.0,740.818,363.918,223.463],624.907],"check":"regression: haddock four ages","expected":[[86.394,141.649,107.875,53.937],[900.0,740.818,363.918,223.463],389.855],"passed":false},{"actual":[[121.306,56.753],[400.0,402.582],178.059],"check":"regression: two ages","expected":[[78.694,57.533],[400.0,402.582],136.227],"passed":false},{"actual":[[0.0,0.0,0.0],[700.0,654.985,491.238],0.0],"check":"control: unfished","expected":[[0.0,0.0,0.0],[700.0,654.985,491.238],0.0],"passed":true},{"actual":[[74.082,59.265,44.449],[100.0,74.082,103.715],177.796],"check":"regression: no natural mortality","expected":[[25.918,20.735,15.551],[100.0,74.082,103.715],62.204],"passed":false},{"actual":[[0.0,0.0],[50.0,90.0],0.0],"check":"control: no mortality at all","expected":[[0.0,0.0],[50.0,90.0],0.0],"passed":true},{"actual":[[125.964,68.761,38.825,19.413,9.706],[350.0,188.947,85.951,46.914,35.186],262.67],"check":"regression: heavy fishing","expected":[[140.702,171.239,126.692,63.346,31.673],[350.0,188.947,85.951,46.914,35.186],533.652],"passed":false},{"actual":[[120.804,104.9,41.96],[0.0,211.406,201.932],267.664],"check":"regression: recruitment failure","expected":[[50.625,76.918,30.767],[0.0,211.406,201.932],158.31],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: haddock four ages\", \"actual\": [[246.939, 218.351, 106.411, 53.206], [900.0, 740.818, 363.918, 223.463], 624.907], \"expected\": [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855], \"passed\": false}, {\"check\": \"regression: two ages\", \"actual\": [[121.306, 56.753], [400.0, 402.582], 178.059], \"expected\": [[78.694, 57.533], [400.0, 402.582], 136.227], \"passed\": false}, {\"check\": \"control: unfished\", \"actual\": [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0], \"expected\": [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0], \"passed\": true}, {\"check\": \"regression: no natural mortality\", \"actual\": [[74.082, 59.265, 44.449], [100.0, 74.082, 103.715], 177.796], \"expected\": [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204], \"passed\": false}, {\"check\": \"control: no mortality at all\", \"actual\": [[0.0, 0.0], [50.0, 90.0], 0.0], \"expected\": [[0.0, 0.0], [50.0, 90.0], 0.0], \"passed\": true}, {\"check\": \"regression: heavy fishing\", \"actual\": [[125.964, 68.761, 38.825, 19.413, 9.706], [350.0, 188.947, 85.951, 46.914, 35.186], 262.67], \"expected\": [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652], \"passed\": false}, {\"check\": \"regression: recruitment failure\", \"actual\": [[120.804, 104.9, 41.96], [0.0, 211.406, 201.932], 267.664], \"expected\": [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.995,"exit_code":1,"observations":[{"actual":[[95.163,155.509,118.041,59.02],[900.0,740.818,363.918,223.463],427.733],"check":"regression: haddock four ages","expected":[[86.394,141.649,107.875,53.937],[900.0,740.818,363.918,223.463],389.855],"passed":false},{"actual":[[90.635,65.936],[400.0,402.582],156.571],"check":"regression: two ages","expected":[[78.694,57.533],[400.0,402.582],136.227],"passed":false},{"actual":[[0.0,0.0,0.0],[700.0,654.985,491.238],0.0],"check":"control: unfished","expected":[[0.0,0.0,0.0],[700.0,654.985,491.238],0.0],"passed":true},{"actual":[[25.918,20.735,15.551],[100.0,74.082,103.715],62.204],"check":"regression: no natural mortality","expected":[[25.918,20.735,15.551],[100.0,74.082,103.715],62.204],"passed":true},{"actual":[[0.0,0.0],[50.0,90.0],0.0],"check":"control: no mortality at all","expected":[[0.0,0.0],[50.0,90.0],0.0],"passed":true},{"actual":[[157.388,189.636,139.761,69.881,34.94],[350.0,188.947,85.951,46.914,35.186],591.606],"check":"regression: heavy fishing","expected":[[140.702,171.239,126.692,63.346,31.673],[350.0,188.947,85.951,46.914,35.186],533.652],"passed":false},{"actual":[[54.381,82.42,32.968],[0.0,211.406,201.932],169.769],"check":"regression: recruitment failure","expected":[[50.625,76.918,30.767],[0.0,211.406,201.932],158.31],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: haddock four ages\", \"actual\": [[95.163, 155.509, 118.041, 59.02], [900.0, 740.818, 363.918, 223.463], 427.733], \"expected\": [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855], \"passed\": false}, {\"check\": \"regression: two ages\", \"actual\": [[90.635, 65.936], [400.0, 402.582], 156.571], \"expected\": [[78.694, 57.533], [400.0, 402.582], 136.227], \"passed\": false}, {\"check\": \"control: unfished\", \"actual\": [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0], \"expected\": [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0], \"passed\": true}, {\"check\": \"regression: no natural mortality\", \"actual\": [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204], \"expected\": [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204], \"passed\": true}, {\"check\": \"control: no mortality at all\", \"actual\": [[0.0, 0.0], [50.0, 90.0], 0.0], \"expected\": [[0.0, 0.0], [50.0, 90.0], 0.0], \"passed\": true}, {\"check\": \"regression: heavy fishing\", \"actual\": [[157.388, 189.636, 139.761, 69.881, 34.94], [350.0, 188.947, 85.951, 46.914, 35.186], 591.606], \"expected\": [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652], \"passed\": false}, {\"check\": \"regression: recruitment failure\", \"actual\": [[54.381, 82.42, 32.968], [0.0, 211.406, 201.932], 169.769], \"expected\": [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":43.258,"exit_code":0,"observations":[{"actual":[[86.394,141.649,107.875,53.937],[900.0,740.818,363.918,223.463],389.855],"check":"regression: haddock four ages","expected":[[86.394,141.649,107.875,53.937],[900.0,740.818,363.918,223.463],389.855],"passed":true},{"actual":[[78.694,57.533],[400.0,402.582],136.227],"check":"regression: two ages","expected":[[78.694,57.533],[400.0,402.582],136.227],"passed":true},{"actual":[[0.0,0.0,0.0],[700.0,654.985,491.238],0.0],"check":"control: unfished","expected":[[0.0,0.0,0.0],[700.0,654.985,491.238],0.0],"passed":true},{"actual":[[25.918,20.735,15.551],[100.0,74.082,103.715],62.204],"check":"regression: no natural mortality","expected":[[25.918,20.735,15.551],[100.0,74.082,103.715],62.204],"passed":true},{"actual":[[0.0,0.0],[50.0,90.0],0.0],"check":"control: no mortality at all","expected":[[0.0,0.0],[50.0,90.0],0.0],"passed":true},{"actual":[[140.702,171.239,126.692,63.346,31.673],[350.0,188.947,85.951,46.914,35.186],533.652],"check":"regression: heavy fishing","expected":[[140.702,171.239,126.692,63.346,31.673],[350.0,188.947,85.951,46.914,35.186],533.652],"passed":true},{"actual":[[50.625,76.918,30.767],[0.0,211.406,201.932],158.31],"check":"regression: recruitment failure","expected":[[50.625,76.918,30.767],[0.0,211.406,201.932],158.31],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: haddock four ages\", \"actual\": [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855], \"expected\": [[86.394, 141.649, 107.875, 53.937], [900.0, 740.818, 363.918, 223.463], 389.855], \"passed\": true}, {\"check\": \"regression: two ages\", \"actual\": [[78.694, 57.533], [400.0, 402.582], 136.227], \"expected\": [[78.694, 57.533], [400.0, 402.582], 136.227], \"passed\": true}, {\"check\": \"control: unfished\", \"actual\": [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0], \"expected\": [[0.0, 0.0, 0.0], [700.0, 654.985, 491.238], 0.0], \"passed\": true}, {\"check\": \"regression: no natural mortality\", \"actual\": [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204], \"expected\": [[25.918, 20.735, 15.551], [100.0, 74.082, 103.715], 62.204], \"passed\": true}, {\"check\": \"control: no mortality at all\", \"actual\": [[0.0, 0.0], [50.0, 90.0], 0.0], \"expected\": [[0.0, 0.0], [50.0, 90.0], 0.0], \"passed\": true}, {\"check\": \"regression: heavy fishing\", \"actual\": [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652], \"expected\": [[140.702, 171.239, 126.692, 63.346, 31.673], [350.0, 188.947, 85.951, 46.914, 35.186], 533.652], \"passed\": true}, {\"check\": \"regression: recruitment failure\", \"actual\": [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31], \"expected\": [[50.625, 76.918, 30.767], [0.0, 211.406, 201.932], 158.31], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}