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.AbsorbedDoseUnit;
  6. import org.djunits.unit.AccelerationUnit;
  7. import org.djunits.unit.AmountOfSubstanceUnit;
  8. import org.djunits.unit.AngleUnit;
  9. import org.djunits.unit.AreaUnit;
  10. import org.djunits.unit.CatalyticActivityUnit;
  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.ElectricalCapacitanceUnit;
  16. import org.djunits.unit.ElectricalChargeUnit;
  17. import org.djunits.unit.ElectricalConductanceUnit;
  18. import org.djunits.unit.ElectricalCurrentUnit;
  19. import org.djunits.unit.ElectricalInductanceUnit;
  20. import org.djunits.unit.ElectricalPotentialUnit;
  21. import org.djunits.unit.ElectricalResistanceUnit;
  22. import org.djunits.unit.EnergyUnit;
  23. import org.djunits.unit.EquivalentDoseUnit;
  24. import org.djunits.unit.FlowMassUnit;
  25. import org.djunits.unit.FlowVolumeUnit;
  26. import org.djunits.unit.ForceUnit;
  27. import org.djunits.unit.FrequencyUnit;
  28. import org.djunits.unit.IlluminanceUnit;
  29. import org.djunits.unit.LengthUnit;
  30. import org.djunits.unit.LinearDensityUnit;
  31. import org.djunits.unit.LuminousFluxUnit;
  32. import org.djunits.unit.LuminousIntensityUnit;
  33. import org.djunits.unit.MagneticFluxDensityUnit;
  34. import org.djunits.unit.MagneticFluxUnit;
  35. import org.djunits.unit.MassUnit;
  36. import org.djunits.unit.PositionUnit;
  37. import org.djunits.unit.PowerUnit;
  38. import org.djunits.unit.PressureUnit;
  39. import org.djunits.unit.SolidAngleUnit;
  40. import org.djunits.unit.SpeedUnit;
  41. import org.djunits.unit.TemperatureUnit;
  42. import org.djunits.unit.TimeUnit;
  43. import org.djunits.unit.TorqueUnit;
  44. import org.djunits.unit.Unit;
  45. import org.djunits.unit.VolumeUnit;
  46. import org.djunits.value.vfloat.scalar.FloatAbsoluteTemperature;
  47. import org.djunits.value.vfloat.scalar.FloatAbsorbedDose;
  48. import org.djunits.value.vfloat.scalar.FloatAcceleration;
  49. import org.djunits.value.vfloat.scalar.FloatAmountOfSubstance;
  50. import org.djunits.value.vfloat.scalar.FloatAngle;
  51. import org.djunits.value.vfloat.scalar.FloatArea;
  52. import org.djunits.value.vfloat.scalar.FloatCatalyticActivity;
  53. import org.djunits.value.vfloat.scalar.FloatDensity;
  54. import org.djunits.value.vfloat.scalar.FloatDimensionless;
  55. import org.djunits.value.vfloat.scalar.FloatDirection;
  56. import org.djunits.value.vfloat.scalar.FloatDuration;
  57. import org.djunits.value.vfloat.scalar.FloatElectricalCapacitance;
  58. import org.djunits.value.vfloat.scalar.FloatElectricalCharge;
  59. import org.djunits.value.vfloat.scalar.FloatElectricalConductance;
  60. import org.djunits.value.vfloat.scalar.FloatElectricalCurrent;
  61. import org.djunits.value.vfloat.scalar.FloatElectricalInductance;
  62. import org.djunits.value.vfloat.scalar.FloatElectricalPotential;
  63. import org.djunits.value.vfloat.scalar.FloatElectricalResistance;
  64. import org.djunits.value.vfloat.scalar.FloatEnergy;
  65. import org.djunits.value.vfloat.scalar.FloatEquivalentDose;
  66. import org.djunits.value.vfloat.scalar.FloatFlowMass;
  67. import org.djunits.value.vfloat.scalar.FloatFlowVolume;
  68. import org.djunits.value.vfloat.scalar.FloatForce;
  69. import org.djunits.value.vfloat.scalar.FloatFrequency;
  70. import org.djunits.value.vfloat.scalar.FloatIlluminance;
  71. import org.djunits.value.vfloat.scalar.FloatLength;
  72. import org.djunits.value.vfloat.scalar.FloatLinearDensity;
  73. import org.djunits.value.vfloat.scalar.FloatLuminousFlux;
  74. import org.djunits.value.vfloat.scalar.FloatLuminousIntensity;
  75. import org.djunits.value.vfloat.scalar.FloatMagneticFlux;
  76. import org.djunits.value.vfloat.scalar.FloatMagneticFluxDensity;
  77. import org.djunits.value.vfloat.scalar.FloatMass;
  78. import org.djunits.value.vfloat.scalar.FloatPosition;
  79. import org.djunits.value.vfloat.scalar.FloatPower;
  80. import org.djunits.value.vfloat.scalar.FloatPressure;
  81. import org.djunits.value.vfloat.scalar.FloatSolidAngle;
  82. import org.djunits.value.vfloat.scalar.FloatSpeed;
  83. import org.djunits.value.vfloat.scalar.FloatTemperature;
  84. import org.djunits.value.vfloat.scalar.FloatTime;
  85. import org.djunits.value.vfloat.scalar.FloatTorque;
  86. import org.djunits.value.vfloat.scalar.FloatVolume;
  87. import org.djunits.value.vfloat.scalar.base.FloatScalarAbs;
  88. import org.djunits.value.vfloat.scalar.base.FloatScalarRel;
  89. import org.opentrafficsim.core.distributions.Generator;

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

  91. /**
  92.  * <p>
  93.  * Copyright (c) 2013-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
  94.  * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
  95.  * </p>
  96.  * @author <a href="https://github.com/averbraeck">Alexander Verbraeck</a>
  97.  */
  98. public interface ContinuousDistFloatScalar
  99. {
  100.     /**
  101.      * Absolute value.
  102.      * @param <T> The absolute FloatScalar type
  103.      * @param <AU> The absolute unit type used
  104.      * @param <RU> The relative unit type belonging to AU
  105.      */
  106.     class Abs<T extends FloatScalarAbs<AU, T, RU, ?>, AU extends AbsoluteLinearUnit<AU, RU>, RU extends Unit<RU>>
  107.             extends AbstractContinuousDistScalar implements Serializable, Generator<T>
  108.     {
  109.         /** */
  110.         private static final long serialVersionUID = 20150000;

  111.         /**
  112.          * @param distribution the wrapped distribution function.
  113.          * @param unit the unit.
  114.          */
  115.         public Abs(final DistContinuous distribution, final AU unit)
  116.         {
  117.             super(distribution, unit);
  118.         }

  119.         /**
  120.          * @param constant the constant value.
  121.          * @param unit the unit.
  122.          */
  123.         public Abs(final float constant, final AU unit)
  124.         {
  125.             super(constant, unit);
  126.         }

  127.         /**
  128.          * {@inheritDoc}
  129.          * @throws IllegalStateException when the unit is not of a known type
  130.          */
  131.         @Override
  132.         @SuppressWarnings("unchecked")
  133.         public final T draw()
  134.         {
  135.             switch (getDisplayUnit().getClass().getSimpleName())
  136.             {
  137.                 case "DirectionUnit":
  138.                     return (T) new FloatDirection((float) getDistribution().draw(), (DirectionUnit) getDisplayUnit());

  139.                 case "PositionUnit":
  140.                     return (T) new FloatPosition((float) getDistribution().draw(), (PositionUnit) getDisplayUnit());

  141.                 case "AbsoluteTemperatureUnit":
  142.                     return (T) new FloatAbsoluteTemperature((float) getDistribution().draw(),
  143.                             (AbsoluteTemperatureUnit) getDisplayUnit());

  144.                 case "TimeUnit":
  145.                     return (T) new FloatTime((float) getDistribution().draw(), (TimeUnit) getDisplayUnit());

  146.                 default:
  147.                     throw new IllegalStateException("Unable to draw value for absolute scalar with unit " + getDisplayUnit());
  148.             }
  149.         }

  150.         @Override
  151.         public final String toString()
  152.         {
  153.             return "ContinuousDistFloatScalar.Abs [T=" + getDisplayUnit().getClass().getSimpleName() + "]";
  154.         }

  155.     }

  156.     /**
  157.      * Relative value.
  158.      * @param <T> The absolute FloatScalar type
  159.      * @param <U> The unit type used
  160.      */
  161.     class Rel<T extends FloatScalarRel<U, T>, U extends Unit<U>> extends AbstractContinuousDistScalar
  162.             implements Serializable, Generator<T>
  163.     {
  164.         /** */
  165.         private static final long serialVersionUID = 20150000L;

  166.         /**
  167.          * @param distribution the wrapped distribution function.
  168.          * @param unit the unit.
  169.          */
  170.         public Rel(final DistContinuous distribution, final U unit)
  171.         {
  172.             super(distribution, unit);
  173.         }

  174.         /**
  175.          * @param constant the constant value.
  176.          * @param unit the unit.
  177.          */
  178.         public Rel(final float constant, final U unit)
  179.         {
  180.             super(constant, unit);
  181.         }

  182.         /**
  183.          * {@inheritDoc}
  184.          * @throws IllegalStateException when the unit is not of a known type
  185.          */
  186.         @Override
  187.         @SuppressWarnings("unchecked")
  188.         public final T draw()
  189.         {
  190.             switch (getDisplayUnit().getClass().getSimpleName())
  191.             {
  192.                 case "AccelerationUnit":
  193.                     return (T) new FloatAcceleration((float) getDistribution().draw(), (AccelerationUnit) getDisplayUnit());

  194.                 case "AbsorbedDoseUnit":
  195.                     return (T) new FloatAbsorbedDose((float) getDistribution().draw(), (AbsorbedDoseUnit) getDisplayUnit());

  196.                 case "AmountOfSubstanceUnit":
  197.                     return (T) new FloatAmountOfSubstance((float) getDistribution().draw(),
  198.                             (AmountOfSubstanceUnit) getDisplayUnit());

  199.                 case "CatalyticActivityUnit":
  200.                     return (T) new FloatCatalyticActivity((float) getDistribution().draw(),
  201.                             (CatalyticActivityUnit) getDisplayUnit());

  202.                 case "AngleUnit":
  203.                     return (T) new FloatAngle((float) getDistribution().draw(), (AngleUnit) getDisplayUnit());

  204.                 case "SolidAngleUnit":
  205.                     return (T) new FloatSolidAngle((float) getDistribution().draw(), (SolidAngleUnit) getDisplayUnit());

  206.                 case "AreaUnit":
  207.                     return (T) new FloatArea((float) getDistribution().draw(), (AreaUnit) getDisplayUnit());

  208.                 case "DensityUnit":
  209.                     return (T) new FloatDensity((float) getDistribution().draw(), (DensityUnit) getDisplayUnit());

  210.                 case "DimensionlessUnit":
  211.                     return (T) new FloatDimensionless((float) getDistribution().draw(), (DimensionlessUnit) getDisplayUnit());

  212.                 case "DurationUnit":
  213.                     return (T) new FloatDuration((float) getDistribution().draw(), (DurationUnit) getDisplayUnit());

  214.                 case "ElectricalChargeUnit":
  215.                     return (T) new FloatElectricalCharge((float) getDistribution().draw(),
  216.                             (ElectricalChargeUnit) getDisplayUnit());

  217.                 case "ElectricalCurrentUnit":
  218.                     return (T) new FloatElectricalCurrent((float) getDistribution().draw(),
  219.                             (ElectricalCurrentUnit) getDisplayUnit());

  220.                 case "ElectricalPotentialUnit":
  221.                     return (T) new FloatElectricalPotential((float) getDistribution().draw(),
  222.                             (ElectricalPotentialUnit) getDisplayUnit());

  223.                 case "ElectricalResistanceUnit":
  224.                     return (T) new FloatElectricalResistance((float) getDistribution().draw(),
  225.                             (ElectricalResistanceUnit) getDisplayUnit());

  226.                 case "ElectricalCapacitanceUnit":
  227.                     return (T) new FloatElectricalCapacitance((float) getDistribution().draw(),
  228.                             (ElectricalCapacitanceUnit) getDisplayUnit());

  229.                 case "ElectricalConductanceUnit":
  230.                     return (T) new FloatElectricalConductance((float) getDistribution().draw(),
  231.                             (ElectricalConductanceUnit) getDisplayUnit());

  232.                 case "ElectricalInductanceUnit":
  233.                     return (T) new FloatElectricalInductance((float) getDistribution().draw(),
  234.                             (ElectricalInductanceUnit) getDisplayUnit());

  235.                 case "EnergyUnit":
  236.                     return (T) new FloatEnergy((float) getDistribution().draw(), (EnergyUnit) getDisplayUnit());

  237.                 case "EquivalentDoseUnit":
  238.                     return (T) new FloatEquivalentDose((float) getDistribution().draw(), (EquivalentDoseUnit) getDisplayUnit());

  239.                 case "FlowMassUnit":
  240.                     return (T) new FloatFlowMass((float) getDistribution().draw(), (FlowMassUnit) getDisplayUnit());

  241.                 case "FlowVolumeUnit":
  242.                     return (T) new FloatFlowVolume((float) getDistribution().draw(), (FlowVolumeUnit) getDisplayUnit());

  243.                 case "ForceUnit":
  244.                     return (T) new FloatForce((float) getDistribution().draw(), (ForceUnit) getDisplayUnit());

  245.                 case "FrequencyUnit":
  246.                     return (T) new FloatFrequency((float) getDistribution().draw(), (FrequencyUnit) getDisplayUnit());

  247.                 case "IlluminanceUnit":
  248.                     return (T) new FloatIlluminance((float) getDistribution().draw(), (IlluminanceUnit) getDisplayUnit());

  249.                 case "LengthUnit":
  250.                     return (T) new FloatLength((float) getDistribution().draw(), (LengthUnit) getDisplayUnit());

  251.                 case "LinearDensityUnit":
  252.                     return (T) new FloatLinearDensity((float) getDistribution().draw(), (LinearDensityUnit) getDisplayUnit());

  253.                 case "LuminousFluxUnit":
  254.                     return (T) new FloatLuminousFlux((float) getDistribution().draw(), (LuminousFluxUnit) getDisplayUnit());

  255.                 case "LuminousIntensityUnit":
  256.                     return (T) new FloatLuminousIntensity((float) getDistribution().draw(),
  257.                             (LuminousIntensityUnit) getDisplayUnit());

  258.                 case "MagneticFluxUnit":
  259.                     return (T) new FloatMagneticFlux((float) getDistribution().draw(), (MagneticFluxUnit) getDisplayUnit());

  260.                 case "MagneticFluxDensityUnit":
  261.                     return (T) new FloatMagneticFluxDensity((float) getDistribution().draw(),
  262.                             (MagneticFluxDensityUnit) getDisplayUnit());

  263.                 case "MassUnit":
  264.                     return (T) new FloatMass((float) getDistribution().draw(), (MassUnit) getDisplayUnit());

  265.                 case "PowerUnit":
  266.                     return (T) new FloatPower((float) getDistribution().draw(), (PowerUnit) getDisplayUnit());

  267.                 case "PressureUnit":
  268.                     return (T) new FloatPressure((float) getDistribution().draw(), (PressureUnit) getDisplayUnit());

  269.                 case "SpeedUnit":
  270.                     return (T) new FloatSpeed((float) getDistribution().draw(), (SpeedUnit) getDisplayUnit());

  271.                 case "TemperatureUnit":
  272.                     return (T) new FloatTemperature((float) getDistribution().draw(), (TemperatureUnit) getDisplayUnit());

  273.                 case "TorqueUnit":
  274.                     return (T) new FloatTorque((float) getDistribution().draw(), (TorqueUnit) getDisplayUnit());

  275.                 case "VolumeUnit":
  276.                     return (T) new FloatVolume((float) getDistribution().draw(), (VolumeUnit) getDisplayUnit());

  277.                 default:
  278.                     throw new IllegalStateException("Unable to draw value for relative scalar with unit " + getDisplayUnit());
  279.             }
  280.         }

  281.         @Override
  282.         public final String toString()
  283.         {
  284.             return "ContinuousDistFloatScalar.Rel [T=" + getDisplayUnit().getClass().getSimpleName() + "]";
  285.         }

  286.     }

  287. }