Refactoring, convert *topText methods to annotations

refs #61
This commit is contained in:
Fabian Becker 2015-12-25 16:00:26 +01:00
parent 7e4f3a82c5
commit f8c7158c18
6 changed files with 48 additions and 79 deletions

View File

@ -5,6 +5,7 @@ import eva2.optimization.operator.distancemetric.PhenotypeMetric;
import eva2.optimization.population.Population; import eva2.optimization.population.Population;
import eva2.optimization.population.PopulationInterface; import eva2.optimization.population.PopulationInterface;
import eva2.util.annotation.Description; import eva2.util.annotation.Description;
import eva2.util.annotation.Parameter;
import java.io.Serializable; import java.io.Serializable;
@ -40,6 +41,7 @@ public class DiversityTerminator extends PopulationMeasureTerminator implements
/** /**
* @return the metric * @return the metric
*/ */
@Parameter(description = "Set the metric to be used to calculate individual distances.")
public InterfaceDistanceMetric getMetric() { public InterfaceDistanceMetric getMetric() {
return metric; return metric;
} }
@ -48,13 +50,10 @@ public class DiversityTerminator extends PopulationMeasureTerminator implements
this.metric = metric; this.metric = metric;
} }
public String metricTipText() {
return "Set the metric to be used to calculate individual distances.";
}
/** /**
* @return the criterion * @return the criterion
*/ */
@Parameter(description = "Define the distance criterion to check for in a population.")
public DiversityCriterion getCriterion() { public DiversityCriterion getCriterion() {
return criterion; return criterion;
} }
@ -63,12 +62,8 @@ public class DiversityTerminator extends PopulationMeasureTerminator implements
this.criterion = criterion; this.criterion = criterion;
} }
public String criterionTipText() {
return "Define the distance criterion to check for in a population.";
}
@Override @Override
protected double calcInitialMeasure(PopulationInterface pop) { protected double calculateInitialMeasure(PopulationInterface pop) {
return calcPopulationMeasure(pop); return calcPopulationMeasure(pop);
} }

View File

@ -30,7 +30,7 @@ public class FitnessConvergenceTerminator extends PopulationMeasureTerminator
} }
@Override @Override
protected double calcInitialMeasure(PopulationInterface pop) { protected double calculateInitialMeasure(PopulationInterface pop) {
return Mathematics.norm(pop.getBestFitness()); return Mathematics.norm(pop.getBestFitness());
} }

View File

@ -9,6 +9,7 @@ import eva2.problems.AbstractMultiObjectiveOptimizationProblem;
import eva2.problems.InterfaceOptimizationProblem; import eva2.problems.InterfaceOptimizationProblem;
import eva2.tools.EVAERROR; import eva2.tools.EVAERROR;
import eva2.util.annotation.Description; import eva2.util.annotation.Description;
import eva2.util.annotation.Parameter;
import java.io.Serializable; import java.io.Serializable;
@ -50,13 +51,12 @@ public class ParetoMetricTerminator extends PopulationMeasureTerminator implemen
if (prob instanceof AbstractMultiObjectiveOptimizationProblem) { if (prob instanceof AbstractMultiObjectiveOptimizationProblem) {
moProb = (AbstractMultiObjectiveOptimizationProblem) prob; moProb = (AbstractMultiObjectiveOptimizationProblem) prob;
} else { } else {
moProb = null; throw new IllegalArgumentException("Error, " + this.getClass() + " works only with problems inheriting from " + AbstractMultiObjectiveOptimizationProblem.class + "!");
EVAERROR.errorMsgOnce("Error, " + this.getClass() + " works only with problems inheriting from " + AbstractMultiObjectiveOptimizationProblem.class + "!");
} }
} }
@Override @Override
protected double calcInitialMeasure(PopulationInterface pop) { protected double calculateInitialMeasure(PopulationInterface pop) {
if (moProb == null) { if (moProb == null) {
return Double.MAX_VALUE; return Double.MAX_VALUE;
} else { } else {
@ -70,7 +70,7 @@ public class ParetoMetricTerminator extends PopulationMeasureTerminator implemen
@Override @Override
protected double calcPopulationMeasure(PopulationInterface pop) { protected double calcPopulationMeasure(PopulationInterface pop) {
return calcInitialMeasure(pop); return calculateInitialMeasure(pop);
} }
@Override @Override
@ -89,6 +89,7 @@ public class ParetoMetricTerminator extends PopulationMeasureTerminator implemen
} }
} }
@Parameter(description = "The pareto metric to use")
public void setParetoMetric(InterfaceParetoFrontMetric pMetric) { public void setParetoMetric(InterfaceParetoFrontMetric pMetric) {
this.pMetric = pMetric; this.pMetric = pMetric;
} }
@ -97,10 +98,7 @@ public class ParetoMetricTerminator extends PopulationMeasureTerminator implemen
return pMetric; return pMetric;
} }
public String paretoMetricTipText() { @Parameter(description = "If true, the current population is used, otherwise the pareto front of the multi-objective problem instance is used")
return "The pareto metric to use";
}
public void setUseCurrentPop(boolean useCurrentPop) { public void setUseCurrentPop(boolean useCurrentPop) {
this.useCurrentPop = useCurrentPop; this.useCurrentPop = useCurrentPop;
} }
@ -108,8 +106,4 @@ public class ParetoMetricTerminator extends PopulationMeasureTerminator implemen
public boolean isUseCurrentPop() { public boolean isUseCurrentPop() {
return useCurrentPop; return useCurrentPop;
} }
public String useCurrentPopTipText() {
return "If true, the current population is used, otherwise the pareto front of the multi-objective problem instance is used";
}
} }

