Add polynomial multiplication curriculum (#338)

* Add polynomial multiplication curriculum and unit tests

* Add difficulty metadata

* Add curriculum class for complex_arithmetic and polynomial_multiplication
This commit is contained in:
Adefioye 2025-03-11 18:03:46 -05:00 committed by GitHub
parent c8e77d21a7
commit cad255e31b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 208 additions and 3 deletions

View file

@ -1,13 +1,18 @@
from .complex_arithmetic import ComplexArithmeticConfig, ComplexArithmeticDataset from .complex_arithmetic import ComplexArithmeticConfig, ComplexArithmeticCurriculum, ComplexArithmeticDataset
from .intermediate_integration import IntermediateIntegrationConfig, IntermediateIntegrationDataset from .intermediate_integration import IntermediateIntegrationConfig, IntermediateIntegrationDataset
from .polynomial_equations import PolynomialEquationsConfig, PolynomialEquationsCurriculum, PolynomialEquationsDataset from .polynomial_equations import PolynomialEquationsConfig, PolynomialEquationsCurriculum, PolynomialEquationsDataset
from .polynomial_multiplication import PolynomialMultiplicationConfig, PolynomialMultiplicationDataset from .polynomial_multiplication import (
PolynomialMultiplicationConfig,
PolynomialMultiplicationCurriculum,
PolynomialMultiplicationDataset,
)
from .simple_equations import SimpleEquationsConfig, SimpleEquationsDataset from .simple_equations import SimpleEquationsConfig, SimpleEquationsDataset
from .simple_integration import SimpleIntegrationConfig, SimpleIntegrationCurriculum, SimpleIntegrationDataset from .simple_integration import SimpleIntegrationConfig, SimpleIntegrationCurriculum, SimpleIntegrationDataset
__all__ = [ __all__ = [
"ComplexArithmeticConfig", "ComplexArithmeticConfig",
"ComplexArithmeticDataset", "ComplexArithmeticDataset",
"ComplexArithmeticCurriculum",
"IntermediateIntegrationConfig", "IntermediateIntegrationConfig",
"IntermediateIntegrationDataset", "IntermediateIntegrationDataset",
"PolynomialEquationsConfig", "PolynomialEquationsConfig",
@ -20,4 +25,5 @@ __all__ = [
"SimpleIntegrationDataset", "SimpleIntegrationDataset",
"PolynomialMultiplicationConfig", "PolynomialMultiplicationConfig",
"PolynomialMultiplicationDataset", "PolynomialMultiplicationDataset",
"PolynomialMultiplicationCurriculum",
] ]

View file

@ -5,6 +5,7 @@ from typing import Any, Optional
import sympy as sp import sympy as sp
from sympy.polys.monomials import itermonomials from sympy.polys.monomials import itermonomials
from ..coaching import AttributeType, BaseCurriculum, ScalarAttributeDefinition
from ..factory import ProceduralDataset, register_dataset from ..factory import ProceduralDataset, register_dataset
@ -110,6 +111,16 @@ When performing calculations, please follow these guidelines:
"metadata": { "metadata": {
"polynomial_expr": str(polynomial_expr), "polynomial_expr": str(polynomial_expr),
"variables": list(product.free_symbols), "variables": list(product.free_symbols),
"difficulty": {
"min_terms": self.config.min_terms,
"max_terms": self.config.max_terms,
"min_value": self.config.min_value,
"max_value": self.config.max_value,
"min_degree": self.config.min_degree,
"max_degree": self.config.max_degree,
"min_polynomials": self.config.min_polynomials,
"max_polynomials": self.config.max_polynomials,
},
}, },
} }
@ -159,4 +170,92 @@ When performing calculations, please follow these guidelines:
return reward return reward
register_dataset("polynomial_multiplication", PolynomialMultiplicationDataset, PolynomialMultiplicationConfig) class PolynomialMultiplicationCurriculum(BaseCurriculum):
"""Curriculum for complex number arithmetic problems."""
def __init__(self):
super().__init__(PolynomialMultiplicationCurriculum.__name__, PolynomialMultiplicationConfig)
# Define attributes
self._define_attributes(
ScalarAttributeDefinition(
name="min_terms",
field_name="min_terms",
levels=[2, 4, 6, 8],
default_level=0,
description="Minimum number of terms in polynomial expressions",
attr_type=AttributeType.STATIC,
min_value=2,
),
ScalarAttributeDefinition(
name="max_terms",
field_name="max_terms",
levels=[4, 8, 12, 16],
default_level=0,
description="Maximum number of terms in polynomial expressions",
attr_type=AttributeType.STATIC,
min_value=4,
),
ScalarAttributeDefinition(
name="min_value",
field_name="min_value",
levels=[1, 10, 100, 1000],
default_level=0,
description="Minimum value for coefficients",
attr_type=AttributeType.STATIC,
min_value=1,
),
ScalarAttributeDefinition(
name="max_value",
field_name="max_value",
levels=[100, 10000, 1000000, 100000000],
default_level=0,
description="Maximum value for coefficients",
attr_type=AttributeType.STATIC,
min_value=100,
),
ScalarAttributeDefinition(
name="min_degree",
field_name="min_degree",
levels=[0, 1, 2, 3],
default_level=0,
description="Minimum polynomial degree",
attr_type=AttributeType.STATIC,
min_value=0,
),
ScalarAttributeDefinition(
name="max_degree",
field_name="max_degree",
levels=[2, 4, 8, 10],
default_level=0,
description="Maximum polynomial degree",
attr_type=AttributeType.STATIC,
min_value=2,
),
ScalarAttributeDefinition(
name="min_polynomials",
field_name="min_polynomials",
levels=[2, 3, 4, 5],
default_level=0,
description="Minimum number of polynomials being multiplied",
attr_type=AttributeType.STATIC,
min_value=2,
),
ScalarAttributeDefinition(
name="max_polynomials",
field_name="max_polynomials",
levels=[4, 6, 8, 10],
default_level=0,
description="Maximum number of polynomials being multiplied",
attr_type=AttributeType.STATIC,
min_value=2,
),
)
register_dataset(
"polynomial_multiplication",
PolynomialMultiplicationDataset,
PolynomialMultiplicationConfig,
PolynomialMultiplicationCurriculum,
)

