Permalink
Browse files

Add a script that generates a benchmark plan from a graph rather than…

… GTFS. Formatting fixes too.
  • Loading branch information...
1 parent e2c219e commit e005a575c92a87a8f06769e4aba0c9b01fe2b3ea @fakeholz fakeholz committed Dec 31, 2012
@@ -0,0 +1,179 @@
+/* This program is free software: you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License
+ as published by the Free Software Foundation, either version 3 of
+ the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+package org.opentripplanner.integration.benchmark;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.Random;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.GnuParser;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.Parser;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.node.ObjectNode;
+import org.onebusaway.gtfs.model.Stop;
+import org.onebusaway.gtfs.serialization.GtfsReader;
+import org.onebusaway.gtfs.services.GenericMutableDao;
+import org.opentripplanner.routing.graph.Graph;
+import org.opentripplanner.routing.graph.Graph.LoadLevel;
+import org.opentripplanner.routing.graph.Vertex;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Envelope;
+
+/**
+ * Generate a benchmark plan (see {@link RunBenchmarkPlanMain} from a Graph randomly picking pairs of points near intersections and generating from-to
+ * trip requests between the pairs. The resulting trip plan file can be fed into {@link RunBenchmarkPlanMain} to run a benchmark of those plans.
+ *
+ * @author flamholz
+ */
+public class GenerateGraphBenchmarkPlanMain {
+
+ private static final String ARG_TIME = "time";
+
+ private static final String ARG_SAMPLES = "samples";
+
+ private static final String ARG_LAT_NOISE = "latNoise";
+
+ private static final String ARG_LON_NOISE = "lonNoise";
+
+ public static void main(String[] args) throws Exception {
+
+ Options options = new Options();
+ options.addOption(ARG_TIME, true, "time to plan trip");
+ options.addOption(ARG_SAMPLES, true, "number of samples to generate");
+ options.addOption(ARG_LAT_NOISE, true, "lat noise");
+ options.addOption(ARG_LON_NOISE, true, "lon noise");
+
+ Parser parser = new GnuParser();
+ CommandLine cli = parser.parse(options, args);
+ args = cli.getArgs();
+
+ if (args.length != 2) {
+ System.err.println("usage: input_graph output_file");
+ System.exit(-1);
+ }
+
+ GenerateGraphBenchmarkPlanMain task = new GenerateGraphBenchmarkPlanMain();
+ task.setInputPath(new File(args[0]));
+ task.setOutputPath(new File(args[1]));
+
+ if (cli.hasOption(ARG_TIME)) {
+ Date time = DateLibrary.getIso8601StringAsDate(cli.getOptionValue(ARG_TIME));
+ task.setTime(time);
+ }
+
+ if (cli.hasOption(ARG_SAMPLES)) {
+ int samples = Integer.parseInt(cli.getOptionValue(ARG_SAMPLES));
+ task.setSamples(samples);
+ }
+
+ if (cli.hasOption(ARG_LAT_NOISE)) {
+ task.setLatNoise(Double.parseDouble(cli.getOptionValue(ARG_LAT_NOISE)));
+ }
+
+ if (cli.hasOption(ARG_LON_NOISE)) {
+ task.setLatNoise(Double.parseDouble(cli.getOptionValue(ARG_LON_NOISE)));
+ }
+
+ task.run();
+ }
+
+ private static Random _random = new Random();
+
+ private File _inputPath;
+
+ private File _outputPath;
+
+ private Date _time = new Date();
+
+ private int _samples = 100;
+
+ private double _latNoise = 0.0002;
+
+ private double _lonNoise = 0.002;
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ public void setInputPath(File file) {
+ _inputPath = file;
+ }
+
+ public void setOutputPath(File file) {
+ _outputPath = file;
+ }
+
+ public void setTime(Date time) {
+ _time = time;
+ }
+
+ public void setSamples(int samples) {
+ _samples = samples;
+ }
+
+ public void setLatNoise(double latNoise) {
+ _latNoise = latNoise;
+ }
+
+ public void setLonNoise(double lonNoise) {
+ _lonNoise = lonNoise;
+ }
+
+ public void run() throws IOException, ClassNotFoundException {
+
+ Graph g = readGraphFromFile();
+ List<Vertex> vertices = new ArrayList<Vertex>(g.getVertices());
+
+ String timeAsString = DateLibrary.getTimeAsIso8601String(_time);
+
+ PrintWriter out = new PrintWriter(_outputPath);
+
+ for (int i = 0; i < _samples; i++) {
+ ObjectNode from = getRandomLocationNearVertex(vertices);
+ ObjectNode to = getRandomLocationNearVertex(vertices);
+ ObjectNode row = mapper.createObjectNode();
+ row.put("from", from);
+ row.put("to", to);
+ row.put("time", timeAsString);
+ out.println(row.toString());
+ }
+
+ out.close();
+ }
+
+ private Graph readGraphFromFile() throws IOException, ClassNotFoundException {
+ Graph g = Graph.load(_inputPath, LoadLevel.FULL);
+ return g;
+ }
+
+ private ObjectNode getRandomLocationNearVertex(List<Vertex> vertices) {
+
+ int index = _random.nextInt(vertices.size());
+ Vertex v = vertices.get(index);
+
+ double lat = v.getY() + _random.nextGaussian() * _latNoise;
+ double lon = v.getX() + _random.nextGaussian() * _lonNoise;
+
+ ObjectNode obj = mapper.createObjectNode();
+ obj.put("lat", lat);
+ obj.put("lon", lon);
+ return obj;
+ }
+}
Oops, something went wrong.

0 comments on commit e005a57

Please sign in to comment.