Skip to content

Commit d660483

Browse files
committed
chore: fetch reachable values by range descriptor
1 parent 0be77ae commit d660483

File tree

4 files changed

+12
-9
lines changed

4 files changed

+12
-9
lines changed

core/src/main/java/ai/timefold/solver/core/impl/heuristic/selector/entity/decorator/FilteringEntityValueRangeSelector.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ public void phaseStarted(AbstractPhaseScope<Solution_> phaseScope) {
6262
super.phaseStarted(phaseScope);
6363
this.entitiesSize = childEntitySelector.getEntityDescriptor().extractEntities(phaseScope.getWorkingSolution()).size();
6464
this.reachableValues = phaseScope.getScoreDirector().getValueRangeManager()
65-
.getReachableValeMatrix(childEntitySelector.getEntityDescriptor().getGenuineListVariableDescriptor());
65+
.getReachableValueMatrix(
66+
childEntitySelector.getEntityDescriptor().getGenuineListVariableDescriptor().getValueRangeDescriptor());
6667
this.childEntitySelector.phaseStarted(phaseScope);
6768
}
6869

core/src/main/java/ai/timefold/solver/core/impl/heuristic/selector/value/decorator/FilteringValueRangeSelector.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public void phaseStarted(AbstractPhaseScope<Solution_> phaseScope) {
7676
this.nonReplayingValueSelector.phaseStarted(phaseScope);
7777
this.replayingValueSelector.phaseStarted(phaseScope);
7878
this.reachableValues = phaseScope.getScoreDirector().getValueRangeManager()
79-
.getReachableValeMatrix(listVariableStateSupply.getSourceVariableDescriptor());
79+
.getReachableValueMatrix(listVariableStateSupply.getSourceVariableDescriptor().getValueRangeDescriptor());
8080
valuesSize = reachableValues.getSize();
8181
}
8282

core/src/main/java/ai/timefold/solver/core/impl/score/director/ValueRangeManager.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,9 @@ public final class ValueRangeManager<Solution_> {
5959
private final Map<ValueRangeDescriptor<Solution_>, CountableValueRange<?>> fromSolutionMap = new IdentityHashMap<>();
6060
private final Map<Object, Map<ValueRangeDescriptor<Solution_>, CountableValueRange<?>>> fromEntityMap =
6161
new IdentityHashMap<>();
62+
private final Map<ValueRangeDescriptor<Solution_>, ReachableValues> fromReachableValuesMap =
63+
new IdentityHashMap<>();
6264

63-
private @Nullable ReachableValues reachableValues = null;
6465
private @Nullable Solution_ cachedWorkingSolution = null;
6566
private @Nullable SolutionInitializationStatistics cachedInitializationStatistics = null;
6667
private @Nullable ProblemSizeStatistics cachedProblemSizeStatistics = null;
@@ -414,15 +415,15 @@ public long countOnEntity(ValueRangeDescriptor<Solution_> valueRangeDescriptor,
414415
.getSize();
415416
}
416417

417-
public ReachableValues getReachableValeMatrix(ListVariableDescriptor<Solution_> listVariableDescriptor) {
418+
public ReachableValues getReachableValueMatrix(ValueRangeDescriptor<Solution_> valueRangeDescriptor) {
419+
var reachableValues = fromReachableValuesMap.get(valueRangeDescriptor);
418420
if (reachableValues == null) {
419421
if (cachedWorkingSolution == null) {
420422
throw new IllegalStateException(
421423
"Impossible state: the matrix %s requested before the working solution is known."
422424
.formatted(ReachableValues.class.getSimpleName()));
423425
}
424-
var entityDescriptor = listVariableDescriptor.getEntityDescriptor();
425-
var valueRangeDescriptor = listVariableDescriptor.getValueRangeDescriptor();
426+
var entityDescriptor = valueRangeDescriptor.getVariableDescriptor().getEntityDescriptor();
426427
var entityList = entityDescriptor.extractEntities(cachedWorkingSolution);
427428
var allValues = getFromSolution(valueRangeDescriptor);
428429
var valuesSize = allValues.getSize();
@@ -449,6 +450,7 @@ public ReachableValues getReachableValeMatrix(ListVariableDescriptor<Solution_>
449450
}
450451
}
451452
reachableValues = new ReachableValues(entityMatrix, valueMatrix);
453+
fromReachableValuesMap.put(valueRangeDescriptor, reachableValues);
452454
}
453455
return reachableValues;
454456
}
@@ -482,7 +484,7 @@ private static void updateValueMap(Map<Object, Set<Object>> valueMatrix, Countab
482484
public void reset(@Nullable Solution_ workingSolution) {
483485
fromSolutionMap.clear();
484486
fromEntityMap.clear();
485-
reachableValues = null;
487+
fromReachableValuesMap.clear();
486488
// We only update the cached solution if it is not null; null means to only reset the maps.
487489
if (workingSolution != null) {
488490
cachedWorkingSolution = workingSolution;

core/src/test/java/ai/timefold/solver/core/impl/heuristic/selector/common/ReachableMatrixTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ void testReachableEntities() {
3232
var solutionDescriptor = scoreDirector.getSolutionDescriptor();
3333
var entityDescriptor = solutionDescriptor.findEntityDescriptor(TestdataListEntityProvidingEntity.class);
3434
var reachableValues = scoreDirector.getValueRangeManager()
35-
.getReachableValeMatrix(entityDescriptor.getGenuineListVariableDescriptor());
35+
.getReachableValueMatrix(entityDescriptor.getGenuineListVariableDescriptor().getValueRangeDescriptor());
3636

3737
assertThat(reachableValues.extractEntities(v1)).containsExactlyInAnyOrder(a);
3838
assertThat(reachableValues.extractEntities(v2)).containsExactlyInAnyOrder(a, b);
@@ -60,7 +60,7 @@ void testReachableValues() {
6060
var solutionDescriptor = scoreDirector.getSolutionDescriptor();
6161
var entityDescriptor = solutionDescriptor.findEntityDescriptor(TestdataListEntityProvidingEntity.class);
6262
var reachableValues = scoreDirector.getValueRangeManager()
63-
.getReachableValeMatrix(entityDescriptor.getGenuineListVariableDescriptor());
63+
.getReachableValueMatrix(entityDescriptor.getGenuineListVariableDescriptor().getValueRangeDescriptor());
6464

6565
assertThat(reachableValues.extractValues(v1)).containsExactlyInAnyOrder(v2, v3);
6666
assertThat(reachableValues.extractValues(v2)).containsExactlyInAnyOrder(v1, v3);

0 commit comments

Comments
 (0)