From d3f311a32e9b5d23c4bea311a8cc1b9259ef242b Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Fri, 22 May 2026 00:33:34 +0200 Subject: [PATCH] Wrap score-director config in ScoreDirectorFactoryConfig MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Timefold's SolverConfig expects a typed config object, not a dict — plain dicts hit AttributeError when the wrapper tries to materialise the Java side. Co-Authored-By: Claude Opus 4.7 (1M context) --- timetable-solver-service/app/runner.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/timetable-solver-service/app/runner.py b/timetable-solver-service/app/runner.py index 70e0df4..cd26f3f 100644 --- a/timetable-solver-service/app/runner.py +++ b/timetable-solver-service/app/runner.py @@ -20,6 +20,7 @@ from concurrent.futures import ThreadPoolExecutor from timefold.solver import SolverFactory from timefold.solver.config import ( SolverConfig, + ScoreDirectorFactoryConfig, TerminationConfig, Duration, ) @@ -38,7 +39,9 @@ _solver_factory = SolverFactory.create( SolverConfig( solution_class=Timetable, entity_class_list=[Lesson], - score_director_factory_config={"constraint_provider_function": define_constraints}, + score_director_factory_config=ScoreDirectorFactoryConfig( + constraint_provider_function=define_constraints, + ), termination_config=TerminationConfig( spent_limit=Duration(seconds=settings.solver_seconds_limit), ),