Computing Library › Verification Validation
Verification Validation

Continuous Integration for Science

Every change automatically builds the code and runs the verification suite, so defects surface within minutes instead of at publication.

Automating the Checks

Continuous integration (CI) is the practice of automatically building and testing code every time it changes. Borrowed from software engineering, it is increasingly standard in scientific computing. A CI system watches the repository, and on each commit it compiles the code, runs the test suite, and reports pass or fail. The payoff is speed: a defect that would once have lurked until someone noticed a wrong figure is caught within minutes of the commit that caused it.

A Typical Pipeline

Scientific Twists

Scientific CI has wrinkles that ordinary software CI does not. Some verification cases are too expensive for every commit and must be scheduled. Results depend on numerical tolerances rather than exact matches, so the test harness must compare with tolerance. And reproducibility across hardware means the CI environment itself must be pinned, often in a container, so that a test failure reflects a code change and not a library update.

python

# a tolerance-based check used inside a CI test
def check(value, reference, rtol=1e-9, atol=1e-12):
    err = abs(value - reference)
    ok = err <= atol + rtol*abs(reference)
    assert ok, f'regression: got {value}, expected {reference}, err {err:g}'

Why It Belongs in V&V

CI is the mechanism that keeps verification and reproducibility continuous rather than episodic. It enforces that the manufactured-solution tests, benchmark comparisons, and regression checks actually run, on a known environment, on every change. Without automation these tests decay, run rarely, and eventually stop reflecting the current code. With it, the verified state of the code is a property that is continuously confirmed.