Skip to content

Commit 6d3b0d3

Browse files
committed
Smaller optimizations
1 parent fa34809 commit 6d3b0d3

22 files changed

Lines changed: 153 additions & 199 deletions

core/src/main/java/ai/timefold/solver/core/impl/bavet/bi/AbstractGroupBiNode.java

Lines changed: 17 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.util.function.Function;
44

5-
import ai.timefold.solver.core.api.function.TriFunction;
65
import ai.timefold.solver.core.api.score.stream.bi.BiConstraintCollector;
76
import ai.timefold.solver.core.api.score.stream.bi.BiConstraintCollectorAccumulatedValue;
87
import ai.timefold.solver.core.api.score.stream.bi.BiConstraintCollectorAccumulator;
@@ -11,70 +10,51 @@
1110
import ai.timefold.solver.core.impl.bavet.common.tuple.BiTuple;
1211
import ai.timefold.solver.core.impl.bavet.common.tuple.Tuple;
1312
import ai.timefold.solver.core.impl.bavet.common.tuple.TupleLifecycle;
13+
import ai.timefold.solver.core.impl.score.stream.collector.bi.BiCollectorUtils;
1414

15+
import org.jspecify.annotations.NonNull;
1516
import org.jspecify.annotations.Nullable;
1617

1718
abstract class AbstractGroupBiNode<OldA, OldB, OutTuple_ extends Tuple, GroupKey_, ResultContainer_, Result_>
1819
extends AbstractGroupNode<BiTuple<OldA, OldB>, OutTuple_, GroupKey_, ResultContainer_, Result_> {
1920

2021
private final int groupAccumulatorIndex;
21-
private final @Nullable TriFunction<ResultContainer_, OldA, OldB, Runnable> accumulator;
2222
private final @Nullable BiConstraintCollectorAccumulator<ResultContainer_, OldA, OldB> incrementalAccumulator;
23-
private final boolean useIncrementalAccumulator;
2423

2524
protected AbstractGroupBiNode(int groupStoreIndex, int groupAccumulatorIndex,
2625
Function<BiTuple<OldA, OldB>, GroupKey_> groupKeyFunction,
27-
BiConstraintCollector<OldA, OldB, ResultContainer_, Result_> collector,
26+
@NonNull BiConstraintCollector<OldA, OldB, ResultContainer_, Result_> collector,
2827
TupleLifecycle<OutTuple_> nextNodesTupleLifecycle, EnvironmentMode environmentMode) {
29-
super(groupStoreIndex, groupKeyFunction,
30-
collector == null ? null : collector.supplier(),
31-
collector == null ? null : collector.finisher(),
32-
nextNodesTupleLifecycle, environmentMode);
33-
var hasCollector = collector != null;
34-
this.groupAccumulatorIndex = hasCollector ? groupAccumulatorIndex : -1;
35-
accumulator = hasCollector ? (collector.isIncremental() ? null : collector.accumulator()) : null;
36-
incrementalAccumulator = hasCollector ? (collector.isIncremental() ? collector.incrementalAccumulator() : null) : null;
37-
useIncrementalAccumulator = hasCollector && incrementalAccumulator != null;
28+
super(groupStoreIndex, groupKeyFunction, collector.supplier(), collector.finisher(), nextNodesTupleLifecycle,
29+
environmentMode);
30+
this.groupAccumulatorIndex = groupAccumulatorIndex;
31+
this.incrementalAccumulator = collector.isIncremental() ? collector.incrementalAccumulator()
32+
: BiCollectorUtils.toIncremental(collector.accumulator());
3833
}
3934

4035
protected AbstractGroupBiNode(int groupStoreIndex, Function<BiTuple<OldA, OldB>, GroupKey_> groupKeyFunction,
4136
TupleLifecycle<OutTuple_> nextNodesTupleLifecycle, EnvironmentMode environmentMode) {
4237
super(groupStoreIndex, groupKeyFunction, nextNodesTupleLifecycle, environmentMode);
43-
groupAccumulatorIndex = -1;
44-
accumulator = null;
45-
incrementalAccumulator = null;
46-
useIncrementalAccumulator = false;
38+
this.groupAccumulatorIndex = -1;
39+
this.incrementalAccumulator = null;
4740
}
4841

4942
@Override
5043
protected void groupInsert(ResultContainer_ resultContainer, BiTuple<OldA, OldB> tuple) {
51-
if (useIncrementalAccumulator) {
52-
var groupElement = incrementalAccumulator.intoGroup(resultContainer);
53-
tuple.setStore(groupAccumulatorIndex, groupElement);
54-
groupElement.add(tuple.getA(), tuple.getB());
55-
} else {
56-
tuple.setStore(groupAccumulatorIndex, accumulator.apply(resultContainer, tuple.getA(), tuple.getB()));
57-
}
44+
var groupElement = incrementalAccumulator.intoGroup(resultContainer);
45+
tuple.setStore(groupAccumulatorIndex, groupElement);
46+
groupElement.add(tuple.getA(), tuple.getB());
5847
}
5948

6049
@Override
6150
protected void groupUpdate(ResultContainer_ resultContainer, BiTuple<OldA, OldB> tuple) {
62-
if (useIncrementalAccumulator) {
63-
BiConstraintCollectorAccumulatedValue<OldA, OldB> groupElement = tuple.getStore(groupAccumulatorIndex);
64-
groupElement.update(tuple.getA(), tuple.getB());
65-
} else {
66-
super.groupUpdate(resultContainer, tuple);
67-
}
51+
BiConstraintCollectorAccumulatedValue<OldA, OldB> groupElement = tuple.getStore(groupAccumulatorIndex);
52+
groupElement.update(tuple.getA(), tuple.getB());
6853
}
6954

7055
@Override
7156
protected void groupRetract(BiTuple<OldA, OldB> tuple) {
72-
if (useIncrementalAccumulator) {
73-
BiConstraintCollectorAccumulatedValue<OldA, OldB> groupElement = tuple.removeStore(groupAccumulatorIndex);
74-
groupElement.remove();
75-
} else {
76-
Runnable undo = tuple.removeStore(groupAccumulatorIndex);
77-
undo.run();
78-
}
57+
BiConstraintCollectorAccumulatedValue<OldA, OldB> groupElement = tuple.removeStore(groupAccumulatorIndex);
58+
groupElement.remove();
7959
}
8060
}

