diff --git a/reasoning_gym/geometry/__init__.py b/reasoning_gym/geometry/__init__.py index 42a8731a..3026ec4b 100644 --- a/reasoning_gym/geometry/__init__.py +++ b/reasoning_gym/geometry/__init__.py @@ -1,4 +1,4 @@ -from .advanced_geometry import AdvancedGeometryConfig, AdvancedGeometryDataset +from .advanced_geometry import AdvancedGeometryConfig, AdvancedGeometryCurriculum, AdvancedGeometryDataset from .simple_geometry import SimpleGeometryConfig, SimpleGeometryCurriculum, SimpleGeometryDataset __all__ = [ @@ -7,4 +7,5 @@ __all__ = [ "SimpleGeometryCurriculum", "AdvancedGeometryConfig", "AdvancedGeometryDataset", + "AdvancedGeometryCurriculum", ] diff --git a/reasoning_gym/geometry/advanced_geometry.py b/reasoning_gym/geometry/advanced_geometry.py index 836a3b75..ed841731 100644 --- a/reasoning_gym/geometry/advanced_geometry.py +++ b/reasoning_gym/geometry/advanced_geometry.py @@ -6,6 +6,7 @@ import numpy as np import sympy from sympy.geometry import Point +from ..coaching import AttributeType, BaseCurriculum, ScalarAttributeDefinition from ..factory import ProceduralDataset, register_dataset @@ -88,6 +89,11 @@ class AdvancedGeometryDataset(ProceduralDataset): metadata["task_type"] = task_type + metadata["difficulty"] = { + "min_coord": self.config.min_coord, + "max_coord": self.config.max_coord, + } + return { "question": question, "answer": answer, @@ -269,5 +275,31 @@ class AdvancedGeometryDataset(ProceduralDataset): return reward +class AdvancedGeometryCurriculum(BaseCurriculum): + def __init__(self): + super().__init__(AdvancedGeometryCurriculum.__name__, AdvancedGeometryConfig) + + self._define_attributes( + ScalarAttributeDefinition( + name="min_coord", + field_name="min_coord", + levels=[-10, -100, -1000, -10000], + default_level=0, + description="Minimum x/y coordinate", + attr_type=AttributeType.STATIC, + min_value=-float("inf"), + ), + ScalarAttributeDefinition( + name="max_coord", + field_name="max_coord", + levels=[10, 100, 1000, 10000], + default_level=0, + description="Maximum x/y coordinate", + attr_type=AttributeType.STATIC, + min_value=-float("inf"), + ), + ) + + # Register the dataset -register_dataset("advanced_geometry", AdvancedGeometryDataset, AdvancedGeometryConfig) +register_dataset("advanced_geometry", AdvancedGeometryDataset, AdvancedGeometryConfig, AdvancedGeometryCurriculum) diff --git a/tests/test_advanced_geometry.py b/tests/test_advanced_geometry.py index 9eec1b36..4a2562a4 100644 --- a/tests/test_advanced_geometry.py +++ b/tests/test_advanced_geometry.py @@ -1,6 +1,10 @@ import pytest -from reasoning_gym.geometry.advanced_geometry import AdvancedGeometryConfig, AdvancedGeometryDataset +from reasoning_gym.geometry.advanced_geometry import ( + AdvancedGeometryConfig, + AdvancedGeometryCurriculum, + AdvancedGeometryDataset, +) def test_advanced_geometry_config_validation(): @@ -81,3 +85,28 @@ def test_advanced_geometry_dataset_iteration(): first_items = list(dataset) second_items = list(dataset) assert first_items == second_items, "Multiple iterations should yield the same items." + + +def test_advanced_geometry_curriculum(): + curriculum = AdvancedGeometryCurriculum() + + base_value = {"size": 150, "seed": 1} + + base_cfg: AdvancedGeometryConfig = curriculum.generate_configuration(base_value) + assert base_cfg.seed == 1 + assert base_cfg.size == 150 + assert base_cfg.min_coord == -10 + assert base_cfg.max_coord == 10 + + # test incrementing attribute levels + curriculum.increment_attr_level("min_coord") + curriculum.increment_attr_level("max_coord") + increased_cfg = curriculum.generate_configuration(base_value) + assert increased_cfg.min_coord == -100 + assert increased_cfg.max_coord == 100 + + # test decrementing attribute level + curriculum.decrement_attr_level("min_coord") + partially_decreased_cfg = curriculum.generate_configuration(base_value) + assert partially_decreased_cfg.min_coord == -10 + assert partially_decreased_cfg.max_coord == 100