/*******************************************************************************
* Copyright (c) 2014 EURA NOVA.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v2.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* Aldemar Reynaga - initial API and implementation
* Salim Jouili - initial API and implementation
******************************************************************************/
package com.steffi.testing;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
import java.util.Map;
import com.steffi.common.ImgLogger;
import com.steffi.loader.TextFileLoader;
import com.steffi.model.EdgeType;
import com.steffi.model.SteffiGraph;
import com.steffi.model.SteffiVertex;
import com.steffi.networking.ClusterConfigManager;
import com.steffi.traversal.EdgeTraversalConf;
import com.steffi.traversal.Evaluation;
import com.steffi.traversal.MatchEvaluator;
import com.steffi.traversal.MatchEvaluatorConf;
import com.steffi.traversal.Method;
import com.steffi.traversal.SimpleTraversal;
import com.steffi.traversal.TraversalResults;
/**
* @author Aldemar Reynaga
* Manages and execute the test case read from a graph test case file
*/
public class TestManager {
public enum GraphEngine {
IMGRAPH,
NEO4J,
TITAN
}
private GraphTestCase graphTestCase;
public TestManager (GraphTestCase testCase) {
this.graphTestCase = testCase;
}
private void writeStatistics(BufferedWriter writer, Map<StatisticalIndicators, Double> statistics ) throws IOException {
DecimalFormat df = new DecimalFormat("##############.##", new DecimalFormatSymbols(Locale.US));
writer.write("Statistical indicators of processing times");
writer.newLine();
writer.write("Minimum: " + df.format(statistics.get(StatisticalIndicators.MIN)));
writer.newLine();
writer.write("Maximum: " + df.format(statistics.get(StatisticalIndicators.MAX)));
writer.newLine();
writer.write("Median: " + df.format(statistics.get(StatisticalIndicators.MEDIAN)));
writer.newLine();
writer.write("Mean: " + df.format(statistics.get(StatisticalIndicators.MEAN)));
writer.newLine();
writer.write("Dev. standard: " + df.format(statistics.get(StatisticalIndicators.DEV_STD)));
writer.newLine();
}
private void warmUpTraversal(EdgeType edgeType) throws Exception {
SimpleTraversal traversal = new SimpleTraversal();
TraversalResults results = null;
traversal.setHops(4);
MatchEvaluatorConf matchConf = new MatchEvaluatorConf();
matchConf.setCellId(4354L);
matchConf.setEvaluation(Evaluation.INCLUDE_AND_STOP);
traversal.addEvaluators(new MatchEvaluator(matchConf));
EdgeTraversalConf traversalConf = new EdgeTraversalConf("", edgeType);
traversal.addEdgeTraversalConfs(traversalConf);
traversal.setMethod(Method.BREADTH_FIRST);
results = traversal.traverse((SteffiVertex) SteffiGraph.getInstance().retrieveRawCell(1));
matchConf.setCellId(8787L);
results = traversal.traverse((SteffiVertex) SteffiGraph.getInstance().retrieveRawCell(655));
matchConf.setCellId(11112L);
results = traversal.traverse((SteffiVertex) SteffiGraph.getInstance().retrieveRawCell(9652));
}
public void execute() throws IOException {
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter(new File(
graphTestCase.getWorkDirectory() + "results.txt"), false));
writer.write("RESULTS FOR FILE: " + graphTestCase.getGraphFileName());
writer.newLine();
Map<StatisticalIndicators, Double> statistics;
//Config cluster
ClusterConfigManager configManager = new ClusterConfigManager();
configManager.initialize();
configManager.closeClientThreads();
//Load file
TextFileLoader loader = new TextFileLoader();
String loadResults [] = loader.load(graphTestCase.getGraphFileName(), graphTestCase.getLoadFileType(),
graphTestCase.isDirected());
writer.write("Loading results: number of vertices: " + loadResults[0] + ", number of edges: " + loadResults[1]);
writer.newLine();
Thread.sleep(5000);
EdgeType edgeTypeTraversal = graphTestCase.isDirected()?EdgeType.OUT:EdgeType.UNDIRECTED;
//Traverse test
writer.newLine();
writer.write("TRAVERSAL RESULTS (expressed in milliseconds)");
writer.newLine();
writer.newLine();
writer.write("Test file containing 200 random queries that can have or not a path");
writer.newLine();
writer.write("Max hops: 3 - Edge type: " + (graphTestCase.isDirected()?EdgeType.OUT:EdgeType.UNDIRECTED)
+ " - Delay: " + graphTestCase.getDelay());
writer.newLine();
EdgeTraversalConf traversalConf = new EdgeTraversalConf("", edgeTypeTraversal);
statistics = TestTools.testTraversalFromFile(SteffiGraph.getInstance(),
traversalConf, Evaluation.INCLUDE_AND_STOP, graphTestCase.getTestFileName(),
3, graphTestCase.getWorkDirectory() + "logTraversal-3.txt",
graphTestCase.getDelay());
writeStatistics(writer, statistics);
Thread.sleep(2000);
writer.newLine();
writer.write("Test file containing 200 random queries that can have or not a path");
writer.newLine();
writer.write("Max hops: 4 - Edge type: " + (graphTestCase.isDirected()?EdgeType.OUT:EdgeType.UNDIRECTED));
writer.newLine();
statistics = TestTools.testTraversalFromFile(SteffiGraph.getInstance(),
traversalConf, Evaluation.INCLUDE_AND_STOP, graphTestCase.getTestFileName(),
4, graphTestCase.getWorkDirectory() + "logTraversal-4.txt", graphTestCase.getDelay());
writeStatistics(writer, statistics);
Thread.sleep(2000);
writer.newLine();
writer.write("Test file containing 200 random queries that have a path");
writer.newLine();
writer.write("Max hops: 3 - Edge type: " + (graphTestCase.isDirected()?EdgeType.OUT:EdgeType.UNDIRECTED));
writer.newLine();
statistics = TestTools.testTraversalFromFile(SteffiGraph.getInstance(),
traversalConf, Evaluation.INCLUDE_AND_STOP, graphTestCase.getTest3HFileName(),
3, graphTestCase.getWorkDirectory() + "logTraversal_3H.txt", graphTestCase.getDelay());
writeStatistics(writer, statistics);
Thread.sleep(2000);
writer.newLine();
writer.write("Test file containing 200 random queries that have a path");
writer.newLine();
writer.write("Max hops: 4 - Edge type: " + (graphTestCase.isDirected()?EdgeType.OUT:EdgeType.UNDIRECTED));
writer.newLine();
statistics = TestTools.testTraversalFromFile(SteffiGraph.getInstance(),
traversalConf, Evaluation.INCLUDE_AND_STOP, graphTestCase.getTest4HFileName(),
4, graphTestCase.getWorkDirectory() + "logTraversal_4H.txt", graphTestCase.getDelay());
writeStatistics(writer, statistics);
Thread.sleep(2000);
//Read & write tests
System.out.println("Processing read tests");
statistics = TestTools.testReads(graphTestCase.getTestFileName(),
graphTestCase.getWorkDirectory() + "logReads.txt");
writer.newLine();
writer.write("READ RESULTS (400 reads) (expressed in nanoseconds)");
writer.newLine();
writeStatistics(writer, statistics);
Thread.sleep(5000);
System.out.println("Processing write tests");
statistics = TestTools.testWrites(graphTestCase.getTestFileName(),
graphTestCase.getWorkDirectory() + "logWrites.txt");
writer.newLine();
writer.write("WRITE RESULTS (200 writes) (expressed in nanoseconds)");
writer.newLine();
writeStatistics(writer, statistics);
writer.flush();
} catch (Exception e) {
ImgLogger.logError(e, "Error loading adjacent list format file (parallel");
} finally {
if (writer != null) {
writer.flush();
writer.close();
}
}
}
}