DistractionFactory.java

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

import java.util.ArrayList;
import java.util.List;

import org.djunits.value.vdouble.scalar.Duration;
import org.djunits.value.vdouble.scalar.Frequency;

import nl.tudelft.simulation.jstats.streams.StreamInterface;

/**
 * Utility to create a list of default distractions as derived by the research of Manuel Lindorfer.
 * <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://github.com/peter-knoppers">Peter Knoppers</a>
 * @author <a href="https://github.com/wjschakel">Wouter Schakel</a>
 */
public class DistractionFactory
{

    /** Random number stream. */
    private final StreamInterface stream;

    /** List of distractions. */
    private List<Distraction> list = new ArrayList<>();

    /**
     * Constructor.
     * @param stream random number stream
     */
    public DistractionFactory(final StreamInterface stream)
    {
        this.stream = stream;
    }

    /**
     * Adds a default distraction.
     * @param defaultDistraction default distraction
     * @param taskDemand task demand
     * @return this factory for method chaining
     */
    public final DistractionFactory addDistraction(final DefaultDistraction defaultDistraction, final double taskDemand)
    {
        return addDistraction(defaultDistraction.getId(), defaultDistraction.getDescription(),
                defaultDistraction.getFrequency(), defaultDistraction.getExposure(), defaultDistraction.getAverageDuration(),
                defaultDistraction.getStdDuration(), taskDemand);
    }

    /**
     * Adds a default distraction.
     * @param defaultDistraction default distraction
     * @param taskSupplier task supplier
     * @return this factory for method chaining
     */
    public final DistractionFactory addDistraction(final DefaultDistraction defaultDistraction, final TaskSupplier taskSupplier)
    {
        return addDistraction(defaultDistraction.getId(), defaultDistraction.getDescription(),
                defaultDistraction.getFrequency(), defaultDistraction.getExposure(), defaultDistraction.getAverageDuration(),
                defaultDistraction.getStdDuration(), taskSupplier);
    }

    /**
     * Helper method to create a distraction.
     * @param id id
     * @param description description
     * @param frequency frequency per exposed driver
     * @param exposure exposure (value in range [0...1])
     * @param averageDuration average duration
     * @param stdDuration standard deviation of duration
     * @param taskDemand task demand
     * @return this factory for method chaining
     */
    public final DistractionFactory addDistraction(final String id, final String description, final Frequency frequency,
            final double exposure, final Duration averageDuration, final Duration stdDuration, final double taskDemand)
    {
        addDistraction(id, description, frequency, exposure, averageDuration, stdDuration,
                new TaskSupplier.Constant(id, taskDemand));
        return this;
    }

    /**
     * Helper method to create a distraction.
     * @param id id
     * @param description description
     * @param frequency frequency per exposed driver
     * @param exposure exposure (value in range [0...1])
     * @param averageDuration average duration
     * @param stdDuration standard deviation of duration
     * @param taskSupplier task supplier
     * @return this factory for method chaining
     */
    public final DistractionFactory addDistraction(final String id, final String description, final Frequency frequency,
            final double exposure, final Duration averageDuration, final Duration stdDuration, final TaskSupplier taskSupplier)
    {
        this.list.add(
                new Distraction(id, description, frequency, exposure, averageDuration, stdDuration, this.stream, taskSupplier));
        return this;
    }

    /**
     * Returns the list of distractions.
     * @return list of distractions
     */
    public final List<Distraction> build()
    {
        return this.list;
    }

}