diff --git a/msi.gama.headless/src/msi/gama/headless/command/StartSimulation.java b/msi.gama.headless/src/msi/gama/headless/command/StartSimulation.java index 94b9fee8da..462a93fcc3 100644 --- a/msi.gama.headless/src/msi/gama/headless/command/StartSimulation.java +++ b/msi.gama.headless/src/msi/gama/headless/command/StartSimulation.java @@ -13,6 +13,7 @@ import msi.gama.precompiler.GamlAnnotations.symbol; import msi.gama.precompiler.IConcept; import msi.gama.precompiler.ISymbolKind; +import msi.gama.runtime.GAMA; import msi.gama.runtime.IScope; import msi.gama.runtime.exceptions.GamaRuntimeException; import msi.gaml.descriptions.IDescription; @@ -53,8 +54,7 @@ public StartSimulation(final IDescription desc) { } private String retrieveModelFileAbsolutePath(final IScope scope, final String filename) { - if (filename.charAt(0) == '/') - return filename; + if (filename.charAt(0) == '/') return filename; return new File(scope.getModel().getFilePath()).getParentFile().getAbsolutePath() + "/" + filename; } @@ -70,14 +70,13 @@ protected Object privateExecuteIn(final IScope scope) throws GamaRuntimeExceptio modelPath = scope.getModel().getFilePath(); } - if (this.hasFacet(IKeywords.WITHSEED)) - seed = Cast.asInt(scope, getFacetValue(scope, IKeywords.WITHSEED)); + if (this.hasFacet(IKeywords.WITHSEED)) { seed = Cast.asInt(scope, getFacetValue(scope, IKeywords.WITHSEED)); } final long lseed = seed; IModel mdl = null; try { - mdl = HeadlessSimulationLoader.loadModel(new File(modelPath)); + mdl = HeadlessSimulationLoader.loadModel(new File(modelPath), null, null, GAMA.isInHeadLessMode()); } catch (final IOException e) { throw GamaRuntimeException.error("Sub model file not found!", scope); } catch (final GamaHeadlessException e) { diff --git a/msi.gama.headless/src/msi/gama/headless/core/HeadlessSimulationLoader.java b/msi.gama.headless/src/msi/gama/headless/core/HeadlessSimulationLoader.java index e3a934ceb7..5885d17696 100644 --- a/msi.gama.headless/src/msi/gama/headless/core/HeadlessSimulationLoader.java +++ b/msi.gama.headless/src/msi/gama/headless/core/HeadlessSimulationLoader.java @@ -103,7 +103,7 @@ public static synchronized IModel loadModel(final File myFile) throws IOExceptio */ public static synchronized IModel loadModel(final File myFile, final List errors) throws IOException, GamaHeadlessException { - return loadModel(myFile, errors, null); + return loadModel(myFile, errors, null, true); } /** @@ -123,8 +123,10 @@ public static synchronized IModel loadModel(final File myFile, final List errors, - final GamlProperties metaProperties) throws IOException, GamaHeadlessException { - preloadGAMA(); // make sure the injector is created + final GamlProperties metaProperties, final boolean initHeadless) throws IOException, GamaHeadlessException { + if (initHeadless) { + preloadGAMA(); // make sure the injector is created. + } if (myFile == null) throw new IOException("Model file is null"); final String fileName = myFile.getAbsolutePath(); if (!myFile.exists()) throw new IOException("Model file does not exist: " + fileName); diff --git a/msi.gama.headless/src/msi/gama/headless/openmole/MoleSimulationLoader.java b/msi.gama.headless/src/msi/gama/headless/openmole/MoleSimulationLoader.java index e29d5d9e79..151455f825 100644 --- a/msi.gama.headless/src/msi/gama/headless/openmole/MoleSimulationLoader.java +++ b/msi.gama.headless/src/msi/gama/headless/openmole/MoleSimulationLoader.java @@ -44,7 +44,7 @@ public static IModel loadModel(final File modelPath, final List errors, final GamlProperties metadata) throws IOException, GamaHeadlessException { - return HeadlessSimulationLoader.loadModel(modelPath, errors, metadata); + return HeadlessSimulationLoader.loadModel(modelPath, errors, metadata, true); } public static IMoleExperiment newExperiment(final IModel model) { diff --git a/msi.gama.headless/src/msi/gama/headless/runtime/Application.java b/msi.gama.headless/src/msi/gama/headless/runtime/Application.java index 0de7a11058..b7d669bfb9 100644 --- a/msi.gama.headless/src/msi/gama/headless/runtime/Application.java +++ b/msi.gama.headless/src/msi/gama/headless/runtime/Application.java @@ -126,12 +126,8 @@ private boolean checkParameters(final List args) { size = size - 1; mustContainOutFile = false; } - if (args.contains(THREAD_PARAMETER)) { - size = size - 2; - } - if (args.contains(VERBOSE_PARAMETER)) { - size = size - 1; - } + if (args.contains(THREAD_PARAMETER)) { size = size - 2; } + if (args.contains(VERBOSE_PARAMETER)) { size = size - 1; } if (mustContainInFile && mustContainOutFile && size < 2) { showError(HeadLessErrors.INPUT_NOT_DEFINED, null); return false; @@ -146,13 +142,9 @@ private boolean checkParameters(final List args) { Globals.OUTPUT_PATH = args.get(outIndex); Globals.IMAGES_PATH = Globals.OUTPUT_PATH + "/snapshot"; final File output = new File(Globals.OUTPUT_PATH); - if (!output.exists()) { - output.mkdir(); - } + if (!output.exists()) { output.mkdir(); } final File images = new File(Globals.IMAGES_PATH); - if (!images.exists()) { - images.mkdir(); - } + if (!images.exists()) { images.mkdir(); } } if (mustContainInFile) { @@ -177,6 +169,7 @@ private static boolean showError(final int errorCode, final String path) { @Override public Object start(final IApplicationContext context) throws Exception { + HeadlessSimulationLoader.preloadGAMA(); DEBUG.OFF(); final Map mm = context.getArguments(); @@ -188,13 +181,13 @@ public Object start(final IApplicationContext context) throws Exception { DEBUG.LOG(showHelp()); DEBUG.OFF(); - } else if (args.contains(RUN_LIBRARY_PARAMETER)) { + } else if (args.contains(RUN_LIBRARY_PARAMETER)) return ModelLibraryRunner.getInstance().start(args); - } else if (args.contains(VALIDATE_LIBRARY_PARAMETER)) { + else if (args.contains(VALIDATE_LIBRARY_PARAMETER)) return ModelLibraryValidator.getInstance().start(args); - } else if (args.contains(TEST_LIBRARY_PARAMETER)) { + else if (args.contains(TEST_LIBRARY_PARAMETER)) return ModelLibraryTester.getInstance().start(args); - } else if (args.contains(CHECK_MODEL_PARAMETER)) { + else if (args.contains(CHECK_MODEL_PARAMETER)) { ModelLibraryGenerator.start(this, args); } else if (args.contains(BUILD_XML_PARAMETER)) { buildXML(args); @@ -205,9 +198,9 @@ public Object start(final IApplicationContext context) throws Exception { } public String after(final List args, final String arg) { - if (args == null || args.size() < 2) { return null; } + if (args == null || args.size() < 2) return null; for (int i = 0; i < args.size() - 1; i++) { - if (args.get(i).equals(arg)) { return args.get(i + 1); } + if (args.get(i).equals(arg)) return args.get(i + 1); } return null; } @@ -226,7 +219,7 @@ public void buildXML(final List arg) DEBUG.ERR(showHelp()); return; } - HeadlessSimulationLoader.preloadGAMA(); + final List jb = ExperimentationPlanFactory.buildExperiment(arg.get(arg.size() - 2)); final ArrayList selectedJob = new ArrayList<>(); for (final IExperimentJob j : jb) { @@ -250,7 +243,6 @@ public void buildXML(final List arg) public void buildXMLForModelLibrary(final ArrayList modelPaths, final String outputPath) throws ParserConfigurationException, TransformerException, IOException, GamaHeadlessException { // "arg[]" are the paths to the different models - HeadlessSimulationLoader.preloadGAMA(); final ArrayList selectedJob = new ArrayList<>(); for (final File modelFile : modelPaths) { final List jb = ExperimentationPlanFactory.buildExperiment(modelFile.getAbsolutePath()); @@ -289,16 +281,13 @@ public void runXMLForModelLibrary(final String xmlPath) throws FileNotFoundExcep } public void runSimulation(final List args) throws FileNotFoundException, InterruptedException { - if (!checkParameters(args)) { - System.exit(-1); - } + if (!checkParameters(args)) { System.exit(-1); } verbose = args.contains(VERBOSE_PARAMETER); if (verbose) { DEBUG.ON(); } - HeadlessSimulationLoader.preloadGAMA(); this.tunnelingMode = args.contains(TUNNELING_PARAMETER); this.consoleMode = args.contains(CONSOLE_PARAMETER); if (args.contains(SOCKET_PARAMETER)) { @@ -315,9 +304,7 @@ public void runSimulation(final List args) throws FileNotFoundException, processorQueue = new LocalSimulationRuntime(this.numberOfThread); Reader in = null; - if (this.verbose && !this.tunnelingMode) { - DEBUG.ON(); - } + if (this.verbose && !this.tunnelingMode) { DEBUG.ON(); } if (this.consoleMode) { in = new Reader(ConsoleReader.readOnConsole()); diff --git a/msi.gama.headless/src/msi/gama/headless/runtime/LocalSimulationRuntime.java b/msi.gama.headless/src/msi/gama/headless/runtime/LocalSimulationRuntime.java index 389313a4ca..5d56187a95 100644 --- a/msi.gama.headless/src/msi/gama/headless/runtime/LocalSimulationRuntime.java +++ b/msi.gama.headless/src/msi/gama/headless/runtime/LocalSimulationRuntime.java @@ -12,7 +12,6 @@ import java.util.List; import java.util.Map; import java.util.Observable; -import java.util.Observer; import msi.gama.headless.core.GamaHeadlessException; import msi.gama.headless.core.HeadlessSimulationLoader; @@ -29,11 +28,11 @@ public class LocalSimulationRuntime extends Observable implements SimulationRunt static { DEBUG.ON(); } - private final Map simulations; - private final ArrayList queue; - private final ArrayList started; - private final HashMap> loadedModels; - private final HashMap> availableLoadedModels; + private final Map simulations; + private final ArrayList queue; + private final ArrayList started; + // private final HashMap> loadedModels; + // private final HashMap> availableLoadedModels; private final int allocatedProcessor; private boolean isTraceKept; @@ -45,8 +44,8 @@ public LocalSimulationRuntime(final int numberOfCoresAsked) { simulations = new HashMap<>(); queue = new ArrayList<>(); started = new ArrayList<>(); - loadedModels = new HashMap<>(); - availableLoadedModels = new HashMap<>(); + // loadedModels = new HashMap<>(); + // availableLoadedModels = new HashMap<>(); this.allocatedProcessor = getAvailableCores(numberOfCoresAsked); } @@ -57,24 +56,24 @@ private static int getAvailableCores(final int asked) { return cpus; } - public void listenMe(final Observer v) { - this.addObserver(v); - } + // public void listenMe(final Observer v) { + // this.addObserver(v); + // } - @Override - public boolean isTraceKept() { - return this.isTraceKept; - } + // @Override + // public boolean isTraceKept() { + // return this.isTraceKept; + // } - @Override - public void keepTrace(final boolean t) { - this.isTraceKept = t; - } + // @Override + // public void keepTrace(final boolean t) { + // this.isTraceKept = t; + // } @Override public void pushSimulation(final ExperimentJob s) { - simulations.put(s.getExperimentID(), s); - final FakeApplication f = new FakeApplication(s, this); + final ExperimentJobThread f = new ExperimentJobThread(s); + simulations.put(s.getExperimentID(), f); if (started.size() < allocatedProcessor) { this.startSimulation(f); } else { @@ -82,22 +81,20 @@ public void pushSimulation(final ExperimentJob s) { } } - private void startSimulation(final FakeApplication s) { + private void startSimulation(final ExperimentJobThread s) { started.add(s); s.start(); this.notifyListener(); } - public void closeSimulation(final FakeApplication s) { + public void closeSimulation(final ExperimentJobThread s) { started.remove(s); if (queue.size() > 0) { - final FakeApplication p = queue.get(0); + final ExperimentJobThread p = queue.get(0); queue.remove(p); this.startSimulation(p); } - if (!this.isTraceKept) { - simulations.remove(s.getExperimentJob().getExperimentID()); - } + if (!this.isTraceKept) { simulations.remove(s.getExperimentJob().getExperimentID()); } this.notifyListener(); } @@ -105,45 +102,39 @@ private void notifyListener() { this.setChanged(); this.notifyObservers(); } - - @Override - public SimulationState getSimulationState(final String id) { - final ExperimentJob tmp = simulations.get(id); - if (tmp == null) { return SimulationState.UNDEFINED; } - /** - * TODO AD BUG: ATTENTION !! queue contient des FakeApplication, pas des ExperimentJob - */ - if (started.contains(tmp)) { return SimulationState.STARTED; } - /** - * TODO AD BUG: ATTENTION !! queue contient des FakeApplication, pas des ExperimentJob - */ - if (queue.contains(tmp)) { return SimulationState.ENQUEUED; } - return SimulationState.ACHIEVED; - } + // + // @Override + // public SimulationState getSimulationState(final String id) { + // final FakeApplication tmp = simulations.get(id); + // if (tmp == null) return SimulationState.UNDEFINED; + // if (started.contains(tmp)) return SimulationState.STARTED; + // if (queue.contains(tmp)) return SimulationState.ENQUEUED; + // return SimulationState.ACHIEVED; + // } @Override public boolean isPerformingSimulation() { return started.size() > 0 || queue.size() > 0; } - public synchronized IModel lockModel(final File fl) throws IOException, GamaHeadlessException { - IModel mdl; - final String key = fl.getAbsolutePath(); - ArrayList arr = availableLoadedModels.get(fl.getAbsolutePath()); - if (arr == null) { - arr = new ArrayList<>(); - availableLoadedModels.put(key, arr); - loadedModels.put(key, new ArrayList()); - } - if (arr.size() == 0) { - mdl = HeadlessSimulationLoader.loadModel(fl); - loadedModels.get(key).add(mdl); - } else { - mdl = arr.get(0); - arr.remove(0); - } - return mdl; - } + // public synchronized IModel lockModel(final File fl) throws IOException, GamaHeadlessException { + // IModel mdl; + // final String key = fl.getAbsolutePath(); + // ArrayList arr = availableLoadedModels.get(fl.getAbsolutePath()); + // if (arr == null) { + // arr = new ArrayList<>(); + // availableLoadedModels.put(key, arr); + // loadedModels.put(key, new ArrayList()); + // } + // if (arr.size() == 0) { + // mdl = HeadlessSimulationLoader.loadModel(fl); + // loadedModels.get(key).add(mdl); + // } else { + // mdl = arr.get(0); + // arr.remove(0); + // } + // return mdl; + // } @Override public synchronized IModel loadModel(final File fl) throws IOException, GamaHeadlessException { @@ -159,7 +150,7 @@ public IExperimentPlan buildExperimentPlan(final String expName, final IModel md return expp; } - class FakeApplication extends Thread {// implements Runnable { + class ExperimentJobThread extends Thread {// implements Runnable { class DebugStream extends FileOutputStream { @@ -177,26 +168,24 @@ public void close() throws IOException { } private ExperimentJob si = null; - private LocalSimulationRuntime runtime = null; ExperimentJob getExperimentJob() { return si; } - public FakeApplication(final ExperimentJob sim, final LocalSimulationRuntime rn) { + public ExperimentJobThread(final ExperimentJob sim) { si = sim; - this.runtime = rn; } @Override public void run() { try (final DebugStream file = new DebugStream()) { - si.loadAndBuild(this.runtime); + si.loadAndBuild(LocalSimulationRuntime.this); si.playAndDispose(); } catch (final Exception e) { DEBUG.ERR(e); } finally { - runtime.closeSimulation(this); + closeSimulation(this); } } @@ -205,7 +194,8 @@ public void run() { @Override public HashMap getSimulationState() { final HashMap res = new HashMap<>(); - for (final ExperimentJob exp : simulations.values()) { + for (final ExperimentJobThread app : simulations.values()) { + ExperimentJob exp = app.getExperimentJob(); res.put(exp.getExperimentID(), new Double(exp.getStep() / exp.getFinalStep())); } return res; diff --git a/msi.gama.headless/src/msi/gama/headless/runtime/RuntimeContext.java b/msi.gama.headless/src/msi/gama/headless/runtime/RuntimeContext.java index 4a72bb0876..3f00a0e7fd 100644 --- a/msi.gama.headless/src/msi/gama/headless/runtime/RuntimeContext.java +++ b/msi.gama.headless/src/msi/gama/headless/runtime/RuntimeContext.java @@ -8,8 +8,9 @@ import msi.gama.kernel.model.IModel; public interface RuntimeContext { - public IExperimentPlan buildExperimentPlan(String expName, IModel mdl); - public IModel loadModel(File fl) throws IOException, GamaHeadlessException; + IExperimentPlan buildExperimentPlan(String expName, IModel mdl); + + IModel loadModel(File fl) throws IOException, GamaHeadlessException; } diff --git a/msi.gama.headless/src/msi/gama/headless/runtime/SimulationRuntime.java b/msi.gama.headless/src/msi/gama/headless/runtime/SimulationRuntime.java index f549ec0de3..3b60d7d339 100644 --- a/msi.gama.headless/src/msi/gama/headless/runtime/SimulationRuntime.java +++ b/msi.gama.headless/src/msi/gama/headless/runtime/SimulationRuntime.java @@ -5,19 +5,19 @@ import msi.gama.headless.job.ExperimentJob; public interface SimulationRuntime { - public int UNDEFINED_QUEUE_SIZE = Integer.MAX_VALUE; + int UNDEFINED_QUEUE_SIZE = Integer.MAX_VALUE; - public void pushSimulation(ExperimentJob s); + void pushSimulation(ExperimentJob s); - public boolean isTraceKept(); + // boolean isTraceKept(); - public void keepTrace(boolean t); + // void keepTrace(boolean t); // public void closeSimulation(ExperimentJob s); - public SimulationState getSimulationState(String id); + // public SimulationState getSimulationState(String id); - public HashMap getSimulationState(); + HashMap getSimulationState(); - public boolean isPerformingSimulation(); + boolean isPerformingSimulation(); }