eva2/src/eva2/OptimizerRunnable.java
2015-11-30 16:28:18 +01:00

287 lines
9.1 KiB
Java

package eva2;
import eva2.optimization.InterfaceOptimizationParameters;
import eva2.optimization.OptimizationStateListener;
import eva2.optimization.Processor;
import eva2.optimization.individuals.IndividualInterface;
import eva2.optimization.individuals.InterfaceDataTypeBinary;
import eva2.optimization.individuals.InterfaceDataTypeDouble;
import eva2.optimization.individuals.InterfaceDataTypeInteger;
import eva2.optimization.operator.postprocess.InterfacePostProcessParams;
import eva2.optimization.operator.postprocess.PostProcessParams;
import eva2.optimization.operator.terminators.InterfaceTerminator;
import eva2.optimization.population.Population;
import eva2.optimization.population.SolutionSet;
import eva2.optimization.statistics.*;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.BitSet;
/**
* This Runnable class just encapsulates the Processor class with some simple ways to access a solution.
*
* @author mkron
*/
public class OptimizerRunnable implements Runnable {
private Processor proc;
private boolean isFinished = false;
private boolean doRestart = false; // indicate whether start or restart should be done --> whether pop will be reinitialized.
private boolean postProcessOnly = false;
private InterfaceTextListener listener = null;
private String ident = "OptimizerRunnable";
private static int cntID = 0;
private int rnblID = -1;
/**
* Construct an OptimizerRunnable with given parameters and a StatisticsStandalone instance without restart,
* meaning that the population will be initialized randomly.
*
* @param params
* @param outputFilePrefix
*/
public OptimizerRunnable(InterfaceOptimizationParameters params, String outputFilePrefix) {
this(params, outputFilePrefix, false);
}
/**
* This constructor assumes that DummyStatistics are enough. This saves time e.g. for small populations.
* If restart is true, the processor will not reinitialize the population allowing search on predefined populations.
*
* @param params
* @param restart
*/
public OptimizerRunnable(InterfaceOptimizationParameters params, boolean restart) {
this(params, new StatisticsDummy(), restart);
}
/**
* Construct an OptimizerRunnable with given parameters and a StatisticsStandalone instance with optional restart.
* If restart is true, the processor will not reinitialize the population allowing search on predefined populations.
* The outputFilePrefix may be null.
*
* @param params
* @param outputFilePrefix
* @param restart
*/
public OptimizerRunnable(InterfaceOptimizationParameters params, String outputFilePrefix, boolean restart) {
this(params, new StatisticsStandalone(outputFilePrefix), restart);
}
/**
* Construct an OptimizerRunnable with given parameters and statistics instance with optional restart.
* If restart is true, the processor will not reinitialize the population allowing search on predefined populations.
*
* @param params
* @param stats
* @param restart
*/
public OptimizerRunnable(InterfaceOptimizationParameters params, InterfaceStatistics stats, boolean restart) {
rnblID = cntID;
cntID++;
proc = new Processor(stats, params);
if (proc.getStatistics() instanceof AbstractStatistics) {
((AbstractStatistics) proc.getStatistics()).setSaveParams(false);
}
doRestart = restart;
}
public void setIdentifier(String id) {
ident = id;
}
public String getIdentifier() {
return ident;
}
/**
* A unique ID for the runnable.
*
* @return
*/
public int getID() {
return rnblID;
}
public InterfaceOptimizationParameters getOptimizationParameters() {
return proc.getOptimizationParameters();
}
public InterfaceStatistics getStats() {
return proc.getStatistics();
}
public void setStatistics(InterfaceStatistics stats) {
if (proc.isOptimizationRunning()) {
throw new RuntimeException("Error - cannot change statistics instance during optimization.");
}
InterfaceOptimizationParameters params = proc.getOptimizationParameters();
proc = new Processor(stats, params);
if (proc.getStatistics() instanceof AbstractStatistics) {
((AbstractStatistics) proc.getStatistics()).setSaveParams(false);
}
}
public void setTextListener(InterfaceTextListener lsnr) {
proc.getStatistics().removeTextListener(listener);
this.listener = lsnr;
if (listener != null) {
proc.getStatistics().addTextListener(listener);
}
}
public void addOptimizationStateListener(OptimizationStateListener rsl) {
if (proc != null) {
proc.addListener(rsl);
}
}
public void setDoRestart(boolean restart) {
doRestart = restart;
}
@Override
public void run() {
isFinished = false;
try {
proc.setSaveParams(false);
if (postProcessOnly) {
proc.performPostProcessing((PostProcessParams) proc.getOptimizationParameters().getPostProcessParams(), listener);
} else {
if (doRestart) {
proc.restartOptimization();
} else {
proc.startOptimization();
}
proc.runOptimizationOnce();
}
} catch (Exception e) {
proc.getStatistics().printToTextListener("Exception in OptimizeThread::run: " + e.getMessage() + "\n");
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
proc.getStatistics().printToTextListener(sw.toString());
}
isFinished = true;
synchronized (this) {
this.notifyAll();
}
}
public void setDoPostProcessOnly(boolean poPO) {
postProcessOnly = poPO;
}
public boolean isFinished() {
return isFinished;
}
public boolean wasAborted() {
return (proc != null && (proc.wasAborted()));
}
public void restartOpt() {
proc.restartOptimization();
}
public void stopOpt() {
proc.stopOptimization();
}
public IndividualInterface getResult() {
return proc.getStatistics().getBestSolution();
}
public Population getResultPopulation() {
return proc.getResultPopulation();
}
public SolutionSet getSolutionSet() {
return (SolutionSet) proc.getOptimizationParameters().getOptimizer().getAllSolutions();
}
public void setPostProcessingParams(InterfacePostProcessParams ppp) {
proc.getOptimizationParameters().setPostProcessParams(ppp);
}
public int getProgress() {
return proc.getOptimizationParameters().getOptimizer().getPopulation().getFunctionCalls();
}
public String terminatedBecause() {
if (isFinished) {
if (postProcessOnly) {
return "Post processing finished";
} else {
InterfaceTerminator term = proc.getOptimizationParameters().getTerminator();
return term.lastTerminationMessage();
}
} else {
return "Not yet terminated";
}
}
public double[] getDoubleSolution() {
IndividualInterface indy = getResult();
if (indy instanceof InterfaceDataTypeDouble) {
return ((InterfaceDataTypeDouble) indy).getDoubleData();
} else {
return null;
}
}
public BitSet getBinarySolution() {
IndividualInterface indy = getResult();
if (indy instanceof InterfaceDataTypeBinary) {
return ((InterfaceDataTypeBinary) indy).getBinaryData();
} else {
return null;
}
}
public int[] getIntegerSolution() {
IndividualInterface indy = getResult();
if (indy instanceof InterfaceDataTypeInteger) {
return ((InterfaceDataTypeInteger) indy).getIntegerData();
} else {
return null;
}
}
/**
* Set the verbosity level in the statistics module to the given value.
*
* @param vLev
*/
public void setVerbosityLevel(InterfaceStatisticsParameters.OutputVerbosity vLev) {
proc.getStatistics().getStatisticsParameters().setOutputVerbosity(vLev);
}
/**
* Set the output direction in the statistics module.
*
* @param outp
*/
public void setOutputTo(InterfaceStatisticsParameters.OutputTo outp) {
proc.getStatistics().getStatisticsParameters().setOutputTo(outp);
}
/**
* Set the number of multiruns in the statistics module.
*
* @param multis
*/
public void setMultiRuns(int multis) {
proc.getStatistics().getStatisticsParameters().setMultiRuns(multis);
}
/**
* Indicate whether full stats should be printed as text (or only selected entries).
*
* @param addInfo
*/
public void setOutputFullStatsToText(boolean addInfo) {
proc.getStatistics().getStatisticsParameters().setOutputAllFieldsAsText(addInfo);
}
}