| from collections import Counter | |
| class Evaluator: | |
| def compute_metrics(self, session: dict) -> dict: | |
| iterations = session.get("iterations", []) | |
| success = session.get("success", False) | |
| total_time = session.get("total_time", 0.0) | |
| n = len(iterations) | |
| error_types = [ | |
| it["error"]["type"] | |
| for it in iterations | |
| if it.get("status") == "failed" and "error" in it | |
| ] | |
| exec_times = [ | |
| it["execution"].get("elapsed", 0.0) | |
| for it in iterations | |
| if "execution" in it | |
| ] | |
| code_lengths = [ | |
| len(it.get("code", "").splitlines()) | |
| for it in iterations | |
| ] | |
| return { | |
| "total_iterations": n, | |
| "success": success, | |
| "total_time_s": total_time, | |
| "avg_exec_time_s": round(sum(exec_times) / len(exec_times), 3) if exec_times else 0, | |
| "error_types": error_types, | |
| "error_distribution": dict(Counter(error_types)), | |
| "code_lengths": code_lengths, | |
| "iterations_to_success": n if success else None, | |
| } | |
| def build_chart_data(self, iterations: list) -> dict: | |
| labels = [f"Iter {it['iteration']}" for it in iterations] | |
| statuses = [1 if it.get("status") == "success" else 0 for it in iterations] | |
| exec_times = [it["execution"].get("elapsed", 0) for it in iterations if "execution" in it] | |
| code_lengths = [len(it.get("code", "").splitlines()) for it in iterations] | |
| error_types = [ | |
| it["error"]["type"] | |
| for it in iterations | |
| if it.get("status") == "failed" and "error" in it | |
| ] | |
| error_dist = dict(Counter(error_types)) | |
| return { | |
| "labels": labels, | |
| "statuses": statuses, | |
| "exec_times": exec_times, | |
| "code_lengths": code_lengths, | |
| "error_distribution": error_dist, | |
| } | |