package com.plectix.simulator.updates;
import static org.junit.Assert.fail;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import org.junit.Before;
import com.plectix.simulator.DirectoryTestsRunner;
import com.plectix.simulator.Initializator;
import com.plectix.simulator.interfaces.ConnectedComponentInterface;
import com.plectix.simulator.parser.SimulationDataFormatException;
import com.plectix.simulator.simulationclasses.injections.Injection;
import com.plectix.simulator.simulator.KappaSystem;
import com.plectix.simulator.simulator.Simulator;
import com.plectix.simulator.simulator.ThreadLocalData;
import com.plectix.simulator.simulator.UpdatesPerformer;
import com.plectix.simulator.staticanalysis.Rule;
import com.plectix.simulator.staticanalysis.stories.storage.StoryStorageException;
import com.plectix.simulator.util.io.PlxLogger;
public abstract class TestUpdate extends DirectoryTestsRunner {
private Simulator mySimulator;
private static final PlxLogger LOGGER = ThreadLocalData
.getLogger(Simulator.class);
private double currentTime = 0.;
private Rule myActiveRule;
private String myTestFileName = "";
private List<Injection> myCurrentInjectionsList;
private final Integer operationMode;
protected TestUpdate(String fileName, Integer opMode) {
super();
myTestFileName = fileName;
operationMode = opMode;
}
public abstract void init() throws FileNotFoundException, SimulationDataFormatException, IOException;
@Override
public abstract String getPrefixFileName();
public abstract boolean isDoingPositive();
@Before
public void setup() throws Exception {
String fullTestFilePath = getPrefixFileName() + myTestFileName;
Initializator initializator = getInitializator();
initializator.init(fullTestFilePath, operationMode);
mySimulator = initializator.getSimulator();
run();
init();
}
public Rule getActiveRule() {
return myActiveRule;
}
public Collection<Rule> getRules() {
return mySimulator.getSimulationData().getKappaSystem().getRules();
}
public List<Injection> getCurrentInjectionsList() {
return myCurrentInjectionsList;
}
private void run() throws StoryStorageException {
KappaSystem kappaSystem = mySimulator.getSimulationData()
.getKappaSystem();
mySimulator.getSimulationData().getKappaSystem().getObservables()
.calculateObs(
currentTime,
1,
mySimulator.getSimulationData()
.getSimulationArguments().isTime());
mySimulator.getSimulationData().getKappaSystem().updateRuleActivities();
myActiveRule = mySimulator.getSimulationData().getKappaSystem()
.getRandomRule();
if (myActiveRule == null) {
// mySimulator.getSimulationData().getClock().setTimeLimit(currentTime);
fail(myTestFileName + " : there's no active rules");
}
if (LOGGER.isDebugEnabled())
LOGGER.debug("Rule: " + myActiveRule.getName());
// myCurrentInjectionsList = ruleProbabilityCalculation
// .getSomeInjectionList(myActiveRule);
myCurrentInjectionsList = kappaSystem
.chooseInjectionsForRuleApplication(myActiveRule);
currentTime += mySimulator.getSimulationData().getKappaSystem()
.getTimeValue();
if (myCurrentInjectionsList != null) {
// negative update
if (LOGGER.isDebugEnabled())
LOGGER.debug("negative update");
myActiveRule.applyRule(myCurrentInjectionsList, mySimulator
.getSimulationData());
UpdatesPerformer.doNegativeUpdate(myCurrentInjectionsList);
if (isDoingPositive()) {
mySimulator
.getSimulationData()
.getKappaSystem()
.doPositiveUpdate(myActiveRule, myCurrentInjectionsList);
}
} else {
if (LOGGER.isDebugEnabled())
LOGGER.debug("Clash");
}
}
public static boolean lhsIsEmpty(List<ConnectedComponentInterface> lh) {
return (lh.size() == 1)
&& (lh.contains(ThreadLocalData.getEmptyConnectedComponent()));
}
}