Skip to content

Schemas API

decision_bench.schemas.DecisionExample

Bases: BaseModel

One frozen DecisionBench example.

Source code in src/decision_bench/schemas.py
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
class DecisionExample(BaseModel):
    """One frozen DecisionBench example."""

    model_config = ConfigDict(extra="forbid")

    row_id: str = Field(min_length=1)
    task_name: str = Field(min_length=1)
    primitive: Primitive
    family: str = Field(min_length=1)
    domain: str = Field(min_length=1)
    instruction: str = Field(min_length=1)
    state: JsonValue
    candidates: list[Candidate] = Field(min_length=2, max_length=255)
    gold_candidate_id: str = Field(min_length=1)
    gold_probabilities: list[float]
    source: dict[str, JsonValue] = Field(default_factory=dict)

    @model_validator(mode="after")
    def validate_candidates(self) -> DecisionExample:
        ids = [candidate.id for candidate in self.candidates]
        if len(ids) != len(set(ids)):
            raise ValueError("candidate IDs must be unique")
        if self.gold_candidate_id not in ids:
            raise ValueError("gold_candidate_id must name one candidate")
        if len(self.gold_probabilities) != len(ids):
            raise ValueError("gold_probabilities must align to candidate order")
        if any(
            not math.isfinite(value) or value < 0.0 or value > 1.0
            for value in self.gold_probabilities
        ):
            raise ValueError("gold probabilities must be finite values from 0 to 1")
        if not math.isclose(sum(self.gold_probabilities), 1.0, abs_tol=1e-6):
            raise ValueError("gold probabilities must sum to 1 within 1e-6")
        gold_index = max(range(len(ids)), key=self.gold_probabilities.__getitem__)
        if ids[gold_index] != self.gold_candidate_id:
            raise ValueError("gold_candidate_id must be an argmax of gold_probabilities")
        if self.primitive is Primitive.BINARY_CLASSIFICATION and len(ids) != 2:
            raise ValueError("binary classification requires exactly two candidates")
        if self.primitive is Primitive.ORDINAL_SCORING:
            values = [candidate.ordinal_value for candidate in self.candidates]
            if any(value is None for value in values):
                raise ValueError("ordinal scoring requires ordinal_value on every candidate")
            concrete = [float(value) for value in values if value is not None]
            if len(concrete) != len(set(concrete)):
                raise ValueError("ordinal candidates must have unique ordinal_value values")
        return self

decision_bench.schemas.DecisionPrediction

Bases: BaseModel

A calibrated distribution aligned to the input candidate order.

Source code in src/decision_bench/schemas.py
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
class DecisionPrediction(BaseModel):
    """A calibrated distribution aligned to the input candidate order."""

    model_config = ConfigDict(extra="forbid")

    probabilities: list[float]

    @model_validator(mode="after")
    def validate_probabilities(self) -> DecisionPrediction:
        if not self.probabilities:
            raise ValueError("probabilities must not be empty")
        if any(
            not math.isfinite(value) or value < 0.0 or value > 1.0
            for value in self.probabilities
        ):
            raise ValueError("probabilities must be finite values from 0 to 1")
        total = sum(self.probabilities)
        if total <= 0.0:
            raise ValueError("probabilities must have a positive sum")
        self.probabilities = [value / total for value in self.probabilities]
        return self

decision_bench.schemas.ScoredPrediction

Bases: BaseModel

Prediction plus evaluator-derived values.

Source code in src/decision_bench/schemas.py
101
102
103
104
105
106
107
108
109
110
class ScoredPrediction(BaseModel):
    """Prediction plus evaluator-derived values."""

    row_id: str
    probabilities: list[float]
    gold_probabilities: list[float]
    selected_candidate_id: str
    gold_candidate_id: str
    correct: bool
    expected_ordinal_score: float | None = None