package com.plectix.simulator.simulator.api.steps;
import java.util.LinkedList;
import com.plectix.simulator.simulator.SimulationArguments;
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.api.OperationType;
import com.plectix.simulator.staticanalysis.rulecompression.RuleCompressionType;
public class ExperimentWorkflow extends AbstractOperation<Object> {
private final Simulator simulator;
public ExperimentWorkflow(Simulator simulator) {
super(simulator.getSimulationData(), OperationType.STANDARD_WORKFLOW);
this.simulator = simulator;
}
/**
* 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()));
}
return operations;
}
@Override
protected Object performDry() throws Exception {
SimulationData simulationData = simulator.getSimulationData();
SimulatorStatus simulatorStatus = simulator.getLatestFreezedStatus();
// performing all set operations
for (AbstractOperation<?> operation : this.prepareOperations(simulationData.getSimulationArguments())) {
simulationData.getKappaSystem().getOperationManager().perform(operation);
}
simulatorStatus.setStatusMessage(SimulatorMessage.STATUS_IDLE);
return null;
// return new ExperimentOutput(simulationData);
}
@Override
protected boolean noNeedToPerform() {
return false;
}
@Override
protected Object retrievePreparedResult() throws Exception {
return null;
}
}