Tasks/Earth & Energy/Geoscience

Sparse-Gauge Tidal Friction Field Inversion

Invert seabed friction from sparse tide gauges

tidal_friction_inverse Earth & Energy Geoscience
instruction.mdthis is what the agent is given

Design a calibration method for the spatially varying seabed friction field of a tidal basin, starting from a deliberately weak homogeneous-friction solver. Minimize complex tidal-elevation RMSE at unobserved gauges; your submitted method is re-run on sealed basins and sealed gauges for scoring.

Hard Constraints

  • Modify only /app/methods/main/solver.py as the final submission.
  • Keep the public function estimate_logf(case) and return one finite numpy array with shape (24, 24).
  • Use only information in case; do not read validation heads inside the solver.
  • The returned log-friction field must stay in [-3.0, 1.0].
  • A solver call must finish within 60 seconds on two CPU cores and use no network.

What You Have

  • /app/problem.py: the frequency-domain shallow-water tidal simulator (solve_field / simulate) and case schema.
  • /app/data/visible_cases.npz: six calibration cases, each with known bathymetry, the forced open-boundary tide, sparse observed-gauge complex elevations, and separate validation gauges.
  • /app/methods/main/solver.py: a homogeneous weak baseline.
  • /app/selfcheck.py: runs the solver on all visible cases and reports validation-gauge elevation RMSE only.

The inverse problem is deliberately ill-posed: friction is a spatial field, the elliptic tidal response smooths away its fine structure, and gauges are sparse, so many friction fields fit the observed gauges while disagreeing elsewhere. Additionally, a fraction of the observed gauges are faulty — they carry gross, non-Gaussian errors unrelated to the true tide — and which gauges are faulty is not disclosed. The separate validation gauges are clean.

What You Submit

Submit /app/methods/main/solver.py. It should infer a full log-friction field from each case's bathymetry, boundary forcing, observed gauge locations, and observed complex elevations. You may implement optimization, basis design, regularization, adjoint/gradient methods, ensembling, or other numerical methods inside that file.

How It Is Judged

The verifier imports your solver in a restricted child process, gives it new anonymized cases without validation heads, and uses the trusted simulator to compute complex tidal-elevation RMSE at sealed gauges. Lower RMSE is better; the score increases monotonically after clearing the disclosed weak-baseline gate of 0.14, and beating the reference solver is the goal.

Metric

mean gauge RMSE over the eight sealed basins · lower is better

RMSE of simulated vs true heads at each basin's sealed scoring gauges, via the trusted tidal simulator

anchorheld-outreward
Bweak homogeneous baseline (logf=-1)0.1390.00
Rreference solver (robust IRLS)0.01460.30
SSOTA (hard reject + CV refit)0.0078050.60
Unoise floor sqrt(2)*sigma0.0042431.00
normalisation
m >= B0
B > m >= R0.3 * (u(m) - u(B)) / (u(R) - u(B))
R > m >= S0.3 + 0.3 * (u(m) - u(R)) / (u(S) - u(R))
S > m >= U0.6 + 0.4 * (u(m) - u(S)) / (u(U) - u(S))
m < U1

m = this run's held-out metric  ·  B = weak homogeneous baseline (logf=-1)  ·  R = reference solver (robust IRLS)  ·  S = SOTA (hard reject + CV refit)  ·  U = noise floor sqrt(2)*sigma

u(x) = -log10(x), so reward is piecewise-linear in decades of RMSE. Mapped per sealed basin against the four anchors, then averaged.

Rollouts

