1 package org.opentrafficsim.road.od;
2
3 import org.djunits.unit.FrequencyUnit;
4 import org.djunits.unit.TimeUnit;
5 import org.djunits.value.ValueRuntimeException;
6 import org.djunits.value.vdouble.scalar.Frequency;
7 import org.djunits.value.vdouble.scalar.Time;
8 import org.djunits.value.vdouble.vector.FrequencyVector;
9 import org.djunits.value.vdouble.vector.TimeVector;
10
11
12
13
14
15
16
17
18
19
20
21 public enum Interpolation
22 {
23
24
25 STEPWISE
26 {
27 @Override
28 Frequency interpolate(final Frequency frequency0, final Time time0, final Frequency frequency1, final Time time1,
29 final Time time)
30 {
31 return frequency0;
32 }
33
34 @Override
35 int integrate(final Frequency frequency0, final Time time0, final Frequency frequency1, final Time time1)
36 {
37 return (int) (frequency0.getInUnit(FrequencyUnit.PER_HOUR)
38 * (time1.getInUnit(TimeUnit.BASE_HOUR) - time0.getInUnit(TimeUnit.BASE_HOUR)));
39 }
40
41 @Override
42 public String toString()
43 {
44 return "STEPWISE";
45 }
46 },
47
48
49 LINEAR
50 {
51 @Override
52 Frequency interpolate(final Frequency frequency0, final Time time0, final Frequency frequency1, final Time time1,
53 final Time time)
54 {
55 return Frequency.interpolate(frequency0, frequency1, (time.si - time0.si) / (time1.si - time0.si));
56 }
57
58 @Override
59 int integrate(final Frequency frequency0, final Time time0, final Frequency frequency1, final Time time1)
60 {
61 return (int) (0.5 * (frequency0.getInUnit(FrequencyUnit.PER_HOUR) + frequency1.getInUnit(FrequencyUnit.PER_HOUR))
62 * (time1.getInUnit(TimeUnit.BASE_HOUR) - time0.getInUnit(TimeUnit.BASE_HOUR)));
63 }
64
65 @Override
66 public String toString()
67 {
68 return "LINEAR";
69 }
70 };
71
72
73
74
75
76
77
78
79
80
81 abstract Frequency interpolate(Frequency frequency0, Time time0, Frequency frequency1, Time time1, Time time);
82
83
84
85
86
87
88
89
90
91 abstract int integrate(Frequency frequency0, Time time0, Frequency frequency1, Time time1);
92
93
94
95
96 public boolean isStepWise()
97 {
98 return this.equals(STEPWISE);
99 }
100
101
102
103
104 public boolean isLinear()
105 {
106 return this.equals(LINEAR);
107 }
108
109
110
111
112
113
114
115
116
117 public final Frequency interpolateVector(final Time time, final FrequencyVector demandVector, final TimeVector timeVector,
118 final boolean sliceStart)
119 {
120 try
121 {
122
123
124
125
126
127 if (timeVector.size() == 0 || (sliceStart ? time.lt(timeVector.get(0)) : time.le(timeVector.get(0))) || (sliceStart
128 ? time.ge(timeVector.get(timeVector.size() - 1)) : time.gt(timeVector.get(timeVector.size() - 1))))
129 {
130 return new Frequency(0.0, FrequencyUnit.PER_HOUR);
131 }
132
133 for (int i = 0; i < timeVector.size() - 1; i++)
134 {
135
136
137
138 if (sliceStart ? timeVector.get(i + 1).gt(time) : timeVector.get(i + 1).ge(time))
139 {
140 return interpolate(demandVector.get(i), timeVector.get(i), demandVector.get(i + 1), timeVector.get(i + 1),
141 time);
142 }
143 }
144 }
145 catch (ValueRuntimeException ve)
146 {
147
148 throw new RuntimeException("Index out of bounds.", ve);
149 }
150
151 throw new RuntimeException("Demand interpolation failed.");
152 }
153
154 }