package bsearch.evaluation;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import bsearch.app.SearchProtocol;
import bsearch.nlogolink.ModelRunResult;
import bsearch.representations.Chromosome;
public strictfp class StandardFitnessFunction implements FitnessFunction
{
private final SearchProtocol protocol;
public StandardFitnessFunction(SearchProtocol protocol)
{
this.protocol = protocol;
}
public HashMap<Chromosome, Integer> getRunsNeeded(Chromosome point, int repetitionsRequested, ResultsArchive archive)
{
LinkedHashMap<Chromosome, Integer> map = new LinkedHashMap<Chromosome,Integer>(1);
map.put(point, StrictMath.max(0, repetitionsRequested - archive.getResultsCount(point)));
return map;
}
public int getMaximumRunsThatCouldBeNeeded(int repetitionsRequested)
{
return repetitionsRequested;
}
public double evaluate(Chromosome point, ResultsArchive archive)
{
List<ModelRunResult> resultsSoFar = archive.getResults( point );
LinkedList<Double> condensedResults = new LinkedList<Double>();
for (ModelRunResult result: resultsSoFar)
{
List<Double> singleRunHistory = result.getPrimaryTimeSeries();
double dResult = protocol.fitnessCollecting.collectFrom(singleRunHistory);
condensedResults.add(dResult);
}
return protocol.fitnessCombineReplications.combine(condensedResults);
}
public double compare(double v1, double v2)
{
if (protocol.fitnessMinimized)
{
return v2 - v1 ;
}
else
{
return v1 - v2 ;
}
}
public boolean strictlyBetterThan(double v1, double v2)
{
return compare(v1,v2) > 0.0;
}
public double getWorstConceivableFitnessValue() {
return protocol.fitnessMinimized?Double.POSITIVE_INFINITY:Double.NEGATIVE_INFINITY;
}
public double getBestConceivableFitnessValue() {
return protocol.fitnessMinimized?Double.NEGATIVE_INFINITY:Double.POSITIVE_INFINITY;
}
//TODO: add support for stopGoalFitness TO SearchProtocol, the XML file, etc.
// private boolean hasStopGoal;
// private double stopGoalFitness;
public boolean reachedStopGoalFitness(double fitness) {
return false; //TODO: Implement fitness goal stuff
//throw new UnsupportedOperationException("Not implemented yet");
/*if (!hasStopGoal)
{
return false;
}
else
{
if (protocol.fitnessMinimized)
{
return fitness <= stopGoalFitness;
}
else
{
return fitness >= stopGoalFitness;
}
}*/
}
}