| """Per-session game state.""" |
| from __future__ import annotations |
| from dataclasses import dataclass, field |
| from typing import Literal |
| from .case_loader import CaseData |
|
|
|
|
| Method = Literal["dempster", "yager", "pcr5", "cautious"] |
|
|
|
|
| @dataclass |
| class Turn: |
| role: str |
| content: str |
|
|
|
|
| @dataclass |
| class Deposition: |
| witness_id: str |
| mass: dict[frozenset[str], float] |
| summary: str |
| alpha: float = 0.0 |
|
|
|
|
| @dataclass |
| class Verdict: |
| suspect: str |
| method: Method |
| suspicion: float |
| threshold: float |
|
|
|
|
| @dataclass |
| class CaseState: |
| session_id: str |
| case_id: str |
| days_remaining: int |
| transcripts: dict[str, list[Turn]] = field(default_factory=dict) |
| depositions: list[Deposition] = field(default_factory=list) |
| active_method: Method = "dempster" |
| combined_mass: dict[frozenset[str], float] | None = None |
| bel: dict[str, float] | None = None |
| pl: dict[str, float] | None = None |
| conflict_K: float | None = None |
| verdict: Verdict | None = None |
| outcome: Literal["just", "wrongful", "cold", "mistrial"] | None = None |
|
|
| @classmethod |
| def start(cls, session_id: str, case: CaseData) -> "CaseState": |
| return cls( |
| session_id=session_id, |
| case_id=case.case_id, |
| days_remaining=case.court_days, |
| transcripts={w.id: [] for w in case.witnesses}, |
| active_method=case.methods_available[0], |
| ) |
|
|