DemandPattern.java

package org.opentrafficsim.road.gtu.generator.headway;

import org.djunits.value.vdouble.scalar.Frequency;
import org.djunits.value.vdouble.scalar.Time;
import org.djunits.value.vdouble.vector.FrequencyVector;
import org.djunits.value.vdouble.vector.TimeVector;
import org.opentrafficsim.road.gtu.strategical.od.Interpolation;

/**
 * Demand pattern defined by a frequency vector, time vector and interpolation.
 * <p>
 * Copyright (c) 2013-2018 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
 * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
 * <p>
 * @version $Revision$, $LastChangedDate$, by $Author$, initial version 22 mrt. 2018 <br>
 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
 * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
 * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
 */
public class DemandPattern implements Arrivals
{

    /** Demand vector. */
    private final FrequencyVector demandVector;

    /** Time vector, may be null. */
    private final TimeVector timeVector;

    /** Interpolation, may be null. */
    private final Interpolation interpolation;

    /**
     * Constructor.
     * @param demandVector FrequencyVector; demand vector
     * @param timeVector TimeVector; time vector
     * @param interpolation Interpolation; interpolation
     */
    public DemandPattern(final FrequencyVector demandVector, final TimeVector timeVector, final Interpolation interpolation)
    {
        this.demandVector = demandVector;
        this.timeVector = timeVector;
        this.interpolation = interpolation;
    }

    /**
     * Returns the demand vector.
     * @return FrequencyVector; returns the demand vector
     */
    public final FrequencyVector getDemandVector()
    {
        return this.demandVector;
    }

    /**
     * Returns the time vector.
     * @return TimeVector; returns the time vector
     */
    public final TimeVector getTimeVector()
    {
        return this.timeVector;
    }

    /**
     * Returns the interpolation.
     * @return Interpolation; returns the interpolation
     */
    public final Interpolation getInterpolation()
    {
        return this.interpolation;
    }

    /** {@inheritDoc} */
    @Override
    public Frequency getFrequency(final Time time, final boolean sliceStart)
    {
        return this.interpolation.interpolateVector(time, this.demandVector, this.timeVector, sliceStart);
    }

    /** {@inheritDoc} */
    @Override
    public Time nextTimeSlice(final Time time)
    {
        for (Time d : this.timeVector)
        {
            if (d.gt(time))
            {
                return d;
            }
        }
        return null;
    }

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

    /** {@inheritDoc} */
    @Override
    public boolean equals(final Object obj)
    {
        if (this == obj)
        {
            return true;
        }
        if (obj == null)
        {
            return false;
        }
        if (getClass() != obj.getClass())
        {
            return false;
        }
        DemandPattern other = (DemandPattern) obj;
        if (this.demandVector == null)
        {
            if (other.demandVector != null)
            {
                return false;
            }
        }
        else if (!this.demandVector.equals(other.demandVector))
        {
            return false;
        }
        if (this.interpolation != other.interpolation)
        {
            return false;
        }
        if (this.timeVector == null)
        {
            if (other.timeVector != null)
            {
                return false;
            }
        }
        else if (!this.timeVector.equals(other.timeVector))
        {
            return false;
        }
        return true;
    }

    /** {@inheritDoc} */
    @Override
    public String toString()
    {
        return "DemandPattern [demandVector=" + this.demandVector + ", timeVector=" + this.timeVector + ", interpolation="
                + this.interpolation + "]";
    }

}