DiscreteDistFloatScalar.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.DistDiscrete;

  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 DiscreteDistFloatScalar
  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 AbstractDiscreteDistScalar implements Serializable, Generator<T>
  108.     {
  109.         /** */
  110.         private static final long serialVersionUID = 20150000L;

  111.         /**
  112.          * @param distribution the wrapped distribution function.
  113.          * @param unit the unit.
  114.          */
  115.         public Abs(final DistDiscrete 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 int 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 (getUnit().getClass().getSimpleName())
  136.             {
  137.                 case "DirectionUnit":
  138.                     return (T) new FloatDirection((float) getDistribution().draw(), (DirectionUnit) getUnit());

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

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

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

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

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

  156.     /**
  157.      * Relative value.
  158.      * @param <T> The absolute float scalar type
  159.      * @param <U> The unit type used
  160.      */
  161.     class Rel<T extends FloatScalarRel<U, T>, U extends Unit<U>> extends AbstractDiscreteDistScalar
  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 DistDiscrete 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 int 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 (getUnit().getClass().getSimpleName())
  191.             {
  192.                 case "AccelerationUnit":
  193.                     return (T) new FloatAcceleration((float) getDistribution().draw(), (AccelerationUnit) getUnit());

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

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

  198.                 case "CatalyticActivityUnit":
  199.                     return (T) new FloatCatalyticActivity((float) getDistribution().draw(), (CatalyticActivityUnit) getUnit());

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

  202.                 case "SolidAngleUnit":
  203.                     return (T) new FloatSolidAngle((float) getDistribution().draw(), (SolidAngleUnit) getUnit());

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

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

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

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

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

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

  216.                 case "ElectricalPotentialUnit":
  217.                     return (T) new FloatElectricalPotential((float) getDistribution().draw(),
  218.                             (ElectricalPotentialUnit) getUnit());

  219.                 case "ElectricalResistanceUnit":
  220.                     return (T) new FloatElectricalResistance((float) getDistribution().draw(),
  221.                             (ElectricalResistanceUnit) getUnit());

  222.                 case "ElectricalCapacitanceUnit":
  223.                     return (T) new FloatElectricalCapacitance((float) getDistribution().draw(),
  224.                             (ElectricalCapacitanceUnit) getUnit());

  225.                 case "ElectricalConductanceUnit":
  226.                     return (T) new FloatElectricalConductance((float) getDistribution().draw(),
  227.                             (ElectricalConductanceUnit) getUnit());

  228.                 case "ElectricalInductanceUnit":
  229.                     return (T) new FloatElectricalInductance((float) getDistribution().draw(),
  230.                             (ElectricalInductanceUnit) getUnit());

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

  233.                 case "EquivalentDoseUnit":
  234.                     return (T) new FloatEquivalentDose((float) getDistribution().draw(), (EquivalentDoseUnit) getUnit());

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

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

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

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

  243.                 case "IlluminanceUnit":
  244.                     return (T) new FloatIlluminance((float) getDistribution().draw(), (IlluminanceUnit) getUnit());

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

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

  249.                 case "LuminousFluxUnit":
  250.                     return (T) new FloatLuminousFlux((float) getDistribution().draw(), (LuminousFluxUnit) getUnit());

  251.                 case "LuminousIntensityUnit":
  252.                     return (T) new FloatLuminousIntensity((float) getDistribution().draw(), (LuminousIntensityUnit) getUnit());

  253.                 case "MagneticFluxUnit":
  254.                     return (T) new FloatMagneticFlux((float) getDistribution().draw(), (MagneticFluxUnit) getUnit());

  255.                 case "MagneticFluxDensityUnit":
  256.                     return (T) new FloatMagneticFluxDensity((float) getDistribution().draw(),
  257.                             (MagneticFluxDensityUnit) getUnit());

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

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

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

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

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

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

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

  272.                 default:
  273.                     throw new IllegalStateException("Unable to draw value for relative scalar with unit " + getUnit());
  274.             }
  275.         }

  276.         @Override
  277.         public final String toString()
  278.         {
  279.             return "DiscreteDistFloatScalar.Rel [T=" + getUnit().getClass().getSimpleName() + "]";
  280.         }
  281.     }

  282. }