ToledoLaneChangeParameters.java

package org.opentrafficsim.road.gtu.lane.tactical.toledo;

import java.lang.reflect.Field;

import org.djunits.unit.DurationUnit;
import org.djunits.value.vdouble.scalar.Duration;
import org.opentrafficsim.base.parameters.ParameterException;
import org.opentrafficsim.base.parameters.ParameterTypeDouble;
import org.opentrafficsim.base.parameters.ParameterTypeDuration;
import org.opentrafficsim.base.parameters.Parameters;
import org.opentrafficsim.base.parameters.constraint.ConstraintInterface;

/**
 * List of parameters for the model of Toledo (2003).<br>
 * <br>
 * Tomer Toledo (2003) "Integrated Driving Behavior Modeling", Massachusetts Institute of Technology.
 * <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 final class ToledoLaneChangeParameters
{

    /** Fixed model time step. */
    public static final ParameterTypeDuration DT = new ParameterTypeDuration("dt", "Fixed model time step.",
            new Duration(0.5, DurationUnit.SI), ConstraintInterface.POSITIVE);

    /** */
    public static final ParameterTypeDouble C_CL = new ParameterTypeDouble("C_CL", "Current lane constant.", 2.128);

    /** */
    public static final ParameterTypeDouble C_RL = new ParameterTypeDouble("C_RL", "Right lane constant.", -0.369);

    /** */
    public static final ParameterTypeDouble BETA_RIGHT_MOST =
            new ParameterTypeDouble("Beta_right-most", "Factor on right-most dummy variable.", -1.039);

    /** */
    public static final ParameterTypeDouble BETA_VFRONT =
            new ParameterTypeDouble("Beta_Vfront", "Factor on speed of front vehicle.", 0.0745);

    /** */
    public static final ParameterTypeDouble BETA_SFRONT =
            new ParameterTypeDouble("Beta_Sfront", "Factor on spacing of front vehicle.", 0.0225);

    /** */
    public static final ParameterTypeDouble BETA_DENSITY =
            new ParameterTypeDouble("Beta_density", "Factor on density.", -0.0018);

    /** */
    public static final ParameterTypeDouble BETA_HEAVY_NEIGHBOUR =
            new ParameterTypeDouble("Beta_heavy_neighbour", "Factor on heavy neighbour dummy variable.", -0.218);

    /** */
    public static final ParameterTypeDouble BETA_TAILGATE =
            new ParameterTypeDouble("Beta_tailgate", "Factor on tailgate dummy variable.", -3.793);

    /** */
    public static final ParameterTypeDouble THETA_MLC =
            new ParameterTypeDouble("Theta_MLC", "Mandatory lane change power.", -0.358);

    /** */
    public static final ParameterTypeDouble BETA1 =
            new ParameterTypeDouble("Beta1", "Factor on 1 lane change dummy variable.", -2.269);

    /** */
    public static final ParameterTypeDouble BETA2 =
            new ParameterTypeDouble("Beta2", "Factor on 2 lane change dummy variable.", -4.466);

    /** */
    public static final ParameterTypeDouble BETA3 =
            new ParameterTypeDouble("Beta3", "Factor on 3 lane change dummy variable.", -7.265);

    /** */
    public static final ParameterTypeDouble BETA_NEXT_EXIT =
            new ParameterTypeDouble("Beta_next_exit", "Factor on next exit dummy variable.", -1.264);

    /** */
    public static final ParameterTypeDouble BETA_ADD =
            new ParameterTypeDouble("Beta_add", "Factor on add dummy variable.", -0.252);

    /** */
    public static final ParameterTypeDouble ALPHA_CL =
            new ParameterTypeDouble("Alpha_cl", "Factor on individual error term in current lane.", 0.539);

    /** */
    public static final ParameterTypeDouble ALPHA_RL =
            new ParameterTypeDouble("Alpha_rl", "Factor on individual error term in right lane.", 1.035);

    /** */
    public static final ParameterTypeDouble ERROR_TERM = new ParameterTypeDouble("Error term", "Individual error term.", 0);

    /** */
    public static final ParameterTypeDouble BETA_EMU_GA =
            new ParameterTypeDouble("Beta_EMU_GA", "Factor on expected utility maximization of gap acceptance.", 0.0052);

    /** */
    public static final ParameterTypeDouble SIGMA_LEAD =
            new ParameterTypeDouble("Sigma_lead", "Standard deviation in gap acceptance error term for lead gap.", 1.217);

    /** */
    public static final ParameterTypeDouble SIGMA_LAG =
            new ParameterTypeDouble("Sigma_lag", "Standard deviation in gap acceptance error term for lead gap.", 0.622);

    /** */
    public static final ParameterTypeDouble C_LEAD = new ParameterTypeDouble("C_lead", "Constant in lead critical gap.", 1.127);

    /** */
    public static final ParameterTypeDouble C_LAG = new ParameterTypeDouble("C_lag", "Constant in lag critical gap.", 0.968);

    /** */
    public static final ParameterTypeDouble BETA_POS_LEAD =
            new ParameterTypeDouble("Beta_pos_lead", "Factor on positive lead speed difference.", -2.178);

    /** */
    public static final ParameterTypeDouble BETA_NEG_LEAD =
            new ParameterTypeDouble("Beta_neg_lead", "Factor on negative lead speed difference.", -0.153);

    /** */
    public static final ParameterTypeDouble BETA_POS_LAG =
            new ParameterTypeDouble("Beta_pos_lag", "Factor on positive lag speed difference.", 0.491);

    /** */
    public static final ParameterTypeDouble BETA_EMU_LEAD =
            new ParameterTypeDouble("Beta_EMU_lead", "Factor on EMU target lead gap.", 0.0045);

    /** */
    public static final ParameterTypeDouble BETA_EMU_LAG =
            new ParameterTypeDouble("Beta_EMU_lag", "Factor on EMU target lag gap.", 0.0152);

    /** */
    public static final ParameterTypeDouble ALPHA_TL_LEAD =
            new ParameterTypeDouble("Alpha_tl_lead", "Factor on individual error term in target lane lead gap.", 0.789);

    /** */
    public static final ParameterTypeDouble ALPHA_TL_LAG =
            new ParameterTypeDouble("Alpha_tl_lag", "Factor on individual error term in target lane lag gap.", 0.107);

    /** */
    public static final ParameterTypeDouble C_FWD_TG =
            new ParameterTypeDouble("C_fwd_tg", "Constant forward gap utility.", -0.837);

    /** */
    public static final ParameterTypeDouble C_BCK_TG =
            new ParameterTypeDouble("C_bck_tg", "Constant forward gap utility.", 0.913);

    /** */
    public static final ParameterTypeDouble BETA_DTG =
            new ParameterTypeDouble("Beta_dtg", "Factor on distance to gap.", -2.393);

    /** */
    public static final ParameterTypeDouble BETA_EG =
            new ParameterTypeDouble("Beta_eg", "Factor on effective gap length.", 0.816);

    /** */
    public static final ParameterTypeDouble BETA_FV =
            new ParameterTypeDouble("Beta_fv", "Factor on front vehicle dummy variable.", -1.662);

    /** */
    public static final ParameterTypeDouble BETA_RGS =
            new ParameterTypeDouble("Beta_rgs", "Factor on relative gap speed.", -1.218);

    /** */
    public static final ParameterTypeDouble ALPHA_ADJ =
            new ParameterTypeDouble("Alpha_adj", "Factor on individual error term in adjacent gap.", 0.675);

    /** */
    public static final ParameterTypeDouble ALPHA_BCK =
            new ParameterTypeDouble("Alpha_bck", "Factor on individual error term in backward gap.", 0.239);

    /** */
    public static final ParameterTypeDouble BETA_DP = new ParameterTypeDouble("BETA_DP",
            "Factor on target gap for desired position.", 0.604, ConstraintInterface.UNITINTERVAL);

    /** */
    public static final ParameterTypeDouble C_FWD_ACC =
            new ParameterTypeDouble("C_fwd_acc", "Constant forward gap acceleration.", 0.385, ConstraintInterface.POSITIVE);

    /** */
    public static final ParameterTypeDouble BETA_FWD =
            new ParameterTypeDouble("BETA_fwd", "Power on desired relative position forward.", 0.323);

    /** */
    public static final ParameterTypeDouble LAMBDA_FWD_POS =
            new ParameterTypeDouble("LAMBDA_fwd_pos", "Factor on positive relative speed forward.", 0.0678);

    /** */
    public static final ParameterTypeDouble LAMBDA_FWD_NEG =
            new ParameterTypeDouble("LAMBDA_fwd_neg", "Factor on negative relative speed forward.", 0.217);

    /** */
    public static final ParameterTypeDouble SIGMA_FWD =
            new ParameterTypeDouble("SIGMA_fwd", "Standard deviation on forward gap acceleration error.", Math.exp(-0.540));

    /** */
    public static final ParameterTypeDouble C_BCK_ACC =
            new ParameterTypeDouble("C_bck_acc", "Constant backward gap acceleration.", -0.596, ConstraintInterface.NEGATIVE);

    /** */
    public static final ParameterTypeDouble BETA_BCK =
            new ParameterTypeDouble("BETA_bck", "Power on desired relative position backward.", -0.219);

    /** */
    public static final ParameterTypeDouble LAMBDA_BCK_POS =
            new ParameterTypeDouble("LAMBDA_bck_pos", "Factor on positive relative speed backward.", -0.0832);

    /** */
    public static final ParameterTypeDouble LAMBDA_BCK_NEG =
            new ParameterTypeDouble("LAMBDA_bck_neg", "Factor on negative relative speed backward.", -0.170);

    /** */
    public static final ParameterTypeDouble SIGMA_BCK =
            new ParameterTypeDouble("SIGMA_bck", "Standard deviation on backward gap acceleration error.", Math.exp(0.391));

    /** */
    public static final ParameterTypeDouble C_ADJ_ACC =
            new ParameterTypeDouble("C_adj_acc", "Constant adjacent gap acceleration.", 0.131);

    /** */
    public static final ParameterTypeDouble SIGMA_ADJ =
            new ParameterTypeDouble("SIGMA_adj", "Standard deviation on adjacent gap acceleration error.", Math.exp(-1.202));

    /**
     * 
     */
    private ToledoLaneChangeParameters()
    {
    }

    /**
     * Fills parameters with default values for all Toledo parameters.
     * @param parameters Parameters; parameters to fill
     */
    public static void setDefaultParameters(final Parameters parameters)
    {
        for (Field field : ToledoLaneChangeParameters.class.getDeclaredFields())
        {
            ParameterTypeDouble p;
            try
            {
                p = (ParameterTypeDouble) field.get(null);
                parameters.setParameter(p, p.getDefaultValue());
            }
            catch (IllegalArgumentException | IllegalAccessException | ClassCastException exception)
            {
                // if this occurs, this code should perhaps also support other parameter types, or perform other checks
                throw new RuntimeException("A field of ToledoParameters is not a public static ParameterTypeDouble.",
                        exception);
            }
            catch (ParameterException exception)
            {
                throw new RuntimeException("A field of ToledoParameters does not have a default value.", exception);
            }
        }
    }

}