Checksum regression tests
WarpX has checksum regression tests: as part of CI testing, when running a given test, the checksum module computes one aggregated number per field (Ex_checksum = np.sum(np.abs(Ex))
) and compares it to a reference (benchmark). This should be sensitive enough to make the test fail if your PR causes a significant difference, print meaningful error messages, and give you a chance to fix a bug or reset the benchmark if needed.
The checksum module is located in Regression/Checksum/
, and the benchmarks are stored as human-readable JSON files in Regression/Checksum/benchmarks_json/
, with one file per benchmark (for instance, test Langmuir_2d
has a corresponding benchmark Regression/Checksum/benchmarks_json/Langmuir_2d.json
).
For more details on the implementation, the Python files in Regression/Checksum/
should be well documented.
From a user point of view, you should only need to use checksumAPI.py
. It contains Python functions that can be imported and used from an analysis Python script. It can also be executed directly as a Python script. Here are recipies for the main tasks related to checksum regression tests in WarpX CI.
Include a checksum regression test in an analysis Python script
This relies on function evaluate_checksum
:
- Checksum.checksumAPI.evaluate_checksum(test_name, plotfile, rtol=1.e-9, atol=1.e-40, do_fields=True, do_particles=True)
Compare plotfile checksum with benchmark. Read checksum from input plotfile, read benchmark corresponding to test_name, and assert their equality. Parameters ---------- test_name: string Name of test, as found between [] in .ini file. plotfile : string Plotfile from which the checksum is computed. rtol: float, default=1.e-9 Relative tolerance for the comparison. atol: float, default=1.e-40 Absolute tolerance for the comparison. do_fields: bool, default=True Whether to compare fields in the checksum. do_particles: bool, default=True Whether to compare particles in the checksum.
For an example, see
#!/usr/bin/env python3
import os
import re
import sys
sys.path.insert(1, '../../../../warpx/Regression/Checksum/')
import checksumAPI
# this will be the name of the plot file
fn = sys.argv[1]
# Get name of the test
test_name = os.path.split(os.getcwd())[1]
# Run checksum regression test
if re.search( 'single_precision', fn ):
checksumAPI.evaluate_checksum(test_name, fn, rtol=2.e-6)
else:
checksumAPI.evaluate_checksum(test_name, fn)
This can also be included in an existing analysis script. Note that the plotfile must be <test name>_plt?????
, as is generated by the CI framework.
Evaluate a checksum regression test from a bash terminal
You can execute checksumAPI.py
as a Python script for that, and pass the plotfile that you want to evaluate, as well as the test name (so the script knows which benchmark to compare it to).
./checksumAPI.py --evaluate --plotfile <path/to/plotfile> --test-name <test name>
See additional options
--skip-fields
if you don’t want the fields to be compared (in that case, the benchmark must not have fields)--skip-particles
same thing for particles--rtol
relative tolerance for the comparison--atol
absolute tolerance for the comparison (a sum of both is used bynumpy.isclose()
)
Reset a benchmark from a plotfile you know is correct
This is using checksumAPI.py
as a Python script.
./checksumAPI.py --reset-benchmark --plotfile <path/to/plotfile> --test-name <test name>
See additional options
--skip-fields
if you don’t want the benchmark to have fields--skip-particles
same thing for particles
Since this will automatically change the JSON file stored on the repo, make a separate commit just for this file, and if possible commit it under the Tools
name:
git add <test name>.json
git commit -m "reset benchmark for <test name> because ..." --author="Tools <warpx@lbl.gov>"