Skip to content

Commit ab47e41

Browse files
authored
chore: refactor tuples and scoring (#1992)
- Changes the tuples to be all backed by a single type. - Refactors scoring to use that single type. - Applies the same partial scoring patterns from bendable to all other score types as well. This is in preparation for the future, when we will drop the `int`-based scores, making the scoring bimorphic (`long` and `BigDecimal` only). This will improve performance in the future, but did not cause regressions now. The PR is large, but that's because of all the copy-paste. This PR is, in fact, 3 conceptual changes, copied all over the place 20 times.
1 parent 24eb6b3 commit ab47e41

File tree

244 files changed

+3021
-2388
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

244 files changed

+3021
-2388
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
import ai.timefold.solver.core.api.score.stream.bi.BiConstraintCollector;
77
import ai.timefold.solver.core.config.solver.EnvironmentMode;
88
import ai.timefold.solver.core.impl.bavet.common.AbstractGroupNode;
9-
import ai.timefold.solver.core.impl.bavet.common.tuple.AbstractTuple;
109
import ai.timefold.solver.core.impl.bavet.common.tuple.BiTuple;
10+
import ai.timefold.solver.core.impl.bavet.common.tuple.Tuple;
1111
import ai.timefold.solver.core.impl.bavet.common.tuple.TupleLifecycle;
1212

13-
abstract class AbstractGroupBiNode<OldA, OldB, OutTuple_ extends AbstractTuple, GroupKey_, ResultContainer_, Result_>
13+
abstract class AbstractGroupBiNode<OldA, OldB, OutTuple_ extends Tuple, GroupKey_, ResultContainer_, Result_>
1414
extends AbstractGroupNode<BiTuple<OldA, OldB>, OutTuple_, GroupKey_, ResultContainer_, Result_> {
1515

1616
private final TriFunction<ResultContainer_, OldA, OldB, Runnable> accumulator;
@@ -37,7 +37,7 @@ protected AbstractGroupBiNode(int groupStoreIndex,
3737

3838
@Override
3939
protected final Runnable accumulate(ResultContainer_ resultContainer, BiTuple<OldA, OldB> tuple) {
40-
return accumulator.apply(resultContainer, tuple.factA, tuple.factB);
40+
return accumulator.apply(resultContainer, tuple.getA(), tuple.getB());
4141
}
4242

4343
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,24 @@ public ConcatBiBiNode(TupleLifecycle<BiTuple<A, B>> nextNodesTupleLifecycle,
1515

1616
@Override
1717
protected BiTuple<A, B> getOutTupleFromLeft(BiTuple<A, B> leftTuple) {
18-
return new BiTuple<>(leftTuple.factA, leftTuple.factB, outputStoreSize);
18+
return BiTuple.of(leftTuple.getA(), leftTuple.getB(), outputStoreSize);
1919
}
2020

2121
@Override
2222
protected BiTuple<A, B> getOutTupleFromRight(BiTuple<A, B> rightTuple) {
23-
return new BiTuple<>(rightTuple.factA, rightTuple.factB, outputStoreSize);
23+
return BiTuple.of(rightTuple.getA(), rightTuple.getB(), outputStoreSize);
2424
}
2525

2626
@Override
2727
protected void updateOutTupleFromLeft(BiTuple<A, B> leftTuple, BiTuple<A, B> outTuple) {
28-
outTuple.factA = leftTuple.factA;
29-
outTuple.factB = leftTuple.factB;
28+
outTuple.setA(leftTuple.getA());
29+
outTuple.setB(leftTuple.getB());
3030
}
3131

3232
@Override
3333
protected void updateOutTupleFromRight(BiTuple<A, B> rightTuple, BiTuple<A, B> outTuple) {
34-
outTuple.factA = rightTuple.factA;
35-
outTuple.factB = rightTuple.factB;
34+
outTuple.setA(rightTuple.getA());
35+
outTuple.setB(rightTuple.getB());
3636
}
3737

3838
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,24 +21,24 @@ public ConcatBiUniNode(Function<A, B> paddingFunction, TupleLifecycle<BiTuple<A,
2121

2222
@Override
2323
protected BiTuple<A, B> getOutTupleFromLeft(BiTuple<A, B> leftTuple) {
24-
return new BiTuple<>(leftTuple.factA, leftTuple.factB, outputStoreSize);
24+
return BiTuple.of(leftTuple.getA(), leftTuple.getB(), outputStoreSize);
2525
}
2626

2727
@Override
2828
protected BiTuple<A, B> getOutTupleFromRight(UniTuple<A> rightTuple) {
29-
var factA = rightTuple.factA;
30-
return new BiTuple<>(factA, paddingFunction.apply(factA), outputStoreSize);
29+
var factA = rightTuple.getA();
30+
return BiTuple.of(factA, paddingFunction.apply(factA), outputStoreSize);
3131
}
3232

3333
@Override
3434
protected void updateOutTupleFromLeft(BiTuple<A, B> leftTuple, BiTuple<A, B> outTuple) {
35-
outTuple.factA = leftTuple.factA;
36-
outTuple.factB = leftTuple.factB;
35+
outTuple.setA(leftTuple.getA());
36+
outTuple.setB(leftTuple.getB());
3737
}
3838

3939
@Override
4040
protected void updateOutTupleFromRight(UniTuple<A> rightTuple, BiTuple<A, B> outTuple) {
41-
outTuple.factA = rightTuple.factA;
41+
outTuple.setA(rightTuple.getA());
4242
}
4343

4444
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,24 @@ public ConcatUniBiNode(Function<A, B> paddingFunction, TupleLifecycle<BiTuple<A,
2222

2323
@Override
2424
protected BiTuple<A, B> getOutTupleFromLeft(UniTuple<A> leftTuple) {
25-
var factA = leftTuple.factA;
26-
return new BiTuple<>(factA, paddingFunction.apply(factA), outputStoreSize);
25+
var factA = leftTuple.getA();
26+
return BiTuple.of(factA, paddingFunction.apply(factA), outputStoreSize);
2727
}
2828

2929
@Override
3030
protected BiTuple<A, B> getOutTupleFromRight(BiTuple<A, B> rightTuple) {
31-
return new BiTuple<>(rightTuple.factA, rightTuple.factB, outputStoreSize);
31+
return BiTuple.of(rightTuple.getA(), rightTuple.getB(), outputStoreSize);
3232
}
3333

3434
@Override
3535
protected void updateOutTupleFromLeft(UniTuple<A> leftTuple, BiTuple<A, B> outTuple) {
36-
outTuple.factA = leftTuple.factA;
36+
outTuple.setA(leftTuple.getA());
3737
}
3838

3939
@Override
4040
protected void updateOutTupleFromRight(BiTuple<A, B> rightTuple, BiTuple<A, B> outTuple) {
41-
outTuple.factA = rightTuple.factA;
42-
outTuple.factB = rightTuple.factB;
41+
outTuple.setA(rightTuple.getA());
42+
outTuple.setB(rightTuple.getB());
4343
}
4444

4545
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ public FlattenLastBiNode(int flattenLastStoreIndex, Function<B, Iterable<NewB>>
1818

1919
@Override
2020
protected BiTuple<A, NewB> createTuple(BiTuple<A, B> originalTuple, NewB newB) {
21-
return new BiTuple<>(originalTuple.factA, newB, outputStoreSize);
21+
return BiTuple.of(originalTuple.getA(), newB, outputStoreSize);
2222
}
2323

2424
@Override
2525
protected B getEffectiveFactIn(BiTuple<A, B> tuple) {
26-
return tuple.factB;
26+
return tuple.getB();
2727
}
2828

2929
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ public Group0Mapping1CollectorBiNode(int groupStoreIndex, int undoStoreIndex,
2020

2121
@Override
2222
protected UniTuple<A> createOutTuple(Void groupKey) {
23-
return new UniTuple<>(null, outputStoreSize);
23+
return UniTuple.of(outputStoreSize);
2424
}
2525

2626
@Override
2727
protected void updateOutTupleToResult(UniTuple<A> outTuple, A a) {
28-
outTuple.factA = a;
28+
outTuple.setA(a);
2929
}
3030

3131
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ BiConstraintCollector<OldA, OldB, Object, Pair<A, B>> mergeCollectors(
3131

3232
@Override
3333
protected BiTuple<A, B> createOutTuple(Void groupKey) {
34-
return new BiTuple<>(null, null, outputStoreSize);
34+
return BiTuple.of(outputStoreSize);
3535
}
3636

3737
@Override
3838
protected void updateOutTupleToResult(BiTuple<A, B> outTuple, Pair<A, B> result) {
39-
outTuple.factA = result.key();
40-
outTuple.factB = result.value();
39+
outTuple.setA(result.key());
40+
outTuple.setB(result.value());
4141
}
4242

4343
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ BiConstraintCollector<OldA, OldB, Object, Triple<A, B, C>> mergeCollectors(
3434

3535
@Override
3636
protected TriTuple<A, B, C> createOutTuple(Void groupKey) {
37-
return new TriTuple<>(null, null, null, outputStoreSize);
37+
return TriTuple.of(outputStoreSize);
3838
}
3939

4040
@Override
4141
protected void updateOutTupleToResult(TriTuple<A, B, C> outTuple, Triple<A, B, C> result) {
42-
outTuple.factA = result.a();
43-
outTuple.factB = result.b();
44-
outTuple.factC = result.c();
42+
outTuple.setA(result.a());
43+
outTuple.setB(result.b());
44+
outTuple.setC(result.c());
4545
}
4646

4747
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@ BiConstraintCollector<OldA, OldB, Object, Quadruple<A, B, C, D>> mergeCollectors
3838

3939
@Override
4040
protected QuadTuple<A, B, C, D> createOutTuple(Void groupKey) {
41-
return new QuadTuple<>(null, null, null, null, outputStoreSize);
41+
return QuadTuple.of(outputStoreSize);
4242
}
4343

4444
@Override
4545
protected void updateOutTupleToResult(QuadTuple<A, B, C, D> outTuple, Quadruple<A, B, C, D> result) {
46-
outTuple.factA = result.a();
47-
outTuple.factB = result.b();
48-
outTuple.factC = result.c();
49-
outTuple.factD = result.d();
46+
outTuple.setA(result.a());
47+
outTuple.setB(result.b());
48+
outTuple.setC(result.c());
49+
outTuple.setD(result.d());
5050
}
5151

5252
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ public Group1Mapping0CollectorBiNode(BiFunction<OldA, OldB, A> groupKeyMapping,
2121
}
2222

2323
static <A, OldA, OldB> A createGroupKey(BiFunction<OldA, OldB, A> groupKeyMapping, BiTuple<OldA, OldB> tuple) {
24-
return groupKeyMapping.apply(tuple.factA, tuple.factB);
24+
return groupKeyMapping.apply(tuple.getA(), tuple.getB());
2525
}
2626

2727
@Override
2828
protected UniTuple<A> createOutTuple(A a) {
29-
return new UniTuple<>(a, outputStoreSize);
29+
return UniTuple.of(a, outputStoreSize);
3030
}
3131

3232
@Override

0 commit comments

Comments
 (0)