View Javadoc
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.DistDiscrete;
72  
73  /**
74   * <p>
75   * Copyright (c) 2013-2019 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
76   * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
77   * <p>
78   * $LastChangedDate: 2015-07-26 01:01:13 +0200 (Sun, 26 Jul 2015) $, @version $Revision: 1155 $, by $Author: averbraeck $,
79   * initial version Feb 2, 2015 <br>
80   * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
81   */
82  public interface DiscreteDistFloatScalar
83  {
84      /**
85       * Absolute value.
86       * @param <T> The absolute floatscalar type
87       * @param <AU> The absolute unit type used
88       * @param <RU> The relative unit type belonging to AU
89       */
90      class Abs<T extends AbstractFloatScalarAbs<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           * @param distribution DistDiscrete; the wrapped distribution function.
98           * @param unit AU; the unit.
99           */
100         public Abs(final DistDiscrete distribution, final AU unit)
101         {
102             super(distribution, unit);
103         }
104 
105         /**
106          * @param constant int; the constant value.
107          * @param unit AU; the unit.
108          */
109         public Abs(final int constant, final AU unit)
110         {
111             super(constant, unit);
112         }
113 
114         /**
115          * @return a drawn number from the distribution in the given unit.
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(getDistribution().draw(), (AU) getUnit());
137             }
138         }
139 
140         /** {@inheritDoc} */
141         @Override
142         public final String toString()
143         {
144             return "DiscreteDistFloatScalar.Abs [T=" + getUnit().getClass().getSimpleName() + "]";
145         }
146     }
147 
148     /**
149      * Relative value.
150      * @param <T> The absolute float scalar type
151      * @param <U> The unit type used
152      */
153     class Rel<T extends AbstractFloatScalarRel<U, T>, U extends Unit<U>> extends AbstractDiscreteDistScalar
154             implements Relative, Serializable
155     {
156         /** */
157         private static final long serialVersionUID = 20150000L;
158 
159         /**
160          * @param distribution DistDiscrete; the wrapped distribution function.
161          * @param unit U; the unit.
162          */
163         public Rel(final DistDiscrete distribution, final U unit)
164         {
165             super(distribution, unit);
166         }
167 
168         /**
169          * @param constant int; the constant value.
170          * @param unit U; the unit.
171          */
172         public Rel(final int constant, final U unit)
173         {
174             super(constant, unit);
175         }
176 
177         /**
178          * @return a drawn number from the distribution in the given unit.
179          */
180         @SuppressWarnings({"unchecked", "rawtypes"})
181         public final T draw()
182         {
183             switch (getUnit().getClass().getSimpleName())
184             {
185                 case "AccelerationUnit":
186                     return (T) new FloatAcceleration((float) getDistribution().draw(), (AccelerationUnit) getUnit());
187 
188                 case "AngleUnit":
189                     return (T) new FloatAngle((float) getDistribution().draw(), (AngleUnit) getUnit());
190 
191                 case "AngleSolidUnit":
192                     return (T) new FloatAngleSolid((float) getDistribution().draw(), (AngleSolidUnit) getUnit());
193 
194                 case "AreaUnit":
195                     return (T) new FloatArea((float) getDistribution().draw(), (AreaUnit) getUnit());
196 
197                 case "DensityUnit":
198                     return (T) new FloatDensity((float) getDistribution().draw(), (DensityUnit) getUnit());
199 
200                 case "DimensionlessUnit":
201                     return (T) new FloatDimensionless(getDistribution().draw(), (DimensionlessUnit) getUnit());
202 
203                 case "DurationUnit":
204                     return (T) new FloatDuration((float) getDistribution().draw(), (DurationUnit) getUnit());
205 
206                 case "ElectricalChargeUnit":
207                     return (T) new FloatElectricalCharge((float) getDistribution().draw(), (ElectricalChargeUnit) getUnit());
208 
209                 case "ElectricalCurrentUnit":
210                     return (T) new FloatElectricalCurrent((float) getDistribution().draw(), (ElectricalCurrentUnit) getUnit());
211 
212                 case "ElectricalPotentialUnit":
213                     return (T) new FloatElectricalPotential((float) getDistribution().draw(),
214                             (ElectricalPotentialUnit) getUnit());
215 
216                 case "ElectricalResistanceUnit":
217                     return (T) new FloatElectricalResistance((float) getDistribution().draw(),
218                             (ElectricalResistanceUnit) getUnit());
219 
220                 case "EnergyUnit":
221                     return (T) new FloatEnergy((float) getDistribution().draw(), (EnergyUnit) getUnit());
222 
223                 case "FlowMassUnit":
224                     return (T) new FloatFlowMass((float) getDistribution().draw(), (FlowMassUnit) getUnit());
225 
226                 case "FlowVolumeUnit":
227                     return (T) new FloatFlowVolume((float) getDistribution().draw(), (FlowVolumeUnit) getUnit());
228 
229                 case "ForceUnit":
230                     return (T) new FloatForce((float) getDistribution().draw(), (ForceUnit) getUnit());
231 
232                 case "FrequencyUnit":
233                     return (T) new FloatFrequency((float) getDistribution().draw(), (FrequencyUnit) getUnit());
234 
235                 case "LengthUnit":
236                     return (T) new FloatLength((float) getDistribution().draw(), (LengthUnit) getUnit());
237 
238                 case "LinearDensityUnit":
239                     return (T) new FloatLinearDensity((float) getDistribution().draw(), (LinearDensityUnit) getUnit());
240 
241                 case "MassUnit":
242                     return (T) new FloatMass((float) getDistribution().draw(), (MassUnit) getUnit());
243 
244                 case "PowerUnit":
245                     return (T) new FloatPower((float) getDistribution().draw(), (PowerUnit) getUnit());
246 
247                 case "PressureUnit":
248                     return (T) new FloatPressure((float) getDistribution().draw(), (PressureUnit) getUnit());
249 
250                 case "SpeedUnit":
251                     return (T) new FloatSpeed((float) getDistribution().draw(), (SpeedUnit) getUnit());
252 
253                 case "TemperatureUnit":
254                     return (T) new FloatTemperature((float) getDistribution().draw(), (TemperatureUnit) getUnit());
255 
256                 case "TorqueUnit":
257                     return (T) new FloatTorque((float) getDistribution().draw(), (TorqueUnit) getUnit());
258 
259                 case "VolumeUnit":
260                     return (T) new FloatVolume((float) getDistribution().draw(), (VolumeUnit) getUnit());
261 
262                 default:
263                     return (T) new FloatScalar.Rel(getDistribution().draw(), getUnit());
264             }
265         }
266 
267         /** {@inheritDoc} */
268         @Override
269         public final String toString()
270         {
271             return "DiscreteDistFloatScalar.Rel [T=" + getUnit().getClass().getSimpleName() + "]";
272         }
273     }
274 
275 }