1 package org.opentrafficsim.road.gtu.lane.perception.mental;
2
3 import static org.opentrafficsim.base.parameters.constraint.NumericConstraint.POSITIVE;
4 import static org.opentrafficsim.base.parameters.constraint.NumericConstraint.POSITIVEZERO;
5
6 import java.util.Optional;
7
8 import org.djunits.value.vdouble.scalar.Duration;
9 import org.djutils.exceptions.Throw;
10 import org.opentrafficsim.base.parameters.ParameterException;
11 import org.opentrafficsim.base.parameters.ParameterTypeDouble;
12 import org.opentrafficsim.base.parameters.ParameterTypeDuration;
13 import org.opentrafficsim.base.parameters.ParameterTypes;
14 import org.opentrafficsim.base.parameters.Parameters;
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 public class AdaptationSituationalAwareness implements BehavioralAdaptation
35 {
36
37
38 public static final ParameterTypeDouble SA = new ParameterTypeDouble("SA", "Situational awareness", 1.0, POSITIVEZERO);
39
40
41 public static final ParameterTypeDouble SA_MIN =
42 new ParameterTypeDouble("SAmin", "Min. situational awareness", 0.5, POSITIVE)
43 {
44 @Override
45 public void check(final Double value, final Parameters params) throws ParameterException
46 {
47 Optional<Double> saMax = params.getOptionalParameter(SA_MAX);
48 Throw.when(saMax.isPresent() && value > saMax.get(), ParameterException.class,
49 "Value for SA_MIN should not be larger than SA_MAX.");
50 }
51 };
52
53
54 public static final ParameterTypeDouble SA_MAX =
55 new ParameterTypeDouble("SAmax", "Max. situational awareness", 1.0, POSITIVE)
56 {
57 @Override
58 public void check(final Double value, final Parameters params) throws ParameterException
59 {
60 Optional<Double> saMin = params.getOptionalParameter(SA_MIN);
61 Throw.when(saMin.isPresent() && value < saMin.get(), ParameterException.class,
62 "Value for SA_MAX should not be larger than SA_MIN.");
63 }
64 };
65
66
67 public static final ParameterTypeDuration TR_MAX =
68 new ParameterTypeDuration("TRmax", "Maximum reaction time", Duration.ofSI(2.0), POSITIVE);
69
70
71
72
73 public AdaptationSituationalAwareness()
74 {
75
76 }
77
78 @Override
79 public void adapt(final Parameters parameters) throws ParameterException
80 {
81
82 double taskSaturation = parameters.getParameter(Fuller.TS);
83 double tsCrit = parameters.getOptionalParameter(SumFuller.TS_CRIT).orElse(1.0);
84 double tsMax = parameters.getParameter(SumFuller.TS_MAX);
85 double saMin = parameters.getParameter(SA_MIN);
86 double saMax = parameters.getParameter(SA_MAX);
87 double sa = taskSaturation < tsCrit ? saMax
88 : (taskSaturation >= tsMax ? saMin : saMax - (saMax - saMin) * (taskSaturation - tsCrit) / (tsMax - tsCrit));
89 parameters.setClaimedParameter(SA, sa, this);
90
91
92 parameters.setParameter(FactorEstimation.EST_FACTOR, 1.0 + parameters.getParameter(Fuller.OVER_EST) * (saMax - sa));
93
94
95 parameters.setParameter(ParameterTypes.TR, parameters.getParameter(TR_MAX).times(saMax - sa));
96 }
97
98 }