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.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  import org.opentrafficsim.core.distributions.Generator;
71  
72  import nl.tudelft.simulation.jstats.distributions.DistContinuous;
73  
74  /**
75   * <p>
76   * Copyright (c) 2013-2019 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
77   * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
78   * <p>
79   * $LastChangedDate: 2015-07-26 01:01:13 +0200 (Sun, 26 Jul 2015) $, @version $Revision: 1155 $, by $Author: averbraeck $,
80   * initial version Feb 2, 2015 <br>
81   * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
82   */
83  public interface ContinuousDistDoubleScalar
84  {
85      /**
86       * Absolute value.
87       * @param <T> The absolute DoubleScalar type
88       * @param <AU> The absolute unit type used
89       * @param <RU> The relative unit type belonging to AU
90       */
91      class Abs<T extends AbstractDoubleScalarAbs<AU, T, RU, ?>, AU extends AbsoluteLinearUnit<AU, RU>, RU extends Unit<RU>>
92              extends AbstractContinuousDistScalar implements Absolute, Serializable, Generator<T>
93      {
94          /** */
95          private static final long serialVersionUID = 20150000L;
96  
97          /**
98           * @param distribution DistContinuous; the wrapped distribution function.
99           * @param unit AU; the unit.
100          */
101         public Abs(final DistContinuous distribution, final AU unit)
102         {
103             super(distribution, unit);
104         }
105 
106         /**
107          * @param constant double; the constant value.
108          * @param unit AU; the unit.
109          */
110         public Abs(final double constant, final AU unit)
111         {
112             super(constant, unit);
113         }
114 
115         /**
116          * @return a drawn number from the distribution in the given unit.
117          */
118         @SuppressWarnings({"unchecked", "rawtypes"})
119         public T draw()
120         {
121             switch (getUnit().getClass().getSimpleName())
122             {
123                 case "DirectionUnit":
124                     return (T) new Direction(getDistribution().draw(), (DirectionUnit) getUnit());
125 
126                 case "PositionUnit":
127                     return (T) new Position(getDistribution().draw(), (PositionUnit) getUnit());
128 
129                 case "AbsoluteTemperatureUnit":
130                     return (T) new AbsoluteTemperature(getDistribution().draw(), (AbsoluteTemperatureUnit) getUnit());
131 
132                 case "TimeUnit":
133                     return (T) new Time(getDistribution().draw(), (TimeUnit) getUnit());
134 
135                 default:
136                     return (T) new DoubleScalar.Abs(getDistribution().draw(), (AU) getUnit());
137             }
138         }
139 
140         /** {@inheritDoc} */
141         @Override
142         public String toString()
143         {
144             return "ContinuousDistDoubleScalar.Abs [T=" + getUnit().getClass().getSimpleName() + "]";
145         }
146 
147     }
148 
149     /**
150      * Relative value.
151      * @param <T> The absolute DoubleScalar type
152      * @param <U> The unit type used
153      */
154     class Rel<T extends AbstractDoubleScalarRel<U, T>, U extends Unit<U>> extends AbstractContinuousDistScalar
155             implements Relative, Serializable, Generator<T>
156     {
157         /** */
158         private static final long serialVersionUID = 20150000L;
159 
160         /**
161          * @param distribution DistContinuous; the wrapped distribution function.
162          * @param unit U; the unit.
163          */
164         public Rel(final DistContinuous distribution, final U unit)
165         {
166             super(distribution, unit);
167         }
168 
169         /**
170          * @param constant double; the constant value.
171          * @param unit U; the unit.
172          */
173         public Rel(final double constant, final U unit)
174         {
175             super(constant, unit);
176         }
177 
178         /**
179          * @return a drawn number from the distribution in the given unit.
180          */
181         @SuppressWarnings({"unchecked", "rawtypes"})
182         public T draw()
183         {
184             switch (getUnit().getClass().getSimpleName())
185             {
186                 case "AccelerationUnit":
187                     return (T) new Acceleration(getDistribution().draw(), (AccelerationUnit) getUnit());
188 
189                 case "AngleUnit":
190                     return (T) new Angle(getDistribution().draw(), (AngleUnit) getUnit());
191 
192                 case "AngleSolidUnit":
193                     return (T) new AngleSolid(getDistribution().draw(), (AngleSolidUnit) getUnit());
194 
195                 case "AreaUnit":
196                     return (T) new Area(getDistribution().draw(), (AreaUnit) getUnit());
197 
198                 case "DensityUnit":
199                     return (T) new Density(getDistribution().draw(), (DensityUnit) getUnit());
200 
201                 case "DimensionlessUnit":
202                     return (T) new Dimensionless(getDistribution().draw(), (DimensionlessUnit) getUnit());
203 
204                 case "DurationUnit":
205                     return (T) new Duration(getDistribution().draw(), (DurationUnit) getUnit());
206 
207                 case "ElectricalChargeUnit":
208                     return (T) new ElectricalCharge(getDistribution().draw(), (ElectricalChargeUnit) getUnit());
209 
210                 case "ElectricalCurrentUnit":
211                     return (T) new ElectricalCurrent(getDistribution().draw(), (ElectricalCurrentUnit) getUnit());
212 
213                 case "ElectricalPotentialUnit":
214                     return (T) new ElectricalPotential(getDistribution().draw(), (ElectricalPotentialUnit) getUnit());
215 
216                 case "ElectricalResistanceUnit":
217                     return (T) new ElectricalResistance(getDistribution().draw(), (ElectricalResistanceUnit) getUnit());
218 
219                 case "EnergyUnit":
220                     return (T) new Energy(getDistribution().draw(), (EnergyUnit) getUnit());
221 
222                 case "FlowMassUnit":
223                     return (T) new FlowMass(getDistribution().draw(), (FlowMassUnit) getUnit());
224 
225                 case "FlowVolumeUnit":
226                     return (T) new FlowVolume(getDistribution().draw(), (FlowVolumeUnit) getUnit());
227 
228                 case "ForceUnit":
229                     return (T) new Force(getDistribution().draw(), (ForceUnit) getUnit());
230 
231                 case "FrequencyUnit":
232                     return (T) new Frequency(getDistribution().draw(), (FrequencyUnit) getUnit());
233 
234                 case "LengthUnit":
235                     return (T) new Length(getDistribution().draw(), (LengthUnit) getUnit());
236 
237                 case "LinearDensityUnit":
238                     return (T) new LinearDensity(getDistribution().draw(), (LinearDensityUnit) getUnit());
239 
240                 case "MassUnit":
241                     return (T) new Mass(getDistribution().draw(), (MassUnit) getUnit());
242 
243                 case "PowerUnit":
244                     return (T) new Power(getDistribution().draw(), (PowerUnit) getUnit());
245 
246                 case "PressureUnit":
247                     return (T) new Pressure(getDistribution().draw(), (PressureUnit) getUnit());
248 
249                 case "SpeedUnit":
250                     return (T) new Speed(getDistribution().draw(), (SpeedUnit) getUnit());
251 
252                 case "TemperatureUnit":
253                     return (T) new Temperature(getDistribution().draw(), (TemperatureUnit) getUnit());
254 
255                 case "TorqueUnit":
256                     return (T) new Torque(getDistribution().draw(), (TorqueUnit) getUnit());
257 
258                 case "VolumeUnit":
259                     return (T) new Volume(getDistribution().draw(), (VolumeUnit) getUnit());
260 
261                 default:
262                     return (T) new DoubleScalar.Rel(getDistribution().draw(), getUnit());
263             }
264         }
265 
266         /** {@inheritDoc} */
267         @Override
268         public String toString()
269         {
270             return "ContinuousDistDoubleScalar.Rel [T=" + getUnit().getClass().getSimpleName() + "]";
271         }
272 
273     }
274 
275 }