Skip to content

Commit 2a4e2f0

Browse files
committed
Remove unnecessary code
1 parent 1897005 commit 2a4e2f0

12 files changed

+21
-256
lines changed

core/src/main/java/ai/timefold/solver/core/impl/bavet/AbstractSession.java

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,24 @@
22

33
import java.util.IdentityHashMap;
44
import java.util.Map;
5-
import java.util.stream.Stream;
65

7-
import ai.timefold.solver.core.api.domain.solution.PlanningSolution;
86
import ai.timefold.solver.core.impl.bavet.uni.AbstractForEachUniNode;
97
import ai.timefold.solver.core.impl.bavet.uni.AbstractForEachUniNode.LifecycleOperation;
10-
import ai.timefold.solver.core.impl.score.director.SessionContext;
118

129
public abstract class AbstractSession implements AutoCloseable {
1310

1411
private final NodeNetwork nodeNetwork;
15-
private final Map<Class<?>, AbstractForEachUniNode.InitializableForEachNode<Object>[]> initializeEffectiveClassToNodeArrayMap;
1612
private final Map<Class<?>, AbstractForEachUniNode<Object>[]> insertEffectiveClassToNodeArrayMap;
1713
private final Map<Class<?>, AbstractForEachUniNode<Object>[]> updateEffectiveClassToNodeArrayMap;
1814
private final Map<Class<?>, AbstractForEachUniNode<Object>[]> retractEffectiveClassToNodeArrayMap;
1915

2016
protected AbstractSession(NodeNetwork nodeNetwork) {
2117
this.nodeNetwork = nodeNetwork;
22-
this.initializeEffectiveClassToNodeArrayMap = new IdentityHashMap<>(nodeNetwork.forEachNodeCount());
2318
this.insertEffectiveClassToNodeArrayMap = new IdentityHashMap<>(nodeNetwork.forEachNodeCount());
2419
this.updateEffectiveClassToNodeArrayMap = new IdentityHashMap<>(nodeNetwork.forEachNodeCount());
2520
this.retractEffectiveClassToNodeArrayMap = new IdentityHashMap<>(nodeNetwork.forEachNodeCount());
2621
}
2722

28-
@SuppressWarnings({ "unchecked", "rawtypes" })
29-
public final void initialize(SessionContext context) {
30-
for (var node : findInitializableNodes()) {
31-
node.initialize(context);
32-
}
33-
}
34-
3523
public final void insert(Object fact) {
3624
var factClass = fact.getClass();
3725
for (var node : findNodes(factClass, LifecycleOperation.INSERT)) {
@@ -57,29 +45,6 @@ private AbstractForEachUniNode<Object>[] findNodes(Class<?> factClass, Lifecycle
5745
return nodeArray;
5846
}
5947

60-
@SuppressWarnings("unchecked")
61-
private AbstractForEachUniNode.InitializableForEachNode<Object>[] findInitializableNodes() {
62-
// There will only be one solution class in the problem.
63-
// Therefore we do not need to know what it is, and using the annotation class will serve as a unique key.
64-
var factClass = PlanningSolution.class;
65-
var effectiveClassToNodeArrayMap = initializeEffectiveClassToNodeArrayMap;
66-
// Map.computeIfAbsent() would have created lambdas on the hot path, this will not.
67-
var nodeArray = effectiveClassToNodeArrayMap.get(factClass);
68-
if (nodeArray == null) {
69-
nodeArray = nodeNetwork.getForEachNodes(factClass)
70-
.flatMap(node -> {
71-
if (node instanceof AbstractForEachUniNode.InitializableForEachNode<?> initializableForEachNode) {
72-
return Stream.of(initializableForEachNode);
73-
} else {
74-
return Stream.empty();
75-
}
76-
})
77-
.toArray(AbstractForEachUniNode.InitializableForEachNode[]::new);
78-
effectiveClassToNodeArrayMap.put(factClass, nodeArray);
79-
}
80-
return nodeArray;
81-
}
82-
8348
public final void update(Object fact) {
8449
var factClass = fact.getClass();
8550
for (var node : findNodes(factClass, LifecycleOperation.UPDATE)) {
@@ -100,11 +65,6 @@ public void settle() {
10065

10166
@Override
10267
public final void close() {
103-
for (var node : findInitializableNodes()) {
104-
// Initializable nodes get a supply manager, fair to assume they will be demanding supplies.
105-
// Give them the opportunity to cancel those demands.
106-
node.close();
107-
}
10868
}
10969

11070
}

core/src/main/java/ai/timefold/solver/core/impl/bavet/common/AbstractNodeBuildHelper.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
package ai.timefold.solver.core.impl.bavet.common;
22

3-
import ai.timefold.solver.core.impl.bavet.NodeNetwork;
4-
import ai.timefold.solver.core.impl.bavet.common.tuple.AbstractTuple;
5-
import ai.timefold.solver.core.impl.bavet.common.tuple.LeftTupleLifecycle;
6-
import ai.timefold.solver.core.impl.bavet.common.tuple.RightTupleLifecycle;
7-
import ai.timefold.solver.core.impl.bavet.common.tuple.TupleLifecycle;
8-
import ai.timefold.solver.core.impl.bavet.uni.AbstractForEachUniNode;
9-
103
import java.util.ArrayList;
114
import java.util.Collections;
125
import java.util.HashMap;
@@ -18,6 +11,13 @@
1811
import java.util.function.Consumer;
1912
import java.util.function.UnaryOperator;
2013

14+
import ai.timefold.solver.core.impl.bavet.NodeNetwork;
15+
import ai.timefold.solver.core.impl.bavet.common.tuple.AbstractTuple;
16+
import ai.timefold.solver.core.impl.bavet.common.tuple.LeftTupleLifecycle;
17+
import ai.timefold.solver.core.impl.bavet.common.tuple.RightTupleLifecycle;
18+
import ai.timefold.solver.core.impl.bavet.common.tuple.TupleLifecycle;
19+
import ai.timefold.solver.core.impl.bavet.uni.AbstractForEachUniNode;
20+
2121
public abstract class AbstractNodeBuildHelper<Stream_ extends BavetStream> {
2222

2323
private final Set<Stream_> activeStreamSet;

core/src/main/java/ai/timefold/solver/core/impl/bavet/uni/AbstractForEachUniNode.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import ai.timefold.solver.core.impl.bavet.common.tuple.TupleLifecycle;
1010
import ai.timefold.solver.core.impl.bavet.common.tuple.TupleState;
1111
import ai.timefold.solver.core.impl.bavet.common.tuple.UniTuple;
12-
import ai.timefold.solver.core.impl.score.director.SessionContext;
1312

1413
import org.jspecify.annotations.NullMarked;
1514
import org.jspecify.annotations.Nullable;
@@ -136,13 +135,4 @@ public enum LifecycleOperation {
136135
RETRACT
137136
}
138137

139-
public interface InitializableForEachNode<Solution_> extends AutoCloseable {
140-
141-
void initialize(SessionContext<Solution_> context);
142-
143-
@Override
144-
void close(); // Drop the checked exception.
145-
146-
}
147-
148138
}

core/src/main/java/ai/timefold/solver/core/impl/bavet/uni/ForEachFromSolutionUniNode.java

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

core/src/main/java/ai/timefold/solver/core/impl/bavet/uni/ForEachIncludingUnassignedUniNode.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@
77
import org.jspecify.annotations.Nullable;
88

99
@NullMarked
10-
public sealed class ForEachIncludingUnassignedUniNode<A>
11-
extends AbstractForEachUniNode<A>
12-
permits ForEachFromSolutionUniNode {
10+
public final class ForEachIncludingUnassignedUniNode<A>
11+
extends AbstractForEachUniNode<A> {
1312

1413
public ForEachIncludingUnassignedUniNode(Class<A> forEachClass, TupleLifecycle<UniTuple<A>> nextNodesTupleLifecycle,
1514
int outputStoreSize) {

core/src/main/java/ai/timefold/solver/core/impl/move/streams/DefaultMoveStreamFactory.java

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package ai.timefold.solver.core.impl.move.streams;
22

33
import ai.timefold.solver.core.config.solver.EnvironmentMode;
4-
import ai.timefold.solver.core.impl.domain.solution.descriptor.DefaultPlanningListVariableMetaModel;
5-
import ai.timefold.solver.core.impl.domain.solution.descriptor.DefaultPlanningVariableMetaModel;
64
import ai.timefold.solver.core.impl.domain.solution.descriptor.SolutionDescriptor;
7-
import ai.timefold.solver.core.impl.domain.variable.descriptor.GenuineVariableDescriptor;
85
import ai.timefold.solver.core.impl.move.streams.dataset.DataStreamFactory;
96
import ai.timefold.solver.core.impl.move.streams.dataset.DatasetSessionFactory;
107
import ai.timefold.solver.core.impl.move.streams.dataset.bi.AbstractBiDataStream;
@@ -72,35 +69,14 @@ public <A> UniDataStream<Solution_, A> enumerateIncludingPinned(Class<A> sourceC
7269
public <Entity_, Value_> BiDataStream<Solution_, Entity_, Value_> enumerateEntityValuePairs(
7370
GenuineVariableMetaModel<Solution_, Entity_, Value_> variableMetaModel,
7471
UniDataStream<Solution_, Entity_> entityDataStream) {
75-
var variableDescriptor = getVariableDescriptor(variableMetaModel);
76-
var valueRangeDescriptor = variableDescriptor.getValueRangeDescriptor();
7772
var includeNull =
7873
variableMetaModel instanceof PlanningVariableMetaModel<Solution_, Entity_, Value_> planningVariableMetaModel
7974
? planningVariableMetaModel.allowsUnassigned()
8075
: variableMetaModel instanceof PlanningListVariableMetaModel<Solution_, Entity_, Value_> planningListVariableMetaModel
8176
&& planningListVariableMetaModel.allowsUnassignedValues();
82-
if (valueRangeDescriptor.canExtractValueRangeFromSolution()) {
83-
// No need for filtering the value range; all values from solution are valid.
84-
var stream = dataStreamFactory.forEachFromSolution(variableMetaModel, includeNull);
85-
return entityDataStream.join(stream);
86-
} else {
87-
var stream = dataStreamFactory.forEachExcludingPinned(variableMetaModel.type(), includeNull);
88-
return entityDataStream.join(stream, DataJoiners.<Solution_, Entity_, Value_> filtering(
89-
(solutionView, entity, value) -> solutionView.isValueInRange(variableMetaModel, entity, value)));
90-
}
91-
}
92-
93-
private static <Solution_> GenuineVariableDescriptor<Solution_>
94-
getVariableDescriptor(GenuineVariableMetaModel<Solution_, ?, ?> variableMetaModel) {
95-
if (variableMetaModel instanceof DefaultPlanningVariableMetaModel<Solution_, ?, ?> planningVariableMetaModel) {
96-
return planningVariableMetaModel.variableDescriptor();
97-
} else if (variableMetaModel instanceof DefaultPlanningListVariableMetaModel<Solution_, ?, ?> planningListVariableMetaModel) {
98-
return planningListVariableMetaModel.variableDescriptor();
99-
} else {
100-
throw new IllegalStateException(
101-
"Impossible state: variable metamodel (%s) represents neither basic not list variable."
102-
.formatted(variableMetaModel.getClass().getSimpleName()));
103-
}
77+
var stream = dataStreamFactory.forEachExcludingPinned(variableMetaModel.type(), includeNull);
78+
return entityDataStream.join(stream, DataJoiners.<Solution_, Entity_, Value_> filtering(
79+
(solutionView, entity, value) -> solutionView.isValueInRange(variableMetaModel, entity, value)));
10480
}
10581

10682
@Override

core/src/main/java/ai/timefold/solver/core/impl/move/streams/dataset/DataStreamFactory.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,15 @@
99
import java.util.stream.Stream;
1010

1111
import ai.timefold.solver.core.config.solver.EnvironmentMode;
12-
import ai.timefold.solver.core.impl.domain.solution.descriptor.InnerGenuineVariableMetaModel;
1312
import ai.timefold.solver.core.impl.domain.solution.descriptor.SolutionDescriptor;
1413
import ai.timefold.solver.core.impl.move.streams.dataset.common.AbstractDataStream;
1514
import ai.timefold.solver.core.impl.move.streams.dataset.common.AbstractDataset;
1615
import ai.timefold.solver.core.impl.move.streams.dataset.common.TerminalDataStream;
1716
import ai.timefold.solver.core.impl.move.streams.dataset.uni.AbstractUniDataStream;
18-
import ai.timefold.solver.core.impl.move.streams.dataset.uni.ForEachFromSolutionDataStream;
1917
import ai.timefold.solver.core.impl.move.streams.dataset.uni.ForEachIncludingPinnedDataStream;
2018
import ai.timefold.solver.core.impl.move.streams.maybeapi.DataJoiners;
2119
import ai.timefold.solver.core.impl.move.streams.maybeapi.stream.UniDataStream;
2220
import ai.timefold.solver.core.impl.score.director.SessionContext;
23-
import ai.timefold.solver.core.preview.api.domain.metamodel.GenuineVariableMetaModel;
2421

2522
import org.jspecify.annotations.NullMarked;
2623

@@ -70,14 +67,6 @@ public <A> UniDataStream<Solution_, A> forEachExcludingPinned(Class<A> sourceCla
7067
return share((AbstractUniDataStream<Solution_, A>) stream);
7168
}
7269

73-
@SuppressWarnings("unchecked")
74-
public <A> UniDataStream<Solution_, A> forEachFromSolution(GenuineVariableMetaModel<Solution_, ?, A> variableMetaModel,
75-
boolean includeNull) {
76-
var variableDescriptor = ((InnerGenuineVariableMetaModel<Solution_>) variableMetaModel).variableDescriptor();
77-
return share(new ForEachFromSolutionDataStream<>(this, variableDescriptor.getValueRangeDescriptor(),
78-
includeNull));
79-
}
80-
8170
public <A> void assertValidForEachType(Class<A> fromType) {
8271
var problemFactOrEntityClassSet = solutionDescriptor.getProblemFactOrEntityClassSet();
8372
/*

core/src/main/java/ai/timefold/solver/core/impl/move/streams/dataset/DatasetSessionFactory.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ public DatasetSession<Solution_> buildSession(SessionContext<Solution_> context)
3333
for (var datasetInstance : buildHelper.getDatasetInstanceList()) {
3434
session.registerDatasetInstance(datasetInstance.getParent(), datasetInstance);
3535
}
36-
session.initialize(context);
3736
return session;
3837
}
3938

core/src/main/java/ai/timefold/solver/core/impl/move/streams/dataset/uni/AbstractForEachDataStream.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
11
package ai.timefold.solver.core.impl.move.streams.dataset.uni;
22

3+
import static ai.timefold.solver.core.impl.bavet.uni.AbstractForEachUniNode.LifecycleOperation;
4+
5+
import java.util.Objects;
6+
import java.util.Set;
7+
38
import ai.timefold.solver.core.impl.bavet.common.TupleSource;
49
import ai.timefold.solver.core.impl.bavet.common.tuple.TupleLifecycle;
510
import ai.timefold.solver.core.impl.bavet.common.tuple.UniTuple;
6-
import ai.timefold.solver.core.impl.bavet.uni.AbstractForEachUniNode;
11+
import ai.timefold.solver.core.impl.bavet.uni.ForEachIncludingUnassignedUniNode;
712
import ai.timefold.solver.core.impl.move.streams.dataset.DataStreamFactory;
813
import ai.timefold.solver.core.impl.move.streams.dataset.common.AbstractDataStream;
914
import ai.timefold.solver.core.impl.move.streams.dataset.common.DataNodeBuildHelper;
10-
import org.jspecify.annotations.NullMarked;
1115

12-
import java.util.Objects;
13-
import java.util.Set;
14-
15-
import static ai.timefold.solver.core.impl.bavet.uni.AbstractForEachUniNode.LifecycleOperation;
16+
import org.jspecify.annotations.NullMarked;
1617

1718
@NullMarked
1819
abstract sealed class AbstractForEachDataStream<Solution_, A>
1920
extends AbstractUniDataStream<Solution_, A>
2021
implements TupleSource
21-
permits ForEachIncludingPinnedDataStream, ForEachFromSolutionDataStream {
22+
permits ForEachIncludingPinnedDataStream {
2223

2324
protected final Class<A> forEachClass;
2425
final boolean shouldIncludeNull;
@@ -39,16 +40,13 @@ public final void collectActiveDataStreams(Set<AbstractDataStream<Solution_>> da
3940
public final void buildNode(DataNodeBuildHelper<Solution_> buildHelper) {
4041
TupleLifecycle<UniTuple<A>> tupleLifecycle = buildHelper.getAggregatedTupleLifecycle(childStreamList);
4142
var outputStoreSize = buildHelper.extractTupleStoreSize(this);
42-
var node = createNodeInstance(tupleLifecycle, outputStoreSize);
43+
var node = new ForEachIncludingUnassignedUniNode<>(forEachClass, tupleLifecycle, outputStoreSize);
4344
if (shouldIncludeNull && node.supports(LifecycleOperation.INSERT)) {
4445
node.insert(null);
4546
}
4647
buildHelper.addNode(node, this, null);
4748
}
4849

49-
protected abstract AbstractForEachUniNode<A> createNodeInstance(TupleLifecycle<UniTuple<A>> tupleLifecycle,
50-
int outputStoreSize);
51-
5250
@Override
5351
public abstract boolean equals(Object o);
5452

0 commit comments

Comments
 (0)