Skip to content

[PROBE] mass/runoff-nonlinear-response #7

Description

@binbinlan

Conservation law

mass

Residual equation

R_recession = Q(t) - Q(0) * exp(-t/K) [mm/day]

R_extreme = max(Q_peak) / P_total [dimensionless]

Tolerance and its denominator

For the recession test, the tolerance is a goodness‑of‑fit criterion: the coefficient of determination R² ≥ 0.95.

For the extreme rainfall test, the tolerance is R_extreme ≤ 1.05 (allowing a 5% numerical error). The denominator is the total precipitation P_total. The test is not applied when P_total < 1 mm (absolute lower bound).

How would an unphysical model fail this?

An unphysical model could "cheat" in the following ways:

Recession phase: The model outputs runoff with non‑physical oscillations during dry periods (e.g., due to drift in LSTM hidden states) instead of a monotonic exponential decay. Even though the hydrograph may look “acceptable”, the fitted recession curve would have an R² significantly below 0.95.

Extreme rainfall: The model over‑responds to extreme storms, producing peak runoff that exceeds the total precipitation (e.g., by erroneously releasing part of its “memory” of storage on top of the incoming rainfall).

Corresponding checks: recession_shape verifies whether the recession follows an exponential decay; peak_bounds verifies whether the runoff peak exceeds the total rainfall during extreme events.

How is the case generated?

The generator constructs two types of test scenarios:

Recession scenario: A 180‑day forcing series – the first 60 days with normal rainfall, followed by 120 days of no rain. The test checks whether the model’s runoff during the rain‑free period decays exponentially.

Extreme rainfall scenario: A 30‑day series containing a 3‑day extreme storm with a total of 100 mm (approximately 5–10 times the normal monthly rainfall). The test checks whether the peak runoff exceeds this 100 mm.

All cases are generated on‑the‑fly with random seeds to prevent the model from memorising specific examples.

Will you build it?

Yes — assign it to me

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    acceptedProposal approved and assignedprobe-proposalA proposed new probe

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions