package com.plectix.simulator.experiments; import java.util.LinkedHashSet; import java.util.Set; import junit.framework.Assert; import org.junit.Before; import org.junit.Test; import com.plectix.simulator.SimulationMain; import com.plectix.simulator.controller.SimulatorInputData; import com.plectix.simulator.parser.IncompletesDisabledException; import com.plectix.simulator.parser.SimulationDataFormatException; import com.plectix.simulator.simulator.Simulator; import com.plectix.simulator.simulator.api.steps.experiments.ConnectedComponentPattern; import com.plectix.simulator.simulator.api.steps.experiments.ExperimentRunner; import com.plectix.simulator.simulator.api.steps.experiments.RulePattern; import com.plectix.simulator.simulator.api.steps.experiments.SimulationDataProcessor; import com.plectix.simulator.staticanalysis.observables.ObservableComponentsManager; import com.plectix.simulator.staticanalysis.observables.Observables; public class TestExponentielleExperiment extends ExperimentRunner { private double sumMax = 0.0; private double sumFinal = 0.0; private double rateConstant = 1.0; private final Set<String> experimentsResults = new LinkedHashSet<String>(); private SimulationDataProcessor simulationDataProcessor = null; public TestExponentielleExperiment() throws Exception { super(SimulationMain.getSimulatorInputData( new String[]{ "--sim", "data/exponentielle.ka", "--time", "5.0" }, null)); } @Test public void test() throws Exception { try { this.run(11, 100); } catch(ExperimentFailedException e) { Assert.fail(e.getMessage()); } } @Before public void testExperimentRunner() throws Exception { simulationDataProcessor = new SimulationDataProcessor(this.getExperiment().getSimulator()){ public void updateInitialModel() { this.setRuleRate(new RulePattern("a(x) -> a(x), a(x)"), rateConstant); } }; experimentsResults.add("1.0 148.63 148.63"); experimentsResults.add("1.05 190.79 190.79"); experimentsResults.add("1.1 244.05 244.05"); experimentsResults.add("1.1500000000000001 314.43 314.43"); experimentsResults.add("1.2000000000000002 403.59 403.59"); experimentsResults.add("1.2500000000000002 518.05 518.05"); experimentsResults.add("1.3000000000000003 667.99 667.99"); experimentsResults.add("1.3500000000000003 856.3 856.3"); experimentsResults.add("1.4000000000000004 1099.17 1099.17"); experimentsResults.add("1.4500000000000004 1407.56 1407.56"); experimentsResults.add("1.5000000000000004 1807.06 1807.06"); } private final int seedValueByRunNumber(int runNo) { return runNo + 1; } @Override public void startingRun(int runNo, Simulator simulator) throws Exception { // TODO: Create methods to change important simulation parameters such as seed, rescale, time/event option, operation mode, etc. simulator.getSimulationData().getSimulationArguments().setSeed(this.seedValueByRunNumber(runNo)); } @Override public void finishedRun(int runNo, Simulator simulator) { Observables observables = simulator.getSimulationData().getKappaSystem().getObservables(); ObservableComponentsManager manager = observables.getComponentManager(); double countFinal = manager.getFinalComponentState(new ConnectedComponentPattern("a(x)")); double countMax = manager.getMaxComponentState(new ConnectedComponentPattern("a(x)")); sumFinal = sumFinal + countFinal; sumMax = sumMax + countMax; } @Override public void finishedAllRuns(int runNo, Simulator simulator) { sumFinal = sumFinal / runNo; sumMax = sumMax / runNo; } @Override public void finishedExperiment(int numberOfExperiments, Simulator simulator) throws ExperimentFailedException { // dump the average of 50 runs for this rateConstant this.checkLine(rateConstant + " " + sumFinal + " " + sumMax); // update variables: sumMax = 0.0; sumFinal = 0.0; rateConstant = rateConstant + 0.05; try { simulationDataProcessor.updateInitialModel(); } catch (IncompletesDisabledException e) { e.printStackTrace(); System.err.println("Could not update initial model"); System.exit(-3); } catch (SimulationDataFormatException e) { e.printStackTrace(); System.err.println("Could not update initial model"); System.exit(-4); } } private final void checkLine(String line) throws ExperimentFailedException { if (!experimentsResults.contains(line)) { throw new ExperimentFailedException("No experiment should end with result : " + line); } } }