package bsearch.space;
import java.util.ArrayList;
import java.util.List;
import org.nlogo.util.MersenneTwisterFast;
/** For any parameter that is fixed for the search.
*/
public strictfp class CategoricalSpec extends ParameterSpec {
private List<Object> choices;
public CategoricalSpec(String name, List<Object> choices) {
super(name);
this.choices = new ArrayList<Object>(choices);
}
public CategoricalSpec(String name, Object... choiceArray) {
super(name);
this.choices = new ArrayList<Object>();
for (Object obj : choiceArray)
{
this.choices.add( obj );
}
}
@Override
public Object generateRandomValue(MersenneTwisterFast rng) {
return choices.get( rng.nextInt( choices.size() ) );
}
/**
* Since there is no explicit relationship between the alleles for this gene,
* mutation is done by randomly choosing a *different* one of them at random.
* the mutStrength parameter is ignored.
*/
@Override
public Object mutate(Object obj, double mutStrength, MersenneTwisterFast rng) {
int index = choices.indexOf( obj );
int newchoice = rng.nextInt( choices.size() - 1);
if (newchoice >= index)
{
newchoice++;
}
return choices.get( newchoice );
}
@Override
public int choiceCount()
{
return choices.size() ;
}
@Override
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append( "[ ");
sb.append('"');
sb.append(name);
sb.append('"');
for (Object obj: choices)
{
sb.append(" ");
sb.append(obj);
}
sb.append(" ]");
return sb.toString();
}
@Override
public Object getValueFromChoice(long choice, long maxNumChoices) {
return choices.get((int)(choice % choices.size()));
}
@Override
public long getChoiceIndexFromValue(Object val, long maxNumChoices) {
return choices.indexOf(val);
}
}