Skip to content

Commit 3e3f6e2

Browse files
committed
chore: address comments
1 parent b3077cc commit 3e3f6e2

File tree

5 files changed

+12
-28
lines changed

5 files changed

+12
-28
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,7 @@ 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-
.getReachableValueMatrix(
66-
childEntitySelector.getEntityDescriptor().getGenuineListVariableDescriptor().getValueRangeDescriptor());
65+
.getReachableValues(phaseScope.getScoreDirector().getSolutionDescriptor().getListVariableDescriptor());
6766
this.childEntitySelector.phaseStarted(phaseScope);
6867
}
6968

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-
.getReachableValueMatrix(listVariableStateSupply.getSourceVariableDescriptor().getValueRangeDescriptor());
79+
.getReachableValues(listVariableStateSupply.getSourceVariableDescriptor());
8080
valuesSize = reachableValues.getSize();
8181
}
8282

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

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,7 @@ 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<>();
62+
private @Nullable ReachableValues reachableValues = null;
6463

6564
private @Nullable Solution_ cachedWorkingSolution = null;
6665
private @Nullable SolutionInitializationStatistics cachedInitializationStatistics = null;
@@ -415,32 +414,30 @@ public long countOnEntity(ValueRangeDescriptor<Solution_> valueRangeDescriptor,
415414
.getSize();
416415
}
417416

418-
public ReachableValues getReachableValueMatrix(ValueRangeDescriptor<Solution_> valueRangeDescriptor) {
419-
var reachableValues = fromReachableValuesMap.get(valueRangeDescriptor);
417+
public ReachableValues getReachableValues(ListVariableDescriptor<Solution_> listVariableDescriptor) {
420418
if (reachableValues == null) {
421419
if (cachedWorkingSolution == null) {
422420
throw new IllegalStateException(
423-
"Impossible state: the matrix %s requested before the working solution is known."
424-
.formatted(ReachableValues.class.getSimpleName()));
421+
"Impossible state: value reachability requested before the working solution is known.");
425422
}
426-
var entityDescriptor = valueRangeDescriptor.getVariableDescriptor().getEntityDescriptor();
423+
var entityDescriptor = listVariableDescriptor.getEntityDescriptor();
427424
var entityList = entityDescriptor.extractEntities(cachedWorkingSolution);
428-
var allValues = getFromSolution(valueRangeDescriptor);
425+
var allValues = getFromSolution(listVariableDescriptor.getValueRangeDescriptor());
429426
var valuesSize = allValues.getSize();
430427
if (valuesSize > Integer.MAX_VALUE) {
431428
throw new IllegalStateException(
432429
"The matrix %s cannot be built for the entity %s (%s) because value range has a size (%d) which is higher than Integer.MAX_VALUE."
433430
.formatted(ReachableValues.class.getSimpleName(),
434431
entityDescriptor.getEntityClass().getSimpleName(),
435-
valueRangeDescriptor.getVariableDescriptor().getVariableName(), valuesSize));
432+
listVariableDescriptor.getVariableName(), valuesSize));
436433
}
437434
// list of entities reachable for a value
438435
var entityMatrix = new IdentityHashMap<Object, Set<Object>>((int) valuesSize);
439436
// list of values reachable for a value
440437
var valueMatrix = new IdentityHashMap<Object, Set<Object>>((int) valuesSize);
441438
for (var entity : entityList) {
442439
var valuesIterator = allValues.createOriginalIterator();
443-
var range = getFromEntity(valueRangeDescriptor, entity);
440+
var range = getFromEntity(listVariableDescriptor.getValueRangeDescriptor(), entity);
444441
while (valuesIterator.hasNext()) {
445442
var value = valuesIterator.next();
446443
if (range.contains(value)) {
@@ -450,7 +447,6 @@ public ReachableValues getReachableValueMatrix(ValueRangeDescriptor<Solution_> v
450447
}
451448
}
452449
reachableValues = new ReachableValues(entityMatrix, valueMatrix);
453-
fromReachableValuesMap.put(valueRangeDescriptor, reachableValues);
454450
}
455451
return reachableValues;
456452
}
@@ -484,7 +480,7 @@ private static void updateValueMap(Map<Object, Set<Object>> valueMatrix, Countab
484480
public void reset(@Nullable Solution_ workingSolution) {
485481
fromSolutionMap.clear();
486482
fromEntityMap.clear();
487-
fromReachableValuesMap.clear();
483+
reachableValues = null;
488484
// We only update the cached solution if it is not null; null means to only reset the maps.
489485
if (workingSolution != null) {
490486
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-
.getReachableValueMatrix(entityDescriptor.getGenuineListVariableDescriptor().getValueRangeDescriptor());
35+
.getReachableValues(entityDescriptor.getGenuineListVariableDescriptor());
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-
.getReachableValueMatrix(entityDescriptor.getGenuineListVariableDescriptor().getValueRangeDescriptor());
63+
.getReachableValues(entityDescriptor.getGenuineListVariableDescriptor());
6464

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

core/src/test/java/ai/timefold/solver/core/testdomain/list/TestdataListUtils.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import ai.timefold.solver.core.impl.domain.entity.descriptor.EntityDescriptor;
1818
import ai.timefold.solver.core.impl.domain.solution.descriptor.SolutionDescriptor;
1919
import ai.timefold.solver.core.impl.domain.valuerange.descriptor.ValueRangeDescriptor;
20-
import ai.timefold.solver.core.impl.domain.variable.descriptor.BasicVariableDescriptor;
2120
import ai.timefold.solver.core.impl.domain.variable.descriptor.ListVariableDescriptor;
2221
import ai.timefold.solver.core.impl.heuristic.HeuristicConfigPolicy;
2322
import ai.timefold.solver.core.impl.heuristic.selector.SelectorTestUtils;
@@ -253,16 +252,6 @@ public static <Solution_> ListVariableDescriptor<Solution_> getListVariableDescr
253252
.getGenuineVariableDescriptor("valueList");
254253
}
255254

256-
public static <Solution_> BasicVariableDescriptor<Solution_> getBasicVariableDescriptor(
257-
InnerScoreDirector<Solution_, ?> scoreDirector) {
258-
return (BasicVariableDescriptor<Solution_>) scoreDirector
259-
.getSolutionDescriptor()
260-
.getGenuineEntityDescriptors()
261-
.iterator()
262-
.next()
263-
.getGenuineVariableDescriptor("value");
264-
}
265-
266255
public static <Solution_> EntityDescriptor<Solution_> getEntityDescriptor(
267256
InnerScoreDirector<Solution_, ?> scoreDirector) {
268257
return scoreDirector

0 commit comments

Comments
 (0)