mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-13 22:15:26 +00:00
Bugfixes and unit tests (now hudson must be green)
This commit is contained in:
1 parent
b94496bf09
commit
401dec4d8a
7 files changed
+235
-170
No files matched your search
+3
-3
@@ -18,8 +18,8 @@ import com.sap.sailing.windestimation.aggregator.hmm.ManeuverSequenceGraph;
|
||||
import com.sap.sailing.windestimation.aggregator.hmm.SimpleIntersectedWindRangeBasedTransitionProbabilitiesCalculator;
|
||||
import com.sap.sailing.windestimation.aggregator.hmm.TwdTransitionClassifierBasedTransitionProbabilitiesCalculator;
|
||||
import com.sap.sailing.windestimation.aggregator.msthmm.DistanceAndDurationAwareWindTransitionProbabilitiesCalculator;
|
||||
import com.sap.sailing.windestimation.aggregator.msthmm.MstBestPathsCalculatorImpl;
|
||||
import com.sap.sailing.windestimation.aggregator.msthmm.MstManeuverGraph;
|
||||
import com.sap.sailing.windestimation.aggregator.msthmm.MstToSequenceBestPathsCalculatorImpl;
|
||||
import com.sap.sailing.windestimation.aggregator.outlierremoval.MeanBasedOutlierRemovalWindEstimator;
|
||||
import com.sap.sailing.windestimation.aggregator.outlierremoval.NeighborBasedOutlierRemovalWindEstimator;
|
||||
import com.sap.sailing.windestimation.data.ManeuverTypeForClassification;
|
||||
@@ -121,8 +121,8 @@ public class ManeuverClassificationsAggregatorFactory {
|
||||
}
|
||||
|
||||
public ManeuverClassificationsAggregator mstHmm(boolean propagateIntersectedWindRangeOfHeadupAndBearAway) {
|
||||
return new MstManeuverGraph(new MstToSequenceBestPathsCalculatorImpl(
|
||||
new DistanceAndDurationAwareWindTransitionProbabilitiesCalculator(
|
||||
return new MstManeuverGraph(
|
||||
new MstBestPathsCalculatorImpl(new DistanceAndDurationAwareWindTransitionProbabilitiesCalculator(
|
||||
new GaussianBasedTwdTransitionDistributionCache(modelStore, preloadAllModels,
|
||||
modelCacheKeepAliveMillis),
|
||||
propagateIntersectedWindRangeOfHeadupAndBearAway)));
|
||||
|
||||
+2
-2
@@ -23,8 +23,8 @@ import com.sap.sailing.domain.windestimation.IncrementalWindEstimationTrack;
|
||||
import com.sap.sailing.windestimation.aggregator.hmm.GraphLevelInference;
|
||||
import com.sap.sailing.windestimation.aggregator.msthmm.DistanceAndDurationAwareWindTransitionProbabilitiesCalculator;
|
||||
import com.sap.sailing.windestimation.aggregator.msthmm.MstBestPathsCalculator;
|
||||
import com.sap.sailing.windestimation.aggregator.msthmm.MstBestPathsCalculatorImpl;
|
||||
import com.sap.sailing.windestimation.aggregator.msthmm.MstManeuverGraphGenerator.MstManeuverGraphComponents;
|
||||
import com.sap.sailing.windestimation.aggregator.msthmm.MstToSequenceBestPathsCalculatorImpl;
|
||||
import com.sap.sailing.windestimation.model.classifier.maneuver.ManeuverClassifiersCache;
|
||||
import com.sap.sailing.windestimation.model.classifier.maneuver.ManeuverWithEstimatedType;
|
||||
import com.sap.sailing.windestimation.model.regressor.twdtransition.GaussianBasedTwdTransitionDistributionCache;
|
||||
@@ -63,7 +63,7 @@ public class IncrementalMstHmmWindEstimationForTrackedRace extends WindTrackImpl
|
||||
gaussianBasedTwdTransitionDistributionCache, true);
|
||||
this.mstManeuverGraphGenerator = new IncrementalMstManeuverGraphGenerator(trackedRace,
|
||||
transitionProbabilitiesCalculator, maneuverClassifiersCache, polarDataService);
|
||||
this.bestPathsCalculator = new MstToSequenceBestPathsCalculatorImpl(transitionProbabilitiesCalculator);
|
||||
this.bestPathsCalculator = new MstBestPathsCalculatorImpl(transitionProbabilitiesCalculator);
|
||||
this.windTrackCalculator = new WindTrackCalculatorImpl(new MiddleCourseBasedTwdCalculatorImpl(),
|
||||
polarDataService == null ? new DummyBasedTwsCalculatorImpl()
|
||||
: new PolarsBasedTwsCalculatorImpl(polarDataService));
|
||||
|
||||
+33
-44
@@ -17,7 +17,6 @@ import com.sap.sailing.domain.common.ManeuverType;
|
||||
import com.sap.sailing.domain.common.Position;
|
||||
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.maneuverdetection.TrackTimeInfo;
|
||||
import com.sap.sailing.domain.maneuverdetection.impl.ManeuverMainCurveDetailsWithBearingSteps;
|
||||
import com.sap.sailing.domain.polars.PolarDataService;
|
||||
import com.sap.sailing.domain.tracking.CompleteManeuverCurve;
|
||||
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
||||
@@ -40,10 +39,9 @@ public class IncrementalMstManeuverGraphGenerator extends MstManeuverGraphGenera
|
||||
private static final Duration MIN_DURATION_TO_OTHER_MANEUVER = new MillisecondsDurationImpl(
|
||||
ManeuverForEstimationTransformer.MIN_SECONDS_TO_OTHER_MANEUVER * 1000L);
|
||||
|
||||
private final Map<Competitor, ManeuverDataOfCompetitor> maneuverDataPerCompetitor = new HashMap<>();
|
||||
protected final Map<Competitor, ManeuverDataOfCompetitor> maneuverDataPerCompetitor = new HashMap<>();
|
||||
private final ManeuverClassifiersCache maneuverClassifiersCache;
|
||||
private final TrackedRace trackedRace;
|
||||
private int numberOfNonTemporaryManeuvers;
|
||||
private final ManeuverForEstimationTransformer maneuverForEstimationTransformer = new ManeuverForEstimationTransformer();
|
||||
private final PolarDataService polarService;
|
||||
|
||||
@@ -123,18 +121,10 @@ public class IncrementalMstManeuverGraphGenerator extends MstManeuverGraphGenera
|
||||
if (maneuver1.getTimePoint().equals(maneuver2.getTimePoint())) {
|
||||
return true;
|
||||
}
|
||||
ManeuverMainCurveDetailsWithBearingSteps turningSection1 = maneuver1.getMainCurveBoundaries();
|
||||
ManeuverMainCurveDetailsWithBearingSteps turningSection2 = maneuver2.getMainCurveBoundaries();
|
||||
TimePoint latestBefore = turningSection1.getTimePointBefore().after(turningSection2.getTimePointBefore())
|
||||
? turningSection1.getTimePointBefore()
|
||||
: turningSection2.getTimePointBefore();
|
||||
TimePoint earliestAfter = turningSection1.getTimePointAfter().before(turningSection2.getTimePointAfter())
|
||||
? turningSection1.getTimePointAfter()
|
||||
: turningSection2.getTimePointAfter();
|
||||
return latestBefore.before(earliestAfter);
|
||||
return false;
|
||||
}
|
||||
|
||||
private ManeuverForEstimation convertCleanManeuverSpotToManeuverForEstimation(CompleteManeuverCurve maneuver,
|
||||
protected ManeuverForEstimation convertCleanManeuverSpotToManeuverForEstimation(CompleteManeuverCurve maneuver,
|
||||
CompleteManeuverCurve previousManeuver, CompleteManeuverCurve nextManeuver, Competitor competitor,
|
||||
TrackTimeInfo trackTimeInfo) {
|
||||
if (!maneuverForEstimationTransformer
|
||||
@@ -253,8 +243,7 @@ public class IncrementalMstManeuverGraphGenerator extends MstManeuverGraphGenera
|
||||
|
||||
@Override
|
||||
public MstManeuverGraphComponents parseGraph() {
|
||||
List<ManeuverWithProbabilisticTypeClassification> nonTemporaryNodes = new ArrayList<>(
|
||||
numberOfNonTemporaryManeuvers);
|
||||
List<ManeuverWithProbabilisticTypeClassification> nonTemporaryNodes = new ArrayList<>();
|
||||
List<ManeuverWithProbabilisticTypeClassification> temporaryNodes = new ArrayList<>();
|
||||
for (ManeuverDataOfCompetitor maneuverData : maneuverDataPerCompetitor.values()) {
|
||||
nonTemporaryNodes.addAll(maneuverData.getNonTemporaryAcceptedManeuverClassificationsToAdd());
|
||||
@@ -273,39 +262,39 @@ public class IncrementalMstManeuverGraphGenerator extends MstManeuverGraphGenera
|
||||
return super.parseGraph();
|
||||
}
|
||||
// TODO revert changes
|
||||
Collections.sort(temporaryNodes);
|
||||
for (ManeuverWithProbabilisticTypeClassification node : temporaryNodes) {
|
||||
addNode(node);
|
||||
}
|
||||
for (ManeuverDataOfCompetitor maneuverData : maneuverDataPerCompetitor.values()) {
|
||||
CompleteManeuverCurve latestTemporaryAcceptedManeuver = maneuverData.getLatestTemporaryAcceptedManeuver();
|
||||
if (latestTemporaryAcceptedManeuver != null) {
|
||||
maneuverData.getNonTemporaryAcceptedManeuverClassificationsToAdd()
|
||||
.add(maneuverData.getLatestTemporaryAcceptedManeuverClassification());
|
||||
maneuverData.setLatestNonTemporaryAcceptedManeuver(latestTemporaryAcceptedManeuver);
|
||||
for (Iterator<CompleteManeuverCurve> iterator = maneuverData
|
||||
.getAllManeuversAfterLatestNonTemporaryAcceptedManeuver().iterator(); iterator.hasNext();) {
|
||||
CompleteManeuverCurve maneuver = iterator.next();
|
||||
if (!maneuver.getTimePoint().after(latestTemporaryAcceptedManeuver.getTimePoint())) {
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
maneuverData.setLatestTemporaryAcceptedManeuver(null);
|
||||
maneuverData.setLatestTemporaryAcceptedManeuverClassification(null);
|
||||
}
|
||||
}
|
||||
return parseGraph();
|
||||
Collections.sort(temporaryNodes);
|
||||
for (ManeuverWithProbabilisticTypeClassification node : temporaryNodes) {
|
||||
addNode(node);
|
||||
}
|
||||
for (ManeuverDataOfCompetitor maneuverData : maneuverDataPerCompetitor.values()) {
|
||||
CompleteManeuverCurve latestTemporaryAcceptedManeuver = maneuverData.getLatestTemporaryAcceptedManeuver();
|
||||
if (latestTemporaryAcceptedManeuver != null) {
|
||||
maneuverData.getNonTemporaryAcceptedManeuverClassificationsToAdd()
|
||||
.add(maneuverData.getLatestTemporaryAcceptedManeuverClassification());
|
||||
maneuverData.setLatestNonTemporaryAcceptedManeuver(latestTemporaryAcceptedManeuver);
|
||||
for (Iterator<CompleteManeuverCurve> iterator = maneuverData
|
||||
.getAllManeuversAfterLatestNonTemporaryAcceptedManeuver().iterator(); iterator.hasNext();) {
|
||||
CompleteManeuverCurve maneuver = iterator.next();
|
||||
if (!maneuver.getTimePoint().after(latestTemporaryAcceptedManeuver.getTimePoint())) {
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
maneuverData.setLatestTemporaryAcceptedManeuver(null);
|
||||
maneuverData.setLatestTemporaryAcceptedManeuverClassification(null);
|
||||
}
|
||||
}
|
||||
return parseGraph();
|
||||
|
||||
// END revert here, uncomment next
|
||||
// MstManeuverGraphGenerator clonedMstGenerator = clone();
|
||||
// Collections.sort(temporaryNodes);
|
||||
// for (ManeuverWithProbabilisticTypeClassification node : temporaryNodes) {
|
||||
// clonedMstGenerator.addNode(node);
|
||||
// }
|
||||
// return clonedMstGenerator.parseGraph();
|
||||
// MstManeuverGraphGenerator clonedMstGenerator = clone();
|
||||
// Collections.sort(temporaryNodes);
|
||||
// for (ManeuverWithProbabilisticTypeClassification node : temporaryNodes) {
|
||||
// clonedMstGenerator.addNode(node);
|
||||
// }
|
||||
// return clonedMstGenerator.parseGraph();
|
||||
}
|
||||
|
||||
private static class ManeuverDataOfCompetitor {
|
||||
protected static class ManeuverDataOfCompetitor {
|
||||
private CompleteManeuverCurve latestNonTemporaryAcceptedManeuver = null;
|
||||
private CompleteManeuverCurve latestTemporaryAcceptedManeuver = null;
|
||||
private ManeuverWithProbabilisticTypeClassification latestTemporaryAcceptedManeuverClassification = null;
|
||||
|
||||
+20
-12
@@ -1,9 +1,7 @@
|
||||
package com.sap.sailing.windestimation.model.store;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@@ -21,23 +19,33 @@ public class ClassPathReadOnlyModelStore extends AbstractModelStore {
|
||||
|
||||
private final String destinationFolder;
|
||||
private final ClassLoader classLoader;
|
||||
private final String[] modelFileNames;
|
||||
|
||||
public ClassPathReadOnlyModelStore(String destinationFolder, ClassLoader classLoader) {
|
||||
public ClassPathReadOnlyModelStore(String destinationFolder, ClassLoader classLoader, String[] modelFileNames) {
|
||||
this.destinationFolder = destinationFolder;
|
||||
this.classLoader = classLoader;
|
||||
this.modelFileNames = modelFileNames;
|
||||
}
|
||||
|
||||
private List<String> getResourceFiles(String path) throws IOException {
|
||||
List<String> filenames = new ArrayList<>();
|
||||
try (InputStream in = getResourceAsStream(path)) {
|
||||
if (in != null) {
|
||||
try (BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
|
||||
String resource;
|
||||
while ((resource = br.readLine()) != null) {
|
||||
filenames.add(resource);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// does not work in OSGI environment
|
||||
|
||||
// try (InputStream in = getResourceAsStream(path)) {
|
||||
// if (in != null) {
|
||||
// try (BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
|
||||
// String resource;
|
||||
// while ((resource = br.readLine()) != null) {
|
||||
// filenames.add(resource);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// Thats why use provided modelFileNames
|
||||
for (String fileName : modelFileNames) {
|
||||
filenames.add(fileName);
|
||||
}
|
||||
return filenames;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user