package com.plectix.simulator.simulator.api.steps; import java.io.File; import java.util.LinkedList; import java.util.List; import com.plectix.simulator.controller.SimulatorInputData; import com.plectix.simulator.io.SimulationDataReader; import com.plectix.simulator.simulator.SimulationArguments; import com.plectix.simulator.simulator.SimulationClock; import com.plectix.simulator.simulator.SimulationData; import com.plectix.simulator.simulator.Simulator; import com.plectix.simulator.simulator.SimulatorMessage; import com.plectix.simulator.simulator.SimulatorStatus; import com.plectix.simulator.simulator.SimulationArguments.SimulationType; import com.plectix.simulator.simulator.api.OperationType; import com.plectix.simulator.staticanalysis.rulecompression.RuleCompressionType; import com.plectix.simulator.util.MemoryUtil; import com.plectix.simulator.util.PlxTimer; import com.plectix.simulator.util.Info.InfoType; import com.plectix.simulator.util.MemoryUtil.PeakMemoryUsage; public class CommandLineDefinedWorkflow extends AbstractOperation<File> { private final Simulator simulator; private final SimulatorInputData simulatorInputData; private boolean xmlOutputIsTurnedOn = true; public CommandLineDefinedWorkflow(Simulator simulator, SimulatorInputData simulatorInputData) { super(simulator.getSimulationData(), OperationType.STANDARD_WORKFLOW); this.simulator = simulator; this.simulatorInputData = simulatorInputData; } public final void turnOffXMLOutput() { xmlOutputIsTurnedOn = false; } /** * Very important method which defines the set of operations * simulator is supposed to perform when current SimulationArguments set */ private LinkedList<AbstractOperation<?>> prepareOperations(SimulationArguments arguments) { SimulationData simulationData = simulator.getSimulationData(); LinkedList<AbstractOperation<?>> operations = new LinkedList<AbstractOperation<?>>(); if (arguments.needToDumpHelp()) { operations.add(new DumpHelpOperation(simulationData)); } if (arguments.needToDumpVersion()) { operations.add(new DumpVersionOperation(simulationData)); } if (arguments.needToCreateLocalViews()) { operations.add(new LocalViewsComputationOperation(simulationData)); } if (arguments.needToCreateSubViews()) { operations.add(new SubviewsComputationOperation(simulationData.getKappaSystem())); } if (arguments.needToOutputDebugInformation()) { // TODO do nothing? } if (arguments.needToStorify()) { operations.add(new StoriesComputationOperation(simulator)); } if (arguments.needToSimulate()) { operations.add(new SimulationOperation(simulator)); } if (arguments.needToCompile()) { operations.add(new OutputCompiledFileOperation(simulationData)); } if (arguments.needToBuildContactMap()) { operations.add(new ContactMapComputationOperation(simulationData)); } if (arguments.needToBuildInfluenceMap()) { operations.add(new InfluenceMapComputationOperation(simulationData)); } else { if (arguments.needToBuildActivationMap()) { operations.add(new ActivationMapComputationOperation(simulationData)); } if (arguments.needToBuildInhibitionMap()) { operations.add(new InhibitionMapComputationOperation(simulationData)); } } if (arguments.needToRunQualitativeCompression()) { operations.add(new RuleCompressionOperation(simulationData.getKappaSystem(), RuleCompressionType.QUALITATIVE)); } if (arguments.needToRunQuantitativeCompression()) { operations.add(new RuleCompressionOperation(simulationData.getKappaSystem(), RuleCompressionType.QUANTITATIVE)); } if (arguments.needToEnumerationOfSpecies()) { operations.add(new SpeciesEnumerationOperation(simulationData.getKappaSystem())); } if (arguments.needToFindDeadRules()) { operations.add(new DeadRuleDetectionOperation(simulationData.getKappaSystem())); } // Output XML data: String destination = simulationData.getSimulationArguments().getXmlOutputDestination(); if (xmlOutputIsTurnedOn) { operations.add(new XMLOutputOperation(simulationData, destination)); } return operations; } @Override protected File performDry() throws Exception { SimulationData simulationData = simulator.getSimulationData(); // ConsoleOutputManager consoleOutputManager = simulationData.getConsoleOutputManager(); SimulatorStatus simulatorStatus = simulator.getLatestFreezedStatus(); OperationManager manager = simulationData.getKappaSystem().getOperationManager(); // feeding simulator with simulation arguments manager.perform(new SimulatorInitializationOperation(simulator, simulatorInputData)); // reading and compiling kappa file // this.readAndCompileKappaInput(); // simulatorStatus.setStatusMessage(SimulatorMessage.STATUS_INITIALIZING); // manager.performSequentially(new SolutionInitializationOperation(simulationData)); // compiled kappa system object output // if (simulationData.getSimulationArguments().needToCompile()) { // consoleOutputManager.outputData(); // return null; // } for (AbstractOperation<?> operation : this.prepareOperations(simulationData.getSimulationArguments())) { simulationData.getKappaSystem().getOperationManager().perform(operation); } // // if (!this.hasNoNeedToRunAnything(simulationData.getSimulationArguments())) { // if (simulationData.getSimulationArguments().needToStorify()) { // simulator.runStories(); // } else { // simulator.runSimulation(); // } // } // Let's see if we monitor peak memory usage this.checkAndOutputMemory(); String destination = simulationData.getSimulationArguments().getXmlOutputDestination(); File xmlFile = new File(destination); simulatorStatus.setStatusMessage(SimulatorMessage.STATUS_IDLE); return xmlFile; } public List<AbstractOperation<?>> checkoutOperationsSet() throws Exception { SimulationData simulationData = simulator.getSimulationData(); OperationManager manager = simulationData.getKappaSystem().getOperationManager(); manager.perform(new SimulatorInitializationOperation(simulator, simulatorInputData)); return this.prepareOperations(simulationData.getSimulationArguments()); } //TODO another operation for this? private final void readAndCompileKappaInput() throws Exception { SimulationData simulationData = simulator.getSimulationData(); SimulatorStatus status = simulator.getLatestFreezedStatus(); PlxTimer readingKappaTimer = new PlxTimer(); readingKappaTimer.startTimer(); status.setStatusMessage(SimulatorMessage.STATUS_READING_KAPPA); simulationData.getConsoleOutputManager().addAdditionalInfo(InfoType.INFO, "--Computing initial state"); new SimulationDataReader(simulationData).readAndCompile(); SimulationClock.stopTimer(simulationData, InfoType.OUTPUT, readingKappaTimer, "-Reading Kappa input:"); } private final void checkAndOutputMemory() { SimulationData simulationData = simulator.getSimulationData(); PeakMemoryUsage peakMemoryUsage = MemoryUtil.getPeakMemoryUsage(); if (peakMemoryUsage != null) { simulationData.getConsoleOutputManager().addAdditionalInfo(InfoType.INFO, "-Peak Memory Usage (in bytes): " + peakMemoryUsage + " [period= " + simulationData.getSimulationArguments() .getMonitorPeakMemory() + " milliseconds]"); } } private final boolean hasNoNeedToRunAnything( SimulationArguments simulationArguments) { return simulationArguments.isGenereteMap() || (simulationArguments.getSimulationType() == SimulationType.CONTACT_MAP) || simulationArguments.needToOutputDebugInformation(); } @Override protected boolean noNeedToPerform() { // TODO Auto-generated method stub return false; } @Override protected File retrievePreparedResult() throws Exception { // TODO Auto-generated method stub return null; } }