FA-69106 / Tide and marine navigation tables / Open access
Vertical datum conversion: Unknown datum names pass the value through unchanged · case 01
A typo in the datum name silently yields an unconverted value.
ROOT CAUSE
Unknown names return the input value instead of None.
VERIFIED REPAIR
Return None when either datum is unknown.
Unsuccessful approach: Checking only the source datum and defaulting the target to zero still hides the error.
Case contract
Input [kind, value, frm, to, table]: table lists [datum, offset above chart datum]; CD itself has offset 0 even if absent. Heights and drying heights are measured upward from their datum; depths downward. Converting frm->to: height=value+off[frm]-off[to], depth=value-off[frm]+off[to]. Unknown datum names return None. Result rounded to 3 decimals.
Why this case matters
Tide tables and passage plans turn published predictions into go/no-go decisions about depth, clearance and timing.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
kind,val,frm,to,table=x
off=dict(table)
off.setdefault('CD',0.0)
if frm not in off or to not in off: return round(val,3)
shift=off[frm]-off[to]
if kind=='depth': res=val-shift
else: res=val+shift
return round(res,3)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7), ('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 1.4, 'CD', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 1.7)], [('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 1.4, 'CD', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 1.7), ('vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 0.8, 'MLWS', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -1.1), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["height", 2.0, "CD", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'CD', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 2.0), ('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None)], [('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["height", 2.0, "CD", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'CD', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 2.0), ('vertical datum conversion ["height", 0.0, "LAT", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 0.0, 'LAT', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -0.3), ('vertical datum conversion ["depth", 9.0, "MHWS", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 9.0, 'MHWS', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 4.1), ('vertical datum conversion ["height", 1.0, "MSL", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4]]]', ['height', 1.0, 'MSL', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4]]], 3.7)], [('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 0.0, "LAT", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 0.0, 'LAT', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -0.3), ('vertical datum conversion ["depth", 9.0, "MHWS", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 9.0, 'MHWS', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 4.1), ('vertical datum conversion ["height", 1.0, "MSL", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4]]]', ['height', 1.0, 'MSL', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4]]], 3.7), ('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7), ('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1)], [('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 1.0, "MSL", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4]]]', ['height', 1.0, 'MSL', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4]]], 3.7), ('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7), ('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8)]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 2.0 | None | Failed |
| vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 3.0 | None | Failed |
| vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 0.7 | 0.7 | Passed |
| vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 14.4 | 14.4 | Passed |
| vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 5.1 | 5.1 | Passed |
| vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 5.8 | 5.8 | Passed |
| vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 1.7 | 1.7 | Passed |
SHA-256 / e36e3f66e6cd45c8d12afac64ac4b03fde7b7b4736b97c8fc90f3b76520c22e6
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
kind,val,frm,to,table=x
off=dict(table)
off.setdefault('CD',0.0)
if frm not in off: return None
shift=off[frm]-off.get(to,0.0)
if kind=='depth': res=val-shift
else: res=val+shift
return round(res,3)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7), ('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 1.4, 'CD', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 1.7)], [('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 1.4, 'CD', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 1.7), ('vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 0.8, 'MLWS', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -1.1), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["height", 2.0, "CD", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'CD', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 2.0), ('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None)], [('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["height", 2.0, "CD", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'CD', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 2.0), ('vertical datum conversion ["height", 0.0, "LAT", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 0.0, 'LAT', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -0.3), ('vertical datum conversion ["depth", 9.0, "MHWS", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 9.0, 'MHWS', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 4.1), ('vertical datum conversion ["height", 1.0, "MSL", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4]]]', ['height', 1.0, 'MSL', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4]]], 3.7)], [('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 0.0, "LAT", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 0.0, 'LAT', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -0.3), ('vertical datum conversion ["depth", 9.0, "MHWS", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 9.0, 'MHWS', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 4.1), ('vertical datum conversion ["height", 1.0, "MSL", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4]]]', ['height', 1.0, 'MSL', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4]]], 3.7), ('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7), ('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1)], [('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 1.0, "MSL", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4]]]', ['height', 1.0, 'MSL', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4]]], 3.7), ('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7), ('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8)]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | None | None | Passed |
| vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 3.0 | None | Failed |
| vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 0.7 | 0.7 | Passed |
| vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 14.4 | 14.4 | Passed |
| vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 5.1 | 5.1 | Passed |
| vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 5.8 | 5.8 | Passed |
| vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 1.7 | 1.7 | Passed |
SHA-256 / b111a392c40d3eb90c4686f8ac54a47af8f033330e181aa55f2f125b9104305c
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
kind,val,frm,to,table=x
off=dict(table)
off.setdefault('CD',0.0)
if frm not in off or to not in off: return None
shift=off[frm]-off[to]
if kind=='depth': res=val-shift
else: res=val+shift
return round(res,3)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7), ('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 1.4, 'CD', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 1.7)], [('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 1.4, 'CD', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 1.7), ('vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 0.8, 'MLWS', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -1.1), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["height", 2.0, "CD", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'CD', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 2.0), ('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None)], [('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["height", 2.0, "CD", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'CD', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 2.0), ('vertical datum conversion ["height", 0.0, "LAT", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 0.0, 'LAT', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -0.3), ('vertical datum conversion ["depth", 9.0, "MHWS", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 9.0, 'MHWS', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 4.1), ('vertical datum conversion ["height", 1.0, "MSL", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4]]]', ['height', 1.0, 'MSL', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4]]], 3.7)], [('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 0.0, "LAT", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 0.0, 'LAT', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -0.3), ('vertical datum conversion ["depth", 9.0, "MHWS", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 9.0, 'MHWS', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 4.1), ('vertical datum conversion ["height", 1.0, "MSL", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4]]]', ['height', 1.0, 'MSL', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4]]], 3.7), ('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7), ('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1)], [('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 1.0, "MSL", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4]]]', ['height', 1.0, 'MSL', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4]]], 3.7), ('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7), ('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8)]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | None | None | Passed |
| vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | None | None | Passed |
| vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 0.7 | 0.7 | Passed |
| vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 14.4 | 14.4 | Passed |
| vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 5.1 | 5.1 | Passed |
| vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 5.8 | 5.8 | Passed |
| vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 1.7 | 1.7 | Passed |
SHA-256 / 262060bf04fb404c21cdff5dad0daa0085e21e34eab28f29bb49f9db3531fc24
Verification & scope
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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:48:08.355085+00:00.
Case digest / 98f55e6011c826949e8fda25383284f26a37f4ad0f0a08cfc56694fef122e611