Basic curriculum (#198)

* feat: Add optional curriculum support to dataset registration and creation
* docs: Add docstrings to create_curriculum() and register_dataset()
* feat: Add curriculum configuration classes for CurriculumExperiment
* feat: Add weight parameter to CurriculumAttributeConfig and use in DatasetSpec
* refactor: Simplify CurriculumAttributeConfig with "*" attribute level support
* test: Add unit tests for CurriculumExperiment class
* feat: Add from_yaml() method to CurriculumExperimentConfig with unit test
This commit is contained in:
Andreas Köpf 2025-03-07 11:22:12 +01:00 committed by GitHub
parent 34889d0517
commit c2263979bc
29 changed files with 943 additions and 63 deletions

View file

@ -123,7 +123,7 @@ class ChainSumCurriculum(BaseCurriculum):
self._define_attributes(
RangeAttributeDefinition(
name="num_terms",
levels=[2, 3, 4, 5],
levels=list(range(2, 13)),
default_level=0, # Start with 2 terms
description="Maximum number of terms in the expression",
attr_type=AttributeType.APPEND,
@ -133,7 +133,7 @@ class ChainSumCurriculum(BaseCurriculum):
),
RangeAttributeDefinition(
name="num_digits",
levels=[1, 2, 4, 10],
levels=list(range(1, 11)),
default_level=0, # Start with 1-digit numbers
description="Number of digits in each operand",
attr_type=AttributeType.APPEND,
@ -145,4 +145,4 @@ class ChainSumCurriculum(BaseCurriculum):
# Register the dataset
register_dataset("chain_sum", ChainSumDataset, ChainSumConfig)
register_dataset("chain_sum", ChainSumDataset, ChainSumConfig, ChainSumCurriculum)

View file

@ -65,4 +65,4 @@ class CountBitsCurriculum(BaseCurriculum):
)
register_dataset("count_bits", CountBitsDataset, CountBitsConfig)
register_dataset("count_bits", CountBitsDataset, CountBitsConfig, CountBitsCurriculum)

View file

@ -4,6 +4,9 @@ from dataclasses import dataclass
from random import Random
from typing import Optional
from reasoning_gym.coaching.attributes import AttributeType, RangeAttributeDefinition
from reasoning_gym.coaching.base_curriculum import BaseCurriculum
from ..factory import ProceduralDataset, register_dataset
ANIMALS = {
@ -124,4 +127,23 @@ class LegCountingDataset(ProceduralDataset):
}
register_dataset("leg_counting", LegCountingDataset, LegCountingConfig)
class LegCountingCurriculum(BaseCurriculum):
def __init__(self):
super().__init__(LegCountingCurriculum.__name__, LegCountingConfig)
# Define attributes
self._define_attributes(
RangeAttributeDefinition(
name="num_animals",
levels=list(range(1, 20)),
default_level=0, # Start with 2 terms
description="Number of animals in question",
attr_type=AttributeType.APPEND,
min_value=1, # Ensure at least 1 animal
lower_field_name="min_animals",
upper_field_name="max_animals",
),
)
register_dataset("leg_counting", LegCountingDataset, LegCountingConfig, LegCountingCurriculum)

View file

@ -115,7 +115,7 @@ class ProductsCurriculum(BaseCurriculum):
self._define_attributes(
RangeAttributeDefinition(
name="num_terms",
levels=[2, 3, 4, 5],
levels=list(range(2, 13)),
default_level=0, # Start with 2 terms
description="Maximum number of terms in the expression",
attr_type=AttributeType.APPEND,
@ -125,7 +125,7 @@ class ProductsCurriculum(BaseCurriculum):
),
RangeAttributeDefinition(
name="num_digits",
levels=[1, 2, 3, 4],
levels=list(range(1, 11)),
default_level=0, # Start with 1-digit numbers
description="Number of digits in each operand",
attr_type=AttributeType.APPEND,
@ -137,4 +137,4 @@ class ProductsCurriculum(BaseCurriculum):
# Register the dataset
register_dataset("products", ProductsDataset, ProductsConfig)
register_dataset("products", ProductsDataset, ProductsConfig, ProductsCurriculum)