View file

@ -6,6 +6,7 @@ import sympy as sp
from reasoning_gym import create_dataset from reasoning_gym import create_dataset
from reasoning_gym.algebra.polynomial_multiplication import ( from reasoning_gym.algebra.polynomial_multiplication import (
PolynomialMultiplicationConfig, PolynomialMultiplicationConfig,
PolynomialMultiplicationCurriculum,
PolynomialMultiplicationDataset, PolynomialMultiplicationDataset,
) )
@ -236,3 +237,102 @@ def test_score_function():
assert ds.score_answer(None, item) == 0.0 assert ds.score_answer(None, item) == 0.0
assert ds.score_answer("Not a polynomial", item) == 0.0 assert ds.score_answer("Not a polynomial", item) == 0.0
assert ds.score_answer("x**4", item) == 0.0 assert ds.score_answer("x**4", item) == 0.0
def test_polynomial_multiplication_curriculum():
"""Test curriculum for polynomial multiplication."""
curriculum = PolynomialMultiplicationCurriculum()
base_value = {"size": 150, "seed": 1}
base_cfg: PolynomialMultiplicationCurriculum = curriculum.generate_configuration(base_value)
assert base_cfg.seed == 1
assert base_cfg.size == 150
assert base_cfg.min_terms == 2
assert base_cfg.max_terms == 4
assert base_cfg.min_value == 1
assert base_cfg.max_value == 100
assert base_cfg.min_degree == 0
assert base_cfg.max_degree == 2
assert base_cfg.min_polynomials == 2
assert base_cfg.max_polynomials == 4
# Increase and validate increase in level
curriculum.increment_attr_level("min_terms")
curriculum.increment_attr_level("max_terms")
curriculum.increment_attr_level("min_value")
curriculum.increment_attr_level("max_value")
curriculum.increment_attr_level("min_degree")
curriculum.increment_attr_level("max_degree")
curriculum.increment_attr_level("min_polynomials")
curriculum.increment_attr_level("max_polynomials")
increased_cfg: PolynomialMultiplicationCurriculum = curriculum.generate_configuration(base_value)
assert increased_cfg.min_terms == 4
assert increased_cfg.max_terms == 8
assert increased_cfg.min_value == 10
assert increased_cfg.max_value == 10000
assert increased_cfg.min_degree == 1
assert increased_cfg.max_degree == 4
assert increased_cfg.min_polynomials == 3
assert increased_cfg.max_polynomials == 6
# Decrease and validate decrease in level
curriculum.decrement_attr_level("min_terms")
curriculum.decrement_attr_level("max_terms")
curriculum.decrement_attr_level("min_value")
curriculum.decrement_attr_level("max_value")
curriculum.decrement_attr_level("min_degree")
curriculum.decrement_attr_level("max_degree")
curriculum.decrement_attr_level("min_polynomials")
curriculum.decrement_attr_level("max_polynomials")
decreased_cfg: PolynomialMultiplicationCurriculum = curriculum.generate_configuration(base_value)
assert decreased_cfg.min_terms == 2
assert decreased_cfg.max_terms == 4
assert decreased_cfg.min_value == 1
assert decreased_cfg.max_value == 100
assert decreased_cfg.min_degree == 0
assert decreased_cfg.max_degree == 2
assert decreased_cfg.min_polynomials == 2
assert decreased_cfg.max_polynomials == 4
# Test upper bound boundary condition
for _ in range(10):
curriculum.increment_attr_level("min_terms")
curriculum.increment_attr_level("max_terms")
curriculum.increment_attr_level("min_value")
curriculum.increment_attr_level("max_value")
curriculum.increment_attr_level("min_degree")
curriculum.increment_attr_level("max_degree")
curriculum.increment_attr_level("min_polynomials")
curriculum.increment_attr_level("max_polynomials")
upper_bound_cfg: PolynomialMultiplicationCurriculum = curriculum.generate_configuration(base_value)
assert upper_bound_cfg.min_terms == 8
assert upper_bound_cfg.max_terms == 16
assert upper_bound_cfg.min_value == 1000
assert upper_bound_cfg.max_value == 100000000
assert upper_bound_cfg.min_degree == 3
assert upper_bound_cfg.max_degree == 10
assert upper_bound_cfg.min_polynomials == 5
assert upper_bound_cfg.max_polynomials == 10
# Test lower bound boundary condition
for _ in range(10):
curriculum.decrement_attr_level("min_terms")
curriculum.decrement_attr_level("max_terms")
curriculum.decrement_attr_level("min_value")
curriculum.decrement_attr_level("max_value")
curriculum.decrement_attr_level("min_degree")
curriculum.decrement_attr_level("max_degree")
curriculum.decrement_attr_level("min_polynomials")
curriculum.decrement_attr_level("max_polynomials")
lower_bound_cfg: PolynomialMultiplicationCurriculum = curriculum.generate_configuration(base_value)
assert lower_bound_cfg.min_terms == 2
assert lower_bound_cfg.max_terms == 4
assert lower_bound_cfg.min_value == 1
assert lower_bound_cfg.max_value == 100
assert lower_bound_cfg.min_degree == 0
assert lower_bound_cfg.max_degree == 2
assert lower_bound_cfg.min_polynomials == 2
assert lower_bound_cfg.max_polynomials == 4