Skip to content

Commit 6714360

Browse files
authored
refactor: remove constraint collector int overloads (#119)
1 parent 14ebde3 commit 6714360

3 files changed

Lines changed: 10 additions & 40 deletions

File tree

src/main/java/ai/timefold/solver/benchmarks/examples/curriculumcourse/score/CurriculumCourseConstraintProvider.java

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -75,38 +75,10 @@ Constraint roomOccupancy(ConstraintFactory factory) { // Faster than a simpler f
7575
return factory.forEach(Lecture.class)
7676
.groupBy(Lecture::getRoom, Lecture::getPeriod, count())
7777
.filter((room, period, count) -> count > 1)
78-
.penalize(ONE_HARD, (room, period, count) -> {
79-
var n = 2; // We're looking for unique pairs.
80-
var nominator = factorial(count);
81-
var denominator = factorial(n) * factorial(count - n);
82-
return nominator / denominator;
83-
})
78+
.penalize(ONE_HARD, (room, period, count) -> (count * (count - 1)) / 2)
8479
.asConstraint("roomOccupancy");
8580
}
8681

87-
private static final int MAX_ANTICIPATED_CONFLICTING_LESSONS = 20; // Arbitrary limit for caching.
88-
private static final int[] FACTORIAL_CACHE = new int[MAX_ANTICIPATED_CONFLICTING_LESSONS];
89-
90-
private static int factorial(int number) {
91-
if (number < MAX_ANTICIPATED_CONFLICTING_LESSONS) {
92-
var cache = FACTORIAL_CACHE[number];
93-
if (cache == 0) {
94-
cache = factorialUncached(number);
95-
FACTORIAL_CACHE[number] = cache;
96-
}
97-
return cache;
98-
}
99-
return factorialUncached(number);
100-
}
101-
102-
private static int factorialUncached(int number) {
103-
return switch (number) {
104-
case 0, 1 -> 1;
105-
case 2 -> 2;
106-
default -> number * factorial(number - 1);
107-
};
108-
}
109-
11082
Constraint unavailablePeriodPenalty(ConstraintFactory factory) {
11183
return factory.forEach(UnavailablePeriodPenalty.class)
11284
.join(Lecture.class,

src/main/java/ai/timefold/solver/benchmarks/examples/machinereassignment/score/MachineReassignmentConstraintProvider.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
package ai.timefold.solver.benchmarks.examples.machinereassignment.score;
22

3-
import static ai.timefold.solver.core.api.score.stream.ConstraintCollectors.sumLong;
3+
import static ai.timefold.solver.core.api.score.stream.ConstraintCollectors.sum;
44
import static ai.timefold.solver.core.api.score.stream.Joiners.equal;
55
import static ai.timefold.solver.core.api.score.stream.Joiners.filtering;
66

7-
import java.util.function.BiFunction;
8-
97
import ai.timefold.solver.benchmarks.examples.machinereassignment.domain.MrBalancePenalty;
108
import ai.timefold.solver.benchmarks.examples.machinereassignment.domain.MrGlobalPenaltyInfo;
119
import ai.timefold.solver.benchmarks.examples.machinereassignment.domain.MrMachine;
@@ -53,7 +51,7 @@ protected Constraint maximumCapacity(ConstraintFactory factory) {
5351
equal(MrMachineCapacity::getMachine, MrProcessAssignment::getMachine))
5452
.groupBy((machineCapacity, processAssignment) -> machineCapacity.getMachine(),
5553
(machineCapacity, processAssignment) -> machineCapacity,
56-
sumLong((machineCapacity, processAssignment) -> processAssignment
54+
sum((machineCapacity, processAssignment) -> processAssignment
5755
.getUsage(machineCapacity.getResource())))
5856
.filter(((machine, machineCapacity, usage) -> machineCapacity.getMaximumCapacity() < usage))
5957
.penalize(HardSoftScore.ONE_HARD,
@@ -110,7 +108,7 @@ protected Constraint transientUsage(ConstraintFactory factory) {
110108
.filter(MrProcessAssignment::isMoved),
111109
equal(MrMachineCapacity::getMachine, MrProcessAssignment::getOriginalMachine))
112110
.groupBy((machineCapacity, processAssignment) -> machineCapacity,
113-
sumLong((machineCapacity, processAssignment) -> processAssignment
111+
sum((machineCapacity, processAssignment) -> processAssignment
114112
.getUsage(machineCapacity.getResource())))
115113
.filter(((machineCapacity, usage) -> machineCapacity.getMaximumCapacity() < usage))
116114
.penalize(HardSoftScore.ONE_HARD,
@@ -130,7 +128,7 @@ protected Constraint loadCost(ConstraintFactory factory) {
130128
.join(MrProcessAssignment.class,
131129
equal(MrMachineCapacity::getMachine, MrProcessAssignment::getMachine))
132130
.groupBy((machineCapacity, processAssignment) -> machineCapacity,
133-
sumLong((machineCapacity, processAssignment) -> processAssignment
131+
sum((machineCapacity, processAssignment) -> processAssignment
134132
.getUsage(machineCapacity.getResource())))
135133
.filter(((machineCapacity, usage) -> machineCapacity.getSafetyCapacity() < usage))
136134
.penalize(HardSoftScore.ONE_SOFT,
@@ -148,8 +146,8 @@ protected Constraint balanceCost(ConstraintFactory factory) {
148146
.join(MrProcessAssignment.class)
149147
.groupBy((penalty, processAssignment) -> penalty,
150148
(penalty, processAssignment) -> processAssignment.getMachine(),
151-
sumLong((penalty, processAssignment) -> processAssignment.getUsage(penalty.getOriginResource())),
152-
sumLong((penalty, processAssignment) -> processAssignment.getUsage(penalty.getTargetResource())))
149+
sum((penalty, processAssignment) -> processAssignment.getUsage(penalty.getOriginResource())),
150+
sum((penalty, processAssignment) -> processAssignment.getUsage(penalty.getTargetResource())))
153151
.penalize(HardSoftScore.ONE_SOFT, this::balanceCost)
154152
.asConstraint(MrConstraints.BALANCE_COST);
155153
}
@@ -186,7 +184,7 @@ protected Constraint serviceMoveCost(ConstraintFactory factory) {
186184
return factory.forEach(MrProcessAssignment.class)
187185
.filter(MrProcessAssignment::isMoved)
188186
.groupBy(MrProcessAssignment::getService, ConstraintCollectors.count())
189-
.groupBy(ConstraintCollectors.max((BiFunction<MrService, Integer, Integer>) (service, count) -> count))
187+
.groupBy(ConstraintCollectors.max((MrService service, Long count) -> count))
190188
.join(MrGlobalPenaltyInfo.class)
191189
.penalize(HardSoftScore.ONE_SOFT,
192190
(count, penalty) -> count * penalty.getServiceMoveCostWeight())

src/main/java/ai/timefold/solver/benchmarks/examples/nurserostering/score/NurseRosteringConstraintProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ Constraint minimumAndMaximumNumberOfAssignments(ConstraintFactory constraintFact
100100
ConstraintCollectors.countTri()))
101101
.map((employee, contract, shiftCount) -> employee,
102102
(employee, contract, shiftCount) -> contract,
103-
(employee, contract, shiftCount) -> contract.getViolationAmount(shiftCount))
103+
(employee, contract, shiftCount) -> contract.getViolationAmount(shiftCount.intValue()))
104104
.filter((employee, contract, violationAmount) -> violationAmount != 0)
105105
.penalize(HardSoftBigDecimalScore.ONE_SOFT, (employee, contract, violationAmount) -> violationAmount)
106106
.asConstraint("Minimum and maximum number of assignments");
@@ -419,7 +419,7 @@ Constraint unwantedPatternShiftType3DaysPattern(ConstraintFactory constraintFact
419419
Constraint loadBalanceShiftAssignments(ConstraintFactory constraintFactory) {
420420
return constraintFactory.forEach(ShiftAssignment.class)
421421
.groupBy(ShiftAssignment::getEmployee, ConstraintCollectors.count())
422-
.complement(Employee.class, e -> 0)
422+
.complement(Employee.class, e -> 0L)
423423
.groupBy(ConstraintCollectors.loadBalance((e, count) -> e, (e, count) -> count))
424424
.penalizeBigDecimal(HardSoftBigDecimalScore.ONE_SOFT, LoadBalance::unfairness)
425425
.asConstraint("loadBalanceShiftAssignments");

0 commit comments

Comments
 (0)