#!/usr/bin/env python3 """Results analyser - loads trial results and generates paper tables. Usage: python run_analysis.py # uses data/results/trial_results.json python run_analysis.py --session path/to.csv # use a session CSV instead """ from __future__ import annotations import argparse import json import logging from pathlib import Path logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s") logger = logging.getLogger(__name__) def main() -> None: parser = argparse.ArgumentParser(description="OmniNPC Results Analyser") parser.add_argument("--session", type=str, default=None, help="Path to session CSV") parser.add_argument("--baseline", type=str, default=None, help="Path to baseline CSV") args = parser.parse_args() from evaluation.results_analyser import ( analyse_session, generate_paper_table, save_paper_results, ) # Prefer trial_results.json (from run_evaluation.py) — these are real benchmark numbers trial_json = Path("data/results/trial_results.json") results = None if trial_json.exists(): with open(trial_json, encoding="utf-8") as f: results = json.load(f) logger.info("Loaded trial results from %s (timestamp: %s)", trial_json, results.get("timestamp", "unknown")) else: # Fall back to session CSV analysis csv_path = args.session if csv_path is None: log_dir = Path("data/logs") csv_files = sorted(log_dir.glob("session_*.csv")) if csv_files: csv_path = str(csv_files[-1]) logger.info("Using most recent session: %s", csv_path) else: logger.error( "No trial_results.json found and no session CSV in data/logs/. " "Run: python run_evaluation.py --trials all --n 50" ) return results = analyse_session(csv_path) baseline = None if args.baseline: baseline = analyse_session(args.baseline) table = generate_paper_table(results, baseline) print("\n" + table) save_paper_results(table, "data/results/PAPER_RESULTS.txt") logger.info("Paper results written to data/results/PAPER_RESULTS.txt") if __name__ == "__main__": main()