From e4dca0030a5344567c1f739cf4ac2f38edff3be1 Mon Sep 17 00:00:00 2001 From: Marcel Rieser Date: Thu, 12 Oct 2023 10:46:24 +0200 Subject: [PATCH] delete contrib eventsBasedPTRouter Closes #2838 --- .github/workflows/verify-push.yaml | 1 - contribs/eventsBasedPTRouter/pom.xml | 11 - .../MultiDestinationDijkstra.java | 547 ------------------ .../MultiNodeDijkstra.java | 72 --- .../SerializableLinkTravelTimes.java | 49 -- .../TransitRouterEventsWLFactory.java | 61 -- .../TransitRouterEventsWSFactory.java | 71 --- .../TransitRouterEventsWSVFactory.java | 63 -- ...outerNetworkTravelTimeAndDisutilityWS.java | 144 ----- ...uterNetworkTravelTimeAndDisutilityWSV.java | 146 ----- ...outerNetworkTravelTimeAndDisutilityWW.java | 144 ----- .../TransitRouterNetworkWW.java | 479 --------------- .../TransitRouterVariableImpl.java | 243 -------- .../controler/RunControlerWS.java | 66 --- .../controler/RunControlerWSV.java | 77 --- .../controler/RunControlerWW.java | 56 -- .../stopStopTimes/StopStopTime.java | 14 - .../stopStopTimes/StopStopTimeCalculator.java | 20 - .../StopStopTimeCalculatorImpl.java | 153 ----- .../StopStopTimeCalculatorSerializable.java | 192 ------ .../StopStopTimeCalculatorTuple.java | 134 ----- .../stopStopTimes/StopStopTimeData.java | 13 - .../stopStopTimes/StopStopTimeDataArray.java | 49 -- .../StopStopTimePreCalcSerializable.java | 273 --------- .../vehicleOccupancy/VehicleOccupancy.java | 13 - .../VehicleOccupancyCalculator.java | 106 ---- .../VehicleOccupancyData.java | 9 - .../VehicleOccupancyDataArray.java | 42 -- .../waitTimes/WaitTime.java | 41 -- .../waitTimes/WaitTimeCalculator.java | 17 - .../waitTimes/WaitTimeCalculatorImpl.java | 181 ------ .../WaitTimeCalculatorSerializable.java | 216 ------- .../waitTimes/WaitTimeData.java | 39 -- .../waitTimes/WaitTimeDataArray.java | 67 --- .../waitTimes/WaitTimeStuckCalculator.java | 222 ------- .../MultiNodeDijkstraTest.java | 495 ---------------- contribs/pom.xml | 1 - 37 files changed, 4527 deletions(-) delete mode 100644 contribs/eventsBasedPTRouter/pom.xml delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/MultiDestinationDijkstra.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/MultiNodeDijkstra.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/SerializableLinkTravelTimes.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterEventsWLFactory.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterEventsWSFactory.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterEventsWSVFactory.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterNetworkTravelTimeAndDisutilityWS.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterNetworkTravelTimeAndDisutilityWSV.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterNetworkTravelTimeAndDisutilityWW.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterNetworkWW.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterVariableImpl.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/controler/RunControlerWS.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/controler/RunControlerWSV.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/controler/RunControlerWW.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTime.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeCalculator.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeCalculatorImpl.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeCalculatorSerializable.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeCalculatorTuple.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeData.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeDataArray.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimePreCalcSerializable.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/vehicleOccupancy/VehicleOccupancy.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/vehicleOccupancy/VehicleOccupancyCalculator.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/vehicleOccupancy/VehicleOccupancyData.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/vehicleOccupancy/VehicleOccupancyDataArray.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTime.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeCalculator.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeCalculatorImpl.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeCalculatorSerializable.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeData.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeDataArray.java delete mode 100644 contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeStuckCalculator.java delete mode 100644 contribs/eventsBasedPTRouter/src/test/java/org/matsim/contrib/eventsBasedPTRouter/MultiNodeDijkstraTest.java diff --git a/.github/workflows/verify-push.yaml b/.github/workflows/verify-push.yaml index 6c98df57073..f2a5b59d8ee 100644 --- a/.github/workflows/verify-push.yaml +++ b/.github/workflows/verify-push.yaml @@ -58,7 +58,6 @@ jobs: - contribs/railsim - contribs/roadpricing - contribs/analysis - - contribs/eventsBasedPTRouter - contribs/hybridsim - contribs/informed-mode-choice - contribs/otfvis diff --git a/contribs/eventsBasedPTRouter/pom.xml b/contribs/eventsBasedPTRouter/pom.xml deleted file mode 100644 index 6544fa91056..00000000000 --- a/contribs/eventsBasedPTRouter/pom.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - org.matsim - contrib - 16.0-SNAPSHOT - - 4.0.0 - org.matsim.contrib - events-based-pt-router - eventsBasedPTRouter - diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/MultiDestinationDijkstra.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/MultiDestinationDijkstra.java deleted file mode 100644 index 686ce4cebab..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/MultiDestinationDijkstra.java +++ /dev/null @@ -1,547 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * Dijkstra.java - * * - * *********************************************************************** * - * * - * copyright : (C) 2007 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.contrib.eventsBasedPTRouter; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.matsim.api.core.v01.Id; -import org.matsim.api.core.v01.network.Link; -import org.matsim.api.core.v01.network.Network; -import org.matsim.api.core.v01.network.Node; -import org.matsim.api.core.v01.population.Person; -import org.matsim.core.router.util.DijkstraNodeData; -import org.matsim.core.router.util.LeastCostPathCalculator.Path; -import org.matsim.core.router.util.PreProcessDijkstra; -import org.matsim.core.router.util.TravelTime; -import org.matsim.core.utils.collections.PseudoRemovePriorityQueue; -import org.matsim.core.utils.misc.Time; -import org.matsim.pt.router.TransitTravelDisutility; - - -/** - * Implementation of Dijkstra's - * shortest-path algorithm on a time-dependent network with arbitrary - * non-negative cost functions (e.g. negative link cost are not allowed). So - * 'shortest' in our context actually means 'least-cost'. - * - *

- * For every router, there exists a class which computes some preprocessing data - * and is passed to the router class constructor in order to accelerate the - * routing procedure. The one used for Dijkstra is - * {@link org.matsim.core.router.util.PreProcessDijkstra}. - *

- *
- * - *

Code example:

- *

- * PreProcessDijkstra preProcessData = new PreProcessDijkstra();
- * preProcessData.run(network);
- * TravelCost costFunction = ...
- * LeastCostPathCalculator routingAlgo = new Dijkstra(network, costFunction, preProcessData);
- * routingAlgo.calcLeastCostPath(fromNode, toNode, startTime);
- *

- *

- * If you don't want to preprocess the network, you can invoke Dijkstra as - * follows: - *

- *

- * LeastCostPathCalculator routingAlgo = new Dijkstra(network, costFunction); - *

- * - *

Important note

