You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
5.5 KiB
185 lines
5.5 KiB
//==============================================================================
|
|
//
|
|
// Copyright (c) 2002-
|
|
// Authors:
|
|
// * Vincent Nimal <vincent.nimal@comlab.ox.ac.uk> (University of Oxford)
|
|
// * Dave Parker <david.parker@comlab.ox.ac.uk> (University of Oxford)
|
|
//
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
// This file is part of PRISM.
|
|
//
|
|
// PRISM is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation; either version 2 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// PRISM is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with PRISM; if not, write to the Free Software Foundation,
|
|
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
//
|
|
//==============================================================================
|
|
|
|
package simulator.method;
|
|
|
|
import prism.PrismException;
|
|
import simulator.sampler.Sampler;
|
|
import cern.jet.stat.Probability;
|
|
|
|
/**
|
|
* SimulationMethod class for the ACI ("asymptotic confidence interval") approach.
|
|
* Case where 'iterations' (number of samples) is unknown parameter.
|
|
*/
|
|
public final class ACIiterations extends CIMethod
|
|
{
|
|
// For reward properties, manually specified number of iterations
|
|
// after which to conclude whether we are in S^2=0 case or not
|
|
private int reqIterToConclude;
|
|
private boolean reqIterToConcludeGiven;
|
|
// For reward properties, maximum value of reward allows
|
|
// automatic detection of whether we are in S^2=0 case or not
|
|
private double maxReward;
|
|
// Final number of iterations of sampling
|
|
private int computedIterations;
|
|
// Square of quantile
|
|
private double squaredQuantile;
|
|
|
|
// CONSTRUCTORS
|
|
|
|
// probabilities, automatic
|
|
public ACIiterations(double confidenceLevel, double width)
|
|
{
|
|
this.confidence = confidenceLevel;
|
|
this.width = width;
|
|
reqIterToConclude = 0;
|
|
reqIterToConcludeGiven = false;
|
|
maxReward = 1.0;
|
|
computedIterations = 0;
|
|
squaredQuantile = 0.0;
|
|
}
|
|
|
|
// probabilities or rewards, manual
|
|
public ACIiterations(double confidenceLevel, double width, int reqIterToConclude)
|
|
{
|
|
this.confidence = confidenceLevel;
|
|
this.width = width;
|
|
this.reqIterToConclude = reqIterToConclude;
|
|
reqIterToConcludeGiven = true;
|
|
maxReward = 1.0;
|
|
computedIterations = 0;
|
|
squaredQuantile = 0.0;
|
|
}
|
|
|
|
// rewards, automatic
|
|
public ACIiterations(double confidenceLevel, double width, double maxReward)
|
|
{
|
|
this.confidence = confidenceLevel;
|
|
this.width = width;
|
|
this.maxReward = maxReward;
|
|
reqIterToConclude = 0;
|
|
reqIterToConcludeGiven = false;
|
|
computedIterations = 0;
|
|
squaredQuantile = 0.0;
|
|
}
|
|
|
|
@Override
|
|
public String getName()
|
|
{
|
|
return "ACI";
|
|
}
|
|
|
|
@Override
|
|
public String getFullName()
|
|
{
|
|
return "Asymptotic Confidence Interval";
|
|
}
|
|
|
|
@Override
|
|
public void computeMissingParameterAfterSim()
|
|
{
|
|
// Store iters (computed earlier)
|
|
numSamples = computedIterations;
|
|
missingParameterComputed = true;
|
|
}
|
|
|
|
@Override
|
|
public Object getMissingParameter() throws PrismException
|
|
{
|
|
if (!missingParameterComputed)
|
|
throw new PrismException("Missing parameter not computed yet");
|
|
return numSamples;
|
|
}
|
|
|
|
@Override
|
|
public String getParametersString()
|
|
{
|
|
if (!missingParameterComputed)
|
|
return "width=" + width + ", confidence=" + confidence + ", number of samples=unknown";
|
|
else
|
|
return "width=" + width + ", confidence=" + confidence + ", number of samples=" + numSamples;
|
|
}
|
|
|
|
@Override
|
|
public boolean shouldStopNow(int iters, Sampler sampler)
|
|
{
|
|
double quantile = 0.0;
|
|
|
|
// Need at least 2 iterations
|
|
// (Student's t-distribution only defined for v > 1)
|
|
// (and variance is always 0 for iters = 1)
|
|
if (iters < 2)
|
|
return false;
|
|
|
|
// We cannot conclude yet whether it is a "S^2=0" case or if the estimator is still valid (i.e. std error > 0)
|
|
if (sampler.getVariance() <= 0.0) {
|
|
// automatic
|
|
if (!reqIterToConcludeGiven && maxReward / width > iters)
|
|
return false;
|
|
// "manual"
|
|
if (reqIterToConcludeGiven && reqIterToConclude > iters)
|
|
return false;
|
|
}
|
|
|
|
// The required number of iterations for the expected confidence is not reached yet
|
|
quantile = Probability.normalInverse(1.0 - confidence / 2.0);
|
|
squaredQuantile = quantile * quantile;
|
|
if (sampler.getVariance() > 0.0 && (iters + 1) < sampler.getVariance() * squaredQuantile / (width * width))
|
|
return false;
|
|
|
|
// Store final number of iterations (to compute missing parameter later)
|
|
computedIterations = iters;
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public int getProgress(int iters, Sampler sampler)
|
|
{
|
|
// 2 iterations needed to compute variance of the sampler
|
|
if (sampler.getVariance() <= 0.0 || iters < 2)
|
|
return 0;
|
|
return 10 * ((int) (100.0 * (double) (iters + 1) * width * width / (sampler.getVariance() * squaredQuantile)) / 10);
|
|
}
|
|
|
|
@Override
|
|
public SimulationMethod clone()
|
|
{
|
|
ACIiterations m = new ACIiterations(confidence, width);
|
|
// Remaining CIMethod stuff
|
|
m.numSamples = numSamples;
|
|
m.missingParameterComputed = missingParameterComputed;
|
|
m.prOp = prOp;
|
|
m.theta = theta;
|
|
// Local stuff
|
|
m.reqIterToConclude = reqIterToConclude;
|
|
m.reqIterToConcludeGiven = reqIterToConcludeGiven;
|
|
m.maxReward = maxReward;
|
|
m.computedIterations = computedIterations;
|
|
m.squaredQuantile = squaredQuantile;
|
|
return m;
|
|
}
|
|
}
|