parent
7e4f3a82c5
commit
f8c7158c18
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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)";
|
|
||||||
}
|
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user