core/src/main/java/ai/timefold/solver/core/impl/bavet/quad/AbstractGroupQuadNode.java

Lines changed: 17 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.util.function.Function;
44

5-
import ai.timefold.solver.core.api.function.PentaFunction;
65
import ai.timefold.solver.core.api.score.stream.quad.QuadConstraintCollector;
76
import ai.timefold.solver.core.api.score.stream.quad.QuadConstraintCollectorAccumulatedValue;
87
import ai.timefold.solver.core.api.score.stream.quad.QuadConstraintCollectorAccumulator;
@@ -11,76 +10,53 @@
1110
import ai.timefold.solver.core.impl.bavet.common.tuple.QuadTuple;
1211
import ai.timefold.solver.core.impl.bavet.common.tuple.Tuple;
1312
import ai.timefold.solver.core.impl.bavet.common.tuple.TupleLifecycle;
13+
import ai.timefold.solver.core.impl.score.stream.collector.quad.QuadCollectorUtils;
1414

15+
import org.jspecify.annotations.NonNull;
1516
import org.jspecify.annotations.Nullable;
1617

1718
abstract class AbstractGroupQuadNode<OldA, OldB, OldC, OldD, OutTuple_ extends Tuple, GroupKey_, ResultContainer_, Result_>
1819
extends AbstractGroupNode<QuadTuple<OldA, OldB, OldC, OldD>, OutTuple_, GroupKey_, ResultContainer_, Result_> {
1920

2021
private final int groupAccumulatorIndex;
21-
private final @Nullable PentaFunction<ResultContainer_, OldA, OldB, OldC, OldD, Runnable> accumulator;
2222
private final @Nullable QuadConstraintCollectorAccumulator<ResultContainer_, OldA, OldB, OldC, OldD> incrementalAccumulator;
23-
private final boolean useIncrementalAccumulator;
2423

2524
protected AbstractGroupQuadNode(int groupStoreIndex, int groupAccumulatorIndex,
2625
Function<QuadTuple<OldA, OldB, OldC, OldD>, GroupKey_> groupKeyFunction,
27-
QuadConstraintCollector<OldA, OldB, OldC, OldD, ResultContainer_, Result_> collector,
26+
@NonNull QuadConstraintCollector<OldA, OldB, OldC, OldD, ResultContainer_, Result_> collector,
2827
TupleLifecycle<OutTuple_> nextNodesTupleLifecycle, EnvironmentMode environmentMode) {
29-
super(groupStoreIndex,
30-
groupKeyFunction,
31-
collector == null ? null : collector.supplier(),
32-
collector == null ? null : collector.finisher(),
33-
nextNodesTupleLifecycle, environmentMode);
34-
var hasCollector = collector != null;
35-
this.groupAccumulatorIndex = hasCollector ? groupAccumulatorIndex : -1;
36-
accumulator = hasCollector ? (collector.isIncremental() ? null : collector.accumulator()) : null;
37-
incrementalAccumulator = hasCollector ? (collector.isIncremental() ? collector.incrementalAccumulator() : null) : null;
38-
useIncrementalAccumulator = hasCollector && incrementalAccumulator != null;
28+
super(groupStoreIndex, groupKeyFunction, collector.supplier(), collector.finisher(), nextNodesTupleLifecycle,
29+
environmentMode);
30+
this.groupAccumulatorIndex = groupAccumulatorIndex;
31+
this.incrementalAccumulator = collector.isIncremental() ? collector.incrementalAccumulator()
32+
: QuadCollectorUtils.toIncremental(collector.accumulator());
3933
}
4034

4135
protected AbstractGroupQuadNode(int groupStoreIndex,
4236
Function<QuadTuple<OldA, OldB, OldC, OldD>, GroupKey_> groupKeyFunction,
4337
TupleLifecycle<OutTuple_> nextNodesTupleLifecycle, EnvironmentMode environmentMode) {
4438
super(groupStoreIndex, groupKeyFunction, nextNodesTupleLifecycle, environmentMode);
45-
groupAccumulatorIndex = -1;
46-
accumulator = null;
47-
incrementalAccumulator = null;
48-
useIncrementalAccumulator = false;
39+
this.groupAccumulatorIndex = -1;
40+
this.incrementalAccumulator = null;
4941
}
5042

5143
@Override
5244
protected void groupInsert(ResultContainer_ resultContainer, QuadTuple<OldA, OldB, OldC, OldD> tuple) {
53-
if (useIncrementalAccumulator) {
54-
var groupElement = incrementalAccumulator.intoGroup(resultContainer);
55-
tuple.setStore(groupAccumulatorIndex, groupElement);
56-
groupElement.add(tuple.getA(), tuple.getB(), tuple.getC(), tuple.getD());
57-
} else {
58-
tuple.setStore(groupAccumulatorIndex,
59-
accumulator.apply(resultContainer, tuple.getA(), tuple.getB(), tuple.getC(), tuple.getD()));
60-
}
45+
var groupElement = incrementalAccumulator.intoGroup(resultContainer);
46+
tuple.setStore(groupAccumulatorIndex, groupElement);
47+
groupElement.add(tuple.getA(), tuple.getB(), tuple.getC(), tuple.getD());
6148
}
6249

6350
@Override
6451
protected void groupUpdate(ResultContainer_ resultContainer, QuadTuple<OldA, OldB, OldC, OldD> tuple) {
65-
if (useIncrementalAccumulator) {
66-
QuadConstraintCollectorAccumulatedValue<OldA, OldB, OldC, OldD> groupElement =
67-
tuple.getStore(groupAccumulatorIndex);
68-
groupElement.update(tuple.getA(), tuple.getB(), tuple.getC(), tuple.getD());
69-
} else {
70-
super.groupUpdate(resultContainer, tuple);
71-
}
52+
QuadConstraintCollectorAccumulatedValue<OldA, OldB, OldC, OldD> groupElement = tuple.getStore(groupAccumulatorIndex);
53+
groupElement.update(tuple.getA(), tuple.getB(), tuple.getC(), tuple.getD());
7254
}
7355

7456
@Override
7557
protected void groupRetract(QuadTuple<OldA, OldB, OldC, OldD> tuple) {
76-
if (useIncrementalAccumulator) {
77-
QuadConstraintCollectorAccumulatedValue<OldA, OldB, OldC, OldD> groupElement =
78-
tuple.removeStore(groupAccumulatorIndex);
79-
groupElement.remove();
80-
} else {
81-
Runnable undo = tuple.removeStore(groupAccumulatorIndex);
82-
undo.run();
83-
}
58+
QuadConstraintCollectorAccumulatedValue<OldA, OldB, OldC, OldD> groupElement = tuple.removeStore(groupAccumulatorIndex);
59+
groupElement.remove();
8460
}
8561

8662
}

