package com.plectix.simulator.parser;
import java.io.FileNotFoundException;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import com.plectix.simulator.interfaces.ConnectedComponentInterface;
import com.plectix.simulator.interfaces.ObservableConnectedComponentInterface;
import com.plectix.simulator.interfaces.ObservableInterface;
import com.plectix.simulator.interfaces.SolutionInterface;
import com.plectix.simulator.io.SimulationDataOutputUtil;
import com.plectix.simulator.parser.abstractmodel.KappaModel;
import com.plectix.simulator.parser.builders.KappaSystemBuilder;
import com.plectix.simulator.simulationclasses.perturbations.ComplexPerturbation;
import com.plectix.simulator.simulationclasses.solution.SuperSubstance;
import com.plectix.simulator.simulator.SimulationData;
import com.plectix.simulator.simulator.Simulator;
import com.plectix.simulator.simulator.SimulationArguments.SimulationType;
import com.plectix.simulator.staticanalysis.ObservableRuleComponent;
import com.plectix.simulator.staticanalysis.Rule;
import com.plectix.simulator.staticanalysis.observables.Observables;
import com.plectix.simulator.staticanalysis.stories.Stories;
import com.plectix.simulator.util.Converter;
public class TestSimulationData {
private KappaModel model;
private boolean isStorify;
private SimulationData simulationData;
public TestSimulationData(KappaModel model, boolean isStorify) {
this.model = model;
this.isStorify = isStorify;
}
public void build() throws ParseErrorException, DocumentFormatException,
FileNotFoundException {
initSimulationData(isStorify);
new KappaSystemBuilder(simulationData).build(model);
}
private void initSimulationData(boolean isStorify) {
Simulator mySimulator = new Simulator();
simulationData = mySimulator.getSimulationData();
simulationData.getSimulationArguments().setAllowIncompleteSubstance(true);
if (isStorify) {
simulationData.getSimulationArguments().setStorifyFlag(true);
simulationData.getSimulationArguments().setSimulationType(
SimulationType.STORIFY);
}
}
public String getData() {
StringBuffer sb = new StringBuffer();
// rules
List<Rule> rules = simulationData.getKappaSystem().getRules();
for (Rule rule : rules) {
sb.append("'" + rule.getName() + "' "
+ SimulationDataOutputUtil.getData(rule, true) + "\n");
}
sb.append("\n");
// init
TreeMap<String, Integer> initMap = new TreeMap<String, Integer>();
Integer count = 0;
SolutionInterface solution = simulationData.getKappaSystem()
.getSolution();
for (ConnectedComponentInterface cc : solution.getStraightStorage()
.split()) {
count = 0;
String c = Converter.toString(cc);
if (initMap.containsKey(c))
count = initMap.get(c);
initMap.put(c, ++count);
}
for (SuperSubstance ss : solution.getSuperStorage().getComponents()) {
initMap.put(Converter.toString(ss.getComponent()), (int) ss
.getQuantity());
}
for (Map.Entry<String, Integer> entry : initMap.entrySet()) {
sb.append("%init: " + entry.getValue() + " * (");
sb.append(entry.getKey() + ")\n");
}
sb.append("\n");
// observables
Observables obs = simulationData.getKappaSystem().getObservables();
for (ObservableConnectedComponentInterface obsComponent : obs
.getConnectedComponentList()) {
sb.append("%obs: ");
if (obsComponent.getName() != null)
sb.append("'" + obsComponent.getName() + "' ");
for (int i = 0; i < obsComponent.getAgents().size() - 1; i++) {
sb.append(Converter.toString(obsComponent.getAgents().get(i))
+ ", ");
}
sb.append(Converter.toString(obsComponent.getAgents().get(
obsComponent.getAgents().size() - 1))
+ "\n");
}
List<ObservableInterface> list = obs.getComponentList();
ObservableRuleComponent obsRule = null;
for (ObservableInterface obsComponent : list) {
if (obsComponent instanceof ObservableRuleComponent) {
obsRule = (ObservableRuleComponent) obsComponent;
sb.append("%obs: '" + obsRule.getName() + "'\n");
}
}
if (isStorify) {
Stories stories = simulationData.getKappaSystem().getStories();
int i = 0;
while (stories.getRuleIdAtStories(i) != -1) {
sb.append("%story: '"
+ rules.get(stories.getRuleIdAtStories(i++)).getName()
+ "'\n");
}
} else {
sb.append("\n");
for (ComplexPerturbation<?, ?> perturbation : simulationData.getKappaSystem()
.getPerturbations()) {
sb.append("%mod: " + perturbation);
}
}
return sb.toString();
}
}