Adding the JavaEvA side of the matlab interface. Does not require external jmi.jar lib any more.
This commit is contained in:
parent
2db50903f8
commit
ae0c66c212
146
src/javaeva/server/go/problems/MatlabEvalMediator.java
Normal file
146
src/javaeva/server/go/problems/MatlabEvalMediator.java
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
package javaeva.server.go.problems;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This implements a thread acting as a mediator between JavaEvA and Matlab. Thanks to the idea
|
||||||
|
* of Henning Schmidt!
|
||||||
|
* As Java calling Matlab directly causes problems (due to Matlabs single-threadedness), Matlab
|
||||||
|
* now starts a mediator thread which receives the data necessary to perform the evaluation in matlab
|
||||||
|
* from the optimization thread. On receiving this "question" from the optimizer, the mediator thread
|
||||||
|
* finishes, returning to Matlab and signaling that there is work to do.
|
||||||
|
* However, the mediator object remains persistent, and the optimization thread keeps running
|
||||||
|
* and waits for the mediator to signal that there is a result, which happens if Matlab calls setAnswer().
|
||||||
|
* Then the optimizer thread resumes, while Matlab has to restart the mediator thread, so that it may
|
||||||
|
* be informed about the next question, and so on. I havent checked how much performance is lost compared
|
||||||
|
* to the earlier, asynchronous version, but it feels similar, a difference being that both cpu's
|
||||||
|
* are now at 100% load, which is because two threads are running (and always at least waiting actively).
|
||||||
|
* Adding sleep time reduces CPU load a lot but reduces efficiency badly at the same time, probably because
|
||||||
|
* theres so much going on. For cases where the evaluation function is very time-consuming, adding sleep time
|
||||||
|
* might be an option.
|
||||||
|
*
|
||||||
|
* @author mkron
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class MatlabEvalMediator implements Runnable {
|
||||||
|
volatile boolean requesting = false;
|
||||||
|
// final static boolean TRACE = false;
|
||||||
|
volatile boolean fin = false;
|
||||||
|
volatile double[] question = null;
|
||||||
|
volatile double[] answer = null;
|
||||||
|
volatile boolean quit = false;
|
||||||
|
volatile double[] optSolution = null;
|
||||||
|
volatile double[][] optSolSet = null;
|
||||||
|
// MatlabProblem mp = null;
|
||||||
|
// no good: even when waiting for only 1 ms the Matlab execution time increases by a factor of 5-10
|
||||||
|
final static int sleepTime = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request evaluation from Matlab for the given params.
|
||||||
|
*
|
||||||
|
* @param x
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
double[] requestEval(MatlabProblem mp, double[] x) {
|
||||||
|
// this.mp = mp;
|
||||||
|
question = x;
|
||||||
|
requesting = true;
|
||||||
|
// int k=0;
|
||||||
|
// mp.log("Requesting eval for " + BeanInspector.toString(x) + ", req state is " + requesting + "\n");
|
||||||
|
while (requesting && !quit) {
|
||||||
|
// wait for matlab to answer the question
|
||||||
|
if (sleepTime > 0) try { Thread.sleep(sleepTime); } catch(Exception e) {};
|
||||||
|
// k++;
|
||||||
|
// if (k>100) {
|
||||||
|
// System.out.println("waiting for matlab to answer...");
|
||||||
|
// k=0;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
// mp.log("Requesting done \n");
|
||||||
|
// matlab is finished, answer is here
|
||||||
|
return getAnswer(); // return to JE with answer
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wait loop, wait until the MatlabProblem requests an evaluation (or finishes), then return.
|
||||||
|
*/
|
||||||
|
public void run() {
|
||||||
|
// int k=0;
|
||||||
|
while (!requesting && !isFinished() && !quit) {
|
||||||
|
// wait for JE to pose a question or finish all
|
||||||
|
if (sleepTime > 0) try { Thread.sleep(sleepTime); } catch(Exception e) {};
|
||||||
|
// k++;
|
||||||
|
// if (k>100) {
|
||||||
|
// System.out.println("waiting for JE to ask...");
|
||||||
|
// k=0;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
// mp.log("-- Request arrived in MP thread\n");
|
||||||
|
// requesting is true, now finish and let Matlab work
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cancel waiting in any case.
|
||||||
|
*/
|
||||||
|
public void quit() {
|
||||||
|
quit = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To be called from Matlab.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public double[] getQuestion() {
|
||||||
|
// mp.log("-- Question: " + BeanInspector.toString(question) + "\n");
|
||||||
|
return question;
|
||||||
|
}
|
||||||
|
|
||||||
|
double[] getAnswer() {
|
||||||
|
return answer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To be called from Matlab giving the result of the question.
|
||||||
|
*
|
||||||
|
* @param y
|
||||||
|
*/
|
||||||
|
public void setAnswer(double[] y) {
|
||||||
|
// mp.log("-- setAnswer: " + BeanInspector.toString(y) + "\n");
|
||||||
|
answer = y;
|
||||||
|
requesting = false; // answer is finished, break request loop
|
||||||
|
}
|
||||||
|
|
||||||
|
void setFinished(boolean val) {
|
||||||
|
fin = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To be called from Matlab signalling when optimizaton is completely finished.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isFinished() {
|
||||||
|
return fin;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setSolution(double[] sol) {
|
||||||
|
optSolution = sol;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setSolutionSet(double[][] solSet) {
|
||||||
|
optSolSet = solSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Matlab may retrieve result.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public double[] getSolution() {
|
||||||
|
return optSolution;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Matlab may retrieve result.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public double[][] getSolutionSet() {
|
||||||
|
return optSolSet;
|
||||||
|
}
|
||||||
|
}
|
453
src/javaeva/server/go/problems/MatlabProblem.java
Normal file
453
src/javaeva/server/go/problems/MatlabProblem.java
Normal file
@ -0,0 +1,453 @@
|
|||||||
|
package javaeva.server.go.problems;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.PrintStream;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
|
||||||
|
import javaeva.OptimizerFactory;
|
||||||
|
import javaeva.OptimizerRunnable;
|
||||||
|
import javaeva.gui.BeanInspector;
|
||||||
|
import javaeva.server.go.individuals.AbstractEAIndividual;
|
||||||
|
import javaeva.server.go.individuals.ESIndividualDoubleData;
|
||||||
|
import javaeva.server.go.individuals.InterfaceDataTypeDouble;
|
||||||
|
import javaeva.server.go.operators.distancemetric.PhenotypeMetric;
|
||||||
|
import javaeva.server.go.operators.postprocess.InterfacePostProcessParams;
|
||||||
|
import javaeva.server.go.operators.postprocess.PostProcess;
|
||||||
|
import javaeva.server.go.operators.postprocess.PostProcessParams;
|
||||||
|
import javaeva.server.go.populations.Population;
|
||||||
|
import javaeva.server.go.strategies.InterfaceOptimizer;
|
||||||
|
import javaeva.server.stat.InterfaceTextListener;
|
||||||
|
|
||||||
|
public class MatlabProblem extends AbstractProblemDouble implements InterfaceTextListener, Serializable {
|
||||||
|
private static final long serialVersionUID = 4913310869887420815L;
|
||||||
|
public static final boolean TRACE = false;
|
||||||
|
// transient protected Matlab matlab = null;
|
||||||
|
transient OptimizerRunnable runnable = null;
|
||||||
|
protected boolean allowSingleRunnable = true;
|
||||||
|
// protected String jmInterface;
|
||||||
|
protected int problemDimension = 10;
|
||||||
|
transient PrintStream dos = null;
|
||||||
|
protected double[][] range = null;
|
||||||
|
private static final String defTestOut = "matlabproblem-testout.dat";
|
||||||
|
boolean forwardStatisticsOutput = false;
|
||||||
|
private MatlabEvalMediator handler = null;
|
||||||
|
|
||||||
|
|
||||||
|
private F1Problem f1 = new F1Problem(); // TODO
|
||||||
|
|
||||||
|
// transient private double[] currArray = null;
|
||||||
|
// private String mtCmd = null;
|
||||||
|
|
||||||
|
public MatlabProblem(MatlabProblem o) {
|
||||||
|
// this.matlab = o.matlab;
|
||||||
|
this.handler = o.handler;
|
||||||
|
this.runnable = o.runnable;
|
||||||
|
this.allowSingleRunnable = o.allowSingleRunnable;
|
||||||
|
// this.jmInterface = new String(o.jmInterface);
|
||||||
|
this.problemDimension = o.problemDimension;
|
||||||
|
// this.res = new ResultArr();
|
||||||
|
// if (o.res != null) if (o.res.get() != null) res.set(o.res.get());
|
||||||
|
this.range = o.makeRange();
|
||||||
|
// this.mtCmd = o.mtCmd;
|
||||||
|
// currArray = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object clone() {
|
||||||
|
return new MatlabProblem(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MatlabProblem(String nameJEInterface, int dim) {
|
||||||
|
this(nameJEInterface, dim, null);
|
||||||
|
range = super.makeRange();
|
||||||
|
}
|
||||||
|
|
||||||
|
public MatlabProblem(String nameJEInterface, int dim, double[][] range) {
|
||||||
|
init(nameJEInterface, dim, range, defTestOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MatlabProblem(String nameJEInterface, int dim, double lower, double upper) {
|
||||||
|
this(nameJEInterface, dim, null);
|
||||||
|
double[][] range = new double[dim][2];
|
||||||
|
for (int i=0; i<dim; i++) {
|
||||||
|
range[dim][0] = lower;
|
||||||
|
range[dim][1] = upper;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMediator(MatlabEvalMediator h) {
|
||||||
|
handler = h;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initProblem() {
|
||||||
|
init(/*this.jmInterface*/ null, this.problemDimension, this.range, defTestOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void init(String nameJEInterface, int dim, double[][] rng, String outFile) {
|
||||||
|
problemDimension = dim;
|
||||||
|
if ((rng != null) && (dim != rng.length)) throw new ArrayIndexOutOfBoundsException("Mismatching dimension and range!");
|
||||||
|
range = rng;
|
||||||
|
initTemplate();
|
||||||
|
// res = new ResultArr();
|
||||||
|
if ((dos == null) && TRACE) {
|
||||||
|
try {
|
||||||
|
dos = new PrintStream(new FileOutputStream(outFile));
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log("range is " + BeanInspector.toString(range)+ "\n");
|
||||||
|
log("template len: " + ((ESIndividualDoubleData)m_Template).getDGenotype().length + "\n");
|
||||||
|
try {
|
||||||
|
// if (matlab == null)
|
||||||
|
// matlab = new Matlab();//this command links to the current matlab session
|
||||||
|
// try {
|
||||||
|
// matlab.eval("JE='hello'");
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
} catch (Error e) {
|
||||||
|
log("Error: " + e.toString());
|
||||||
|
System.err.println("Error: could not create MatlabProblem instance. MatlabProblem can only be used from Matlab.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// this.jmInterface = nameJEInterface;
|
||||||
|
// mtCmd = new String("evaluateJE("+jmInterface+")");
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**
|
||||||
|
// * @return the jmInterface
|
||||||
|
// */
|
||||||
|
// public String getJmInterfaceName() {
|
||||||
|
// return jmInterface;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// /**
|
||||||
|
// * @param jmInterface the jmInterface to set
|
||||||
|
// */
|
||||||
|
// public void setJmInterfaceName(String jmInterface) {
|
||||||
|
// this.jmInterface = jmInterface;
|
||||||
|
// }
|
||||||
|
|
||||||
|
public void setStatsOutput(boolean forwardStats) {
|
||||||
|
forwardStatisticsOutput = forwardStats;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String jmiInterfaceNameTipText() {
|
||||||
|
return "Name of the JEInterface instance in Matlab";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param problemDimension the problemDimension to set
|
||||||
|
*/
|
||||||
|
public void setProblemDimension(int problemDimension) {
|
||||||
|
this.problemDimension = problemDimension;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int getProblemDimension() {
|
||||||
|
return problemDimension;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String problemDimensionTipTex() {
|
||||||
|
return "The dimension of the problem.";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected double[][] makeRange() {
|
||||||
|
if (range==null) range=super.makeRange();
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected double getRangeLowerBound(int dim) {
|
||||||
|
return (range==null) ? super.getRangeLowerBound(dim) : range[dim][0];
|
||||||
|
}
|
||||||
|
|
||||||
|
protected double getRangeUpperBound(int dim) {
|
||||||
|
return (range==null) ? super.getRangeUpperBound(dim) : range[dim][1];
|
||||||
|
}
|
||||||
|
|
||||||
|
// public double[] getCurrentDoubleArray() {
|
||||||
|
// return currArray;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public double[] getNewDoubleArray() {
|
||||||
|
// currArray = new double[problemDimension];
|
||||||
|
// for (int i=0; i<problemDimension; i++) currArray[i] = RandomNumberGenerator.gaussianDouble(1);
|
||||||
|
// return currArray;
|
||||||
|
// }
|
||||||
|
|
||||||
|
public void log(String str) {
|
||||||
|
if (dos != null) {
|
||||||
|
dos.print((String)str);
|
||||||
|
dos.flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public double[] eval(double[] x) {
|
||||||
|
log("evaluating " + BeanInspector.toString(x) + "\n");
|
||||||
|
double[] res = handler.requestEval(this, x);
|
||||||
|
double diff = PhenotypeMetric.euclidianDistance(res, f1.eval(x));
|
||||||
|
log("result: " + BeanInspector.toString(res) + " compared to " + BeanInspector.toString(f1.eval(x)) + "\n");
|
||||||
|
if (diff != 0) {
|
||||||
|
log("!!! diff is " + diff + "\n");
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
|
||||||
|
// synchronized (this) {
|
||||||
|
// try {
|
||||||
|
// res.reset();
|
||||||
|
// currArray = x;
|
||||||
|
// log("evaluating " + BeanInspector.toString(x) + "\n");
|
||||||
|
// matlab.eval(mtCmd, (CompletionObserver)this);
|
||||||
|
// this.wait();
|
||||||
|
// } catch (InterruptedException e) {
|
||||||
|
// log("wait interrupted: " + e.getMessage() + " \n");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// log("wait done, returning " + res.get()[0] + " \n");
|
||||||
|
// return res.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void optimize(final int optType, String outputFilePrefix) {
|
||||||
|
optimize(optType, outputFilePrefix, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void optimize(final int optType, String outputFilePrefix, Object[] specParams, Object[] specValues) {
|
||||||
|
if (allowSingleRunnable && (runnable != null) && (!runnable.isFinished())) {
|
||||||
|
System.err.println("Please wait for the current optimization to finish");
|
||||||
|
} else {
|
||||||
|
handler.setFinished(false);
|
||||||
|
runnable = OptimizerFactory.getOptRunnable(optType, (AbstractOptimizationProblem)this, outputFilePrefix);
|
||||||
|
// runnable.getGOParams().setPostProcessParams(new PostProcessParams(0, 0.01, 5));
|
||||||
|
runnable.setTextListener(this);
|
||||||
|
if ((specParams != null) && (specParams.length > 0)) {
|
||||||
|
if ((specValues == null) || (specValues.length != specParams.length)) {
|
||||||
|
System.err.println("mismatching value list for parameter arguments: " + specValues);
|
||||||
|
} else {
|
||||||
|
log("setting specific parameters...\n");
|
||||||
|
InterfaceOptimizer opt = runnable.getGOParams().getOptimizer();
|
||||||
|
for (int i=0; i<specParams.length; i++) { // loop over settings
|
||||||
|
log("try setting " + specParams[i] + " to " + specValues[i]);
|
||||||
|
if (!BeanInspector.setMem(opt, (String)specParams[i], specValues[i])) {
|
||||||
|
log("... Fail!\n");
|
||||||
|
System.err.println("Unable to set parameter " + specParams[i] + ", skipping...");
|
||||||
|
} else log("... Ok.\n");
|
||||||
|
}
|
||||||
|
log(BeanInspector.toString(BeanInspector.getMemberDescriptions(opt, true)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new Thread(new WaitForEvARunnable(runnable, this)).start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startPostProcess(InterfacePostProcessParams ppp) {
|
||||||
|
if (ppp.isDoPostProcessing()) {
|
||||||
|
if (allowSingleRunnable && (runnable != null) && (!runnable.isFinished())) {
|
||||||
|
System.err.println("Please wait for the current optimization to finish");
|
||||||
|
} else {
|
||||||
|
handler.setFinished(false);
|
||||||
|
log("\nstarting post process thread... " + BeanInspector.toString(ppp));
|
||||||
|
// runnable.setTextListener(this);
|
||||||
|
runnable.setDoRestart(true);
|
||||||
|
runnable.setDoPostProcessOnly(true);
|
||||||
|
runnable.setPostProcessingParams(ppp);
|
||||||
|
// runnable.restartOpt();
|
||||||
|
// log("\nppp are " + BeanInspector.toString(runnable.getGOParams().getPostProcessParams()));
|
||||||
|
new Thread(new WaitForEvARunnable(runnable, this)).start();
|
||||||
|
}
|
||||||
|
} else System.err.println("Nothing to be done.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request post processing of the last optimization results with given parameters
|
||||||
|
* and export the result solution set to matlab.
|
||||||
|
*
|
||||||
|
* @param steps post processing steps with hill climber
|
||||||
|
* @param sigma sigma parameter for clustering
|
||||||
|
* @param nBest maximum number of solutions to retrieve
|
||||||
|
*/
|
||||||
|
public void requestPostProcessing(int steps, double sigma, int nBest) {
|
||||||
|
PostProcessParams ppp = new PostProcessParams(steps, sigma, nBest);
|
||||||
|
startPostProcess(ppp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request post processing of the last optimization results with given parameters
|
||||||
|
* and export the result solution set to matlab.
|
||||||
|
* This variant retrieves all solutions found in this way.
|
||||||
|
*
|
||||||
|
* @param steps post processing steps with hill climber
|
||||||
|
* @param sigma sigma parameter for clustering
|
||||||
|
*/
|
||||||
|
public void requestPostProcessing(int steps, double sigma) {
|
||||||
|
requestPostProcessing(steps, sigma, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stopOptimize() {
|
||||||
|
log(">>>>>>>>>> Stop event!\n");
|
||||||
|
if (runnable != null) {
|
||||||
|
runnable.stopOpt();
|
||||||
|
}
|
||||||
|
PostProcess.stopHC();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getInfoString() {
|
||||||
|
if (runnable == null) return "";
|
||||||
|
StringBuffer sb = new StringBuffer("");
|
||||||
|
sb.append(runnable.terminatedBecause());
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getFunctionCalls() {
|
||||||
|
if (runnable == null) return 0;
|
||||||
|
return runnable.getGOParams().getOptimizer().getPopulation().getFunctionCalls();
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Matlab getMatlab() {
|
||||||
|
// return matlab;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
void exportResultPopulationToMatlab(Population pop) {
|
||||||
|
double[][] solSet;
|
||||||
|
|
||||||
|
if ((pop != null) && (pop.size()>0)) {
|
||||||
|
solSet = new double[pop.size()][];
|
||||||
|
for (int i=0; i<pop.size(); i++) {
|
||||||
|
solSet[i]=((InterfaceDataTypeDouble)pop.getEAIndividual(i)).getDoubleData();
|
||||||
|
}
|
||||||
|
handler.setSolutionSet(solSet);
|
||||||
|
} else {
|
||||||
|
handler.setSolutionSet(null);
|
||||||
|
}
|
||||||
|
// String resStr;
|
||||||
|
// if ((pop == null) || (pop.size() == 0)) resStr = "[]";
|
||||||
|
// else {
|
||||||
|
// StringBuffer sb = new StringBuffer();
|
||||||
|
// sb.append("[");
|
||||||
|
// for (int i=0; i<pop.size(); i++) {
|
||||||
|
// sb.append(AbstractEAIndividual.getDefaultDataString(pop.getEAIndividual(i), " "));
|
||||||
|
// if (i<pop.size()-1) sb.append(";");
|
||||||
|
// }
|
||||||
|
// sb.append("]");
|
||||||
|
// resStr = sb.toString();
|
||||||
|
// }
|
||||||
|
// log("result array was " + resStr + "\n");
|
||||||
|
// try {
|
||||||
|
// String cmd = jmInterface + "= setResultArrayJE(" + jmInterface + ", " + resStr + ")";
|
||||||
|
// log("trying cmd: "+ cmd + "\n");
|
||||||
|
// matlab.eval(cmd);
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// log("Exception when exporting result to Matlab! "+e.getMessage());
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
void exportResultToMatlab(double[] result) {
|
||||||
|
handler.setSolution(result);
|
||||||
|
// String resStr;
|
||||||
|
// if (result == null) resStr = "[]";
|
||||||
|
// else resStr = BeanInspector.toString(result);
|
||||||
|
// log("result was " + resStr + "\n");
|
||||||
|
// try {
|
||||||
|
// String cmd = jmInterface + "= setResultJE(" + jmInterface + ", " + resStr + ")";
|
||||||
|
// log("trying cmd: "+ cmd + "\n");
|
||||||
|
// matlab.eval(cmd);
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// log("Exception when exporting result to Matlab! "+e.getMessage());
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To be called by the executing thread to inform that the thread is finished.
|
||||||
|
* We
|
||||||
|
*/
|
||||||
|
void notifyFinished() {
|
||||||
|
handler.setFinished(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double[] getIntermediateResult() {
|
||||||
|
if (runnable == null) return null;
|
||||||
|
else return runnable.getDoubleSolution();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of function calls performed so far.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int getProgress() {
|
||||||
|
if (runnable == null) return 0;
|
||||||
|
else return runnable.getProgress();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String globalInfo() {
|
||||||
|
return "Interface problem class for optimization in Matlab, only usable from within Matlab";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void print(String str) {
|
||||||
|
if (forwardStatisticsOutput) {
|
||||||
|
// matlab displays sysout output in the command window, so we simply use this channel
|
||||||
|
System.out.print(str);
|
||||||
|
}
|
||||||
|
log(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void println(String str) {
|
||||||
|
print(str);
|
||||||
|
print("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////
|
||||||
|
|
||||||
|
class WaitForEvARunnable implements Runnable {
|
||||||
|
OptimizerRunnable runnable;
|
||||||
|
MatlabProblem mp;
|
||||||
|
|
||||||
|
public WaitForEvARunnable(OptimizerRunnable runnable, MatlabProblem mp) {
|
||||||
|
this.runnable = runnable;
|
||||||
|
this.mp = mp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
if (runnable != null) {
|
||||||
|
mp.log("\nStarting optimize runnable!\n");
|
||||||
|
|
||||||
|
synchronized (runnable) {
|
||||||
|
try {
|
||||||
|
// whole optimization thread goes in here
|
||||||
|
new Thread(runnable).start();
|
||||||
|
mp.log("Starting optimize thread done!\n");
|
||||||
|
runnable.wait();
|
||||||
|
// wait for the runnable to finish
|
||||||
|
mp.log("After wait!\n");
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
mp.log("WaitForEvARunnable was interrupted with " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
mp.log("runnable.getSolution: " + BeanInspector.toString(runnable.getDoubleSolution()));
|
||||||
|
mp.log("\ngetAllSols best: " + AbstractEAIndividual.getDefaultDataString(runnable.getGOParams().getOptimizer().getAllSolutions().getBestEAIndividual()));
|
||||||
|
mp.log("\n");
|
||||||
|
// write results back to matlab
|
||||||
|
mp.exportResultToMatlab(runnable.getDoubleSolution());
|
||||||
|
mp.exportResultPopulationToMatlab(runnable.getSolutionSet());
|
||||||
|
System.out.println("Optimization finished: " + mp.getInfoString());
|
||||||
|
} catch (Exception e) {
|
||||||
|
StringWriter sw = new StringWriter();
|
||||||
|
e.printStackTrace(new PrintWriter(sw));
|
||||||
|
mp.log("error in callback: " + e.getMessage() + " " + sw.toString() + "\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
System.err.println("Invalid optimization call.");
|
||||||
|
mp.log("invalid call, no optimization started.\n");
|
||||||
|
mp.exportResultToMatlab(null);
|
||||||
|
mp.exportResultPopulationToMatlab(null);
|
||||||
|
}
|
||||||
|
mp.notifyFinished();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user