/* 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.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; 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.JsonNode; import org.codehaus.jackson.map.ObjectMapper; import org.opentripplanner.common.model.GenericLocation; import org.opentripplanner.model.GraphBundle; import org.opentripplanner.routing.core.RoutingRequest; import org.opentripplanner.routing.error.VertexNotFoundException; import org.opentripplanner.routing.graph.Graph; import org.opentripplanner.routing.graph.Graph.LoadLevel; import org.opentripplanner.routing.impl.SerializedGraphFactoryBean; import org.opentripplanner.routing.services.PathService; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.io.ClassPathResource; public class RunBenchmarkPlanMain { private static final String ARG_REPETITIONS = "repetitions"; public static void main(String[] args) throws Exception { Options options = new Options(); options.addOption(ARG_REPETITIONS, true, "repetitions"); Parser parser = new GnuParser(); CommandLine cli = parser.parse(options, args); args = cli.getArgs(); if (args.length != 2) { System.err.println("usage: graph_path benchmark_path"); System.exit(-1); } RunBenchmarkPlanMain task = new RunBenchmarkPlanMain(); task.setGraphPath(new File(args[0])); task.setBenchmarkPlan(new File(args[1])); if (cli.hasOption(ARG_REPETITIONS)) task.setRepetitions(Integer.parseInt(cli.getOptionValue(ARG_REPETITIONS))); task.run(); } private File _graphPath; private File _benchmarkPlan; private int _repetitions = 1; public void setGraphPath(File path) { _graphPath = path; } public void setBenchmarkPlan(File benchmarkPlan) { _benchmarkPlan = benchmarkPlan; } public void setRepetitions(int repetitions) { _repetitions = repetitions; } public void run() throws Exception { GenericApplicationContext context = getApplicationContext(); PathService service = (PathService) context.getBean("pathServiceImpl"); List<Plan> plans = readPlans(); long tTotal = 0; for (int i = 0; i < _repetitions; i++) { for (Plan plan : plans) { GenericLocation from = new GenericLocation(plan.latFrom, plan.lonTo); GenericLocation to = new GenericLocation(plan.latTo, plan.lonTo); try { RoutingRequest opt = new RoutingRequest(); opt.setDateTime(plan.time); opt.setFrom(from); opt.setTo(to); long t0 = System.currentTimeMillis(); service.getPaths(opt); long t1 = System.currentTimeMillis(); System.out.println("t=" + (t1 - t0)); tTotal += t1 - t0; } catch (VertexNotFoundException ex) { System.out.println("no vertex: from=" + from + " to=" + to); } } } System.out.println("totalTime=" + tTotal); } private List<Plan> readPlans() throws FileNotFoundException, IOException, ParseException { BufferedReader reader = new BufferedReader(new FileReader(_benchmarkPlan)); String line = null; List<Plan> plans = new ArrayList<Plan>(); while ((line = reader.readLine()) != null) { ObjectMapper mapper = new ObjectMapper(); JsonNode obj = mapper.readTree(line); plans.add(getJsonObjectAsPlan(obj)); } reader.close(); return plans; } private GenericApplicationContext getApplicationContext() { GenericApplicationContext ctx = new GenericApplicationContext(); XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx); xmlReader.loadBeanDefinitions(new ClassPathResource( "org/opentripplanner/integration/application-context.xml")); Map<String, BeanDefinition> additionalBeans = getAdditionalBeans(); for (Map.Entry<String, BeanDefinition> entry : additionalBeans.entrySet()) ctx.registerBeanDefinition(entry.getKey(), entry.getValue()); ctx.refresh(); ctx.registerShutdownHook(); return ctx; } private Map<String, BeanDefinition> getAdditionalBeans() { Map<String, BeanDefinition> additionalBeans = new HashMap<String, BeanDefinition>(); BeanDefinitionBuilder bundlePath = BeanDefinitionBuilder .genericBeanDefinition(GraphBundle.class); bundlePath.addPropertyValue("path", _graphPath); additionalBeans.put("graphBundle", bundlePath.getBeanDefinition()); BeanDefinitionBuilder graph = BeanDefinitionBuilder .genericBeanDefinition(SerializedGraphFactoryBean.class); graph.addPropertyReference("graphBundle", "graphBundle"); additionalBeans.put("graph", graph.getBeanDefinition()); return additionalBeans; } private Plan getJsonObjectAsPlan(JsonNode obj) throws ParseException { Plan plan = new Plan(); JsonNode from = obj.get("from"); plan.latFrom = from.get("lat").getValueAsDouble(); plan.lonFrom = from.get("lon").getValueAsDouble(); JsonNode to = obj.get("to"); plan.latTo = to.get("lat").getValueAsDouble(); plan.lonTo = to.get("lon").getValueAsDouble(); plan.time = DateLibrary.getIso8601StringAsDate(obj.get("time").getValueAsText()); return plan; } private static class Plan { public double latFrom; public double lonFrom; public double latTo; public double lonTo; public Date time; } }