Skip to content

Commit 7d5df0d

Browse files
committed
chore: fix custom phases
1 parent e71dc79 commit 7d5df0d

2 files changed

Lines changed: 22 additions & 24 deletions

File tree

src/main/java/ai/timefold/solver/benchmarks/examples/flowshop/phase/NEHCustomPhase.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
import java.util.ArrayList;
44
import java.util.List;
5-
import java.util.function.BooleanSupplier;
65

76
import ai.timefold.solver.benchmarks.examples.flowshop.domain.Job;
87
import ai.timefold.solver.benchmarks.examples.flowshop.domain.JobScheduleSolution;
9-
import ai.timefold.solver.core.api.score.director.ScoreDirector;
8+
import ai.timefold.solver.benchmarks.examples.flowshop.domain.Machine;
109
import ai.timefold.solver.core.api.solver.phase.PhaseCommand;
10+
import ai.timefold.solver.core.api.solver.phase.PhaseCommandContext;
11+
import ai.timefold.solver.core.preview.api.domain.metamodel.PlanningListVariableMetaModel;
12+
import ai.timefold.solver.core.preview.api.move.builtin.Moves;
1113

1214
/**
1315
* This custom phase implements the NEH construction heuristic with the Taillard acceleration strategy.
@@ -20,10 +22,10 @@
2022
public class NEHCustomPhase implements PhaseCommand<JobScheduleSolution> {
2123

2224
@Override
23-
public void changeWorkingSolution(ScoreDirector<JobScheduleSolution> scoreDirector, BooleanSupplier isPhaseTerminated) {
25+
public void changeWorkingSolution(PhaseCommandContext<JobScheduleSolution> phaseCommandContext) {
2426
// The enrichment step, after loading the solution,
2527
// will sort the jobs by the sum of processing times in decreasing order
26-
var workingSolution = scoreDirector.getWorkingSolution();
28+
var workingSolution = phaseCommandContext.getWorkingSolution();
2729
var jobs = workingSolution.getJobs();
2830
var currentJobSchedule = new ArrayList<Job>(jobs.size());
2931
currentJobSchedule.add(jobs.get(0));
@@ -45,16 +47,13 @@ public void changeWorkingSolution(ScoreDirector<JobScheduleSolution> scoreDirect
4547
}
4648
currentJobSchedule.add(minIndex, jobs.get(k));
4749
}
48-
scoreDirector.beforeListVariableChanged(workingSolution.getMachine(), "jobs", 0, 0);
50+
var listVariableMetaModel =
51+
(PlanningListVariableMetaModel<JobScheduleSolution, Machine, Job>) phaseCommandContext
52+
.getSolutionMetaModel().entity(Machine.class).<Job> variable("jobs");
4953
for (var job : currentJobSchedule) {
50-
scoreDirector.beforeListVariableElementAssigned(workingSolution.getMachine(), "jobs", job);
54+
phaseCommandContext.execute(Moves.assign(listVariableMetaModel, job, workingSolution.getMachine(),
55+
workingSolution.getMachine().getJobs().size()));
5156
}
52-
workingSolution.getMachine().setJobs(currentJobSchedule);
53-
scoreDirector.afterListVariableChanged(workingSolution.getMachine(), "jobs", 0, currentJobSchedule.size());
54-
for (var job : currentJobSchedule) {
55-
scoreDirector.afterListVariableElementAssigned(workingSolution.getMachine(), "jobs", job);
56-
}
57-
scoreDirector.triggerVariableListeners();
5857
}
5958

6059
/**
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,30 @@
11
package ai.timefold.solver.benchmarks.examples.machinereassignment.solver.solution.initializer;
22

3-
import java.util.function.BooleanSupplier;
4-
53
import ai.timefold.solver.benchmarks.examples.machinereassignment.domain.MachineReassignment;
64
import ai.timefold.solver.benchmarks.examples.machinereassignment.domain.MrMachine;
75
import ai.timefold.solver.benchmarks.examples.machinereassignment.domain.MrProcessAssignment;
8-
import ai.timefold.solver.core.api.score.director.ScoreDirector;
96
import ai.timefold.solver.core.api.solver.phase.PhaseCommand;
7+
import ai.timefold.solver.core.api.solver.phase.PhaseCommandContext;
8+
import ai.timefold.solver.core.preview.api.domain.metamodel.PlanningVariableMetaModel;
9+
import ai.timefold.solver.core.preview.api.move.builtin.Moves;
1010

1111
public class ToOriginalMachineSolutionInitializer implements PhaseCommand<MachineReassignment> {
1212

1313
@Override
14-
public void changeWorkingSolution(ScoreDirector<MachineReassignment> scoreDirector, BooleanSupplier isPhaseTerminated) {
15-
MachineReassignment machineReassignment = scoreDirector.getWorkingSolution();
16-
initializeProcessAssignmentList(scoreDirector, machineReassignment);
14+
public void changeWorkingSolution(PhaseCommandContext<MachineReassignment> phaseCommandContext) {
15+
MachineReassignment machineReassignment = phaseCommandContext.getWorkingSolution();
16+
initializeProcessAssignmentList(phaseCommandContext, machineReassignment);
1717
}
1818

19-
private void initializeProcessAssignmentList(ScoreDirector<MachineReassignment> scoreDirector,
19+
private void initializeProcessAssignmentList(PhaseCommandContext<MachineReassignment> phaseCommandContext,
2020
MachineReassignment machineReassignment) {
21+
var variableMetaModel =
22+
(PlanningVariableMetaModel<MachineReassignment, MrProcessAssignment, MrMachine>) phaseCommandContext
23+
.getSolutionMetaModel().entity(MrProcessAssignment.class).<MrMachine> variable("machine");
2124
for (MrProcessAssignment processAssignment : machineReassignment.getProcessAssignmentList()) {
2225
MrMachine originalMachine = processAssignment.getOriginalMachine();
2326
MrMachine machine = originalMachine == null ? machineReassignment.getMachineList().get(0) : originalMachine;
24-
scoreDirector.beforeVariableChanged(processAssignment, "machine");
25-
processAssignment.setMachine(machine);
26-
scoreDirector.afterVariableChanged(processAssignment, "machine");
27-
scoreDirector.triggerVariableListeners();
27+
phaseCommandContext.execute(Moves.change(variableMetaModel, processAssignment, machine));
2828
}
2929
}
30-
3130
}

0 commit comments

Comments
 (0)