Error on missing secondary lists instead of silently zeroing Stage-2 targets
A parquet that carries child_track_ids/e_sec but was never run through the parent->child join lacks the per-secondary columns (sec_E_list/sec_pdg_list/ sec_dir_list). build_features would fall back to all-zero sec_cont/sec_pdg_idx, collapsing every secondary to PDG index 0 and a constant energy fraction — a broken Stage 2 that trained with no error (single-species validation tables). Add an opt-in require_secondaries flag that raises when n_sec > 0 but the lists are absent, and enable it on the training paths (StreamingStepsDataset and the normalizer-fit pass). giant predict keeps the default False for Stage-1-only use. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -280,3 +280,30 @@ def test_build_features_proc_idx_looks_up_proc_map():
|
||||
*_, proc_idx, _, _ = build_features(data, pdg_map, mat_map, proc_map=proc_map)
|
||||
|
||||
np.testing.assert_array_equal(proc_idx, [0, 1, 2])
|
||||
|
||||
|
||||
def test_build_features_require_secondaries_raises_when_lists_missing():
|
||||
"""A parquet with n_sec > 0 but no per-secondary list columns was never run
|
||||
through the parent->child join; require_secondaries must catch it instead of
|
||||
silently zeroing every Stage-2 target (regression: this collapsed the
|
||||
secondary species to a single PDG index during training)."""
|
||||
data = _minimal_step_data(3)
|
||||
data["n_sec"] = np.array([0, 2, 1], dtype=np.int32) # secondaries, but no lists
|
||||
pdg_map, mat_map = {11: 0}, {"PbWO4": 0}
|
||||
|
||||
with pytest.raises(ValueError, match="per-secondary columns"):
|
||||
build_features(data, pdg_map, mat_map, require_secondaries=True)
|
||||
|
||||
|
||||
def test_build_features_require_secondaries_ok_when_no_secondaries():
|
||||
"""require_secondaries only fires when secondaries actually exist; a file
|
||||
with n_sec == 0 everywhere (e.g. Stage-1-only) must still load."""
|
||||
data = _minimal_step_data(3) # n_sec all zero
|
||||
pdg_map, mat_map = {11: 0}, {"PbWO4": 0}
|
||||
|
||||
_, _, _, _, sec_cont, sec_pdg_idx, *_ = build_features(
|
||||
data, pdg_map, mat_map, require_secondaries=True
|
||||
)
|
||||
|
||||
assert not sec_cont.any()
|
||||
assert not sec_pdg_idx.any()
|
||||
|
||||
Reference in New Issue
Block a user