mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-13 22:15:26 +00:00
Use pct instead of fixed value for leading competitor filter in polars
This commit is contained in:
1 parent
7617dc7d85
commit
0e1966dd23
4 files changed
+47
-26
No files matched your search
+1
-1
@@ -32,6 +32,6 @@ public interface PolarSheetGenerationSettings extends Serializable {
|
||||
|
||||
boolean areDefault();
|
||||
|
||||
int getNumberOfLeadingCompetitorsToInclude();
|
||||
double getPctOfLeadingCompetitorsToInclude();
|
||||
|
||||
}
|
||||
+7
-7
@@ -11,7 +11,7 @@ public class PolarSheetGenerationSettingsImpl implements PolarSheetGenerationSet
|
||||
double[] levels = { 4., 6., 8., 10., 12., 14., 16., 20., 25., 30. };
|
||||
WindSpeedSteppingWithMaxDistance windStepping = new WindSpeedSteppingWithMaxDistance(levels, 2.5);
|
||||
return new PolarSheetGenerationSettingsImpl(50, 0.1, 20, 20, 0.1, true, true, 2, 0.05, true, windStepping,
|
||||
false, 0);
|
||||
false, 1);
|
||||
}
|
||||
|
||||
public static PolarSheetGenerationSettings createBackendPolarSettings() {
|
||||
@@ -26,7 +26,7 @@ public class PolarSheetGenerationSettingsImpl implements PolarSheetGenerationSet
|
||||
}
|
||||
WindSpeedSteppingWithMaxDistance windStepping = new WindSpeedSteppingWithMaxDistance(levels, 0.5);
|
||||
return new PolarSheetGenerationSettingsImpl(50, 0.1, 20, 20, 0.1, true, true, 2, 0.05, true, windStepping,
|
||||
false, 1);
|
||||
false, 0.1);
|
||||
}
|
||||
|
||||
private static final long serialVersionUID = 2731616509404813790L;
|
||||
@@ -42,7 +42,7 @@ public class PolarSheetGenerationSettingsImpl implements PolarSheetGenerationSet
|
||||
private boolean useOnlyEstimationForWindDirection;
|
||||
private WindSpeedSteppingWithMaxDistance windStepping;
|
||||
private boolean splitByWindGauges;
|
||||
private int numberOfLeadingCompetitorsToInclude;
|
||||
private double pctOfLeadingCompetitorsToInclude;
|
||||
|
||||
//GWT
|
||||
PolarSheetGenerationSettingsImpl() {};
|
||||
@@ -52,7 +52,7 @@ public class PolarSheetGenerationSettingsImpl implements PolarSheetGenerationSet
|
||||
boolean useOnlyWindGaugesForWindSpeed, boolean shouldRemoveOutliers,
|
||||
double outlierDetectionNeighboorhoodRadius, double outlierMinimumNeighboorhoodPct,
|
||||
boolean useOnlyEstimationForWindDirection, WindSpeedSteppingWithMaxDistance windStepping,
|
||||
boolean splitByWindGauges, int numberOfLeadingCompetitorsToInclude) {
|
||||
boolean splitByWindGauges, double pctOfLeadingCompetitorsToInclude) {
|
||||
this.minimumDataCountPerGraph = minimumDataCountPerGraph;
|
||||
this.minimumWindConfidence = minimumWindConfidence;
|
||||
this.minimumDataCountPerAngle = minimumDataCountPerAngle;
|
||||
@@ -65,7 +65,7 @@ public class PolarSheetGenerationSettingsImpl implements PolarSheetGenerationSet
|
||||
this.useOnlyEstimationForWindDirection = useOnlyEstimationForWindDirection;
|
||||
this.windStepping = windStepping;
|
||||
this.splitByWindGauges = splitByWindGauges;
|
||||
this.numberOfLeadingCompetitorsToInclude = numberOfLeadingCompetitorsToInclude;
|
||||
this.pctOfLeadingCompetitorsToInclude = pctOfLeadingCompetitorsToInclude;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -209,8 +209,8 @@ public class PolarSheetGenerationSettingsImpl implements PolarSheetGenerationSet
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getNumberOfLeadingCompetitorsToInclude() {
|
||||
return numberOfLeadingCompetitorsToInclude;
|
||||
public double getPctOfLeadingCompetitorsToInclude() {
|
||||
return pctOfLeadingCompetitorsToInclude;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -164,7 +164,7 @@ public class PolarDataMiner {
|
||||
filteringResultReceivers.add(regressionPerAngleClusterGroupingProcessor);
|
||||
|
||||
Processor<GPSFixMovingWithPolarContext, GPSFixMovingWithPolarContext> filteringProcessor = new ParallelFilteringProcessor<GPSFixMovingWithPolarContext>(
|
||||
GPSFixMovingWithPolarContext.class, executor, filteringResultReceivers, new PolarFixFilterCriteria(backendPolarSheetGenerationSettings.getNumberOfLeadingCompetitorsToInclude()));
|
||||
GPSFixMovingWithPolarContext.class, executor, filteringResultReceivers, new PolarFixFilterCriteria(backendPolarSheetGenerationSettings.getPctOfLeadingCompetitorsToInclude()));
|
||||
|
||||
Collection<Processor<GPSFixMovingWithPolarContext, ?>> enrichingResultReceivers = Arrays
|
||||
.asList(filteringProcessor);
|
||||
@@ -210,7 +210,7 @@ public class PolarDataMiner {
|
||||
private void processFix(TrackedRace trackedRace, GPSFixMovingWithOriginInfo fixWithOriginInfo) {
|
||||
// Pre Filter for performance. We don't need to run wind estimation for this filter
|
||||
if (PolarFixFilterCriteria.isInLeadingCompetitors(trackedRace, fixWithOriginInfo.getCompetitor(),
|
||||
backendPolarSheetGenerationSettings.getNumberOfLeadingCompetitorsToInclude())) {
|
||||
backendPolarSheetGenerationSettings.getPctOfLeadingCompetitorsToInclude())) {
|
||||
synchronized (fixQueue) {
|
||||
if (executor.getQueue().size() >= EXECUTOR_QUEUE_SIZE / 3) {
|
||||
fixQueue.add(fixWithOriginInfo);
|
||||
|
||||
+37
-16
@@ -1,5 +1,6 @@
|
||||
package com.sap.sailing.polars.mining;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
@@ -24,20 +25,20 @@ public class PolarFixFilterCriteria implements FilterCriterion<GPSFixMovingWithP
|
||||
* 0 if every competitor should be included.
|
||||
* 1 if only the leading competitor should be included and so on.
|
||||
*/
|
||||
private final int numberOfLeadingCompetitorsToInclude;
|
||||
private final double pctOfLeadingCompetitorsToInclude;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param numberOfLeadingCompetitorsToInclude
|
||||
* 0 if every competitor should be included.<br \>
|
||||
* 1 if only the leading competitor should be included and so on.
|
||||
* @param pctOfLeadingCompetitorsToInclude
|
||||
* 0 if no competitor should be included.<br \>
|
||||
* 1 if every competitor should be included
|
||||
*/
|
||||
public PolarFixFilterCriteria(int numberOfLeadingCompetitorsToInclude) {
|
||||
this.numberOfLeadingCompetitorsToInclude = numberOfLeadingCompetitorsToInclude;
|
||||
public PolarFixFilterCriteria(double pctOfLeadingCompetitorsToInclude) {
|
||||
this.pctOfLeadingCompetitorsToInclude = pctOfLeadingCompetitorsToInclude;
|
||||
}
|
||||
|
||||
public PolarFixFilterCriteria() {
|
||||
this.numberOfLeadingCompetitorsToInclude = 0;
|
||||
this.pctOfLeadingCompetitorsToInclude = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -51,9 +52,9 @@ public class PolarFixFilterCriteria implements FilterCriterion<GPSFixMovingWithP
|
||||
boolean beforeFinishTime = isBeforeFinishTime(element);
|
||||
boolean noDirectionChange = !hasDirectionChange(element);
|
||||
boolean isInLeadingCompetitors = true;
|
||||
if (numberOfLeadingCompetitorsToInclude > 0) {
|
||||
if (pctOfLeadingCompetitorsToInclude > 0) {
|
||||
isInLeadingCompetitors = isInLeadingCompetitors(element.getRace(), element.getCompetitor(),
|
||||
numberOfLeadingCompetitorsToInclude);
|
||||
pctOfLeadingCompetitorsToInclude);
|
||||
}
|
||||
return (importantDataIsNotNull && hasLegType && afterStartTime && beforeFinishTime && noDirectionChange && isInLeadingCompetitors);
|
||||
}
|
||||
@@ -73,7 +74,7 @@ public class PolarFixFilterCriteria implements FilterCriterion<GPSFixMovingWithP
|
||||
return element.getLegType() != null;
|
||||
}
|
||||
|
||||
public static boolean isInLeadingCompetitors(TrackedRace trackedRace, Competitor competitor, int numberOfLeadingCompetitorsToInclude) {
|
||||
public static boolean isInLeadingCompetitors(TrackedRace trackedRace, Competitor competitor, double numberOfLeadingCompetitorsToInclude) {
|
||||
boolean result;
|
||||
if (!trackedRace.isLive(new MillisecondsTimePoint(System.currentTimeMillis()))) {
|
||||
result = isInLeadingCompetitorsForReplayRace(trackedRace, competitor, numberOfLeadingCompetitorsToInclude);
|
||||
@@ -84,13 +85,14 @@ public class PolarFixFilterCriteria implements FilterCriterion<GPSFixMovingWithP
|
||||
}
|
||||
|
||||
private static boolean isInLeadingCompetitorsForLiveRace(TrackedRace trackedRace, Competitor competitor,
|
||||
int numberOfLeadingCompetitorsToInclude) {
|
||||
double pctOfLeadingCompetitorsToInclude) {
|
||||
boolean result = false;
|
||||
Waypoint wayPoint = trackedRace.getMarkPassings(competitor).last().getWaypoint();
|
||||
if (wayPoint != null) {
|
||||
Iterator<MarkPassing> markPassingsAtCompetitorsLastWayPoint = trackedRace
|
||||
.getMarkPassingsInOrder(trackedRace.getRace().getCourse().getLastWaypoint()).iterator();
|
||||
for (int i = 0; i < numberOfLeadingCompetitorsToInclude; i++) {
|
||||
Iterator<MarkPassing> markPassingsAtCompetitorsLastWayPoint = trackedRace.getMarkPassingsInOrder(
|
||||
trackedRace.getRace().getCourse().getLastWaypoint()).iterator();
|
||||
for (int i = 0; i < ((int) Math.max(pctOfLeadingCompetitorsToInclude
|
||||
* getNumberOfCompetitors(trackedRace), 1)); i++) {
|
||||
if (markPassingsAtCompetitorsLastWayPoint.hasNext()) {
|
||||
if (markPassingsAtCompetitorsLastWayPoint.next().getCompetitor().equals(competitor)) {
|
||||
result = true;
|
||||
@@ -105,11 +107,30 @@ public class PolarFixFilterCriteria implements FilterCriterion<GPSFixMovingWithP
|
||||
return result;
|
||||
}
|
||||
|
||||
public static boolean isInLeadingCompetitorsForReplayRace(TrackedRace trackedRace, Competitor competitor, int numberOfLeadingCompetitorsToInclude) {
|
||||
private static int getNumberOfCompetitors(TrackedRace trackedRace) {
|
||||
Iterable<Competitor> competitors = trackedRace.getRace().getCompetitors();
|
||||
int result;
|
||||
if (competitors instanceof Collection) {
|
||||
Collection<Competitor> competitorCollection = (Collection<Competitor>) competitors;
|
||||
result = competitorCollection.size();
|
||||
} else {
|
||||
int counter = 0;
|
||||
Iterator<Competitor> iterator = competitors.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
iterator.next();
|
||||
counter++;
|
||||
}
|
||||
result = counter;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static boolean isInLeadingCompetitorsForReplayRace(TrackedRace trackedRace, Competitor competitor, double pctOfLeadingCompetitorsToInclude) {
|
||||
boolean result = false;
|
||||
Iterator<MarkPassing> finishPassings = trackedRace
|
||||
.getMarkPassingsInOrder(trackedRace.getRace().getCourse().getLastWaypoint()).iterator();
|
||||
for (int i = 0; i < numberOfLeadingCompetitorsToInclude; i++) {
|
||||
for (int i = 0; i < ((int) Math.max(pctOfLeadingCompetitorsToInclude
|
||||
* getNumberOfCompetitors(trackedRace), 1)); i++) {
|
||||
if (finishPassings.hasNext()) {
|
||||
if (finishPassings.next().getCompetitor().equals(competitor)) {
|
||||
result = true;
|
||||
|
||||
Reference in new issue
Block a user