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://github.com/peter-knoppers">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 history manager
  26.      * @param parameters initial parameter set
  27.      * @param owner object that owns the historical value
  28.      */
  29.     public HistoricalParameters(final HistoryManager manager, final Object owner, final Parameters parameters)
  30.     {
  31.         super(manager, owner);
  32.         this.params = parameters;
  33.     }

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

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

  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.     @Override
  63.     public <T> void setParameterResettable(final ParameterType<T> parameterType, final T value) throws ParameterException
  64.     {
  65.         addEvent(new ParameterEvent(now().si, parameterType, this.params));
  66.         this.params.setParameterResettable(parameterType, value);
  67.     }

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

  74.     @Override
  75.     public <T> T getParameter(final ParameterType<T> parameterType) throws ParameterException
  76.     {
  77.         return this.params.getParameter(parameterType);
  78.     }

  79.     @Override
  80.     public <T> T getParameterOrNull(final ParameterType<T> parameterType)
  81.     {
  82.         return this.params.getParameterOrNull(parameterType);
  83.     }

  84.     @Override
  85.     public boolean contains(final ParameterType<?> parameterType)
  86.     {
  87.         return this.params.contains(parameterType);
  88.     }

  89.     @Override
  90.     public void setAllIn(final Parameters parameters)
  91.     {
  92.         this.params.setAllIn(parameters);
  93.     }

  94.     @Override
  95.     public String toString()
  96.     {
  97.         return "HistoricalParameters [params=" + this.params + "]";
  98.     }

  99.     /**
  100.      * Value for a parameter event, which contains a parameter type and (the previous) value.
  101.      * @param <T> type of parameter
  102.      * @param parameter parameter
  103.      * @param value parameter value
  104.      */
  105.     record ParameterValueSet<T>(ParameterType<T> parameter, T value)
  106.     {
  107.     }

  108.     /**
  109.      * Parameter event, which will restore the previous value.
  110.      */
  111.     public static class ParameterEvent extends AbstractHistorical.EventValue<ParameterValueSet<?>> // import is removed
  112.     {

  113.         /**
  114.          * Constructor. New value is not required, as it's not required to restore the state from before the change.
  115.          * @param time time of event
  116.          * @param parameterType parameter type
  117.          * @param parameters parameters
  118.          * @param <T> parameter value type
  119.          */
  120.         public <T> ParameterEvent(final double time, final ParameterType<T> parameterType, final Parameters parameters)
  121.         {
  122.             super(time, new ParameterValueSet<T>(parameterType, parameters.getParameterOrNull(parameterType)));
  123.         }

  124.         /**
  125.          * Resets the parameter type to it's value before the change.
  126.          * @param parameters parameters
  127.          * @param <T> parameter value type
  128.          */
  129.         @SuppressWarnings("unchecked")
  130.         public final <T> void resetEvent(final Parameters parameters)
  131.         {
  132.             try
  133.             {
  134.                 parameters.setParameter((ParameterType<T>) getValue().parameter(), (T) getValue().value());
  135.             }
  136.             catch (ParameterException exception)
  137.             {
  138.                 // should not happen
  139.                 throw new RuntimeException(exception);
  140.             }
  141.         }

  142.         @Override
  143.         public String toString()
  144.         {
  145.             return "ParameterEvent [time=" + getTime() + ", value=" + getValue() + "]";
  146.         }

  147.     }

  148. }