ContinuousDistDoubleScalar.java

  1. package org.opentrafficsim.core.units.distributions;

  2. import java.io.Serializable;

  3. import org.djunits.unit.AbsoluteLinearUnit;
  4. import org.djunits.unit.AbsoluteTemperatureUnit;
  5. import org.djunits.unit.AccelerationUnit;
  6. import org.djunits.unit.AngleUnit;
  7. import org.djunits.unit.AreaUnit;
  8. import org.djunits.unit.DensityUnit;
  9. import org.djunits.unit.DimensionlessUnit;
  10. import org.djunits.unit.DirectionUnit;
  11. import org.djunits.unit.DurationUnit;
  12. import org.djunits.unit.ElectricalChargeUnit;
  13. import org.djunits.unit.ElectricalCurrentUnit;
  14. import org.djunits.unit.ElectricalPotentialUnit;
  15. import org.djunits.unit.ElectricalResistanceUnit;
  16. import org.djunits.unit.EnergyUnit;
  17. import org.djunits.unit.FlowMassUnit;
  18. import org.djunits.unit.FlowVolumeUnit;
  19. import org.djunits.unit.ForceUnit;
  20. import org.djunits.unit.FrequencyUnit;
  21. import org.djunits.unit.LengthUnit;
  22. import org.djunits.unit.LinearDensityUnit;
  23. import org.djunits.unit.MassUnit;
  24. import org.djunits.unit.PositionUnit;
  25. import org.djunits.unit.PowerUnit;
  26. import org.djunits.unit.PressureUnit;
  27. import org.djunits.unit.SolidAngleUnit;
  28. import org.djunits.unit.SpeedUnit;
  29. import org.djunits.unit.TemperatureUnit;
  30. import org.djunits.unit.TimeUnit;
  31. import org.djunits.unit.TorqueUnit;
  32. import org.djunits.unit.Unit;
  33. import org.djunits.unit.VolumeUnit;
  34. import org.djunits.value.Absolute;
  35. import org.djunits.value.vdouble.scalar.AbsoluteTemperature;
  36. import org.djunits.value.vdouble.scalar.Acceleration;
  37. import org.djunits.value.vdouble.scalar.Angle;
  38. import org.djunits.value.vdouble.scalar.Area;
  39. import org.djunits.value.vdouble.scalar.Density;
  40. import org.djunits.value.vdouble.scalar.Dimensionless;
  41. import org.djunits.value.vdouble.scalar.Direction;
  42. import org.djunits.value.vdouble.scalar.Duration;
  43. import org.djunits.value.vdouble.scalar.ElectricalCharge;
  44. import org.djunits.value.vdouble.scalar.ElectricalCurrent;
  45. import org.djunits.value.vdouble.scalar.ElectricalPotential;
  46. import org.djunits.value.vdouble.scalar.ElectricalResistance;
  47. import org.djunits.value.vdouble.scalar.Energy;
  48. import org.djunits.value.vdouble.scalar.FlowMass;
  49. import org.djunits.value.vdouble.scalar.FlowVolume;
  50. import org.djunits.value.vdouble.scalar.Force;
  51. import org.djunits.value.vdouble.scalar.Frequency;
  52. import org.djunits.value.vdouble.scalar.Length;
  53. import org.djunits.value.vdouble.scalar.LinearDensity;
  54. import org.djunits.value.vdouble.scalar.Mass;
  55. import org.djunits.value.vdouble.scalar.Position;
  56. import org.djunits.value.vdouble.scalar.Power;
  57. import org.djunits.value.vdouble.scalar.Pressure;
  58. import org.djunits.value.vdouble.scalar.SolidAngle;
  59. import org.djunits.value.vdouble.scalar.Speed;
  60. import org.djunits.value.vdouble.scalar.Temperature;
  61. import org.djunits.value.vdouble.scalar.Time;
  62. import org.djunits.value.vdouble.scalar.Torque;
  63. import org.djunits.value.vdouble.scalar.Volume;
  64. import org.djunits.value.vdouble.scalar.base.AbstractDoubleScalarAbs;
  65. import org.djunits.value.vdouble.scalar.base.AbstractDoubleScalarRel;
  66. import org.djunits.value.vdouble.scalar.base.DoubleScalar;
  67. import org.opentrafficsim.core.distributions.Generator;

  68. import nl.tudelft.simulation.jstats.distributions.DistContinuous;

  69. /**
  70.  * <p>
  71.  * Copyright (c) 2013-2019 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
  72.  * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
  73.  * <p>
  74.  * $LastChangedDate: 2015-07-26 01:01:13 +0200 (Sun, 26 Jul 2015) $, @version $Revision: 1155 $, by $Author: averbraeck $,
  75.  * initial version Feb 2, 2015 <br>
  76.  * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
  77.  */
  78. public interface ContinuousDistDoubleScalar
  79. {
  80.     /**
  81.      * Absolute value.
  82.      * @param <T> The absolute DoubleScalar type
  83.      * @param <AU> The absolute unit type used
  84.      * @param <RU> The relative unit type belonging to AU
  85.      */
  86.     class Abs<T extends AbstractDoubleScalarAbs<AU, T, RU, ?>, AU extends AbsoluteLinearUnit<AU, RU>, RU extends Unit<RU>>
  87.             extends AbstractContinuousDistScalar implements Absolute, Serializable, Generator<T>
  88.     {
  89.         /** */
  90.         private static final long serialVersionUID = 20150000L;

  91.         /**
  92.          * @param distribution DistContinuous; the wrapped distribution function.
  93.          * @param unit AU; the unit.
  94.          */
  95.         public Abs(final DistContinuous distribution, final AU unit)
  96.         {
  97.             super(distribution, unit);
  98.         }

  99.         /**
  100.          * @param constant double; the constant value.
  101.          * @param unit AU; the unit.
  102.          */
  103.         public Abs(final double constant, final AU unit)
  104.         {
  105.             super(constant, unit);
  106.         }

  107.         /**
  108.          * @return a drawn number from the distribution in the given unit.
  109.          */
  110.         @Override
  111.         @SuppressWarnings("unchecked")
  112.         public T draw()
  113.         {
  114.             switch (getDisplayUnit().getClass().getSimpleName())
  115.             {
  116.                 case "DirectionUnit":
  117.                     return (T) new Direction(getDistribution().draw(), (DirectionUnit) getDisplayUnit());

  118.                 case "PositionUnit":
  119.                     return (T) new Position(getDistribution().draw(), (PositionUnit) getDisplayUnit());

  120.                 case "AbsoluteTemperatureUnit":
  121.                     return (T) new AbsoluteTemperature(getDistribution().draw(), (AbsoluteTemperatureUnit) getDisplayUnit());

  122.                 case "TimeUnit":
  123.                     return (T) new Time(getDistribution().draw(), (TimeUnit) getDisplayUnit());

  124.                 default:
  125.                     return (T) DoubleScalar.instantiate(getDistribution().draw(), (AU) getDisplayUnit());
  126.             }
  127.         }

  128.         /** {@inheritDoc} */
  129.         @Override
  130.         public String toString()
  131.         {
  132.             return "ContinuousDistDoubleScalar.Abs [T=" + getDisplayUnit().getClass().getSimpleName() + "]";
  133.         }

  134.     }

  135.     /**
  136.      * Relative value.
  137.      * @param <T> The absolute DoubleScalar type
  138.      * @param <U> The unit type used
  139.      */
  140.     class Rel<T extends AbstractDoubleScalarRel<U, T>, U extends Unit<U>> extends AbstractContinuousDistScalar
  141.             implements Serializable, Generator<T>
  142.     {
  143.         /** */
  144.         private static final long serialVersionUID = 20150000L;

  145.         /**
  146.          * @param distribution DistContinuous; the wrapped distribution function.
  147.          * @param unit U; the unit.
  148.          */
  149.         public Rel(final DistContinuous distribution, final U unit)
  150.         {
  151.             super(distribution, unit);
  152.         }

  153.         /**
  154.          * @param constant double; the constant value.
  155.          * @param unit U; the unit.
  156.          */
  157.         public Rel(final double constant, final U unit)
  158.         {
  159.             super(constant, unit);
  160.         }

  161.         /**
  162.          * @return a drawn number from the distribution in the given unit.
  163.          */
  164.         @Override
  165.         @SuppressWarnings("unchecked")
  166.         public T draw()
  167.         {
  168.             switch (getDisplayUnit().getClass().getSimpleName())
  169.             {
  170.                 case "AccelerationUnit":
  171.                     return (T) new Acceleration(getDistribution().draw(), (AccelerationUnit) getDisplayUnit());

  172.                 case "AngleUnit":
  173.                     return (T) new Angle(getDistribution().draw(), (AngleUnit) getDisplayUnit());

  174.                 case "SolidAngleUnit":
  175.                     return (T) new SolidAngle(getDistribution().draw(), (SolidAngleUnit) getDisplayUnit());

  176.                 case "AreaUnit":
  177.                     return (T) new Area(getDistribution().draw(), (AreaUnit) getDisplayUnit());

  178.                 case "DensityUnit":
  179.                     return (T) new Density(getDistribution().draw(), (DensityUnit) getDisplayUnit());

  180.                 case "DimensionlessUnit":
  181.                     return (T) new Dimensionless(getDistribution().draw(), (DimensionlessUnit) getDisplayUnit());

  182.                 case "DurationUnit":
  183.                     return (T) new Duration(getDistribution().draw(), (DurationUnit) getDisplayUnit());

  184.                 case "ElectricalChargeUnit":
  185.                     return (T) new ElectricalCharge(getDistribution().draw(), (ElectricalChargeUnit) getDisplayUnit());

  186.                 case "ElectricalCurrentUnit":
  187.                     return (T) new ElectricalCurrent(getDistribution().draw(), (ElectricalCurrentUnit) getDisplayUnit());

  188.                 case "ElectricalPotentialUnit":
  189.                     return (T) new ElectricalPotential(getDistribution().draw(), (ElectricalPotentialUnit) getDisplayUnit());

  190.                 case "ElectricalResistanceUnit":
  191.                     return (T) new ElectricalResistance(getDistribution().draw(), (ElectricalResistanceUnit) getDisplayUnit());

  192.                 case "EnergyUnit":
  193.                     return (T) new Energy(getDistribution().draw(), (EnergyUnit) getDisplayUnit());

  194.                 case "FlowMassUnit":
  195.                     return (T) new FlowMass(getDistribution().draw(), (FlowMassUnit) getDisplayUnit());

  196.                 case "FlowVolumeUnit":
  197.                     return (T) new FlowVolume(getDistribution().draw(), (FlowVolumeUnit) getDisplayUnit());

  198.                 case "ForceUnit":
  199.                     return (T) new Force(getDistribution().draw(), (ForceUnit) getDisplayUnit());

  200.                 case "FrequencyUnit":
  201.                     return (T) new Frequency(getDistribution().draw(), (FrequencyUnit) getDisplayUnit());

  202.                 case "LengthUnit":
  203.                     return (T) new Length(getDistribution().draw(), (LengthUnit) getDisplayUnit());

  204.                 case "LinearDensityUnit":
  205.                     return (T) new LinearDensity(getDistribution().draw(), (LinearDensityUnit) getDisplayUnit());

  206.                 case "MassUnit":
  207.                     return (T) new Mass(getDistribution().draw(), (MassUnit) getDisplayUnit());

  208.                 case "PowerUnit":
  209.                     return (T) new Power(getDistribution().draw(), (PowerUnit) getDisplayUnit());

  210.                 case "PressureUnit":
  211.                     return (T) new Pressure(getDistribution().draw(), (PressureUnit) getDisplayUnit());

  212.                 case "SpeedUnit":
  213.                     return (T) new Speed(getDistribution().draw(), (SpeedUnit) getDisplayUnit());

  214.                 case "TemperatureUnit":
  215.                     return (T) new Temperature(getDistribution().draw(), (TemperatureUnit) getDisplayUnit());

  216.                 case "TorqueUnit":
  217.                     return (T) new Torque(getDistribution().draw(), (TorqueUnit) getDisplayUnit());

  218.                 case "VolumeUnit":
  219.                     return (T) new Volume(getDistribution().draw(), (VolumeUnit) getDisplayUnit());

  220.                 default:
  221.                     return (T) DoubleScalar.instantiate(getDistribution().draw(), (U) getDisplayUnit());
  222.             }
  223.         }

  224.         /** {@inheritDoc} */
  225.         @Override
  226.         public String toString()
  227.         {
  228.             return "ContinuousDistDoubleScalar.Rel [T=" + getDisplayUnit().getClass().getSimpleName() + "]";
  229.         }
  230.     }

  231. }