from __future__ import annotations from scripts.research.holdout_v4_build import MIN_DOMAINS, MIN_EVENTS, build from scripts.research.minute_resolution_lib import ( aggregate_samples, dynamic_signature_layers, rescale_varga_points, shannon_entropy, subtract_event_floor, varga_divisor, ) from scripts.research.minute_resolution_sweep import all_variants, verdict def test_v4_cases_meet_event_and_domain_floors() -> None: payload = build() assert payload["ayanamsa"] == "raman" assert payload["node_mode"] == "mean" assert len(payload["cases"]) >= 8 for case in payload["cases"]: domains = {item["domain"] for item in case["events"]} assert len(case["events"]) >= MIN_EVENTS, case["case_id"] assert len(domains) >= MIN_DOMAINS, case["case_id"] assert case["birth"]["source"]["rodden_rating"] == "AA" assert str(case["birth"]["time"])[:5] == case["true_minute"] def test_varga_divisor_modes() -> None: assert varga_divisor(1, "2len") == 2.0 assert varga_divisor(3, "2len") == 6.0 assert varga_divisor(3, "len") == 3.0 assert abs(varga_divisor(4, "sqrt") - 2.0) < 1e-9 assert varga_divisor(3, "fixed2") == 2.0 def test_year_aggregation_keeps_peak() -> None: samples = [1.0, 1.0, 12.0] assert aggregate_samples(samples, "mean") == 4.6667 assert aggregate_samples(samples, "max") == 12.0 lse = aggregate_samples(samples, "lse", 1.0) assert lse > aggregate_samples(samples, "mean") assert lse < 12.0 def test_subtract_event_floor_zeroes_the_min() -> None: out = subtract_event_floor({"04:50": 11.0, "04:51": 13.5, "04:52": 11.0}) assert out["04:50"] == 0.0 assert out["04:51"] == 2.5 def test_entropy_is_zero_for_a_spike() -> None: assert shannon_entropy([0, 0, 5]) == 0.0 assert shannon_entropy([1, 1]) > 0.9 def test_varga_rescale_doubles_single_chart_hit() -> None: points = rescale_varga_points( 1.0, ["vim_md_domain_varga", "event_kind:career_change"], "career", "career_change", "day", "len", ) assert points > 1.0 def test_dynamic_layers_drop_md_and_follow_domains() -> None: layers = dynamic_signature_layers(["career", "health_pressure"]) assert layers[0] == "d1" assert "d10" in layers assert "d30" in layers assert "md" not in layers def test_variant_grid_covers_pairs() -> None: names = {item.name for item in all_variants()} assert "baseline" in names assert "R1@len" in names assert "R3@1.0" in names assert "R1+R3" in names pair = next(item for item in all_variants() if item.name == "R1+R3") assert pair.r1 == "len" assert pair.r3 == 1.0 def test_verdict_requires_hit_and_coverage() -> None: baseline = { "n": 10, "top1": 0.2, "coverage": 0.9, "width_median": 21, "tie": 0.8, "squeezed": 1, "entropy0": 3.0, "entropy6": 2.0, "too_narrow": 0, "replay_top1": 0.5, } better = { **baseline, "top1": 0.4, "tie": 0.4, "width_median": 12, "squeezed": 0, } worse = {**baseline, "top1": 0.1, "coverage": 0.7, "squeezed": 3} assert verdict(baseline, better) == "benefit" assert verdict(baseline, worse) == "no_benefit"