diff --git a/src/main/java/ai/timefold/solver/benchmarks/micro/scoredirector/problems/AbstractProblem.java b/src/main/java/ai/timefold/solver/benchmarks/micro/scoredirector/problems/AbstractProblem.java index 9f299c55..0ad5f1d1 100644 --- a/src/main/java/ai/timefold/solver/benchmarks/micro/scoredirector/problems/AbstractProblem.java +++ b/src/main/java/ai/timefold/solver/benchmarks/micro/scoredirector/problems/AbstractProblem.java @@ -20,6 +20,7 @@ import ai.timefold.solver.core.impl.localsearch.decider.LocalSearchDecider; import ai.timefold.solver.core.impl.localsearch.scope.LocalSearchPhaseScope; import ai.timefold.solver.core.impl.localsearch.scope.LocalSearchStepScope; +import ai.timefold.solver.core.impl.move.director.MoveDirector; import ai.timefold.solver.core.impl.score.director.InnerScoreDirector; import ai.timefold.solver.core.impl.score.director.InnerScoreDirectorFactory; import ai.timefold.solver.core.impl.solver.DefaultSolver; @@ -35,6 +36,7 @@ abstract class AbstractProblem implements Problem { private final InnerScoreDirectorFactory scoreDirectorFactory; private final Solution_ originalSolution; + private MoveDirector moveDirector; private InnerScoreDirector scoreDirector; private MoveSelector moveSelector; private Iterator> moveIterator; @@ -104,6 +106,7 @@ public final void setupIteration() { scoreDirector.setWorkingSolution(scoreDirector.cloneSolution(originalSolution)); // Use fresh solution again. scoreDirector.triggerVariableListeners(); scoreDirector.calculateScore(); + moveDirector = new MoveDirector<>(scoreDirector); // Prepare the lifecycle. var solverScope = new SolverScope(); solverScope.setScoreDirector(scoreDirector); @@ -146,10 +149,14 @@ public final void setupInvocation() { */ @Override public final Object runInvocation() { + var scoreDirector = (InnerScoreDirector) moveDirector.getScoreDirector(); if (willUndo) { - move = move.doMove(scoreDirector); // Do the move and prepare undo. + try (var ephemeralMoveDirector = moveDirector.ephemeral()) { + move.doMoveOnly(ephemeralMoveDirector.getScoreDirector()); + } + } else { + move.doMoveOnly(scoreDirector); // Do the move without any undo. } - move.doMoveOnly(scoreDirector); // Run either the original move, or the undo. return scoreDirector.calculateScore(); }