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