1 package org.opentrafficsim.core.network.factory.xml.units;
2
3 import org.djunits.unit.DurationUnit;
4 import org.djunits.unit.LengthUnit;
5 import org.djunits.unit.PositionUnit;
6 import org.djunits.unit.SpeedUnit;
7 import org.djunits.unit.TimeUnit;
8 import org.djunits.value.vdouble.scalar.Duration;
9 import org.djunits.value.vdouble.scalar.Length;
10 import org.djunits.value.vdouble.scalar.Position;
11 import org.djunits.value.vdouble.scalar.Speed;
12 import org.djunits.value.vdouble.scalar.Time;
13 import org.opentrafficsim.core.network.NetworkException;
14 import org.opentrafficsim.core.units.distributions.ContinuousDistDoubleScalar;
15
16 import nl.tudelft.simulation.jstats.distributions.DistBeta;
17 import nl.tudelft.simulation.jstats.distributions.DistConstant;
18 import nl.tudelft.simulation.jstats.distributions.DistContinuous;
19 import nl.tudelft.simulation.jstats.distributions.DistErlang;
20 import nl.tudelft.simulation.jstats.distributions.DistExponential;
21 import nl.tudelft.simulation.jstats.distributions.DistGamma;
22 import nl.tudelft.simulation.jstats.distributions.DistLogNormal;
23 import nl.tudelft.simulation.jstats.distributions.DistNormal;
24 import nl.tudelft.simulation.jstats.distributions.DistPearson5;
25 import nl.tudelft.simulation.jstats.distributions.DistPearson6;
26 import nl.tudelft.simulation.jstats.distributions.DistTriangular;
27 import nl.tudelft.simulation.jstats.distributions.DistUniform;
28 import nl.tudelft.simulation.jstats.distributions.DistWeibull;
29 import nl.tudelft.simulation.jstats.streams.MersenneTwister;
30 import nl.tudelft.simulation.jstats.streams.StreamInterface;
31
32
33
34
35
36
37
38
39
40
41 public final class Distributions
42 {
43
44 private Distributions()
45 {
46
47 }
48
49
50 private static final StreamInterface STREAM = new MersenneTwister(2L);
51
52
53
54
55
56
57 private static double[] parseDoubleArgs(final String s)
58 {
59 String[] ss = s.split(",");
60 double[] d = new double[ss.length];
61 for (int i = 0; i < ss.length; i++)
62 {
63 d[i] = Double.parseDouble(ss[i]);
64 }
65 return d;
66 }
67
68
69
70
71
72
73
74
75 private static DistContinuous makeDistContinuous(final String ds, final double[] args) throws NetworkException
76 {
77 try
78 {
79 switch (ds)
80 {
81 case "CONST":
82 case "CONSTANT":
83 return new DistConstant(STREAM, args[0]);
84
85 case "EXPO":
86 case "EXPONENTIAL":
87 return new DistExponential(STREAM, args[0]);
88
89 case "TRIA":
90 case "TRIANGULAR":
91 return new DistTriangular(STREAM, args[0], args[1], args[2]);
92
93 case "NORM":
94 case "NORMAL":
95 return new DistNormal(STREAM, args[0], args[1]);
96
97 case "BETA":
98 return new DistBeta(STREAM, args[0], args[1]);
99
100 case "ERLANG":
101 return new DistErlang(STREAM, (int) args[0], args[1]);
102
103 case "GAMMA":
104 return new DistGamma(STREAM, args[0], args[1]);
105
106 case "LOGN":
107 case "LOGNORMAL":
108 return new DistLogNormal(STREAM, args[0], args[1]);
109
110 case "PEARSON5":
111 return new DistPearson5(STREAM, args[0], args[1]);
112
113 case "PEARSON6":
114 return new DistPearson6(STREAM, args[0], args[1], args[2]);
115
116 case "UNIF":
117 case "UNIFORM":
118 return new DistUniform(STREAM, args[0], args[1]);
119
120 case "WEIB":
121 case "WEIBULL":
122 return new DistWeibull(STREAM, args[0], args[1]);
123
124 default:
125 throw new NetworkException("makeDistContinuous - unknown distribution function " + ds);
126 }
127 }
128 catch (IndexOutOfBoundsException e)
129 {
130 throw new NetworkException("makeDistContinuous - wrong number of parameters for distribution function " + ds);
131 }
132 }
133
134
135
136
137
138
139
140 public static ContinuousDistDoubleScalar.Rel<Length, LengthUnit> parseLengthDist(final String s) throws NetworkException
141 {
142 String[] s1 = s.split("\\(");
143 String ds = s1[0];
144 String[] s2 = s1[1].split("\\)");
145 String unit = LengthUnits.parseLengthUnit(s2[1]);
146 double[] args = parseDoubleArgs(s2[0]);
147 DistContinuous dist = makeDistContinuous(ds, args);
148 return new ContinuousDistDoubleScalar.Rel<Length, LengthUnit>(dist, LengthUnits.LENGTH_UNITS.get(unit));
149 }
150
151
152
153
154
155
156
157 public static ContinuousDistDoubleScalar.Abs<Position, PositionUnit, LengthUnit> parsePositionDist(final String s)
158 throws NetworkException
159 {
160 String[] s1 = s.split("\\(");
161 String ds = s1[0];
162 String[] s2 = s1[1].split("\\)");
163 String unit = LengthUnits.parseLengthUnit(s2[1]);
164 double[] args = parseDoubleArgs(s2[0]);
165 DistContinuous dist = makeDistContinuous(ds, args);
166 return new ContinuousDistDoubleScalar.Abs<Position, PositionUnit, LengthUnit>(dist,
167 PositionUnits.POSITION_UNITS.get(unit));
168 }
169
170
171
172
173
174
175
176 public static ContinuousDistDoubleScalar.Rel<Duration, DurationUnit> parseDurationDist(final String s)
177 throws NetworkException
178 {
179 String[] s1 = s.split("\\(");
180 String ds = s1[0];
181 String[] s2 = s1[1].split("\\)");
182 String unit = DurationUnits.parseDurationUnit(s2[1]);
183 double[] args = parseDoubleArgs(s2[0]);
184 DistContinuous dist = makeDistContinuous(ds, args);
185 return new ContinuousDistDoubleScalar.Rel<Duration, DurationUnit>(dist, DurationUnits.DURATION_UNITS.get(unit));
186 }
187
188
189
190
191
192
193
194 public static ContinuousDistDoubleScalar.Abs<Time, TimeUnit, DurationUnit> parseTimeDist(final String s)
195 throws NetworkException
196 {
197 String[] s1 = s.split("\\(");
198 String ds = s1[0];
199 String[] s2 = s1[1].split("\\)");
200 String unit = TimeUnits.parseTimeUnit(s2[1]);
201 double[] args = parseDoubleArgs(s2[0]);
202 DistContinuous dist = makeDistContinuous(ds, args);
203 return new ContinuousDistDoubleScalar.Abs<Time, TimeUnit, DurationUnit>(dist, TimeUnits.TIME_UNITS.get(unit));
204 }
205
206
207
208
209
210
211
212 public static ContinuousDistDoubleScalar.Rel<Speed, SpeedUnit> parseSpeedDist(final String s) throws NetworkException
213 {
214 String[] s1 = s.split("\\(");
215 String ds = s1[0];
216 String[] s2 = s1[1].split("\\)");
217 String unit = SpeedUnits.parseSpeedUnit(s2[1]);
218 double[] args = parseDoubleArgs(s2[0]);
219 DistContinuous dist = makeDistContinuous(ds, args);
220 return new ContinuousDistDoubleScalar.Rel<Speed, SpeedUnit>(dist, SpeedUnits.SPEED_UNITS.get(unit));
221 }
222
223 }