1
1
package org .hisrc .gtfs .graph .builder .jgrapht ;
2
2
3
+ import java .util .HashSet ;
4
+ import java .util .Set ;
5
+
3
6
import org .hisrc .gtfs .graph .builder .GraphBuilder ;
4
- import org .hisrc .gtfs .graph .model .edge .ArrivalDepartureEdge ;
7
+ import org .hisrc .gtfs .graph .model .edge .BoardEdge ;
5
8
import org .hisrc .gtfs .graph .model .edge .ChildParentEdge ;
6
- import org .hisrc .gtfs .graph .model .edge .DepartureArrivalEdge ;
7
9
import org .hisrc .gtfs .graph .model .edge .ParentChildEdge ;
10
+ import org .hisrc .gtfs .graph .model .edge .RideEdge ;
11
+ import org .hisrc .gtfs .graph .model .edge .StayEdge ;
8
12
import org .hisrc .gtfs .graph .model .edge .TransitionEdge ;
9
- import org .hisrc .gtfs .graph .model .vertex .ArrivalVertex ;
10
- import org .hisrc .gtfs .graph .model .vertex .DepartureVertex ;
13
+ import org .hisrc .gtfs .graph .model .edge .UnboardEdge ;
11
14
import org .hisrc .gtfs .graph .model .vertex .ParentStationVertex ;
15
+ import org .hisrc .gtfs .graph .model .vertex .StopTimeVertex ;
12
16
import org .hisrc .gtfs .graph .model .vertex .TemporalVertex ;
17
+ import org .hisrc .gtfs .graph .model .vertex .TripStopArrivalVertex ;
18
+ import org .hisrc .gtfs .graph .model .vertex .TripStopDepartureVertex ;
13
19
import org .jgrapht .DirectedGraph ;
14
20
import org .jgrapht .EdgeFactory ;
15
21
import org .jgrapht .graph .DirectedMultigraph ;
16
22
import org .onebusaway .gtfs .model .Stop ;
23
+ import org .onebusaway .gtfs .model .StopTime ;
24
+ import org .onebusaway .gtfs .model .Trip ;
17
25
import org .slf4j .Logger ;
18
26
import org .slf4j .LoggerFactory ;
19
27
20
28
public class JGraphTGraphBuilder implements GraphBuilder {
21
29
30
+ private Logger logger = LoggerFactory .getLogger (JGraphTGraphBuilder .class );
31
+
22
32
private DirectedGraph <TemporalVertex , TransitionEdge > graph = new DirectedMultigraph <TemporalVertex , TransitionEdge >(
23
33
new EdgeFactory <TemporalVertex , TransitionEdge >() {
24
34
@ Override
@@ -28,32 +38,73 @@ public TransitionEdge createEdge(TemporalVertex start,
28
38
}
29
39
});
30
40
31
- private Logger logger = LoggerFactory .getLogger (JGraphTGraphBuilder .class );
32
-
33
41
public TemporalVertex addParentStationVertex (Stop stop , int time ) {
34
42
final ParentStationVertex vertex = new ParentStationVertex (stop , time );
35
43
graph .addVertex (vertex );
36
44
return vertex ;
37
45
}
38
46
39
- public TemporalVertex addArrivalVertex (final Stop stop ,
40
- final int arrivalTime ) {
41
- final TemporalVertex arrivalNode = new ArrivalVertex (stop , arrivalTime );
42
- graph .addVertex (arrivalNode );
43
- return arrivalNode ;
47
+ @ Override
48
+ public TemporalVertex addTripStopArrivalVertex (StopTime stopTime ) {
49
+ final TemporalVertex vertex = new TripStopArrivalVertex (
50
+ stopTime .getTrip (), stopTime .getStop (),
51
+ stopTime .getArrivalTime ());
52
+ graph .addVertex (vertex );
53
+ return vertex ;
54
+ }
55
+
56
+ private Trip lastTrip = null ;
57
+ private TemporalVertex lastTripStopDepartureVertex = null ;
58
+ private int lastStopSequence = -1 ;
59
+
60
+ @ Override
61
+ public TemporalVertex addTripStopDepartureVertex (StopTime stopTime ) {
62
+ final TemporalVertex vertex = new TripStopDepartureVertex (
63
+ stopTime .getTrip (), stopTime .getStop (),
64
+ stopTime .getDepartureTime ());
65
+ graph .addVertex (vertex );
66
+
67
+ lastTrip = stopTime .getTrip ();
68
+ lastTripStopDepartureVertex = vertex ;
69
+ lastStopSequence = stopTime .getStopSequence ();
70
+ return vertex ;
71
+ }
72
+
73
+ private Set <Trip > processedTrips = new HashSet <Trip >();
74
+
75
+ @ Override
76
+ public TemporalVertex findPreviousTripStopDepartureVertex (StopTime stopTime ) {
77
+ final Trip trip = stopTime .getTrip ();
78
+ final int stopSequence = stopTime .getStopSequence ();
79
+ final TemporalVertex previousDepartureNode ;
80
+ if (trip == lastTrip ) {
81
+ if (stopSequence <= lastStopSequence ) {
82
+ throw new IllegalStateException (
83
+ "Stop sequence must be greater than the last stop sequence." );
84
+ } else {
85
+ previousDepartureNode = lastTripStopDepartureVertex ;
86
+ }
87
+ } else {
88
+ if (processedTrips .contains (trip )) {
89
+ throw new IllegalStateException (
90
+ "Trip was already processed and now appears again." );
91
+ } else {
92
+ processedTrips .add (lastTrip );
93
+ previousDepartureNode = null ;
94
+ }
95
+ }
96
+ return previousDepartureNode ;
44
97
}
45
98
46
- public TemporalVertex addDepartureVertex (final Stop stop ,
47
- final int departureTime ) {
48
- final TemporalVertex departureNode = new DepartureVertex (stop ,
49
- departureTime );
50
- graph .addVertex (departureNode );
51
- return departureNode ;
99
+ @ Override
100
+ public TemporalVertex addStopTimeVertex (Stop stop , int time ) {
101
+ final TemporalVertex vertex = new StopTimeVertex (stop , time );
102
+ graph .addVertex (vertex );
103
+ return vertex ;
52
104
}
53
105
54
106
public TransitionEdge addParentChildEdge (final TemporalVertex childVertex ,
55
107
final TemporalVertex parentVertex ) {
56
- // logger.info("Adding [" + parentVertex + "-pc->" + childVertex + "]");
57
108
final ParentChildEdge edge = new ParentChildEdge ();
58
109
graph .addEdge (parentVertex , childVertex , edge );
59
110
@@ -62,26 +113,39 @@ public TransitionEdge addParentChildEdge(final TemporalVertex childVertex,
62
113
63
114
public TransitionEdge addChildParentEdge (final TemporalVertex childVertex ,
64
115
final TemporalVertex parentVertex ) {
65
- // logger.info("Adding [" + childVertex + "-cp->" + parentVertex + "]");
66
116
ChildParentEdge edge = new ChildParentEdge ();
67
117
graph .addEdge (childVertex , parentVertex , edge );
68
118
return edge ;
69
119
}
70
120
71
- public TransitionEdge addArrivalDepartureEdge (
72
- final TemporalVertex arrivalVertex ,
121
+ public TransitionEdge addStayEdge (final TemporalVertex arrivalVertex ,
73
122
final TemporalVertex departureVertex , int cost ) {
74
- // logger.info("Adding [" + arrivalNode + "-" + departureNode + "]");
75
- final TransitionEdge edge = new ArrivalDepartureEdge (cost );
123
+ final TransitionEdge edge = new StayEdge (cost );
76
124
graph .addEdge (arrivalVertex , departureVertex , edge );
77
125
return edge ;
78
126
}
79
127
80
- public TransitionEdge addDepartureArrivalEdge (
81
- final TemporalVertex departureVertex ,
128
+ public TransitionEdge addRideEdge (final TemporalVertex departureVertex ,
82
129
final TemporalVertex arrivalVertex , final int cost ) {
83
- final TransitionEdge edge = new DepartureArrivalEdge (cost );
130
+ final TransitionEdge edge = new RideEdge (cost );
84
131
graph .addEdge (departureVertex , arrivalVertex , edge );
85
132
return edge ;
86
133
}
134
+
135
+ @ Override
136
+ public TransitionEdge addBoardEdge (TemporalVertex departureStopTimeVertex ,
137
+ TemporalVertex departureVertex ) {
138
+ final TransitionEdge edge = new BoardEdge ();
139
+ graph .addEdge (departureStopTimeVertex , departureVertex , edge );
140
+ return edge ;
141
+ }
142
+
143
+ @ Override
144
+ public TransitionEdge addUnboardEdge (TemporalVertex arrivalVertex ,
145
+ TemporalVertex arrivalStopTimeVertex ) {
146
+ final TransitionEdge edge = new UnboardEdge ();
147
+ graph .addEdge (arrivalVertex , arrivalStopTimeVertex , edge );
148
+ return edge ;
149
+ }
150
+
87
151
}
0 commit comments