diff --git a/reasoning_gym/algorithmic/palindrome_generation.py b/reasoning_gym/algorithmic/palindrome_generation.py index 6d29e425..0ae0cb11 100644 --- a/reasoning_gym/algorithmic/palindrome_generation.py +++ b/reasoning_gym/algorithmic/palindrome_generation.py @@ -5,6 +5,7 @@ from typing import Optional from ..factory import ProceduralDataset, register_dataset + @dataclass class PalindromeConfig: """ @@ -15,6 +16,7 @@ class PalindromeConfig: - seed: Optional seed for reproducibility. - size: Number of palindrome samples in the virtual dataset. """ + min_length: int = 3 max_length: int = 10 seed: Optional[int] = None @@ -30,6 +32,7 @@ class PalindromeDataset(ProceduralDataset): """ Generates a set of letters that can be assembled into a palindrome. """ + def __init__(self, config: PalindromeConfig): super().__init__(config=config, seed=config.seed, size=config.size) @@ -50,7 +53,7 @@ class PalindromeDataset(ProceduralDataset): palindrome = self._assemble_palindrome(letters) question_str = ( - f"Rearrange these letters to form a palindrome (a word, phrase, or sequence that remains the same in reverse): {', '.join(scrambled_letters)}\n\n" + f"Rearrange these letters to form a palindrome (a word, phrase, or sequence that remains the same in reverse): {', '.join(scrambled_letters)}\n\n" "Example format:\n" "racecar\n\n" "What is your palindrome?" diff --git a/tests/test_palindrome.py b/tests/test_palindrome.py index 3af02379..b5bb18f2 100644 --- a/tests/test_palindrome.py +++ b/tests/test_palindrome.py @@ -2,16 +2,18 @@ import pytest from reasoning_gym.algorithmic.palindrome_generation import PalindromeConfig, PalindromeDataset + def test_palindrome_config_validation(): """Test that invalid configs raise appropriate errors""" with pytest.raises(AssertionError): config = PalindromeConfig(min_length=0) # Too short config.validate() - + with pytest.raises(AssertionError): config = PalindromeConfig(min_length=5, max_length=3) # Invalid range config.validate() + def test_palindrome_deterministic(): """Test that dataset generates same items with same seed""" config = PalindromeConfig(seed=42, size=10) @@ -21,6 +23,7 @@ def test_palindrome_deterministic(): for i in range(len(dataset1)): assert dataset1[i] == dataset2[i] + def test_palindrome_items(): """Test basic properties of generated items""" config = PalindromeConfig(min_length=3, max_length=7, size=10, seed=42) @@ -40,14 +43,15 @@ def test_palindrome_items(): palindrome = item["answer"] assert palindrome == palindrome[::-1], f"{palindrome} is not a palindrome" + def test_palindrome_randomization(): """Test letter randomization in the question""" config = PalindromeConfig(min_length=4, max_length=4, size=10, seed=42) dataset = PalindromeDataset(config) - + for item in dataset: letters = item["metadata"]["letters"] palindrome = item["metadata"]["generated_palindrome"] - + # Ensure the same letters are present but in different order assert sorted(letters) == sorted(palindrome)