diff --git a/evaluate_egospeak_opportunity_events.py b/evaluate_egospeak_opportunity_events.py index 788b9c7..c0d8fe6 100755 --- a/evaluate_egospeak_opportunity_events.py +++ b/evaluate_egospeak_opportunity_events.py @@ -173,8 +173,8 @@ def _candidate_region( field="region_end_seconds", uid=uid, ) - if end <= start: - raise ValueError(f"{uid}: opportunity region must have positive duration") + if end < start: + raise ValueError(f"{uid}: opportunity region ends before it starts") return start, end diff --git a/test_evaluate_egospeak_opportunity_events.py b/test_evaluate_egospeak_opportunity_events.py index 05741a5..fd74ee3 100644 --- a/test_evaluate_egospeak_opportunity_events.py +++ b/test_evaluate_egospeak_opportunity_events.py @@ -183,6 +183,27 @@ class OpportunityEventTests(unittest.TestCase): 1, ) + def test_zero_duration_mined_opportunity_is_skipped_not_fatal(self) -> None: + temporary, path = self.write_reviews([ + reviewed_row( + "zero-gap", + family="entry", + verdict="HARD_NEGATIVE", + subtype="ENTRY_OTHER_TO_OTHER", + anchor=2.0, + region_start=2.0, + region_end=2.0, + candidate_source="OTHER_TO_OTHER", + ) + ]) + self.addCleanup(temporary.cleanup) + events, diagnostics = load_opportunity_events([path], ["Session_4"]) + self.assertEqual(events, []) + self.assertEqual( + diagnostics["skipped"]["entry_nonpositive_opportunity_duration"], + 1, + ) + def test_entry_score_uses_max_wearer_probability_before_resolution(self) -> None: event = OpportunityEvent( "entry", "Session_4", "entry", True, "WEARER_ENTRY", "WEARER_ONSET",