AdaptationUpdateTime.java
package org.opentrafficsim.road.gtu.lane.perception.mental.channel;
import java.util.Optional;
import org.djunits.value.vdouble.scalar.Duration;
import org.djutils.exceptions.Throw;
import org.opentrafficsim.base.parameters.ParameterException;
import org.opentrafficsim.base.parameters.ParameterTypeDouble;
import org.opentrafficsim.base.parameters.ParameterTypeDuration;
import org.opentrafficsim.base.parameters.ParameterTypes;
import org.opentrafficsim.base.parameters.Parameters;
import org.opentrafficsim.base.parameters.constraint.NumericConstraint;
import org.opentrafficsim.core.gtu.Stateless;
import org.opentrafficsim.road.gtu.lane.perception.mental.BehavioralAdaptation;
/**
* Behavioral adaptation which increases the update time (time step) for lower levels of attention (maximum in steady-state in
* the Attention Matrix).
* <p>
* Copyright (c) 2024-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/wjschakel">Wouter Schakel</a>
*/
public final class AdaptationUpdateTime implements BehavioralAdaptation, Stateless<AdaptationUpdateTime>
{
/** Update time. */
public static final ParameterTypeDuration DT = ParameterTypes.DT;
/** Minimum update time. */
public static final ParameterTypeDuration DT_MIN =
new ParameterTypeDuration("dt_min", "Minimum update time.", Duration.ofSI(0.3), NumericConstraint.POSITIVEZERO)
{
@Override
public void check(final Duration value, final Parameters params) throws ParameterException
{
Optional<Duration> dtMax = params.getOptionalParameter(DT_MAX);
Throw.when(dtMax.isPresent() && value.si >= dtMax.get().si, ParameterException.class,
"Value of DT_MIN is above or equal to DT_MAX");
}
};
/** Minimum update time. */
public static final ParameterTypeDuration DT_MAX =
new ParameterTypeDuration("dt_max", "Maximum update time.", Duration.ofSI(2.0), NumericConstraint.POSITIVE)
{
@Override
public void check(final Duration value, final Parameters params) throws ParameterException
{
Optional<Duration> dtMin = params.getOptionalParameter(DT_MIN);
Throw.when(dtMin.isPresent() && value.si <= dtMin.get().si, ParameterException.class,
"Value of DT_MAX is below or equal to DT_MIN");
}
};
/** Level of attention, which is the maximum in the steady state of the Attention Matrix. */
public static final ParameterTypeDouble ATT = ChannelFuller.ATT;
/** Singleton instance. */
public static final AdaptationUpdateTime SINGLETON = new AdaptationUpdateTime();
/**
* Constructor.
*/
private AdaptationUpdateTime()
{
//
}
@Override
public void adapt(final Parameters parameters) throws ParameterException
{
parameters.setClaimedParameter(DT, Duration.interpolate(parameters.getParameter(DT_MAX),
parameters.getParameter(DT_MIN), parameters.getParameter(ATT)), this);
}
@Override
public AdaptationUpdateTime get()
{
return SINGLETON;
}
}