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.vfloat.scalar.AbstractFloatScalarAbs;
39 import org.djunits.value.vfloat.scalar.AbstractFloatScalarRel;
40 import org.djunits.value.vfloat.scalar.FloatAbsoluteTemperature;
41 import org.djunits.value.vfloat.scalar.FloatAcceleration;
42 import org.djunits.value.vfloat.scalar.FloatAngle;
43 import org.djunits.value.vfloat.scalar.FloatAngleSolid;
44 import org.djunits.value.vfloat.scalar.FloatArea;
45 import org.djunits.value.vfloat.scalar.FloatDensity;
46 import org.djunits.value.vfloat.scalar.FloatDimensionless;
47 import org.djunits.value.vfloat.scalar.FloatDirection;
48 import org.djunits.value.vfloat.scalar.FloatDuration;
49 import org.djunits.value.vfloat.scalar.FloatElectricalCharge;
50 import org.djunits.value.vfloat.scalar.FloatElectricalCurrent;
51 import org.djunits.value.vfloat.scalar.FloatElectricalPotential;
52 import org.djunits.value.vfloat.scalar.FloatElectricalResistance;
53 import org.djunits.value.vfloat.scalar.FloatEnergy;
54 import org.djunits.value.vfloat.scalar.FloatFlowMass;
55 import org.djunits.value.vfloat.scalar.FloatFlowVolume;
56 import org.djunits.value.vfloat.scalar.FloatForce;
57 import org.djunits.value.vfloat.scalar.FloatFrequency;
58 import org.djunits.value.vfloat.scalar.FloatLength;
59 import org.djunits.value.vfloat.scalar.FloatLinearDensity;
60 import org.djunits.value.vfloat.scalar.FloatMass;
61 import org.djunits.value.vfloat.scalar.FloatPosition;
62 import org.djunits.value.vfloat.scalar.FloatPower;
63 import org.djunits.value.vfloat.scalar.FloatPressure;
64 import org.djunits.value.vfloat.scalar.FloatScalar;
65 import org.djunits.value.vfloat.scalar.FloatSpeed;
66 import org.djunits.value.vfloat.scalar.FloatTemperature;
67 import org.djunits.value.vfloat.scalar.FloatTime;
68 import org.djunits.value.vfloat.scalar.FloatTorque;
69 import org.djunits.value.vfloat.scalar.FloatVolume;
70
71 import nl.tudelft.simulation.jstats.distributions.DistContinuous;
72
73
74
75
76
77
78
79
80
81
82 public interface ContinuousDistFloatScalar
83 {
84
85
86
87
88
89
90 class Abs<T extends AbstractFloatScalarAbs<AU, T, RU, ?>, AU extends AbsoluteLinearUnit<AU, RU>, RU extends Unit<RU>>
91 extends AbstractContinuousDistScalar implements Absolute, Serializable
92 {
93
94 private static final long serialVersionUID = 20150000;
95
96
97
98
99
100 public Abs(final DistContinuous distribution, final AU unit)
101 {
102 super(distribution, unit);
103 }
104
105
106
107
108
109 public Abs(final float constant, final AU unit)
110 {
111 super(constant, unit);
112 }
113
114
115
116
117 @SuppressWarnings({"unchecked", "rawtypes"})
118 public final T draw()
119 {
120 switch (getUnit().getClass().getSimpleName())
121 {
122 case "DirectionUnit":
123 return (T) new FloatDirection((float) getDistribution().draw(), (DirectionUnit) getUnit());
124
125 case "PositionUnit":
126 return (T) new FloatPosition((float) getDistribution().draw(), (PositionUnit) getUnit());
127
128 case "AbsoluteTemperatureUnit":
129 return (T) new FloatAbsoluteTemperature((float) getDistribution().draw(),
130 (AbsoluteTemperatureUnit) getUnit());
131
132 case "TimeUnit":
133 return (T) new FloatTime((float) getDistribution().draw(), (TimeUnit) getUnit());
134
135 default:
136 return (T) new FloatScalar.Abs((float) getDistribution().draw(), (AU) getUnit());
137 }
138 }
139
140
141 @Override
142 public final String toString()
143 {
144 return "ContinuousDistFloatScalar.Abs [T=" + getUnit().getClass().getSimpleName() + "]";
145 }
146
147 }
148
149
150
151
152
153
154 class Rel<T extends AbstractFloatScalarRel<U, T>, U extends Unit<U>> extends AbstractContinuousDistScalar
155 implements Relative, Serializable
156 {
157
158 private static final long serialVersionUID = 20150000L;
159
160
161
162
163
164 public Rel(final DistContinuous distribution, final U unit)
165 {
166 super(distribution, unit);
167 }
168
169
170
171
172
173 public Rel(final float constant, final U unit)
174 {
175 super(constant, unit);
176 }
177
178
179
180
181 @SuppressWarnings({"unchecked", "rawtypes"})
182 public final T draw()
183 {
184 switch (getUnit().getClass().getSimpleName())
185 {
186 case "AccelerationUnit":
187 return (T) new FloatAcceleration((float) getDistribution().draw(), (AccelerationUnit) getUnit());
188
189 case "AngleUnit":
190 return (T) new FloatAngle((float) getDistribution().draw(), (AngleUnit) getUnit());
191
192 case "AngleSolidUnit":
193 return (T) new FloatAngleSolid((float) getDistribution().draw(), (AngleSolidUnit) getUnit());
194
195 case "AreaUnit":
196 return (T) new FloatArea((float) getDistribution().draw(), (AreaUnit) getUnit());
197
198 case "DensityUnit":
199 return (T) new FloatDensity((float) getDistribution().draw(), (DensityUnit) getUnit());
200
201 case "DimensionlessUnit":
202 return (T) new FloatDimensionless((float) getDistribution().draw(), (DimensionlessUnit) getUnit());
203
204 case "DurationUnit":
205 return (T) new FloatDuration((float) getDistribution().draw(), (DurationUnit) getUnit());
206
207 case "ElectricalChargeUnit":
208 return (T) new FloatElectricalCharge((float) getDistribution().draw(), (ElectricalChargeUnit) getUnit());
209
210 case "ElectricalCurrentUnit":
211 return (T) new FloatElectricalCurrent((float) getDistribution().draw(), (ElectricalCurrentUnit) getUnit());
212
213 case "ElectricalPotentialUnit":
214 return (T) new FloatElectricalPotential((float) getDistribution().draw(),
215 (ElectricalPotentialUnit) getUnit());
216
217 case "ElectricalResistanceUnit":
218 return (T) new FloatElectricalResistance((float) getDistribution().draw(),
219 (ElectricalResistanceUnit) getUnit());
220
221 case "EnergyUnit":
222 return (T) new FloatEnergy((float) getDistribution().draw(), (EnergyUnit) getUnit());
223
224 case "FlowMassUnit":
225 return (T) new FloatFlowMass((float) getDistribution().draw(), (FlowMassUnit) getUnit());
226
227 case "FlowVolumeUnit":
228 return (T) new FloatFlowVolume((float) getDistribution().draw(), (FlowVolumeUnit) getUnit());
229
230 case "ForceUnit":
231 return (T) new FloatForce((float) getDistribution().draw(), (ForceUnit) getUnit());
232
233 case "FrequencyUnit":
234 return (T) new FloatFrequency((float) getDistribution().draw(), (FrequencyUnit) getUnit());
235
236 case "LengthUnit":
237 return (T) new FloatLength((float) getDistribution().draw(), (LengthUnit) getUnit());
238
239 case "LinearDensityUnit":
240 return (T) new FloatLinearDensity((float) getDistribution().draw(), (LinearDensityUnit) getUnit());
241
242 case "MassUnit":
243 return (T) new FloatMass((float) getDistribution().draw(), (MassUnit) getUnit());
244
245 case "PowerUnit":
246 return (T) new FloatPower((float) getDistribution().draw(), (PowerUnit) getUnit());
247
248 case "PressureUnit":
249 return (T) new FloatPressure((float) getDistribution().draw(), (PressureUnit) getUnit());
250
251 case "SpeedUnit":
252 return (T) new FloatSpeed((float) getDistribution().draw(), (SpeedUnit) getUnit());
253
254 case "TemperatureUnit":
255 return (T) new FloatTemperature((float) getDistribution().draw(), (TemperatureUnit) getUnit());
256
257 case "TorqueUnit":
258 return (T) new FloatTorque((float) getDistribution().draw(), (TorqueUnit) getUnit());
259
260 case "VolumeUnit":
261 return (T) new FloatVolume((float) getDistribution().draw(), (VolumeUnit) getUnit());
262
263 default:
264 return (T) new FloatScalar.Rel((float) getDistribution().draw(), getUnit());
265 }
266 }
267
268
269 @Override
270 public final String toString()
271 {
272 return "ContinuousDistFloatScalar.Rel [T=" + getUnit().getClass().getSimpleName() + "]";
273 }
274
275 }
276
277 }