GtuTypeAssumptions.java

package org.opentrafficsim.road.gtu.lane.perception;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Map;

import org.djunits.value.vdouble.scalar.Speed;
import org.djutils.exceptions.Throw;
import org.opentrafficsim.base.parameters.Parameters;
import org.opentrafficsim.core.gtu.GtuType;
import org.opentrafficsim.road.gtu.lane.tactical.following.CarFollowingModel;
import org.opentrafficsim.road.network.lane.LaneType;

/**
 * <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 GtuTypeAssumptions implements Serializable
{
    /** */
    private static final long serialVersionUID = 20160527L;

    /** stored car following model of the observed GTU. */
    private final Map<GtuType, CarFollowingModel> carFollowingModelMap = new LinkedHashMap<>();

    /** stored parameters of the observed GTU. */
    private final Map<GtuType, Parameters> parametersMap = new LinkedHashMap<>();

    /** stored speed limit info of the observed GTU. */
    private final Map<GtuType, Map<LaneType, Speed>> laneTypeSpeedMap = new LinkedHashMap<>();

    /**
     * Set the car following model for a certain GtuType as an assumption for that GtuType.
     * @param gtuType GtuType; the GtuType to set the model for
     * @param carFollowingModel CarFollowingModel; the model to set for the GtuType
     */
    public final void setCarFollowingModel(final GtuType gtuType, final CarFollowingModel carFollowingModel)
    {
        Throw.whenNull(gtuType, "gtuType cannot be null");
        Throw.whenNull(carFollowingModel, "carFollowingModel cannot be null");
        this.carFollowingModelMap.put(gtuType, carFollowingModel);
    }

    /**
     * Set the parameters for a certain GtuType as an assumption for that GtuType.
     * @param gtuType GtuType; the GtuType to set the model for
     * @param parameters Parameters; the model to set for the GtuType
     */
    public final void setParameters(final GtuType gtuType, final Parameters parameters)
    {
        Throw.whenNull(gtuType, "gtuType cannot be null");
        Throw.whenNull(parameters, "parameters cannot be null");
        this.parametersMap.put(gtuType, parameters);
    }

    /**
     * Set the maximum speed for a certain GtuType on a certain LaneType as an assumption for that GtuType.
     * @param gtuType GtuType; the GtuType to set the model for
     * @param laneType LaneType; the laneType to set the speed for
     * @param maxSpeed Speed; the maximum speed on the laneType for the given GtuType
     */
    public final void setLaneTypeMaxSpeed(final GtuType gtuType, final LaneType laneType, final Speed maxSpeed)
    {
        Throw.whenNull(gtuType, "gtuType cannot be null");
        Throw.whenNull(laneType, "laneType cannot be null");
        Throw.whenNull(maxSpeed, "maxSpeed cannot be null");
        Map<LaneType, Speed> maxLaneTypeSpeed = this.laneTypeSpeedMap.get(gtuType);
        if (maxLaneTypeSpeed == null)
        {
            maxLaneTypeSpeed = new LinkedHashMap<>();
            this.laneTypeSpeedMap.put(gtuType, maxLaneTypeSpeed);
        }
        maxLaneTypeSpeed.put(laneType, maxSpeed);
    }

    /**
     * Return the car following model for a certain GtuType as an assumption for that GtuType.
     * @param gtuType GtuType; the GtuType to get the model for
     * @return the car following model for the GtuType, or <b>null</b> when there is no information for the gtuType
     */
    public final CarFollowingModel getCarFollowingModel(final GtuType gtuType)
    {
        return this.carFollowingModelMap.get(gtuType);
    }

    /**
     * Return the parameters model for a certain GtuType as an assumption for that GtuType.
     * @param gtuType GtuType; the GtuType to get the model for
     * @return the parameters for the GtuType, or <b>null</b> when there is no information for the gtuType
     */
    public final Parameters getParameters(final GtuType gtuType)
    {
        return this.parametersMap.get(gtuType);
    }

    /**
     * Return the maximum speed on a LaneType for a certain GtuType as an assumption for that GtuType.
     * @param gtuType GtuType; the GtuType to get the maximum speed for
     * @param laneType LaneType; the LaneType to get the maximum speed for
     * @return the maximum speed for the GtuType on the LaneType, or <b>null</b> when there is no information for the
     *         combination of gtuType and laneType
     */
    public final Speed getLaneTypeMaxSpeed(final GtuType gtuType, final LaneType laneType)
    {
        if (!this.laneTypeSpeedMap.containsKey(gtuType))
        {
            return null;
        }
        return this.laneTypeSpeedMap.get(gtuType).get(laneType);
    }

    /**
     * Return a safe copy of the maximum speed for all LaneTypes for a certain GtuType as an assumption for that GtuType.
     * @param gtuType GtuType; the GtuType to get the maximum speed for
     * @return a map with a safe copy of the maximum speed for the GtuType on all LaneTypes, or <b>null</b> when there is no
     *         information for the gtuType
     */
    public final Map<LaneType, Speed> getMaxSpeeds(final GtuType gtuType)
    {
        if (!this.laneTypeSpeedMap.containsKey(gtuType))
        {
            return null;
        }
        Map<LaneType, Speed> maxSpeeds = new LinkedHashMap<>();
        maxSpeeds.putAll(this.laneTypeSpeedMap.get(gtuType));
        return maxSpeeds;
    }

    /** {@inheritDoc} */
    @Override
    public final int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((this.parametersMap == null) ? 0 : this.parametersMap.hashCode());
        result = prime * result + ((this.carFollowingModelMap == null) ? 0 : this.carFollowingModelMap.hashCode());
        result = prime * result + ((this.laneTypeSpeedMap == null) ? 0 : this.laneTypeSpeedMap.hashCode());
        return result;
    }

    /** {@inheritDoc} */
    @Override
    @SuppressWarnings("checkstyle:needbraces")
    public final boolean equals(final Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        GtuTypeAssumptions other = (GtuTypeAssumptions) obj;
        if (this.parametersMap == null)
        {
            if (other.parametersMap != null)
                return false;
        }
        else if (!this.parametersMap.equals(other.parametersMap))
            return false;
        if (this.carFollowingModelMap == null)
        {
            if (other.carFollowingModelMap != null)
                return false;
        }
        else if (!this.carFollowingModelMap.equals(other.carFollowingModelMap))
            return false;
        if (this.laneTypeSpeedMap == null)
        {
            if (other.laneTypeSpeedMap != null)
                return false;
        }
        else if (!this.laneTypeSpeedMap.equals(other.laneTypeSpeedMap))
            return false;
        return true;
    }

    /** {@inheritDoc} */
    @Override
    public final String toString()
    {
        return "GTUTypeAssumptions [carFollowingModelMap=" + this.carFollowingModelMap + ", parametersMap=" + this.parametersMap
                + ", laneTypeSpeedMap=" + this.laneTypeSpeedMap + "]";
    }

}