1   package org.opentrafficsim.road.gtu.lane.tactical.lmrs;
2   
3   import java.util.function.Predicate;
4   
5   import org.djunits.value.vdouble.scalar.Length;
6   import org.djunits.value.vdouble.scalar.Speed;
7   import org.opentrafficsim.base.parameters.ParameterException;
8   import org.opentrafficsim.base.parameters.Parameters;
9   import org.opentrafficsim.core.gtu.GTUException;
10  import org.opentrafficsim.core.gtu.plan.operational.OperationalPlanException;
11  import org.opentrafficsim.core.network.LongitudinalDirectionality;
12  import org.opentrafficsim.core.network.OTSLink;
13  import org.opentrafficsim.core.network.route.Route;
14  import org.opentrafficsim.road.gtu.lane.LaneBasedGTU;
15  import org.opentrafficsim.road.gtu.lane.perception.FilteredIterable;
16  import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
17  import org.opentrafficsim.road.gtu.lane.perception.RelativeLane;
18  import org.opentrafficsim.road.gtu.lane.perception.headway.HeadwayLaneBasedObject;
19  import org.opentrafficsim.road.gtu.lane.plan.operational.SimpleOperationalPlan;
20  import org.opentrafficsim.road.gtu.lane.tactical.following.CarFollowingModel;
21  import org.opentrafficsim.road.network.speed.SpeedLimitInfo;
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  public interface AccelerationIncentive
34  {
35  
36      
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51      void accelerate(SimpleOperationalPlan simplePlan, RelativeLane lane, Length mergeDistance, LaneBasedGTU gtu,
52              LanePerception perception, CarFollowingModel carFollowingModel, Speed speed, Parameters params,
53              SpeedLimitInfo speedLimitInfo) throws OperationalPlanException, ParameterException, GTUException;
54  
55      
56  
57  
58  
59  
60  
61  
62  
63      default <T extends HeadwayLaneBasedObject> Iterable<T> onRoute(final Iterable<T> iterable, final LaneBasedGTU gtu)
64      {
65          Route route = gtu.getStrategicalPlanner().getRoute();
66          return new FilteredIterable<>(iterable, new Predicate<T>()
67          {
68              
69              @Override
70              public boolean test(final T t)
71              {
72                  if (route == null)
73                  {
74                      return true; 
75                  }
76                  OTSLink link = t.getLane().getParentLink();
77                  if (route.contains(link.getStartNode()) && route.contains(link.getEndNode()))
78                  {
79                      LongitudinalDirectionality dir = link.getDirectionality(gtu.getGTUType());
80                      if (dir.isNone())
81                      {
82                          return false;
83                      }
84                      if (dir.isBoth())
85                      {
86                          return Math.abs(route.indexOf(link.getStartNode()) - route.indexOf(link.getEndNode())) == 1;
87                      }
88                      if (dir.isForward())
89                      {
90                          return route.indexOf(link.getEndNode()) - route.indexOf(link.getStartNode()) == 1;
91                      }
92                      return route.indexOf(link.getStartNode()) - route.indexOf(link.getEndNode()) == 1;
93                  }
94                  return false;
95              }
96          });
97      }
98  
99  }