MATSIM
AbstractNetworkRoute.java
Go to the documentation of this file.
1 package org.matsim.core.population.routes;
2 
3 import org.matsim.api.core.v01.Id;
8 
9 import java.util.List;
10 
14 public abstract class AbstractNetworkRoute implements NetworkRoute, Cloneable {
15 
16  private double distance = Double.NaN;
17  private double travelCost = Double.NaN;
18  private double travelTime = Double.NaN; // NaN means undefined
19  private int startLinkIndex = -1;
20  private int endLinkIndex = -1;
22 
24  try {
25  return (AbstractNetworkRoute) super.clone();
26  } catch (CloneNotSupportedException e) {
27  throw new RuntimeException(e);
28  }
29  }
30 
31  @Override
32  public double getDistance() {
33  return this.distance;
34  }
35 
36  @Override
37  public void setDistance(double distance) {
38  this.distance = distance;
39  }
40 
41  @Override
42  public double getTravelCost() {
43  return this.travelCost;
44  }
45 
46  @Override
47  public void setTravelCost(double travelCost) {
48  this.travelCost = travelCost;
49  }
50 
51  @Override
53  return Double.isNaN(this.travelTime) ? OptionalTime.undefined() : OptionalTime.defined(this.travelTime);
54  }
55 
56  @Override
57  public void setTravelTime(double travelTime) {
58  this.travelTime = travelTime;
59  }
60 
61  @Override
62  public void setTravelTimeUndefined() {
63  this.travelTime = Double.NaN;
64  }
65 
66  @Override
68  return this.startLinkIndex < 0 ? null : Id.get(this.startLinkIndex, Link.class);
69  }
70 
71  @Override
72  public void setStartLinkId(Id<Link> linkId) {
73  this.startLinkIndex = linkId == null ? -1 : linkId.index();
74  }
75 
76  @Override
78  return this.endLinkIndex < 0 ? null : Id.get(this.endLinkIndex, Link.class);
79  }
80 
81  @Override
82  public void setEndLinkId(Id<Link> linkId) {
83  this.endLinkIndex = linkId == null ? -1 : linkId.index();
84  }
85 
86  @Override
87  public NetworkRoute getSubRoute(Id<Link> fromLinkId, Id<Link> toLinkId) {
88  /*
89  * the index where the link after fromLinkId can be found in the route:
90  * fromIndex==0 --> fromLinkId == startLinkId,
91  * fromIndex==1 --> fromLinkId == first link in the route, etc.
92  */
93  int fromIndex = -1;
94  /*
95  * the index where toLinkId can be found in the route
96  */
97  int toIndex = -1;
98 
99  List<Id<Link>> route = this.getLinkIds();
100 
101  if (fromLinkId.equals(this.getStartLinkId())) {
102  fromIndex = 0;
103  } else {
104  for (int i = 0, n = route.size(); (i < n) && (fromIndex < 0); i++) {
105  if (fromLinkId.equals(route.get(i))) {
106  fromIndex = i+1;
107  }
108  }
109  if (fromIndex < 0 && fromLinkId.equals(this.getEndLinkId())) {
110  fromIndex = route.size();
111  }
112  if (fromIndex < 0) {
113  throw new IllegalArgumentException("Cannot create subroute because fromLinkId is not part of the route.");
114  }
115  }
116 
117  if (fromLinkId.equals(toLinkId)) {
118  toIndex = fromIndex - 1;
119  } else {
120  for (int i = fromIndex, n = route.size(); (i < n) && (toIndex < 0); i++) {
121  if (fromLinkId.equals(route.get(i))) {
122  fromIndex = i+1; // in case of a loop, cut it short
123  }
124  if (toLinkId.equals(route.get(i))) {
125  toIndex = i;
126  }
127  }
128  if (toIndex < 0 && toLinkId.equals(this.getEndLinkId())) {
129  toIndex = route.size();
130  }
131  if (toIndex < 0) {
132  throw new IllegalArgumentException("Cannot create subroute because toLinkId is not part of the route.");
133  }
134  }
135  NetworkRoute ret = RouteUtils.createLinkNetworkRouteImpl(fromLinkId, toLinkId);
136  if (toIndex > fromIndex) {
137  ret.setLinkIds(fromLinkId, route.subList(fromIndex, toIndex), toLinkId);
138  } else {
139  ret.setLinkIds(fromLinkId, null, toLinkId);
140  }
141  return ret;
142  }
143 
144  @Override
146  return this.vehicleId;
147  }
148 
149  @Override
150  public void setVehicleId(Id<Vehicle> vehicleId) {
151  this.vehicleId = vehicleId;
152  }
153 
154  @Override
155  public String getRouteDescription() {
156  StringBuilder desc = new StringBuilder(100);
157  desc.append(this.getStartLinkId().toString());
158  for (Id<Link> linkId : this.getLinkIds()) {
159  desc.append(" ");
160  desc.append(linkId.toString());
161  }
162  // If the start links equals the end link additionally check if its is a round trip.
163  if (!this.getEndLinkId().equals(this.getStartLinkId()) || this.getLinkIds().size() > 0) {
164  desc.append(" ");
165  desc.append(this.getEndLinkId().toString());
166  }
167  return desc.toString();
168  }
169 
170  @Override
171  public void setRouteDescription(String routeDescription) {
172  List<Id<Link>> linkIds = NetworkUtils.getLinkIds(routeDescription);
173  Id<Link> startLinkId = getStartLinkId();
174  Id<Link> endLinkId = getEndLinkId();
175  if (linkIds.size() > 0) {
176  startLinkId = linkIds.remove(0);
177  setStartLinkId(startLinkId);
178  }
179  if (linkIds.size() > 0) {
180  endLinkId = linkIds.remove(linkIds.size() - 1);
181  setEndLinkId(endLinkId);
182  }
183  this.setLinkIds(startLinkId, linkIds, endLinkId);
184  }
185 
186  @Override
187  public String getRouteType() {
188  return "links";
189  }
190 
191 }
static< T > Id< T > get(int index, final Class< T > type)
Definition: Id.java:112
static NetworkRoute createLinkNetworkRouteImpl(Id< Link > startLinkId, Id< Link > endLinkId)
static OptionalTime defined(double seconds)
static List< Id< Link > > getLinkIds(final String links)
NetworkRoute getSubRoute(Id< Link > fromLinkId, Id< Link > toLinkId)
boolean equals(Object obj)
Definition: Id.java:139
void setLinkIds(final Id< Link > startLinkId, final List< Id< Link >> linkIds, final Id< Link > endLinkId)