HistoricalParameters.java
package org.opentrafficsim.core.perception;
import org.djunits.value.vdouble.scalar.Time;
import org.opentrafficsim.base.parameters.ParameterException;
import org.opentrafficsim.base.parameters.ParameterSet;
import org.opentrafficsim.base.parameters.ParameterType;
import org.opentrafficsim.base.parameters.Parameters;
import org.opentrafficsim.core.perception.HistoricalParameters.ParameterEvent;
import org.opentrafficsim.core.perception.HistoricalParameters.ParameterValueSet;
/**
* Historical representation of {@code Parameters}.
* <p>
* Copyright (c) 2013-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
* BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
* </p>
* @author <a href="https://github.com/averbraeck">Alexander Verbraeck</a>
* @author <a href="https://tudelft.nl/staff/p.knoppers-1">Peter Knoppers</a>
* @author <a href="https://github.com/wjschakel">Wouter Schakel</a>
*/
public class HistoricalParameters extends AbstractHistorical<ParameterValueSet, ParameterEvent> implements Parameters
{
/** Current parameter set. */
private final Parameters params;
/**
* Constructor.
* @param manager HistoryManager; history manager
* @param parameters Parameters; initial parameter set
*/
public HistoricalParameters(final HistoryManager manager, final Parameters parameters)
{
super(manager);
this.params = parameters;
}
/**
* Get the parameters at the current simulation time.
* @return Parameters; parameters at the current simulation time
*/
public Parameters getParameters()
{
return new ParameterSet(this.params);
}
/**
* Get the parameters at the given simulation time.
* @param time Time; simulation time
* @return Parameters; parameters at the given simulation time
*/
public Parameters getParameters(final Time time)
{
Parameters parameters = getParameters();
for (ParameterEvent event : getEvents(time))
{
event.resetEvent(parameters);
}
return parameters;
}
/** {@inheritDoc} */
@Override
public <T> void setParameter(final ParameterType<T> parameterType, final T value) throws ParameterException
{
addEvent(new ParameterEvent(now().si, parameterType, this.params));
this.params.setParameter(parameterType, value);
}
/** {@inheritDoc} */
@Override
public <T> void setParameterResettable(final ParameterType<T> parameterType, final T value) throws ParameterException
{
addEvent(new ParameterEvent(now().si, parameterType, this.params));
this.params.setParameterResettable(parameterType, value);
}
/** {@inheritDoc} */
@Override
public void resetParameter(final ParameterType<?> parameterType) throws ParameterException
{
addEvent(new ParameterEvent(now().si, parameterType, this.params));
this.params.resetParameter(parameterType);
}
/** {@inheritDoc} */
@Override
public <T> T getParameter(final ParameterType<T> parameterType) throws ParameterException
{
return this.params.getParameter(parameterType);
}
/** {@inheritDoc} */
@Override
public <T> T getParameterOrNull(final ParameterType<T> parameterType)
{
return this.params.getParameterOrNull(parameterType);
}
/** {@inheritDoc} */
@Override
public boolean contains(final ParameterType<?> parameterType)
{
return this.params.contains(parameterType);
}
/** {@inheritDoc} */
@Override
public void setAllIn(final Parameters parameters)
{
this.params.setAllIn(parameters);
}
/**
* Value for a parameter event, which contains a parameter type and (the previous) value.
* <p>
* Copyright (c) 2013-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
* <br>
* BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
* </p>
* @author <a href="https://github.com/averbraeck">Alexander Verbraeck</a>
* @author <a href="https://tudelft.nl/staff/p.knoppers-1">Peter Knoppers</a>
* @author <a href="https://github.com/wjschakel">Wouter Schakel</a>
*/
public static class ParameterValueSet
{
/** Parameter type. */
private final ParameterType<?> parameter;
/** Previous parameter value. */
private final Object value;
/**
* @param parameter ParameterType<T>; parameter
* @param value T; parameter value
* @param <T> parameter value type
*/
public <T> ParameterValueSet(final ParameterType<T> parameter, final T value)
{
this.value = value;
this.parameter = parameter;
}
/**
* @return value.
*/
public Object getValue()
{
return this.value;
}
/**
* @return parameter.
*/
public ParameterType<?> getParameter()
{
return this.parameter;
}
/** {@inheritDoc} */
@Override
public String toString()
{
return "ParameterValueSet [parameter=" + this.parameter + ", value=" + this.value + "]";
}
}
/**
* Parameter event, which will restore the previous value.
* <p>
* Copyright (c) 2013-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
* <br>
* BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
* </p>
* @author <a href="https://github.com/averbraeck">Alexander Verbraeck</a>
* @author <a href="https://tudelft.nl/staff/p.knoppers-1">Peter Knoppers</a>
* @author <a href="https://github.com/wjschakel">Wouter Schakel</a>
*/
public static class ParameterEvent extends AbstractHistorical.EventValue<ParameterValueSet> // import is removed
{
/**
* Constructor. New value is not required, as it's not required to restore the state from before the change.
* @param time double; time of event
* @param parameterType ParameterType<T>; parameter type
* @param parameters Parameters; parameters
* @param <T> parameter value type
*/
public <T> ParameterEvent(final double time, final ParameterType<T> parameterType, final Parameters parameters)
{
super(time, new ParameterValueSet(parameterType, parameters.getParameterOrNull(parameterType)));
}
/**
* Resets the parameter type to it's value before the change.
* @param parameters Parameters; parameters
* @param <T> parameter value type
*/
@SuppressWarnings("unchecked")
public final <T> void resetEvent(final Parameters parameters)
{
try
{
parameters.setParameter((ParameterType<T>) getValue().getParameter(), (T) getValue().getValue());
}
catch (ParameterException exception)
{
// should not happen
throw new RuntimeException(exception);
}
}
/** {@inheritDoc} */
@Override
public String toString()
{
return "ParameterEvent []";
}
}
/** {@inheritDoc} */
@Override
public String toString()
{
return "HistoricalParameters [params=" + this.params + "]";
}
}