View Javadoc
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   * Utilities for demos, e.g. parsing.
35   * <p>
36   * Copyright (c) 2013-2018 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
37   * BSD-style license. See <a href="http://opentrafficsim.org/docs/current/license.html">OpenTrafficSim License</a>.
38   * </p>
39   * $LastChangedDate: 2015-07-24 02:58:59 +0200 (Fri, 24 Jul 2015) $, @version $Revision: 1147 $, by $Author: averbraeck $,
40   * initial version Nov 7, 2016 <br>
41   * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
42   * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
43   * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
44   */
45  public final class PropertiesParser
46  {
47      /** */
48      private PropertiesParser()
49      {
50          // private constructor; do not instantiate class
51      }
52  
53      /**
54       * Get the car following model for a GTU type, e.g. "Car" or "Truck" from the properties.
55       * @param properties the properties to parse
56       * @param gtuType the type of GTU, e.g. "Car" or "Truck"
57       * @return GTUFollowingModelOld; the car following model
58       * @throws PropertyException in case parsing fails
59       */
60      public static GTUFollowingModelOld parseGTUFollowingModelOld(final List<Property<?>> properties, final String gtuType)
61              throws PropertyException
62      {
63          // Get car-following model name
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          // Get car-following model parameter
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      * Get the lane change model from the properties.
117      * @param properties the properties to parse
118      * @return LaneChangeModel; the lane change model
119      * @throws PropertyException in case parsing fails
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      * Get the strategical planner factory from the properties.
147      * @param properties the properties to parse
148      * @param gtuFollowingModel the car following model in case it is needed
149      * @param laneChangeModel the lane change model in case it is needed
150      * @param stream random stream
151      * @return LaneBasedStrategicalPlannerFactory; the tactical planner factory
152      * @throws PropertyException in case parsing fails
153      * @throws GTUException in case LMRS Factory cannot be created
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                         // provide default parameters with the car-following model
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 }