HistoricalParameters.java

  1. package org.opentrafficsim.core.perception;

  2. import org.djunits.value.vdouble.scalar.Time;
  3. import org.opentrafficsim.base.parameters.ParameterException;
  4. import org.opentrafficsim.base.parameters.ParameterSet;
  5. import org.opentrafficsim.base.parameters.ParameterType;
  6. import org.opentrafficsim.base.parameters.Parameters;
  7. import org.opentrafficsim.core.perception.HistoricalParameters.ParameterEvent;
  8. import org.opentrafficsim.core.perception.HistoricalParameters.ParameterValueSet;

  9. /**
  10.  * Historical representation of {@code Parameters}.
  11.  * <p>
  12.  * Copyright (c) 2013-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
  13.  * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
  14.  * </p>
  15.  * @author <a href="https://github.com/averbraeck">Alexander Verbraeck</a>
  16.  * @author <a href="https://tudelft.nl/staff/p.knoppers-1">Peter Knoppers</a>
  17.  * @author <a href="https://github.com/wjschakel">Wouter Schakel</a>
  18.  */
  19. public class HistoricalParameters extends AbstractHistorical<ParameterValueSet, ParameterEvent> implements Parameters
  20. {

  21.     /** Current parameter set. */
  22.     private final Parameters params;

  23.     /**
  24.      * Constructor.
  25.      * @param manager HistoryManager; history manager
  26.      * @param parameters Parameters; initial parameter set
  27.      */
  28.     public HistoricalParameters(final HistoryManager manager, final Parameters parameters)
  29.     {
  30.         super(manager);
  31.         this.params = parameters;
  32.     }

  33.     /**
  34.      * Get the parameters at the current simulation time.
  35.      * @return Parameters; parameters at the current simulation time
  36.      */
  37.     public Parameters getParameters()
  38.     {
  39.         return new ParameterSet(this.params);
  40.     }

  41.     /**
  42.      * Get the parameters at the given simulation time.
  43.      * @param time Time; simulation time
  44.      * @return Parameters; parameters at the given simulation time
  45.      */
  46.     public Parameters getParameters(final Time time)
  47.     {
  48.         Parameters parameters = getParameters();
  49.         for (ParameterEvent event : getEvents(time))
  50.         {
  51.             event.resetEvent(parameters);
  52.         }
  53.         return parameters;
  54.     }

  55.     /** {@inheritDoc} */
  56.     @Override
  57.     public <T> void setParameter(final ParameterType<T> parameterType, final T value) throws ParameterException
  58.     {
  59.         addEvent(new ParameterEvent(now().si, parameterType, this.params));
  60.         this.params.setParameter(parameterType, value);
  61.     }

  62.     /** {@inheritDoc} */
  63.     @Override
  64.     public <T> void setParameterResettable(final ParameterType<T> parameterType, final T value) throws ParameterException
  65.     {
  66.         addEvent(new ParameterEvent(now().si, parameterType, this.params));
  67.         this.params.setParameterResettable(parameterType, value);
  68.     }

  69.     /** {@inheritDoc} */
  70.     @Override
  71.     public void resetParameter(final ParameterType<?> parameterType) throws ParameterException
  72.     {
  73.         addEvent(new ParameterEvent(now().si, parameterType, this.params));
  74.         this.params.resetParameter(parameterType);
  75.     }

  76.     /** {@inheritDoc} */
  77.     @Override
  78.     public <T> T getParameter(final ParameterType<T> parameterType) throws ParameterException
  79.     {
  80.         return this.params.getParameter(parameterType);
  81.     }

  82.     /** {@inheritDoc} */
  83.     @Override
  84.     public <T> T getParameterOrNull(final ParameterType<T> parameterType)
  85.     {
  86.         return this.params.getParameterOrNull(parameterType);
  87.     }

  88.     /** {@inheritDoc} */
  89.     @Override
  90.     public boolean contains(final ParameterType<?> parameterType)
  91.     {
  92.         return this.params.contains(parameterType);
  93.     }

  94.     /** {@inheritDoc} */
  95.     @Override
  96.     public void setAllIn(final Parameters parameters)
  97.     {
  98.         this.params.setAllIn(parameters);
  99.     }

  100.     /**
  101.      * Value for a parameter event, which contains a parameter type and (the previous) value.
  102.      * <p>
  103.      * Copyright (c) 2013-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
  104.      * <br>
  105.      * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
  106.      * </p>
  107.      * @author <a href="https://github.com/averbraeck">Alexander Verbraeck</a>
  108.      * @author <a href="https://tudelft.nl/staff/p.knoppers-1">Peter Knoppers</a>
  109.      * @author <a href="https://github.com/wjschakel">Wouter Schakel</a>
  110.      */
  111.     public static class ParameterValueSet
  112.     {

  113.         /** Parameter type. */
  114.         private final ParameterType<?> parameter;

  115.         /** Previous parameter value. */
  116.         private final Object value;

  117.         /**
  118.          * @param parameter ParameterType&lt;T&gt;; parameter
  119.          * @param value T; parameter value
  120.          * @param <T> parameter value type
  121.          */
  122.         public <T> ParameterValueSet(final ParameterType<T> parameter, final T value)
  123.         {
  124.             this.value = value;
  125.             this.parameter = parameter;
  126.         }

  127.         /**
  128.          * @return value.
  129.          */
  130.         public Object getValue()
  131.         {
  132.             return this.value;
  133.         }

  134.         /**
  135.          * @return parameter.
  136.          */
  137.         public ParameterType<?> getParameter()
  138.         {
  139.             return this.parameter;
  140.         }

  141.         /** {@inheritDoc} */
  142.         @Override
  143.         public String toString()
  144.         {
  145.             return "ParameterValueSet [parameter=" + this.parameter + ", value=" + this.value + "]";
  146.         }

  147.     }

  148.     /**
  149.      * Parameter event, which will restore the previous value.
  150.      * <p>
  151.      * Copyright (c) 2013-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
  152.      * <br>
  153.      * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
  154.      * </p>
  155.      * @author <a href="https://github.com/averbraeck">Alexander Verbraeck</a>
  156.      * @author <a href="https://tudelft.nl/staff/p.knoppers-1">Peter Knoppers</a>
  157.      * @author <a href="https://github.com/wjschakel">Wouter Schakel</a>
  158.      */
  159.     public static class ParameterEvent extends AbstractHistorical.EventValue<ParameterValueSet> // import is removed
  160.     {

  161.         /**
  162.          * Constructor. New value is not required, as it's not required to restore the state from before the change.
  163.          * @param time double; time of event
  164.          * @param parameterType ParameterType&lt;T&gt;; parameter type
  165.          * @param parameters Parameters; parameters
  166.          * @param <T> parameter value type
  167.          */
  168.         public <T> ParameterEvent(final double time, final ParameterType<T> parameterType, final Parameters parameters)
  169.         {
  170.             super(time, new ParameterValueSet(parameterType, parameters.getParameterOrNull(parameterType)));
  171.         }

  172.         /**
  173.          * Resets the parameter type to it's value before the change.
  174.          * @param parameters Parameters; parameters
  175.          * @param <T> parameter value type
  176.          */
  177.         @SuppressWarnings("unchecked")
  178.         public final <T> void resetEvent(final Parameters parameters)
  179.         {
  180.             try
  181.             {
  182.                 parameters.setParameter((ParameterType<T>) getValue().getParameter(), (T) getValue().getValue());
  183.             }
  184.             catch (ParameterException exception)
  185.             {
  186.                 // should not happen
  187.                 throw new RuntimeException(exception);
  188.             }
  189.         }

  190.         /** {@inheritDoc} */
  191.         @Override
  192.         public String toString()
  193.         {
  194.             return "ParameterEvent []";
  195.         }

  196.     }

  197.     /** {@inheritDoc} */
  198.     @Override
  199.     public String toString()
  200.     {
  201.         return "HistoricalParameters [params=" + this.params + "]";
  202.     }

  203. }