Download analysis/code/test_magnet_benchmark.py from ekwan16/MagNET: direct link, hf CLI and curl.
- Browser
- Download file 6.08 kB
-
https://huggingface.co/ekwan16/MagNET/resolve/fe222d1894afb2d954fe8d2e67e70731a006c8d2/analysis/code/test_magnet_benchmark.py
- Command line
-
hf download hf://ekwan16/MagNET@fe222d1894afb2d954fe8d2e67e70731a006c8d2/analysis/code/test_magnet_benchmark.py
-
curl -L -o test_magnet_benchmark.py https://huggingface.co/ekwan16/MagNET/resolve/fe222d1894afb2d954fe8d2e67e70731a006c8d2/analysis/code/test_magnet_benchmark.py
6.08 kB
| """Tests for analysis/code/magnet_benchmark.py. | |
| The error statistics and the published-table structure are checked synthetically, so they run in CI | |
| without any model or large dataset. Two more tests are opt-in, gated on real data being present | |
| locally: test_shipped_results_reproduce_published_median_and_mae (the sampled, checkpoint-based | |
| reproduction; see magnet_benchmark_run.py) and test_exact_stats_table_reproduces_published_values_ | |
| exactly (the full, unsampled reproduction from data/magnet_test_predictions/, which is what the | |
| shipped notebook actually uses -- see the module docstring's two reproduction paths). | |
| """ | |
| import os | |
| import sys | |
| import numpy as np | |
| import pytest | |
| HERE = os.path.dirname(os.path.abspath(__file__)) | |
| sys.path.insert(0, HERE) | |
| import paths | |
| import magnet_benchmark as M # noqa: E402 | |
| def test_collect_abs_errors_filters_by_element_and_nan(): | |
| an = [np.array([1, 6, 1, 8])] | |
| pred = [np.array([10.0, 100.0, 11.0, np.nan])] | |
| dft = [np.array([10.1, 102.0, 10.9, 50.0])] | |
| h = M.collect_abs_errors(pred, dft, an, z=1) | |
| c = M.collect_abs_errors(pred, dft, an, z=6) | |
| assert np.allclose(np.sort(h), [0.1, 0.1]) # the two hydrogens | |
| assert np.allclose(c, [2.0]) # the one carbon | |
| # oxygen has a NaN prediction -> dropped, so no oxygen errors survive | |
| assert M.collect_abs_errors(pred, dft, an, z=8).size == 0 | |
| def test_summarize_matches_numpy(): | |
| e = np.array([0.1, 0.2, 0.3, 0.4]) | |
| s = M.summarize(e) | |
| assert s["median_ae"] == pytest.approx(0.25) | |
| assert s["mae"] == pytest.approx(0.25) | |
| assert s["rmse"] == pytest.approx(np.sqrt(np.mean(e ** 2))) | |
| assert s["n"] == 4 | |
| empty = M.summarize(np.array([])) | |
| assert empty["n"] == 0 and np.isnan(empty["mae"]) | |
| def test_error_table_both_nuclei(): | |
| an = [np.array([1, 6])] | |
| pred = [np.array([10.0, 100.0])] | |
| dft = [np.array([10.5, 98.0])] | |
| t = M.error_table(pred, dft, an) | |
| assert t["1H"]["mae"] == pytest.approx(0.5) | |
| assert t["13C"]["mae"] == pytest.approx(2.0) | |
| def test_filter_supported_drops_out_of_vocabulary(): | |
| # second structure contains phosphorus (15), which MagNET was never trained on | |
| ans = [np.array([6, 1, 1]), np.array([6, 1, 15]), np.array([8, 1, 17])] | |
| geos = [np.zeros((3, 3))] * 3 | |
| dfts = [np.zeros(3)] * 3 | |
| a, g, d, dropped = M.filter_supported(ans, geos, dfts) | |
| assert dropped == 1 | |
| assert len(a) == len(g) == len(d) == 2 | |
| assert all(set(np.unique(x).tolist()) <= M.SUPPORTED_ELEMENTS for x in a) | |
| RESULTS = os.path.join(HERE, "..", "..", "data", "magnet_benchmark", "performance_results.csv") | |
| def test_shipped_results_reproduce_published_median_and_mae(): | |
| """The shipped reproduced numbers match the published median and mean absolute error (the robust | |
| statistics). RMSE is intentionally not checked: it is outlier-dominated for the vibrated sets and | |
| needs the full test set (see the module docstring).""" | |
| import csv | |
| # tolerance per nucleus: 1H errors are ~0.03 ppm, 13C ~0.4 ppm, so allow a sampling margin | |
| TOL = {"1H": 0.015, "13C": 0.12} | |
| rows = list(csv.DictReader(open(RESULTS))) | |
| assert len(rows) == 2 * len(M.MODELS) * len(M.TEST_SETS) # 16 rows | |
| for r in rows: | |
| pub_median, pub_mae, _ = M.PUBLISHED[r["nucleus"]][(r["model"], r["test_set"])] | |
| tol = TOL[r["nucleus"]] | |
| tag = f"{r['model']}/{r['test_set']}/{r['nucleus']}" | |
| assert abs(float(r["median_ae"]) - pub_median) < tol, f"{tag} median {r['median_ae']} vs {pub_median}" | |
| assert abs(float(r["mae"]) - pub_mae) < tol, f"{tag} mae {r['mae']} vs {pub_mae}" | |
| def test_predictions_group_matches_documented_naming_scheme(): | |
| # spot-check against the exact group names defined in magnet_benchmark.test_predictions_group | |
| assert M.test_predictions_group("MagNET", "vibrated_external", "13C") == "gasphasedft8k_C_pretrained_C_vib1" | |
| assert M.test_predictions_group("MagNET", "isolated_chloroform", "1H") == "solutesmd500isolated_chloroform_H_pretrained_H" | |
| assert M.test_predictions_group("MagNET-x", "stationary_internal", "1H") == "gasphaseinternal_H_chloroform_H_vib0" | |
| with pytest.raises(ValueError): | |
| M.test_predictions_group("MagNET", "not_a_real_test_set", "1H") | |
| PREDICTIONS_H5 = paths.dataset_file("magnet_test_predictions", file=__file__) | |
| def test_exact_stats_table_reproduces_published_values_exactly(): | |
| """Unlike the sampled test above, this reads the FULL released test sets (no sampling), so median, | |
| MAE, and RMSE should all match the published SI values to float rounding, not just a sampling | |
| tolerance -- this is what the shipped si_table_s03_s04_performance.ipynb notebook actually asserts.""" | |
| sys.path.insert(0, os.path.join(HERE, "..", "..", "data", "magnet_test_predictions")) | |
| import magnet_test_predictions_reader as R | |
| rows = M.exact_stats_table(PREDICTIONS_H5, R) | |
| assert len(rows) == 2 * len(M.MODELS) * len(M.TEST_SETS) | |
| for r in rows: | |
| pub_median, pub_mae, pub_rmse = M.PUBLISHED[r["nucleus"]][(r["model"], r["test_set"])] | |
| tag = f"{r['model']}/{r['test_set']}/{r['nucleus']}" | |
| assert r["median_ae"] == pytest.approx(pub_median, abs=1e-3), tag | |
| assert r["mae"] == pytest.approx(pub_mae, abs=1e-3), tag | |
| assert r["rmse"] == pytest.approx(pub_rmse, abs=1e-3), tag | |
| def test_published_table_structure(): | |
| # both nuclei, both models, all four test sets, triples of finite numbers | |
| for nucleus in ("1H", "13C"): | |
| for model in M.MODELS: | |
| for ts in M.TEST_SETS: | |
| triple = M.PUBLISHED[nucleus][(model, ts)] | |
| assert len(triple) == 3 | |
| assert all(np.isfinite(v) and v > 0 for v in triple) | |
| # the 13C vibrated-internal RMSE is the documented outlier-dominated value | |
| assert M.PUBLISHED["13C"][("MagNET", "vibrated_internal")][2] == pytest.approx(7.1377, abs=1e-3) | |