Skip to content

Commit 62bcf7e

Browse files
chore: review comments
1 parent 9c6c09c commit 62bcf7e

13 files changed

Lines changed: 44 additions & 44 deletions

core/src/main/java/ai/timefold/solver/core/impl/domain/variable/ShadowVariableSupport.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ public void resetWorkingSolution() {
305305
scoreDirector,
306306
shadowVariableGraphCreator);
307307
shadowVariableSession =
308-
shadowVariableSessionFactory.forSolution(consistencyTracker, scoreDirector.ignoreInconsistentSolutions(),
308+
shadowVariableSessionFactory.forSolution(consistencyTracker,
309309
scoreDirector.getWorkingSolution());
310310
}
311311
}
@@ -423,7 +423,7 @@ public boolean updateShadowVariables() {
423423
return true;
424424
}
425425

426-
public List<Object> getInconsistentEntities() {
426+
public Collection<Object> getInconsistentEntities() {
427427
if (shadowVariableSession == null) {
428428
throw new IllegalStateException(
429429
"Impossible state: The shadowVariableSession is null. A solution without shadow variables cannot be inconsistent.");

core/src/main/java/ai/timefold/solver/core/impl/domain/variable/ShadowVariableUpdateHelper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ public static <Solution_> InternalShadowVariableSession<Solution_> build(
9696
DefaultShadowVariableSessionFactory.buildGraph(
9797
new DefaultShadowVariableSessionFactory.GraphDescriptor<>(solutionDescriptor,
9898
ChangedVariableNotifier.empty(), entities)
99-
.assertingNoReferencedMissingEntities(),
100-
ignoreInconsistentSolutions));
99+
.assertingNoReferencedMissingEntities()));
101100
}
102101

103102
/**

core/src/main/java/ai/timefold/solver/core/impl/domain/variable/declarative/AbstractVariableReferenceGraph.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ public abstract sealed class AbstractVariableReferenceGraph<Solution_, ChangeTra
8585
* so {@link #beforeVariableChanged(VariableMetaModel, Object)}
8686
* and {@link #afterVariableChanged(VariableMetaModel, Object)}
8787
* can short circuit.
88+
*
89+
* @return true if the update successful; false otherwise
8890
*/
8991
abstract boolean innerUpdateChanged();
9092

