Build holdout v4 from the public AA set, correct the two v3 dates, and sweep R1–R5 plus pairs offline. No production scoring defaults change. No implementation brief: delivered width stays the full window on every radius.
98 lines
3.2 KiB
Python
98 lines
3.2 KiB
Python
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"
|