Skip to content

Commit 3681b18

Browse files
committed
chore: simplify logic
1 parent e378a1b commit 3681b18

File tree

18 files changed

+32
-419
lines changed

18 files changed

+32
-419
lines changed

benchmark/src/main/resources/benchmark.xsd

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2414,9 +2414,6 @@
24142414
<xs:element maxOccurs="unbounded" minOccurs="0" name="acceptorType" type="tns:acceptorType"/>
24152415

24162416

2417-
<xs:element minOccurs="0" name="reconfigurationRestartType" type="tns:restartType"/>
2418-
2419-
24202417
<xs:element minOccurs="0" name="entityTabuSize" type="xs:int"/>
24212418

24222419

@@ -3155,24 +3152,6 @@
31553152
</xs:simpleType>
31563153

31573154

3158-
<xs:simpleType name="restartType">
3159-
3160-
3161-
<xs:restriction base="xs:string">
3162-
3163-
3164-
<xs:enumeration value="UNIMPROVED_TIME"/>
3165-
3166-
3167-
<xs:enumeration value="UNIMPROVED_MOVE_COUNT"/>
3168-
3169-
3170-
</xs:restriction>
3171-
3172-
3173-
</xs:simpleType>
3174-
3175-
31763155
<xs:simpleType name="stepCountingHillClimbingType">
31773156

31783157

core/src/build/revapi-differences.json

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -102,17 +102,6 @@
102102
"oldValue": "{\"terminationClass\", \"terminationCompositionStyle\", \"spentLimit\", \"millisecondsSpentLimit\", \"secondsSpentLimit\", \"minutesSpentLimit\", \"hoursSpentLimit\", \"daysSpentLimit\", \"unimprovedSpentLimit\", \"unimprovedMillisecondsSpentLimit\", \"unimprovedSecondsSpentLimit\", \"unimprovedMinutesSpentLimit\", \"unimprovedHoursSpentLimit\", \"unimprovedDaysSpentLimit\", \"unimprovedScoreDifferenceThreshold\", \"bestScoreLimit\", \"bestScoreFeasible\", \"stepCountLimit\", \"unimprovedStepCountLimit\", \"scoreCalculationCountLimit\", \"terminationConfigList\"}",
103103
"newValue": "{\"terminationClass\", \"terminationCompositionStyle\", \"diminishedReturnsConfig\", \"spentLimit\", \"millisecondsSpentLimit\", \"secondsSpentLimit\", \"minutesSpentLimit\", \"hoursSpentLimit\", \"daysSpentLimit\", \"unimprovedSpentLimit\", \"unimprovedMillisecondsSpentLimit\", \"unimprovedSecondsSpentLimit\", \"unimprovedMinutesSpentLimit\", \"unimprovedHoursSpentLimit\", \"unimprovedDaysSpentLimit\", \"unimprovedScoreDifferenceThreshold\", \"bestScoreLimit\", \"bestScoreFeasible\", \"stepCountLimit\", \"unimprovedStepCountLimit\", \"scoreCalculationCountLimit\", \"moveCountLimit\", \"terminationConfigList\"}",
104104
"justification": "Added support for the new diminished returns termination type"
105-
},
106-
{
107-
"ignore": true,
108-
"code": "java.annotation.attributeValueChanged",
109-
"old": "class ai.timefold.solver.core.config.localsearch.decider.acceptor.LocalSearchAcceptorConfig",
110-
"new": "class ai.timefold.solver.core.config.localsearch.decider.acceptor.LocalSearchAcceptorConfig",
111-
"annotationType": "jakarta.xml.bind.annotation.XmlType",
112-
"attribute": "propOrder",
113-
"oldValue": "{\"acceptorTypeList\", \"entityTabuSize\", \"entityTabuRatio\", \"fadingEntityTabuSize\", \"fadingEntityTabuRatio\", \"valueTabuSize\", \"valueTabuRatio\", \"fadingValueTabuSize\", \"fadingValueTabuRatio\", \"moveTabuSize\", \"fadingMoveTabuSize\", \"undoMoveTabuSize\", \"fadingUndoMoveTabuSize\", \"simulatedAnnealingStartingTemperature\", \"lateAcceptanceSize\", \"greatDelugeWaterLevelIncrementScore\", \"greatDelugeWaterLevelIncrementRatio\", \"stepCountingHillClimbingSize\", \"stepCountingHillClimbingType\"}",
114-
"newValue": "{\"acceptorTypeList\", \"reconfigurationRestartType\", \"entityTabuSize\", \"entityTabuRatio\", \"fadingEntityTabuSize\", \"fadingEntityTabuRatio\", \"valueTabuSize\", \"valueTabuRatio\", \"fadingValueTabuSize\", \"fadingValueTabuRatio\", \"moveTabuSize\", \"fadingMoveTabuSize\", \"undoMoveTabuSize\", \"fadingUndoMoveTabuSize\", \"simulatedAnnealingStartingTemperature\", \"lateAcceptanceSize\", \"greatDelugeWaterLevelIncrementScore\", \"greatDelugeWaterLevelIncrementRatio\", \"stepCountingHillClimbingSize\", \"stepCountingHillClimbingType\"}",
115-
"justification": "Add the acceptor reconfiguration setting"
116105
}
117106
]
118107
}

