FA-69096 / Tide and marine navigation tables / Open access
Vertical datum conversion: Datum offsets are subtracted in reverse order · case 01
Every conversion moves values the wrong way by the offset difference.
ROOT CAUSE
The shift is computed as off[to]-off[frm].
VERIFIED REPAIR
Use off[frm]-off[to].
Unsuccessful approach: Taking the absolute difference is right in only one direction.
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 None
shift=off[to]-off[frm]
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", 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 ["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 ["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 ["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 ["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 ["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 ["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 ["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 ["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 ["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 ["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 ["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 ["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", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 5.5 | 0.7 | Failed |
| vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 9.6 | 14.4 | Failed |
| vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 9.9 | 5.1 | Failed |
| vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | -3.4 | 5.8 | Failed |
| vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 1.1 | 1.7 | Failed |
| vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 2.7 | -1.1 | Failed |
| vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 4.2 | 5.8 | Failed |
SHA-256 / 49d5e4666a00b1040048e92791b1d2b13f18ad228b089deaa67bd1e35b1d42c1
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 or to not in off: return None
shift=abs(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", 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 ["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 ["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 ["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 ["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 ["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 ["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 ["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 ["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 ["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 ["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 ["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 ["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", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 5.5 | 0.7 | Failed |
| vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 9.6 | 14.4 | Failed |
| 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 |
| vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 2.7 | -1.1 | Failed |
| vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 4.2 | 5.8 | Failed |
SHA-256 / 4ef0cc8bb446c69598535fabc5cc04aa9bab48d9b492fee4d35a1b7f4c4c86dc
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", 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 ["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 ["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 ["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 ["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 ["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 ["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 ["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 ["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 ["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 ["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 ["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 ["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", 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 |
| vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | -1.1 | -1.1 | Passed |
| vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]] | 5.8 | 5.8 | Passed |
SHA-256 / 4aa97a78252ca45687efd9f1f095a5dba4eb6c719f29eb5a224d50ca938f2882
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.272014+00:00.
Case digest / 690e7f0828d58f03d32cc7a22418c302e3d959397fc4e13adc4b64a200f91265