129 minwall clock
$28.15spend
44.9Mtokens
21versions, 12 kept
0 0.025 0.050 0.075 0.100 0.125 $0 $7.5 $15 $22 cumulative spend on the run self-check RMSE, six visible cases, lower is better v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21
keptrevertedno scoreturning point
  1. v1Inherited baseline: homogeneous logf = -1 everywhere0.1294271 min · $0.20
  2. v2Fit one homogeneous logf, trimming the two largest gauge residuals0.042152 min · $0.30
  3. v3Invert 8 low-frequency DCT modes: soft-L1 fit, drop two residuals, clean refitFriction is a field, not a scalar, so invert in the few smooth modes the elliptic tidal response can still resolve.0.0122514 min · $0.51
  4. v415 DCT modes, base ridge weakened to 1e-40.01273710 min · $1.12
  5. v525 DCT modes at base ridge 1e-40.01144815 min · $1.62
  6. v6Cut the first-stage soft-L1 scale from 0.02 to 0.0080.01144721 min · $2.33
  7. v7Return the converged soft-L1 field, no trimming or clean refit0.01968422 min · $2.48
  8. v8Raise DCT rank from 25 to 350.01192432 min · $3.91
  9. v935 KL modes from 2,000 draws of the disclosed friction priorThe generator's prior is disclosed: sample it and fit in its own eigenmodes, with the ridge scaled by eigenvalue.0.01191137 min · $4.79
  10. v10Fall back to DCT-8 when KL and DCT disagree and gauge coverage is sparse0.01191146 min · $6.22
  11. v11Rank 100 KL modes by prior sigma times head sensitivity, keep the top 350.01182258 min · $8.51
  12. v12Weaken the KL ridge by 15%0.01173266 min · $10.45
  13. v13Continuation: robust fit in 8 modes finds the outliers, clean refit in 35Naming the faulty gauges needs few modes, resolving the field needs many; screen coarse, then refit fine from it.0.01105369 min · $11.11
  14. v14Coarse continuation rank 8 -> 40.01184875 min · $12.33
  15. v15Run both ranks; take rank-4 only when its posterior cost is 0.8x rank-80.01105380 min · $13.41
  16. v16Widen the goal-oriented KL basis from 35 to 50 modes0.01112588 min · $15.70
  17. v17Order the top 50 modes per basin by finite-difference head sensitivity0.01113391 min · $16.45
  18. v18Jacobian column scaling in every least-squares stage0.01113398 min · $18.27
  19. v19Halve the ridge on active modes 36-50 only0.011902106 min · $20.90
  20. v20Prescreen every second-outlier index when the second residual is small0.011125125 min · $26.43
  21. v21Cleanup: drop the abandoned DCT and fallback paths; behaviour unchanged0.011125128 min · $27.91

21 snapshots in 129 min for $28.15. Visible six flat after v3; keeps were judged on disjoint generator seed panels, not on the six.

On the hidden set

held-out metricreward
weak homogeneous baseline (logf=-1)0.1390.00
reference solver (robust IRLS)0.01460.30
SOTA (hard reject + CV refit)0.0078050.60
noise floor sqrt(2)*sigma0.0042431.00
this run0.0069110.7153
32 minwall clock
$5.22spend
6.3Mtokens
21versions, 12 kept
0.025 0.050 0.075 0.100 0.125 $0 $1.5 $3 $4.5 cumulative spend on the run self-check RMSE, six visible cases, lower is better v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20
keptrevertedno scoreturning point
  1. v0Inherited baseline: homogeneous logf = -1 everywhere0.1294271 min · $0.18
  2. v1Fit one homogeneous logf, trimming the two largest gauge residuals12% of gauges are disclosed as faulty, so drop the two worst squared residuals before calibrating a single friction value.0.0421452 min · $0.26
  3. v2Add 8 cosine modes through degree 2, prior widths from generator drawsGive friction spatial structure, but only as much as the generator supports: each mode's prior width is measured, not guessed.0.0152043 min · $0.36
  4. v3Widen the basis to 15 modes through degree 30.0143474 min · $0.50
  5. v4Weaken the coefficient-prior scale from 0.02 to 0.010.0129635 min · $0.59
  6. v5Weaken the prior scale again to 0.0050.0121576 min · $0.68
  7. v6Prior scale 0.00250.0131727 min · $0.78
  8. v7Degree-4 basis (24 modes), prior widths from 2,000 generator draws0.0123729 min · $1.05
  9. v8Prior scale 0.0075 on the degree-4 model0.01268510 min · $1.22
  10. v9Sixth spectral band, 35 modes in total0.01243614 min · $1.71
  11. v10Four-fold clean-gauge CV picks basis degree and prior per basinnot run on visible six17 min · $2.04
  12. v11Double the prior penalty on the frequency-4 modes only0.0123718 min · $2.30
  13. v1224-mode whitening prior from a 5,000-draw generator covariancePer-mode penalties assume independent generator coefficients; the covariance says otherwise, so whiten whole fields instead.0.01263521 min · $2.74
  14. v13Whitening-prior scale 0.0040.01279521 min · $2.89
  15. v14Whitening-prior scale 0.0060.01271223 min · $3.15
  16. v15Mild 0.02 penalty pulling the field mean toward logf = -10.01267124 min · $3.41
  17. v16Strengthen that global-mean penalty to 0.050.01284525 min · $3.67
  18. v17Global-mean penalty 0.100.013126 min · $3.95
  19. v18Bad-gauge count from the published 12% rate, one re-screen and refit0.01284528 min · $4.27
  20. v19Try four second-outlier exclusions, keep the best training objectivenot run on visible six29 min · $4.55
  21. v20Cleanup: drop unused prior constants; behaviour identical to v180.01284532 min · $5.03

