From 0e1966dd231d07b02a16cdce25e1de7846e413dc Mon Sep 17 00:00:00 2001 From: Frederik Petersen Date: Tue, 17 Mar 2015 17:21:31 +0100 Subject: [PATCH] Use pct instead of fixed value for leading competitor filter in polars --- .../common/PolarSheetGenerationSettings.java | 2 +- .../PolarSheetGenerationSettingsImpl.java | 14 ++--- .../sailing/polars/mining/PolarDataMiner.java | 4 +- .../polars/mining/PolarFixFilterCriteria.java | 53 +++++++++++++------ 4 files changed, 47 insertions(+), 26 deletions(-) diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/PolarSheetGenerationSettings.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/PolarSheetGenerationSettings.java index e5a2c4f6de0..a4b5adbd983 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/PolarSheetGenerationSettings.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/PolarSheetGenerationSettings.java @@ -32,6 +32,6 @@ public interface PolarSheetGenerationSettings extends Serializable { boolean areDefault(); - int getNumberOfLeadingCompetitorsToInclude(); + double getPctOfLeadingCompetitorsToInclude(); } diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/PolarSheetGenerationSettingsImpl.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/PolarSheetGenerationSettingsImpl.java index 8f1ee656f11..05abcd90c0a 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/PolarSheetGenerationSettingsImpl.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/PolarSheetGenerationSettingsImpl.java @@ -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; } diff --git a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarDataMiner.java b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarDataMiner.java index db363b8ce9a..303d90a7a42 100755 --- a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarDataMiner.java +++ b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarDataMiner.java @@ -164,7 +164,7 @@ public class PolarDataMiner { filteringResultReceivers.add(regressionPerAngleClusterGroupingProcessor); Processor filteringProcessor = new ParallelFilteringProcessor( - GPSFixMovingWithPolarContext.class, executor, filteringResultReceivers, new PolarFixFilterCriteria(backendPolarSheetGenerationSettings.getNumberOfLeadingCompetitorsToInclude())); + GPSFixMovingWithPolarContext.class, executor, filteringResultReceivers, new PolarFixFilterCriteria(backendPolarSheetGenerationSettings.getPctOfLeadingCompetitorsToInclude())); Collection> 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); diff --git a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarFixFilterCriteria.java b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarFixFilterCriteria.java index 73c973a426b..8c8e2a9a78c 100644 --- a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarFixFilterCriteria.java +++ b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarFixFilterCriteria.java @@ -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 - * 1 if only the leading competitor should be included and so on. + * @param pctOfLeadingCompetitorsToInclude + * 0 if no competitor should be included.
+ * 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 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 markPassingsAtCompetitorsLastWayPoint = trackedRace - .getMarkPassingsInOrder(trackedRace.getRace().getCourse().getLastWaypoint()).iterator(); - for (int i = 0; i < numberOfLeadingCompetitorsToInclude; i++) { + Iterator 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 competitors = trackedRace.getRace().getCompetitors(); + int result; + if (competitors instanceof Collection) { + Collection competitorCollection = (Collection) competitors; + result = competitorCollection.size(); + } else { + int counter = 0; + Iterator 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 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;