Bugfixes and unit tests (now hudson must be green)

This commit is contained in:
Vladislav Chumak committed 2019-01-30 12:17:37 +01:00
1 parent b94496bf09
commit 401dec4d8a
7 files changed
+235 -170

No files matched your search

@@ -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)));
@@ -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));
@@ -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;
@@ -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;
}