feat(eval): Markdown report builder with matplotlib plots
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -111,3 +111,45 @@ class TestKlDivergence:
|
||||
y = np.array([10.0, 10.1, 10.2, 10.3, 10.4])
|
||||
kl = kl_divergence_histograms(x, y, bins=10)
|
||||
assert np.isfinite(kl)
|
||||
|
||||
|
||||
class TestReportGeneration:
|
||||
def test_generates_report_md(self, tmp_path):
|
||||
"""Smoke test: build_report writes an MD file with all expected sections."""
|
||||
from ai_mouse.eval.report import build_report
|
||||
|
||||
# Synthetic generated traces (3 traces, 50 points each)
|
||||
rng = np.random.default_rng(0)
|
||||
gen_traces = []
|
||||
for _ in range(3):
|
||||
xs = np.cumsum(rng.uniform(0, 5, 50))
|
||||
ys = np.cumsum(rng.uniform(-1, 1, 50))
|
||||
ts = np.cumsum(rng.uniform(5, 20, 50))
|
||||
gen_traces.append({"xs": xs, "ys": ys, "ts": ts})
|
||||
|
||||
# Synthetic reference
|
||||
ref_traces = []
|
||||
for _ in range(5):
|
||||
xs = np.cumsum(rng.uniform(0, 5, 50))
|
||||
ys = np.cumsum(rng.uniform(-1, 1, 50))
|
||||
ts = np.cumsum(rng.uniform(5, 20, 50))
|
||||
ref_traces.append({"xs": xs, "ys": ys, "ts": ts})
|
||||
|
||||
out_md = tmp_path / "report.md"
|
||||
build_report(
|
||||
generated_traces=gen_traces,
|
||||
reference_traces=ref_traces,
|
||||
output_md=out_md,
|
||||
tag="smoke-test",
|
||||
model_dir="/fake/model/dir",
|
||||
)
|
||||
assert out_md.exists()
|
||||
content = out_md.read_text(encoding="utf-8")
|
||||
assert "# Eval Report" in content
|
||||
assert "smoke-test" in content
|
||||
assert "速度" in content or "speed" in content.lower()
|
||||
assert "FFT" in content.upper()
|
||||
# PNG plots should exist next to MD
|
||||
plot_dir = tmp_path / "plots"
|
||||
assert plot_dir.exists()
|
||||
assert any(plot_dir.iterdir())
|
||||
|
||||
Reference in New Issue
Block a user