|
| 1 | +import unittest |
| 2 | +from unittest.mock import Mock |
| 3 | + |
| 4 | +from optillm.rstar import Node, RStar |
| 5 | + |
| 6 | + |
| 7 | +class TestRStarNumericAnswers(unittest.TestCase): |
| 8 | + def setUp(self): |
| 9 | + self.search = RStar("", Mock(), "mock", max_depth=1, num_rollouts=1) |
| 10 | + |
| 11 | + def test_explicit_answers_keep_the_complete_number(self): |
| 12 | + for answer in ("-3", "+3", "1.25", "-0.25", ".5", "-.5", "1.2e-3", "-2E+4", "42"): |
| 13 | + for prefix in ("The answer is", "The final answer is", "Thus, the answer is"): |
| 14 | + with self.subTest(answer=answer, prefix=prefix): |
| 15 | + self.assertEqual( |
| 16 | + self.search.extract_answer(f"{prefix} {answer}."), |
| 17 | + (answer, 1.0), |
| 18 | + ) |
| 19 | + |
| 20 | + def test_fallback_keeps_sign_decimal_and_exponent(self): |
| 21 | + for answer in ("-3", "1.25", "-.5", "1.2e-3", "42"): |
| 22 | + with self.subTest(answer=answer): |
| 23 | + self.assertEqual( |
| 24 | + self.search.extract_answer(f"After 2 steps, we obtain {answer}."), |
| 25 | + (answer, 0.5), |
| 26 | + ) |
| 27 | + |
| 28 | + def test_answer_without_numbers_remains_unknown(self): |
| 29 | + self.assertEqual(self.search.extract_answer("More reasoning is needed."), ("", 0.0)) |
| 30 | + |
| 31 | + def test_signed_answer_receives_explicit_answer_reward(self): |
| 32 | + node = Node("The final answer is -1.25", "A1") |
| 33 | + self.assertEqual(self.search.evaluate(node), 1.0) |
| 34 | + |
| 35 | + def test_answer_voting_does_not_merge_different_decimal_values(self): |
| 36 | + states = ["The answer is 1.25", "The answer is 1.75", "The answer is 1.75"] |
| 37 | + answers = [self.search.extract_answer(state) for state in states] |
| 38 | + self.assertEqual(self.search.select_best_answer(answers), "1.75") |
| 39 | + |
| 40 | + def test_solve_preserves_the_generated_numeric_answer(self): |
| 41 | + self.search.generate_response = Mock(return_value="The final answer is -1.25") |
| 42 | + |
| 43 | + answer, tokens = self.search.solve("Compute the result.") |
| 44 | + |
| 45 | + self.assertEqual(answer, "-1.25") |
| 46 | + self.assertEqual(tokens, 0) |
0 commit comments