|
2 | 2 |
|
3 | 3 | import java.util.function.Function; |
4 | 4 |
|
5 | | -import ai.timefold.solver.core.api.function.PentaFunction; |
6 | 5 | import ai.timefold.solver.core.api.score.stream.quad.QuadConstraintCollector; |
7 | 6 | import ai.timefold.solver.core.api.score.stream.quad.QuadConstraintCollectorAccumulatedValue; |
8 | 7 | import ai.timefold.solver.core.api.score.stream.quad.QuadConstraintCollectorAccumulator; |
|
11 | 10 | import ai.timefold.solver.core.impl.bavet.common.tuple.QuadTuple; |
12 | 11 | import ai.timefold.solver.core.impl.bavet.common.tuple.Tuple; |
13 | 12 | import ai.timefold.solver.core.impl.bavet.common.tuple.TupleLifecycle; |
| 13 | +import ai.timefold.solver.core.impl.score.stream.collector.quad.QuadCollectorUtils; |
14 | 14 |
|
| 15 | +import org.jspecify.annotations.NonNull; |
15 | 16 | import org.jspecify.annotations.Nullable; |
16 | 17 |
|
17 | 18 | abstract class AbstractGroupQuadNode<OldA, OldB, OldC, OldD, OutTuple_ extends Tuple, GroupKey_, ResultContainer_, Result_> |
18 | 19 | extends AbstractGroupNode<QuadTuple<OldA, OldB, OldC, OldD>, OutTuple_, GroupKey_, ResultContainer_, Result_> { |
19 | 20 |
|
20 | 21 | private final int groupAccumulatorIndex; |
21 | | - private final @Nullable PentaFunction<ResultContainer_, OldA, OldB, OldC, OldD, Runnable> accumulator; |
22 | 22 | private final @Nullable QuadConstraintCollectorAccumulator<ResultContainer_, OldA, OldB, OldC, OldD> incrementalAccumulator; |
23 | | - private final boolean useIncrementalAccumulator; |
24 | 23 |
|
25 | 24 | protected AbstractGroupQuadNode(int groupStoreIndex, int groupAccumulatorIndex, |
26 | 25 | 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, |
28 | 27 | 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()); |
39 | 33 | } |
40 | 34 |
|
41 | 35 | protected AbstractGroupQuadNode(int groupStoreIndex, |
42 | 36 | Function<QuadTuple<OldA, OldB, OldC, OldD>, GroupKey_> groupKeyFunction, |
43 | 37 | TupleLifecycle<OutTuple_> nextNodesTupleLifecycle, EnvironmentMode environmentMode) { |
44 | 38 | 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; |
49 | 41 | } |
50 | 42 |
|
51 | 43 | @Override |
52 | 44 | 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()); |
61 | 48 | } |
62 | 49 |
|
63 | 50 | @Override |
64 | 51 | 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()); |
72 | 54 | } |
73 | 55 |
|
74 | 56 | @Override |
75 | 57 | 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(); |
84 | 60 | } |
85 | 61 |
|
86 | 62 | } |
0 commit comments