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.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.vdouble.scalar.AbsoluteTemperature;
  47. import org.djunits.value.vdouble.scalar.AbsorbedDose;
  48. import org.djunits.value.vdouble.scalar.Acceleration;
  49. import org.djunits.value.vdouble.scalar.AmountOfSubstance;
  50. import org.djunits.value.vdouble.scalar.Angle;
  51. import org.djunits.value.vdouble.scalar.Area;
  52. import org.djunits.value.vdouble.scalar.CatalyticActivity;
  53. import org.djunits.value.vdouble.scalar.Density;
  54. import org.djunits.value.vdouble.scalar.Dimensionless;
  55. import org.djunits.value.vdouble.scalar.Direction;
  56. import org.djunits.value.vdouble.scalar.Duration;
  57. import org.djunits.value.vdouble.scalar.ElectricalCapacitance;
  58. import org.djunits.value.vdouble.scalar.ElectricalCharge;
  59. import org.djunits.value.vdouble.scalar.ElectricalConductance;
  60. import org.djunits.value.vdouble.scalar.ElectricalCurrent;
  61. import org.djunits.value.vdouble.scalar.ElectricalInductance;
  62. import org.djunits.value.vdouble.scalar.ElectricalPotential;
  63. import org.djunits.value.vdouble.scalar.ElectricalResistance;
  64. import org.djunits.value.vdouble.scalar.Energy;
  65. import org.djunits.value.vdouble.scalar.EquivalentDose;
  66. import org.djunits.value.vdouble.scalar.FlowMass;
  67. import org.djunits.value.vdouble.scalar.FlowVolume;
  68. import org.djunits.value.vdouble.scalar.Force;
  69. import org.djunits.value.vdouble.scalar.Frequency;
  70. import org.djunits.value.vdouble.scalar.Illuminance;
  71. import org.djunits.value.vdouble.scalar.Length;
  72. import org.djunits.value.vdouble.scalar.LinearDensity;
  73. import org.djunits.value.vdouble.scalar.LuminousFlux;
  74. import org.djunits.value.vdouble.scalar.LuminousIntensity;
  75. import org.djunits.value.vdouble.scalar.MagneticFlux;
  76. import org.djunits.value.vdouble.scalar.MagneticFluxDensity;
  77. import org.djunits.value.vdouble.scalar.Mass;
  78. import org.djunits.value.vdouble.scalar.Position;
  79. import org.djunits.value.vdouble.scalar.Power;
  80. import org.djunits.value.vdouble.scalar.Pressure;
  81. import org.djunits.value.vdouble.scalar.SolidAngle;
  82. import org.djunits.value.vdouble.scalar.Speed;
  83. import org.djunits.value.vdouble.scalar.Temperature;
  84. import org.djunits.value.vdouble.scalar.Time;
  85. import org.djunits.value.vdouble.scalar.Torque;
  86. import org.djunits.value.vdouble.scalar.Volume;
  87. import org.djunits.value.vdouble.scalar.base.DoubleScalarAbs;
  88. import org.djunits.value.vdouble.scalar.base.DoubleScalarRel;
  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 ContinuousDistDoubleScalar
  99. {
  100.     /**
  101.      * Absolute value.
  102.      * @param <T> The absolute DoubleScalar 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 DoubleScalarAbs<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 = 20150000L;

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

  119.         /**
  120.          * @param constant double; the constant value.
  121.          * @param unit AU; the unit.
  122.          */
  123.         public Abs(final double 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 T draw()
  134.         {
  135.             switch (getDisplayUnit().getClass().getSimpleName())
  136.             {
  137.                 case "DirectionUnit":
  138.                     return (T) new Direction(getDistribution().draw(), (DirectionUnit) getDisplayUnit());

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

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

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

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

  149.         /** {@inheritDoc} */
  150.         @Override
  151.         public String toString()
  152.         {
  153.             return "ContinuousDistDoubleScalar.Abs [T=" + getDisplayUnit().getClass().getSimpleName() + "]";
  154.         }

  155.     }

  156.     /**
  157.      * Relative value.
  158.      * @param <T> The absolute DoubleScalar type
  159.      * @param <U> The unit type used
  160.      */
  161.     class Rel<T extends DoubleScalarRel<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 DistContinuous; the wrapped distribution function.
  168.          * @param unit U; the unit.
  169.          */
  170.         public Rel(final DistContinuous distribution, final U unit)
  171.         {
  172.             super(distribution, unit);
  173.         }

  174.         /**
  175.          * @param constant double; the constant value.
  176.          * @param unit U; the unit.
  177.          */
  178.         public Rel(final double 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 T draw()
  189.         {
  190.             switch (getDisplayUnit().getClass().getSimpleName())
  191.             {
  192.                 case "AccelerationUnit":
  193.                     return (T) new Acceleration(getDistribution().draw(), (AccelerationUnit) getDisplayUnit());

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

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

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

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

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

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

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

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

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

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

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

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

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

  220.                 case "ElectricalCapacitanceUnit":
  221.                     return (T) new ElectricalCapacitance(getDistribution().draw(),
  222.                             (ElectricalCapacitanceUnit) getDisplayUnit());

  223.                 case "ElectricalConductanceUnit":
  224.                     return (T) new ElectricalConductance(getDistribution().draw(),
  225.                             (ElectricalConductanceUnit) getDisplayUnit());

  226.                 case "ElectricalInductanceUnit":
  227.                     return (T) new ElectricalInductance(getDistribution().draw(), (ElectricalInductanceUnit) getDisplayUnit());

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

  230.                 case "EquivalentDoseUnit":
  231.                     return (T) new EquivalentDose(getDistribution().draw(), (EquivalentDoseUnit) getDisplayUnit());

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

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

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

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

  240.                 case "IlluminanceUnit":
  241.                     return (T) new Illuminance(getDistribution().draw(), (IlluminanceUnit) getDisplayUnit());

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

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

  246.                 case "LuminousFluxUnit":
  247.                     return (T) new LuminousFlux(getDistribution().draw(), (LuminousFluxUnit) getDisplayUnit());

  248.                 case "LuminousIntensityUnit":
  249.                     return (T) new LuminousIntensity(getDistribution().draw(), (LuminousIntensityUnit) getDisplayUnit());

  250.                 case "MagneticFluxUnit":
  251.                     return (T) new MagneticFlux(getDistribution().draw(), (MagneticFluxUnit) getDisplayUnit());

  252.                 case "MagneticFluxDensityUnit":
  253.                     return (T) new MagneticFluxDensity(getDistribution().draw(), (MagneticFluxDensityUnit) getDisplayUnit());

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

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

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

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

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

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

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

  268.                 default:
  269.                     throw new IllegalStateException("Unable to draw value for relative scalar with unit " + getDisplayUnit());
  270.             }
  271.         }

  272.         /** {@inheritDoc} */
  273.         @Override
  274.         public String toString()
  275.         {
  276.             return "ContinuousDistDoubleScalar.Rel [T=" + getDisplayUnit().getClass().getSimpleName() + "]";
  277.         }
  278.     }

  279. }