///|
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) }