View Javadoc
1   package org.opentrafficsim.road.gtu.strategical;
2   
3   import java.util.LinkedHashMap;
4   import java.util.Map;
5   import java.util.Optional;
6   
7   import org.djunits.value.vdouble.scalar.Length;
8   import org.djunits.value.vdouble.scalar.Speed;
9   import org.opentrafficsim.base.parameters.ParameterException;
10  import org.opentrafficsim.base.parameters.Parameters;
11  import org.opentrafficsim.core.gtu.GtuException;
12  import org.opentrafficsim.core.gtu.GtuType;
13  import org.opentrafficsim.core.network.Node;
14  import org.opentrafficsim.core.network.route.Route;
15  import org.opentrafficsim.core.parameters.ParameterFactory;
16  import org.opentrafficsim.core.parameters.ParameterFactoryDefault;
17  import org.opentrafficsim.road.gtu.LaneBasedGtu;
18  import org.opentrafficsim.road.gtu.tactical.LaneBasedTacticalPlanner;
19  import org.opentrafficsim.road.gtu.tactical.LaneBasedTacticalPlannerFactory;
20  import org.opentrafficsim.road.network.speed.SpeedLimits;
21  
22  /**
23   * Factory for creating {@code LaneBasedStrategicalRoutePlanner} using any {@code LaneBasedTacticalPlannerFactory}.
24   * <p>
25   * Copyright (c) 2013-2026 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
26   * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
27   * </p>
28   * @author Alexander Verbraeck
29   * @author Peter Knoppers
30   * @author Wouter Schakel
31   */
32  public class LaneBasedStrategicalRoutePlannerFactory
33          implements LaneBasedStrategicalPlannerFactory<LaneBasedStrategicalRoutePlanner>
34  {
35  
36      /** Factory for tactical planners. */
37      private final LaneBasedTacticalPlannerFactory<? extends LaneBasedTacticalPlanner> tacticalPlannerFactory;
38  
39      /** Route supplier. */
40      private final RouteGenerator routeGenerator;
41  
42      /** Parameter factory. */
43      private final ParameterFactory parameterFactory;
44  
45      /** Peeked parameters. */
46      private Map<GtuType, Parameters> peekedParameters = new LinkedHashMap<>();
47  
48      /**
49       * Constructor with factory for tactical planners.
50       * @param tacticalPlannerFactory factory for tactical planners
51       */
52      public LaneBasedStrategicalRoutePlannerFactory(
53              final LaneBasedTacticalPlannerFactory<? extends LaneBasedTacticalPlanner> tacticalPlannerFactory)
54      {
55          this.tacticalPlannerFactory = tacticalPlannerFactory;
56          this.routeGenerator = RouteGenerator.NULL;
57          this.parameterFactory = new ParameterFactoryDefault();
58      }
59  
60      /**
61       * Constructor with factory for tactical planners.
62       * @param tacticalPlannerFactory factory for tactical planners
63       * @param parametersFactory factory for parameters
64       */
65      public LaneBasedStrategicalRoutePlannerFactory(
66              final LaneBasedTacticalPlannerFactory<? extends LaneBasedTacticalPlanner> tacticalPlannerFactory,
67              final ParameterFactory parametersFactory)
68      {
69          this.tacticalPlannerFactory = tacticalPlannerFactory;
70          this.routeGenerator = RouteGenerator.NULL;
71          this.parameterFactory = parametersFactory;
72      }
73  
74      /**
75       * Constructor with factory for tactical planners.
76       * @param tacticalPlannerFactory factory for tactical planners
77       * @param parametersFactory factory for parameters
78       * @param routeGenerator route supplier
79       */
80      public LaneBasedStrategicalRoutePlannerFactory(
81              final LaneBasedTacticalPlannerFactory<? extends LaneBasedTacticalPlanner> tacticalPlannerFactory,
82              final ParameterFactory parametersFactory, final RouteGenerator routeGenerator)
83      {
84          this.tacticalPlannerFactory = tacticalPlannerFactory;
85          this.parameterFactory = parametersFactory;
86          this.routeGenerator = routeGenerator;
87      }
88  
89      @Override
90      public Optional<Speed> peekDesiredSpeed(final GtuType gtuType, final SpeedLimits speedLimits, final Speed maxVehicleSpeed)
91              throws GtuException
92      {
93          return this.tacticalPlannerFactory.peekDesiredSpeed(gtuType, speedLimits, maxVehicleSpeed, peekParameters(gtuType));
94      }
95  
96      @Override
97      public Optional<Length> peekDesiredHeadway(final GtuType gtuType, final Speed speed) throws GtuException
98      {
99          return this.tacticalPlannerFactory.peekDesiredHeadway(gtuType, speed, peekParameters(gtuType));
100     }
101 
102     /**
103      * Determine or return the next parameter set.
104      * @param gtuType GTU type to generate parameters for
105      * @return next parameter set
106      * @throws GtuException on parameter exception
107      */
108     private Parameters peekParameters(final GtuType gtuType) throws GtuException
109     {
110         if (this.peekedParameters.containsKey(gtuType))
111         {
112             return this.peekedParameters.get(gtuType);
113         }
114         try
115         {
116             Parameters parameters = this.tacticalPlannerFactory.getParameters(gtuType);
117             this.parameterFactory.setValues(parameters, gtuType);
118             this.peekedParameters.put(gtuType, parameters);
119             return parameters;
120         }
121         catch (ParameterException exception)
122         {
123             throw new GtuException("Parameter was set to illegal value.", exception);
124         }
125     }
126 
127     @Override
128     public final LaneBasedStrategicalRoutePlanner create(final LaneBasedGtu gtu, final Route route, final Node origin,
129             final Node destination) throws GtuException
130     {
131         LaneBasedStrategicalRoutePlanner strategicalPlanner = new LaneBasedStrategicalRoutePlanner(
132                 this.tacticalPlannerFactory.create(gtu), route, gtu, origin, destination, this.routeGenerator);
133         gtu.setParameters(nextParameters(gtu.getType()));
134         return strategicalPlanner;
135     }
136 
137     /**
138      * Returns the parameters for the next GTU.
139      * @param gtuType GTU type of GTU to be generated
140      * @return parameters for the next GTU
141      * @throws GtuException on parameter exception
142      */
143     protected final Parameters nextParameters(final GtuType gtuType) throws GtuException
144     {
145         Parameters parameters = peekParameters(gtuType);
146         this.peekedParameters.remove(gtuType);
147         return parameters;
148     }
149 
150     @Override
151     public final String toString()
152     {
153         return "LaneBasedStrategicalRoutePlannerFactory [tacticalPlannerFactory=" + this.tacticalPlannerFactory + "]";
154     }
155 
156 }