From 22f50cb45d41a2c4423808002c06d3a773ccd57f Mon Sep 17 00:00:00 2001 From: Marcel Kronfeld Date: Tue, 10 Mar 2009 08:58:16 +0000 Subject: [PATCH] Updating the JEInterface Java code --- .../go/problems/MatlabEvalMediator.java | 131 ++++++++++++++---- .../server/go/problems/MatlabProblem.java | 7 + .../go/problems/WaitForEvARunnable.java | 10 +- 3 files changed, 117 insertions(+), 31 deletions(-) diff --git a/src/eva2/server/go/problems/MatlabEvalMediator.java b/src/eva2/server/go/problems/MatlabEvalMediator.java index 62c87a90..c1b0bc31 100644 --- a/src/eva2/server/go/problems/MatlabEvalMediator.java +++ b/src/eva2/server/go/problems/MatlabEvalMediator.java @@ -22,19 +22,42 @@ import eva2.gui.BeanInspector; * @author mkron * */ -public class MatlabEvalMediator implements Runnable { - volatile boolean requesting = false; +public class MatlabEvalMediator { + volatile Boolean requesting = false; // final static boolean TRACE = false; - volatile boolean fin = false; + volatile private Boolean fin = false; volatile Object question = null; volatile double[] answer = null; - boolean quit = false; + volatile boolean quit = false; volatile Object optSolution = 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 - 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. * @@ -53,40 +76,75 @@ public class MatlabEvalMediator implements Runnable { // if (question == null) System.err.println("Error: requesting evaluation for null array!"); } else System.err.println("Error, requesting evaluation for non array!"); - - requesting = true; -// int k=0; - mp.log("-- Requesting eval for " + BeanInspector.toString(x) + ", req state is " + requesting + "\n"); + synchronized(requesting) { + if (requesting) { + String msg="Warning: already in requesting state when request arrived!"; + 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) { // wait for matlab to answer the question - if (sleepTime > 0) try { Thread.sleep(sleepTime); } catch(Exception e) {}; -// if ((k%100)==0) { + if (sleepTime > 0) try { Thread.sleep(sleepTime); } catch(Exception e) { + System.err.println("Exception in sleep (MatlabEvalMediator)"); + }; + k++; + if ((k%mod)==0) { // System.out.println("waiting for matlab to answer..."); -// } -// k++; + mp.log("waiting for matlab to answer... (" + mod + ") " + getState() + "\n"); + mod*=2; + if (mod <=0) mod=Integer.MAX_VALUE; + + } } mp.log("-- Requesting done\n"); // matlab is finished, answer is here //return null; 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. + * For debugging, an integer ID for this run may be provided. */ - public void run() { -// int k=0; + public void run(int id) { + logMPSys("## MEM start run " + id); + runID=id; + int k=0;int mod=25; while (!requesting && !isFinished() && !quit) { // wait for JE to pose a question or finish all if (sleepTime > 0) try { Thread.sleep(sleepTime); } catch(Exception e) {}; -// if ((k%100)==0) { -// System.out.println("waiting for JE to ask..."); -// } -// k++; + k++; + if ((k%mod)==0) { + logMPSys("MEM waiting for JE to ask... (" + mod +") " + getState()); + 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 } + + /** + * 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. @@ -116,18 +174,33 @@ public class MatlabEvalMediator implements Runnable { * @param y */ public void setAnswer(double[] y) { -// 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())); + synchronized(requesting) { + if (!requesting) { + String msg="Error: not in requesting state when answer arrived!!"; + 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) { - 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"); + } } /** diff --git a/src/eva2/server/go/problems/MatlabProblem.java b/src/eva2/server/go/problems/MatlabProblem.java index 2957e064..c8c46dcb 100644 --- a/src/eva2/server/go/problems/MatlabProblem.java +++ b/src/eva2/server/go/problems/MatlabProblem.java @@ -108,6 +108,7 @@ public class MatlabProblem extends AbstractOptimizationProblem implements Interf public void setMediator(MatlabEvalMediator h) { handler = h; + handler.setMatlabProblem(this); } public void initProblem() { @@ -222,13 +223,17 @@ public class MatlabProblem extends AbstractOptimizationProblem implements Interf if (allowSingleRunnable && (runnable != null) && (!runnable.isFinished())) { System.err.println("Please wait for the current optimization to finish"); } else { +// log("in MP optimize A\n"); + handler.setMatlabProblem(this); handler.setFinished(false); runnable = OptimizerFactory.getOptRunnable(optType, (AbstractOptimizationProblem)this, outputFilePrefix); // runnable.getGOParams().setPostProcessParams(new PostProcessParams(0, 0.01, 5)); +// log("in MP optimize B\n"); runnable.setTextListener(this); runnable.setVerbosityLevel(verbosityLevel); runnable.setOutputAdditionalInfo(true); +// log("in MP optimize C\n"); if ((specParams != null) && (specParams.length > 0)) { if ((specValues == null) || (specValues.length != specParams.length)) { 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("in MP optimize D\n"); new Thread(new WaitForEvARunnable(runnable, this)).start(); +// log("in MP optimize E\n"); } } diff --git a/src/eva2/server/go/problems/WaitForEvARunnable.java b/src/eva2/server/go/problems/WaitForEvARunnable.java index 3acef52e..76ba8f71 100644 --- a/src/eva2/server/go/problems/WaitForEvARunnable.java +++ b/src/eva2/server/go/problems/WaitForEvARunnable.java @@ -14,6 +14,7 @@ class WaitForEvARunnable implements Runnable { public WaitForEvARunnable(OptimizerRunnable runnable, MatlabProblem mp) { this.runnable = runnable; this.mp = mp; + mp.log("Created WaitForEvARunnable " + this + "\n"); } public void run() { @@ -40,6 +41,9 @@ class WaitForEvARunnable implements Runnable { // write results back to matlab mp.exportResultToMatlab(runnable); mp.exportResultPopulationToMatlab(runnable.getSolutionSet()); + mp.log("reported results.\n"); + mp.notifyFinished(); + mp.log("notified finish.\n"); System.out.println("Optimization finished: " + mp.getInfoString()); } catch (Exception e) { StringWriter sw = new StringWriter(); @@ -51,9 +55,11 @@ class WaitForEvARunnable implements Runnable { mp.log("invalid call, no optimization started.\n"); mp.exportResultToMatlab(null); mp.exportResultPopulationToMatlab(null); + mp.log("notifying finish...\n"); + mp.notifyFinished(); + mp.log("notified finish.\n"); } - mp.notifyFinished(); - mp.log("notified finish..."); + } } \ No newline at end of file