core/src/main/java/ai/timefold/solver/core/config/localsearch/decider/acceptor/LocalSearchAcceptorConfig.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
@XmlType(propOrder = {
1717
"acceptorTypeList",
18-
"reconfigurationRestartType",
1918
"entityTabuSize",
2019
"entityTabuRatio",
2120
"fadingEntityTabuSize",
@@ -39,7 +38,6 @@ public class LocalSearchAcceptorConfig extends AbstractConfig<LocalSearchAccepto
3938

4039
@XmlElement(name = "acceptorType")
4140
private List<AcceptorType> acceptorTypeList = null;
42-
private RestartType reconfigurationRestartType = null;
4341

4442
protected Integer entityTabuSize = null;
4543
protected Double entityTabuRatio = null;
@@ -80,14 +78,6 @@ public void setAcceptorTypeList(@Nullable List<AcceptorType> acceptorTypeList) {
8078
this.acceptorTypeList = acceptorTypeList;
8179
}
8280

83-
public @Nullable RestartType getReconfigurationRestartType() {
84-
return reconfigurationRestartType;
85-
}
86-
87-
public void setReconfigurationRestartType(@Nullable RestartType reconfigurationRestartType) {
88-
this.reconfigurationRestartType = reconfigurationRestartType;
89-
}
90-
9181
public @Nullable Integer getEntityTabuSize() {
9282
return entityTabuSize;
9383
}
@@ -273,11 +263,6 @@ public void setStepCountingHillClimbingType(@Nullable StepCountingHillClimbingTy
273263
return this;
274264
}
275265

276-
public @NonNull LocalSearchAcceptorConfig withRestartType(@NonNull RestartType restartType) {
277-
this.reconfigurationRestartType = restartType;
278-
return this;
279-
}
280-
281266
public @NonNull LocalSearchAcceptorConfig withEntityTabuSize(@NonNull Integer entityTabuSize) {
282267
this.entityTabuSize = entityTabuSize;
283268
return this;
@@ -382,8 +367,6 @@ public LocalSearchAcceptorConfig withFadingUndoMoveTabuSize(Integer fadingUndoMo
382367
}
383368
}
384369
}
385-
reconfigurationRestartType = ConfigUtils.inheritOverwritableProperty(reconfigurationRestartType,
386-
inheritedConfig.getReconfigurationRestartType());
387370
entityTabuSize = ConfigUtils.inheritOverwritableProperty(entityTabuSize, inheritedConfig.getEntityTabuSize());
388371
entityTabuRatio = ConfigUtils.inheritOverwritableProperty(entityTabuRatio, inheritedConfig.getEntityTabuRatio());
389372
fadingEntityTabuSize = ConfigUtils.inheritOverwritableProperty(fadingEntityTabuSize,

core/src/main/java/ai/timefold/solver/core/config/localsearch/decider/acceptor/RestartType.java

Lines changed: 0 additions & 9 deletions
This file was deleted.

core/src/main/java/ai/timefold/solver/core/impl/localsearch/DefaultLocalSearchPhaseFactory.java

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import ai.timefold.solver.core.config.localsearch.decider.acceptor.LocalSearchAcceptorConfig;
2121
import ai.timefold.solver.core.config.localsearch.decider.forager.LocalSearchForagerConfig;
2222
import ai.timefold.solver.core.config.localsearch.decider.forager.LocalSearchPickEarlyType;
23-
import ai.timefold.solver.core.config.solver.PreviewFeature;
2423
import ai.timefold.solver.core.enterprise.TimefoldSolverEnterpriseService;
2524
import ai.timefold.solver.core.impl.domain.variable.descriptor.BasicVariableDescriptor;
2625
import ai.timefold.solver.core.impl.heuristic.HeuristicConfigPolicy;
@@ -33,8 +32,6 @@
3332
import ai.timefold.solver.core.impl.localsearch.decider.acceptor.AcceptorFactory;
3433
import ai.timefold.solver.core.impl.localsearch.decider.forager.LocalSearchForager;
3534
import ai.timefold.solver.core.impl.localsearch.decider.forager.LocalSearchForagerFactory;
36-
import ai.timefold.solver.core.impl.localsearch.decider.reconfiguration.NoOpReconfigurationStrategy;
37-
import ai.timefold.solver.core.impl.localsearch.decider.reconfiguration.ReconfigurationStrategy;
3835
import ai.timefold.solver.core.impl.localsearch.decider.reconfiguration.RestoreBestSolutionReconfigurationStrategy;
3936
import ai.timefold.solver.core.impl.phase.AbstractPhaseFactory;
4037
import ai.timefold.solver.core.impl.solver.recaller.BestSolutionRecaller;
@@ -71,7 +68,7 @@ private LocalSearchDecider<Solution_> buildDecider(HeuristicConfigPolicy<Solutio
7168
Termination<Solution_> termination) {
7269
var moveSelector = buildMoveSelector(configPolicy);
7370
var acceptor = buildAcceptor(configPolicy);
74-
var reconfigurationStrategy = buildReconfigurationStrategy(configPolicy, moveSelector, acceptor);
71+
var reconfigurationStrategy = new RestoreBestSolutionReconfigurationStrategy<>(moveSelector, acceptor);
7572
var forager = buildForager(configPolicy);
7673
if (moveSelector.isNeverEnding() && !forager.supportsNeverEndingMoveSelector()) {
7774
throw new IllegalStateException("The moveSelector (" + moveSelector
@@ -203,20 +200,6 @@ protected MoveSelector<Solution_> buildMoveSelector(HeuristicConfigPolicy<Soluti
203200
return moveSelector;
204201
}
205202

206-
private ReconfigurationStrategy<Solution_> buildReconfigurationStrategy(HeuristicConfigPolicy<Solution_> configPolicy,
207-
MoveSelector<Solution_> moveSelector, Acceptor<Solution_> acceptor) {
208-
var acceptorConfig = phaseConfig.getAcceptorConfig();
209-
if (acceptorConfig != null) {
210-
var enableReconfiguration =
211-
acceptorConfig.getReconfigurationRestartType() != null;
212-
if (enableReconfiguration) {
213-
configPolicy.ensurePreviewFeature(PreviewFeature.RECONFIGURATION);
214-
return new RestoreBestSolutionReconfigurationStrategy<>(moveSelector, acceptor);
215-
}
216-
}
217-
return new NoOpReconfigurationStrategy<>();
218-
}
219-
220203
private UnionMoveSelectorConfig determineDefaultMoveSelectorConfig(HeuristicConfigPolicy<Solution_> configPolicy) {
221204
var solutionDescriptor = configPolicy.getSolutionDescriptor();
222205
var basicVariableDescriptorList = solutionDescriptor.getEntityDescriptors().stream()

core/src/main/java/ai/timefold/solver/core/impl/localsearch/decider/acceptor/AcceptorFactory.java

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@
1515
import ai.timefold.solver.core.impl.localsearch.decider.acceptor.hillclimbing.HillClimbingAcceptor;
1616
import ai.timefold.solver.core.impl.localsearch.decider.acceptor.lateacceptance.DiversifiedLateAcceptanceAcceptor;
1717
import ai.timefold.solver.core.impl.localsearch.decider.acceptor.lateacceptance.LateAcceptanceAcceptor;
18-
import ai.timefold.solver.core.impl.localsearch.decider.acceptor.restart.NoOpRestartStrategy;
19-
import ai.timefold.solver.core.impl.localsearch.decider.acceptor.restart.RestartStrategy;
2018
import ai.timefold.solver.core.impl.localsearch.decider.acceptor.restart.UnimprovedMoveCountRestartStrategy;
21-
import ai.timefold.solver.core.impl.localsearch.decider.acceptor.restart.UnimprovedTimeRestartStrategy;
2219
import ai.timefold.solver.core.impl.localsearch.decider.acceptor.simulatedannealing.SimulatedAnnealingAcceptor;
2320
import ai.timefold.solver.core.impl.localsearch.decider.acceptor.stepcountinghillclimbing.StepCountingHillClimbingAcceptor;
2421
import ai.timefold.solver.core.impl.localsearch.decider.acceptor.tabu.EntityTabuAcceptor;
@@ -224,9 +221,7 @@ private Optional<MoveTabuAcceptor<Solution_>> buildMoveTabuAcceptor(HeuristicCon
224221
if (acceptorTypeListsContainsAcceptorType(AcceptorType.LATE_ACCEPTANCE)
225222
|| (!acceptorTypeListsContainsAcceptorType(AcceptorType.DIVERSIFIED_LATE_ACCEPTANCE)
226223
&& acceptorConfig.getLateAcceptanceSize() != null)) {
227-
var restartStrategy = buildRestartStrategy();
228-
var acceptor =
229-
new LateAcceptanceAcceptor<>(!(restartStrategy instanceof NoOpRestartStrategy<Solution_>), restartStrategy);
224+
var acceptor = new LateAcceptanceAcceptor<>(new UnimprovedMoveCountRestartStrategy<Solution_>());
230225
acceptor.setLateAcceptanceSize(Objects.requireNonNullElse(acceptorConfig.getLateAcceptanceSize(), 400));
231226
return Optional.of(acceptor);
232227
}
@@ -237,27 +232,13 @@ private Optional<MoveTabuAcceptor<Solution_>> buildMoveTabuAcceptor(HeuristicCon
237232
buildDiversifiedLateAcceptanceAcceptor(HeuristicConfigPolicy<Solution_> configPolicy) {
238233
if (acceptorTypeListsContainsAcceptorType(AcceptorType.DIVERSIFIED_LATE_ACCEPTANCE)) {
239234
configPolicy.ensurePreviewFeature(PreviewFeature.DIVERSIFIED_LATE_ACCEPTANCE);
240-
var restartStrategy = buildRestartStrategy();
241-
var acceptor = new DiversifiedLateAcceptanceAcceptor<>(!(restartStrategy instanceof NoOpRestartStrategy<Solution_>),
242-
restartStrategy);
235+
var acceptor = new DiversifiedLateAcceptanceAcceptor<>(new UnimprovedMoveCountRestartStrategy<Solution_>());
243236
acceptor.setLateAcceptanceSize(Objects.requireNonNullElse(acceptorConfig.getLateAcceptanceSize(), 5));
244237
return Optional.of(acceptor);
245238
}
246239
return Optional.empty();
247240
}
248241

249-
private RestartStrategy<Solution_> buildRestartStrategy() {
250-
RestartStrategy<Solution_> restartStrategy = new NoOpRestartStrategy<>();
251-
var enableReconfiguration = acceptorConfig.getReconfigurationRestartType() != null;
252-
if (enableReconfiguration) {
253-
return switch (acceptorConfig.getReconfigurationRestartType()) {
254-
case UNIMPROVED_MOVE_COUNT -> new UnimprovedMoveCountRestartStrategy<>();
255-
case UNIMPROVED_TIME -> new UnimprovedTimeRestartStrategy<>();
256-
};
257-
}
258-
return restartStrategy;
259-
}
260-
261242
private Optional<GreatDelugeAcceptor<Solution_>> buildGreatDelugeAcceptor(HeuristicConfigPolicy<Solution_> configPolicy) {
262243
if (acceptorTypeListsContainsAcceptorType(AcceptorType.GREAT_DELUGE)
263244
|| acceptorConfig.getGreatDelugeWaterLevelIncrementScore() != null

core/src/main/java/ai/timefold/solver/core/impl/localsearch/decider/acceptor/ReconfigurableAcceptor.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,11 @@
1414
public abstract class ReconfigurableAcceptor<Solution_> extends AbstractAcceptor<Solution_> {
1515

1616
private final RestartStrategy<Solution_> restartStrategy;
17-
private final boolean enabled;
1817

19-
protected ReconfigurableAcceptor(boolean enabled, RestartStrategy<Solution_> restartStrategy) {
20-
this.enabled = enabled;
18+
protected ReconfigurableAcceptor(RestartStrategy<Solution_> restartStrategy) {
2119
this.restartStrategy = restartStrategy;
2220
}
2321

24-
protected boolean isEnabled() {
25-
return enabled;
26-
}
27-
2822
@Override
2923
public void solvingStarted(SolverScope<Solution_> solverScope) {
3024
super.solvingStarted(solverScope);
@@ -58,12 +52,12 @@ public void stepEnded(LocalSearchStepScope<Solution_> stepScope) {
5852
@Override
5953
@SuppressWarnings("unchecked")
6054
public boolean isAccepted(LocalSearchMoveScope<Solution_> moveScope) {
61-
if (enabled && restartStrategy.isTriggered(moveScope)) {
55+
if (restartStrategy.isTriggered(moveScope)) {
6256
moveScope.getStepScope().getPhaseScope().triggerReconfiguration();
6357
return true;
6458
}
6559
var accepted = evaluate(moveScope);
66-
var improved = enabled && moveScope.getScore().compareTo(moveScope.getStepScope().getPhaseScope().getBestScore()) > 0;
60+
var improved = moveScope.getScore().compareTo(moveScope.getStepScope().getPhaseScope().getBestScore()) > 0;
6761
if (improved) {
6862
restartStrategy.reset(moveScope);
6963
}

core/src/main/java/ai/timefold/solver/core/impl/localsearch/decider/acceptor/lateacceptance/DiversifiedLateAcceptanceAcceptor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ public class DiversifiedLateAcceptanceAcceptor<Solution_> extends Reconfigurable
2020
protected Score<?>[] previousScores;
2121
protected int lateScoreIndex = -1;
2222

23-
public DiversifiedLateAcceptanceAcceptor(boolean enableReconfiguration, RestartStrategy<Solution_> restartStrategy) {
24-
super(enableReconfiguration, restartStrategy);
23+
public DiversifiedLateAcceptanceAcceptor(RestartStrategy<Solution_> restartStrategy) {
24+
super(restartStrategy);
2525
}
2626

2727
public void setLateAcceptanceSize(int lateAcceptanceSize) {

core/src/main/java/ai/timefold/solver/core/impl/localsearch/decider/acceptor/lateacceptance/LateAcceptanceAcceptor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ public class LateAcceptanceAcceptor<Solution_> extends ReconfigurableAcceptor<So
1717
protected Score<?>[] previousScores;
1818
protected int lateScoreIndex = -1;
1919

20-
public LateAcceptanceAcceptor(boolean enableReconfiguration, RestartStrategy<Solution_> restartStrategy) {
21-
super(enableReconfiguration, restartStrategy);
20+
public LateAcceptanceAcceptor(RestartStrategy<Solution_> restartStrategy) {
21+
super(restartStrategy);
2222
}
2323

2424
public void setLateAcceptanceSize(int lateAcceptanceSize) {

core/src/main/java/ai/timefold/solver/core/impl/localsearch/decider/acceptor/restart/NoOpRestartStrategy.java

Lines changed: 0 additions & 49 deletions
This file was deleted.

0 commit comments

Comments
 (0)