1 package org.opentrafficsim.demo;
2
3 import java.util.List;
4
5 import org.djunits.value.vdouble.scalar.Acceleration;
6 import org.djunits.value.vdouble.scalar.Duration;
7 import org.djunits.value.vdouble.scalar.Length;
8 import org.opentrafficsim.base.modelproperties.CompoundProperty;
9 import org.opentrafficsim.base.modelproperties.Property;
10 import org.opentrafficsim.base.modelproperties.PropertyException;
11 import org.opentrafficsim.base.modelproperties.SelectionProperty;
12 import org.opentrafficsim.core.gtu.GTUException;
13 import org.opentrafficsim.road.gtu.lane.tactical.LaneBasedCFLCTacticalPlannerFactory;
14 import org.opentrafficsim.road.gtu.lane.tactical.LaneBasedGTUFollowingDirectedChangeTacticalPlannerFactory;
15 import org.opentrafficsim.road.gtu.lane.tactical.LaneBasedGTUFollowingTacticalPlannerFactory;
16 import org.opentrafficsim.road.gtu.lane.tactical.following.GTUFollowingModelOld;
17 import org.opentrafficsim.road.gtu.lane.tactical.following.IDMOld;
18 import org.opentrafficsim.road.gtu.lane.tactical.following.IDMPlusFactory;
19 import org.opentrafficsim.road.gtu.lane.tactical.following.IDMPlusOld;
20 import org.opentrafficsim.road.gtu.lane.tactical.lanechangemobil.Altruistic;
21 import org.opentrafficsim.road.gtu.lane.tactical.lanechangemobil.Egoistic;
22 import org.opentrafficsim.road.gtu.lane.tactical.lanechangemobil.LaneChangeModel;
23 import org.opentrafficsim.road.gtu.lane.tactical.lmrs.DefaultLMRSPerceptionFactory;
24 import org.opentrafficsim.road.gtu.lane.tactical.lmrs.LMRSFactory;
25 import org.opentrafficsim.road.gtu.lane.tactical.toledo.ToledoFactory;
26 import org.opentrafficsim.road.gtu.strategical.LaneBasedStrategicalPlanner;
27 import org.opentrafficsim.road.gtu.strategical.LaneBasedStrategicalPlannerFactory;
28 import org.opentrafficsim.road.gtu.strategical.route.LaneBasedStrategicalRoutePlannerFactory;
29 import org.opentrafficsim.road.modelproperties.IDMPropertySet;
30
31 import nl.tudelft.simulation.jstats.streams.StreamInterface;
32
33
34
35
36
37
38
39
40
41
42
43
44
45 public final class PropertiesParser
46 {
47
48 private PropertiesParser()
49 {
50
51 }
52
53
54
55
56
57
58
59
60 public static GTUFollowingModelOld parseGTUFollowingModelOld(final List<Property<?>> properties, final String gtuType)
61 throws PropertyException
62 {
63
64 String carFollowingModelName = null;
65 CompoundProperty propertyContainer = new CompoundProperty("", "", "", properties, false, 0);
66 Property<?> cfmp = propertyContainer.findByKey("CarFollowingModel");
67 if (null == cfmp)
68 {
69 throw new PropertyException("Cannot find \"Car following model\" property");
70 }
71 if (cfmp instanceof SelectionProperty)
72 {
73 carFollowingModelName = ((SelectionProperty) cfmp).getValue();
74 }
75 else
76 {
77 throw new Error("\"Car following model\" property has wrong type");
78 }
79
80
81 for (Property<?> ap : new CompoundProperty("", "", "", properties, false, 0))
82 {
83 if (ap instanceof CompoundProperty)
84 {
85 CompoundProperty cp = (CompoundProperty) ap;
86 if (ap.getKey().contains("IDM"))
87 {
88 Acceleration a = IDMPropertySet.getA(cp);
89 Acceleration b = IDMPropertySet.getB(cp);
90 Length s0 = IDMPropertySet.getS0(cp);
91 Duration tSafe = IDMPropertySet.getTSafe(cp);
92 GTUFollowingModelOld gtuFollowingModel = null;
93 if (carFollowingModelName.equals("IDM"))
94 {
95 gtuFollowingModel = new IDMOld(a, b, s0, tSafe, 1.0);
96 }
97 else if (carFollowingModelName.equals("IDM+"))
98 {
99 gtuFollowingModel = new IDMPlusOld(a, b, s0, tSafe, 1.0);
100 }
101 else
102 {
103 throw new PropertyException("Unknown gtu following model: " + carFollowingModelName);
104 }
105 if (ap.getKey().contains(gtuType))
106 {
107 return gtuFollowingModel;
108 }
109 }
110 }
111 }
112 throw new PropertyException("Cannot determine GTU following model for GTU type " + gtuType);
113 }
114
115
116
117
118
119
120
121 public static LaneChangeModel parseLaneChangeModel(final List<Property<?>> properties) throws PropertyException
122 {
123 CompoundProperty propertyContainer = new CompoundProperty("", "", "", properties, false, 0);
124 Property<?> cfmp = propertyContainer.findByKey("LaneChanging");
125 if (null == cfmp)
126 {
127 throw new PropertyException("Cannot find \"Lane changing\" property");
128 }
129 if (cfmp instanceof SelectionProperty)
130 {
131 String laneChangeModelName = ((SelectionProperty) cfmp).getValue();
132 if ("Egoistic".equals(laneChangeModelName))
133 {
134 return new Egoistic();
135 }
136 else if ("Altruistic".equals(laneChangeModelName))
137 {
138 return new Altruistic();
139 }
140 throw new PropertyException("Lane changing " + laneChangeModelName + " not implemented");
141 }
142 throw new PropertyException("\"Lane changing\" property has wrong type");
143 }
144
145
146
147
148
149
150
151
152
153
154
155 public static LaneBasedStrategicalPlannerFactory<LaneBasedStrategicalPlanner> parseStrategicalPlannerFactory(
156 final List<Property<?>> properties, final GTUFollowingModelOld gtuFollowingModel,
157 final LaneChangeModel laneChangeModel, final StreamInterface stream) throws PropertyException, GTUException
158 {
159 for (Property<?> ap : new CompoundProperty("", "", "", properties, false, 0))
160 {
161 if (ap instanceof SelectionProperty)
162 {
163 SelectionProperty sp = (SelectionProperty) ap;
164 if ("TacticalPlanner".equals(sp.getKey()))
165 {
166 String tacticalPlannerName = sp.getValue();
167 if ("IDM".equals(tacticalPlannerName))
168 {
169 return new LaneBasedStrategicalRoutePlannerFactory(
170 new LaneBasedGTUFollowingTacticalPlannerFactory(gtuFollowingModel));
171 }
172 else if ("MOBIL/IDM".equals(tacticalPlannerName))
173 {
174 return new LaneBasedStrategicalRoutePlannerFactory(
175 new LaneBasedCFLCTacticalPlannerFactory(gtuFollowingModel, laneChangeModel));
176 }
177 else if ("DIRECTED/IDM".equals(tacticalPlannerName))
178 {
179 return new LaneBasedStrategicalRoutePlannerFactory(
180 new LaneBasedGTUFollowingDirectedChangeTacticalPlannerFactory(gtuFollowingModel));
181 }
182 else if ("LMRS".equals(tacticalPlannerName))
183 {
184
185 return new LaneBasedStrategicalRoutePlannerFactory(
186 new LMRSFactory(new IDMPlusFactory(stream), new DefaultLMRSPerceptionFactory()));
187 }
188 else if ("Toledo".equals(tacticalPlannerName))
189 {
190 return new LaneBasedStrategicalRoutePlannerFactory(new ToledoFactory());
191 }
192 else
193 {
194 throw new PropertyException("Don't know how to create a " + tacticalPlannerName + " tactical planner");
195 }
196 }
197 }
198 }
199 throw new PropertyException("No TacticalPlanner key found in the properties");
200 }
201
202 }