File size: 1,107 Bytes
acf77ab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from __future__ import annotations

from collections import Counter
from dataclasses import asdict

from codeforge.models import AuditEntry


class AuditLedger:
    """Per-episode, per-step append-only audit log."""

    def __init__(self) -> None:
        self._entries: list[AuditEntry] = []

    def append(self, entry: AuditEntry) -> None:
        self._entries.append(entry)

    def entries(self) -> tuple[AuditEntry, ...]:
        return tuple(self._entries)

    def total_reward(self) -> float:
        return sum(e.reward for e in self._entries)

    def citation_count(self) -> dict[str, int]:
        counts: Counter[str] = Counter()
        for entry in self._entries:
            counts.update(entry.cited_skill_ids)
        return dict(counts)

    def step_count(self) -> int:
        return len(self._entries)

    def serialize(self) -> dict[str, object]:
        return {
            "entries": [asdict(e) for e in self._entries],
            "total_reward": self.total_reward(),
            "step_count": self.step_count(),
            "citation_count": self.citation_count(),
        }