Skip to content

13 · MODE Lab

Round 4 · Objects · data: real · baked · reimagines MET core (the MODE tool)

The whole MODE pipeline running live in the browser on the real precipitation case:

circular-disc convolution (missing-aware) → threshold → 8-connected objects → attributes (area, centroids, axis angle, aspect, convex hull, complexity, intensity percentiles) → MET’s fuzzy-logic total interest (piecewise-linear maps × the MODEConfig_default weights: boundary 4 · centroid 2 · intersection 2 · angle 1 · area-ratio 1) → matching at total_interest ≥ 0.70 → cluster merging via union-find over the match graph.

The full pipeline re-runs in ~12 ms, so convolution radius, threshold, and the interest threshold are sliders — the interactive feedback MODE’s notoriously fiddly parameters have always lacked.

  • The engine (lib/met-mode.mjs, pure and DOM-free) follows MODE’s structure, attribute set, default weights and interest threshold; the distance-map breakpoints are MET-shaped defaults, rescaled to the grid diagonal in this app (MET’s shipped breakpoints assume a CONUS-size grid) and fully configurable.
  • This archive contains no MODE output, so there is no oracle — correctness rests on lib/met-mode.selftest.mjs (42 checks: hand-worked disc geometry, rectangle moments, known-offset pair distances, interest-engine identities, a merging invariant) plus structural invariants enforced on the real case.
  • Omitted vs full MODE: curvature attributes, percentile-intensity object thresholds, asymmetric fcst/obs configs, secondary merge passes.

The companion spike tools/bench/bench-mtd.mjs answers the matrix’s open MTD question: 3-D (x, y, t) 26-connected labeling of a 24-frame 512² stack takes ~101 ms (~107 MB working set); 24×1024² takes ~379 ms (~428 MB) — feasible on desktop, memory-bound as predicted, verified against a moving-blob case with a known answer.

Single-file build: dist/mode-lab.html (the real case travels with it).