{"abstract":"Slack times are mirrored inside the sample interval.","category":"Tide and marine navigation tables","checks":7,"contract":"Input [ts, vs]: sample times (minutes) and signed current (flood positive). Zero samples are skipped; a slack occurs between consecutive nonzero samples of opposite sign. With no zero samples in between, slack time is linearly interpolated; across a run of zero samples it is the midpoint of the zero run. Times round half up to minutes; the label says which stream begins. Return [[minute, \"flood-begins\"|\"ebb-begins\"], ...].","evaluation_group":"w2-tide_and_marine_navigation_tables-slack_water","failed_approach":"Dividing by the sum of velocities is only right for symmetric samples.","family":"w2-tide_and_marine_navigation_tables-slack_water-interpolation-fraction","id":"FA-69171","implementations":{"attempt":{"sha256":"c9da5fcc546bc56923cd3dd19d5f725ed2b391c973d5850d8baeb664613120cd","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    ts,vs=x\n    out=[]\n    prev=None\n    for k in range(len(vs)):\n        if vs[k]==0: continue\n        if prev is not None and (vs[prev]>0)!=(vs[k]>0):\n            if k-prev>1:\n                tc=(ts[prev+1]+ts[k-1])/2\n            else:\n                tc=ts[prev]+(ts[k]-ts[prev])*abs(vs[prev]/(vs[prev]+vs[k]))\n            out.append([math.floor(tc+0.5),'flood-begins' if vs[k]>0 else 'ebb-begins'])\n        prev=k\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']])], [('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]]', [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]], [[60, 'ebb-begins'], [150, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']])], [('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]]', [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]], [[60, 'ebb-begins'], [150, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], [])], [('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']])], [('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]]', [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]], [[60, 'ebb-begins'], [150, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], [])]]\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":"22a905905fccb26a6ba920013fc966838553f50adf13505e9c83aec60e17e173","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    ts,vs=x\n    out=[]\n    prev=None\n    for k in range(len(vs)):\n        if vs[k]==0: continue\n        if prev is not None and (vs[prev]>0)!=(vs[k]>0):\n            if k-prev>1:\n                tc=(ts[prev+1]+ts[k-1])/2\n            else:\n                tc=ts[prev]+(ts[k]-ts[prev])*vs[k]/(vs[k]-vs[prev])\n            out.append([math.floor(tc+0.5),'flood-begins' if vs[k]>0 else 'ebb-begins'])\n        prev=k\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']])], [('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]]', [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]], [[60, 'ebb-begins'], [150, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']])], [('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]]', [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]], [[60, 'ebb-begins'], [150, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], [])], [('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']])], [('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]]', [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]], [[60, 'ebb-begins'], [150, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], [])]]\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":"c96f8dc7bd891951f29a3d2e21bb9ed9ff5f0501ec836832fe69eefeff897f48","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    ts,vs=x\n    out=[]\n    prev=None\n    for k in range(len(vs)):\n        if vs[k]==0: continue\n        if prev is not None and (vs[prev]>0)!=(vs[k]>0):\n            if k-prev>1:\n                tc=(ts[prev+1]+ts[k-1])/2\n            else:\n                tc=ts[prev]+(ts[k]-ts[prev])*vs[prev]/(vs[prev]-vs[k])\n            out.append([math.floor(tc+0.5),'flood-begins' if vs[k]>0 else 'ebb-begins'])\n        prev=k\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']])], [('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]]', [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]], [[60, 'ebb-begins'], [150, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']])], [('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]]', [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]], [[60, 'ebb-begins'], [150, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], [])], [('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']])], [('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]]', [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]], [[60, 'ebb-begins'], [150, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], [])]]\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":"A deterministic toy model with stipulated rules and constants; not certified hydrographic software or a substitute for official tide tables. 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-tide_and_marine_navigation_tables-slack_water-interpolation-fraction","generated_at":"2026-09-29T14:48:08.952231+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Tide tables and passage plans turn published predictions into go/no-go decisions about depth, clearance and timing.","repair":"Use vs[prev]/(vs[prev]-vs[k]).","root_cause":"The fraction uses the later velocity in the numerator.","sha256":"493526a034f4ebcef0b75d0893e977f62cc0800b67b1497b8005398d1c41b726","title":"Slack water from current samples: Slack is interpolated with the wrong velocity ratio · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.3,"exit_code":1,"observations":[{"actual":[[150,"ebb-begins"]],"check":"slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]","expected":[[73,"ebb-begins"]],"passed":false},{"actual":[[75,"flood-begins"]],"check":"slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]","expected":[[75,"flood-begins"]],"passed":true},{"actual":[],"check":"slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]","expected":[],"passed":true},{"actual":[],"check":"slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]","expected":[],"passed":true},{"actual":[[240,"flood-begins"],[180,"ebb-begins"]],"check":"slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]","expected":[[96,"flood-begins"],[180,"ebb-begins"]],"passed":false},{"actual":[[45,"ebb-begins"]],"check":"slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]","expected":[[35,"ebb-begins"]],"passed":false},{"actual":[[90,"ebb-begins"]],"check":"slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]","expected":[[90,"ebb-begins"]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]\", \"actual\": [[150, \"ebb-begins\"]], \"expected\": [[73, \"ebb-begins\"]], \"passed\": false}, {\"check\": \"slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]\", \"actual\": [[75, \"flood-begins\"]], \"expected\": [[75, \"flood-begins\"]], \"passed\": true}, {\"check\": \"slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]\", \"actual\": [[240, \"flood-begins\"], [180, \"ebb-begins\"]], \"expected\": [[96, \"flood-begins\"], [180, \"ebb-begins\"]], \"passed\": false}, {\"check\": \"slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]\", \"actual\": [[45, \"ebb-begins\"]], \"expected\": [[35, \"ebb-begins\"]], \"passed\": false}, {\"check\": \"slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]\", \"actual\": [[90, \"ebb-begins\"]], \"expected\": [[90, \"ebb-begins\"]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.932,"exit_code":1,"observations":[{"actual":[[77,"ebb-begins"]],"check":"slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]","expected":[[73,"ebb-begins"]],"passed":false},{"actual":[[75,"flood-begins"]],"check":"slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]","expected":[[75,"flood-begins"]],"passed":true},{"actual":[],"check":"slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]","expected":[],"passed":true},{"actual":[],"check":"slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]","expected":[],"passed":true},{"actual":[[84,"flood-begins"],[180,"ebb-begins"]],"check":"slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]","expected":[[96,"flood-begins"],[180,"ebb-begins"]],"passed":false},{"actual":[[40,"ebb-begins"]],"check":"slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]","expected":[[35,"ebb-begins"]],"passed":false},{"actual":[[90,"ebb-begins"]],"check":"slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]","expected":[[90,"ebb-begins"]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]\", \"actual\": [[77, \"ebb-begins\"]], \"expected\": [[73, \"ebb-begins\"]], \"passed\": false}, {\"check\": \"slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]\", \"actual\": [[75, \"flood-begins\"]], \"expected\": [[75, \"flood-begins\"]], \"passed\": true}, {\"check\": \"slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]\", \"actual\": [[84, \"flood-begins\"], [180, \"ebb-begins\"]], \"expected\": [[96, \"flood-begins\"], [180, \"ebb-begins\"]], \"passed\": false}, {\"check\": \"slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]\", \"actual\": [[40, \"ebb-begins\"]], \"expected\": [[35, \"ebb-begins\"]], \"passed\": false}, {\"check\": \"slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]\", \"actual\": [[90, \"ebb-begins\"]], \"expected\": [[90, \"ebb-begins\"]], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.772,"exit_code":0,"observations":[{"actual":[[73,"ebb-begins"]],"check":"slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]","expected":[[73,"ebb-begins"]],"passed":true},{"actual":[[75,"flood-begins"]],"check":"slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]","expected":[[75,"flood-begins"]],"passed":true},{"actual":[],"check":"slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]","expected":[],"passed":true},{"actual":[],"check":"slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]","expected":[],"passed":true},{"actual":[[96,"flood-begins"],[180,"ebb-begins"]],"check":"slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]","expected":[[96,"flood-begins"],[180,"ebb-begins"]],"passed":true},{"actual":[[35,"ebb-begins"]],"check":"slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]","expected":[[35,"ebb-begins"]],"passed":true},{"actual":[[90,"ebb-begins"]],"check":"slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]","expected":[[90,"ebb-begins"]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]\", \"actual\": [[73, \"ebb-begins\"]], \"expected\": [[73, \"ebb-begins\"]], \"passed\": true}, {\"check\": \"slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]\", \"actual\": [[75, \"flood-begins\"]], \"expected\": [[75, \"flood-begins\"]], \"passed\": true}, {\"check\": \"slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]\", \"actual\": [[96, \"flood-begins\"], [180, \"ebb-begins\"]], \"expected\": [[96, \"flood-begins\"], [180, \"ebb-begins\"]], \"passed\": true}, {\"check\": \"slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]\", \"actual\": [[35, \"ebb-begins\"]], \"expected\": [[35, \"ebb-begins\"]], \"passed\": true}, {\"check\": \"slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]\", \"actual\": [[90, \"ebb-begins\"]], \"expected\": [[90, \"ebb-begins\"]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}