package com.plectix.simulator.parser.builders;
import java.util.List;
import com.plectix.simulator.parser.DocumentFormatException;
import com.plectix.simulator.parser.ParseErrorException;
import com.plectix.simulator.parser.abstractmodel.KappaModel;
import com.plectix.simulator.parser.abstractmodel.ModelSolution;
import com.plectix.simulator.simulationclasses.perturbations.ComplexPerturbation;
import com.plectix.simulator.simulator.KappaSystem;
import com.plectix.simulator.simulator.SimulationArguments;
import com.plectix.simulator.simulator.SimulationData;
import com.plectix.simulator.staticanalysis.Rule;
import com.plectix.simulator.staticanalysis.observables.Observables;
import com.plectix.simulator.staticanalysis.stories.Stories;
public final class KappaSystemBuilder {
private final SimulationData simulationData;
public KappaSystemBuilder(SimulationData simulationData) {
this.simulationData = simulationData;
}
public final KappaSystem build(KappaModel model) throws ParseErrorException, DocumentFormatException {
SimulationArguments arguments = simulationData.getSimulationArguments();
KappaSystem kappaSystem = simulationData.getKappaSystem();
MasterSolutionModel masterSolutionModel = null;
if(!simulationData.getSimulationArguments().incompletesAllowed())
masterSolutionModel= new MasterSolutionModel();
// rules
List<Rule> rules = (new RuleBuilder(kappaSystem)).build(model.getRules(), masterSolutionModel);
kappaSystem.setRules(rules);
if ((kappaSystem.getStories() == null)
&& (arguments.getSimulationType() == SimulationArguments.SimulationType.STORIFY)) {
// stories
kappaSystem.setStories(new Stories(simulationData));
for (String storifiedName : (new StoriesBuilder()).build(model.getStories())) {
kappaSystem.addStories(storifiedName);
}
} else {
// observables
Observables observables = (new ObservablesBuilder(simulationData)).build(model
.getObservables(), rules);
kappaSystem.setObservables(observables);
}
// perturbations
List<ComplexPerturbation<?,?>> perturbations =
(new PerturbationsBuilder(simulationData)).build(model.getPerturbations(), masterSolutionModel);
kappaSystem.setPerturbations(perturbations);
// solution
if (arguments.solutionNeedsToBeRead()) {
ModelSolution solution = model.getSolution();
kappaSystem.setSolution((new SolutionBuilder(simulationData)).build(solution, masterSolutionModel));
}
return kappaSystem;
}
}