ContinuousDistFloatScalar.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.AngleSolidUnit;
  7. import org.djunits.unit.AngleUnit;
  8. import org.djunits.unit.AreaUnit;
  9. import org.djunits.unit.DensityUnit;
  10. import org.djunits.unit.DimensionlessUnit;
  11. import org.djunits.unit.DirectionUnit;
  12. import org.djunits.unit.DurationUnit;
  13. import org.djunits.unit.ElectricalChargeUnit;
  14. import org.djunits.unit.ElectricalCurrentUnit;
  15. import org.djunits.unit.ElectricalPotentialUnit;
  16. import org.djunits.unit.ElectricalResistanceUnit;
  17. import org.djunits.unit.EnergyUnit;
  18. import org.djunits.unit.FlowMassUnit;
  19. import org.djunits.unit.FlowVolumeUnit;
  20. import org.djunits.unit.ForceUnit;
  21. import org.djunits.unit.FrequencyUnit;
  22. import org.djunits.unit.LengthUnit;
  23. import org.djunits.unit.LinearDensityUnit;
  24. import org.djunits.unit.MassUnit;
  25. import org.djunits.unit.PositionUnit;
  26. import org.djunits.unit.PowerUnit;
  27. import org.djunits.unit.PressureUnit;
  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.Relative;
  36. import org.djunits.value.vfloat.scalar.AbstractFloatScalarAbs;
  37. import org.djunits.value.vfloat.scalar.AbstractFloatScalarRel;
  38. import org.djunits.value.vfloat.scalar.FloatAbsoluteTemperature;
  39. import org.djunits.value.vfloat.scalar.FloatAcceleration;
  40. import org.djunits.value.vfloat.scalar.FloatAngle;
  41. import org.djunits.value.vfloat.scalar.FloatAngleSolid;
  42. import org.djunits.value.vfloat.scalar.FloatArea;
  43. import org.djunits.value.vfloat.scalar.FloatDensity;
  44. import org.djunits.value.vfloat.scalar.FloatDimensionless;
  45. import org.djunits.value.vfloat.scalar.FloatDirection;
  46. import org.djunits.value.vfloat.scalar.FloatDuration;
  47. import org.djunits.value.vfloat.scalar.FloatElectricalCharge;
  48. import org.djunits.value.vfloat.scalar.FloatElectricalCurrent;
  49. import org.djunits.value.vfloat.scalar.FloatElectricalPotential;
  50. import org.djunits.value.vfloat.scalar.FloatElectricalResistance;
  51. import org.djunits.value.vfloat.scalar.FloatEnergy;
  52. import org.djunits.value.vfloat.scalar.FloatFlowMass;
  53. import org.djunits.value.vfloat.scalar.FloatFlowVolume;
  54. import org.djunits.value.vfloat.scalar.FloatForce;
  55. import org.djunits.value.vfloat.scalar.FloatFrequency;
  56. import org.djunits.value.vfloat.scalar.FloatLength;
  57. import org.djunits.value.vfloat.scalar.FloatLinearDensity;
  58. import org.djunits.value.vfloat.scalar.FloatMass;
  59. import org.djunits.value.vfloat.scalar.FloatPosition;
  60. import org.djunits.value.vfloat.scalar.FloatPower;
  61. import org.djunits.value.vfloat.scalar.FloatPressure;
  62. import org.djunits.value.vfloat.scalar.FloatScalar;
  63. import org.djunits.value.vfloat.scalar.FloatSpeed;
  64. import org.djunits.value.vfloat.scalar.FloatTemperature;
  65. import org.djunits.value.vfloat.scalar.FloatTime;
  66. import org.djunits.value.vfloat.scalar.FloatTorque;
  67. import org.djunits.value.vfloat.scalar.FloatVolume;

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

  69. /**
  70.  * <p>
  71.  * Copyright (c) 2013-2018 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 ContinuousDistFloatScalar
  79. {
  80.     /**
  81.      * Absolute value.
  82.      * @param <T> The absolute FloatScalar 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 AbstractFloatScalarAbs<AU, T, RU, ?>, AU extends AbsoluteLinearUnit<AU, RU>, RU extends Unit<RU>>
  87.             extends AbstractContinuousDistScalar implements Absolute, Serializable
  88.     {
  89.         /** */
  90.         private static final long serialVersionUID = 20150000;

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

  99.         /**
  100.          * @param constant the constant value.
  101.          * @param unit the unit.
  102.          */
  103.         public Abs(final float 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.         @SuppressWarnings({ "unchecked", "rawtypes" })
  111.         public final T draw()
  112.         {
  113.             switch (getUnit().getClass().getSimpleName())
  114.             {
  115.                 case "DirectionUnit":
  116.                     return (T) new FloatDirection((float) getDistribution().draw(), (DirectionUnit) getUnit());

  117.                 case "PositionUnit":
  118.                     return (T) new FloatPosition((float) getDistribution().draw(), (PositionUnit) getUnit());

  119.                 case "AbsoluteTemperatureUnit":
  120.                     return (T) new FloatAbsoluteTemperature((float) getDistribution().draw(),
  121.                             (AbsoluteTemperatureUnit) getUnit());

  122.                 case "TimeUnit":
  123.                     return (T) new FloatTime((float) getDistribution().draw(), (TimeUnit) getUnit());

  124.                 default:
  125.                     return (T) new FloatScalar.Abs((float) getDistribution().draw(), (AU) getUnit());
  126.             }
  127.         }

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

  134.     }

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

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

  153.         /**
  154.          * @param constant the constant value.
  155.          * @param unit the unit.
  156.          */
  157.         public Rel(final float 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.         @SuppressWarnings({ "unchecked", "rawtypes" })
  165.         public final T draw()
  166.         {
  167.             switch (getUnit().getClass().getSimpleName())
  168.             {
  169.                 case "AccelerationUnit":
  170.                     return (T) new FloatAcceleration((float) getDistribution().draw(), (AccelerationUnit) getUnit());

  171.                 case "AngleUnit":
  172.                     return (T) new FloatAngle((float) getDistribution().draw(), (AngleUnit) getUnit());

  173.                 case "AngleSolidUnit":
  174.                     return (T) new FloatAngleSolid((float) getDistribution().draw(), (AngleSolidUnit) getUnit());

  175.                 case "AreaUnit":
  176.                     return (T) new FloatArea((float) getDistribution().draw(), (AreaUnit) getUnit());

  177.                 case "DensityUnit":
  178.                     return (T) new FloatDensity((float) getDistribution().draw(), (DensityUnit) getUnit());

  179.                 case "DimensionlessUnit":
  180.                     return (T) new FloatDimensionless((float) getDistribution().draw(), (DimensionlessUnit) getUnit());

  181.                 case "DurationUnit":
  182.                     return (T) new FloatDuration((float) getDistribution().draw(), (DurationUnit) getUnit());

  183.                 case "ElectricalChargeUnit":
  184.                     return (T) new FloatElectricalCharge((float) getDistribution().draw(), (ElectricalChargeUnit) getUnit());

  185.                 case "ElectricalCurrentUnit":
  186.                     return (T) new FloatElectricalCurrent((float) getDistribution().draw(), (ElectricalCurrentUnit) getUnit());

  187.                 case "ElectricalPotentialUnit":
  188.                     return (T) new FloatElectricalPotential((float) getDistribution().draw(),
  189.                             (ElectricalPotentialUnit) getUnit());

  190.                 case "ElectricalResistanceUnit":
  191.                     return (T) new FloatElectricalResistance((float) getDistribution().draw(),
  192.                             (ElectricalResistanceUnit) getUnit());

  193.                 case "EnergyUnit":
  194.                     return (T) new FloatEnergy((float) getDistribution().draw(), (EnergyUnit) getUnit());

  195.                 case "FlowMassUnit":
  196.                     return (T) new FloatFlowMass((float) getDistribution().draw(), (FlowMassUnit) getUnit());

  197.                 case "FlowVolumeUnit":
  198.                     return (T) new FloatFlowVolume((float) getDistribution().draw(), (FlowVolumeUnit) getUnit());

  199.                 case "ForceUnit":
  200.                     return (T) new FloatForce((float) getDistribution().draw(), (ForceUnit) getUnit());

  201.                 case "FrequencyUnit":
  202.                     return (T) new FloatFrequency((float) getDistribution().draw(), (FrequencyUnit) getUnit());

  203.                 case "LengthUnit":
  204.                     return (T) new FloatLength((float) getDistribution().draw(), (LengthUnit) getUnit());

  205.                 case "LinearDensityUnit":
  206.                     return (T) new FloatLinearDensity((float) getDistribution().draw(), (LinearDensityUnit) getUnit());

  207.                 case "MassUnit":
  208.                     return (T) new FloatMass((float) getDistribution().draw(), (MassUnit) getUnit());

  209.                 case "PowerUnit":
  210.                     return (T) new FloatPower((float) getDistribution().draw(), (PowerUnit) getUnit());

  211.                 case "PressureUnit":
  212.                     return (T) new FloatPressure((float) getDistribution().draw(), (PressureUnit) getUnit());

  213.                 case "SpeedUnit":
  214.                     return (T) new FloatSpeed((float) getDistribution().draw(), (SpeedUnit) getUnit());

  215.                 case "TemperatureUnit":
  216.                     return (T) new FloatTemperature((float) getDistribution().draw(), (TemperatureUnit) getUnit());

  217.                 case "TorqueUnit":
  218.                     return (T) new FloatTorque((float) getDistribution().draw(), (TorqueUnit) getUnit());

  219.                 case "VolumeUnit":
  220.                     return (T) new FloatVolume((float) getDistribution().draw(), (VolumeUnit) getUnit());

  221.                 default:
  222.                     return (T) new FloatScalar.Rel((float) getDistribution().draw(), getUnit());
  223.             }
  224.         }

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

  231.     }

  232. }