java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingForLowPointsTest.java
... ...
@@ -215,20 +215,22 @@ public class LeaderboardScoringAndRankingForLowPointsTest extends LeaderboardSco
215 215
// in favor of C2 because C2 must have performed better in the medal races F1/F2 due to the worse
216 216
// carried score
217 217
assertEquals(raceColumnNames.size(), leaderboard.getNetPoints(competitors.get(0), carryColumn, now), EPSILON);
218
- leaderboard.getScoreCorrection().correctScore(competitors.get(0), f1, 5.0);
219
- leaderboard.getScoreCorrection().correctScore(competitors.get(0), f2, 3.0); // medal series: 3 (Carry) + 5 + 3 = 11
218
+ leaderboard.getScoreCorrection().correctScore(competitors.get(0), f1, 7.0);
219
+ leaderboard.getScoreCorrection().correctScore(competitors.get(0), f2, 3.0); // medal series: 5 (Carry) + 7 + 3 = 15
220 220
assertEquals(2*raceColumnNames.size(), leaderboard.getNetPoints(competitors.get(1), carryColumn, now), EPSILON);
221 221
leaderboard.getScoreCorrection().correctScore(competitors.get(1), f1, 1.0);
222
- leaderboard.getScoreCorrection().correctScore(competitors.get(1), f2, 4.0); // medal series: 6 (Carry) + 1 + 4 = 11
222
+ leaderboard.getScoreCorrection().correctScore(competitors.get(1), f2, 4.0); // medal series: 10 (Carry) + 1 + 4 = 15
223
+ assertEquals(leaderboard.getNetPoints(competitors.get(0), now), leaderboard.getNetPoints(competitors.get(1), now), EPSILON);
223 224
// construct a tie between C9 and C10 (index 8 and 9, respectively); the tie is expected to be broken
224 225
// in favor of C9 because although both carried the same number of points from the open series due
225 226
// to the "reduced points" rule, and both scores equal points in total in F1 and F2, C9 had the better
226 227
// best score.
227 228
assertEquals(leaderboard.getNetPoints(competitors.get(8), carryColumn, now), leaderboard.getNetPoints(competitors.get(9), carryColumn, now), EPSILON);
228
- leaderboard.getScoreCorrection().correctScore(competitors.get(8), f1, 6.0);
229
- leaderboard.getScoreCorrection().correctScore(competitors.get(8), f2, 8.0);
230
- leaderboard.getScoreCorrection().correctScore(competitors.get(9), f1, 7.0);
231
- leaderboard.getScoreCorrection().correctScore(competitors.get(9), f2, 7.0);
229
+ leaderboard.getScoreCorrection().correctScore(competitors.get(8), f1, 5.0);
230
+ leaderboard.getScoreCorrection().correctScore(competitors.get(8), f2, 7.0);
231
+ leaderboard.getScoreCorrection().correctScore(competitors.get(9), f1, 6.0);
232
+ leaderboard.getScoreCorrection().correctScore(competitors.get(9), f2, 6.0);
233
+ assertEquals(leaderboard.getNetPoints(competitors.get(8), now), leaderboard.getNetPoints(competitors.get(9), now), EPSILON);
232 234
// construct a tie between C7 and C8 (index 6 and 7, respectively); the tie is based on
233 235
// equal carried points and equal medal series points throughout (both DNF in F1 and F2),
234 236
// but C7 is expected to be ranked better because of the better rank in the opening series,
... ...
@@ -251,7 +253,7 @@ public class LeaderboardScoringAndRankingForLowPointsTest extends LeaderboardSco
251 253
leaderboard.getScoreCorrection().correctScore(competitors.get(2), f2, 1.0);
252 254
leaderboard.getScoreCorrection().correctScore(competitors.get(3), f2, 2.0);
253 255
leaderboard.getScoreCorrection().correctScore(competitors.get(4), f2, 5.0);
254
- leaderboard.getScoreCorrection().correctScore(competitors.get(5), f2, 6.0);
256
+ leaderboard.getScoreCorrection().correctScore(competitors.get(5), f2, 8.0);
255 257
final Iterable<Competitor> ranking = leaderboard.getCompetitorsFromBestToWorst(now);
256 258
assertTrue(Util.indexOf(ranking, competitors.get(6)) < Util.indexOf(ranking, competitors.get(7)));
257 259
assertTrue(Util.indexOf(ranking, competitors.get(8)) < Util.indexOf(ranking, competitors.get(9)));
java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoringScheme.java
... ...
@@ -100,7 +100,6 @@ public interface ScoringScheme extends Serializable {
100 100
* scores of the first competitor, in the order of race columns in the leaderboard
101 101
* @param competitor2Scores
102 102
* scores of the second competitor, in the order of race columns in the leaderboard
103
- * @param raceColumnsToConsider TODO
104 103
* @param discardedRaceColumnsPerCompetitor
105 104
* for each competitor holds the result of {@link Leaderboard#getResultDiscardingRule()
106 105
* Leaderborad.getResultDiscardingRule()}{@code .}{@link ResultDiscardingRule#getDiscardedRaceColumns(Competitor, Leaderboard, Iterable, TimePoint, ScoringScheme)
... ...
@@ -108,8 +107,11 @@ public interface ScoringScheme extends Serializable {
108 107
* for each competitor again.
109 108
*/
110 109
int compareByBetterScore(Competitor o1, List<Util.Pair<RaceColumn, Double>> competitor1Scores, Competitor o2,
111
- List<Util.Pair<RaceColumn, Double>> competitor2Scores, Iterable<RaceColumn> raceColumnsToConsider, boolean nullScoresAreBetter,
112
- TimePoint timePoint, Leaderboard leaderboard, Map<Competitor, Set<RaceColumn>> discardedRaceColumnsPerCompetitor, BiFunction<Competitor, RaceColumn, Double> totalPointsSupplier, WindLegTypeAndLegBearingAndORCPerformanceCurveCache cache);
110
+ List<Util.Pair<RaceColumn, Double>> competitor2Scores, Iterable<RaceColumn> raceColumnsToConsider,
111
+ boolean nullScoresAreBetter, TimePoint timePoint, Leaderboard leaderboard,
112
+ Map<Competitor, Set<RaceColumn>> discardedRaceColumnsPerCompetitor,
113
+ BiFunction<Competitor, RaceColumn, Double> totalPointsSupplier,
114
+ WindLegTypeAndLegBearingAndORCPerformanceCurveCache cache);
113 115
114 116
/**
115 117
* In case two competitors scored in different numbers of races, this scoring scheme decides whether this
... ...
@@ -349,16 +351,28 @@ public interface ScoringScheme extends Serializable {
349 351
}
350 352
351 353
/**
352
- * Precondition: either both scored in medal race or both didn't. If both scored, the better score wins.
354
+ * Precondition: either both scored in medal race or both didn't. If both scored, the better score sum wins. If both
355
+ * scored the same sum in the medal races, apply
356
+ * {@link #compareByScoreSum(Competitor, List, double, Competitor, List, double, boolean, boolean, Supplier)} to
357
+ * apply the same tie breaking to the medal races as for other series.
358
+ * <p>
359
+ *
353 360
* This is to be applied only if the net score of both competitors are equal to each other.
354 361
*/
355
- default int compareByMedalRaceScore(Double o1MedalRaceScore, Double o2MedalRaceScore, boolean nullScoresAreBetter) {
362
+ default int compareByMedalRaceScore(Competitor o1, Competitor o2, Double o1MedalRaceScore, Double o2MedalRaceScore,
363
+ List<Pair<RaceColumn, Double>> o1ScoringMedalRaces, List<Pair<RaceColumn, Double>> o2ScoringMedalRaces,
364
+ TimePoint timePoint, Leaderboard leaderboard,
365
+ Map<Competitor, Set<RaceColumn>> discardedRaceColumnsPerCompetitor,
366
+ BiFunction<Competitor, RaceColumn, Double> totalPointsSupplier, boolean nullScoresAreBetter,
367
+ WindLegTypeAndLegBearingAndORCPerformanceCurveCache cache) {
356 368
assert o1MedalRaceScore != null || o2MedalRaceScore == null;
357 369
final int result;
358 370
if (o1MedalRaceScore != null) {
359 371
result = getScoreComparator(nullScoresAreBetter).compare(o1MedalRaceScore, o2MedalRaceScore);
360 372
} else {
361
- result = 0;
373
+ result = compareByBetterScore(o1, o1ScoringMedalRaces, o2, o2ScoringMedalRaces, Util.map(o1ScoringMedalRaces, Pair::getA),
374
+ nullScoresAreBetter, timePoint, leaderboard, discardedRaceColumnsPerCompetitor, totalPointsSupplier,
375
+ cache);
362 376
}
363 377
return result;
364 378
}
java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LeaderboardTotalRankComparator.java
... ...
@@ -169,8 +169,10 @@ public class LeaderboardTotalRankComparator implements Comparator<Competitor> {
169 169
List<Util.Pair<RaceColumn, Double>> o2TotalPoints = new ArrayList<>();
170 170
double o1ScoreSum = getLeaderboard().getCarriedPoints(o1);
171 171
double o2ScoreSum = getLeaderboard().getCarriedPoints(o2);
172
- Double o1MedalRaceScore = 0.0; // "blindly" adds them all up, regardless of "series starts with zero score"
173
- Double o2MedalRaceScore = 0.0; // "blindly" adds them all up, regardless of "series starts with zero score"
172
+ final List<Util.Pair<RaceColumn, Double>> o1ScoringMedalRaces = new ArrayList<>();
173
+ final List<Util.Pair<RaceColumn, Double>> o2ScoringMedalRaces = new ArrayList<>();
174
+ Double o1MedalRaceScoreSum = 0.0; // "blindly" adds them all up, regardless of "series starts with zero score"
175
+ Double o2MedalRaceScoreSum = 0.0; // "blindly" adds them all up, regardless of "series starts with zero score"
174 176
Double o1CarryForwardScoreInMedals = null;
175 177
Double o2CarryForwardScoreInMedals = null;
176 178
// When a column has isStartsWithZeroScore, the competitor's score only need to be reset to zero if from there on
... ...
@@ -240,10 +242,12 @@ public class LeaderboardTotalRankComparator implements Comparator<Competitor> {
240 242
// only count the score for the medal race score if it wasn't a carry-forward column
241 243
if (!raceColumn.isCarryForward()) {
242 244
if (o1Score != null) {
243
- o1MedalRaceScore += o1Score;
245
+ o1MedalRaceScoreSum += o1Score;
246
+ o1ScoringMedalRaces.add(new Pair<>(raceColumn, o1Score));
244 247
}
245 248
if (o2Score != null) {
246
- o2MedalRaceScore += o2Score;
249
+ o2MedalRaceScoreSum += o2Score;
250
+ o2ScoringMedalRaces.add(new Pair<>(raceColumn, o2Score));
247 251
}
248 252
} else {
249 253
o1CarryForwardScoreInMedals = o1Score;
... ...
@@ -319,7 +323,12 @@ public class LeaderboardTotalRankComparator implements Comparator<Competitor> {
319 323
(competitor, raceColumn)->totalPointsCache.get(new Pair<>(competitor, raceColumn)), cache, timePoint,
320 324
zeroBasedIndexOfLastMedalSeriesInWhichO1Scored, numberOfMedalRacesWonO1, numberOfMedalRacesWonO2);
321 325
if (result == 0) {
322
- result = scoringScheme.compareByMedalRaceScore(o1MedalRaceScore, o2MedalRaceScore, nullScoresAreBetter);
326
+ result = scoringScheme.compareByMedalRaceScore(o1, o2, o1MedalRaceScoreSum,
327
+ o2MedalRaceScoreSum, o1ScoringMedalRaces, o2ScoringMedalRaces, timePoint,
328
+ leaderboard, Collections.unmodifiableMap(discardedRaceColumnsPerCompetitor),
329
+ (competitor1, raceColumn1) -> totalPointsCache
330
+ .get(new Pair<>(competitor1, raceColumn1)),
331
+ nullScoresAreBetter, cache);
323 332
if (result == 0) {
324 333
result = scoringScheme.compareByBetterScore(o1, Collections.unmodifiableList(o1TotalPoints),
325 334
o2, Collections.unmodifiableList(o2TotalPoints),
java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LowPointFirstToWinThreeRaces.java
... ...
@@ -355,7 +355,7 @@ public class LowPointFirstToWinThreeRaces extends LowPoint {
355 355
* {@link #compareByMedalRacesWon(int, int)} instead.
356 356
*/
357 357
@Override
358
- public int compareByMedalRaceScore(Double o1MedalRaceScore, Double o2MedalRaceScore, boolean nullScoresAreBetter) {
358
+ public int compareByMedalRaceScore(Competitor o1, Competitor o2, Double o1MedalRaceScore, Double o2MedalRaceScore, List<Pair<RaceColumn, Double>> o1ScoringMedalRaces, List<Pair<RaceColumn, Double>> o2ScoringMedalRaces, TimePoint timePoint, Leaderboard leaderboard, Map<Competitor, Set<RaceColumn>> discardedRaceColumnsPerCompetitor, BiFunction<Competitor, RaceColumn, Double> totalPointSupplier, boolean nullScoresAreBetter, WindLegTypeAndLegBearingAndORCPerformanceCurveCache cache) {
359 359
return 0;
360 360
}
361 361
java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LowPointWithEliminatingMedalSeriesWithPromotions.java
... ...
@@ -126,7 +126,7 @@ public abstract class LowPointWithEliminatingMedalSeriesWithPromotions extends L
126 126
* medal series, or if already at the first medal series, the opening series will be used for tie-breaking.
127 127
*/
128 128
@Override
129
- public int compareByMedalRaceScore(Double o1MedalRaceScore, Double o2MedalRaceScore, boolean nullScoresAreBetter) {
129
+ public int compareByMedalRaceScore(Competitor o1, Competitor o2, Double o1MedalRaceScore, Double o2MedalRaceScore, List<Pair<RaceColumn, Double>> o1ScoringMedalRaces, List<Pair<RaceColumn, Double>> o2ScoringMedalRaces, TimePoint timePoint, Leaderboard leaderboard, Map<Competitor, Set<RaceColumn>> discardedRaceColumnsPerCompetitor, BiFunction<Competitor, RaceColumn, Double> totalPointSupplier, boolean nullScoresAreBetter, WindLegTypeAndLegBearingAndORCPerformanceCurveCache cache) {
130 130
return 0;
131 131
}
132 132
java/com.sap.sse.test/src/com/sap/sse/test/CPUTimeMeasurementTest.java
... ...
@@ -1,5 +1,6 @@
1 1
package com.sap.sse.test;
2 2
3
+import static org.junit.jupiter.api.Assertions.assertEquals;
3 4
import static org.junit.jupiter.api.Assertions.assertFalse;
4 5
import static org.junit.jupiter.api.Assertions.assertTrue;
5 6
... ...
@@ -13,6 +14,8 @@ import org.junit.jupiter.api.BeforeAll;
13 14
import org.junit.jupiter.api.Disabled;
14 15
import org.junit.jupiter.api.Test;
15 16
17
+import com.sap.sse.metering.CPUMeter;
18
+
16 19
public class CPUTimeMeasurementTest {
17 20
private static final Logger logger = Logger.getLogger(CPUTimeMeasurementTest.class.getName());
18 21
... ...
@@ -38,6 +41,12 @@ public class CPUTimeMeasurementTest {
38 41
+" ("+((double) durationWithCpuTimeEnabled / (double) durationWithCpuTimeDisabled)+")");
39 42
assertFalse((double) durationWithCpuTimeEnabled > 1.5*durationWithCpuTimeDisabled);
40 43
}
44
+
45
+ @Test
46
+ public void testCallableResultProperlyReturned() {
47
+ final int result = CPUMeter.create().callWithCPUMeter(() -> { return 2; });
48
+ assertEquals(2, result);
49
+ }
41 50
42 51
@Test
43 52
public void testSingleThreadedWorkloadOffByLessThanFactorTwo() {