core/src/main/java/ai/timefold/solver/core/impl/bavet/tri/AbstractGroupTriNode.java

Lines changed: 17 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.util.function.Function;
44

5-
import ai.timefold.solver.core.api.function.QuadFunction;
65
import ai.timefold.solver.core.api.score.stream.tri.TriConstraintCollector;
76
import ai.timefold.solver.core.api.score.stream.tri.TriConstraintCollectorAccumulatedValue;
87
import ai.timefold.solver.core.api.score.stream.tri.TriConstraintCollectorAccumulator;
@@ -11,71 +10,52 @@
1110
import ai.timefold.solver.core.impl.bavet.common.tuple.TriTuple;
1211
import ai.timefold.solver.core.impl.bavet.common.tuple.Tuple;
1312
import ai.timefold.solver.core.impl.bavet.common.tuple.TupleLifecycle;
13+
import ai.timefold.solver.core.impl.score.stream.collector.tri.TriCollectorUtils;
1414

15+
import org.jspecify.annotations.NonNull;
1516
import org.jspecify.annotations.Nullable;
1617

1718
abstract class AbstractGroupTriNode<OldA, OldB, OldC, OutTuple_ extends Tuple, GroupKey_, ResultContainer_, Result_>
1819
extends AbstractGroupNode<TriTuple<OldA, OldB, OldC>, OutTuple_, GroupKey_, ResultContainer_, Result_> {
1920

2021
private final int groupAccumulatorIndex;
21-
private final @Nullable QuadFunction<ResultContainer_, OldA, OldB, OldC, Runnable> accumulator;
2222
private final @Nullable TriConstraintCollectorAccumulator<ResultContainer_, OldA, OldB, OldC> incrementalAccumulator;
23-
private final boolean useIncrementalAccumulator;
2423

2524
protected AbstractGroupTriNode(int groupStoreIndex, int groupAccumulatorIndex,
2625
Function<TriTuple<OldA, OldB, OldC>, GroupKey_> groupKeyFunction,
27-
TriConstraintCollector<OldA, OldB, OldC, ResultContainer_, Result_> collector,
26+
@NonNull TriConstraintCollector<OldA, OldB, OldC, ResultContainer_, Result_> collector,
2827
TupleLifecycle<OutTuple_> nextNodesTupleLifecycle, EnvironmentMode environmentMode) {
29-
super(groupStoreIndex, groupKeyFunction,
30-
collector == null ? null : collector.supplier(),
31-
collector == null ? null : collector.finisher(),
32-
nextNodesTupleLifecycle, environmentMode);
33-
var hasCollector = collector != null;
34-
this.groupAccumulatorIndex = hasCollector ? groupAccumulatorIndex : -1;
35-
accumulator = hasCollector ? (collector.isIncremental() ? null : collector.accumulator()) : null;
36-
incrementalAccumulator = hasCollector ? (collector.isIncremental() ? collector.incrementalAccumulator() : null) : null;
37-
useIncrementalAccumulator = hasCollector && incrementalAccumulator != null;
28+
super(groupStoreIndex, groupKeyFunction, collector.supplier(), collector.finisher(), nextNodesTupleLifecycle,
29+
environmentMode);
30+
this.groupAccumulatorIndex = groupAccumulatorIndex;
31+
this.incrementalAccumulator = collector.isIncremental() ? collector.incrementalAccumulator()
32+
: TriCollectorUtils.toIncremental(collector.accumulator());
3833
}
3934

4035
protected AbstractGroupTriNode(int groupStoreIndex, Function<TriTuple<OldA, OldB, OldC>, GroupKey_> groupKeyFunction,
4136
TupleLifecycle<OutTuple_> nextNodesTupleLifecycle, EnvironmentMode environmentMode) {
4237
super(groupStoreIndex, groupKeyFunction, nextNodesTupleLifecycle, environmentMode);
43-
groupAccumulatorIndex = -1;
44-
accumulator = null;
45-
incrementalAccumulator = null;
46-
useIncrementalAccumulator = false;
38+
this.groupAccumulatorIndex = -1;
39+
this.incrementalAccumulator = null;
4740
}
4841

4942
@Override
5043
protected void groupInsert(ResultContainer_ resultContainer, TriTuple<OldA, OldB, OldC> tuple) {
51-
if (useIncrementalAccumulator) {
52-
var groupElement = incrementalAccumulator.intoGroup(resultContainer);
53-
tuple.setStore(groupAccumulatorIndex, groupElement);
54-
groupElement.add(tuple.getA(), tuple.getB(), tuple.getC());
55-
} else {
56-
tuple.setStore(groupAccumulatorIndex, accumulator.apply(resultContainer, tuple.getA(), tuple.getB(), tuple.getC()));
57-
}
44+
var groupElement = incrementalAccumulator.intoGroup(resultContainer);
45+
tuple.setStore(groupAccumulatorIndex, groupElement);
46+
groupElement.add(tuple.getA(), tuple.getB(), tuple.getC());
5847
}
5948

6049
@Override
6150
protected void groupUpdate(ResultContainer_ resultContainer, TriTuple<OldA, OldB, OldC> tuple) {
62-
if (useIncrementalAccumulator) {
63-
TriConstraintCollectorAccumulatedValue<OldA, OldB, OldC> groupElement = tuple.getStore(groupAccumulatorIndex);
64-
groupElement.update(tuple.getA(), tuple.getB(), tuple.getC());
65-
} else {
66-
super.groupUpdate(resultContainer, tuple);
67-
}
51+
TriConstraintCollectorAccumulatedValue<OldA, OldB, OldC> groupElement = tuple.getStore(groupAccumulatorIndex);
52+
groupElement.update(tuple.getA(), tuple.getB(), tuple.getC());
6853
}
6954

7055
@Override
7156
protected void groupRetract(TriTuple<OldA, OldB, OldC> tuple) {
72-
if (useIncrementalAccumulator) {
73-
TriConstraintCollectorAccumulatedValue<OldA, OldB, OldC> groupElement = tuple.removeStore(groupAccumulatorIndex);
74-
groupElement.remove();
75-
} else {
76-
Runnable undo = tuple.removeStore(groupAccumulatorIndex);
77-
undo.run();
78-
}
57+
TriConstraintCollectorAccumulatedValue<OldA, OldB, OldC> groupElement = tuple.removeStore(groupAccumulatorIndex);
58+
groupElement.remove();
7959
}
8060

8161
}

0 commit comments

Comments
 (0)