21 snapshots in 32 min for $5.02. Keeps were decided on a 48-seed generator panel, not the visible six, where four keeps score worse than v5.

On the hidden set

held-out metricreward
weak homogeneous baseline (logf=-1)0.1390.00
reference solver (robust IRLS)0.01460.30
SOTA (hard reject + CV refit)0.0078050.60
noise floor sqrt(2)*sigma0.0042431.00
this run0.0074820.6444
302 minwall clock
$17.37spend
21.7Mtokens
12versions, 11 kept
0.007 0.015 0.022 0.030 0.037 $0 $4 $8 $12 $16 cumulative spend on the run 40-seed tune-panel RMSE (10000-10039), lower is better v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12
keptrevertedno scoreturning point
  1. v1Adjoint Gauss-Newton: 160-mode DCT prior basis, LM damping, Tukey IRLSOne sparse LU plus an adjoint solve per gauge gives the exact PDE Jacobian, making full Gauss-Newton over 160 modes affordable.0.037188 min · $1.04
  2. v2Hyperparameter sweep: ridge 0.02 to 1e-4, 160 to 300 modes, higher floor0.0151612 min · $1.53
  3. v3Leave-one-out CV picks the ridge per case and flags faulty gaugesMove selection onto held-out gauges, which is what the sealed metric measures; gauges no ridge level can predict get flagged.0.0139519 min · $2.25
  4. v4Closed-form blocked Sherman-Morrison LOO replaces refits; 8-point grid0.0136522 min · $2.73
  5. v5Add the missing spatial-mean mode, freeing the background friction levelProjecting the true field onto the basis still scored 0.12: with no constant mode the mean friction level stayed frozen.0.0102731 min · $3.63
  6. v6Refactor to an explicit basis argument; multi-prior candidates dropped0.0106951 min · $4.86
  7. v7Dual-form dense algebra plus a 42 s wall-clock guard for the 2-core quota0.01025165 min · $10.51
  8. v8Symmetric-mode sparse LU, real products; same scores, 4x faster worst case0.01025169 min · $11.16
  9. v9Selection variants: shifted alpha, median aggregation, wider gridsall within noise177 min · $11.61
  10. v10Multi-start over the background friction level, judged by held-out score0.00976211 min · $13.39
  11. v11Cleanup: drop inert knobs; multi-start becomes the one selection path0.00976259 min · $15.00
  12. v12Fail-safe config hook so a malformed SOLVER_CFG cannot raise at import0.00976283 min · $16.19

12 snapshots, $16.19 by v12. Two hours sit between v6 and v7 on runtime alone: 2-core quota while BLAS sees 96, solver calls 42-80 s against 60 s.

On the hidden set

held-out metricreward
weak homogeneous baseline (logf=-1)0.1390.00
reference solver (robust IRLS)0.01460.30
SOTA (hard reject + CV refit)0.0078050.60
noise floor sqrt(2)*sigma0.0042431.00
this run0.0080310.6129
25 minwall clock
$0.43spend
1.6Mtokens
1versions, 1 kept

No trajectory curve: this run left one comparable self-check measurement, so there is nothing to plot against spend. The versions and what each one changed are below.

  1. v14x4 control grid bilinear-upscaled to 24x24, Cauchy loss, L2 pull, L-BFGS-BCauchy influence drops to zero on the faulty gauges, and 16 control points keep 22 observations from overfitting 576 pixels.0.01283425 min · $0.37

One snapshot in 25 min for $0.43. Loss shape, grid size, ridge and init were swept in a throwaway sandbox; only the winning config was written back.

On the hidden set

held-out metricreward
weak homogeneous baseline (logf=-1)0.1390.00
reference solver (robust IRLS)0.01460.30
SOTA (hard reject + CV refit)0.0078050.60
noise floor sqrt(2)*sigma0.0042431.00
this run0.0117130.4633