1 package org.opentrafficsim.core.units.distributions;
2
3 import java.io.Serializable;
4
5 import org.djunits.unit.AbsoluteLinearUnit;
6 import org.djunits.unit.AbsoluteTemperatureUnit;
7 import org.djunits.unit.AccelerationUnit;
8 import org.djunits.unit.AngleSolidUnit;
9 import org.djunits.unit.AngleUnit;
10 import org.djunits.unit.AreaUnit;
11 import org.djunits.unit.DensityUnit;
12 import org.djunits.unit.DimensionlessUnit;
13 import org.djunits.unit.DirectionUnit;
14 import org.djunits.unit.DurationUnit;
15 import org.djunits.unit.ElectricalChargeUnit;
16 import org.djunits.unit.ElectricalCurrentUnit;
17 import org.djunits.unit.ElectricalPotentialUnit;
18 import org.djunits.unit.ElectricalResistanceUnit;
19 import org.djunits.unit.EnergyUnit;
20 import org.djunits.unit.FlowMassUnit;
21 import org.djunits.unit.FlowVolumeUnit;
22 import org.djunits.unit.ForceUnit;
23 import org.djunits.unit.FrequencyUnit;
24 import org.djunits.unit.LengthUnit;
25 import org.djunits.unit.LinearDensityUnit;
26 import org.djunits.unit.MassUnit;
27 import org.djunits.unit.PositionUnit;
28 import org.djunits.unit.PowerUnit;
29 import org.djunits.unit.PressureUnit;
30 import org.djunits.unit.SpeedUnit;
31 import org.djunits.unit.TemperatureUnit;
32 import org.djunits.unit.TimeUnit;
33 import org.djunits.unit.TorqueUnit;
34 import org.djunits.unit.Unit;
35 import org.djunits.unit.VolumeUnit;
36 import org.djunits.value.Absolute;
37 import org.djunits.value.Relative;
38 import org.djunits.value.vdouble.scalar.AbsoluteTemperature;
39 import org.djunits.value.vdouble.scalar.AbstractDoubleScalarAbs;
40 import org.djunits.value.vdouble.scalar.AbstractDoubleScalarRel;
41 import org.djunits.value.vdouble.scalar.Acceleration;
42 import org.djunits.value.vdouble.scalar.Angle;
43 import org.djunits.value.vdouble.scalar.AngleSolid;
44 import org.djunits.value.vdouble.scalar.Area;
45 import org.djunits.value.vdouble.scalar.Density;
46 import org.djunits.value.vdouble.scalar.Dimensionless;
47 import org.djunits.value.vdouble.scalar.Direction;
48 import org.djunits.value.vdouble.scalar.DoubleScalar;
49 import org.djunits.value.vdouble.scalar.Duration;
50 import org.djunits.value.vdouble.scalar.ElectricalCharge;
51 import org.djunits.value.vdouble.scalar.ElectricalCurrent;
52 import org.djunits.value.vdouble.scalar.ElectricalPotential;
53 import org.djunits.value.vdouble.scalar.ElectricalResistance;
54 import org.djunits.value.vdouble.scalar.Energy;
55 import org.djunits.value.vdouble.scalar.FlowMass;
56 import org.djunits.value.vdouble.scalar.FlowVolume;
57 import org.djunits.value.vdouble.scalar.Force;
58 import org.djunits.value.vdouble.scalar.Frequency;
59 import org.djunits.value.vdouble.scalar.Length;
60 import org.djunits.value.vdouble.scalar.LinearDensity;
61 import org.djunits.value.vdouble.scalar.Mass;
62 import org.djunits.value.vdouble.scalar.Position;
63 import org.djunits.value.vdouble.scalar.Power;
64 import org.djunits.value.vdouble.scalar.Pressure;
65 import org.djunits.value.vdouble.scalar.Speed;
66 import org.djunits.value.vdouble.scalar.Temperature;
67 import org.djunits.value.vdouble.scalar.Time;
68 import org.djunits.value.vdouble.scalar.Torque;
69 import org.djunits.value.vdouble.scalar.Volume;
70
71 import nl.tudelft.simulation.jstats.distributions.DistDiscrete;
72
73
74
75
76
77
78
79
80
81
82 public interface DiscreteDistDoubleScalar
83 {
84
85
86
87
88
89
90 class Abs<T extends AbstractDoubleScalarAbs<AU, T, RU, ?>, AU extends AbsoluteLinearUnit<AU, RU>, RU extends Unit<RU>>
91 extends AbstractDiscreteDistScalar implements Absolute, Serializable
92 {
93
94 private static final long serialVersionUID = 20150000L;
95
96
97
98
99
100 public Abs(final DistDiscrete distribution, final AU unit)
101 {
102 super(distribution, unit);
103 }
104
105
106
107
108
109 public Abs(final long constant, final AU unit)
110 {
111 super(constant, unit);
112 }
113
114
115
116
117 @SuppressWarnings({"unchecked", "rawtypes"})
118 public T draw()
119 {
120 switch (getUnit().getClass().getSimpleName())
121 {
122 case "DirectionUnit":
123 return (T) new Direction(getDistribution().draw(), (DirectionUnit) getUnit());
124
125 case "PositionhUnit":
126 return (T) new Position(getDistribution().draw(), (PositionUnit) getUnit());
127
128 case "AbsoluteTemperatureUnit":
129 return (T) new AbsoluteTemperature(getDistribution().draw(), (AbsoluteTemperatureUnit) getUnit());
130
131 case "TimeUnit":
132 return (T) new Time(getDistribution().draw(), (TimeUnit) getUnit());
133
134 default:
135 return (T) new DoubleScalar.Abs(getDistribution().draw(), (AU) getUnit());
136 }
137 }
138
139
140 @Override
141 public String toString()
142 {
143 return "DiscreteDistDoubleScalar.Abs [T=" + getUnit().getClass().getSimpleName() + "]";
144 }
145
146 }
147
148
149
150
151
152
153 class Rel<T extends AbstractDoubleScalarRel<U, T>, U extends Unit<U>> extends AbstractDiscreteDistScalar
154 implements Relative, Serializable
155 {
156
157 private static final long serialVersionUID = 20150000L;
158
159
160
161
162
163 public Rel(final DistDiscrete distribution, final U unit)
164 {
165 super(distribution, unit);
166 }
167
168
169
170
171
172 public Rel(final long constant, final U unit)
173 {
174 super(constant, unit);
175 }
176
177
178
179
180 @SuppressWarnings({"unchecked", "rawtypes"})
181 public T draw()
182 {
183 switch (getUnit().getClass().getSimpleName())
184 {
185 case "AccelerationUnit":
186 return (T) new Acceleration(getDistribution().draw(), (AccelerationUnit) getUnit());
187
188 case "AngleUnit":
189 return (T) new Angle(getDistribution().draw(), (AngleUnit) getUnit());
190
191 case "AngleSolidUnit":
192 return (T) new AngleSolid(getDistribution().draw(), (AngleSolidUnit) getUnit());
193
194 case "AreaUnit":
195 return (T) new Area(getDistribution().draw(), (AreaUnit) getUnit());
196
197 case "DensityUnit":
198 return (T) new Density(getDistribution().draw(), (DensityUnit) getUnit());
199
200 case "DimensionlessUnit":
201 return (T) new Dimensionless(getDistribution().draw(), (DimensionlessUnit) getUnit());
202
203 case "DurationUnit":
204 return (T) new Duration(getDistribution().draw(), (DurationUnit) getUnit());
205
206 case "ElectricalChargeUnit":
207 return (T) new ElectricalCharge(getDistribution().draw(), (ElectricalChargeUnit) getUnit());
208
209 case "ElectricalCurrentUnit":
210 return (T) new ElectricalCurrent(getDistribution().draw(), (ElectricalCurrentUnit) getUnit());
211
212 case "ElectricalPotentialUnit":
213 return (T) new ElectricalPotential(getDistribution().draw(), (ElectricalPotentialUnit) getUnit());
214
215 case "ElectricalResistanceUnit":
216 return (T) new ElectricalResistance(getDistribution().draw(), (ElectricalResistanceUnit) getUnit());
217
218 case "EnergyUnit":
219 return (T) new Energy(getDistribution().draw(), (EnergyUnit) getUnit());
220
221 case "FlowMassUnit":
222 return (T) new FlowMass(getDistribution().draw(), (FlowMassUnit) getUnit());
223
224 case "FlowVolumeUnit":
225 return (T) new FlowVolume(getDistribution().draw(), (FlowVolumeUnit) getUnit());
226
227 case "ForceUnit":
228 return (T) new Force(getDistribution().draw(), (ForceUnit) getUnit());
229
230 case "FrequencyUnit":
231 return (T) new Frequency(getDistribution().draw(), (FrequencyUnit) getUnit());
232
233 case "LengthUnit":
234 return (T) new Length(getDistribution().draw(), (LengthUnit) getUnit());
235
236 case "LinearDensityUnit":
237 return (T) new LinearDensity(getDistribution().draw(), (LinearDensityUnit) getUnit());
238
239 case "MassUnit":
240 return (T) new Mass(getDistribution().draw(), (MassUnit) getUnit());
241
242 case "PowerUnit":
243 return (T) new Power(getDistribution().draw(), (PowerUnit) getUnit());
244
245 case "PressureUnit":
246 return (T) new Pressure(getDistribution().draw(), (PressureUnit) getUnit());
247
248 case "SpeedUnit":
249 return (T) new Speed(getDistribution().draw(), (SpeedUnit) getUnit());
250
251 case "TemperatureUnit":
252 return (T) new Temperature(getDistribution().draw(), (TemperatureUnit) getUnit());
253
254 case "TorqueUnit":
255 return (T) new Torque(getDistribution().draw(), (TorqueUnit) getUnit());
256
257 case "VolumeUnit":
258 return (T) new Volume(getDistribution().draw(), (VolumeUnit) getUnit());
259
260 default:
261 return (T) new DoubleScalar.Rel(getDistribution().draw(), getUnit());
262 }
263 }
264
265
266 @Override
267 public String toString()
268 {
269 return "DiscreteDistDoubleScalar.Rel [T=" + getUnit().getClass().getSimpleName() + "]";
270 }
271
272 }
273
274 }