View File

@ -34,7 +34,7 @@ public class PhenotypeConvergenceTerminator extends PopulationMeasureTerminator
} }
@Override @Override
protected double calcInitialMeasure(PopulationInterface pop) { protected double calculateInitialMeasure(PopulationInterface pop) {
oldIndy = (AbstractEAIndividual) ((AbstractEAIndividual) pop.getBestIndividual()).clone(); oldIndy = (AbstractEAIndividual) ((AbstractEAIndividual) pop.getBestIndividual()).clone();
return Double.MAX_VALUE; return Double.MAX_VALUE;
} }

View File

@ -14,7 +14,7 @@ public class PopulationArchiveTerminator extends PopulationMeasureTerminator {
IndividualWeightedFitnessComparator wfComp = new IndividualWeightedFitnessComparator(new double[]{1.}); IndividualWeightedFitnessComparator wfComp = new IndividualWeightedFitnessComparator(new double[]{1.});
@Override @Override
protected double calcInitialMeasure(PopulationInterface pop) { protected double calculateInitialMeasure(PopulationInterface pop) {
Population archive = ((Population) pop).getArchive(); Population archive = ((Population) pop).getArchive();
if (archive == null || (archive.size() < 1)) { if (archive == null || (archive.size() < 1)) {
return Double.MAX_VALUE; return Double.MAX_VALUE;

View File

@ -4,6 +4,7 @@ import eva2.optimization.population.PopulationInterface;
import eva2.optimization.population.InterfaceSolutionSet; import eva2.optimization.population.InterfaceSolutionSet;
import eva2.problems.InterfaceOptimizationProblem; import eva2.problems.InterfaceOptimizationProblem;
import eva2.util.annotation.Description; import eva2.util.annotation.Description;
import eva2.util.annotation.Parameter;
import java.io.Serializable; import java.io.Serializable;
@ -14,11 +15,11 @@ import java.io.Serializable;
* The class detects changes of a population measure over time and may signal convergence * The class detects changes of a population measure over time and may signal convergence
* if the measure m(P) behaved in a certain way for a given time. Convergence may * if the measure m(P) behaved in a certain way for a given time. Convergence may
* be signaled * be signaled
* - if the measure reached absolute values below convThresh (absolute value), * - if the measure reached absolute values below convergenceThresh (absolute value),
* - if the measure remained within m(P)+/-convThresh (absolute change), * - if the measure remained within m(P)+/-convergenceThresh (absolute change),
* - if the measure remained above m(P)-convThresh (absolute change and regard improvement only), * - if the measure remained above m(P)-convergenceThresh (absolute change and regard improvement only),
* - if the measure remained within m(P)*[1-convThresh, 1+convThresh] (relative change), * - if the measure remained within m(P)*[1-convergenceThresh, 1+convergenceThresh] (relative change),
* - if the measure remained above m(P)*(1-convThresh) (relative change and regard improvement only). * - if the measure remained above m(P)*(1-convergenceThresh) (relative change and regard improvement only).
*/ */
@Description("Stop if a convergence criterion has been met.") @Description("Stop if a convergence criterion has been met.")
public abstract class PopulationMeasureTerminator implements InterfaceTerminator, Serializable { public abstract class PopulationMeasureTerminator implements InterfaceTerminator, Serializable {
@ -28,9 +29,9 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator
public enum StagnationTypeEnum {fitnessCallBased, generationBased} public enum StagnationTypeEnum {fitnessCallBased, generationBased}
private double convThresh = 0.01; //, convThreshLower=0.02; private double convergenceThresh = 0.01;
private double oldMeasure = -1; private double oldMeasure = -1;
private int stagTime = 1000; private int stagnationTime = 1000;
private int oldPopFitCalls = 1000; private int oldPopFitCalls = 1000;
private int oldPopGens = 1000; private int oldPopGens = 1000;
private boolean firstTime = true; private boolean firstTime = true;
@ -43,16 +44,16 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator
} }
public PopulationMeasureTerminator(double convergenceThreshold, int stagnationTime, StagnationTypeEnum stagType, ChangeTypeEnum changeType, DirectionTypeEnum dirType) { public PopulationMeasureTerminator(double convergenceThreshold, int stagnationTime, StagnationTypeEnum stagType, ChangeTypeEnum changeType, DirectionTypeEnum dirType) {
this.convThresh = convergenceThreshold; this.convergenceThresh = convergenceThreshold;
this.stagTime = stagnationTime; this.stagnationTime = stagnationTime;
this.stagnationMeasure = stagType; this.stagnationMeasure = stagType;
this.changeType = changeType; this.changeType = changeType;
this.condDirection = dirType; this.condDirection = dirType;
} }
public PopulationMeasureTerminator(PopulationMeasureTerminator o) { public PopulationMeasureTerminator(PopulationMeasureTerminator o) {
convThresh = o.convThresh; convergenceThresh = o.convergenceThresh;
stagTime = o.stagTime; stagnationTime = o.stagnationTime;
oldPopFitCalls = o.oldPopFitCalls; oldPopFitCalls = o.oldPopFitCalls;
oldPopGens = o.oldPopGens; oldPopGens = o.oldPopGens;
firstTime = o.firstTime; firstTime = o.firstTime;
@ -80,16 +81,16 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator
if (!firstTime && isStillConverged(pop)) { if (!firstTime && isStillConverged(pop)) {
if (stagnationTimeHasPassed(pop)) { if (stagnationTimeHasPassed(pop)) {
// population hasnt changed much for max time, criterion is met // population hasn't changed much for max time, criterion is met
msg = getTerminationMessage(); msg = getTerminationMessage();
return true; return true;
} else { } else {
// population hasnt changed much for i<max time, keep running // population hasn't changed much for i<max time, keep running
return false; return false;
} }
} else { } else {
// first call at all - or population improved more than "allowed" to terminate // first call at all - or population improved more than "allowed" to terminate
oldMeasure = calcInitialMeasure(pop); oldMeasure = calculateInitialMeasure(pop);
saveState(pop); saveState(pop);
return false; return false;
} }
@ -100,7 +101,7 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator
* *
* @return * @return
*/ */
protected abstract double calcInitialMeasure(PopulationInterface pop); protected abstract double calculateInitialMeasure(PopulationInterface pop);
@Override @Override
public String lastTerminationMessage() { public String lastTerminationMessage() {
@ -114,7 +115,6 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator
*/ */
protected String getTerminationMessage() { protected String getTerminationMessage() {
StringBuilder sb = new StringBuilder(getMeasureName()); StringBuilder sb = new StringBuilder(getMeasureName());
// if (convergenceCondition.isSelectedString("Relative")) sb.append(" converged relatively ");
switch (changeType) { switch (changeType) {
case absoluteChange: case absoluteChange:
sb.append(" changed absolutely "); sb.append(" changed absolutely ");
@ -128,15 +128,13 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator
} }
if (doCheckImprovement()) { if (doCheckImprovement()) {
sb.append("less than "); sb.append("less than ");
sb.append(convThresh); sb.append(convergenceThresh);
} else { } else {
sb.append("within +/-"); sb.append("within +/-");
// sb.append(convThreshLower); sb.append(convergenceThresh);
// sb.append("/");
sb.append(convThresh);
} }
sb.append(" for "); sb.append(" for ");
sb.append(stagTime); sb.append(stagnationTime);
if (stagnationMeasure == StagnationTypeEnum.generationBased) { if (stagnationMeasure == StagnationTypeEnum.generationBased) {
sb.append(" generations."); sb.append(" generations.");
} else { } else {
@ -159,7 +157,6 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator
* @param pop * @param pop
*/ */
protected void saveState(PopulationInterface pop) { protected void saveState(PopulationInterface pop) {
// oldFit = pop.getBestFitness().clone();
oldMeasure = calcPopulationMeasure(pop); oldMeasure = calcPopulationMeasure(pop);
oldPopFitCalls = pop.getFunctionCalls(); oldPopFitCalls = pop.getFunctionCalls();
oldPopGens = pop.getGeneration(); oldPopGens = pop.getGeneration();
@ -188,17 +185,16 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator
boolean ret; boolean ret;
switch (changeType) { switch (changeType) {
case absoluteChange: case absoluteChange:
allowedLower = oldMeasure - convThresh; allowedLower = oldMeasure - convergenceThresh;
if (!doCheckImprovement()) { if (!doCheckImprovement()) {
allowedUpper = oldMeasure + convThresh; allowedUpper = oldMeasure + convergenceThresh;
} }
break; break;
case absoluteValue: case absoluteValue:
allowedUpper = convThresh; allowedUpper = convergenceThresh;
// if (!doCheckImprovement()) allowedUpper = convThreshUpper;
break; break;
case relativeChange: case relativeChange:
double delta = oldMeasure * convThresh; double delta = oldMeasure * convergenceThresh;
allowedLower = oldMeasure - delta; allowedLower = oldMeasure - delta;
if (!doCheckImprovement()) { if (!doCheckImprovement()) {
allowedUpper = oldMeasure + delta; allowedUpper = oldMeasure + delta;
@ -211,7 +207,6 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator
public boolean doCheckImprovement() { public boolean doCheckImprovement() {
return (condDirection == DirectionTypeEnum.decrease); return (condDirection == DirectionTypeEnum.decrease);
// return condImprovementOrChange.isSelectedString("Improvement");
} }
public boolean isRelativeConvergence() { public boolean isRelativeConvergence() {
@ -220,43 +215,38 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator
/** /**
* Return true if the defined stagnation time (function calls or generations) has passed * Return true if the defined stagnation time (function calls or generations) has passed
* since the last noteable change. * since the last notable change.
* *
* @param pop * @param pop
* @return * @return
*/ */
private boolean stagnationTimeHasPassed(PopulationInterface pop) { private boolean stagnationTimeHasPassed(PopulationInterface pop) {
if (stagnationMeasure == StagnationTypeEnum.fitnessCallBased) { // by fitness calls if (stagnationMeasure == StagnationTypeEnum.fitnessCallBased) { // by fitness calls
return (pop.getFunctionCalls() - oldPopFitCalls) >= stagTime; return (pop.getFunctionCalls() - oldPopFitCalls) >= stagnationTime;
} else {// by generation } else {// by generation
return (pop.getGeneration() - oldPopGens) >= stagTime; return (pop.getGeneration() - oldPopGens) >= stagnationTime;
} }
} }
@Parameter(description = "Ratio of improvement/change or absolute value of improvement/change to determine convergence.")
public void setConvergenceThreshold(double x) { public void setConvergenceThreshold(double x) {
convThresh = x; convergenceThresh = x;
} }
public double getConvergenceThreshold() { public double getConvergenceThreshold() {
return convThresh; return convergenceThresh;
}
public String convergenceThresholdTipText() {
return "Ratio of improvement/change or absolute value of improvement/change to determine convergence.";
} }
@Parameter(description = "Terminate if the population has not improved/changed for this time")
public void setStagnationTime(int k) { public void setStagnationTime(int k) {
stagTime = k; stagnationTime = k;
} }
public int getStagnationTime() { public int getStagnationTime() {
return stagTime; return stagnationTime;
}
public String stagnationTimeTipText() {
return "Terminate if the population has not improved/changed for this time";
} }
@Parameter(description = "Stagnation time is measured in fitness calls or generations")
public StagnationTypeEnum getStagnationMeasure() { public StagnationTypeEnum getStagnationMeasure() {
return stagnationMeasure; return stagnationMeasure;
} }
@ -265,31 +255,21 @@ public abstract class PopulationMeasureTerminator implements InterfaceTerminator
this.stagnationMeasure = stagnationTimeIn; this.stagnationMeasure = stagnationTimeIn;
} }
public String stagnationMeasureTipText() {
return "Stagnation time is measured in fitness calls or generations";
}
public ChangeTypeEnum getConvergenceCondition() { public ChangeTypeEnum getConvergenceCondition() {
return changeType; return changeType;
} }
@Parameter(description = "Select absolute or relative convergence condition")
public void setConvergenceCondition(ChangeTypeEnum convergenceCondition) { public void setConvergenceCondition(ChangeTypeEnum convergenceCondition) {
this.changeType = convergenceCondition; this.changeType = convergenceCondition;
} }
public String convergenceConditionTipText() {
return "Select absolute or relative convergence condition";
}
public DirectionTypeEnum getCheckType() { public DirectionTypeEnum getCheckType() {
return condDirection; return condDirection;
} }
@Parameter(description = "Detect improvement only (decreasing measure) or change in both directions (decrease and increase)")
public void setCheckType(DirectionTypeEnum dt) { public void setCheckType(DirectionTypeEnum dt) {
this.condDirection = dt; this.condDirection = dt;
} }
public String checkTypeTipText() {
return "Detect improvement only (decreasing measure) or change in both directions (decrease and increase)";
}
} }