from typing import Optional

from trinity.common.rewards import REWARD_FUNCTIONS
from trinity.common.rewards.math_reward import MathBoxedRewardFn


@REWARD_FUNCTIONS.register_module("math_boxed_reward_naive_dapo")
class NaiveDapoRewardFn(MathBoxedRewardFn):
    def __call__(  # type: ignore
        self,
        response: str,
        truth: Optional[str] = None,
        with_think: Optional[bool] = False,
        format_score_coef: Optional[float] = 0.1,
        **kwargs,
    ) -> dict[str, float]:
        from trinity.common.rewards.naive_dapo_score import compute_score

        score = compute_score(response, truth)  # type: ignore
        return {"accuracy": score, "format_score": 0}


@REWARD_FUNCTIONS.register_module("math_boxed_reward_prime_math")
class PrimeMathRewardFn(MathBoxedRewardFn):
    def __call__(  # type: ignore
        self,
        response: str,
        truth: Optional[str] = None,
        with_think: Optional[bool] = False,
        format_score_coef: Optional[float] = 0.1,
        **kwargs,
    ) -> dict[str, float]:
        from verl.utils.reward_score.prime_math import compute_score

        res = compute_score(response, truth)
        return {"accuracy": res["score"], "format_score": 0}
