"""Solution for labels_practice.py."""
import math

FIELDS = ["intent", "order_id", "sku", "urgency"]


def same_answer(a: dict, b: dict) -> bool:
    return all(str(a.get(f)).lower() == str(b.get(f)).lower() for f in FIELDS)


def copied_mistakes(teacher: list[dict], student: list[dict], truth: list[dict]) -> tuple[int, int]:
    wrong = [i for i, (t, g) in enumerate(zip(teacher, truth)) if not same_answer(t, g)]
    return len(wrong), sum(same_answer(student[i], teacher[i]) for i in wrong)


def dpo_loss(pol_c: float, pol_r: float, ref_c: float, ref_r: float, beta: float) -> float:
    margin = beta * ((pol_c - ref_c) - (pol_r - ref_r))
    # -log(sigmoid(m)) = log(1 + e^-m), written so a large margin doesn't overflow
    return math.log1p(math.exp(-margin)) if margin > -30 else -margin


def coverage(graded: dict[str, list[bool]]) -> dict:
    n = len(graded)
    kept = {e: ticks.index(True) for e, ticks in graded.items() if any(ticks)}
    return {"pass1": sum(t[0] for t in graded.values() if t) / n, "passk": len(kept) / n,
            "never": n - len(kept), "kept": kept}