core/src/main/java/ai/timefold/solver/core/impl/domain/variable/declarative/AffectedEntitiesUpdater.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ private boolean updateEntityShadowVariables(GraphNode<Solution_> entityVariable,
136136
// Do not need to update anyChanged here; the graph already marked
137137
// all nodes whose looped status changed for us
138138

139-
if (!ignoreInconsistentSolutions || !consistencyProcessed) {
139+
if (!(ignoreInconsistentSolutions && consistencyProcessed)) {
140140
var groupEntities = shadowVariableReferences.get(0).groupEntities();
141141
var groupEntityIds = entityVariable.groupEntityIds();
142142

core/src/main/java/ai/timefold/solver/core/impl/domain/variable/declarative/ConsistencyTracker.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,7 @@ void setUnknownConsistencyFromEntityShadowVariablesInconsistent(SolutionDescript
6363
new DefaultShadowVariableSessionFactory.GraphDescriptor<>(solutionDescriptor,
6464
ChangedVariableNotifier.empty(), entities)
6565
.withConsistencyTracker(this)
66-
.assertingNoReferencedMissingEntities(),
67-
ignoreInconsistentSolutions);
66+
.assertingNoReferencedMissingEntities());
6867

6968
// Graph will either be DefaultVariableReferenceGraph or EmptyVariableReferenceGraph
7069
// If it is empty, we don't need to do anything.

core/src/main/java/ai/timefold/solver/core/impl/domain/variable/declarative/DefaultShadowVariableSession.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package ai.timefold.solver.core.impl.domain.variable.declarative;
22

3-
import java.util.List;
3+
import java.util.Collection;
44

55
import ai.timefold.solver.core.impl.domain.variable.descriptor.ListVariableDescriptor;
66
import ai.timefold.solver.core.impl.domain.variable.descriptor.VariableDescriptor;
@@ -53,7 +53,7 @@ public boolean updateVariables() {
5353
return graph.updateChanged();
5454
}
5555

56-
public List<Object> getInconsistentEntities() {
56+
public Collection<Object> getInconsistentEntities() {
5757
return graph.getInconsistentEntities();
5858
}
5959
}

core/src/main/java/ai/timefold/solver/core/impl/domain/variable/declarative/DefaultShadowVariableSessionFactory.java

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ public record GraphDescriptor<Solution_>(ConsistencyTracker<Solution_> consisten
8181
VariableReferenceGraphBuilder<Solution_> variableReferenceGraphBuilder,
8282
Object[] entities, IntFunction<TopologicalOrderGraph> graphCreator) {
8383

84+
public boolean ignoreInconsistentSolutions() {
85+
return !solutionDescriptor.hasAnyShadowVariablesInconsistentMember();
86+
}
87+
8488
public GraphDescriptor(SolutionDescriptor<Solution_> solutionDescriptor,
8589
ChangedVariableNotifier<Solution_> changedVariableNotifier,
8690
Object... entities) {
@@ -162,31 +166,29 @@ public ChangedVariableNotifier<Solution_> changedVariableNotifier() {
162166
}
163167
}
164168

165-
public static <Solution_> VariableReferenceGraph buildGraph(GraphDescriptor<Solution_> graphDescriptor,
166-
boolean ignoreInconsistentSolutions) {
169+
public static <Solution_> VariableReferenceGraph buildGraph(GraphDescriptor<Solution_> graphDescriptor) {
167170
var graphStructureAndDirection = GraphStructure.determineGraphStructure(graphDescriptor.solutionDescriptor(),
168171
graphDescriptor.entities());
169172
LOGGER.trace("Shadow variable graph structure: {}", graphStructureAndDirection);
170-
return buildGraphForStructureAndDirection(graphStructureAndDirection, graphDescriptor, ignoreInconsistentSolutions);
173+
return buildGraphForStructureAndDirection(graphStructureAndDirection, graphDescriptor);
171174
}
172175

173176
static <Solution_> VariableReferenceGraph buildGraphForStructureAndDirection(
174-
GraphStructure.GraphStructureAndDirection graphStructureAndDirection, GraphDescriptor<Solution_> graphDescriptor,
175-
boolean ignoreInconsistentSolutions) {
177+
GraphStructure.GraphStructureAndDirection graphStructureAndDirection, GraphDescriptor<Solution_> graphDescriptor) {
176178
return switch (graphStructureAndDirection.structure()) {
177179
case EMPTY -> EmptyVariableReferenceGraph.INSTANCE;
178180
case SINGLE_DIRECTIONAL_PARENT -> {
179181
var scoreDirector =
180182
graphDescriptor.variableReferenceGraphBuilder().changedVariableNotifier.innerScoreDirector();
181183
if (scoreDirector == null) {
182-
yield buildArbitraryGraph(graphDescriptor, ignoreInconsistentSolutions);
184+
yield buildArbitraryGraph(graphDescriptor);
183185
}
184186
yield buildSingleDirectionalParentGraph(graphDescriptor, graphStructureAndDirection);
185187
}
186188
case ARBITRARY_SINGLE_ENTITY_AT_MOST_ONE_DIRECTIONAL_PARENT_TYPE ->
187-
buildArbitrarySingleEntityGraph(graphDescriptor, ignoreInconsistentSolutions);
189+
buildArbitrarySingleEntityGraph(graphDescriptor);
188190
case NO_DYNAMIC_EDGES, ARBITRARY ->
189-
buildArbitraryGraph(graphDescriptor, ignoreInconsistentSolutions);
191+
buildArbitraryGraph(graphDescriptor);
190192
};
191193
}
192194

@@ -282,8 +284,7 @@ yield new TopologicalSorter(listStateSupply::getPreviousElement,
282284
};
283285
}
284286

285-
private static <Solution_> VariableReferenceGraph buildArbitraryGraph(GraphDescriptor<Solution_> graphDescriptor,
286-
boolean ignoreInconsistentSolutions) {
287+
private static <Solution_> VariableReferenceGraph buildArbitraryGraph(GraphDescriptor<Solution_> graphDescriptor) {
287288
var declarativeShadowVariableDescriptors =
288289
graphDescriptor.solutionDescriptor().getDeclarativeShadowVariableDescriptors();
289290
var variableIdToUpdater = EntityVariableUpdaterLookup.<Solution_> entityIndependentLookup();
@@ -297,14 +298,13 @@ private static <Solution_> VariableReferenceGraph buildArbitraryGraph(GraphDescr
297298
graphDescriptor,
298299
declarativeShadowVariableDescriptors, variableIdToUpdater);
299300
return buildVariableReferenceGraph(graphDescriptor, declarativeShadowVariableDescriptors,
300-
declarativeShadowVariableToAliasMap, ignoreInconsistentSolutions);
301+
declarativeShadowVariableToAliasMap);
301302
}
302303

303304
private static <Solution_> VariableReferenceGraph buildVariableReferenceGraph(
304305
GraphDescriptor<Solution_> graphDescriptor,
305306
List<DeclarativeShadowVariableDescriptor<Solution_>> declarativeShadowVariableDescriptors,
306-
Map<VariableMetaModel<?, ?, ?>, Set<VariableSourceReference>> declarativeShadowVariableToAliasMap,
307-
boolean ignoreInconsistentSolutions) {
307+
Map<VariableMetaModel<?, ?, ?>, Set<VariableSourceReference>> declarativeShadowVariableToAliasMap) {
308308
// Create variable processors for each declarative shadow variable descriptor
309309
for (var declarativeShadowVariable : declarativeShadowVariableDescriptors) {
310310
var fromVariableId = declarativeShadowVariable.getVariableMetaModel();
@@ -320,7 +320,7 @@ private static <Solution_> VariableReferenceGraph buildVariableReferenceGraph(
320320
createFixedVariableRelationEdges(graphDescriptor.variableReferenceGraphBuilder(), graphDescriptor.entities(),
321321
declarativeShadowVariableDescriptors);
322322
return graphDescriptor.variableReferenceGraphBuilder().build(graphDescriptor.graphCreator(),
323-
ignoreInconsistentSolutions);
323+
graphDescriptor.ignoreInconsistentSolutions());
324324
}
325325

326326
private record GroupVariableUpdaterInfo<Solution_>(
@@ -455,7 +455,7 @@ public List<VariableUpdaterInfo<Solution_>> getUpdatersForEntityVariable(Object
455455
}
456456

457457
private static <Solution_> VariableReferenceGraph buildArbitrarySingleEntityGraph(
458-
GraphDescriptor<Solution_> graphDescriptor, boolean ignoreInconsistentSolutions) {
458+
GraphDescriptor<Solution_> graphDescriptor) {
459459
var declarativeShadowVariableDescriptors =
460460
graphDescriptor.solutionDescriptor().getDeclarativeShadowVariableDescriptors();
461461
// Use a dependent lookup; if an entity does not use groups, then all variables can share the same node.
@@ -487,7 +487,7 @@ private static <Solution_> VariableReferenceGraph buildArbitrarySingleEntityGrap
487487
(entity, declarativeShadowVariable, variableId) -> variableIdToGroupedUpdater.get(variableId)
488488
.getUpdatersForEntityVariable(entity, declarativeShadowVariable));
489489
return buildVariableReferenceGraph(graphDescriptor, declarativeShadowVariableDescriptors,
490-
declarativeShadowVariableToAliasMap, ignoreInconsistentSolutions);
490+
declarativeShadowVariableToAliasMap);
491491
}
492492

493493
private static <Solution_> Map<VariableMetaModel<?, ?, ?>, Set<VariableSourceReference>> createGraphNodes(
@@ -741,21 +741,18 @@ private static <Solution_> void createFixedVariableRelationEdges(
741741
}
742742

743743
public DefaultShadowVariableSession<Solution_> forSolution(ConsistencyTracker<Solution_> consistencyTracker,
744-
boolean ignoreInconsistentSolutions,
745744
Solution_ solution) {
746745
var entities = new ArrayList<>();
747746
solutionDescriptor.visitAllEntities(solution, entities::add);
748-
return forEntities(consistencyTracker, ignoreInconsistentSolutions, entities.toArray());
747+
return forEntities(consistencyTracker, entities.toArray());
749748
}
750749

751750
public DefaultShadowVariableSession<Solution_> forEntities(ConsistencyTracker<Solution_> consistencyTracker,
752-
boolean ignoreInconsistentSolutions,
753751
Object... entities) {
754752
var graph = buildGraph(
755753
new GraphDescriptor<>(solutionDescriptor, ChangedVariableNotifier.of(scoreDirector), entities)
756754
.withConsistencyTracker(consistencyTracker)
757-
.withGraphCreator(graphCreator),
758-
ignoreInconsistentSolutions);
755+
.withGraphCreator(graphCreator));
759756
return new DefaultShadowVariableSession<>(graph);
760757
}
761758
}

core/src/main/java/ai/timefold/solver/core/impl/domain/variable/declarative/DefaultVariableReferenceGraph.java

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

33
import java.util.ArrayList;
44
import java.util.BitSet;
5+
import java.util.Collection;
56
import java.util.IdentityHashMap;
7+
import java.util.LinkedHashSet;
68
import java.util.List;
79
import java.util.function.IntFunction;
810

9-
import ai.timefold.solver.core.impl.util.LinkedIdentityHashSet;
10-
1111
import org.jspecify.annotations.NonNull;
1212

1313
final class DefaultVariableReferenceGraph<Solution_> extends AbstractVariableReferenceGraph<Solution_, BitSet> {
@@ -75,8 +75,8 @@ public void setUnknownInconsistencyValues() {
7575
}
7676

7777
@Override
78-
public List<Object> getInconsistentEntities() {
79-
var out = new LinkedIdentityHashSet<>();
78+
public Collection<Object> getInconsistentEntities() {
79+
var out = new LinkedHashSet<>();
8080
var graphTrackingInconsistentEntities = new DefaultTopologicalOrderGraph(this.nodeTopologicalOrders.length);
8181
graph.forEachEdge(graphTrackingInconsistentEntities::addEdge);
8282
graphTrackingInconsistentEntities.commitChanges(new BitSet());
@@ -87,6 +87,6 @@ public List<Object> getInconsistentEntities() {
8787
out.add(node.entity());
8888
}
8989
}
90-
return new ArrayList<>(out);
90+
return out;
9191
}
9292
}

core/src/main/java/ai/timefold/solver/core/impl/domain/variable/declarative/EmptyVariableReferenceGraph.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package ai.timefold.solver.core.impl.domain.variable.declarative;
22

3+
import java.util.Collection;
34
import java.util.Collections;
4-
import java.util.List;
55

66
import ai.timefold.solver.core.preview.api.domain.metamodel.VariableMetaModel;
77

@@ -26,7 +26,7 @@ public void afterVariableChanged(VariableMetaModel<?, ?, ?> variableReference, O
2626
}
2727

2828
@Override
29-
public List<Object> getInconsistentEntities() {
29+
public Collection<Object> getInconsistentEntities() {
3030
return Collections.emptyList();
3131
}
3232

core/src/main/java/ai/timefold/solver/core/impl/domain/variable/declarative/FixedVariableReferenceGraph.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package ai.timefold.solver.core.impl.domain.variable.declarative;
22

33
import java.util.BitSet;
4+
import java.util.Collection;
45
import java.util.Collections;
5-
import java.util.List;
66
import java.util.PriorityQueue;
77
import java.util.Spliterators;
88
import java.util.function.IntFunction;
@@ -110,7 +110,7 @@ boolean innerUpdateChanged() {
110110
}
111111

112112
@Override
113-
public List<Object> getInconsistentEntities() {
113+
public Collection<Object> getInconsistentEntities() {
114114
return Collections.emptyList();
115115
}
116116
}

0 commit comments

Comments
 (0)