package de.fub.agg2graph.gpseval;
import de.fub.agg2graph.gpseval.data.AggregatedData;
import de.fub.agg2graph.gpseval.data.DataLoader;
import de.fub.agg2graph.gpseval.data.filter.TrackFilter;
import de.fub.agg2graph.gpseval.data.filter.WaypointFilter;
import de.fub.agg2graph.gpseval.features.Feature;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* A TestCase-instance is used to load GPS-data-files, run Weka with the loaded
* data and return the results.
*
* The GPS-data-files are loaded using a
* {@link de.fub.agg2graph.gpseval.data.DataLoader DataLoader}-instance with
* {@link de.fub.agg2graph.gpseval.data.filter.TrackFilter TrackFilter}s and
* {@link de.fub.agg2graph.gpseval.data.filter.WaypointFilter WaypointFilter}s.
* Weka is run using the {@link de.fub.agg2graph.gpseval.WekaEval WekaEval}
* -class. All information needed for the test-case is loaded from a
* {@link de.fub.agg2graph.gpseval.Config Config}-object. The results are stored
* in a {@link de.fub.agg2graph.gpseval.WekaResult WekaResult}-object.
*
*/
public class TestCase {
private Config mCfg;
private Map<String, List<String>> mClassesFolderMapping;
private List<Feature> mFeatures;
private List<TrackFilter> mTrackFilters;
private List<WaypointFilter> mWaypointFilters;
/**
* Create a test-case based on a {@link de.fub.agg2graph.gpseval.Config
* Config}.
*
* @param cfg
*/
public TestCase(Config cfg) {
mCfg = cfg;
mFeatures = mCfg.getFeatures();
mClassesFolderMapping = mCfg.getClassesFolderMapping();
mTrackFilters = mCfg.getTrackFilters();
mWaypointFilters = mCfg.getWaypointFilters();
}
/**
* Run the test-case: Load GPS-data-files, run Weka and return the results.
*
* @throws FileNotFoundException
* @throws IOException
* @throws de.fub.agg2graph.gpseval.TestCase.NoDataException
* @throws Exception
*/
public TestResult run() throws FileNotFoundException, IOException,
NoDataException, Exception {
// 1. Load GPS-tracks
DataLoader gpsLoader = new DataLoader();
gpsLoader.addFeatures(mFeatures);
gpsLoader.addTrackFilters(mTrackFilters);
gpsLoader.addWaypointFilters(mWaypointFilters);
Map<String, List<AggregatedData>> gpsData = gpsLoader
.loadData(mClassesFolderMapping);
boolean noData = true;
for (String className : gpsData.keySet()) {
if (!gpsData.get(className).isEmpty()) {
noData = false;
break;
}
}
if (noData) {
throw new NoDataException();
}
// 2. Run Weka
WekaEval eval = new WekaEval(gpsData, mFeatures);
eval.setTrainingSetSize(mCfg.getTrainingSetSize());
eval.setCrossValidationFolds(mCfg.getCrossValidationFolds());
eval.run();
return new TestResult(mCfg, eval.getCrossValidationResults(),
eval.getTrainingTestResults());
}
public class NoDataException extends Exception {
/**
*
*/
private static final long serialVersionUID = 1L;
}
}