Skip to content

Commit 24e567a

Browse files
committed
chore: test strength and difficulty comparators
1 parent 8223d2c commit 24e567a

7 files changed

Lines changed: 57 additions & 6 deletions

core/src/test/java/ai/timefold/solver/core/impl/solver/DefaultSolverTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1903,6 +1903,11 @@ void solveMultiEntityMoveConfigMixedModel(MoveSelectorConfig moveSelectionConfig
19031903
assertThat(solution.getOtherEntityList().stream()
19041904
.filter(e -> e.getBasicValue() == null || e.getSecondBasicValue() == null))
19051905
.isEmpty();
1906+
for (var entity : solution.getOtherEntityList()) {
1907+
// The strength comparator will cause the basic variables to differ during the CH phase,
1908+
// and LS will find no improvement
1909+
assertThat(entity.getBasicValue()).isNotSameAs(entity.getSecondBasicValue());
1910+
}
19061911
}
19071912

19081913
public static final class MinimizeUnusedEntitiesEasyScoreCalculator

core/src/test/java/ai/timefold/solver/core/testdomain/mixed/multientity/TestdataMixedMultiEntityFirstEntity.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,22 @@
77
import ai.timefold.solver.core.api.domain.variable.PlanningListVariable;
88
import ai.timefold.solver.core.testdomain.TestdataObject;
99

10-
@PlanningEntity
10+
@PlanningEntity(difficultyComparatorClass = TestdataMixedMultiEntityFirstEntityComparator.class)
1111
public class TestdataMixedMultiEntityFirstEntity extends TestdataObject {
1212

1313
@PlanningListVariable(valueRangeProviderRefs = "valueRange")
1414
private List<TestdataMixedMultiEntityFirstValue> valueList;
1515

16+
private int difficulty;
17+
1618
public TestdataMixedMultiEntityFirstEntity() {
1719
// Required for cloner
1820
}
1921

20-
public TestdataMixedMultiEntityFirstEntity(String code) {
22+
public TestdataMixedMultiEntityFirstEntity(String code, int difficulty) {
2123
super(code);
2224
valueList = new ArrayList<>();
25+
this.difficulty = difficulty;
2326
}
2427

2528
public List<TestdataMixedMultiEntityFirstValue> getValueList() {
@@ -29,4 +32,12 @@ public List<TestdataMixedMultiEntityFirstValue> getValueList() {
2932
public void setValueList(List<TestdataMixedMultiEntityFirstValue> valueList) {
3033
this.valueList = valueList;
3134
}
35+
36+
public int getDifficulty() {
37+
return difficulty;
38+
}
39+
40+
public void setDifficulty(int difficulty) {
41+
this.difficulty = difficulty;
42+
}
3243
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package ai.timefold.solver.core.testdomain.mixed.multientity;
2+
3+
import java.util.Comparator;
4+
5+
public class TestdataMixedMultiEntityFirstEntityComparator implements Comparator<TestdataMixedMultiEntityFirstEntity> {
6+
@Override
7+
public int compare(TestdataMixedMultiEntityFirstEntity v1, TestdataMixedMultiEntityFirstEntity v2) {
8+
// ASC sort
9+
return v1.getDifficulty() - v2.getDifficulty();
10+
}
11+
}

core/src/test/java/ai/timefold/solver/core/testdomain/mixed/multientity/TestdataMixedMultiEntitySecondEntity.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
@PlanningEntity
88
public class TestdataMixedMultiEntitySecondEntity extends TestdataObject {
99

10-
@PlanningVariable(valueRangeProviderRefs = "otherValueRange")
10+
@PlanningVariable(valueRangeProviderRefs = "otherValueRange",
11+
strengthComparatorClass = TestdataMixedMultiEntitySecondValueComparator.class)
1112
private TestdataMixedMultiEntitySecondValue basicValue;
1213

1314
@PlanningVariable(valueRangeProviderRefs = "otherValueRange")

core/src/test/java/ai/timefold/solver/core/testdomain/mixed/multientity/TestdataMixedMultiEntitySecondValue.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,22 @@
66
@PlanningEntity
77
public class TestdataMixedMultiEntitySecondValue extends TestdataObject {
88

9+
private int strength;
10+
911
public TestdataMixedMultiEntitySecondValue() {
1012
// Required for cloner
1113
}
1214

13-
public TestdataMixedMultiEntitySecondValue(String code) {
15+
public TestdataMixedMultiEntitySecondValue(String code, int strength) {
1416
super(code);
17+
this.strength = strength;
18+
}
19+
20+
public int getStrength() {
21+
return strength;
22+
}
23+
24+
public void setStrength(int strength) {
25+
this.strength = strength;
1526
}
1627
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package ai.timefold.solver.core.testdomain.mixed.multientity;
2+
3+
import java.util.Comparator;
4+
5+
public class TestdataMixedMultiEntitySecondValueComparator implements Comparator<TestdataMixedMultiEntitySecondValue> {
6+
@Override
7+
public int compare(TestdataMixedMultiEntitySecondValue v1, TestdataMixedMultiEntitySecondValue v2) {
8+
// ASC sort
9+
return v1.getStrength() - v2.getStrength();
10+
}
11+
}

core/src/test/java/ai/timefold/solver/core/testdomain/mixed/multientity/TestdataMixedMultiEntitySolution.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,16 @@ public static TestdataMixedMultiEntitySolution generateUninitializedSolution(int
2727
for (int i = 0; i < valueListSize; i++) {
2828
valueList.add(new TestdataMixedMultiEntityFirstValue("Generated Value " + i));
2929
}
30+
var strength = otherValueListSize * 10;
3031
for (int i = 0; i < otherValueListSize; i++) {
31-
otherValueList.add(new TestdataMixedMultiEntitySecondValue("Generated Other Value " + i));
32+
otherValueList.add(new TestdataMixedMultiEntitySecondValue("Generated Other Value " + i, strength--));
3233
}
3334
solution.setValueList(valueList);
3435
solution.setOtherValueList(otherValueList);
3536
var entityList = new ArrayList<TestdataMixedMultiEntityFirstEntity>(entityListSize);
3637
var otherEntityList = new ArrayList<TestdataMixedMultiEntitySecondEntity>(entityListSize);
3738
for (int i = 0; i < entityListSize; i++) {
38-
var entity = new TestdataMixedMultiEntityFirstEntity("Entity " + i);
39+
var entity = new TestdataMixedMultiEntityFirstEntity("Entity " + i, i);
3940
entityList.add(entity);
4041
var otherEntity = new TestdataMixedMultiEntitySecondEntity("Other Entity " + i);
4142
otherEntityList.add(otherEntity);

0 commit comments

Comments
 (0)