- * This class is NOT threadsafe! - * - * @see org.matsim.core.router.util.PreProcessDijkstra - * @see org.matsim.core.router.AStarEuclidean - * @see org.matsim.core.router.AStarLandmarks - * @author lnicolas - * @author mrieser - */ -public class MultiDestinationDijkstra { - - private final static Logger log = LogManager.getLogger(MultiDestinationDijkstra.class); - - /** - * The network on which we find routes. - */ - protected Network network; - - /** - * The cost calculator. Provides the cost for each link and time step. - */ - final TransitTravelDisutility costFunction; - - /** - * The travel time calculator. Provides the travel time for each link and time step. - */ - final TravelTime timeFunction; - - final Map, DijkstraNodeData> nodeData; - - /** - * Provides an unique id (loop number) for each routing request, so we don't - * have to reset all nodes at the beginning of each re-routing but can use the - * loop number instead. - */ - private int iterationID = Integer.MIN_VALUE + 1; - - /** - * Temporary field that is only used if dead ends are being pruned during - * routing and is updated each time a new route has to be calculated. - */ - private Set deadEndEntryNodes = new HashSet(); - - /** - * Determines whether we should mark nodes in dead ends during a - * pre-processing step so they won't be expanded during routing. - */ - /*package*/ final boolean pruneDeadEnds; - - /** - * Comparator that defines how to order the nodes in the pending nodes queue - * during routing. - */ - - private final PreProcessDijkstra preProcessData; - - - private String[] modeRestriction = null; - - private Person person = null; - - /** - * Default constructor. - * - * @param network - * The network on which to route. - * @param costFunction - * Determines the link cost defining the cheapest route. - * @param timeFunction - * Determines the travel time on links. - */ - public MultiDestinationDijkstra(final Network network, final TransitTravelDisutility costFunction, final TravelTime timeFunction) { - this(network, costFunction, timeFunction, null); - } - - /** - * Constructor. - * - * @param network - * The network on which to route. - * @param costFunction - * Determines the link cost defining the cheapest route. - * @param timeFunction - * Determines the travel time on each link. - * @param preProcessData - * The pre processing data used during the routing phase. - */ - public MultiDestinationDijkstra(final Network network, final TransitTravelDisutility costFunction, final TravelTime timeFunction, - final PreProcessDijkstra preProcessData) { - - this.network = network; - this.costFunction = costFunction; - this.timeFunction = timeFunction; - this.preProcessData = preProcessData; - - this.nodeData = new HashMap, DijkstraNodeData>((int)(network.getNodes().size() * 1.1), 0.95f); - - if (preProcessData != null) { - if (preProcessData.containsData() == false) { - this.pruneDeadEnds = false; - log.warn("The preprocessing data provided to router class Dijkstra contains no data! Please execute its run(...) method first!"); - log.warn("Running without dead-end pruning."); - } else { - this.pruneDeadEnds = true; - } - } else { - this.pruneDeadEnds = false; - } - } - - public void setModeRestriction(final Set modeRestriction) { - if (modeRestriction == null) { - this.modeRestriction = null; - } else { - this.modeRestriction = modeRestriction.toArray(new String[modeRestriction.size()]); - } - } - - /** - * Calculates the cheapest route from Node 'fromNode' to Node 'toNode' at - * starting time 'startTime'. - * - * @param fromNode - * The Node at which the route should start. - * @param toNode - * The Node at which the route should end. - * @param startTime - * The time at which the route should start. Note: Using - * {@link Time#UNDEFINED_TIME} does not imply "time is not relevant", - * rather, {@link Path#travelTime} will return {@link Double#NaN}. - * @see org.matsim.core.router.util.LeastCostPathCalculator#calcLeastCostPath(org.matsim.core.network.Node, - * org.matsim.core.network.Node, double) - */ - public Map, Path> calcLeastCostPath(final Node fromNode, final Set toNodes, final double startTime, final Person person) { - - Map, Double> arrivalTimes = new HashMap, Double>(); - boolean stillSearching = true; - int finishedNodes = 0; - augmentIterationId(); // this call makes the class not threadsafe - this.person = person; - - if (this.pruneDeadEnds == true) { - for(Node toNode:toNodes) - deadEndEntryNodes.add(getPreProcessData(toNode).getDeadEndEntryNode()); - } - - PseudoRemovePriorityQueue pendingNodes = new PseudoRemovePriorityQueue(500); - initFromNode(fromNode, startTime, pendingNodes); - - while (stillSearching) { - Node outNode = pendingNodes.poll(); - - if (outNode == null) { - log.warn("No route was found from node " + fromNode.getId() + " to all nodes: " + finishedNodes + " of " + toNodes.size()); - stillSearching = false; - } - else { - if (toNodes.contains(outNode)) { - DijkstraNodeData outData = getData(outNode); - arrivalTimes.put(outNode.getId(), outData.getTime()); - finishedNodes++; - } - relaxNode(outNode, pendingNodes); - if(finishedNodes==toNodes.size()) - stillSearching = false; - } - } - - // now construct and return the path - return constructPaths(fromNode, toNodes, startTime, arrivalTimes); - - } - - /** - * Constructs the path after the algorithm has been run. - * - * @param fromNode - * The node where the path starts. - * @param toNode - * The node where the path ends. - * @param startTime - * The time when the trip starts. - * @param preProcessData - * The time when the trip ends. - */ - protected Map, Path> constructPaths(Node fromNode, Set toNodes, double startTime, Map, Double> arrivalTimes) { - Map, Path> paths = new HashMap, Path>(); - for(Node toNode:toNodes) { - Double arrivalTime = arrivalTimes.get(toNode.getId()); - Path path = null; - if(arrivalTime != null) { - ArrayList nodes = new ArrayList(); - ArrayList links = new ArrayList(); - - nodes.add(0, toNode); - Link tmpLink = getData(toNode).getPrevLink(); - if (tmpLink != null) { - while (tmpLink.getFromNode() != fromNode) { - links.add(0, tmpLink); - nodes.add(0, tmpLink.getFromNode()); - tmpLink = getData(tmpLink.getFromNode()).getPrevLink(); - } - links.add(0, tmpLink); - nodes.add(0, tmpLink.getFromNode()); - } - - DijkstraNodeData toNodeData = getData(toNode); - path = new Path(nodes, links, arrivalTime - startTime, toNodeData.getCost()); - } - paths.put(toNode.getId(), path); - } - return paths; - } - - /** - * Initializes the first node of a route. - * - * @param fromNode - * The Node to be initialized. - * @param toNode - * The Node at which the route should end. - * @param startTime - * The time we start routing. - * @param pendingNodes - * The pending nodes so far. - */ - /*package*/ void initFromNode(final Node fromNode, final double startTime, - final PseudoRemovePriorityQueue pendingNodes) { - DijkstraNodeData data = getData(fromNode); - visitNode(fromNode, data, pendingNodes, startTime, 0, null); - } - - /** - * Expands the given Node in the routing algorithm; may be overridden in - * sub-classes. - * - * @param outNode - * The Node to be expanded. - * @param toNode - * The target Node of the route. - * @param pendingNodes - * The set of pending nodes so far. - */ - protected void relaxNode(final Node outNode, final PseudoRemovePriorityQueue pendingNodes) { - - DijkstraNodeData outData = getData(outNode); - double currTime = outData.getTime(); - double currCost = outData.getCost(); - if (this.pruneDeadEnds) { - PreProcessDijkstra.DeadEndData ddOutData = getPreProcessData(outNode); - - for (Link l : outNode.getOutLinks().values()) { - relaxNodeLogic(l, pendingNodes, currTime, currCost, ddOutData); - } - } else { // this.pruneDeadEnds == false - for (Link l : outNode.getOutLinks().values()) { - relaxNodeLogic(l, pendingNodes, currTime, currCost, null); - } - } - } - - /** - * Logic that was previously located in the relaxNode(...) method. - * By doing so, the FastDijkstra can overwrite relaxNode without copying the logic. - */ - /*package*/ void relaxNodeLogic(final Link l, final PseudoRemovePriorityQueue pendingNodes, - final double currTime, final double currCost, - final PreProcessDijkstra.DeadEndData ddOutData) { - if (this.pruneDeadEnds) { - if (canPassLink(l)) { - Node n = l.getToNode(); - PreProcessDijkstra.DeadEndData ddData = getPreProcessData(n); - /* IF the current node n is not in a dead end - * OR it is in the same dead end as the fromNode - * OR it is in the same dead end as the toNode - * THEN we add the current node to the pending nodes */ - if(ddData.getDeadEndEntryNode()==null || ddOutData.getDeadEndEntryNode()!=null) - addToPendingNodes(l, n, pendingNodes, currTime, currCost); - else { - TO_NODES: - for(Node deadEndEntryNode:deadEndEntryNodes) - if(deadEndEntryNode != null && deadEndEntryNode.getId() == ddData.getDeadEndEntryNode().getId()) { - addToPendingNodes(l, n, pendingNodes, currTime, currCost); - break TO_NODES; - } - } - } - } else { - if (canPassLink(l)) { - addToPendingNodes(l, l.getToNode(), pendingNodes, currTime, currCost); - } - } - } - - /** - * Adds some parameters to the given Node then adds it to the set of pending - * nodes. - * - * @param l - * The link from which we came to this Node. - * @param n - * The Node to add to the pending nodes. - * @param pendingNodes - * The set of pending nodes. - * @param currTime - * The time at which we started to traverse l. - * @param currCost - * The cost at the time we started to traverse l. - * @param toNode - * The target Node of the route. - * @return true if the node was added to the pending nodes, false otherwise - * (e.g. when the same node already has an earlier visiting time). - */ - protected boolean addToPendingNodes(final Link l, final Node n, - final PseudoRemovePriorityQueue pendingNodes, final double currTime, - final double currCost) { - - double travelTime = this.timeFunction.getLinkTravelTime(l, currTime, person, null); - double travelCost = this.costFunction.getLinkTravelDisutility(l, currTime, this.person, null, null); - DijkstraNodeData data = getData(n); - double nCost = data.getCost(); - if (!data.isVisited(getIterationId())) { - visitNode(n, data, pendingNodes, currTime + travelTime, currCost - + travelCost, l); - return true; - } - double totalCost = currCost + travelCost; - if (totalCost < nCost) { - revisitNode(n, data, pendingNodes, currTime + travelTime, totalCost, l); - return true; - } - - return false; - } - - /** - * @param link - * @return true if the link can be passed with respect to a possible mode restriction set - * - * @see #setModeRestriction(Set) - */ - protected boolean canPassLink(final Link link) { - if (this.modeRestriction == null) { - return true; - } - for (String mode : this.modeRestriction) { - if (link.getAllowedModes().contains(mode)) { - return true; - } - } - return false; - } - - /** - * Changes the position of the given Node n in the pendingNodes queue and - * updates its time and cost information. - * - * @param n - * The Node that is revisited. - * @param data - * The data for n. - * @param pendingNodes - * The nodes visited and not processed yet. - * @param time - * The time of the visit of n. - * @param cost - * The accumulated cost at the time of the visit of n. - * @param outLink - * The link from which we came visiting n. - */ - void revisitNode(final Node n, final DijkstraNodeData data, - final PseudoRemovePriorityQueue pendingNodes, final double time, final double cost, - final Link outLink) { - pendingNodes.remove(n); - - data.visit(outLink, cost, time, getIterationId()); - pendingNodes.add(n, getPriority(data)); - } - - /** - * Inserts the given Node n into the pendingNodes queue and updates its time - * and cost information. - * - * @param n - * The Node that is revisited. - * @param data - * The data for n. - * @param pendingNodes - * The nodes visited and not processed yet. - * @param time - * The time of the visit of n. - * @param cost - * The accumulated cost at the time of the visit of n. - * @param outLink - * The node from which we came visiting n. - */ - protected void visitNode(final Node n, final DijkstraNodeData data, - final PseudoRemovePriorityQueue pendingNodes, final double time, final double cost, - final Link outLink) { - data.visit(outLink, cost, time, getIterationId()); - pendingNodes.add(n, getPriority(data)); - } - - /** - * Augments the iterationID and checks whether the visited information in - * the nodes in the nodes have to be reset. - */ - protected void augmentIterationId() { - if (getIterationId() == Integer.MAX_VALUE) { - this.iterationID = Integer.MIN_VALUE + 1; - resetNetworkVisited(); - } else { - this.iterationID++; - } - } - - /** - * @return iterationID - */ - /*package*/ int getIterationId() { - return this.iterationID; - } - - /** - * Resets all nodes in the network as if they have not been visited yet. - */ - private void resetNetworkVisited() { - for (Node node : this.network.getNodes().values()) { - DijkstraNodeData data = getData(node); - data.resetVisited(); - } - } - - /** - * The value used to sort the pending nodes during routing. - * This implementation compares the total effective travel cost - * to sort the nodes in the pending nodes queue during routing. - */ - protected double getPriority(final DijkstraNodeData data) { - return data.getCost(); - } - - /** - * Returns the data for the given node. Creates a new NodeData if none exists - * yet. - * - * @param n - * The Node for which to return the data. - * @return The data for the given Node - */ - protected DijkstraNodeData getData(final Node n) { - DijkstraNodeData r = this.nodeData.get(n.getId()); - if (null == r) { - r = new DijkstraNodeData(); - this.nodeData.put(n.getId(), r); - } - return r; - } - - protected PreProcessDijkstra.DeadEndData getPreProcessData(final Node n) { - return this.preProcessData.getNodeData(n); - } - - protected final Person getPerson() { - return this.person; - } - - protected final void setPerson(final Person person) { - this.person = person; - } - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/MultiNodeDijkstra.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/MultiNodeDijkstra.java deleted file mode 100644 index 457d0e68bc3..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/MultiNodeDijkstra.java +++ /dev/null @@ -1,72 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * TransitDijkstra.java - * * - * *********************************************************************** * - * * - * copyright : (C) 2009 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.contrib.eventsBasedPTRouter; - -import java.util.HashMap; -import java.util.Map; -import org.matsim.api.core.v01.network.Network; -import org.matsim.api.core.v01.network.Node; -import org.matsim.api.core.v01.population.Person; -import org.matsim.core.router.InitialNode; -import org.matsim.core.router.util.LeastCostPathCalculator.Path; -import org.matsim.core.router.util.TravelTime; -import org.matsim.pt.router.TransitLeastCostPathTree; -import org.matsim.pt.router.TransitTravelDisutility; - -public class MultiNodeDijkstra /*extends Dijkstra*/ { - - /** - * The network on which we find routes. - */ - protected Network network; - - /** - * The cost calculator. Provides the cost for each link and time step. - */ - private final TransitTravelDisutility costFunction; - - /** - * The travel time calculator. Provides the travel time for each link and time step. - */ - private final TravelTime timeFunction; - - public MultiNodeDijkstra(final Network network, final TransitTravelDisutility costFunction, final TravelTime timeFunction) { - this.network = network; - this.costFunction = costFunction; - this.timeFunction = timeFunction; - } - - @SuppressWarnings("unchecked") - public Path calcLeastCostPath(final Map fromNodes, final Map toNodes, final Person person) { - Map swapedToNodes = swapNodes(toNodes); - TransitLeastCostPathTree tree = new TransitLeastCostPathTree(network, costFunction, timeFunction, swapNodes(fromNodes), swapedToNodes, person); - return tree.getPath(swapedToNodes); - } - - private Map swapNodes(final Map original) { - Map result = new HashMap<>(); - for (Map.Entry entry : original.entrySet()) { - result.put(entry.getKey(), new InitialNode(entry.getValue().initialCost, entry.getValue().initialTime)); - } - return result; - } - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/SerializableLinkTravelTimes.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/SerializableLinkTravelTimes.java deleted file mode 100644 index 2ca3400149b..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/SerializableLinkTravelTimes.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.matsim.contrib.eventsBasedPTRouter; - -import java.io.Serializable; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import org.matsim.api.core.v01.network.Link; -import org.matsim.api.core.v01.population.Person; -import org.matsim.core.router.util.TravelTime; -import org.matsim.vehicles.Vehicle; - -public class SerializableLinkTravelTimes implements Serializable, TravelTime { - - private final double[][] times; - private final Map indices = new HashMap<>(); - private final int travelTimeBinSize; - - public SerializableLinkTravelTimes(TravelTime linkTravelTimes, - int traveltimeBinSize, double endTime, - Collection links) { - this.travelTimeBinSize = traveltimeBinSize; - endTime = endTime <= 0 ? 86400 : endTime; - times = new double[links.size()][(int) (endTime / traveltimeBinSize)]; - Iterator iterator = links.iterator(); - for (int i = 0; i < times.length; i++) { - Link link = iterator.next(); - indices.put(link.getId().toString(), i); - for (int j = 0; j < times[i].length; j++) - times[i][j] = linkTravelTimes.getLinkTravelTime(link, - traveltimeBinSize * j, null, null); - } - } - - @Override - public double getLinkTravelTime(Link link, double time, Person person, - Vehicle vehicle) { - time = time % 86400; - try { - return times[indices.get(link.getId().toString())][(int) (time / travelTimeBinSize)]; - } catch (ArrayIndexOutOfBoundsException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return time; - } - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterEventsWLFactory.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterEventsWLFactory.java deleted file mode 100644 index f163879e763..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterEventsWLFactory.java +++ /dev/null @@ -1,61 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * * - * *********************************************************************** * - * * - * copyright : (C) 2012 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.contrib.eventsBasedPTRouter; - -import org.matsim.api.core.v01.network.Network; -import org.matsim.contrib.eventsBasedPTRouter.waitTimes.WaitTime; -import org.matsim.core.controler.MatsimServices; -import org.matsim.pt.router.PreparedTransitSchedule; -import org.matsim.pt.router.TransitRouter; -import org.matsim.pt.router.TransitRouterConfig; - -import jakarta.inject.Provider; -import jakarta.inject.Singleton; - - -/** - * Factory for the variable transit router - * - * @author sergioo - */ -@Singleton -public class TransitRouterEventsWLFactory implements Provider { - - private final TransitRouterConfig config; - private final TransitRouterNetworkWW routerNetwork; - private final Network network; - private MatsimServices controler; - private final WaitTime waitTime; - - public TransitRouterEventsWLFactory(final MatsimServices controler, final WaitTime waitTime) { - this.config = new TransitRouterConfig(controler.getScenario().getConfig().planCalcScore(), - controler.getScenario().getConfig().plansCalcRoute(), controler.getScenario().getConfig().transitRouter(), - controler.getScenario().getConfig().vspExperimental()); - this.network = controler.getScenario().getNetwork(); - this.controler = controler; - this.waitTime = waitTime; - routerNetwork = TransitRouterNetworkWW.createFromSchedule(network, controler.getScenario().getTransitSchedule(), this.config.getBeelineWalkConnectionDistance()); - } - @Override - public TransitRouter get() { - return new TransitRouterVariableImpl(config, new TransitRouterNetworkTravelTimeAndDisutilityWW(config, network, routerNetwork, controler.getLinkTravelTimes(), waitTime, controler.getConfig().travelTimeCalculator(), controler.getConfig().qsim(), new PreparedTransitSchedule(controler.getScenario().getTransitSchedule())), routerNetwork); - } - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterEventsWSFactory.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterEventsWSFactory.java deleted file mode 100644 index 51a71883525..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterEventsWSFactory.java +++ /dev/null @@ -1,71 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * * - * *********************************************************************** * - * * - * copyright : (C) 2012 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.contrib.eventsBasedPTRouter; - -import com.google.inject.Inject; -import org.matsim.api.core.v01.Scenario; -import org.matsim.contrib.eventsBasedPTRouter.stopStopTimes.StopStopTime; -import org.matsim.contrib.eventsBasedPTRouter.waitTimes.WaitTime; -import org.matsim.pt.router.PreparedTransitSchedule; -import org.matsim.pt.router.TransitRouter; -import org.matsim.pt.router.TransitRouterConfig; - -import jakarta.inject.Provider; -import jakarta.inject.Singleton; - -/** - * Factory for the variable transit router - * - * @author sergioo - */ -@Singleton -public class TransitRouterEventsWSFactory implements Provider { - - private final TransitRouterConfig config; - private final TransitRouterNetworkWW routerNetwork; - private final Scenario scenario; - private WaitTime waitTime; - - public void setStopStopTime(StopStopTime stopStopTime) { - this.stopStopTime = stopStopTime; - } - - public void setWaitTime(WaitTime waitTime) { - this.waitTime = waitTime; - } - - private StopStopTime stopStopTime; - - @Inject - public TransitRouterEventsWSFactory(final Scenario scenario, final WaitTime waitTime, final StopStopTime stopStopTime) { - this.config = new TransitRouterConfig(scenario.getConfig().planCalcScore(), - scenario.getConfig().plansCalcRoute(), scenario.getConfig().transitRouter(), - scenario.getConfig().vspExperimental()); - routerNetwork = TransitRouterNetworkWW.createFromSchedule(scenario.getNetwork(), scenario.getTransitSchedule(), this.config.getBeelineWalkConnectionDistance()); - this.scenario = scenario; - this.waitTime = waitTime; - this.stopStopTime = stopStopTime; - } - @Override - public TransitRouter get() { - return new TransitRouterVariableImpl(config, new TransitRouterNetworkTravelTimeAndDisutilityWS(config, routerNetwork, waitTime, stopStopTime, scenario.getConfig().travelTimeCalculator(), scenario.getConfig().qsim(), new PreparedTransitSchedule(scenario.getTransitSchedule())), routerNetwork); - } - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterEventsWSVFactory.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterEventsWSVFactory.java deleted file mode 100644 index d3c398de718..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterEventsWSVFactory.java +++ /dev/null @@ -1,63 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * * - * *********************************************************************** * - * * - * copyright : (C) 2012 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.contrib.eventsBasedPTRouter; - -import org.matsim.api.core.v01.Scenario; -import org.matsim.contrib.eventsBasedPTRouter.stopStopTimes.StopStopTime; -import org.matsim.contrib.eventsBasedPTRouter.vehicleOccupancy.VehicleOccupancy; -import org.matsim.contrib.eventsBasedPTRouter.waitTimes.WaitTime; -import org.matsim.pt.router.PreparedTransitSchedule; -import org.matsim.pt.router.TransitRouter; -import org.matsim.pt.router.TransitRouterConfig; - -import jakarta.inject.Provider; -import jakarta.inject.Singleton; - -/** - * Factory for the variable transit router - * - * @author sergioo - */ -@Singleton -public class TransitRouterEventsWSVFactory implements Provider { - - private final TransitRouterConfig config; - private final TransitRouterNetworkWW routerNetwork; - private final Scenario scenario; - private final WaitTime waitTime; - private final StopStopTime stopStopTime; - private final VehicleOccupancy vehicleOccupancy; - - public TransitRouterEventsWSVFactory(final Scenario scenario, final WaitTime waitTime, final StopStopTime stopStopTime, final VehicleOccupancy vehicleOccupancy) { - this.config = new TransitRouterConfig(scenario.getConfig().planCalcScore(), - scenario.getConfig().plansCalcRoute(), scenario.getConfig().transitRouter(), - scenario.getConfig().vspExperimental()); - routerNetwork = TransitRouterNetworkWW.createFromSchedule(scenario.getNetwork(), scenario.getTransitSchedule(), this.config.getBeelineWalkConnectionDistance()); - this.scenario = scenario; - this.waitTime = waitTime; - this.stopStopTime = stopStopTime; - this.vehicleOccupancy = vehicleOccupancy; - } - @Override - public TransitRouter get() { - return new TransitRouterVariableImpl(config, new TransitRouterNetworkTravelTimeAndDisutilityWSV(config, routerNetwork, waitTime, stopStopTime, vehicleOccupancy, scenario.getConfig().travelTimeCalculator(), scenario.getConfig().qsim(), new PreparedTransitSchedule(scenario.getTransitSchedule())), routerNetwork); - } - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterNetworkTravelTimeAndDisutilityWS.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterNetworkTravelTimeAndDisutilityWS.java deleted file mode 100644 index 2c2b68c17a7..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterNetworkTravelTimeAndDisutilityWS.java +++ /dev/null @@ -1,144 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * TransitRouterNetworkTravelTimeAndDisutilityVariableWW.java - * * - * *********************************************************************** * - * * - * copyright : (C) 2012 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.contrib.eventsBasedPTRouter; - -import java.util.HashMap; -import java.util.Map; - -import org.matsim.api.core.v01.Id; -import org.matsim.api.core.v01.network.Link; -import org.matsim.api.core.v01.population.Person; -import org.matsim.contrib.eventsBasedPTRouter.stopStopTimes.StopStopTime; -import org.matsim.contrib.eventsBasedPTRouter.waitTimes.WaitTime; -import org.matsim.core.config.groups.QSimConfigGroup; -import org.matsim.core.config.groups.TravelTimeCalculatorConfigGroup; -import org.matsim.core.router.util.TravelDisutility; -import org.matsim.pt.router.CustomDataManager; -import org.matsim.pt.router.PreparedTransitSchedule; -import org.matsim.pt.router.TransitRouterConfig; -import org.matsim.pt.router.TransitRouterNetworkTravelTimeAndDisutility; -import org.matsim.vehicles.Vehicle; - -import com.google.inject.Provider; - -/** - * TravelTime and TravelDisutility calculator to be used with the transit network used for transit routing. - * This version considers waiting time at stops, and takes travel time between stops from a {@link StopStopTime} object. - * - * @author sergioo - */ -public class TransitRouterNetworkTravelTimeAndDisutilityWS extends TransitRouterNetworkTravelTimeAndDisutility implements TravelDisutility { - - private Link previousLink; - private double previousTime; - private double cachedLinkTime; - private final Map, double[]> linkTravelTimes = new HashMap, double[]>(); - private final Map, double[]> linkWaitingTimes = new HashMap, double[]>(); - private final int numSlots; - private final double timeSlot; - - public TransitRouterNetworkTravelTimeAndDisutilityWS(final TransitRouterConfig config, TransitRouterNetworkWW routerNetwork, Provider waitTime, Provider stopStopTime, TravelTimeCalculatorConfigGroup tTConfigGroup, QSimConfigGroup qSimConfigGroup, PreparedTransitSchedule preparedTransitSchedule) { - this(config, routerNetwork, waitTime.get(), stopStopTime.get(), tTConfigGroup, qSimConfigGroup.getStartTime().seconds(), qSimConfigGroup.getEndTime().seconds(), preparedTransitSchedule); - } - - public TransitRouterNetworkTravelTimeAndDisutilityWS(final TransitRouterConfig config, TransitRouterNetworkWW routerNetwork, WaitTime waitTime, StopStopTime stopStopTime, TravelTimeCalculatorConfigGroup tTConfigGroup, QSimConfigGroup qSimConfigGroup, PreparedTransitSchedule preparedTransitSchedule) { - this(config, routerNetwork, waitTime, stopStopTime, tTConfigGroup, qSimConfigGroup.getStartTime().seconds(), qSimConfigGroup.getEndTime().seconds(), preparedTransitSchedule); - } - public TransitRouterNetworkTravelTimeAndDisutilityWS(final TransitRouterConfig config, TransitRouterNetworkWW routerNetwork, WaitTime waitTime, StopStopTime stopStopTime, TravelTimeCalculatorConfigGroup tTConfigGroup, double startTime, double endTime, PreparedTransitSchedule preparedTransitSchedule) { - super(config, preparedTransitSchedule); - timeSlot = tTConfigGroup.getTraveltimeBinSize(); - numSlots = (int) ((endTime-startTime)/timeSlot); - for(TransitRouterNetworkWW.TransitRouterNetworkLink link:routerNetwork.getLinks().values()) - if(link.route!=null) { - double[] times = new double[numSlots]; - for(int slot = 0; slot, double[]> linkTravelTimes = new HashMap, double[]>(); - private final Map, double[]> linkWaitingTimes = new HashMap, double[]>(); - private final Map, double[]> linkVehicleOccupancy = new HashMap, double[]>(); - private final int numSlots; - private final double timeSlot; - - public TransitRouterNetworkTravelTimeAndDisutilityWSV(final TransitRouterConfig config, TransitRouterNetworkWW routerNetwork, WaitTime waitTime, StopStopTime stopStopTime, VehicleOccupancy vehicleOccupancy, TravelTimeCalculatorConfigGroup tTConfigGroup, QSimConfigGroup qSimConfigGroup, PreparedTransitSchedule preparedTransitSchedule) { - this(config, routerNetwork, waitTime, stopStopTime, vehicleOccupancy, tTConfigGroup, qSimConfigGroup.getStartTime().seconds(), qSimConfigGroup.getEndTime().seconds(), preparedTransitSchedule); - } - public TransitRouterNetworkTravelTimeAndDisutilityWSV(final TransitRouterConfig config, TransitRouterNetworkWW routerNetwork, WaitTime waitTime, StopStopTime stopStopTime, VehicleOccupancy vehicleOccupancy, TravelTimeCalculatorConfigGroup tTConfigGroup, double startTime, double endTime, PreparedTransitSchedule preparedTransitSchedule) { - super(config, preparedTransitSchedule); - timeSlot = tTConfigGroup.getTraveltimeBinSize(); - numSlots = (int) ((endTime-startTime)/timeSlot); - for(TransitRouterNetworkWW.TransitRouterNetworkLink link:routerNetwork.getLinks().values()) - if(link.route!=null) { - double[] times = new double[numSlots]; - double[] occs = new double[numSlots]; - for(int slot = 0; slotSIT_PERCENTAGE?NO_SIT_FACTOR:1 - - link.getLength() * this.config.getMarginalUtilityOfTravelDistancePt_utl_m(); - else if (wrapped.toNode.route!=null) - // it's a wait link - return -(cachedTravelDisutility?cachedTravelTime:linkWaitingTimes.get(wrapped.getId())[time/timeSlotSIT_PERCENTAGE?NO_SIT_FACTOR:1 - - link.getLength() * this.config.getMarginalUtilityOfTravelDistancePt_utl_m(); - else if (wrapped.toNode.route!=null) - // it's a wait link - return - linkWaitingTimes.get(wrapped.getId())[time/timeSlot, double[]> linkTravelTimes = new HashMap, double[]>(); - private final Map, double[]> linkWaitingTimes = new HashMap, double[]>(); - private final double timeSlot; - private final int numSlots; - private Link previousLink; - private double previousTime; - private double cachedTravelTime; - - public TransitRouterNetworkTravelTimeAndDisutilityWW(final TransitRouterConfig config, Network network, TransitRouterNetworkWW routerNetwork, TravelTime travelTime, WaitTime waitTime, TravelTimeCalculatorConfigGroup tTConfigGroup, QSimConfigGroup qSimConfigGroup, PreparedTransitSchedule preparedTransitSchedule) { - this(config, network, routerNetwork, travelTime, waitTime, tTConfigGroup, qSimConfigGroup.getStartTime().seconds(), qSimConfigGroup.getEndTime().seconds(), preparedTransitSchedule); - } - public TransitRouterNetworkTravelTimeAndDisutilityWW(final TransitRouterConfig config, Network network, TransitRouterNetworkWW routerNetwork, TravelTime travelTime, WaitTime waitTime, TravelTimeCalculatorConfigGroup tTConfigGroup, double startTime, double endTime, PreparedTransitSchedule preparedTransitSchedule) { - super(config, preparedTransitSchedule); - timeSlot = tTConfigGroup.getTraveltimeBinSize(); - numSlots = (int) ((endTime-startTime)/timeSlot); - for(TransitRouterNetworkWW.TransitRouterNetworkLink link:routerNetwork.getLinks().values()) - if(link.route!=null) { - double[] times = new double[numSlots]; - for(int slot = 0; slot linkId:link.route.getRoute().getSubRoute(link.fromNode.stop.getStopFacility().getLinkId(), link.toNode.stop.getStopFacility().getLinkId()).getLinkIds()) - linksTime += travelTime.getLinkTravelTime(network.getLinks().get(linkId), startTime+slot*timeSlot, null, null); - times[slot] = linksTime; - } - linkTravelTimes.put(link.getId(), times); - } - else if(link.toNode.route!=null) { - double[] times = new double[numSlots]; - for(int slot = 0; slot, TransitRouterNetworkLink> links = new LinkedHashMap<>(); - private final Map, TransitRouterNetworkNode> nodes = new LinkedHashMap<>(); - protected QuadTree qtNodes = null; - - private long nextNodeId = 0; - protected long nextLinkId = 0; - - public static final class TransitRouterNetworkNode implements Node { - - public final TransitRouteStop stop; - public final TransitRoute route; - public final TransitLine line; - final Id id; - final Map, TransitRouterNetworkLink> ingoingLinks = new LinkedHashMap<>(); - final Map, TransitRouterNetworkLink> outgoingLinks = new LinkedHashMap<>(); - - public TransitRouterNetworkNode(final Id id, final TransitRouteStop stop, final TransitRoute route, final TransitLine line) { - this.id = id; - this.stop = stop; - this.route = route; - this.line = line; - } - - @Override - public Map, ? extends Link> getInLinks() { - return this.ingoingLinks; - } - - @Override - public Map, ? extends Link> getOutLinks() { - return this.outgoingLinks; - } - - @Override - public boolean addInLink(final Link link) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean addOutLink(final Link link) { - throw new UnsupportedOperationException(); - } - - @Override - public Coord getCoord() { - return this.stop.getStopFacility().getCoord(); - } - - @Override - public Id getId() { - return this.id; - } - - public TransitRouteStop getStop() { - return stop; - } - - public TransitRoute getRoute() { - return route; - } - - public TransitLine getLine() { - return line; - } - - @Override - public Link removeInLink(Id linkId) { - throw new RuntimeException("not implemented") ; - } - - @Override - public Link removeOutLink(Id outLinkId) { - throw new RuntimeException("not implemented") ; - } - - @Override - public void setCoord(Coord coord) { - throw new RuntimeException("not implemented") ; - } - - @Override - public Attributes getAttributes() { - throw new UnsupportedOperationException(); - } - } - - /** - * Looks to me like an implementation of the Link interface, with get(Transit)Route and get(Transit)Line on top. - * To recall: TransitLine is something like M44. But it can have more than one route, e.g. going north, going south, - * long route, short route. That is, presumably we have one such TransitRouterNetworkLink per TransitRoute. kai/manuel, feb'12 - */ - public static final class TransitRouterNetworkLink implements Link { - - final TransitRouterNetworkNode fromNode; - final TransitRouterNetworkNode toNode; - final TransitRoute route; - final TransitLine line; - final Id id; - private double length; - - public TransitRouterNetworkLink(final Id id, final TransitRouterNetworkNode fromNode, final TransitRouterNetworkNode toNode, final TransitRoute route, final TransitLine line, Network network) { - this.id = id; - this.fromNode = fromNode; - this.toNode = toNode; - this.route = route; - this.line = line; - if(route==null) - this.length = CoordUtils.calcEuclideanDistance(this.toNode.stop.getStopFacility().getCoord(), this.fromNode.stop.getStopFacility().getCoord()); - else { - this.length = 0; - for(Id linkId:route.getRoute().getSubRoute(fromNode.stop.getStopFacility().getLinkId(), toNode.stop.getStopFacility().getLinkId()).getLinkIds()) - this.length += network.getLinks().get(linkId).getLength(); - this.length += network.getLinks().get(toNode.stop.getStopFacility().getLinkId()).getLength(); - } - } - - @Override - public TransitRouterNetworkNode getFromNode() { - return this.fromNode; - } - - @Override - public TransitRouterNetworkNode getToNode() { - return this.toNode; - } - - @Override - public double getCapacity() { - return 9999; - } - - @Override - public double getCapacity(final double time) { - return getCapacity(); - } - - @Override - public double getFreespeed() { - return 10; - } - - @Override - public double getFreespeed(final double time) { - return getFreespeed(); - } - - @Override - public Id getId() { - return this.id; - } - - @Override - public double getNumberOfLanes() { - return 1; - } - - @Override - public double getNumberOfLanes(final double time) { - return getNumberOfLanes(); - } - - @Override - public double getLength() { - return this.length; - } - - @Override - public void setCapacity(final double capacity) { - throw new UnsupportedOperationException(); - } - - @Override - public void setFreespeed(final double freespeed) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean setFromNode(final Node node) { - throw new UnsupportedOperationException(); - } - - @Override - public void setNumberOfLanes(final double lanes) { - throw new UnsupportedOperationException(); - } - - @Override - public void setLength(final double length) { - this.length = length; - } - - @Override - public boolean setToNode(final Node node) { - throw new UnsupportedOperationException(); - } - - @Override - public Coord getCoord() { - throw new UnsupportedOperationException(); - } - - @Override - public Set getAllowedModes() { - return null; - } - - @Override - public void setAllowedModes(final Set modes) { - throw new UnsupportedOperationException(); - } - - public TransitRoute getRoute() { - return route; - } - - public TransitLine getLine() { - return line; - } - - @Override - public double getCapacityPeriod() { - throw new UnsupportedOperationException(); - } - - @Override - public Attributes getAttributes() { - throw new UnsupportedOperationException(); - } - } - public TransitRouterNetworkNode createNode(final TransitRouteStop stop, final TransitRoute route, final TransitLine line) { - Id id = null; - if(line==null && route==null) - id = Id.createNodeId(stop.getStopFacility().getId().toString()); - else - id = Id.createNodeId("number:"+nextNodeId++); - final TransitRouterNetworkNode node = new TransitRouterNetworkNode(id, stop, route, line); - if(this.nodes.get(node.getId())!=null) - throw new RuntimeException(); - this.nodes.put(node.getId(), node); - return node; - } - - public TransitRouterNetworkLink createLink(final Network network, final TransitRouterNetworkNode fromNode, final TransitRouterNetworkNode toNode) { - final TransitRouterNetworkLink link = new TransitRouterNetworkLink(Id.createLinkId(this.nextLinkId++), fromNode, toNode, null, null, network); - this.links.put(link.getId(), link); - fromNode.outgoingLinks.put(link.getId(), link); - toNode.ingoingLinks.put(link.getId(), link); - return link; - } - public TransitRouterNetworkLink createLink(final Network network, final TransitRouterNetworkNode fromNode, final TransitRouterNetworkNode toNode, final TransitRoute route, final TransitLine line) { - final TransitRouterNetworkLink link = new TransitRouterNetworkLink(Id.createLinkId(this.nextLinkId++), fromNode, toNode, route, line, network); - this.getLinks().put(link.getId(), link); - fromNode.outgoingLinks.put(link.getId(), link); - toNode.ingoingLinks.put(link.getId(), link); - return link; - } - @Override - public Map, TransitRouterNetworkNode> getNodes() { - return this.nodes; - } - @Override - public Map, TransitRouterNetworkLink> getLinks() { - return this.links; - } - public void finishInit() { - double minX = Double.POSITIVE_INFINITY; - double minY = Double.POSITIVE_INFINITY; - double maxX = Double.NEGATIVE_INFINITY; - double maxY = Double.NEGATIVE_INFINITY; - for (TransitRouterNetworkNode node : getNodes().values()) - if(node.line == null) { - Coord c = node.stop.getStopFacility().getCoord(); - if (c.getX() < minX) - minX = c.getX(); - if (c.getY() < minY) - minY = c.getY(); - if (c.getX() > maxX) - maxX = c.getX(); - if (c.getY() > maxY) - maxY = c.getY(); - } - QuadTree quadTree = new QuadTree(minX, minY, maxX, maxY); - for (TransitRouterNetworkNode node : getNodes().values()) { - if(node.line == null) { - Coord c = node.stop.getStopFacility().getCoord(); - quadTree.put(c.getX(), c.getY(), node); - } - } - this.qtNodes = quadTree; - } - public static TransitRouterNetworkWW createFromSchedule(final Network network, final TransitSchedule schedule, final double maxBeelineWalkConnectionDistance) { - log.info("start creating transit network"); - final TransitRouterNetworkWW transitNetwork = new TransitRouterNetworkWW(); - final Counter linkCounter = new Counter(" link #"); - final Counter nodeCounter = new Counter(" node #"); - int numTravelLinks = 0, numWaitingLinks = 0, numInsideLinks = 0, numTransferLinks = 0; - Map, TransitRouterNetworkNode> stops = new HashMap, TransitRouterNetworkNode>(); - TransitRouterNetworkNode nodeSR, nodeS; - // build stop nodes - for (TransitLine line : schedule.getTransitLines().values()) - for (TransitRoute route : line.getRoutes().values()) - for (TransitRouteStop stop : route.getStops()) { - nodeS = stops.get(stop.getStopFacility().getId()); - if(nodeS == null) { - nodeS = transitNetwork.createNode(stop, null, null); - nodeCounter.incCounter(); - stops.put(stop.getStopFacility().getId(), nodeS); - } - } - transitNetwork.finishInit(); - // build transfer links - log.info("add transfer links"); - // connect all stops with walking links if they're located less than beelineWalkConnectionDistance from each other - for (TransitRouterNetworkNode node : transitNetwork.getNodes().values()) - for (TransitRouterNetworkNode node2 : transitNetwork.getNearestNodes(node.stop.getStopFacility().getCoord(), maxBeelineWalkConnectionDistance)) - if (node!=node2) { - transitNetwork.createLink(network, node, node2); - linkCounter.incCounter(); - numTransferLinks++; - } - // build nodes and links connecting the nodes according to the transit routes - log.info("add travel, waiting and inside links"); - for (TransitLine line : schedule.getTransitLines().values()) - for (TransitRoute route : line.getRoutes().values()) { - TransitRouterNetworkNode prevNode = null; - for (TransitRouteStop stop : route.getStops()) { - nodeS = stops.get(stop.getStopFacility().getId()); - nodeSR = transitNetwork.createNode(stop, route, line); - nodeCounter.incCounter(); - if (prevNode != null) { - transitNetwork.createLink(network, prevNode, nodeSR, route, line); - linkCounter.incCounter(); - numTravelLinks++; - } - prevNode = nodeSR; - transitNetwork.createLink(network, nodeS, nodeSR); - linkCounter.incCounter(); - numWaitingLinks++; - transitNetwork.createLink(network, nodeSR, nodeS); - linkCounter.incCounter(); - numInsideLinks++; - } - } - log.info("transit router network statistics:"); - log.info(" # nodes: " + transitNetwork.getNodes().size()); - log.info(" # links total: " + transitNetwork.getLinks().size()); - log.info(" # travel links: " + numTravelLinks); - log.info(" # waiting links: " + numWaitingLinks); - log.info(" # inside links: " + numInsideLinks); - log.info(" # transfer links: " + numTransferLinks); - return transitNetwork; - } - public Collection getNearestNodes(final Coord coord, final double distance) { - return this.qtNodes.getDisk(coord.getX(), coord.getY(), distance); - } - - public TransitRouterNetworkNode getNearestNode(final Coord coord) { - return this.qtNodes.getClosest(coord.getX(), coord.getY()); - } - - @Override - public double getCapacityPeriod() { - return 3600.0; - } - - @Override - public NetworkFactory getFactory() { - return null; - } - - @Override - public double getEffectiveLaneWidth() { - return 3; - } - - @Override - public void addNode(Node nn) { - throw new UnsupportedOperationException(); - } - - @Override - public void addLink(Link ll) { - throw new UnsupportedOperationException(); - } - - @Override - public Link removeLink(Id linkId) { - throw new UnsupportedOperationException(); - } - - @Override - public Node removeNode(Id nodeId) { - throw new UnsupportedOperationException(); - } - - @Override - public void setCapacityPeriod(double capPeriod) { - throw new RuntimeException("not implemented") ; - } - - @Override - public void setEffectiveCellSize(double effectiveCellSize) { - throw new RuntimeException("not implemented") ; - } - - @Override - public void setEffectiveLaneWidth(double effectiveLaneWidth) { - throw new RuntimeException("not implemented") ; - } - - @Override - public void setName(String name) { - throw new RuntimeException("not implemented") ; - } - - @Override - public String getName() { - throw new RuntimeException("not implemented") ; - } - - @Override - public double getEffectiveCellSize() { - throw new RuntimeException("not implemented") ; - } - - @Override - public Attributes getAttributes() { - throw new UnsupportedOperationException(); - } -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterVariableImpl.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterVariableImpl.java deleted file mode 100644 index 3c867f3240b..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/TransitRouterVariableImpl.java +++ /dev/null @@ -1,243 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * TranitRouterVariableImpl.java - * * - * *********************************************************************** * - * * - * copyright : (C) 2009 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.contrib.eventsBasedPTRouter; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.matsim.api.core.v01.Coord; -import org.matsim.api.core.v01.Id; -import org.matsim.api.core.v01.TransportMode; -import org.matsim.api.core.v01.network.Link; -import org.matsim.api.core.v01.network.Node; -import org.matsim.api.core.v01.population.Leg; -import org.matsim.api.core.v01.population.Person; -import org.matsim.api.core.v01.population.Route; -import org.matsim.core.population.PopulationUtils; -import org.matsim.core.population.routes.RouteUtils; -import org.matsim.core.router.InitialNode; -import org.matsim.core.router.RoutingRequest; -import org.matsim.core.router.TripStructureUtils; -import org.matsim.core.router.util.LeastCostPathCalculator.Path; -import org.matsim.core.router.util.PreProcessDijkstra; -import org.matsim.core.utils.geometry.CoordUtils; -import org.matsim.facilities.Facility; -import org.matsim.pt.router.TransitRouter; -import org.matsim.pt.router.TransitRouterConfig; -import org.matsim.pt.router.TransitRouterNetworkTravelTimeAndDisutility; -import org.matsim.pt.routes.DefaultTransitPassengerRoute; -import org.matsim.pt.routes.TransitPassengerRoute; -import org.matsim.pt.transitSchedule.api.TransitRouteStop; - -public class TransitRouterVariableImpl implements TransitRouter { - - private final TransitRouterNetworkWW transitNetwork; - - private final MultiNodeDijkstra dijkstra; - private final MultiDestinationDijkstra mDijkstra; - private final TransitRouterConfig config; - private final TransitRouterNetworkTravelTimeAndDisutility ttCalculator; - - public TransitRouterVariableImpl(final TransitRouterConfig config, final TransitRouterNetworkTravelTimeAndDisutility ttCalculator, final TransitRouterNetworkWW routerNetwork) { - this.config = config; - this.transitNetwork = routerNetwork; - this.ttCalculator = ttCalculator; - this.dijkstra = new MultiNodeDijkstra(this.transitNetwork, this.ttCalculator, this.ttCalculator); - PreProcessDijkstra preProcessDijkstra = new PreProcessDijkstra(); - preProcessDijkstra.run(routerNetwork); - mDijkstra = new MultiDestinationDijkstra(routerNetwork, this.ttCalculator, this.ttCalculator, preProcessDijkstra); - } - - private Map locateWrappedNearestTransitNodes(Person person, Coord coord, double departureTime){ - Collection nearestNodes = this.transitNetwork.getNearestNodes(coord, this.config.getSearchRadius()); - if (nearestNodes.size() < 2) { - // also enlarge search area if only one stop found, maybe a second one is near the border of the search area - TransitRouterNetworkWW.TransitRouterNetworkNode nearestNode = this.transitNetwork.getNearestNode(coord); - double distance = CoordUtils.calcEuclideanDistance(coord, nearestNode.stop.getStopFacility().getCoord()); - nearestNodes = this.transitNetwork.getNearestNodes(coord, distance + this.config.getExtensionRadius()); - } - Map wrappedNearestNodes = new LinkedHashMap(); - for (TransitRouterNetworkWW.TransitRouterNetworkNode node : nearestNodes) { - Coord toCoord = node.stop.getStopFacility().getCoord(); - double initialTime = getWalkTime(person, coord, toCoord); - double initialCost = getWalkDisutility(person, coord, toCoord); - wrappedNearestNodes.put(node, new InitialNode(initialCost, initialTime + departureTime)); - } - return wrappedNearestNodes; - } - - private double getWalkTime(Person person, Coord coord, Coord toCoord) { - return this.ttCalculator.getWalkTravelTime(person, coord, toCoord); - } - - private double getWalkDisutility(Person person, Coord coord, Coord toCoord) { - return this.ttCalculator.getWalkTravelDisutility(person, coord, toCoord); - } - - public Map, Path> calcPathRoutes(final Id fromNodeId, final Set> toNodeIds, final double startTime, final Person person) { - Set toNodes = new HashSet<>(); - for(Id toNode:toNodeIds) - if(transitNetwork.getNodes().get(toNode)!=null) - toNodes.add(transitNetwork.getNodes().get(toNode)); - Node node = transitNetwork.getNodes().get(fromNodeId); - if(node!=null) - return mDijkstra.calcLeastCostPath(node, toNodes, startTime, person); - else - return new HashMap<>(); - } - @Override - public List calcRoute(RoutingRequest request) { - final Facility fromFacility = request.getFromFacility(); - final Facility toFacility = request.getToFacility(); - final double departureTime = request.getDepartureTime(); - final Person person = request.getPerson(); - - // find possible start stops - Map wrappedFromNodes = this.locateWrappedNearestTransitNodes(person, fromFacility.getCoord(), departureTime); - // find possible end stops - Map wrappedToNodes = this.locateWrappedNearestTransitNodes(person, toFacility.getCoord(), departureTime); - - // find routes between start and end stops - Path p = this.dijkstra.calcLeastCostPath(wrappedFromNodes, wrappedToNodes, person); - if (p == null) { - return null; - } - - double directWalkCost = CoordUtils.calcEuclideanDistance(fromFacility.getCoord(), toFacility.getCoord()) / this.config.getBeelineWalkSpeed() * ( 0 - this.config.getMarginalUtilityOfTravelTimeWalk_utl_s()); - double pathCost = p.travelCost + wrappedFromNodes.get(p.getFromNode()).initialCost + wrappedToNodes.get( - p.getToNode()).initialCost; - if (directWalkCost < pathCost) { - List legs = new ArrayList(); - Leg leg = PopulationUtils.createLeg(TransportMode.walk); // formerly transit_walk - TripStructureUtils.setRoutingMode(leg, TransportMode.pt); - double walkDistance = CoordUtils.calcEuclideanDistance(fromFacility.getCoord(), toFacility.getCoord()); - Route walkRoute = RouteUtils.createGenericRouteImpl(null, null); - walkRoute.setDistance(walkDistance); - leg.setRoute(walkRoute); - leg.setTravelTime(walkDistance/this.config.getBeelineWalkSpeed()); - legs.add(leg); - return legs; - } - - return convertPathToLegList( departureTime, p, fromFacility.getCoord(), toFacility.getCoord(), person ) ; - } - - public Path calcPathRoute(final Coord fromCoord, final Coord toCoord, final double departureTime, final Person person) { - // find possible start stops - // find possible start stops - Map wrappedFromNodes = this.locateWrappedNearestTransitNodes(person, fromCoord, departureTime); - // find possible end stops - Map wrappedToNodes = this.locateWrappedNearestTransitNodes(person, toCoord, departureTime); - // find routes between start and end stops - Path path = this.dijkstra.calcLeastCostPath(wrappedFromNodes, wrappedToNodes, person); - if (path == null) { - return null; - } - double directWalkTime = CoordUtils.calcEuclideanDistance(fromCoord, toCoord) / this.config.getBeelineWalkSpeed(); - double directWalkCost = directWalkTime * ( 0 - this.config.getMarginalUtilityOfTravelTimeWalk_utl_s()); - double pathCost = path.travelCost + wrappedFromNodes.get(path.getFromNode()).initialCost + wrappedToNodes.get( - path.getToNode()).initialCost; - if (directWalkCost < pathCost) { - return new Path(new ArrayList(), new ArrayList(), directWalkTime, directWalkCost); - } - double pathTime = path.travelTime + wrappedFromNodes.get(path.getFromNode()).initialTime + wrappedToNodes.get( - path.getToNode()).initialTime - 2 * departureTime; - return new Path(path.nodes, path.links, pathTime, pathCost); - } - - protected List convertPathToLegList( double departureTime, Path p, Coord fromCoord, Coord toCoord, Person person) { - List legs = new ArrayList(); - Leg leg; - double walkDistance, walkWaitTime, travelTime = 0; - Route walkRoute; - Coord coord = fromCoord; - TransitRouteStop stop = null; - double time = departureTime; - for (Link link : p.links) { - TransitRouterNetworkWW.TransitRouterNetworkLink l = (TransitRouterNetworkWW.TransitRouterNetworkLink) link; - if(l.route!=null) { - //in line link - double ttime = ttCalculator.getLinkTravelTime(l, time, person, null); - travelTime += ttime; - time += ttime; - } - else if(l.fromNode.route!=null) { - //inside link - leg = PopulationUtils.createLeg(TransportMode.pt); - TransitPassengerRoute ptRoute = new DefaultTransitPassengerRoute(stop.getStopFacility(), l.fromNode.line, l.fromNode.route, l.fromNode.stop.getStopFacility()); - leg.setRoute(ptRoute); - leg.setTravelTime(travelTime); - legs.add(leg); - travelTime = 0; - stop = l.fromNode.stop; - coord = l.fromNode.stop.getStopFacility().getCoord(); - } - else if(l.toNode.route!=null) { - //wait link - leg = PopulationUtils.createLeg(TransportMode.walk); - TripStructureUtils.setRoutingMode(leg, TransportMode.pt); - walkDistance = CoordUtils.calcEuclideanDistance(coord, l.toNode.stop.getStopFacility().getCoord()); - walkWaitTime = walkDistance/this.config.getBeelineWalkSpeed()/*+ttCalculator.getLinkTravelTime(l, time+walkDistance/this.config.getBeelineWalkSpeed(), person, null)*/; - walkRoute = RouteUtils.createGenericRouteImpl(stop==null?null:stop.getStopFacility().getLinkId(), l.toNode.stop.getStopFacility().getLinkId()); - walkRoute.setDistance(walkDistance); - leg.setRoute(walkRoute); - leg.setTravelTime(walkWaitTime); - legs.add(leg); - stop = l.toNode.stop; - time += walkWaitTime; - } - - } - leg = PopulationUtils.createLeg(TransportMode.walk); - TripStructureUtils.setRoutingMode(leg, TransportMode.pt); - walkDistance = CoordUtils.calcEuclideanDistance(coord, toCoord); - walkWaitTime = walkDistance/this.config.getBeelineWalkSpeed(); - walkRoute = RouteUtils.createGenericRouteImpl(stop==null?null:stop.getStopFacility().getLinkId(), null); - walkRoute.setDistance(walkDistance); - leg.setRoute(walkRoute); - leg.setTravelTime(walkWaitTime); - legs.add(leg); - return legs; - } - - public TransitRouterNetworkWW getTransitRouterNetwork() { - return this.transitNetwork; - } - - protected TransitRouterNetworkWW getTransitNetwork() { - return transitNetwork; - } - - protected MultiNodeDijkstra getDijkstra() { - return dijkstra; - } - - protected TransitRouterConfig getConfig() { - return config; - } - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/controler/RunControlerWS.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/controler/RunControlerWS.java deleted file mode 100644 index 56ea9525a6b..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/controler/RunControlerWS.java +++ /dev/null @@ -1,66 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * ControlerWW.java - * * - * *********************************************************************** * - * * - * copyright : (C) 2012 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.contrib.eventsBasedPTRouter.controler; - -import org.matsim.contrib.eventsBasedPTRouter.TransitRouterEventsWSFactory; -import org.matsim.contrib.eventsBasedPTRouter.stopStopTimes.StopStopTimeCalculatorImpl; -import org.matsim.contrib.eventsBasedPTRouter.waitTimes.WaitTimeStuckCalculator; -import org.matsim.core.config.Config; -import org.matsim.core.config.ConfigUtils; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.controler.OutputDirectoryHierarchy; -import org.matsim.core.scenario.ScenarioUtils; -import org.matsim.pt.router.TransitRouter; - - -/** - * A run Controler for a transit router that depends on the travel times and wait times - * - * @author sergioo - */ - -public class RunControlerWS { - - public static void main(String[] args) { - Config config = ConfigUtils.createConfig(); - ConfigUtils.loadConfig(config, args[0]); - final Controler controler = new Controler(ScenarioUtils.loadScenario(config)); - controler.getConfig().controler().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.overwriteExistingFiles); - final WaitTimeStuckCalculator waitTimeCalculator = new WaitTimeStuckCalculator(controler.getScenario().getPopulation(), - controler.getScenario().getTransitSchedule(), controler.getConfig().travelTimeCalculator().getTraveltimeBinSize(), - (int) (controler.getConfig().qsim().getEndTime().seconds()-controler.getConfig().qsim().getStartTime().seconds())); - controler.getEvents().addHandler(waitTimeCalculator); - final StopStopTimeCalculatorImpl stopStopTimeCalculator = new StopStopTimeCalculatorImpl(controler.getScenario().getTransitSchedule(), - controler.getConfig().travelTimeCalculator().getTraveltimeBinSize(), - (int) (controler.getConfig().qsim().getEndTime().seconds()-controler.getConfig().qsim().getStartTime().seconds())); - controler.getEvents().addHandler(stopStopTimeCalculator); - controler.addOverridingModule(new AbstractModule() { - @Override - public void install() { - bind(TransitRouter.class).toProvider(new TransitRouterEventsWSFactory(controler.getScenario(), waitTimeCalculator.get(), - stopStopTimeCalculator.get())); - } - }); - controler.run(); - } - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/controler/RunControlerWSV.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/controler/RunControlerWSV.java deleted file mode 100644 index a40e1bdf88f..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/controler/RunControlerWSV.java +++ /dev/null @@ -1,77 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * ControlerWW.java - * * - * *********************************************************************** * - * * - * copyright : (C) 2012 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.contrib.eventsBasedPTRouter.controler; - -import org.matsim.contrib.eventsBasedPTRouter.TransitRouterEventsWSVFactory; -import org.matsim.contrib.eventsBasedPTRouter.stopStopTimes.StopStopTimeCalculatorImpl; -import org.matsim.contrib.eventsBasedPTRouter.vehicleOccupancy.VehicleOccupancyCalculator; -import org.matsim.contrib.eventsBasedPTRouter.waitTimes.WaitTimeStuckCalculator; -import org.matsim.core.config.Config; -import org.matsim.core.config.ConfigUtils; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.scenario.MutableScenario; -import org.matsim.core.scenario.ScenarioUtils; -import org.matsim.pt.router.TransitRouter; - - -/** - * A run Controler for a transit router that depends on the travel times and wait times - * - * @author sergioo - */ - -public class RunControlerWSV { - - public static void main(String[] args) { - Config config = ConfigUtils.createConfig(); - ConfigUtils.loadConfig(config, args[0]); - final Controler controler = new Controler(ScenarioUtils.loadScenario(config)); - final WaitTimeStuckCalculator waitTimeCalculator = new WaitTimeStuckCalculator(controler.getScenario().getPopulation(), - controler.getScenario().getTransitSchedule(), controler.getConfig().travelTimeCalculator().getTraveltimeBinSize(), - (int) (controler.getConfig().qsim().getEndTime().seconds()-controler.getConfig().qsim().getStartTime().seconds())); - controler.getEvents().addHandler(waitTimeCalculator); - final StopStopTimeCalculatorImpl stopStopTimeCalculator = new StopStopTimeCalculatorImpl(controler.getScenario().getTransitSchedule(), - controler.getConfig().travelTimeCalculator().getTraveltimeBinSize(), - (int) (controler.getConfig().qsim().getEndTime().seconds()-controler.getConfig().qsim().getStartTime().seconds())); - controler.getEvents().addHandler(stopStopTimeCalculator); - final VehicleOccupancyCalculator vehicleOccupancyCalculator = new VehicleOccupancyCalculator(controler.getScenario().getTransitSchedule(), - ((MutableScenario)controler.getScenario()).getTransitVehicles(), - controler.getConfig().travelTimeCalculator().getTraveltimeBinSize(), - (int) (controler.getConfig().qsim().getEndTime().seconds()-controler.getConfig().qsim().getStartTime().seconds())); - controler.getEvents().addHandler(vehicleOccupancyCalculator); - controler.addOverridingModule(new AbstractModule() { - @Override - public void install() { - bind(TransitRouter.class).toProvider(new TransitRouterEventsWSVFactory(controler.getScenario(), waitTimeCalculator.get(), - stopStopTimeCalculator.get(), vehicleOccupancyCalculator.getVehicleOccupancy())); - } - }); - - // yyyyyy note that in the above script only the router is modified, but not the scoring. With standard matsim, a slower bu - // less crowded pt route will only be accepted by the agent when the faster but more crowded option was never presented - // to the agent. (Alternatively, e.g. with the Singapore scenario, there may be boarding denials, in which case - // routes that avoid crowded sections may also be beneficial.) kai, jul'15 - - controler.run(); - } - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/controler/RunControlerWW.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/controler/RunControlerWW.java deleted file mode 100644 index 27c713ed684..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/controler/RunControlerWW.java +++ /dev/null @@ -1,56 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * ControlerWW.java - * * - * *********************************************************************** * - * * - * copyright : (C) 2012 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.contrib.eventsBasedPTRouter.controler; - -import org.matsim.contrib.eventsBasedPTRouter.TransitRouterEventsWLFactory; -import org.matsim.core.config.Config; -import org.matsim.core.config.ConfigUtils; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.scenario.ScenarioUtils; -import org.matsim.contrib.eventsBasedPTRouter.waitTimes.WaitTimeStuckCalculator; -import org.matsim.pt.router.TransitRouter; - - -/** - * A run Controler for a transit router that depends on the travel times and wait times - * - * @author sergioo - */ - -public class RunControlerWW { - - public static void main(String[] args) { - Config config = ConfigUtils.createConfig(); - ConfigUtils.loadConfig(config, args[0]); - final Controler controler = new Controler(ScenarioUtils.loadScenario(config)); - final WaitTimeStuckCalculator waitTimeCalculator = new WaitTimeStuckCalculator(controler.getScenario().getPopulation(), controler.getScenario().getTransitSchedule(), controler.getConfig(), controler.getEvents()); - controler.getEvents().addHandler(waitTimeCalculator); - controler.addOverridingModule(new AbstractModule() { - @Override - public void install() { - bind(TransitRouter.class).toProvider(new TransitRouterEventsWLFactory(controler, waitTimeCalculator.get())); - } - }); - controler.run(); - } - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTime.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTime.java deleted file mode 100644 index 0b5fa9056f5..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTime.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.matsim.contrib.eventsBasedPTRouter.stopStopTimes; - -import org.matsim.api.core.v01.Id; -import org.matsim.pt.transitSchedule.api.TransitStopFacility; - -import java.io.Serializable; - -public interface StopStopTime extends Serializable { - - //Methods - public double getStopStopTime(Id stopOId, Id stopDId, double time); - public double getStopStopTimeVariance(Id stopOId, Id stopDId, double time); - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeCalculator.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeCalculator.java deleted file mode 100644 index a27652742bd..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeCalculator.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.matsim.contrib.eventsBasedPTRouter.stopStopTimes; - -import com.google.inject.Provider; -import com.google.inject.Provides; -import org.matsim.api.core.v01.Id; -import org.matsim.pt.transitSchedule.api.TransitStopFacility; - - - -public interface StopStopTimeCalculator extends Provider { - - //Methods - double getStopStopTime(Id stopOId, Id stopDId, double time); - - double getStopStopTimeVariance(Id stopOId, Id stopDId, double time); - - @Override - @Provides - StopStopTime get(); -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeCalculatorImpl.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeCalculatorImpl.java deleted file mode 100644 index c2ffef28c35..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeCalculatorImpl.java +++ /dev/null @@ -1,153 +0,0 @@ -package org.matsim.contrib.eventsBasedPTRouter.stopStopTimes; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.matsim.api.core.v01.Id; -import org.matsim.api.core.v01.events.PersonLeavesVehicleEvent; -import org.matsim.api.core.v01.events.handler.PersonLeavesVehicleEventHandler; -import org.matsim.core.api.experimental.events.EventsManager; -import org.matsim.core.api.experimental.events.VehicleArrivesAtFacilityEvent; -import org.matsim.core.api.experimental.events.handler.VehicleArrivesAtFacilityEventHandler; -import org.matsim.core.config.Config; -import org.matsim.core.trafficmonitoring.TimeBinUtils; -import org.matsim.core.utils.collections.Tuple; -import org.matsim.pt.transitSchedule.api.Departure; -import org.matsim.pt.transitSchedule.api.TransitLine; -import org.matsim.pt.transitSchedule.api.TransitRoute; -import org.matsim.pt.transitSchedule.api.TransitSchedule; -import org.matsim.pt.transitSchedule.api.TransitStopFacility; -import org.matsim.vehicles.Vehicle; - -import com.google.inject.Inject; -import com.google.inject.Provides; -import com.google.inject.Singleton; -@Singleton -public class StopStopTimeCalculatorImpl implements VehicleArrivesAtFacilityEventHandler, PersonLeavesVehicleEventHandler, StopStopTimeCalculator { - - private final Map, Map, StopStopTimeData>> stopStopTimes = new HashMap, Map, StopStopTimeData>>(5000); - private final Map, Map, Double>> scheduledStopStopTimes = new HashMap, Map, Double>>(5000); - private final Map, Tuple, Double>> inTransitVehicles = new HashMap, Tuple, Double>>(1000); - private final Set> vehicleIds = new HashSet>(); - private final double timeSlot; - private final int totalTime; - private boolean useVehicleIds = true; - - //Constructors - @Inject - public StopStopTimeCalculatorImpl(final TransitSchedule transitSchedule, final Config config, EventsManager eventsManager) { - this(transitSchedule, config.travelTimeCalculator().getTraveltimeBinSize(), (int) (config.qsim().getEndTime().seconds()-config.qsim().getStartTime().seconds())); - eventsManager.addHandler(this); - } - public StopStopTimeCalculatorImpl(final TransitSchedule transitSchedule, final double timeSlot, final int totalTime) { - this.timeSlot = timeSlot; - this.totalTime = totalTime; - Map, Map, Integer>> numObservations = new HashMap, Map, Integer>>(); - for(TransitLine line:transitSchedule.getTransitLines().values()) - for(TransitRoute route:line.getRoutes().values()) { - for(int s=0; s, StopStopTimeData> map = stopStopTimes.computeIfAbsent( - route.getStops().get(s).getStopFacility().getId(), - k -> new HashMap<>(2)); - map.put(route.getStops().get(s+1).getStopFacility().getId(), new StopStopTimeDataArray(TimeBinUtils.getTimeBinCount(totalTime, timeSlot))); - Map, Double> map2 = scheduledStopStopTimes.get(route.getStops().get(s).getStopFacility().getId()); - Map, Integer> map3 = numObservations.get(route.getStops().get(s).getStopFacility().getId()); - Double stopStopTime; - Integer num; - if(map2==null) { - map2 = new HashMap, Double>(2); - scheduledStopStopTimes.put(route.getStops().get(s).getStopFacility().getId(), map2); - map3 = new HashMap, Integer>(2); - numObservations.put(route.getStops().get(s).getStopFacility().getId(), map3); - stopStopTime = 0.0; - num = 0; - } - else { - stopStopTime = map2.get(route.getStops().get(s+1).getStopFacility().getId()); - num = map3.get(route.getStops().get(s+1).getStopFacility().getId()); - if(stopStopTime==null) { - stopStopTime = 0.0; - num = 0; - } - } - map2.put(route.getStops().get(s+1).getStopFacility().getId(), - stopStopTime+route.getStops().get(s+1).getArrivalOffset().seconds()-route.getStops().get(s).getDepartureOffset().seconds()); - map3.put(route.getStops().get(s+1).getStopFacility().getId(), ++num); - } - for(Departure departure:route.getDepartures().values()) - vehicleIds.add(departure.getVehicleId()); - } - for(Entry, Map, Double>> entry:scheduledStopStopTimes.entrySet()) - for(Entry, Double> entry2:entry.getValue().entrySet()) - entry.getValue().put(entry2.getKey(), entry2.getValue()/numObservations.get(entry.getKey()).get(entry2.getKey())); - } - - //Methods - @Override - public double getStopStopTime(Id stopOId, Id stopDId, double time) { - StopStopTimeData stopStopTimeData = stopStopTimes.get(stopOId).get(stopDId); - int timeBinIndex = TimeBinUtils.getTimeBinIndex(time, timeSlot, TimeBinUtils.getTimeBinCount(totalTime, timeSlot)); - if(stopStopTimeData.getNumData(timeBinIndex)==0) - return scheduledStopStopTimes.get(stopOId).get(stopDId); - else - return stopStopTimeData.getStopStopTime(timeBinIndex); - } - @Override - public double getStopStopTimeVariance(Id stopOId, Id stopDId, double time) { - StopStopTimeData stopStopTimeData = stopStopTimes.get(stopOId).get(stopDId); - int timeBinIndex = TimeBinUtils.getTimeBinIndex(time, timeSlot, TimeBinUtils.getTimeBinCount(totalTime, timeSlot)); - if(stopStopTimeData.getNumData(timeBinIndex)==0) - return 0; - else - return stopStopTimeData.getStopStopTimeVariance(timeBinIndex); - } - @Override - public void reset(int iteration) { - for(Map, StopStopTimeData> map:stopStopTimes.values()) - for(StopStopTimeData stopStopTimeData:map.values()) - stopStopTimeData.resetStopStopTimes(); - inTransitVehicles.clear(); - } - @Override - public void handleEvent(VehicleArrivesAtFacilityEvent event) { - if(!useVehicleIds || vehicleIds.contains(event.getVehicleId())) { - Tuple, Double> route = inTransitVehicles.remove(event.getVehicleId()); - if(route!=null) - stopStopTimes.get(route.getFirst()).get(event.getFacilityId()).addStopStopTime( - TimeBinUtils.getTimeBinIndex(route.getSecond(), timeSlot, TimeBinUtils.getTimeBinCount(totalTime, timeSlot)), - event.getTime()-route.getSecond()); - inTransitVehicles.put(event.getVehicleId(), new Tuple, Double>(event.getFacilityId(), event.getTime())); - } - } - @Override - public void handleEvent(PersonLeavesVehicleEvent event) { - if((!useVehicleIds || vehicleIds.contains(event.getVehicleId())) && event.getPersonId().toString().startsWith("pt_") - && event.getPersonId().toString().contains(event.getVehicleId().toString())) - inTransitVehicles.remove(event.getVehicleId()); - } - public void setUseVehicleIds(boolean useVehicleIds) { - this.useVehicleIds = useVehicleIds; - } - - @Override - @Provides - public StopStopTime get() { - return new StopStopTime() { - /** - * - */ - private static final long serialVersionUID = 1L; - @Override - public double getStopStopTime(Id stopOId, Id stopDId, double time) { - return StopStopTimeCalculatorImpl.this.getStopStopTime(stopOId, stopDId, time); - } - @Override - public double getStopStopTimeVariance(Id stopOId, Id stopDId, double time) { - return StopStopTimeCalculatorImpl.this.getStopStopTimeVariance(stopOId, stopDId, time); - } - }; - } -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeCalculatorSerializable.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeCalculatorSerializable.java deleted file mode 100644 index d03b9ed5f2b..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeCalculatorSerializable.java +++ /dev/null @@ -1,192 +0,0 @@ -package org.matsim.contrib.eventsBasedPTRouter.stopStopTimes; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.matsim.api.core.v01.Id; -import org.matsim.api.core.v01.events.PersonLeavesVehicleEvent; -import org.matsim.api.core.v01.events.handler.PersonLeavesVehicleEventHandler; -import org.matsim.core.api.experimental.events.VehicleArrivesAtFacilityEvent; -import org.matsim.core.api.experimental.events.handler.VehicleArrivesAtFacilityEventHandler; -import org.matsim.core.config.Config; -import org.matsim.core.trafficmonitoring.TimeBinUtils; -import org.matsim.core.utils.collections.Tuple; -import org.matsim.pt.transitSchedule.api.Departure; -import org.matsim.pt.transitSchedule.api.TransitLine; -import org.matsim.pt.transitSchedule.api.TransitRoute; -import org.matsim.pt.transitSchedule.api.TransitSchedule; -import org.matsim.pt.transitSchedule.api.TransitStopFacility; - -import com.google.inject.Provider; -import com.google.inject.Provides; - -public class StopStopTimeCalculatorSerializable implements StopStopTimeCalculator, VehicleArrivesAtFacilityEventHandler, PersonLeavesVehicleEventHandler, Serializable, Provider { - - /** - * - */ - private static final long serialVersionUID = 1L; - private final Map> stopStopTimes = new HashMap>(5000); - private final Map> scheduledStopStopTimes = new HashMap>(5000); - private final Map> inTransitVehicles = new HashMap>(1000); - private final Set vehicleIds = new HashSet(); - private final double timeSlot; - private final int totalTime; - private boolean useVehicleIds = true; - private static int scheduleCalls = 0; - private static int totalCalls = 0; - private static double stopTimesInflation = 0; - - //Constructors - public StopStopTimeCalculatorSerializable(final TransitSchedule transitSchedule, final Config config) { - this(transitSchedule, config.travelTimeCalculator().getTraveltimeBinSize(), (int) (config.qsim().getEndTime().seconds()-config.qsim().getStartTime().seconds())); - } - public static void printCallStatisticsAndReset(){ - Logger logger = LogManager.getLogger(StopStopTimeCalculatorSerializable.class); - logger.warn("stop times read from schedule vs total (S:T) = " + scheduleCalls + " : " + totalCalls); - logger.warn("inflation of recorded times called vs their scheduled time:" +stopTimesInflation/(double)(totalCalls -scheduleCalls)); - scheduleCalls = 0; - totalCalls = 0; - stopTimesInflation=0; - } - public StopStopTimeCalculatorSerializable(final TransitSchedule transitSchedule, final double timeSlot, final int totalTime) { - this.timeSlot = timeSlot; - this.totalTime = totalTime; - Map> numObservations = new HashMap>(); - for(TransitLine line:transitSchedule.getTransitLines().values()) - for(TransitRoute route:line.getRoutes().values()) { - for(int s=0; s map = stopStopTimes.get(route.getStops().get(s).getStopFacility().getId().toString()); - if(map==null) { - map = new HashMap(2); - stopStopTimes.put(route.getStops().get(s).getStopFacility().getId().toString(), map); - } - map.put(route.getStops().get(s+1).getStopFacility().getId().toString(), - new StopStopTimeDataArray(TimeBinUtils.getTimeBinCount(totalTime, timeSlot))); - Map map2 = scheduledStopStopTimes.get(route.getStops().get(s).getStopFacility().getId().toString()); - Map map3 = numObservations.get(route.getStops().get(s).getStopFacility().getId().toString()); - Double stopStopTime; - Integer num; - if(map2==null) { - map2 = new HashMap(2); - scheduledStopStopTimes.put(route.getStops().get(s).getStopFacility().getId().toString(), map2); - map3 = new HashMap(2); - numObservations.put(route.getStops().get(s).getStopFacility().getId().toString(), map3); - stopStopTime = 0.0; - num = 0; - } - else { - stopStopTime = map2.get(route.getStops().get(s+1).getStopFacility().getId().toString()); - num = map3.get(route.getStops().get(s+1).getStopFacility().getId().toString()); - if(stopStopTime==null) { - stopStopTime = 0.0; - num = 0; - } - } - map2.put(route.getStops().get(s+1).getStopFacility().getId().toString(), - stopStopTime+route.getStops().get(s+1).getArrivalOffset().seconds() - - route.getStops().get(s).getDepartureOffset().seconds()); - map3.put(route.getStops().get(s+1).getStopFacility().getId().toString(), ++num); - } - for(Departure departure:route.getDepartures().values()) - vehicleIds.add(departure.getVehicleId().toString()); - } - for(Entry> entry:scheduledStopStopTimes.entrySet()) - for(Entry entry2:entry.getValue().entrySet()) - entry.getValue().put(entry2.getKey(), entry2.getValue()/numObservations.get(entry.getKey()).get(entry2.getKey())); - } - - //Methods - public StopStopTime getStopStopTimes() { - return new StopStopTime() { - /** - * - */ - private static final long serialVersionUID = 1L; - @Override - public double getStopStopTime(Id stopOId, Id stopDId, double time) { - return StopStopTimeCalculatorSerializable.this.getStopStopTime(stopOId, stopDId, time); - } - @Override - public double getStopStopTimeVariance(Id stopOId, Id stopDId, double time) { - return StopStopTimeCalculatorSerializable.this.getStopStopTimeVariance(stopOId, stopDId, time); - } - }; - } - @Override - public double getStopStopTime(Id stopOId, Id stopDId, double time) { - StopStopTimeData stopStopTimeData = stopStopTimes.get(stopOId.toString()).get(stopDId.toString()); - totalCalls++; - int timeBinIndex = TimeBinUtils.getTimeBinIndex(time, timeSlot, TimeBinUtils.getTimeBinCount(totalTime, timeSlot)); - if(stopStopTimeData.getNumData(timeBinIndex)==0) { - scheduleCalls++; - return scheduledStopStopTimes.get(stopOId.toString()).get(stopDId.toString()); - } - else { - stopTimesInflation += stopStopTimeData.getStopStopTime(timeBinIndex)/scheduledStopStopTimes.get(stopOId.toString()).get(stopDId.toString()); - return stopStopTimeData.getStopStopTime(timeBinIndex); - } - } - @Override - public double getStopStopTimeVariance(Id stopOId, Id stopDId, double time) { - StopStopTimeData stopStopTimeData = stopStopTimes.get(stopOId.toString()).get(stopDId.toString()); - int timeBinIndex = TimeBinUtils.getTimeBinIndex(time, timeSlot, TimeBinUtils.getTimeBinCount(totalTime, timeSlot)); - if(stopStopTimeData.getNumData(timeBinIndex)==0) - return 0; - else - return stopStopTimeData.getStopStopTimeVariance(timeBinIndex); - } - - @Provides - public StopStopTime get() { - return new StopStopTime() { - @Override - public double getStopStopTime(Id stopOId, Id stopDId, double time) { - return StopStopTimeCalculatorSerializable.this.getStopStopTime(stopOId,stopDId,time); - } - - @Override - public double getStopStopTimeVariance(Id stopOId, Id stopDId, double time) { - return StopStopTimeCalculatorSerializable.this.getStopStopTimeVariance(stopOId,stopDId,time); - } - }; - } - - @Override - public void reset(int iteration) { - for(Map map:stopStopTimes.values()) - for(StopStopTimeData stopStopTimeData:map.values()) - stopStopTimeData.resetStopStopTimes(); - inTransitVehicles.clear(); - } - @Override - public void handleEvent(VehicleArrivesAtFacilityEvent event) { - if(!useVehicleIds || vehicleIds.contains(event.getVehicleId().toString())) { - Tuple route = inTransitVehicles.remove(event.getVehicleId().toString()); - if(route!=null) - try { - stopStopTimes.get(route.getFirst()).get(event.getFacilityId().toString()).addStopStopTime( - TimeBinUtils.getTimeBinIndex(route.getSecond(), timeSlot, TimeBinUtils.getTimeBinCount(totalTime, timeSlot)), - event.getTime()-route.getSecond()); - } catch(Exception e) { - //System.out.println("No: "+route.getFirst()+"-->"+event.getFacilityId()); - } - inTransitVehicles.put(event.getVehicleId().toString(), new Tuple(event.getFacilityId().toString(), event.getTime())); - } - } - @Override - public void handleEvent(PersonLeavesVehicleEvent event) { - if((!useVehicleIds || vehicleIds.contains(event.getVehicleId().toString())) && event.getPersonId().toString().startsWith("pt_") - && event.getPersonId().toString().contains(event.getVehicleId().toString())) - inTransitVehicles.remove(event.getVehicleId().toString()); - } - public void setUseVehicleIds(boolean useVehicleIds) { - this.useVehicleIds = useVehicleIds; - } -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeCalculatorTuple.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeCalculatorTuple.java deleted file mode 100644 index 1d6a522694e..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeCalculatorTuple.java +++ /dev/null @@ -1,134 +0,0 @@ -package org.matsim.contrib.eventsBasedPTRouter.stopStopTimes; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import org.matsim.api.core.v01.Id; -import org.matsim.api.core.v01.Scenario; -import org.matsim.api.core.v01.events.PersonLeavesVehicleEvent; -import org.matsim.api.core.v01.events.handler.PersonLeavesVehicleEventHandler; -import org.matsim.core.api.experimental.events.VehicleArrivesAtFacilityEvent; -import org.matsim.core.api.experimental.events.handler.VehicleArrivesAtFacilityEventHandler; -import org.matsim.core.config.Config; -import org.matsim.core.config.ConfigUtils; -import org.matsim.core.scenario.ScenarioUtils; -import org.matsim.core.trafficmonitoring.TimeBinUtils; -import org.matsim.core.utils.collections.Tuple; -import org.matsim.core.utils.misc.Time; -import org.matsim.pt.transitSchedule.api.Departure; -import org.matsim.pt.transitSchedule.api.TransitLine; -import org.matsim.pt.transitSchedule.api.TransitRoute; -import org.matsim.pt.transitSchedule.api.TransitSchedule; -import org.matsim.pt.transitSchedule.api.TransitScheduleReader; -import org.matsim.pt.transitSchedule.api.TransitStopFacility; -import org.matsim.vehicles.Vehicle; - -public class StopStopTimeCalculatorTuple implements VehicleArrivesAtFacilityEventHandler, PersonLeavesVehicleEventHandler { - - private final Map, Id>, StopStopTimeData> stopStopTimes = new HashMap, Id>, StopStopTimeData>(); - private final Map, Id>, Double> scheduledStopStopTimes = new HashMap, Id>, Double>(); - private final Map, Tuple, Double>> inTransitVehicles = new HashMap, Tuple, Double>>(1000); - private final Set> vehicleIds = new HashSet>(); - private final double timeSlot; - private final int totalTime; - - //Constructors - public StopStopTimeCalculatorTuple(final TransitSchedule transitSchedule, final Config config) { - this(transitSchedule, config.travelTimeCalculator().getTraveltimeBinSize(), (int) (config.qsim().getEndTime().seconds()-config.qsim().getStartTime().seconds())); - } - public StopStopTimeCalculatorTuple(final TransitSchedule transitSchedule, final double timeSlot, final int totalTime) { - this.timeSlot = timeSlot; - this.totalTime = totalTime; - Map, Id>, Integer> numObservations = new HashMap, Id>, Integer>(); - for(TransitLine line:transitSchedule.getTransitLines().values()) - for(TransitRoute route:line.getRoutes().values()) { - for(int s=0; s, Id> key = new Tuple, Id>(route.getStops().get(s).getStopFacility().getId(), - route.getStops().get(s+1).getStopFacility().getId()); - StopStopTimeData data = stopStopTimes.get(key); - if(data==null) - stopStopTimes.put(key, new StopStopTimeDataArray(TimeBinUtils.getTimeBinCount(totalTime, timeSlot))); - Double sTime = scheduledStopStopTimes.get(key); - Integer num = numObservations.get(key); - if(sTime==null) { - sTime = 0.0; - scheduledStopStopTimes.put(key, sTime); - num = 0; - numObservations.put(key, num); - } - scheduledStopStopTimes.put(key, (num*sTime+route.getStops().get(s+1).getArrivalOffset().seconds() - - route.getStops().get(s).getDepartureOffset().seconds())/++num); - numObservations.put(key, num); - } - for(Departure departure:route.getDepartures().values()) - vehicleIds.add(departure.getVehicleId()); - } - System.out.println(stopStopTimes.size()); - } - public static void main(String[] args) { - Scenario scenario = ScenarioUtils.createScenario(ConfigUtils.createConfig()); - scenario.getConfig().transit().setUseTransit(true); - new TransitScheduleReader(scenario).readFile(args[0]); - new StopStopTimeCalculatorTuple(scenario.getTransitSchedule(), 900, 30*3600); - } - //Methods - public StopStopTime getStopStopTimes() { - return new StopStopTime() { - /** - * - */ - private static final long serialVersionUID = 1L; - @Override - public double getStopStopTime(Id stopOId, Id stopDId, double time) { - return StopStopTimeCalculatorTuple.this.getStopStopTime(stopOId, stopDId, time); - } - @Override - public double getStopStopTimeVariance(Id stopOId, Id stopDId, double time) { - return StopStopTimeCalculatorTuple.this.getStopStopTimeVariance(stopOId, stopDId, time); - } - }; - } - private double getStopStopTime(Id stopOId, Id stopDId, double time) { - Tuple, Id> key = new Tuple, Id>(stopOId, stopDId); - StopStopTimeData stopStopTimeData = stopStopTimes.get(key); - int timeBinIndex = TimeBinUtils.getTimeBinIndex(time, timeSlot, TimeBinUtils.getTimeBinCount(totalTime, timeSlot)); - if(stopStopTimeData.getNumData(timeBinIndex)==0) - return scheduledStopStopTimes.get(key); - else - return stopStopTimeData.getStopStopTime(timeBinIndex); - } - private double getStopStopTimeVariance(Id stopOId, Id stopDId, double time) { - Tuple, Id> key = new Tuple, Id>(stopOId, stopDId); - StopStopTimeData stopStopTimeData = stopStopTimes.get(key); - int timeBinIndex = TimeBinUtils.getTimeBinIndex(time, timeSlot, TimeBinUtils.getTimeBinCount(totalTime, timeSlot)); - if(stopStopTimeData.getNumData(timeBinIndex)==0) - return 0; - else - return stopStopTimeData.getStopStopTimeVariance(timeBinIndex); - } - @Override - public void reset(int iteration) { - for(StopStopTimeData stopStopTimeData:stopStopTimes.values()) - stopStopTimeData.resetStopStopTimes(); - inTransitVehicles.clear(); - } - @Override - public void handleEvent(VehicleArrivesAtFacilityEvent event) { - if(vehicleIds.contains(event.getVehicleId())) { - Tuple, Double> route = inTransitVehicles.remove(event.getVehicleId()); - if(route!=null) - stopStopTimes.get(new Tuple, Id>(route.getFirst(), - event.getFacilityId())).addStopStopTime( - TimeBinUtils.getTimeBinIndex(route.getSecond(), timeSlot, - TimeBinUtils.getTimeBinCount(totalTime, timeSlot)), event.getTime()-route.getSecond()); - inTransitVehicles.put(event.getVehicleId(), new Tuple, Double>(event.getFacilityId(), event.getTime())); - } - } - @Override - public void handleEvent(PersonLeavesVehicleEvent event) { - if(vehicleIds.contains(event.getVehicleId()) && event.getPersonId().toString().startsWith("pt_"+event.getVehicleId()+"_")) - inTransitVehicles.remove(event.getVehicleId()); - } -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeData.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeData.java deleted file mode 100644 index 9f3de496a90..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeData.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.matsim.contrib.eventsBasedPTRouter.stopStopTimes; - -import java.io.Serializable; - -public interface StopStopTimeData extends Serializable { - - int getNumData(int i); - double getStopStopTime(int i); - void addStopStopTime(final int timeSlot, final double stopStopTime); - void resetStopStopTimes(); - double getStopStopTimeVariance(int timeSlot); - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeDataArray.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeDataArray.java deleted file mode 100644 index b1ac8626324..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/stopStopTimes/StopStopTimeDataArray.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.matsim.contrib.eventsBasedPTRouter.stopStopTimes; - -public class StopStopTimeDataArray implements StopStopTimeData { - - /** - * - */ - private static final long serialVersionUID = 1L; - //Attributes - private double[] stopStopTimeMeans; - private double[] stopStopTimeSquares; - private int[] numTimes; - - //Constructors - public StopStopTimeDataArray(int numSlots) { - stopStopTimeSquares = new double[numSlots]; - stopStopTimeMeans = new double[numSlots]; - numTimes = new int[numSlots]; - resetStopStopTimes(); - } - - //Methods - @Override - public int getNumData(int timeSlot) { - return numTimes[timeSlotWhen StopStopTimes are generated externally, e.g. by a regression. - *

- * See constructor for input format. - *

- */ -public class StopStopTimePreCalcSerializable implements StopStopTime, Serializable { - - private final Map>>> stopStopTimes = new HashMap<>(5000); - private final Scenario scenario; - - public boolean isLogarithmic() { - return logarithmic; - } - - private final boolean logarithmic; - private int nfeCounter = 0; - private int aiobCounter = 0; - private int errorCounter = 0; - - //Constructors - - - /** - * Populates a StopStopTime object with stop to stop travel times and their variances - * recorded at particular times. - * Needs at minimum one record per stop-to-stop combination. - * Times at which records are recorded needn't be regular intervals, because a TreeMap is used. - * - * @param inputFile path to the tab-separated file.Format is fromStopId (String), toStopId (String), time of record (seconds, double), - * travelTime (seconds, double), travelTimeVariance (seconds**2, double). No headings or row numbers. - * @param logarithmic if times are recorded as logarithms (normally distributed residuals) - */ - public StopStopTimePreCalcSerializable(String inputFile, Scenario scenario, boolean logarithmic) { - this.logarithmic = logarithmic; - this.scenario = scenario; - BufferedReader reader = IOUtils.getBufferedReader(inputFile); - String txt = ""; - while (true) { - try { - txt = reader.readLine(); - if (txt == null) - break; - String[] split = txt.split("\t"); -// get the map from this stop id - Map>> toMap = stopStopTimes.get(split[0]); - if (toMap == null) { - toMap = new HashMap<>(); - stopStopTimes.put(split[0], toMap); - } - - Map> timeData = toMap.get(split[1]); - if (timeData == null) { - timeData = new TreeMap<>(); - toMap.put(split[1], timeData); - } - - timeData.put(Integer.parseInt(split[2]), new Tuple<>(Double.parseDouble(split[3]), Double.parseDouble(split[4]))); - - } catch (IOException e) { - e.printStackTrace(); - } catch (ArrayIndexOutOfBoundsException e) { - if (aiobCounter < 10) { - System.err.println("Seems one of the lines in the StopStopTime input file is missing a value. Skipping it."); - } else { - System.err.println("Seems one of the lines in the StopStopTime input file is missing a value. Skipping further warnings..."); - - } - aiobCounter++; - } catch (NumberFormatException e) { - if (nfeCounter < 10) { - System.err.println("Some values in the StopStopTime input file are of the wrong type. Skipping it."); - } else { - System.err.println("Some values in the StopStopTime input file are of the wrong type. Skipping further warnings..."); - } - nfeCounter++; - } - } - System.out.println("\n\n*************************************************************************\n\n"); - System.out.println("STOPSTOPTIMES LOADED, filling in the blanks from the schedule and network"); - System.out.println("\n\n*************************************************************************\n\n"); - - for (TransitLine transitLine : scenario.getTransitSchedule().getTransitLines().values()) { - for (TransitRoute route : transitLine.getRoutes().values()) { - TRANSITSTOPS: - for (int s = 0; s < route.getStops().size() - 1; s++) { - String origin = route.getStops().get(s).getStopFacility().getId().toString(); - String destination = route.getStops().get(s + 1).getStopFacility().getId().toString(); - Map>> toMap = stopStopTimes.get(origin); - if (toMap == null) { - toMap = new HashMap<>(); - stopStopTimes.put(origin, toMap); - } - - Map> timeData = toMap.get(destination); - if (timeData == null) { - timeData = new TreeMap<>(); - toMap.put(destination, timeData); - - try { - List stops; - stops = scenario.getTransitSchedule().getTransitLines().get(transitLine.getId()).getRoutes().get(route.getId()).getStops(); - if (stops == null) - throw new NullPointerException(); - Link fromLink = null; - Link toLink = null; - for (TransitRouteStop tss : stops) { - if (tss.getStopFacility().getId().toString().equals(origin)) { - fromLink = scenario.getNetwork().getLinks().get(tss.getStopFacility().getLinkId()); - } - if (tss.getStopFacility().getId().toString().equals(destination)) { - toLink = scenario.getNetwork().getLinks().get(tss.getStopFacility().getLinkId()); - } - } - if (fromLink == null || toLink == null) - throw new NullPointerException(); - NetworkRoute networkRoute = scenario.getTransitSchedule().getTransitLines().get(transitLine.getId()) - .getRoutes().get(route.getId()).getRoute(); - NetworkRoute subRoute = networkRoute.getSubRoute(fromLink.getId(), toLink.getId()); - List> linkIds = new ArrayList<>(); - linkIds.addAll(subRoute.getLinkIds()); - linkIds.add(toLink.getId()); - double freeSpeedTravelTime = 0; - for (Id id : linkIds) { - Link link = scenario.getNetwork().getLinks().get(id); - freeSpeedTravelTime += link.getLength() / link.getFreespeed(); - } - if (logarithmic) - timeData.put(0, new Tuple(Math.log(freeSpeedTravelTime), 0.005)); - else - timeData.put(0, new Tuple(freeSpeedTravelTime, 0.0)); - - } catch (NullPointerException ne) { - System.err.printf("Couldnt create STOP-STOP entry for for from: %s, to: %s, route: %s, line: %s\n", - origin, destination, route.getId().toString(), transitLine.getId().toString()); - continue TRANSITSTOPS; - } - - } else { - //value already exists (assuming singular stop-stop network routes) - continue TRANSITSTOPS; - } - - } - } - } - } - - - /** - * Retrieves the interpolated travel time for a combination of stops at a particular time, or the first/last variance observation if one cannot be interpolated. - *

- * Returns the error value of infinity for a compbination that doesn't appear in the map - * - * @param stopOId - * @param stopDId - * @param time - * @return the travel time, or Double.POSITIVE_INFINITY - */ - public double getStopStopTime(Id stopOId, Id stopDId, double time) { - Map>> toMap = stopStopTimes.get(stopOId.toString()); - - if (toMap == null) { - return errorValue(stopOId, stopDId); - } - - TreeMap> timedObservations = (TreeMap>) toMap.get(stopDId.toString()); - - if (timedObservations == null) { - return errorValue(stopOId, stopDId); - } - - Map.Entry> ceilingEntry = timedObservations.ceilingEntry((int) time); - Map.Entry> floorEntry = timedObservations.floorEntry((int) time); - if (ceilingEntry == null) { - if (floorEntry == null) { - return errorValue(stopOId, stopDId); - } else { - return floorEntry.getValue().getFirst(); - } - } else { - if (floorEntry == null) { - return ceilingEntry.getValue().getFirst(); - } else { - // I have both, so can interpolate a travel time - double x1 = floorEntry.getKey(); - double x2 = ceilingEntry.getKey(); - double y1 = floorEntry.getValue().getFirst(); - double y2 = ceilingEntry.getValue().getFirst(); - double m = (y2 - y1) / (x2 - x1); - double x = time - x1; - return y1 + m * x; - } - } - } - - private double errorValue(Id stopOId, Id stopDId) { - if (errorCounter < 10) { - System.err.println("No StopStop data for origin stop " + stopOId.toString() + ", destination stop " + stopDId.toString() + ". Returning estimation..."); - } else if (errorCounter == 10) { - System.err.println("No StopStop data for origin stop " + stopOId.toString() + ". Skipping further warnings..."); - } - errorCounter++; - - return Double.POSITIVE_INFINITY; - } - - /** - * Retrieves the interpolated travel time variance for a combination of stops at a particular time, or the first/last variance observation if one cannot be interpolated. - *

- * Returns the error value of infinity for a compbination that doesn't appear in the map - * - * @param stopOId - * @param stopDId - * @param time seconds till the start of the sim - * @return the travel time, or Double.POSITIVE_INFINITY - */ - public double getStopStopTimeVariance(Id stopOId, Id stopDId, double time) { - Map>> toMap = stopStopTimes.get(stopOId.toString()); - - if (toMap == null) { - return errorValue(stopOId, stopDId); - } - - TreeMap> timedObservations = (TreeMap>) toMap.get(stopDId.toString()); - - if (timedObservations == null) { - return errorValue(stopOId, stopDId); - } - - Map.Entry> ceilingEntry = timedObservations.ceilingEntry((int) time); - Map.Entry> floorEntry = timedObservations.floorEntry((int) time); - if (ceilingEntry == null) { - if (floorEntry == null) { - return 0; - } else { - return floorEntry.getValue().getSecond(); - } - } else { - if (floorEntry == null) { - return ceilingEntry.getValue().getSecond(); - } else { - // I have both, so can interpolate a travel time - double x1 = floorEntry.getKey(); - double x2 = ceilingEntry.getKey(); - double y1 = floorEntry.getValue().getSecond(); - double y2 = ceilingEntry.getValue().getSecond(); - double m = (y2 - y1) / (x2 - x1); - double x = time - x1; - return y1 + m * x; - } - } - } - - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/vehicleOccupancy/VehicleOccupancy.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/vehicleOccupancy/VehicleOccupancy.java deleted file mode 100644 index 22168b8ce75..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/vehicleOccupancy/VehicleOccupancy.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.matsim.contrib.eventsBasedPTRouter.vehicleOccupancy; - -import org.matsim.api.core.v01.Id; -import org.matsim.pt.transitSchedule.api.TransitLine; -import org.matsim.pt.transitSchedule.api.TransitRoute; -import org.matsim.pt.transitSchedule.api.TransitStopFacility; - -public interface VehicleOccupancy { - - //Methods - public double getVehicleOccupancy(Id stopOId, Id lineId, Id routeId, double time); - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/vehicleOccupancy/VehicleOccupancyCalculator.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/vehicleOccupancy/VehicleOccupancyCalculator.java deleted file mode 100644 index 9cae7720b1b..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/vehicleOccupancy/VehicleOccupancyCalculator.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.matsim.contrib.eventsBasedPTRouter.vehicleOccupancy; - -import java.util.HashMap; -import java.util.Map; - -import org.matsim.api.core.v01.Id; -import org.matsim.api.core.v01.events.PersonEntersVehicleEvent; -import org.matsim.api.core.v01.events.PersonLeavesVehicleEvent; -import org.matsim.api.core.v01.events.TransitDriverStartsEvent; -import org.matsim.api.core.v01.events.handler.PersonEntersVehicleEventHandler; -import org.matsim.api.core.v01.events.handler.PersonLeavesVehicleEventHandler; -import org.matsim.api.core.v01.events.handler.TransitDriverStartsEventHandler; -import org.matsim.core.api.experimental.events.VehicleDepartsAtFacilityEvent; -import org.matsim.core.api.experimental.events.handler.VehicleDepartsAtFacilityEventHandler; -import org.matsim.core.config.Config; -import org.matsim.core.trafficmonitoring.TimeBinUtils; -import org.matsim.core.utils.collections.Tuple; -import org.matsim.pt.transitSchedule.api.TransitLine; -import org.matsim.pt.transitSchedule.api.TransitRoute; -import org.matsim.pt.transitSchedule.api.TransitSchedule; -import org.matsim.pt.transitSchedule.api.TransitStopFacility; -import org.matsim.vehicles.Vehicle; -import org.matsim.vehicles.VehicleCapacity; -import org.matsim.vehicles.Vehicles; - -public class VehicleOccupancyCalculator implements VehicleDepartsAtFacilityEventHandler, PersonEntersVehicleEventHandler, PersonLeavesVehicleEventHandler, TransitDriverStartsEventHandler { - - private final Map, Id>, Map, VehicleOccupancyData>> vehicleOccupancy = new HashMap, Id>, Map, VehicleOccupancyData>>(1000); - private double timeSlot; - private int totalTime; - private Map, Integer> ptVehicles = new HashMap, Integer>(); - private Map, Integer> capacities = new HashMap, Integer>(); - private Map, Tuple, Id>> linesRoutesOfVehicle = new HashMap, Tuple, Id>>(); - private final Vehicles vehicles; - - //Constructors - public VehicleOccupancyCalculator(final TransitSchedule transitSchedule, final Vehicles vehicles, final Config config) { - this(transitSchedule, vehicles, config.travelTimeCalculator().getTraveltimeBinSize(), (int) (config.qsim().getEndTime().seconds()-config.qsim().getStartTime().seconds())); - } - public VehicleOccupancyCalculator(final TransitSchedule transitSchedule, final Vehicles vehicles, final double timeSlot, final int totalTime) { - this.timeSlot = timeSlot; - this.totalTime = totalTime; - for(TransitLine line:transitSchedule.getTransitLines().values()) - for(TransitRoute route:line.getRoutes().values()) { - Map, VehicleOccupancyData> routeMap = new HashMap, VehicleOccupancyData>(100); - vehicleOccupancy.put(new Tuple, Id>(line.getId(), route.getId()), routeMap); - for(int s=0; s stopOId, Id lineId, Id routeId, double time) { - return VehicleOccupancyCalculator.this.getVehicleOccupancy(stopOId, lineId, routeId, time); - } - }; - } - private double getVehicleOccupancy(Id stopOId, Id lineId, Id routeId, double time) { - return vehicleOccupancy.get(new Tuple, Id>(lineId, routeId)).get(stopOId).getVehicleOccupancy(TimeBinUtils.getTimeBinIndex(time, timeSlot, totalTime)); - } - @Override - public void reset(int iteration) { - for(Map, VehicleOccupancyData> map:vehicleOccupancy.values()) - for(VehicleOccupancyData vehicleOcupancyData:map.values()) - vehicleOcupancyData.resetVehicleOccupancies(); - this.ptVehicles.clear(); - } - @Override - public void handleEvent(VehicleDepartsAtFacilityEvent event) { - Integer num = ptVehicles.get(event.getVehicleId()); - if(num!=null) { - VehicleOccupancyData vehicleOccupancyData = vehicleOccupancy.get(linesRoutesOfVehicle.get(event.getVehicleId())).get(event.getFacilityId()); - if(vehicleOccupancyData!=null) - vehicleOccupancyData.addVehicleOccupancy( - TimeBinUtils.getTimeBinIndex(event.getTime(), timeSlot, - TimeBinUtils.getTimeBinCount(totalTime, timeSlot)), - num/(double)capacities.get(event.getVehicleId())); - } - } - @Override - public void handleEvent(PersonLeavesVehicleEvent event) { - Integer num = this.ptVehicles.get(event.getVehicleId()); - if(num!=null) - this.ptVehicles.put(event.getVehicleId(), num-1); - } - @Override - public void handleEvent(PersonEntersVehicleEvent event) { - Integer num = this.ptVehicles.get(event.getVehicleId()); - if(num!=null) - this.ptVehicles.put(event.getVehicleId(), num+1); - } - @Override - public void handleEvent(TransitDriverStartsEvent event) { - this.ptVehicles.put(event.getVehicleId(), 0); - VehicleCapacity vehicleCapacity = vehicles.getVehicles().get(event.getVehicleId()).getType().getCapacity(); - this.capacities.put(event.getVehicleId(), vehicleCapacity.getSeats()+vehicleCapacity.getStandingRoom()); - linesRoutesOfVehicle.put(event.getVehicleId(), new Tuple, Id>(event.getTransitLineId(), event.getTransitRouteId())); - } - - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/vehicleOccupancy/VehicleOccupancyData.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/vehicleOccupancy/VehicleOccupancyData.java deleted file mode 100644 index 59e155a79e9..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/vehicleOccupancy/VehicleOccupancyData.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.matsim.contrib.eventsBasedPTRouter.vehicleOccupancy; - -public interface VehicleOccupancyData { - - double getVehicleOccupancy(int i); - void addVehicleOccupancy(final int timeSlot, final double vehicleOccupancy); - void resetVehicleOccupancies(); - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/vehicleOccupancy/VehicleOccupancyDataArray.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/vehicleOccupancy/VehicleOccupancyDataArray.java deleted file mode 100644 index 29c405c1772..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/vehicleOccupancy/VehicleOccupancyDataArray.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.matsim.contrib.eventsBasedPTRouter.vehicleOccupancy; - -public class VehicleOccupancyDataArray implements VehicleOccupancyData { - - //Attributes - private double[] vehicleOccupancies; - private int[] numTimes; - private int lastPosition; - - //Constructors - public VehicleOccupancyDataArray(int numSlots) { - vehicleOccupancies = new double[numSlots]; - numTimes = new int[numSlots]; - resetVehicleOccupancies(); - } - - //Methods - @Override - public double getVehicleOccupancy(int timeSlot) { - if(timeSlot>lastPosition) - return 1; - else - while(vehicleOccupancies[timeSlot]==-1) - timeSlot++; - return vehicleOccupancies[timeSlot]; - } - @Override - public synchronized void addVehicleOccupancy(int timeSlot, double vehicleOccupancy) { - if(lastPosition lineId, Id routeId, Id stopId, double time); - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeCalculator.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeCalculator.java deleted file mode 100644 index 3cec2e82f67..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeCalculator.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.matsim.contrib.eventsBasedPTRouter.waitTimes; - -import com.google.inject.Provider; -import com.google.inject.Provides; -import org.matsim.api.core.v01.Id; -import org.matsim.pt.transitSchedule.api.TransitLine; -import org.matsim.pt.transitSchedule.api.TransitRoute; -import org.matsim.pt.transitSchedule.api.TransitStopFacility; - - -public interface WaitTimeCalculator extends Provider { - double getRouteStopWaitTime(Id lineId, Id routeId, Id stopId, double time); - - @Override - @Provides - WaitTime get(); -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeCalculatorImpl.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeCalculatorImpl.java deleted file mode 100644 index ed80d814c81..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeCalculatorImpl.java +++ /dev/null @@ -1,181 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * WaitTimeCalculator.java - * * - * *********************************************************************** * - * * - * copyright : (C) 2012 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.contrib.eventsBasedPTRouter.waitTimes; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -import org.matsim.api.core.v01.Id; -import org.matsim.api.core.v01.events.PersonDepartureEvent; -import org.matsim.api.core.v01.events.PersonEntersVehicleEvent; -import org.matsim.api.core.v01.events.TransitDriverStartsEvent; -import org.matsim.api.core.v01.events.handler.PersonDepartureEventHandler; -import org.matsim.api.core.v01.events.handler.PersonEntersVehicleEventHandler; -import org.matsim.api.core.v01.events.handler.TransitDriverStartsEventHandler; -import org.matsim.api.core.v01.population.Person; -import org.matsim.core.api.experimental.events.EventsManager; -import org.matsim.core.api.experimental.events.VehicleArrivesAtFacilityEvent; -import org.matsim.core.api.experimental.events.handler.VehicleArrivesAtFacilityEventHandler; -import org.matsim.core.config.Config; -import org.matsim.core.trafficmonitoring.TimeBinUtils; -import org.matsim.core.utils.collections.Tuple; -import org.matsim.pt.transitSchedule.api.Departure; -import org.matsim.pt.transitSchedule.api.TransitLine; -import org.matsim.pt.transitSchedule.api.TransitRoute; -import org.matsim.pt.transitSchedule.api.TransitRouteStop; -import org.matsim.pt.transitSchedule.api.TransitSchedule; -import org.matsim.pt.transitSchedule.api.TransitStopFacility; -import org.matsim.vehicles.Vehicle; - -import com.google.inject.Inject; -import com.google.inject.Provider; -import com.google.inject.Singleton; - -/** - * Save waiting times of agents while mobsim is running - * - * @author sergioo - */ - -@Singleton -public class WaitTimeCalculatorImpl implements WaitTimeCalculator, PersonDepartureEventHandler, PersonEntersVehicleEventHandler, TransitDriverStartsEventHandler, VehicleArrivesAtFacilityEventHandler, Provider { - - //Attributes - private final double timeSlot; - private final int totalTime; - private final Map, Id>, Map, WaitTimeData>> waitTimes = new HashMap, Id>, Map, WaitTimeData>>(1000); - private final Map, Id>, Map, double[]>> scheduledWaitTimes = new HashMap, Id>, Map, double[]>>(1000); - private final Map, Double> agentsWaitingData = new HashMap, Double>(); - private Map, Tuple, Id>> linesRoutesOfVehicle = new HashMap, Tuple, Id>>(); - private Map, Id> stopOfVehicle = new HashMap, Id>(); - - //Constructors - @Inject - public WaitTimeCalculatorImpl(final TransitSchedule transitSchedule, final Config config, EventsManager eventsManager) { - this(transitSchedule, config.travelTimeCalculator().getTraveltimeBinSize(), (int) (config.qsim().getEndTime().seconds()-config.qsim().getStartTime().seconds())); - eventsManager.addHandler(this); - } - public WaitTimeCalculatorImpl(final TransitSchedule transitSchedule, final double timeSlot, final int totalTime) { - this.timeSlot = timeSlot; - this.totalTime = totalTime; - for(TransitLine line:transitSchedule.getTransitLines().values()) - for(TransitRoute route:line.getRoutes().values()) { - double[] sortedDepartures = new double[route.getDepartures().size()]; - int d=0; - for(Departure departure:route.getDepartures().values()) - sortedDepartures[d++] = departure.getDepartureTime(); - Arrays.sort(sortedDepartures); - Map, WaitTimeData> stopsMap = new HashMap, WaitTimeData>(100); - Map, double[]> stopsScheduledMap = new HashMap, double[]>(100); - for(TransitRouteStop stop:route.getStops()) { - stopsMap.put(stop.getStopFacility().getId(), new WaitTimeDataArray(TimeBinUtils.getTimeBinCount(totalTime, timeSlot))); - double[] cacheWaitTimes = new double[TimeBinUtils.getTimeBinCount(totalTime, timeSlot)]; - for(int i=0; i24*3600) - endTime-=24*3600; - cacheWaitTimes[i] = Double.NaN; - SORTED_DEPARTURES: - for(double departure:sortedDepartures) { - double arrivalTime = departure+stop.getArrivalOffset().or(stop::getDepartureOffset).seconds(); - if(arrivalTime>=endTime) { - cacheWaitTimes[i] = arrivalTime-endTime; - break SORTED_DEPARTURES; - } - } - if(Double.isNaN(cacheWaitTimes[i])) - cacheWaitTimes[i] = sortedDepartures[0]+24*3600+stop.getArrivalOffset().or(stop::getDepartureOffset).seconds()-endTime; - } - stopsScheduledMap.put(stop.getStopFacility().getId(), cacheWaitTimes); - } - Tuple, Id> key = new Tuple, Id>(line.getId(), route.getId()); - waitTimes.put(key, stopsMap); - scheduledWaitTimes.put(key, stopsScheduledMap); - } - } - - //Methods - @Override - public WaitTime get() { - return new WaitTime() { - /** - * - */ - private static final long serialVersionUID = 1L; - - @Override - public double getRouteStopWaitTime(Id lineId, Id routeId, Id stopId, double time) { - return WaitTimeCalculatorImpl.this.getRouteStopWaitTime(lineId, routeId, stopId, time); - } - }; - } - @Override - public double getRouteStopWaitTime(Id lineId, Id routeId, Id stopId, double time) { - Tuple, Id> key = new Tuple, Id>(lineId, routeId); - WaitTimeData waitTimeData = waitTimes.get(key).get(stopId); - int timeBinIndex = TimeBinUtils.getTimeBinIndex(time, timeSlot, TimeBinUtils.getTimeBinCount(totalTime, timeSlot)); - if(waitTimeData.getNumData(timeBinIndex)==0) { - double[] waitTimes = scheduledWaitTimes.get(key).get(stopId); - return waitTimes[timeBinIndex, WaitTimeData> routeData:waitTimes.values()) - for(WaitTimeData waitTimeData:routeData.values()) - waitTimeData.resetWaitTimes(); - agentsWaitingData.clear(); - linesRoutesOfVehicle.clear(); - stopOfVehicle.clear(); - } - @Override - public void handleEvent(PersonDepartureEvent event) { - if(event.getLegMode().equals("pt") && agentsWaitingData.get(event.getPersonId())==null) - agentsWaitingData.put(event.getPersonId(), event.getTime()); - else if(agentsWaitingData.get(event.getPersonId())!=null) - new RuntimeException("Departing with old data"); - } - @Override - public void handleEvent(PersonEntersVehicleEvent event) { - Double startWaitingTime = agentsWaitingData.get(event.getPersonId()); - if(startWaitingTime!=null) { - Tuple, Id> lineRoute = linesRoutesOfVehicle.get(event.getVehicleId()); - WaitTimeData data = waitTimes.get(lineRoute).get(stopOfVehicle.get(event.getVehicleId())); - data.addWaitTime((int) (startWaitingTime/timeSlot), event.getTime()-startWaitingTime); - agentsWaitingData.remove(event.getPersonId()); - } - } - - @Override - public void handleEvent(VehicleArrivesAtFacilityEvent event) { - if(linesRoutesOfVehicle.get(event.getVehicleId())!=null) - stopOfVehicle.put(event.getVehicleId(), event.getFacilityId()); - } - - @Override - public void handleEvent(TransitDriverStartsEvent event) { - linesRoutesOfVehicle.put(event.getVehicleId(), new Tuple, Id>(event.getTransitLineId(), event.getTransitRouteId())); - } - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeCalculatorSerializable.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeCalculatorSerializable.java deleted file mode 100644 index 17a93bd0410..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeCalculatorSerializable.java +++ /dev/null @@ -1,216 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * WaitTimeCalculator.java - * * - * *********************************************************************** * - * * - * copyright : (C) 2012 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.contrib.eventsBasedPTRouter.waitTimes; - -import java.io.Serializable; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.matsim.api.core.v01.Id; -import org.matsim.api.core.v01.events.PersonDepartureEvent; -import org.matsim.api.core.v01.events.PersonEntersVehicleEvent; -import org.matsim.api.core.v01.events.TransitDriverStartsEvent; -import org.matsim.api.core.v01.events.handler.PersonDepartureEventHandler; -import org.matsim.api.core.v01.events.handler.PersonEntersVehicleEventHandler; -import org.matsim.api.core.v01.events.handler.TransitDriverStartsEventHandler; -import org.matsim.core.api.experimental.events.VehicleArrivesAtFacilityEvent; -import org.matsim.core.api.experimental.events.handler.VehicleArrivesAtFacilityEventHandler; -import org.matsim.core.config.Config; -import org.matsim.core.trafficmonitoring.TimeBinUtils; -import org.matsim.core.utils.collections.Tuple; -import org.matsim.pt.transitSchedule.api.Departure; -import org.matsim.pt.transitSchedule.api.TransitLine; -import org.matsim.pt.transitSchedule.api.TransitRoute; -import org.matsim.pt.transitSchedule.api.TransitRouteStop; -import org.matsim.pt.transitSchedule.api.TransitSchedule; -import org.matsim.pt.transitSchedule.api.TransitStopFacility; - -import com.google.inject.Provider; -import com.google.inject.Provides; - -/** - * Save waiting times of agents while mobsim is running - * - * @author sergioo - */ - -public class WaitTimeCalculatorSerializable implements - WaitTimeCalculator, PersonDepartureEventHandler, - PersonEntersVehicleEventHandler, TransitDriverStartsEventHandler, - VehicleArrivesAtFacilityEventHandler, Serializable, - Provider { - - /** - * - */ - private static final long serialVersionUID = 1L; - private static int scheduleCalls; - private static int waitTimeCalls; - //Attributes - private final double timeSlot; - private final int totalTime; - private final Map, Map> waitTimes = new HashMap, Map>(1000); - private final Map, Map> scheduledWaitTimes = new HashMap, Map>(1000); - private final Map agentsWaitingData = new HashMap(); - private Map> linesRoutesOfVehicle = new HashMap>(); - private Map stopOfVehicle = new HashMap(); - - public static void printCallStatisticsAndReset() { - Logger logger = LogManager.getLogger(WaitTimeCalculatorSerializable.class); - logger.warn("scheduled wait time calls vs unscheduled: " + scheduleCalls + " : " + waitTimeCalls); - scheduleCalls = 0; - waitTimeCalls = 0; - } - - //Constructors - public WaitTimeCalculatorSerializable(final TransitSchedule transitSchedule, final Config config) { - this(transitSchedule, config.travelTimeCalculator().getTraveltimeBinSize(), (int) (config.qsim().getEndTime().seconds() - config.qsim().getStartTime().seconds())); - } - - public WaitTimeCalculatorSerializable(final TransitSchedule transitSchedule, final double timeSlot, final int totalTime) { - this.timeSlot = timeSlot; - this.totalTime = totalTime; - for (TransitLine line : transitSchedule.getTransitLines().values()) - for (TransitRoute route : line.getRoutes().values()) { - double[] sortedDepartures = new double[route.getDepartures().size()]; - int d = 0; - for (Departure departure : route.getDepartures().values()) - sortedDepartures[d++] = departure.getDepartureTime(); - Arrays.sort(sortedDepartures); - Map stopsMap = new HashMap(100); - Map stopsScheduledMap = new HashMap(100); - for (TransitRouteStop stop : route.getStops()) { - stopsMap.put(stop.getStopFacility().getId().toString(), new WaitTimeDataArray(TimeBinUtils.getTimeBinCount(totalTime , timeSlot))); - double[] cacheWaitTimes = new double[TimeBinUtils.getTimeBinCount(totalTime , timeSlot)]; - for (int i = 0; i < cacheWaitTimes.length; i++) { - double endTime = timeSlot * (i + 1); - if (endTime > 24 * 3600) - endTime -= 24 * 3600; - cacheWaitTimes[i] = Double.NaN; - SORTED_DEPARTURES: - for (double departure : sortedDepartures) { - double arrivalTime = departure + stop.getArrivalOffset().or(stop::getDepartureOffset).seconds(); - if (arrivalTime >= endTime) { - cacheWaitTimes[i] = arrivalTime - endTime; - break SORTED_DEPARTURES; - } - } - if (Double.isNaN(cacheWaitTimes[i])) - cacheWaitTimes[i] = sortedDepartures[0] + 24 * 3600 + stop.getArrivalOffset().or(stop::getDepartureOffset).seconds() - endTime; - } - stopsScheduledMap.put(stop.getStopFacility().getId().toString(), cacheWaitTimes); - } - Tuple key = new Tuple(line.getId().toString(), route.getId().toString()); - waitTimes.put(key, stopsMap); - scheduledWaitTimes.put(key, stopsScheduledMap); - } - } - - //Methods - public WaitTime getWaitTimes() { - return new WaitTime() { - /** - * - */ - private static final long serialVersionUID = 1L; - - @Override - public double getRouteStopWaitTime(Id lineId, Id routeId, Id stopId, double time) { - return WaitTimeCalculatorSerializable.this.getRouteStopWaitTime(lineId, routeId, stopId, time); - } - }; - } - - @Override - public double getRouteStopWaitTime(Id lineId, Id routeId, Id stopId, double time) { - Tuple key = new Tuple(lineId.toString(), routeId.toString()); - waitTimeCalls++; - WaitTimeData waitTimeData = waitTimes.get(key).get(stopId.toString()); - int timeBinIndex = TimeBinUtils.getTimeBinIndex(time, timeSlot, TimeBinUtils.getTimeBinCount(totalTime, timeSlot)); - if (waitTimeData.getNumData(timeBinIndex) == 0) { - scheduleCalls++; - double[] waitTimes = scheduledWaitTimes.get(key).get(stopId.toString()); - return waitTimes[timeBinIndex < waitTimes.length ? timeBinIndex : (waitTimes.length - 1)]; - } else { - return waitTimeData.getWaitTime(timeBinIndex); - } - } - - @Override - public void reset(int iteration) { - for (Map routeData : waitTimes.values()) - for (WaitTimeData waitTimeData : routeData.values()) - waitTimeData.resetWaitTimes(); - agentsWaitingData.clear(); - linesRoutesOfVehicle.clear(); - stopOfVehicle.clear(); - } - - @Override - public void handleEvent(PersonDepartureEvent event) { - if (event.getLegMode().equals("pt") && agentsWaitingData.get(event.getPersonId().toString()) == null) - agentsWaitingData.put(event.getPersonId().toString(), event.getTime()); - else if (agentsWaitingData.get(event.getPersonId().toString()) != null) - new RuntimeException("Departing with old data"); - } - - @Override - public void handleEvent(PersonEntersVehicleEvent event) { - Double startWaitingTime = agentsWaitingData.get(event.getPersonId().toString()); - if (startWaitingTime != null) { - Tuple lineRoute = linesRoutesOfVehicle.get(event.getVehicleId().toString()); - WaitTimeData data = waitTimes.get(lineRoute).get(stopOfVehicle.get(event.getVehicleId().toString())); - data.addWaitTime(TimeBinUtils.getTimeBinIndex(startWaitingTime, timeSlot, TimeBinUtils.getTimeBinCount(totalTime, timeSlot)), - event.getTime() - startWaitingTime); - agentsWaitingData.remove(event.getPersonId().toString()); - } - } - - @Override - public void handleEvent(VehicleArrivesAtFacilityEvent event) { - if (linesRoutesOfVehicle.get(event.getVehicleId().toString()) != null) - stopOfVehicle.put(event.getVehicleId().toString(), event.getFacilityId().toString()); - } - - @Override - public void handleEvent(TransitDriverStartsEvent event) { - linesRoutesOfVehicle.put(event.getVehicleId().toString(), new Tuple(event.getTransitLineId().toString(), event.getTransitRouteId().toString())); - } - - @Override - @Provides - public WaitTime get() { - return new WaitTime() { - /** - * - */ - private static final long serialVersionUID = 1L; - - @Override - public double getRouteStopWaitTime(Id lineId, Id routeId, Id stopId, double time) { - return WaitTimeCalculatorSerializable.this.getRouteStopWaitTime(lineId, routeId, stopId, time); - } - }; - } -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeData.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeData.java deleted file mode 100644 index 645a1a39efd..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeData.java +++ /dev/null @@ -1,39 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * WaitTimeCalculator.java - * * - * *********************************************************************** * - * * - * copyright : (C) 2012 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.contrib.eventsBasedPTRouter.waitTimes; - -import java.io.Serializable; - -/** - * Structure for saving waiting times - * - * @author sergioo - */ - -public interface WaitTimeData extends Serializable { - - //Methods - void resetWaitTimes(); - void addWaitTime(final int timeSlot, final double waitTime); - double getWaitTime(final int timeSlot); - int getNumData(final int timeSlot); - -} diff --git a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeDataArray.java b/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeDataArray.java deleted file mode 100644 index 43064e2f913..00000000000 --- a/contribs/eventsBasedPTRouter/src/main/java/org/matsim/contrib/eventsBasedPTRouter/waitTimes/WaitTimeDataArray.java +++ /dev/null @@ -1,67 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * WaitTimeCalculator.java - * * - * *********************************************************************** * - * * - * copyright : (C) 2012 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.contrib.eventsBasedPTRouter.waitTimes; - -/** - * Array implementation of the structure for saving wait times - * - * @author sergioo - */ - -public class WaitTimeDataArray implements WaitTimeData { - - /** - * - */ - private static final long serialVersionUID = 1L; - //Attributes - private double[] waitTimes; - private int[] numTimes; - - //Constructors - public WaitTimeDataArray(int numSlots) { - waitTimes = new double[numSlots]; - numTimes = new int[numSlots]; - resetWaitTimes(); - } - - //Methods - @Override - public void resetWaitTimes() { - for(int i=0; i, Id>, Map, WaitTimeData>> waitTimes = new HashMap, Id>, Map, WaitTimeData>>(1000); - private final Map, Id>, Map, double[]>> scheduledWaitTimes = new HashMap, Id>, Map, double[]>>(1000); - private final Map, Double> agentsWaitingData = new HashMap, Double>(); - private final Map, Integer> agentsCurrentLeg = new HashMap, Integer>(); - private final Population population; - - //Constructors - @Inject - public WaitTimeStuckCalculator(final Population population, final TransitSchedule transitSchedule, final Config config, final EventsManager eventsManager) { - this(population, transitSchedule, config.travelTimeCalculator().getTraveltimeBinSize(), (int) (config.qsim().getEndTime().seconds()-config.qsim().getStartTime().seconds())); - eventsManager.addHandler(this); - } - public WaitTimeStuckCalculator(final Population population, final TransitSchedule transitSchedule, final double timeSlot, final int totalTime) { - this.population = population; - this.timeSlot = timeSlot; - this.totalTime = totalTime; - for(TransitLine line:transitSchedule.getTransitLines().values()) - for(TransitRoute route:line.getRoutes().values()) { - double[] sortedDepartures = new double[route.getDepartures().size()]; - int d=0; - for(Departure departure:route.getDepartures().values()) - sortedDepartures[d++] = departure.getDepartureTime(); - Arrays.sort(sortedDepartures); - Map, WaitTimeData> stopsMap = new HashMap, WaitTimeData>(100); - Map, double[]> stopsScheduledMap = new HashMap, double[]>(100); - for(TransitRouteStop stop:route.getStops()) { - stopsMap.put(stop.getStopFacility().getId(), new WaitTimeDataArray(TimeBinUtils.getTimeBinCount(totalTime, timeSlot))); - double[] cacheWaitTimes = new double[TimeBinUtils.getTimeBinCount(totalTime, timeSlot)]; - for(int i=0; i24*3600) - endTime-=24*3600; - cacheWaitTimes[i] = Double.NaN; - SORTED_DEPARTURES: - for(double departure:sortedDepartures) { - double arrivalTime = departure+stop.getArrivalOffset().or(stop::getDepartureOffset).seconds(); - if(arrivalTime>=endTime) { - cacheWaitTimes[i] = arrivalTime-endTime; - break SORTED_DEPARTURES; - } - } - if(Double.isNaN(cacheWaitTimes[i])) - cacheWaitTimes[i] = sortedDepartures[0]+24*3600+stop.getArrivalOffset().or(stop::getDepartureOffset).seconds()-endTime; - } - stopsScheduledMap.put(stop.getStopFacility().getId(), cacheWaitTimes); - } - Tuple, Id> key = new Tuple, Id>(line.getId(), route.getId()); - waitTimes.put(key, stopsMap); - scheduledWaitTimes.put(key, stopsScheduledMap); - } - } - - //Methods - public double getRouteStopWaitTime(Id lineId, Id routeId, Id stopId, double time) { - Tuple, Id> key = new Tuple, Id>(lineId, routeId); - WaitTimeData waitTimeData = waitTimes.get(key).get(stopId); - int timeBinIndex = TimeBinUtils.getTimeBinIndex(time, timeSlot, TimeBinUtils.getTimeBinCount(totalTime, timeSlot)); - if(waitTimeData.getNumData(timeBinIndex)==0) { - double[] waitTimes = scheduledWaitTimes.get(key).get(stopId); - return waitTimes[timeBinIndex, WaitTimeData> routeData:waitTimes.values()) - for(WaitTimeData waitTimeData:routeData.values()) - waitTimeData.resetWaitTimes(); - agentsWaitingData.clear(); - agentsCurrentLeg.clear(); - } - @Override - public void handleEvent(PersonDepartureEvent event) { - Integer currentLeg = agentsCurrentLeg.get(event.getPersonId()); - if(currentLeg == null) - currentLeg = 0; - else - currentLeg++; - agentsCurrentLeg.put(event.getPersonId(), currentLeg); - if(event.getLegMode().equals("pt") && agentsWaitingData.get(event.getPersonId())==null) - agentsWaitingData.put(event.getPersonId(), event.getTime()); - else if(agentsWaitingData.get(event.getPersonId())!=null) - new RuntimeException("Departing with old data"); - } - @Override - public void handleEvent(PersonEntersVehicleEvent event) { - Double startWaitingTime = agentsWaitingData.get(event.getPersonId()); - if(startWaitingTime!=null) { - int legs = 0, currentLeg = agentsCurrentLeg.get(event.getPersonId()); - PLAN_ELEMENTS: - for(PlanElement planElement:population.getPersons().get(event.getPersonId()).getSelectedPlan().getPlanElements()) - if(planElement instanceof Leg) { - if(currentLeg==legs) { - Route route = (((Leg)planElement).getRoute()); - TransitPassengerRoute eRoute = (TransitPassengerRoute) new DefaultTransitPassengerRouteFactory(). - createRoute(route.getStartLinkId(), route.getEndLinkId()); - eRoute.setStartLinkId(route.getStartLinkId()); - eRoute.setEndLinkId(route.getEndLinkId()); - eRoute.setRouteDescription(route.getRouteDescription()); - WaitTimeData data = waitTimes.get(new Tuple, Id>(eRoute.getLineId(), - eRoute.getRouteId())).get(eRoute.getAccessStopId()); - data.addWaitTime(TimeBinUtils.getTimeBinIndex(startWaitingTime, timeSlot, totalTime), event.getTime()-startWaitingTime); - agentsWaitingData.remove(event.getPersonId()); - break PLAN_ELEMENTS; - } - else - legs++; - } - } - } - - @Override - public void handleEvent(PersonStuckEvent event) { - Double startWaitingTime = agentsWaitingData.get(event.getPersonId()); - if(startWaitingTime!=null) { - int legs = 0, currentLeg = agentsCurrentLeg.get(event.getPersonId()); - PLAN_ELEMENTS: - for(PlanElement planElement:population.getPersons().get(event.getPersonId()).getSelectedPlan().getPlanElements()) - if(planElement instanceof Leg) { - if(currentLeg==legs) { - Route route = ((Leg)planElement).getRoute(); - TransitPassengerRoute eRoute = (TransitPassengerRoute) new DefaultTransitPassengerRouteFactory(). - createRoute(route.getStartLinkId(), route.getEndLinkId()); - eRoute.setStartLinkId(route.getStartLinkId()); - eRoute.setEndLinkId(route.getEndLinkId()); - eRoute.setRouteDescription(route.getRouteDescription()); - WaitTimeData data = waitTimes.get(new Tuple, Id>(eRoute.getLineId(), - eRoute.getRouteId())).get(eRoute.getAccessStopId()); - if(data!=null) - data.addWaitTime(TimeBinUtils.getTimeBinIndex(startWaitingTime, timeSlot, totalTime), event.getTime()-startWaitingTime); - agentsWaitingData.remove(event.getPersonId()); - break PLAN_ELEMENTS; - } - else - legs++; - } - } - } - - @Override - public WaitTime get() { - return new WaitTime() { - - /** - * - */ - private static final long serialVersionUID = 1L; - - @Override - public double getRouteStopWaitTime(Id lineId, Id routeId, Id stopId, double time) { - return WaitTimeStuckCalculator.this.getRouteStopWaitTime(lineId, routeId, stopId, time); - } - - }; - } -} - diff --git a/contribs/eventsBasedPTRouter/src/test/java/org/matsim/contrib/eventsBasedPTRouter/MultiNodeDijkstraTest.java b/contribs/eventsBasedPTRouter/src/test/java/org/matsim/contrib/eventsBasedPTRouter/MultiNodeDijkstraTest.java deleted file mode 100644 index 96574ed0d84..00000000000 --- a/contribs/eventsBasedPTRouter/src/test/java/org/matsim/contrib/eventsBasedPTRouter/MultiNodeDijkstraTest.java +++ /dev/null @@ -1,495 +0,0 @@ -/* *********************************************************************** * - * project: org.matsim.* - * TransitDijkstraTest.java - * * - * *********************************************************************** * - * * - * copyright : (C) 2009 by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** */ - -package org.matsim.contrib.eventsBasedPTRouter; - -import static org.junit.Assert.*; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Test; -import org.matsim.api.core.v01.Coord; -import org.matsim.api.core.v01.Id; -import org.matsim.api.core.v01.network.Link; -import org.matsim.api.core.v01.network.Network; -import org.matsim.api.core.v01.network.Node; -import org.matsim.api.core.v01.population.Person; -import org.matsim.core.network.NetworkUtils; -import org.matsim.core.router.InitialNode; -import org.matsim.core.router.util.LeastCostPathCalculator.Path; -import org.matsim.core.router.util.TravelTime; -import org.matsim.pt.router.CustomDataManager; -import org.matsim.pt.router.TransitTravelDisutility; -import org.matsim.vehicles.Vehicle; - -/** - * @author mrieser - */ -public class MultiNodeDijkstraTest { - - @Test public void testMultipleStarts() { - Fixture f = new Fixture(); - TestTimeCost tc = new TestTimeCost(); - tc.setData(Id.create(1, Link.class), 2.0, 2.0); - tc.setData(Id.create(2, Link.class), 1.0, 1.0); - tc.setData(Id.create(3, Link.class), 3.0, 3.0); - tc.setData(Id.create(4, Link.class), 2.0, 2.0); - tc.setData(Id.create(5, Link.class), 1.0, 1.0); - tc.setData(Id.create(6, Link.class), 3.0, 3.0); - tc.setData(Id.create(7, Link.class), 4.0, 4.0); - MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); - Map fromNodes = new HashMap(); - fromNodes.put(f.network.getNodes().get(Id.create(1, Node.class)), new InitialNode(1.0, 1.0)); - fromNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(3.0, 3.0)); - fromNodes.put(f.network.getNodes().get(Id.create(3, Node.class)), new InitialNode(2.0, 2.0)); - Map toNodes = new HashMap(); - toNodes.put(f.network.getNodes().get(Id.create(5, Node.class)), new InitialNode(0.0, 0.0)); - - Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNotNull("no path found!", p); - assertEquals(3, p.links.size()); - assertEquals("1", p.links.get(0).getId().toString()); - assertEquals("7", p.links.get(1).getId().toString()); - assertEquals("5", p.links.get(2).getId().toString()); - - // change costs - tc.setData(Id.create(1, Link.class), 2.0, 5.0); - - p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNotNull("no path found!", p); - assertEquals(3, p.links.size()); - assertEquals("2", p.links.get(0).getId().toString()); - assertEquals("7", p.links.get(1).getId().toString()); - assertEquals("5", p.links.get(2).getId().toString()); - - // change costs again - tc.setData(Id.create(1, Link.class), 2.0, 1.0); - - p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNotNull("no path found!", p); - assertEquals(3, p.links.size()); - assertEquals("1", p.links.get(0).getId().toString()); - assertEquals("7", p.links.get(1).getId().toString()); - assertEquals("5", p.links.get(2).getId().toString()); - } - - @Test public void testMultipleEnds() { - Fixture f = new Fixture(); - TestTimeCost tc = new TestTimeCost(); - tc.setData(Id.create(1, Link.class), 2.0, 2.0); - tc.setData(Id.create(2, Link.class), 1.0, 1.0); - tc.setData(Id.create(3, Link.class), 3.0, 3.0); - tc.setData(Id.create(4, Link.class), 4.0, 4.0); - tc.setData(Id.create(5, Link.class), 3.0, 3.0); - tc.setData(Id.create(6, Link.class), 7.0, 7.0); - tc.setData(Id.create(7, Link.class), 4.0, 4.0); - MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); - Map fromNodes = new HashMap(); - fromNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(0.0, 0.0)); - Map toNodes = new HashMap(); - toNodes.put(f.network.getNodes().get(Id.create(4, Node.class)), new InitialNode(5.0, 5.0)); - toNodes.put(f.network.getNodes().get(Id.create(5, Node.class)), new InitialNode(4.0, 4.0)); - toNodes.put(f.network.getNodes().get(Id.create(6, Node.class)), new InitialNode(1.0, 1.0)); - - Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNotNull("no path found!", p); - assertEquals(3, p.links.size()); - assertEquals("2", p.links.get(0).getId().toString()); - assertEquals("7", p.links.get(1).getId().toString()); - assertEquals("5", p.links.get(2).getId().toString()); - - // change costs - tc.setData(Id.create(4, Link.class), 3.0, 1.0); - - p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNotNull("no path found!", p); - assertEquals(3, p.links.size()); - assertEquals("2", p.links.get(0).getId().toString()); - assertEquals("7", p.links.get(1).getId().toString()); - assertEquals("4", p.links.get(2).getId().toString()); - - // change costs again - tc.setData(Id.create(6, Link.class), 7.0, 3.0); - - p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNotNull("no path found!", p); - assertEquals(3, p.links.size()); - assertEquals("2", p.links.get(0).getId().toString()); - assertEquals("7", p.links.get(1).getId().toString()); - assertEquals("6", p.links.get(2).getId().toString()); - } - - @Test public void testMultipleStartsAndEnds() { - Fixture f = new Fixture(); - TestTimeCost tc = new TestTimeCost(); - tc.setData(Id.create(1, Link.class), 2.0, 2.0); - tc.setData(Id.create(2, Link.class), 1.0, 1.0); - tc.setData(Id.create(3, Link.class), 3.0, 3.0); - tc.setData(Id.create(4, Link.class), 4.0, 4.0); - tc.setData(Id.create(5, Link.class), 3.0, 3.0); - tc.setData(Id.create(6, Link.class), 7.0, 7.0); - tc.setData(Id.create(7, Link.class), 4.0, 4.0); - MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); - Map fromNodes = new HashMap(); - fromNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(4.0, 4.0)); - fromNodes.put(f.network.getNodes().get(Id.create(3, Node.class)), new InitialNode(3.0, 3.0)); - Map toNodes = new HashMap(); - toNodes.put(f.network.getNodes().get(Id.create(4, Node.class)), new InitialNode(5.0, 5.0)); - toNodes.put(f.network.getNodes().get(Id.create(5, Node.class)), new InitialNode(4.0, 4.0)); - toNodes.put(f.network.getNodes().get(Id.create(6, Node.class)), new InitialNode(1.0, 1.0)); - - Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNotNull("no path found!", p); - assertEquals(3, p.links.size()); - assertEquals("2", p.links.get(0).getId().toString()); - assertEquals("7", p.links.get(1).getId().toString()); - assertEquals("5", p.links.get(2).getId().toString()); - - // change costs - tc.setData(Id.create(3, Link.class), 3.0, 1.0); - tc.setData(Id.create(4, Link.class), 3.0, 1.0); - - p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNotNull("no path found!", p); - assertEquals(3, p.links.size()); - assertEquals("3", p.links.get(0).getId().toString()); - assertEquals("7", p.links.get(1).getId().toString()); - assertEquals("4", p.links.get(2).getId().toString()); - - // change costs again - tc.setData(Id.create(3, Link.class), 3.0, 4.0); - tc.setData(Id.create(6, Link.class), 7.0, 3.0); - - p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNotNull("no path found!", p); - assertEquals(3, p.links.size()); - assertEquals("2", p.links.get(0).getId().toString()); - assertEquals("7", p.links.get(1).getId().toString()); - assertEquals("6", p.links.get(2).getId().toString()); - } - - /** - * Both nodes 1 and 4 are part of the start set. Even if the path from 1 to the - * target leads over node 4, it may be faster, due to the intial cost values. - * Test that the route does not cut at node 4 as the first node backwards from - * the start set. - */ - @Test public void testStartViaFaster() { - Fixture f = new Fixture(); - TestTimeCost tc = new TestTimeCost(); - tc.setData(Id.create(1, Link.class), 2.0, 2.0); - tc.setData(Id.create(2, Link.class), 1.0, 1.0); - tc.setData(Id.create(3, Link.class), 3.0, 3.0); - tc.setData(Id.create(4, Link.class), 2.0, 2.0); - tc.setData(Id.create(5, Link.class), 1.0, 1.0); - tc.setData(Id.create(6, Link.class), 3.0, 3.0); - tc.setData(Id.create(7, Link.class), 4.0, 4.0); - MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); - Map fromNodes = new HashMap(); - fromNodes.put(f.network.getNodes().get(Id.create(1, Node.class)), new InitialNode(1.0, 1.0)); - fromNodes.put(f.network.getNodes().get(Id.create(4, Node.class)), new InitialNode(4.0, 4.0)); - Map toNodes = new HashMap(); - toNodes.put(f.network.getNodes().get(Id.create(5, Node.class)), new InitialNode(0.0, 0.0)); - - Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNotNull("no path found!", p); - assertEquals(3, p.links.size()); - assertEquals("1", p.links.get(0).getId().toString()); - assertEquals("7", p.links.get(1).getId().toString()); - assertEquals("5", p.links.get(2).getId().toString()); - } - - @Test public void testEndViaFaster() { - Fixture f = new Fixture(); - TestTimeCost tc = new TestTimeCost(); - tc.setData(Id.create(1, Link.class), 2.0, 2.0); - tc.setData(Id.create(2, Link.class), 1.0, 1.0); - tc.setData(Id.create(3, Link.class), 3.0, 3.0); - tc.setData(Id.create(4, Link.class), 2.0, 2.0); - tc.setData(Id.create(5, Link.class), 1.0, 1.0); - tc.setData(Id.create(6, Link.class), 3.0, 3.0); - tc.setData(Id.create(7, Link.class), 4.0, 4.0); - MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); - Map fromNodes = new HashMap(); - fromNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(1.0, 1.0)); - Map toNodes = new HashMap(); - toNodes.put(f.network.getNodes().get(Id.create(8, Node.class)), new InitialNode(3.0, 3.0)); - toNodes.put(f.network.getNodes().get(Id.create(5, Node.class)), new InitialNode(1.0, 1.0)); - - Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNotNull("no path found!", p); - assertEquals(3, p.links.size()); - assertEquals("2", p.links.get(0).getId().toString()); - assertEquals("7", p.links.get(1).getId().toString()); - assertEquals("5", p.links.get(2).getId().toString()); - } - - @Test public void testOnlyFromToSameNode() { - Fixture f = new Fixture(); - TestTimeCost tc = new TestTimeCost(); - tc.setData(Id.create(1, Link.class), 2.0, 2.0); - tc.setData(Id.create(2, Link.class), 1.0, 1.0); - tc.setData(Id.create(3, Link.class), 3.0, 3.0); - tc.setData(Id.create(4, Link.class), 2.0, 2.0); - tc.setData(Id.create(5, Link.class), 1.0, 1.0); - tc.setData(Id.create(6, Link.class), 3.0, 3.0); - tc.setData(Id.create(7, Link.class), 4.0, 4.0); - MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); - Map fromNodes = new HashMap(); - fromNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(1.0, 1.0)); - Map toNodes = new HashMap(); - toNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(3.0, 3.0)); - - Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNotNull("no path found!", p); - assertEquals(0, p.links.size()); - assertEquals(1, p.nodes.size()); - assertEquals("2", p.nodes.get(0).getId().toString()); - } - - /** - * Tests that a path is found if some links are in the set of start - * as well as in the set of end nodes and the path only containing - * of this node is the cheapest. - */ - @Test public void testSameNodeInFromToSetCheapest() { - Fixture f = new Fixture(); - TestTimeCost tc = new TestTimeCost(); - tc.setData(Id.create(1, Link.class), 2.0, 2.0); - tc.setData(Id.create(2, Link.class), 1.0, 1.0); - tc.setData(Id.create(3, Link.class), 3.0, 3.0); - tc.setData(Id.create(4, Link.class), 2.0, 2.0); - tc.setData(Id.create(5, Link.class), 1.0, 1.0); - tc.setData(Id.create(6, Link.class), 3.0, 3.0); - tc.setData(Id.create(7, Link.class), 4.0, 4.0); - MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); - Map fromNodes = new HashMap(); - fromNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(2.0, 2.0)); - fromNodes.put(f.network.getNodes().get(Id.create(4, Node.class)), new InitialNode(1.0, 1.0)); - Map toNodes = new HashMap(); - toNodes.put(f.network.getNodes().get(Id.create(4, Node.class)), new InitialNode(1.0, 1.0)); - toNodes.put(f.network.getNodes().get(Id.create(6, Node.class)), new InitialNode(3.0, 3.0)); - - Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNotNull("no path found!", p); - assertEquals(0, p.links.size()); - assertEquals(1, p.nodes.size()); - assertEquals("4", p.nodes.get(0).getId().toString()); - } - - /** - * Tests that a path is found if some links are in the set of start - * as well as in the set of end nodes, but the path only containing - * of this node is the not the cheapest. - */ - @Test public void testSameNodeInFromToSetNotCheapest() { - Fixture f = new Fixture(); - TestTimeCost tc = new TestTimeCost(); - tc.setData(Id.create(1, Link.class), 2.0, 2.0); - tc.setData(Id.create(2, Link.class), 1.0, 1.0); - tc.setData(Id.create(3, Link.class), 3.0, 3.0); - tc.setData(Id.create(4, Link.class), 2.0, 2.0); - tc.setData(Id.create(5, Link.class), 1.0, 1.0); - tc.setData(Id.create(6, Link.class), 3.0, 3.0); - tc.setData(Id.create(7, Link.class), 4.0, 4.0); - MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); - Map fromNodes = new HashMap(); - fromNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(2.0, 2.0)); - fromNodes.put(f.network.getNodes().get(Id.create(4, Node.class)), new InitialNode(10.0, 10.0)); - Map toNodes = new HashMap(); - toNodes.put(f.network.getNodes().get(Id.create(4, Node.class)), new InitialNode(8.0, 8.0)); - toNodes.put(f.network.getNodes().get(Id.create(6, Node.class)), new InitialNode(3.0, 3.0)); - - Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNotNull("no path found!", p); - assertEquals(3, p.links.size()); - assertEquals("2", p.links.get(0).getId().toString()); - assertEquals("7", p.links.get(1).getId().toString()); - assertEquals("6", p.links.get(2).getId().toString()); - } - - /** - * Tests that a route is found even if not all given end nodes are reachable - */ - @Test public void testSomeEndNodesNotReachable() { - Fixture f = new Fixture(); - TestTimeCost tc = new TestTimeCost(); - tc.setData(Id.create(1, Link.class), 2.0, 2.0); - tc.setData(Id.create(2, Link.class), 1.0, 1.0); - tc.setData(Id.create(3, Link.class), 3.0, 3.0); - tc.setData(Id.create(4, Link.class), 2.0, 2.0); - tc.setData(Id.create(5, Link.class), 1.0, 1.0); - tc.setData(Id.create(6, Link.class), 3.0, 3.0); - tc.setData(Id.create(7, Link.class), 4.0, 4.0); - MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); - Map fromNodes = new HashMap(); - fromNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(2.0, 2.0)); - fromNodes.put(f.network.getNodes().get(Id.create(1, Node.class)), new InitialNode(3.0, 3.0)); - Map toNodes = new HashMap(); - toNodes.put(f.network.getNodes().get(Id.create(5, Node.class)), new InitialNode(1.0, 1.0)); - toNodes.put(f.network.getNodes().get(Id.create(3, Node.class)), new InitialNode(3.0, 3.0)); // cannot be reached! - - Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNotNull("no path found!", p); - assertEquals(3, p.links.size()); - assertEquals("2", p.links.get(0).getId().toString()); - assertEquals("7", p.links.get(1).getId().toString()); - assertEquals("5", p.links.get(2).getId().toString()); - } - - /** - * Tests that a route is found even if not all given start nodes lead to an end node - */ - @Test public void testSomeStartNodesNotUseable() { - Fixture f = new Fixture(); - TestTimeCost tc = new TestTimeCost(); - tc.setData(Id.create(1, Link.class), 2.0, 2.0); - tc.setData(Id.create(2, Link.class), 1.0, 1.0); - tc.setData(Id.create(3, Link.class), 3.0, 3.0); - tc.setData(Id.create(4, Link.class), 2.0, 2.0); - tc.setData(Id.create(5, Link.class), 1.0, 1.0); - tc.setData(Id.create(6, Link.class), 3.0, 3.0); - tc.setData(Id.create(7, Link.class), 4.0, 4.0); - MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); - Map fromNodes = new HashMap(); - fromNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(2.0, 2.0)); - fromNodes.put(f.network.getNodes().get(Id.create(4, Node.class)), new InitialNode(3.0, 3.0)); // cannot lead to 5 or 6 - Map toNodes = new HashMap(); - toNodes.put(f.network.getNodes().get(Id.create(5, Node.class)), new InitialNode(1.0, 1.0)); - toNodes.put(f.network.getNodes().get(Id.create(6, Node.class)), new InitialNode(3.0, 3.0)); - - Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNotNull("no path found!", p); - assertEquals(3, p.links.size()); - assertEquals("2", p.links.get(0).getId().toString()); - assertEquals("7", p.links.get(1).getId().toString()); - assertEquals("5", p.links.get(2).getId().toString()); - } - - @Test public void testImpossibleRoute() { - Fixture f = new Fixture(); - TestTimeCost tc = new TestTimeCost(); - tc.setData(Id.create(1, Link.class), 2.0, 2.0); - tc.setData(Id.create(2, Link.class), 1.0, 1.0); - tc.setData(Id.create(3, Link.class), 3.0, 3.0); - tc.setData(Id.create(4, Link.class), 2.0, 2.0); - tc.setData(Id.create(5, Link.class), 1.0, 1.0); - tc.setData(Id.create(6, Link.class), 3.0, 3.0); - tc.setData(Id.create(7, Link.class), 4.0, 4.0); - MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); - Map fromNodes = new HashMap(); - fromNodes.put(f.network.getNodes().get(Id.create(1, Node.class)), new InitialNode(1.0, 1.0)); - Map toNodes = new HashMap(); - toNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(3.0, 3.0)); - - Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); - assertNull("wow, impossible path found!", p); - } - - /** - * Creates a simple network to be used in tests. - * - *
-	 *   (1)                       (4)
-	 *      \                     /
-	 *       \_1               4_/
-	 *        \                 /
-	 *   (2)-2-(7)-----7-----(8)-5-(5)
-	 *        /                 \
-	 *       /_3               6_\
-	 *      /                     \
-	 *   (3)                       (6)
-	 * 
- * - * @author mrieser - */ - /*package*/ static class Fixture { - /*package*/ Network network; - - public Fixture() { - this.network = NetworkUtils.createNetwork(); - Node node1 = NetworkUtils.createAndAddNode(this.network, Id.create(1, Node.class), new Coord((double) 1000, (double) 0)); - Node node2 = NetworkUtils.createAndAddNode(this.network, Id.create(2, Node.class), new Coord((double) 500, (double) 0)); - Node node3 = NetworkUtils.createAndAddNode(this.network, Id.create(3, Node.class), new Coord((double) 0, (double) 0)); - Node node4 = NetworkUtils.createAndAddNode(this.network, Id.create(4, Node.class), new Coord((double) 1000, (double) 2000)); - Node node5 = NetworkUtils.createAndAddNode(this.network, Id.create(5, Node.class), new Coord((double) 500, (double) 2000)); - Node node6 = NetworkUtils.createAndAddNode(this.network, Id.create(6, Node.class), new Coord((double) 0, (double) 2000)); - Node node7 = NetworkUtils.createAndAddNode(this.network, Id.create(7, Node.class), new Coord((double) 500, (double) 500)); - Node node8 = NetworkUtils.createAndAddNode(this.network, Id.create(8, Node.class), new Coord((double) 500, (double) 1500)); - final Node fromNode = node1; - final Node toNode = node7; - NetworkUtils.createAndAddLink(this.network,Id.create(1, Link.class), fromNode, toNode, 1000.0, 10.0, 2000.0, (double) 1 ); - final Node fromNode1 = node2; - final Node toNode1 = node7; - NetworkUtils.createAndAddLink(this.network,Id.create(2, Link.class), fromNode1, toNode1, 1000.0, 10.0, 2000.0, (double) 1 ); - final Node fromNode2 = node3; - final Node toNode2 = node7; - NetworkUtils.createAndAddLink(this.network,Id.create(3, Link.class), fromNode2, toNode2, 1000.0, 10.0, 2000.0, (double) 1 ); - final Node fromNode3 = node8; - final Node toNode3 = node4; - NetworkUtils.createAndAddLink(this.network,Id.create(4, Link.class), fromNode3, toNode3, 1000.0, 10.0, 2000.0, (double) 1 ); - final Node fromNode4 = node8; - final Node toNode4 = node5; - NetworkUtils.createAndAddLink(this.network,Id.create(5, Link.class), fromNode4, toNode4, 1000.0, 10.0, 2000.0, (double) 1 ); - final Node fromNode5 = node8; - final Node toNode5 = node6; - NetworkUtils.createAndAddLink(this.network,Id.create(6, Link.class), fromNode5, toNode5, 1000.0, 10.0, 2000.0, (double) 1 ); - final Node fromNode6 = node7; - final Node toNode6 = node8; - NetworkUtils.createAndAddLink(this.network,Id.create(7, Link.class), fromNode6, toNode6, 1000.0, 10.0, 2000.0, (double) 1 ); - } - } - - /*package*/ static class TestTimeCost implements TravelTime, TransitTravelDisutility { - - private final Map, Double> travelTimes = new HashMap<>(); - private final Map, Double> travelCosts = new HashMap<>(); - - public void setData(final Id id, final double travelTime, final double travelCost) { - this.travelTimes.put(id, Double.valueOf(travelTime)); - this.travelCosts.put(id, Double.valueOf(travelCost)); - } - - @Override - public double getLinkTravelTime(final Link link, final double time, Person person, Vehicle vehicle) { - return this.travelTimes.get(link.getId()).doubleValue(); - } - - @Override - public double getLinkTravelDisutility(final Link link, final double time, final Person person, final Vehicle vehicle, final CustomDataManager dataManager) { - return this.travelCosts.get(link.getId()).doubleValue(); - } - - @Override - public double getWalkTravelTime(Person person, Coord coord, Coord toCoord) { - return 0; - } - - @Override - public double getWalkTravelDisutility(Person person, Coord coord, Coord toCoord) { - return 0; - } - - - - } - -} diff --git a/contribs/pom.xml b/contribs/pom.xml index 90f504be8fa..9ffc2dec10e 100644 --- a/contribs/pom.xml +++ b/contribs/pom.xml @@ -74,7 +74,6 @@ dvrp ev emissions - eventsBasedPTRouter freight freightreceiver hybridsim