Class ExperimentRunner<T extends Experiment>
- Type Parameters:
T
- the type ofExperiment
the runner will execute
- All Implemented Interfaces:
Runnable
public abstract class ExperimentRunner<T extends Experiment> extends AbstractExperiment
- Since:
- CloudSim Plus 1.0
- Author:
- Manoel Campos da Silva Filho
-
Field Summary
Fields Modifier and Type Field Description static double
CONFIDENCE_LEVEL
The confidence level for computing confidence interval. -
Constructor Summary
Constructors Constructor Description ExperimentRunner(boolean antitheticVariatesTechnique)
Creates an experiment runner, setting thebase seed
as the current time.ExperimentRunner(boolean antitheticVariatesTechnique, long baseSeed)
Creates an experiment runner with a givenbase seed
.ExperimentRunner(boolean antitheticVariatesTechnique, long baseSeed, boolean parallel)
Creates an experiment runner with a givenbase seed
. -
Method Summary
Modifier and Type Method Description protected void
addMetricValue(String metricName, double value)
Add a value to a given metric inside themetricsMap
.int
batchSizeCeil()
protected org.apache.commons.math3.stat.descriptive.SummaryStatistics
computeAndPrintFinalResults(Map.Entry<String,List<Double>> metricEntry)
Computes and prints final simulation results, including mean, standard deviations and confidence intervals for a given metric computed across all simulation runs.protected List<Double>
computeAntitheticMeans(List<Double> samples)
Computes the antithetic means for the given samples if the"Antithetic Variates Technique" is to be applied
.protected List<Double>
computeBatchMeans(List<Double> samples)
Gets an list of samples and apply the "Batch Means Method" to reduce samples correlation, if the "Batch Means Method"is to be applied
.protected org.apache.commons.math3.stat.descriptive.SummaryStatistics
computeFinalStatistics(List<Double> values)
Creates a SummaryStatistics object from a list of Double values, allowing computation of statistics such as mean over these values.protected double
confidenceErrorMargin(org.apache.commons.math3.stat.descriptive.SummaryStatistics stats, double confidenceLevel)
Computes the confidence interval error margin for a given set of samples in order to enable finding the interval lower and upper bound around a mean value.protected abstract T
createExperimentInternal(int i)
Creates an experiment to be run for the i'th time.ContinuousDistribution
createRandomGen(int experimentIndex)
Creates a pseudo random number generator (PRNG) for a experiment run that generates uniform values between [0 and 1[.ContinuousDistribution
createRandomGen(int experimentIndex, double minInclusive, double maxExclusive)
Creates a pseudo random number generator (PRNG) for a experiment run that generates uniform values between [min and max[.<T extends StatisticalDistribution>
TcreateRandomGen(int experimentIndex, Function<Long,T> randomGenCreator)
Uses the providedFunction
to create a pseudo random number generator (PRNG) for a experiment run.ExperimentRunner
enableLatexResultsTableGeneration()
Enables the generation of a result table in Latex format for computed metricslong
getBaseSeed()
Gets the seed to be used for the first executed experiment.int
getBatchesNumber()
Gets the number of batches in which the simulation runs will be divided.long
getExperimentsExecutionTimeSecs()
Time in seconds the experiments took to finish.long
getExperimentsStartTimeSecs()
Time in seconds the experiments started.int
getFirstExperimentCreated()
protected List<Double>
getMetricValues(String metricName)
int
getSimulationRuns()
Gets the number of times the experiment will be executed in order to get values such as means and standard deviations.int
halfSimulationRuns()
boolean
isApplyAntitheticVariatesTechnique()
Checks if the "Antithetic Variates Technique" is to be applied to reduce results variance.boolean
isApplyBatchMeansMethod()
Checks if the "Batch Means Method" is to be applied to reduce correlation between the results for different experiment runs.boolean
isToReuseSeedFromFirstHalfOfExperiments(int currentExperimentIndex)
protected abstract void
printSimulationParameters()
void
run()
Setups and starts the execution of all experiments sequentially or inparallel
.ExperimentRunner
setBaseSeed(long baseSeed)
ExperimentRunner
setBatchesNumber(int batchesNumber)
Sets the number of batches in which the simulation runs will be divided.ExperimentRunner
setDescription(String description)
Sets a description for this experiment which is shown when it starts.void
setFirstExperimentCreated(int firstExperimentCreated)
ExperimentRunner
setResultsTableId(String resultsTableId)
An id used to identify the experiment results table generated in formats such as Latex for computed metrics.protected ExperimentRunner
setSimulationRuns(int simulationRuns)
protected ExperimentRunner
setSimulationRunsAsMultipleOfBatchNumber()
Adjusts the current number of simulations to be equal to its closer multiple of the number of batches.protected abstract void
setupInternal()
Setup experiment attributes considering the dependency between each other.boolean
simulationRunsAndNumberOfBatchesAreCompatible()
Checks if the number of simulation runs and the number of batches are compatibleMethods inherited from class org.cloudsimplus.testbeds.AbstractExperiment
isNotVerbose, isVerbose, print, print, println, println, println, setVerbose
-
Field Details
-
CONFIDENCE_LEVEL
public static final double CONFIDENCE_LEVELThe confidence level for computing confidence interval.- See Also:
- Constant Field Values
-
-
Constructor Details
-
ExperimentRunner
public ExperimentRunner(boolean antitheticVariatesTechnique)Creates an experiment runner, setting thebase seed
as the current time.- Parameters:
antitheticVariatesTechnique
- indicates if it's to be applied the antithetic variates technique.
-
ExperimentRunner
public ExperimentRunner(boolean antitheticVariatesTechnique, long baseSeed)Creates an experiment runner with a givenbase seed
.- Parameters:
antitheticVariatesTechnique
- indicates if it's to be applied the antithetic variates technique.baseSeed
- the seed to be used as base for each experiment seed
-
ExperimentRunner
public ExperimentRunner(boolean antitheticVariatesTechnique, long baseSeed, boolean parallel)Creates an experiment runner with a givenbase seed
.- Parameters:
antitheticVariatesTechnique
- indicates if it's to be applied the antithetic variates technique.baseSeed
- the seed to be used as base for each experiment seed
-
-
Method Details
-
setupInternal
protected abstract void setupInternal()Setup experiment attributes considering the dependency between each other. The method is called by the
run()
method, just after all the attributes were set. By this way, it initializes internal attributes and validates other ones.NOTE: As a good practice, it is tried to reduce the number of parameters for the class constructor, as it tends to increase as the experiment code evolves. Accordingly, all the parameters have to be defined using the corresponding setters. By this way, it has to be avoided setting up attributes inside the constructor, once they can become invalid or out-of-date because dependency between parameters. The constructor has just to initialize objects to avoid
NullPointerException
. This way, one have to set all the parameters inside this method. For instance, if the constructor creates and Random Number Generator (PRNG) using a default seed but the method setSeed is called after the constructor, the PRNG will not be update to use the new seed. -
batchSizeCeil
public int batchSizeCeil()- Returns:
- the batch size rounded by the
Math.ceil(double)
method.
-
simulationRunsAndNumberOfBatchesAreCompatible
public boolean simulationRunsAndNumberOfBatchesAreCompatible()Checks if the number of simulation runs and the number of batches are compatible- Returns:
-
isApplyBatchMeansMethod
public boolean isApplyBatchMeansMethod()Checks if the "Batch Means Method" is to be applied to reduce correlation between the results for different experiment runs.- Returns:
-
computeBatchMeans
Gets an list of samples and apply the "Batch Means Method" to reduce samples correlation, if the "Batch Means Method"is to be applied
.- Parameters:
samples
- the list with samples to apply the "Batch Means Method". Samples size is defined by thegetSimulationRuns()
.- Returns:
- the samples list after applying the "Batch Means Method", in case
the method is enabled to be applied, which will reduce the array to the
number of batches defined by
getBatchesNumber()
(each value in the returned array will be the mean of every sample batch). Otherwise, returns the same given array
-
isApplyAntitheticVariatesTechnique
public boolean isApplyAntitheticVariatesTechnique()Checks if the "Antithetic Variates Technique" is to be applied to reduce results variance.- Returns:
- See Also:
- Antithetic variates
-
getSimulationRuns
public int getSimulationRuns()Gets the number of times the experiment will be executed in order to get values such as means and standard deviations. It has to be an even number if the"Antithetic Variates Technique"
is to be used.- Returns:
-
setSimulationRuns
-
setSimulationRunsAsMultipleOfBatchNumber
Adjusts the current number of simulations to be equal to its closer multiple of the number of batches.- Returns:
-
getBatchesNumber
public int getBatchesNumber()Gets the number of batches in which the simulation runs will be divided. If this number is greater than 1, the "Batch Means Method" is used to reduce the correlation between experiment runs.- Returns:
-
setBatchesNumber
Sets the number of batches in which the simulation runs will be divided.- Parameters:
batchesNumber
- number of simulation run batches- Returns:
- See Also:
getBatchesNumber()
-
getBaseSeed
public long getBaseSeed()Gets the seed to be used for the first executed experiment. The seed for each subsequent experiment is this seed plus the index of the experiment.- Returns:
-
createRandomGen
public <T extends StatisticalDistribution> T createRandomGen(int experimentIndex, Function<Long,T> randomGenCreator)Uses the providedFunction
to create a pseudo random number generator (PRNG) for a experiment run. The kind and parameters for this PRNG is defined internally by the given Function. This method calls that Function just providing the seed to be used for the current experiment run. If it is to apply the"Antithetic Variates Technique"
to reduce results variance, the second half of experiments will used the seeds from the first half.- Parameters:
experimentIndex
- index of the experiment run to create a PRNGrandomGenCreator
- aFunction
that receives a seed generated by the runner and returns a new instance of some PRNG- Returns:
- the created PRNG with the seed provided by the runner
- See Also:
UniformDistr.isApplyAntitheticVariates()
,createRandomGen(int, double, double)
-
createRandomGen
Creates a pseudo random number generator (PRNG) for a experiment run that generates uniform values between [0 and 1[. If it is to apply the"Antithetic Variates Technique"
to reduce results variance, the second half of experiments will used the seeds from the first half.- Parameters:
experimentIndex
- index of the experiment run to create a PRNG- Returns:
- the created PRNG
- See Also:
UniformDistr.isApplyAntitheticVariates()
,createRandomGen(int, double, double)
-
createRandomGen
public ContinuousDistribution createRandomGen(int experimentIndex, double minInclusive, double maxExclusive)Creates a pseudo random number generator (PRNG) for a experiment run that generates uniform values between [min and max[. If it is to apply the"Antithetic Variates Technique"
to reduce results' variance, the second half of experiments will use the seeds from the first half.- Parameters:
experimentIndex
- index of the experiment run to create a PRNGminInclusive
- the minimum value the generator will return (inclusive)maxExclusive
- the maximum value the generator will return (exclusive)- Returns:
- the created PRNG
- See Also:
UniformDistr.isApplyAntitheticVariates()
,createRandomGen(int)
-
isToReuseSeedFromFirstHalfOfExperiments
public boolean isToReuseSeedFromFirstHalfOfExperiments(int currentExperimentIndex) -
halfSimulationRuns
public int halfSimulationRuns()- Returns:
- the half of
getSimulationRuns()
-
getExperimentsExecutionTimeSecs
public long getExperimentsExecutionTimeSecs()Time in seconds the experiments took to finish.- Returns:
-
getExperimentsStartTimeSecs
public long getExperimentsStartTimeSecs()Time in seconds the experiments started.- Returns:
-
run
public void run()Setups and starts the execution of all experiments sequentially or inparallel
. -
createExperimentInternal
Creates an experiment to be run for the i'th time.- Parameters:
i
- a number that identifies the experiment- Returns:
- the created experiment
- See Also:
createExperiment(int)
-
computeAndPrintFinalResults
protected org.apache.commons.math3.stat.descriptive.SummaryStatistics computeAndPrintFinalResults(Map.Entry<String,List<Double>> metricEntry)Computes and prints final simulation results, including mean, standard deviations and confidence intervals for a given metric computed across all simulation runs.- Parameters:
metricEntry
- a map entry represented by the name of the metric and its list of values across multiple simulation runs- Returns:
- the computed
SummaryStatistics
from the provided values for the metric
-
computeFinalStatistics
protected final org.apache.commons.math3.stat.descriptive.SummaryStatistics computeFinalStatistics(List<Double> values)Creates a SummaryStatistics object from a list of Double values, allowing computation of statistics such as mean over these values. The method also checks if theAntithetic Variates
and theBatch Means
techniques are enabled and then apply them over the given list of Doubles. These techniques are used for variance reduction.- Parameters:
values
- the List of values to add to theSummaryStatistics
object- Returns:
- the
SummaryStatistics
object containing the double values, after applying the the techniques for variance reduction.
-
confidenceErrorMargin
protected double confidenceErrorMargin(org.apache.commons.math3.stat.descriptive.SummaryStatistics stats, double confidenceLevel)Computes the confidence interval error margin for a given set of samples in order to enable finding the interval lower and upper bound around a mean value. By this way, the confidence interval can be computed as [mean + errorMargin .. mean - errorMargin].
To reduce the confidence interval by half, one have to execute the experiments 4 more times. This is called the "Replication Method" and just works when the samples are i.i.d. (independent and identically distributed). Thus, if you have correlation between samples of each simulation run, a different method such as a bias compensation,
NOTE: How to compute the error margin is a little bit confusing. The Harry Perros' book states that if less than 30 samples are collected, the t-Distribution has to be used to that purpose. However, this article Wikipedia article says that if the standard deviation of the real population is known, it has to be used the z-value from the Standard Normal Distribution. Otherwise, it has to be used the t-value from the t-Distribution to calculate the critical value for defining the error margin (also called standard error). The book "Numeric Computation and Statistical Data Analysis on the Java Platform" confirms the last statement and such approach was followed.batch means
or regenerative method has to be used.- Parameters:
stats
- the statistic object with the values to compute the error margin of the confidence intervalconfidenceLevel
- the confidence level, in the interval from ]0 to 1[, such as 0.95 to indicate 95% of confidence.- Returns:
- the error margin to compute the lower and upper bound of the confidence interval
- See Also:
- Critical Values of the Student's t Distribution, t-Distribution, Harry Perros, "Computer Simulation Techniques: The definitive introduction!," 2009, Numeric Computation and Statistical Data Analysis on the Java Platform
-
addMetricValue
Add a value to a given metric inside themetricsMap
.This method must be called for each metric inside the experiment finish listener. The listener can be set inside the runner's
createExperimentInternal(int)
. -
getMetricValues
-
computeAntitheticMeans
Computes the antithetic means for the given samples if the
"Antithetic Variates Technique" is to be applied
. These values are the mean between the first half of samples with the second half. By this way, the resulting value is an array with half of the samples length.NOTE: To correctly compute the antithetic values the seeds from the first half of experiments must be used for the second half.
- Parameters:
samples
- the list of samples to compute the antithetic means from- Returns:
- the computed antithetic means from the given samples if the "Antithetic Variates Technique" is to be applied, otherwise return the same given samples list.
- See Also:
createRandomGen(int, double, double)
-
printSimulationParameters
protected abstract void printSimulationParameters() -
setBaseSeed
-
setFirstExperimentCreated
public void setFirstExperimentCreated(int firstExperimentCreated) -
getFirstExperimentCreated
public int getFirstExperimentCreated() -
setDescription
Sets a description for this experiment which is shown when it starts. It's also used to generate a caption for the Latex table.- Parameters:
description
- the description to set- See Also:
enableLatexResultsTableGeneration()
-
setResultsTableId
An id used to identify the experiment results table generated in formats such as Latex for computed metrics.- Parameters:
resultsTableId
- the name to set- See Also:
enableLatexResultsTableGeneration()
-
enableLatexResultsTableGeneration
Enables the generation of a result table in Latex format for computed metrics- Returns:
-