Updating the JEInterface Java code
This commit is contained in:
parent
b14118bb6f
commit
22f50cb45d
@ -22,19 +22,42 @@ import eva2.gui.BeanInspector;
|
|||||||
* @author mkron
|
* @author mkron
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class MatlabEvalMediator implements Runnable {
|
public class MatlabEvalMediator {
|
||||||
volatile boolean requesting = false;
|
volatile Boolean requesting = false;
|
||||||
// final static boolean TRACE = false;
|
// final static boolean TRACE = false;
|
||||||
volatile boolean fin = false;
|
volatile private Boolean fin = false;
|
||||||
volatile Object question = null;
|
volatile Object question = null;
|
||||||
volatile double[] answer = null;
|
volatile double[] answer = null;
|
||||||
boolean quit = false;
|
volatile boolean quit = false;
|
||||||
volatile Object optSolution = null;
|
volatile Object optSolution = null;
|
||||||
volatile Object[] optSolSet = null;
|
volatile Object[] optSolSet = null;
|
||||||
MatlabProblem mp = null;
|
int runID=-1;
|
||||||
|
volatile MatlabProblem mp = null;
|
||||||
// no good: even when waiting for only 1 ms the Matlab execution time increases by a factor of 5-10
|
// no good: even when waiting for only 1 ms the Matlab execution time increases by a factor of 5-10
|
||||||
final static int sleepTime = 5;
|
private int sleepTime = 5;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor with integer argument for the sleep time in between requests. Values higher than 0 reduce
|
||||||
|
* cpu load of the waiting thread but may also reduce allover runtime for fast evaluation functions.
|
||||||
|
*
|
||||||
|
* @param threadSleepTime
|
||||||
|
*/
|
||||||
|
public MatlabEvalMediator(int threadSleepTime) {
|
||||||
|
sleepTime=threadSleepTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor with sleep time set to zero.
|
||||||
|
*/
|
||||||
|
public MatlabEvalMediator() {
|
||||||
|
sleepTime=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMatlabProblem(MatlabProblem theMP) {
|
||||||
|
mp=theMP;
|
||||||
|
mp.log("setting MP " + theMP + " for MEM " + this + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request evaluation from Matlab for the given params.
|
* Request evaluation from Matlab for the given params.
|
||||||
*
|
*
|
||||||
@ -53,40 +76,75 @@ public class MatlabEvalMediator implements Runnable {
|
|||||||
//
|
//
|
||||||
if (question == null) System.err.println("Error: requesting evaluation for null array!");
|
if (question == null) System.err.println("Error: requesting evaluation for null array!");
|
||||||
} else System.err.println("Error, requesting evaluation for non array!");
|
} else System.err.println("Error, requesting evaluation for non array!");
|
||||||
|
synchronized(requesting) {
|
||||||
requesting = true;
|
if (requesting) {
|
||||||
// int k=0;
|
String msg="Warning: already in requesting state when request arrived!";
|
||||||
mp.log("-- Requesting eval for " + BeanInspector.toString(x) + ", req state is " + requesting + "\n");
|
System.err.println(msg);
|
||||||
|
mp.log(msg);
|
||||||
|
}
|
||||||
|
requesting = true;
|
||||||
|
mp.log("-- Requesting eval for " + BeanInspector.toString(x) + ", req state is " + requesting + "\n");
|
||||||
|
}
|
||||||
|
int k=0; int mod=25;
|
||||||
while (requesting && !quit) {
|
while (requesting && !quit) {
|
||||||
// wait for matlab to answer the question
|
// wait for matlab to answer the question
|
||||||
if (sleepTime > 0) try { Thread.sleep(sleepTime); } catch(Exception e) {};
|
if (sleepTime > 0) try { Thread.sleep(sleepTime); } catch(Exception e) {
|
||||||
// if ((k%100)==0) {
|
System.err.println("Exception in sleep (MatlabEvalMediator)");
|
||||||
|
};
|
||||||
|
k++;
|
||||||
|
if ((k%mod)==0) {
|
||||||
// System.out.println("waiting for matlab to answer...");
|
// System.out.println("waiting for matlab to answer...");
|
||||||
// }
|
mp.log("waiting for matlab to answer... (" + mod + ") " + getState() + "\n");
|
||||||
// k++;
|
mod*=2;
|
||||||
|
if (mod <=0) mod=Integer.MAX_VALUE;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mp.log("-- Requesting done\n");
|
mp.log("-- Requesting done\n");
|
||||||
// matlab is finished, answer is here
|
// matlab is finished, answer is here
|
||||||
//return null;
|
//return null;
|
||||||
return getAnswer(); // return to JE with answer
|
return getAnswer(); // return to JE with answer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getState() {
|
||||||
|
return "ID: " + runID + ", qu: " + BeanInspector.toString(question) + " quit,fin,req " + quit + "," + fin +"," + requesting;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wait loop, wait until the MatlabProblem requests an evaluation (or finishes), then return.
|
* Wait loop, wait until the MatlabProblem requests an evaluation (or finishes), then return.
|
||||||
|
* For debugging, an integer ID for this run may be provided.
|
||||||
*/
|
*/
|
||||||
public void run() {
|
public void run(int id) {
|
||||||
// int k=0;
|
logMPSys("## MEM start run " + id);
|
||||||
|
runID=id;
|
||||||
|
int k=0;int mod=25;
|
||||||
while (!requesting && !isFinished() && !quit) {
|
while (!requesting && !isFinished() && !quit) {
|
||||||
// wait for JE to pose a question or finish all
|
// wait for JE to pose a question or finish all
|
||||||
if (sleepTime > 0) try { Thread.sleep(sleepTime); } catch(Exception e) {};
|
if (sleepTime > 0) try { Thread.sleep(sleepTime); } catch(Exception e) {};
|
||||||
// if ((k%100)==0) {
|
k++;
|
||||||
// System.out.println("waiting for JE to ask...");
|
if ((k%mod)==0) {
|
||||||
// }
|
logMPSys("MEM waiting for JE to ask... (" + mod +") " + getState());
|
||||||
// k++;
|
mod*=2;
|
||||||
|
if (mod<=0) mod = Integer.MAX_VALUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// System.out.println("-- Request arrived in MP thread\n");
|
if (requesting) logMPSys("-- MEM Request arrived in MP thread " + runID);
|
||||||
|
else logMPSys("-- MEM finished or quit " + runID);
|
||||||
// requesting is true, now finish and let Matlab work
|
// requesting is true, now finish and let Matlab work
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wait loop, wait until the MatlabProblem requests an evaluation (or finishes), then return.
|
||||||
|
* Calls the {@link #run(int)} method with ID zero.
|
||||||
|
*/
|
||||||
|
public void run() {
|
||||||
|
run(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void logMPSys(String msg) {
|
||||||
|
if (mp!=null) mp.log(msg + "\n");
|
||||||
|
else System.out.println("MEM has no MP! " + msg);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cancel waiting in any case.
|
* Cancel waiting in any case.
|
||||||
@ -116,18 +174,33 @@ public class MatlabEvalMediator implements Runnable {
|
|||||||
* @param y
|
* @param y
|
||||||
*/
|
*/
|
||||||
public void setAnswer(double[] y) {
|
public void setAnswer(double[] y) {
|
||||||
// System.err.println("answer is " + BeanInspector.toString(y));
|
synchronized(requesting) {
|
||||||
if (y==null) {
|
if (!requesting) {
|
||||||
System.err.println("Error: Matlab function returned null array - this is bad.");
|
String msg="Error: not in requesting state when answer arrived!!";
|
||||||
System.err.println("X-value was " + BeanInspector.toString(getQuestion()));
|
System.err.println(msg);
|
||||||
|
mp.log(msg);
|
||||||
|
}
|
||||||
|
// System.err.println("answer is " + BeanInspector.toString(y));
|
||||||
|
if (y==null) {
|
||||||
|
System.err.println("Error: Matlab function returned null array - this is bad.");
|
||||||
|
System.err.println("X-value was " + BeanInspector.toString(getQuestion()));
|
||||||
|
}
|
||||||
|
answer = y;
|
||||||
|
requesting = false; // answer is finished, break request loop
|
||||||
|
mp.log("-- setAnswer: " + BeanInspector.toString(y) + ", req state is " + requesting + "\n");
|
||||||
}
|
}
|
||||||
answer = y;
|
|
||||||
requesting = false; // answer is finished, break request loop
|
|
||||||
mp.log("-- setAnswer: " + BeanInspector.toString(y) + ", req state is " + requesting + "\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setFinished(boolean val) {
|
void setFinished(boolean val) {
|
||||||
fin = val;
|
synchronized (fin) {
|
||||||
|
if (fin && val) {
|
||||||
|
String msg="Error: already finished when setFinished(true) was called!";
|
||||||
|
System.err.println(msg);
|
||||||
|
if (mp!=null) mp.log(msg+"\n");
|
||||||
|
}
|
||||||
|
fin = val;
|
||||||
|
logMPSys("MEM setFinished ok");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -108,6 +108,7 @@ public class MatlabProblem extends AbstractOptimizationProblem implements Interf
|
|||||||
|
|
||||||
public void setMediator(MatlabEvalMediator h) {
|
public void setMediator(MatlabEvalMediator h) {
|
||||||
handler = h;
|
handler = h;
|
||||||
|
handler.setMatlabProblem(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initProblem() {
|
public void initProblem() {
|
||||||
@ -222,13 +223,17 @@ public class MatlabProblem extends AbstractOptimizationProblem implements Interf
|
|||||||
if (allowSingleRunnable && (runnable != null) && (!runnable.isFinished())) {
|
if (allowSingleRunnable && (runnable != null) && (!runnable.isFinished())) {
|
||||||
System.err.println("Please wait for the current optimization to finish");
|
System.err.println("Please wait for the current optimization to finish");
|
||||||
} else {
|
} else {
|
||||||
|
// log("in MP optimize A\n");
|
||||||
|
handler.setMatlabProblem(this);
|
||||||
handler.setFinished(false);
|
handler.setFinished(false);
|
||||||
runnable = OptimizerFactory.getOptRunnable(optType, (AbstractOptimizationProblem)this, outputFilePrefix);
|
runnable = OptimizerFactory.getOptRunnable(optType, (AbstractOptimizationProblem)this, outputFilePrefix);
|
||||||
// runnable.getGOParams().setPostProcessParams(new PostProcessParams(0, 0.01, 5));
|
// runnable.getGOParams().setPostProcessParams(new PostProcessParams(0, 0.01, 5));
|
||||||
|
// log("in MP optimize B\n");
|
||||||
runnable.setTextListener(this);
|
runnable.setTextListener(this);
|
||||||
runnable.setVerbosityLevel(verbosityLevel);
|
runnable.setVerbosityLevel(verbosityLevel);
|
||||||
runnable.setOutputAdditionalInfo(true);
|
runnable.setOutputAdditionalInfo(true);
|
||||||
|
|
||||||
|
// log("in MP optimize C\n");
|
||||||
if ((specParams != null) && (specParams.length > 0)) {
|
if ((specParams != null) && (specParams.length > 0)) {
|
||||||
if ((specValues == null) || (specValues.length != specParams.length)) {
|
if ((specValues == null) || (specValues.length != specParams.length)) {
|
||||||
System.err.println("mismatching value list for parameter arguments: " + specValues);
|
System.err.println("mismatching value list for parameter arguments: " + specValues);
|
||||||
@ -258,7 +263,9 @@ public class MatlabProblem extends AbstractOptimizationProblem implements Interf
|
|||||||
log(BeanInspector.toString(BeanInspector.getMemberDescriptions(opt, true)));
|
log(BeanInspector.toString(BeanInspector.getMemberDescriptions(opt, true)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// log("in MP optimize D\n");
|
||||||
new Thread(new WaitForEvARunnable(runnable, this)).start();
|
new Thread(new WaitForEvARunnable(runnable, this)).start();
|
||||||
|
// log("in MP optimize E\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ class WaitForEvARunnable implements Runnable {
|
|||||||
public WaitForEvARunnable(OptimizerRunnable runnable, MatlabProblem mp) {
|
public WaitForEvARunnable(OptimizerRunnable runnable, MatlabProblem mp) {
|
||||||
this.runnable = runnable;
|
this.runnable = runnable;
|
||||||
this.mp = mp;
|
this.mp = mp;
|
||||||
|
mp.log("Created WaitForEvARunnable " + this + "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
@ -40,6 +41,9 @@ class WaitForEvARunnable implements Runnable {
|
|||||||
// write results back to matlab
|
// write results back to matlab
|
||||||
mp.exportResultToMatlab(runnable);
|
mp.exportResultToMatlab(runnable);
|
||||||
mp.exportResultPopulationToMatlab(runnable.getSolutionSet());
|
mp.exportResultPopulationToMatlab(runnable.getSolutionSet());
|
||||||
|
mp.log("reported results.\n");
|
||||||
|
mp.notifyFinished();
|
||||||
|
mp.log("notified finish.\n");
|
||||||
System.out.println("Optimization finished: " + mp.getInfoString());
|
System.out.println("Optimization finished: " + mp.getInfoString());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
StringWriter sw = new StringWriter();
|
StringWriter sw = new StringWriter();
|
||||||
@ -51,9 +55,11 @@ class WaitForEvARunnable implements Runnable {
|
|||||||
mp.log("invalid call, no optimization started.\n");
|
mp.log("invalid call, no optimization started.\n");
|
||||||
mp.exportResultToMatlab(null);
|
mp.exportResultToMatlab(null);
|
||||||
mp.exportResultPopulationToMatlab(null);
|
mp.exportResultPopulationToMatlab(null);
|
||||||
|
mp.log("notifying finish...\n");
|
||||||
|
mp.notifyFinished();
|
||||||
|
mp.log("notified finish.\n");
|
||||||
}
|
}
|
||||||
mp.notifyFinished();
|
|
||||||
mp.log("notified finish...");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user