Improved exception handling

This commit is contained in:
Vladislav Chumak committed 2019-01-11 14:37:32 +01:00
1 parent 2f60c38e96
commit 846e91fcba
24 files changed
+148 -33

No files matched your search

@@ -162,7 +162,6 @@ public class WindEstimationEvaluatorImpl<T> implements WindEstimationEvaluator<T
estimatedWind);
ManeuverTypeForClassification targetManeuverType = determineManeuverType(maneuver, targetWind);
confusionMatrix[estimatedManeuverType.ordinal()][targetManeuverType.ordinal()]++;
}
}
}
@@ -16,16 +16,16 @@ import com.sap.sailing.windestimation.util.LoggingUtil;
public class WindEstimatorEvaluationRunner {
private static final Integer MAX_RACES = 20;
private static final Integer FIXED_NUMBER_OF_MANEUVERS = null;
private static final boolean RANDOM_CLIPPING_OF_COMPETITOR_TRACKS = false;
private static final Integer FIXED_NUMBER_OF_MANEUVERS = 10;
private static final boolean RANDOM_CLIPPING_OF_COMPETITOR_TRACKS = true;
private static final boolean EVALUATE_PER_COMPETITOR_TRACK = false;
private static final boolean ENABLE_MARKS_INFORMATION = false;
private static final boolean ENABLE_SCALED_SPEED = false;
private static final boolean ENABLE_POLARS = false;
private static final boolean ENABLE_SCALED_SPEED = true;
private static final boolean ENABLE_POLARS = true;
private static final double MIN_CORRECT_ESTIMATIONS_RATIO_FOR_CORRECT_RACE = 0.75;
private static final double MAX_TWS_DEVIATION_PERCENT = 0.2;
private static final int MAX_TWD_DEVIATION_DEG = 20;
private static final EvaluatableWindEstimationImplementation WIND_ESTIMATION_IMPLEMENTATION = EvaluatableWindEstimationImplementation.CLUSTERING;
private static final EvaluatableWindEstimationImplementation WIND_ESTIMATION_IMPLEMENTATION = EvaluatableWindEstimationImplementation.HMM;
public static void main(String[] args) throws Exception {
WindEstimationEvaluator<CompleteManeuverCurveWithEstimationData> evaluator = new WindEstimationEvaluatorImpl<>(
@@ -19,14 +19,13 @@ import com.sap.sailing.windestimation.data.persistence.maneuver.TransformedManeu
import com.sap.sailing.windestimation.data.persistence.polars.PolarDataServiceAccessUtil;
import com.sap.sailing.windestimation.model.classifier.LabelExtraction;
import com.sap.sailing.windestimation.model.classifier.TrainableClassificationModel;
import com.sap.sailing.windestimation.model.store.PersistenceContextType;
import com.sap.sailing.windestimation.model.store.ModelStore;
import com.sap.sailing.windestimation.model.store.MongoDbModelStore;
import com.sap.sailing.windestimation.model.store.PersistenceContextType;
import com.sap.sailing.windestimation.util.LoggingUtil;
import com.sap.sse.common.Util.Pair;
public class ManeuverClassifierTrainer {
// private static final double TRAIN_TEST_SPLIT_RATIO = 0.8;
private static final int MIN_MANEUVERS_COUNT = 500;
private final TransformedManeuversPersistenceManager<ManeuverForEstimation> persistenceManager;
@@ -15,11 +15,11 @@ import com.sap.sailing.domain.polars.PolarDataService;
import com.sap.sailing.windestimation.data.ManeuverForEstimation;
import com.sap.sailing.windestimation.data.persistence.maneuver.RegularManeuversForEstimationPersistenceManager;
import com.sap.sailing.windestimation.data.persistence.polars.PolarDataServiceAccessUtil;
import com.sap.sailing.windestimation.model.ModelPersistenceException;
import com.sap.sailing.windestimation.model.classifier.TrainableClassificationModel;
import com.sap.sailing.windestimation.model.classifier.maneuver.ManeuverClassifierModelFactory;
import com.sap.sailing.windestimation.model.classifier.maneuver.ManeuverClassifierModelMetadata;
import com.sap.sailing.windestimation.model.classifier.maneuver.ManeuverFeatures;
import com.sap.sailing.windestimation.model.exception.ModelPersistenceException;
import com.sap.sailing.windestimation.model.store.ModelStore;
import com.sap.sailing.windestimation.model.store.MongoDbModelStore;
import com.sap.sailing.windestimation.util.LoggingUtil;
@@ -11,8 +11,8 @@ import java.util.regex.Pattern;
import com.sap.sailing.windestimation.data.TwdTransition;
import com.sap.sailing.windestimation.data.persistence.twdtransition.TwdTransitionPersistenceManager;
import com.sap.sailing.windestimation.model.ModelPersistenceException;
import com.sap.sailing.windestimation.model.classifier.TrainableClassificationModel;
import com.sap.sailing.windestimation.model.exception.ModelPersistenceException;
import com.sap.sailing.windestimation.model.store.ModelStore;
import com.sap.sailing.windestimation.model.store.MongoDbModelStore;
import com.sap.sailing.windestimation.util.LoggingUtil;
@@ -2,7 +2,7 @@ package com.sap.sailing.windestimation.model.regressor.twdtransition;
import java.text.DecimalFormat;
import com.sap.sailing.windestimation.model.ModelPersistenceException;
import com.sap.sailing.windestimation.model.exception.ModelPersistenceException;
import com.sap.sailing.windestimation.model.regressor.IncrementalSingleDimensionPolynomialRegressor;
import com.sap.sailing.windestimation.model.store.ModelStore;
import com.sap.sailing.windestimation.util.LoggingUtil;
@@ -21,7 +21,8 @@ Require-Bundle: org.eclipse.osgi;bundle-version="3.10.1",
org.apache.commons.io,
com.sap.sse.replication,
slf4j.api,
org.apache.commons.math
org.apache.commons.math,
com.sap.sse.shared.android
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Export-Package: com.sap.sailing.windestimation
@@ -21,7 +21,7 @@ public class SimpleConfigurableManeuverBasedWindEstimationComponentImpl extends
private static final int MODEL_CACHE_KEEP_ALIVE_MILLIS = 3600000;
private static final HmmTransitionProbabilitiesCalculator transitionProbabilitiesCalculatorType = HmmTransitionProbabilitiesCalculator.INTERSECTED;
private static final boolean propagateIntersectedWindRangeOfHeadupAndBearAway = true;
private static final boolean propagateIntersectedWindRangeOfHeadupAndBearAway = false;
public SimpleConfigurableManeuverBasedWindEstimationComponentImpl(ManeuverFeatures maneuverFeatures,
ModelStore modelStore, PolarDataService polarService,
@@ -16,6 +16,7 @@ import com.sap.sailing.polars.windestimation.ScalableBearingAndScalableDouble;
import com.sap.sailing.windestimation.data.CompetitorTrackWithEstimationData;
import com.sap.sailing.windestimation.data.RaceWithEstimationData;
import com.sap.sailing.windestimation.model.classifier.maneuver.ManeuverWithProbabilisticTypeClassification;
import com.sap.sailing.windestimation.model.exception.ModelOperationException;
import com.sap.sse.common.Bearing;
import com.sap.sse.common.Speed;
import com.sap.sse.common.Util.Pair;
@@ -111,7 +112,7 @@ public class ManeuverClusteringBasedWindEstimationTrackImpl extends AbstractMane
result = Math.min(1.0, averageJibeLikelihood
* (1.0 + BOOST_FACTOR_FOR_JIBE_TACK_SPEED_RATIO_LIKELIHOOD * tackJibeSpeedRatioLikelihood));
} else {
throw new RuntimeException(
throw new ModelOperationException(
"Internal error: no maneuvers in jibe cluster candidate but still a valid weighted average speed "
+ jibeClusterWeightedAverageSpeed);
}
@@ -4,6 +4,9 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.sap.sailing.windestimation.model.exception.ModelLoadingException;
import com.sap.sailing.windestimation.model.exception.ModelNotFoundException;
import com.sap.sailing.windestimation.model.exception.ModelPersistenceException;
import com.sap.sailing.windestimation.model.store.ModelStore;
public class ModelLoader<InstanceType, T extends ContextSpecificModelMetadata<InstanceType>, ModelType extends TrainableModel<InstanceType, T>> {
@@ -24,10 +27,13 @@ public class ModelLoader<InstanceType, T extends ContextSpecificModelMetadata<In
ModelType model = modelFactory.getNewModel(modelMetadata);
try {
model = modelStore.loadPersistedState(model);
if (model != null && model.hasSupportForProvidedFeatures()) {
if (model.hasSupportForProvidedFeatures()) {
loadedModels.add(model);
}
} catch (ModelNotFoundException e) {
// ignore, because no model might be available for the specified model metadata
} catch (ModelPersistenceException e) {
throw new ModelLoadingException(e);
}
}
@@ -2,6 +2,7 @@ package com.sap.sailing.windestimation.model.classifier;
import com.sap.sailing.windestimation.model.AbstractModelCache;
import com.sap.sailing.windestimation.model.ContextSpecificModelMetadata;
import com.sap.sailing.windestimation.model.exception.ModelLoadingException;
import com.sap.sailing.windestimation.model.store.ModelStore;
public abstract class AbstractClassifiersCache<InstanceType, T extends ContextSpecificModelMetadata<InstanceType>, ClassificationResultType>
@@ -19,6 +20,9 @@ public abstract class AbstractClassifiersCache<InstanceType, T extends ContextSp
public ClassificationResultType classifyInstance(InstanceType instance) {
T modelMetadata = getContextSpecificModelMetadata(instance);
TrainableClassificationModel<InstanceType, T> bestClassifierModel = getBestModel(modelMetadata);
if (bestClassifierModel == null) {
throw new ModelLoadingException("No model available for: " + modelMetadata);
}
double[] likelihoods = bestClassifierModel.classifyWithProbabilities(instance);
ClassificationResultType result = classificationResultMapper.mapToClassificationResult(likelihoods, instance,
modelMetadata);
@@ -84,8 +84,6 @@ public class ManeuverClassifierModelMetadata extends ContextSpecificModelMetadat
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ManeuverClassifierModelMetadata other = (ManeuverClassifierModelMetadata) obj;
if (boatClass == null) {
if (other.boatClass != null)
@@ -119,7 +117,7 @@ public class ManeuverClassifierModelMetadata extends ContextSpecificModelMetadat
}
return null;
}
public int getOtherTypes() {
return otherTypes;
}
@@ -133,7 +131,6 @@ public class ManeuverClassifierModelMetadata extends ContextSpecificModelMetadat
inputVector[i++] = maneuver.getLowestSpeedVsExitingSpeedRatio();
inputVector[i++] = maneuver.getSpeedGainRatio();
inputVector[i++] = maneuver.getMaxTurningRateInDegreesPerSecond();
inputVector[i++] = maneuver.getSpeedWithBearingBefore().getMetersPerSecond() / maneuver.getSpeedWithBearingAfter().getMetersPerSecond();
if (maneuverFeatures.isPolarsInformation()) {
inputVector[i++] = maneuver.getDeviationFromOptimalTackAngleInDegrees();
inputVector[i++] = maneuver.getDeviationFromOptimalJibeAngleInDegrees();
@@ -150,7 +147,7 @@ public class ManeuverClassifierModelMetadata extends ContextSpecificModelMetadat
@Override
public int getNumberOfInputFeatures() {
int numberOfFeatures = 6;
int numberOfFeatures = 5;
if (maneuverFeatures.isPolarsInformation()) {
numberOfFeatures += 2;
}
@@ -9,6 +9,7 @@ public class NeuralNetworkClassifier<InstanceType, T extends ContextSpecificMode
extends AbstractSmileClassificationModel<InstanceType, T> {
private static final long serialVersionUID = -3364152319152090775L;
private static final int EPOCHS = 20;
public NeuralNetworkClassifier(T contextSpecificModelMetadata) {
super(new PreprocessingConfigBuilder().scaling().build(), contextSpecificModelMetadata);
@@ -29,12 +30,12 @@ public class NeuralNetworkClassifier<InstanceType, T extends ContextSpecificMode
numUnits);
}
for (int i = 0; i < 20; i++) {
for (int i = 0; i < EPOCHS; i++) {
net.learn(x, y);
}
return net;
}
@Override
public double[] classifyWithProbabilities(double[] x) {
int k = getContextSpecificModelMetadata().getNumberOfPossibleTargetValues();
@@ -0,0 +1,27 @@
package com.sap.sailing.windestimation.model.exception;
public class ModelLoadingException extends ModelRuntimeException {
private static final long serialVersionUID = 9129472285700533042L;
public ModelLoadingException() {
}
public ModelLoadingException(String message) {
super(message);
}
public ModelLoadingException(Throwable cause) {
super(cause);
}
public ModelLoadingException(String message, Throwable cause) {
super(message, cause);
}
public ModelLoadingException(String message, Throwable cause, boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
@@ -0,0 +1,23 @@
package com.sap.sailing.windestimation.model.exception;
import com.sap.sailing.windestimation.model.ContextSpecificModelMetadata;
public class ModelNotFoundException extends ModelPersistenceException {
private static final long serialVersionUID = 2426127713965713226L;
private final ContextSpecificModelMetadata<?> modelMetadata;
public ModelNotFoundException(ContextSpecificModelMetadata<?> modelMetadata) {
this.modelMetadata = modelMetadata;
}
public ModelNotFoundException(ContextSpecificModelMetadata<?> modelMetadata, Throwable e) {
super(e);
this.modelMetadata = modelMetadata;
}
public ContextSpecificModelMetadata<?> getModelMetadata() {
return modelMetadata;
}
}
@@ -0,0 +1,27 @@
package com.sap.sailing.windestimation.model.exception;
public class ModelOperationException extends ModelRuntimeException {
private static final long serialVersionUID = 7308703386832127467L;
public ModelOperationException() {
}
public ModelOperationException(String message) {
super(message);
}
public ModelOperationException(Throwable cause) {
super(cause);
}
public ModelOperationException(String message, Throwable cause) {
super(message, cause);
}
public ModelOperationException(String message, Throwable cause, boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
@@ -1,4 +1,4 @@
package com.sap.sailing.windestimation.model;
package com.sap.sailing.windestimation.model.exception;
public class ModelPersistenceException extends Exception {
@@ -0,0 +1,27 @@
package com.sap.sailing.windestimation.model.exception;
public class ModelRuntimeException extends RuntimeException {
private static final long serialVersionUID = 170716968865186247L;
public ModelRuntimeException() {
}
public ModelRuntimeException(String message) {
super(message);
}
public ModelRuntimeException(Throwable cause) {
super(cause);
}
public ModelRuntimeException(String message, Throwable cause) {
super(message, cause);
}
public ModelRuntimeException(String message, Throwable cause, boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
@@ -6,6 +6,7 @@ import com.sap.sailing.domain.polars.NotEnoughDataHasBeenAddedException;
import com.sap.sailing.polars.regression.IncrementalLeastSquares;
import com.sap.sailing.polars.regression.impl.IncrementalAnyOrderLeastSquaresImpl;
import com.sap.sailing.windestimation.model.ContextSpecificModelMetadata;
import com.sap.sailing.windestimation.model.exception.ModelOperationException;
public class IncrementalSingleDimensionPolynomialRegressor<InstanceType, T extends ContextSpecificModelMetadata<InstanceType>>
extends AbstractRegressorModel<InstanceType, T>
@@ -35,7 +36,7 @@ public class IncrementalSingleDimensionPolynomialRegressor<InstanceType, T exten
try {
polynomialFunction = regression.getOrCreatePolynomialFunction();
} catch (NotEnoughDataHasBeenAddedException e) {
throw new RuntimeException(e);
throw new ModelOperationException(e);
}
double value = polynomialFunction.value(x[0]);
return value;
@@ -46,7 +47,7 @@ public class IncrementalSingleDimensionPolynomialRegressor<InstanceType, T exten
try {
polynomialFunction = regression.getOrCreatePolynomialFunction();
} catch (NotEnoughDataHasBeenAddedException e) {
throw new RuntimeException(e);
throw new ModelOperationException(e);
}
double value = polynomialFunction.value(x);
return value;
@@ -71,7 +72,7 @@ public class IncrementalSingleDimensionPolynomialRegressor<InstanceType, T exten
polynomialFunction = regression.getOrCreatePolynomialFunction();
return polynomialFunction.toString();
} catch (NotEnoughDataHasBeenAddedException e) {
throw new RuntimeException(e);
throw new ModelOperationException(e);
}
}
@@ -7,8 +7,9 @@ import java.io.IOException;
import java.nio.file.Files;
import com.sap.sailing.windestimation.model.ContextSpecificModelMetadata;
import com.sap.sailing.windestimation.model.ModelPersistenceException;
import com.sap.sailing.windestimation.model.TrainableModel;
import com.sap.sailing.windestimation.model.exception.ModelNotFoundException;
import com.sap.sailing.windestimation.model.exception.ModelPersistenceException;
public class FileSystemModelStore implements ModelStore {
@@ -55,7 +56,7 @@ public class FileSystemModelStore implements ModelStore {
throw new ModelPersistenceException(e);
}
}
return null;
throw new ModelNotFoundException(newModel.getContextSpecificModelMetadata());
}
@Override
@@ -1,8 +1,8 @@
package com.sap.sailing.windestimation.model.store;
import com.sap.sailing.windestimation.model.ContextSpecificModelMetadata;
import com.sap.sailing.windestimation.model.ModelPersistenceException;
import com.sap.sailing.windestimation.model.TrainableModel;
import com.sap.sailing.windestimation.model.exception.ModelPersistenceException;
public interface ModelStore {
<T extends PersistableModel<?, ?>> void persistState(T trainedModel) throws ModelPersistenceException;
@@ -8,8 +8,9 @@ import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import com.mongodb.client.gridfs.GridFSDownloadStream;
import com.sap.sailing.windestimation.model.ContextSpecificModelMetadata;
import com.sap.sailing.windestimation.model.ModelPersistenceException;
import com.sap.sailing.windestimation.model.TrainableModel;
import com.sap.sailing.windestimation.model.exception.ModelNotFoundException;
import com.sap.sailing.windestimation.model.exception.ModelPersistenceException;
public class MongoDbModelStore implements ModelStore {
@@ -43,7 +44,7 @@ public class MongoDbModelStore implements ModelStore {
}
return loadedModel;
} catch (MongoException e) {
throw new ModelPersistenceException(e);
throw new ModelNotFoundException(newModel.getContextSpecificModelMetadata(), e);
}
}
@@ -3,7 +3,7 @@ package com.sap.sailing.windestimation.model.store;
import java.io.InputStream;
import java.io.OutputStream;
import com.sap.sailing.windestimation.model.ModelPersistenceException;
import com.sap.sailing.windestimation.model.exception.ModelPersistenceException;
public interface PersistenceSupport {
String getPersistenceKey();
@@ -7,7 +7,7 @@ import java.io.ObjectOutputStream;
import java.io.OutputStream;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.windestimation.model.ModelPersistenceException;
import com.sap.sailing.windestimation.model.exception.ModelPersistenceException;
public class SerializationBasedPersistenceSupport implements PersistenceSupport {