Merging mk branch revs. 587:589 (tool tips for statistics data fields)
This commit is contained in:
parent
050af6e8e0
commit
85732ec88d
@ -67,6 +67,16 @@ public abstract class AbstractListSelectionEditor extends JPanel implements Prop
|
|||||||
*/
|
*/
|
||||||
protected abstract String getElementName(int i);
|
protected abstract String getElementName(int i);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the tool tip of an element or null if none is available.
|
||||||
|
*
|
||||||
|
* @param i
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected String getElementToolTip(int i) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the selection state of an element.
|
* Get the selection state of an element.
|
||||||
*
|
*
|
||||||
@ -85,6 +95,7 @@ public abstract class AbstractListSelectionEditor extends JPanel implements Prop
|
|||||||
this.m_BlackCheck = new JCheckBox[getElementCount()];
|
this.m_BlackCheck = new JCheckBox[getElementCount()];
|
||||||
for (int i = 0; i < getElementCount(); i++) {
|
for (int i = 0; i < getElementCount(); i++) {
|
||||||
this.m_BlackCheck[i] = new JCheckBox(getElementName(i), isElementSelected(i));
|
this.m_BlackCheck[i] = new JCheckBox(getElementName(i), isElementSelected(i));
|
||||||
|
this.m_BlackCheck[i].setToolTipText(getElementToolTip(i));
|
||||||
this.m_BlackCheck[i].addActionListener(new ActionListener() {
|
this.m_BlackCheck[i].addActionListener(new ActionListener() {
|
||||||
public void actionPerformed(ActionEvent ev) {
|
public void actionPerformed(ActionEvent ev) {
|
||||||
if (actionOnSelect()) m_Support.firePropertyChange("AbstractListSelectionEditor", null, this);
|
if (actionOnSelect()) m_Support.firePropertyChange("AbstractListSelectionEditor", null, this);
|
||||||
|
@ -6,7 +6,7 @@ public class StringSelectionEditor extends AbstractListSelectionEditor {
|
|||||||
StringSelection strs;
|
StringSelection strs;
|
||||||
|
|
||||||
public StringSelectionEditor() {
|
public StringSelectionEditor() {
|
||||||
strs = new StringSelection(new String[]{});
|
strs = new StringSelection(new String[]{}, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -27,6 +27,11 @@ public class StringSelectionEditor extends AbstractListSelectionEditor {
|
|||||||
return strs.getElement(i);
|
return strs.getElement(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getElementToolTip(int i) {
|
||||||
|
return strs.getElementInfo(i);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getValue() {
|
public Object getValue() {
|
||||||
return strs;
|
return strs;
|
||||||
|
@ -32,7 +32,6 @@ import eva2.server.go.operators.terminators.EvaluationTerminator;
|
|||||||
import eva2.server.go.operators.terminators.PhenotypeConvergenceTerminator;
|
import eva2.server.go.operators.terminators.PhenotypeConvergenceTerminator;
|
||||||
import eva2.server.go.populations.Population;
|
import eva2.server.go.populations.Population;
|
||||||
import eva2.server.go.strategies.InterfaceOptimizer;
|
import eva2.server.go.strategies.InterfaceOptimizer;
|
||||||
import eva2.tools.math.Mathematics;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by IntelliJ IDEA.
|
* Created by IntelliJ IDEA.
|
||||||
@ -244,6 +243,18 @@ implements InterfaceOptimizationProblem /*, InterfaceParamControllable*/, Serial
|
|||||||
else return new String[]{"Solution"};
|
else return new String[]{"Solution"};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** This method returns the header for the additional data that is to be written into a file
|
||||||
|
* @param pop The population that is to be refined.
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String[] getAdditionalFileStringInfo(PopulationInterface pop) {
|
||||||
|
if (this instanceof InterfaceInterestingHistogram)
|
||||||
|
return new String[]{"Representation of the current best individual",
|
||||||
|
"Fitness histogram of the current population",
|
||||||
|
"Fitness threshold based score of the current population"};
|
||||||
|
else return new String[]{"Representation of the current best individual"};
|
||||||
|
}
|
||||||
|
|
||||||
/** This method returns the additional data that is to be written into a file
|
/** This method returns the additional data that is to be written into a file
|
||||||
* @param pop The population that is to be refined.
|
* @param pop The population that is to be refined.
|
||||||
* @return String
|
* @return String
|
||||||
@ -251,8 +262,16 @@ implements InterfaceOptimizationProblem /*, InterfaceParamControllable*/, Serial
|
|||||||
public Object[] getAdditionalFileStringValue(PopulationInterface pop) {
|
public Object[] getAdditionalFileStringValue(PopulationInterface pop) {
|
||||||
String solStr = AbstractEAIndividual.getDefaultDataString(pop.getBestIndividual());
|
String solStr = AbstractEAIndividual.getDefaultDataString(pop.getBestIndividual());
|
||||||
if (this instanceof InterfaceInterestingHistogram) {
|
if (this instanceof InterfaceInterestingHistogram) {
|
||||||
|
int fitCrit=0;
|
||||||
SolutionHistogram hist = ((InterfaceInterestingHistogram)this).getHistogram();
|
SolutionHistogram hist = ((InterfaceInterestingHistogram)this).getHistogram();
|
||||||
Population sols = PostProcess.clusterBestUpdateHistogram((Population)pop, this, hist, 0, getDefaultAccuracy());
|
if (pop.getBestFitness()[fitCrit] < hist.getUpperBound()) {
|
||||||
|
Population maybeFiltered = (Population)pop;
|
||||||
|
if (pop.size()>100) { // for efficiency reasons...
|
||||||
|
maybeFiltered = maybeFiltered.filterByFitness(hist.getUpperBound(), fitCrit);
|
||||||
|
// System.out.println("Reduced " + pop.size() + " to " + maybeFiltered.size());
|
||||||
|
}
|
||||||
|
Population sols = PostProcess.clusterBestUpdateHistogram((Population)maybeFiltered, this, hist, fitCrit, getDefaultAccuracy());
|
||||||
|
}
|
||||||
return new Object[]{solStr, hist, hist.getScore()};
|
return new Object[]{solStr, hist, hist.getScore()};
|
||||||
} else return new Object[]{solStr};
|
} else return new Object[]{solStr};
|
||||||
}
|
}
|
||||||
@ -341,13 +360,15 @@ implements InterfaceOptimizationProblem /*, InterfaceParamControllable*/, Serial
|
|||||||
* @param epsilonPhenoSpace maximal allowed improvement of an individual before considered premature (given as distance in the search space)
|
* @param epsilonPhenoSpace maximal allowed improvement of an individual before considered premature (given as distance in the search space)
|
||||||
* @param epsilonFitConv if positive: additional absolute convergence criterion (fitness space) as termination criterion of the local search
|
* @param epsilonFitConv if positive: additional absolute convergence criterion (fitness space) as termination criterion of the local search
|
||||||
* @param clusterSigma minimum cluster distance
|
* @param clusterSigma minimum cluster distance
|
||||||
* @param maxEvalsPerIndy
|
* @param maxEvalsPerIndy maximum number of evaluations or -1 to take the maximum
|
||||||
* @see #isPotentialOptimumNMS(AbstractEAIndividual, double, double, int)
|
* @see #isPotentialOptimumNMS(AbstractEAIndividual, double, double, int)
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static Population extractPotentialOptima(AbstractOptimizationProblem prob, Population pop, double epsilonPhenoSpace, double epsilonFitConv, double clusterSigma, int maxEvalsPerIndy) {
|
public static Population extractPotentialOptima(AbstractOptimizationProblem prob, Population pop,
|
||||||
|
double epsilonPhenoSpace, double epsilonFitConv, double clusterSigma, int maxEvalsPerIndy) {
|
||||||
Population potOptima = new Population();
|
Population potOptima = new Population();
|
||||||
for (int i = 0; i < pop.size(); ++i){
|
for (int i = 0; i < pop.size(); ++i){
|
||||||
|
//System.out.println("Refining " + i + " of " + pop.size());
|
||||||
AbstractEAIndividual indy = pop.getEAIndividual(i);
|
AbstractEAIndividual indy = pop.getEAIndividual(i);
|
||||||
// System.out.println("bef: " + indy.toString());
|
// System.out.println("bef: " + indy.toString());
|
||||||
boolean isConverged = AbstractOptimizationProblem.isPotentialOptimumNMS(prob, indy, epsilonPhenoSpace, epsilonFitConv, maxEvalsPerIndy);
|
boolean isConverged = AbstractOptimizationProblem.isPotentialOptimumNMS(prob, indy, epsilonPhenoSpace, epsilonFitConv, maxEvalsPerIndy);
|
||||||
@ -429,7 +450,8 @@ implements InterfaceOptimizationProblem /*, InterfaceParamControllable*/, Serial
|
|||||||
* distance from the original individual in phenotype space. The maxEvaluations parameter gives the maximum evaluations
|
* distance from the original individual in phenotype space. The maxEvaluations parameter gives the maximum evaluations
|
||||||
* for the local search. Using the epsilonFitConv parameter one may define a convergence criterion as PhenotypeConvergenceTerminator
|
* for the local search. Using the epsilonFitConv parameter one may define a convergence criterion as PhenotypeConvergenceTerminator
|
||||||
* which is combined (using OR) with the evaluation counter.
|
* which is combined (using OR) with the evaluation counter.
|
||||||
* If maxEvaluations is smaller than zero, 100*dim is used. Be aware that this may cost quite some runtime depending on the target
|
* If maxEvaluations is smaller than zero, a maximum of 500*dim evaluations is employed.
|
||||||
|
* Be aware that this may cost quite some runtime depending on the target
|
||||||
* function.
|
* function.
|
||||||
* A double value for the distance by which it was moved is added to the individual using the key PostProcess.movedDistanceKey.
|
* A double value for the distance by which it was moved is added to the individual using the key PostProcess.movedDistanceKey.
|
||||||
*
|
*
|
||||||
@ -452,7 +474,7 @@ implements InterfaceOptimizationProblem /*, InterfaceParamControllable*/, Serial
|
|||||||
// initPerturb = epsilonPhenoSpace/(2*(Mathematics.getAvgRange(((InterfaceDataTypeDouble)orig).getDoubleRange())));
|
// initPerturb = epsilonPhenoSpace/(2*(Mathematics.getAvgRange(((InterfaceDataTypeDouble)orig).getDoubleRange())));
|
||||||
initRelPerturb = epsilonPhenoSpace*0.5;
|
initRelPerturb = epsilonPhenoSpace*0.5;
|
||||||
dim=((InterfaceDataTypeDouble)orig).getDoubleRange().length;
|
dim=((InterfaceDataTypeDouble)orig).getDoubleRange().length;
|
||||||
if (maxEvaluations<0) maxEvaluations = 100*AbstractEAIndividual.getDoublePositionShallow(prob.m_Template).length; // scales the effort with the number of problem dimensions
|
if (maxEvaluations<0) maxEvaluations = 500*AbstractEAIndividual.getDoublePositionShallow(prob.m_Template).length; // scales the effort with the number of problem dimensions
|
||||||
} else {
|
} else {
|
||||||
System.err.println("Cannot initialize NMS on non-double valued individuals!");
|
System.err.println("Cannot initialize NMS on non-double valued individuals!");
|
||||||
return false;
|
return false;
|
||||||
@ -461,9 +483,10 @@ implements InterfaceOptimizationProblem /*, InterfaceParamControllable*/, Serial
|
|||||||
Population pop = new Population(1);
|
Population pop = new Population(1);
|
||||||
pop.add(orig);
|
pop.add(orig);
|
||||||
InterfaceTerminator term = new EvaluationTerminator(maxEvaluations);
|
InterfaceTerminator term = new EvaluationTerminator(maxEvaluations);
|
||||||
if (epsilonFitConv > 0) term = new CombinedTerminator(new PhenotypeConvergenceTerminator(epsilonFitConv, 10*dim, true, true), term, false);
|
if (epsilonFitConv > 0) term = new CombinedTerminator(new PhenotypeConvergenceTerminator(epsilonFitConv, 100*dim, true, true), term, false);
|
||||||
int evalsPerf = PostProcess.processSingleCandidatesNMCMA(PostProcessMethod.nelderMead, pop, term, initRelPerturb, prob);
|
int evalsPerf = PostProcess.processSingleCandidatesNMCMA(PostProcessMethod.nelderMead, pop, term, initRelPerturb, prob);
|
||||||
overallDist = metric.distance(indy, pop.getBestEAIndividual());
|
overallDist = metric.distance(indy, pop.getBestEAIndividual());
|
||||||
|
//System.out.println(System.currentTimeMillis() + " in " + evalsPerf + " evals moved by "+ overallDist);
|
||||||
// System.out.println("aft: " + pop.getBestEAIndividual().toString() + ", evals performed: " + evalsPerf + ", opt moved by " + overallDist);
|
// System.out.println("aft: " + pop.getBestEAIndividual().toString() + ", evals performed: " + evalsPerf + ", opt moved by " + overallDist);
|
||||||
// System.out.println("terminated because: " + term.lastTerminationMessage());
|
// System.out.println("terminated because: " + term.lastTerminationMessage());
|
||||||
orig.putData(PostProcess.movedDistanceKey, overallDist);
|
orig.putData(PostProcess.movedDistanceKey, overallDist);
|
||||||
@ -471,6 +494,14 @@ implements InterfaceOptimizationProblem /*, InterfaceParamControllable*/, Serial
|
|||||||
// if (overallDist==0) {
|
// if (overallDist==0) {
|
||||||
// PostProcess.processSingleCandidatesNMCMA(PostProcessMethod.nelderMead, pop, term, initPerturb, this);
|
// PostProcess.processSingleCandidatesNMCMA(PostProcessMethod.nelderMead, pop, term, initPerturb, this);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
// System.out.println("Checked "+ indy.getStringRepresentation());
|
||||||
|
// String msg = "----discarding ";
|
||||||
|
// if (overallDist <= epsilonPhenoSpace) msg= "++++keeping ";
|
||||||
|
// System.out.println(msg + BeanInspector.toString(indy.getDoublePosition()));
|
||||||
|
// System.out.println("which moved to " + BeanInspector.toString(pop.getBestEAIndividual().getDoublePosition()));
|
||||||
|
// System.out.println(" by " + overallDist + " > " + epsilonPhenoSpace);
|
||||||
|
|
||||||
return (overallDist < epsilonPhenoSpace);
|
return (overallDist < epsilonPhenoSpace);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,7 +255,8 @@ public abstract class AbstractProblemDouble extends AbstractOptimizationProblem
|
|||||||
// rotation = new Matrix(dim, dim);
|
// rotation = new Matrix(dim, dim);
|
||||||
// rotation = Mathematics.getRotationMatrix(vec).transpose();
|
// rotation = Mathematics.getRotationMatrix(vec).transpose();
|
||||||
rotation = Mathematics.getRotationMatrix((rotAngle*Math.PI/180.), dim).transpose();
|
rotation = Mathematics.getRotationMatrix((rotAngle*Math.PI/180.), dim).transpose();
|
||||||
// System.out.println(BeanInspector.toString(eval(vec.getColumnPackedCopy())));
|
//double[] t= new double[dim]; Arrays.fill(t, 1.);
|
||||||
|
//System.out.println(BeanInspector.toString(rotation.times(t)));
|
||||||
return rotation;
|
return rotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -354,7 +355,9 @@ public abstract class AbstractProblemDouble extends AbstractOptimizationProblem
|
|||||||
}
|
}
|
||||||
|
|
||||||
public double functionValue(double[] point) {
|
public double functionValue(double[] point) {
|
||||||
return eval(project2DPoint(point))[0];
|
double[] x=project2DPoint(point);
|
||||||
|
double v = eval(x)[0];
|
||||||
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -498,6 +501,16 @@ public abstract class AbstractProblemDouble extends AbstractOptimizationProblem
|
|||||||
else return superHeader;
|
else return superHeader;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] getAdditionalFileStringInfo(PopulationInterface pop) {
|
||||||
|
String[] superInfo = super.getAdditionalFileStringInfo(pop);
|
||||||
|
if (isWithConstraints())
|
||||||
|
return ToolBox.appendArrays(superInfo, new String[]{"Raw fitness (unpenalized) of the current best individual",
|
||||||
|
"The number of constraints violated by the current best individual",
|
||||||
|
"The sum of constraint violations of the current best individual"});
|
||||||
|
else return superInfo;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object[] getAdditionalFileStringValue(PopulationInterface pop) {
|
public Object[] getAdditionalFileStringValue(PopulationInterface pop) {
|
||||||
Object[] superVal = super.getAdditionalFileStringValue(pop);
|
Object[] superVal = super.getAdditionalFileStringValue(pop);
|
||||||
|
@ -19,6 +19,14 @@ public interface InterfaceAdditionalPopulationInformer {
|
|||||||
*/
|
*/
|
||||||
public String[] getAdditionalFileStringHeader(PopulationInterface pop);
|
public String[] getAdditionalFileStringHeader(PopulationInterface pop);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optionally return informative descriptions of the data fields.
|
||||||
|
*
|
||||||
|
* @param pop
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String[] getAdditionalFileStringInfo(PopulationInterface pop);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method returns additional statistical data.
|
* This method returns additional statistical data.
|
||||||
* @param pop The population that is to be refined.
|
* @param pop The population that is to be refined.
|
||||||
|
@ -1143,7 +1143,23 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String[] getAdditionalFileStringHeader(PopulationInterface pop) {
|
public String[] getAdditionalFileStringHeader(PopulationInterface pop) {
|
||||||
return new String[]{"Undiff.","#Act.spec.","Avg.Spec.Meas.","#Archived."};
|
return new String[]{"numUndiff","numActSpec","avgSpecMeas","numArchived",
|
||||||
|
"archivedMedCorr", "archivedMeanDist"
|
||||||
|
// , "numCollisions", "clustSig"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getAdditionalFileStringInfo(PopulationInterface pop) { // TODO use these as Tool Tip Texts???
|
||||||
|
return new String[] {
|
||||||
|
"The number of exploring individuals in the main population",
|
||||||
|
"The number of active species (sub-populations)",
|
||||||
|
"The average of the mean distance of individuals within a species",
|
||||||
|
"The number of stored potential local optima",
|
||||||
|
"The median correlation of archived solutions",
|
||||||
|
"The mean distance of archived solutions",
|
||||||
|
// "The number of collisions events that happened so far",
|
||||||
|
// "The clustering distance"
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object[] getAdditionalFileStringValue(PopulationInterface pop) {
|
public Object[] getAdditionalFileStringValue(PopulationInterface pop) {
|
||||||
@ -1152,7 +1168,12 @@ public class ClusterBasedNichingEA implements InterfacePopulationChangedEventLis
|
|||||||
m_Undifferentiated.size(),
|
m_Undifferentiated.size(),
|
||||||
m_Species.size(),
|
m_Species.size(),
|
||||||
getAvgSpeciesMeasures()[0],
|
getAvgSpeciesMeasures()[0],
|
||||||
m_Archive.size()};
|
m_Archive.size(),
|
||||||
|
m_Archive.getCorrelations()[3],
|
||||||
|
m_Archive.getPopulationMeasures()[0],
|
||||||
|
// collisions,
|
||||||
|
// getClusterDiffDist()
|
||||||
|
};
|
||||||
// return m_Undifferentiated.size() + " \t " + m_Species.size() + " \t " + BeanInspector.toString(getAvgSpeciesMeasures()[0]) + " \t " + (m_Archive.size());
|
// return m_Undifferentiated.size() + " \t " + m_Species.size() + " \t " + BeanInspector.toString(getAvgSpeciesMeasures()[0]) + " \t " + (m_Archive.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -419,7 +419,11 @@ public class ClusteringHillClimbing implements InterfacePopulationChangedEventLi
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String[] getAdditionalFileStringHeader(PopulationInterface pop) {
|
public String[] getAdditionalFileStringHeader(PopulationInterface pop) {
|
||||||
return new String[]{"#Indies"};
|
return new String[]{"numIndies"};
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getAdditionalFileStringInfo(PopulationInterface pop) {
|
||||||
|
return new String[]{"The current population size"};
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object[] getAdditionalFileStringValue(PopulationInterface pop) {
|
public Object[] getAdditionalFileStringValue(PopulationInterface pop) {
|
||||||
|
@ -2060,10 +2060,14 @@ public class ParticleSwarmOptimization implements InterfaceOptimizer, java.io.Se
|
|||||||
// public void setDoLocalSearch(boolean doLocalSearch) {
|
// public void setDoLocalSearch(boolean doLocalSearch) {
|
||||||
// this.doLocalSearch = doLocalSearch;
|
// this.doLocalSearch = doLocalSearch;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
public String[] getAdditionalFileStringHeader(PopulationInterface pop) {
|
public String[] getAdditionalFileStringHeader(PopulationInterface pop) {
|
||||||
if (emaPeriods > 0) return new String[]{"MeanCurSpeed","MeanEMASpeed"};
|
if (emaPeriods > 0) return new String[]{"meanEMASpeed", "meanCurSpeed"};
|
||||||
else return new String[]{"MeanCurSpeed"};
|
else return new String[]{"meanCurSpeed"};
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getAdditionalFileStringInfo(PopulationInterface pop) {
|
||||||
|
if (emaPeriods > 0) return new String[]{"Exponential moving average of the (range-relative) speed of all particles", "The mean (range-relative) current speed of all particles"};
|
||||||
|
else return new String[]{"The mean (range-relative) current speed of all particles"};
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object[] getAdditionalFileStringValue(PopulationInterface pop) {
|
public Object[] getAdditionalFileStringValue(PopulationInterface pop) {
|
||||||
|
@ -11,7 +11,26 @@ import eva2.tools.StringSelection;
|
|||||||
*/
|
*/
|
||||||
public enum GraphSelectionEnum {
|
public enum GraphSelectionEnum {
|
||||||
// DONT change this order, or the relation to AbstractStatistics will be lost
|
// DONT change this order, or the relation to AbstractStatistics will be lost
|
||||||
currentBest, meanFit, currentWorst, runBest, currentBestFeasible, runBestFeasible, avgPopDistance, maxPopDistance;
|
currentBest, meanFit, currentWorst, runBest, currentBestFeasible, runBestFeasible,
|
||||||
|
avgPopDistance, maxPopDistance;
|
||||||
|
|
||||||
|
private static String[] toolTips = {
|
||||||
|
"The current best fitness within the population",
|
||||||
|
"The mean fitness within the population",
|
||||||
|
"The current worst fitness within the population",
|
||||||
|
"The best fitness up to the current generation",
|
||||||
|
"The best feasible fitness within the population",
|
||||||
|
"The best feasible fitness up to the current generation",
|
||||||
|
"The average phenotypic distance of individuals in the population",
|
||||||
|
"The maximum phenotypic distance of individuals in the population"
|
||||||
|
};
|
||||||
|
|
||||||
|
public static String[] getInfoStrings() {
|
||||||
|
if (GraphSelectionEnum.values().length != toolTips.length) {
|
||||||
|
System.err.println("Error, mismatching length of info strings in GraphSelectionEnum");
|
||||||
|
return null;
|
||||||
|
} else return toolTips;
|
||||||
|
}
|
||||||
|
|
||||||
// public static boolean doPlotCurrentBest(StringSelection sel) {
|
// public static boolean doPlotCurrentBest(StringSelection sel) {
|
||||||
// return sel.isSelected(GraphSelectionEnum.currentBest.ordinal());
|
// return sel.isSelected(GraphSelectionEnum.currentBest.ordinal());
|
||||||
|
@ -52,7 +52,7 @@ public class StatsParameter implements InterfaceStatisticsParameter, InterfaceNo
|
|||||||
private boolean showAdditionalProblemInfo = false;
|
private boolean showAdditionalProblemInfo = false;
|
||||||
private double m_ConvergenceRateThreshold=0.001;
|
private double m_ConvergenceRateThreshold=0.001;
|
||||||
|
|
||||||
private StringSelection graphSel = new StringSelection(GraphSelectionEnum.currentBest);
|
private StringSelection graphSel = new StringSelection(GraphSelectionEnum.currentBest, GraphSelectionEnum.getInfoStrings());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -381,14 +381,21 @@ public class StatsParameter implements InterfaceStatisticsParameter, InterfaceNo
|
|||||||
public void setInformers(
|
public void setInformers(
|
||||||
List<InterfaceAdditionalPopulationInformer> informers) {
|
List<InterfaceAdditionalPopulationInformer> informers) {
|
||||||
ArrayList<String> headerFields = new ArrayList<String>();
|
ArrayList<String> headerFields = new ArrayList<String>();
|
||||||
|
ArrayList<String> infoFields = new ArrayList<String>();
|
||||||
// parse list of header elements, show additional Strings according to names.
|
// parse list of header elements, show additional Strings according to names.
|
||||||
for (InterfaceAdditionalPopulationInformer inf : informers) {
|
for (InterfaceAdditionalPopulationInformer inf : informers) {
|
||||||
headerFields.addAll(Arrays.asList(inf.getAdditionalFileStringHeader(null)));
|
headerFields.addAll(Arrays.asList(inf.getAdditionalFileStringHeader(null)));
|
||||||
|
if (infoFields.size()<headerFields.size()) { // add info strings for tool tips - fill up with null if none have been returned.
|
||||||
|
String[] infos = inf.getAdditionalFileStringInfo(null);
|
||||||
|
if (infos!=null) infoFields.addAll(Arrays.asList(infos));
|
||||||
|
while (infoFields.size()<headerFields.size()) infoFields.add(null);
|
||||||
|
}
|
||||||
// header += inf.getAdditionalFileStringHeader(null); // lets hope this works with a null
|
// header += inf.getAdditionalFileStringHeader(null); // lets hope this works with a null
|
||||||
}
|
}
|
||||||
// create additional fields to be selectable by the user, defined by the informer headers
|
// create additional fields to be selectable by the user, defined by the informer headers
|
||||||
// StringSelection ss = new StringSelection(GraphSelectionEnum.getAndAppendArray(headerFields.toArray(new String[headerFields.size()])));
|
// StringSelection ss = new StringSelection(GraphSelectionEnum.getAndAppendArray(headerFields.toArray(new String[headerFields.size()])));
|
||||||
StringSelection ss = new StringSelection(GraphSelectionEnum.currentBest, headerFields);
|
StringSelection ss = new StringSelection(GraphSelectionEnum.currentBest, GraphSelectionEnum.getInfoStrings(),
|
||||||
|
headerFields, infoFields.toArray(new String[infoFields.size()]));
|
||||||
ss.takeOverSelection(graphSel);
|
ss.takeOverSelection(graphSel);
|
||||||
// System.out.println("In " + this + ": setting new informers: " + BeanInspector.toString(ss.getStrings()));
|
// System.out.println("In " + this + ": setting new informers: " + BeanInspector.toString(ss.getStrings()));
|
||||||
// This works!
|
// This works!
|
||||||
|
Loading…
x
Reference in New Issue
Block a user