Use pct instead of fixed value for leading competitor filter in polars

This commit is contained in:
Frederik Petersen committed 2015-03-17 17:21:31 +01:00
1 parent 7617dc7d85
commit 0e1966dd23
4 files changed
+47 -26

No files matched your search

@@ -32,6 +32,6 @@ public interface PolarSheetGenerationSettings extends Serializable {
boolean areDefault();
int getNumberOfLeadingCompetitorsToInclude();
double getPctOfLeadingCompetitorsToInclude();
}
@@ -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);
@@ -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;