package javaeva.server.modules; import javaeva.gui.BeanInspector; import javaeva.server.go.InterfaceGOParameters; import javaeva.server.go.InterfacePopulationChangedEventListener; import javaeva.server.go.InterfaceProcessor; import javaeva.server.go.PopulationInterface; import javaeva.server.go.operators.postprocess.PostProcess; import javaeva.server.go.operators.postprocess.PostProcessParams; import javaeva.server.go.operators.terminators.EvaluationTerminator; import javaeva.server.go.populations.Population; import javaeva.server.go.problems.AbstractOptimizationProblem; import javaeva.server.go.tools.RandomNumberGenerator; import javaeva.server.stat.InterfaceStatistics; import javaeva.server.stat.InterfaceTextListener; import wsi.ra.jproxy.RemoteStateListener; /** * The Processor may run as a thread permanently (GenericModuleAdapter) and is then stopped and started * by a switch in startOpt/stopOpt. * * @author mkron * */ public class Processor extends Thread implements InterfaceProcessor, InterfacePopulationChangedEventListener { private static final boolean TRACE=false; private volatile boolean m_optRunning; // private volatile boolean m_doRunScript; private InterfaceStatistics m_Statistics; private InterfaceGOParameters goParams; private boolean m_createInitialPopulations=true; private boolean saveParams = true; private RemoteStateListener m_ListenerModule; private boolean wasRestarted = false; // private int postProcessSteps = 0; private int runCounter = 0; private Population resPop = null; // transient private String m_OutputPath = ""; // transient private BufferedWriter m_OutputFile = null; public void addListener(RemoteStateListener module) { if (TRACE) System.out.println("Processor: setting module as listener: " + ((module==null) ? "null" : module.toString())); m_ListenerModule = module; } /** */ public Processor(InterfaceStatistics Stat, ModuleAdapter Adapter, InterfaceGOParameters params) { goParams = params; m_Statistics = Stat; m_ListenerModule = Adapter; } /** * */ public Processor(InterfaceStatistics Stat) { m_Statistics = Stat; } protected boolean isOptRunning() { return m_optRunning; } protected void setOptRunning(boolean bRun) { m_optRunning = bRun; } /** * If set to true, before every run the parameters will be stored to a file. * * @param doSave */ public void setSaveParams(boolean doSave) { saveParams = doSave; } /** * */ public void startOpt() { m_createInitialPopulations = true; if (TRACE) System.out.println("startOpt called:"); if (isOptRunning()) { System.err.println("ERROR: Processor is already running !!"); return; } resPop = null; wasRestarted = false; setOptRunning(true); } /** * */ public void restartOpt() { m_createInitialPopulations = false; if (TRACE) System.out.println("restartOpt called:"); if (isOptRunning()) { System.err.println("ERROR: Processor is already running !!"); return; } wasRestarted = true; setOptRunning(true); } /** * */ public void stopOpt() { // this means user break if (TRACE) System.out.println("called StopOpt"); setOptRunning(false); if (TRACE) System.out.println("m_doRunScript = false "); } /** * */ public void run() { setPriority(1); while (true) { try { Thread.sleep(200); } catch (Exception e) { System.err.println ("There was an error in sleep Processor.run()" + e); } runOptOnce(); } } public Population runOptOnce() { try { while (isOptRunning()) { setPriority(3); if (saveParams) goParams.saveInstance(); resPop = optimize("Run"); setPriority(1); } } catch (Exception e) { System.err.println("Caught exception in Processor: "+e.getMessage()); e.printStackTrace(); //m_Statistics.stopOptPerformed(false); setOptRunning(false); // normal finish if (m_ListenerModule!=null) m_ListenerModule.performedStop(); // is only needed in client server mode if (m_ListenerModule!=null) m_ListenerModule.updateProgress(0, "Error in optimization: " + e.getMessage()); } return resPop; } /** * Main optimization loop. * Return a population containing the solutions of the last run if there were multiple. */ protected Population optimize(String infoString) { Population resultPop = null; if (!isOptRunning()) { System.err.println("warning, this shouldnt happen in processor! Was startOpt called?"); setOptRunning(true); } RandomNumberGenerator.setRandomSeed(goParams.getSeed()); if (m_ListenerModule!=null) { if (wasRestarted) m_ListenerModule.performedRestart(getInfoString()); else m_ListenerModule.performedStart(getInfoString()); } // if (this.show) this.m_StatusField.setText("Optimizing..."); // opening output file... // String name = this.m_ModulParameter.getOutputFileName(); // if (!name.equalsIgnoreCase("none") && !name.equals("")) { // SimpleDateFormat formatter = new SimpleDateFormat("E'_'yyyy.MM.dd'_'HH.mm.ss"); // String m_StartDate = formatter.format(new Date()); // name = this.m_OutputPath + name +"_"+this.m_ModulParameter.getOptimizer().getName()+"_"+m_StartDate+".dat"; // try { // this.m_OutputFile = new BufferedWriter(new OutputStreamWriter (new FileOutputStream (name))); // } catch (FileNotFoundException e) { // System.err.println("Could not open output file! Filename: " + name); // } // //this.writeToFile(" FitnessCalls\t Best\t Mean\t Worst \t" + this.m_ModulParameter.getProblem().getAdditionalFileStringHeader(this.m_ModulParameter.getOptimizer().getPopulation())); // } else { // this.m_OutputFile = null; // } goParams.getOptimizer().addPopulationChangedEventListener(this); runCounter = 0; while (isOptRunning() && (runCounter