//
// Copyright (C) 2010 United States Government as represented by the
// Administrator of the National Aeronautics and Space Administration
// (NASA). All Rights Reserved.
//
// This software is distributed under the NASA Open Source Agreement
// (NOSA), version 1.3. The NOSA has been approved by the Open Source
// Initiative. See the file NOSA-1.3-JPF at the top of the distribution
// directory tree for the complete NOSA document.
//
// THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY
// KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT
// LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
// SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR
// A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT
// THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT
// DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE.
//
package gov.nasa.jpf.vm.choice;
import java.util.Random;
import gov.nasa.jpf.Config;
import gov.nasa.jpf.vm.ChoiceGenerator;
import gov.nasa.jpf.vm.ChoiceGeneratorBase;
import gov.nasa.jpf.vm.IntChoiceGenerator;
/**
* a IntChoiceGenerator that randomly chooses a configured number
* of values from a specified range
* this is usually configured through app properties
*
* <2do> this is too redundant to RandomOrderIntCG - replace
*/
public class RandomIntIntervalGenerator extends ChoiceGeneratorBase<Integer> implements IntChoiceGenerator {
protected int min, max; // both inclusive
protected int nChoices;
protected long seed;
protected Random random;
protected int range;
protected int next;
protected int count = 0;
public RandomIntIntervalGenerator (String id, int min, int max, int nChoices){
this(id, min,max,nChoices,0L);
}
public RandomIntIntervalGenerator (String id, int min, int max, int nChoices, long seed){
super(id);
this.min = min;
this.max = max;
this.nChoices = nChoices;
this.seed = seed;
range = max - min;
random = new Random(seed);
}
public RandomIntIntervalGenerator(Config conf, String id) {
super(id);
min = conf.getInt(id + ".min");
max = conf.getInt(id + ".max");
nChoices = conf.getInt(id + ".n", 1);
seed = conf.getLong(id + ".seed", 1);
range = max - min;
random = new Random(seed);
}
public void reset () {
random = new Random(seed);
count = 0;
isDone = false;
}
public boolean hasMoreChoices() {
return !isDone && (count < nChoices);
}
public void advance (){
if (count < nChoices){
count++;
next = random.nextInt(range) + min;
}
}
public Integer getNextChoice () {
return new Integer(next);
}
public int getTotalNumberOfChoices () {
return nChoices;
}
public int getProcessedNumberOfChoices () {
return count;
}
public String toString () {
StringBuilder sb = new StringBuilder(getClass().getName());
if (id == null) {
sb.append('[');
} else {
sb.append("[id=\"");
sb.append(id);
sb.append("\",");
}
sb.append(min);
sb.append("..");
sb.append(max);
sb.append(",n=");
sb.append(nChoices);
sb.append(",cur=");
sb.append(getNextChoice());
sb.append(",count=");
sb.append(count);
sb.append(']');
return sb.toString();
}
@Override
public Class<Integer> getChoiceType() {
return Integer.class;
}
@Override
public ChoiceGenerator<Integer> randomize() {
return this;
}
}