///|
fn format_metric(value : Double) -> String {
let scaled = (value * 10000.0).round() / 10000.0
scaled.to_string()
}
///|
pub fn render_markdown_report(report : BenchmarkReport) -> String {
let builder = StringBuilder()
let cutoff_text = report.cutoffs
.map(fn(cutoff) { cutoff.to_string() })
.join(", ")
builder.write_string("# MoonRAGBench Report\n\n")
builder.write_string("- Queries: \{report.query_count}\n")
builder.write_string("- Cutoffs: \{cutoff_text}\n")
builder.write_string("- Relevant threshold: \{report.relevant_threshold}\n\n")
builder.write_string("## Summary\n\n")
builder.write_string("| Metric | Mean | Min | Max |\n")
builder.write_string("| --- | ---: | ---: | ---: |\n")
for metric in report.summary {
builder.write_string(
"| \{metric.name} | \{format_metric(metric.mean)} | \{format_metric(metric.min)} | \{format_metric(metric.max)} |\n",
)
}
builder.write_string("\n## Queries\n\n")
builder.write_string("| Query | Relevant | Retrieved | Key Metrics |\n")
builder.write_string("| --- | ---: | ---: | --- |\n")
for query in report.queries {
let key_metrics = report.cutoffs
.map(fn(cutoff) {
let recall = query.metrics.get_or_default(
metric_name("recall", cutoff),
0.0,
)
let ndcg = query.metrics.get_or_default(
metric_name("ndcg", cutoff),
0.0,
)
"R@\{cutoff}=\{format_metric(recall)}, nDCG@\{cutoff}=\{format_metric(ndcg)}"
})
.join("
")
builder.write_string(
"| \{query.query_id} | \{query.relevant_total} | \{query.retrieved_total} | \{key_metrics} |\n",
)
}
builder.to_string()
}
///|
pub fn render_compact_report(report : BenchmarkReport) -> String {
let lines : Array[String] = []
let cutoff_text = report.cutoffs
.map(fn(cutoff) { cutoff.to_string() })
.join(",")
lines.push("MoonRAGBench")
lines.push("queries=\{report.query_count} cutoffs=\{cutoff_text}")
for metric in report.summary {
lines.push(
"\{metric.name}: mean=\{format_metric(metric.mean)} min=\{format_metric(metric.min)} max=\{format_metric(metric.max)}",
)
}
lines.join("\n")
}
///|
pub fn render_json_report(report : BenchmarkReport) -> String {
ToJson::to_json(report).stringify(indent=2)
}