package eu.quanticol.carma.core.ui.jobs; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.LinkedList; import java.util.List; import org.cmg.ml.sam.sim.SimulationEnvironment; import org.cmg.ml.sam.sim.SimulationMonitor; import org.cmg.ml.sam.sim.sampling.SamplingCollection; import org.cmg.ml.sam.sim.sampling.SimulationTimeSeries; import org.cmg.ml.sam.sim.sampling.StatisticSampling; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.nebula.visualization.xygraph.figures.Trace; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import eu.quanticol.carma.core.ui.data.MeasureData; import eu.quanticol.carma.core.ui.data.SimulationExperiment; import eu.quanticol.carma.core.ui.data.SimulationOutcome; import eu.quanticol.carma.core.ui.views.ExperimentResultsView; import eu.quanticol.carma.core.ui.views.SimulationTrace; import eu.quanticol.carma.core.ui.views.SimulationView; import eu.quanticol.carma.simulator.CarmaModel; import eu.quanticol.carma.simulator.CarmaSystem; public class ExperimentJob extends Job { // private MeasureData[] measures; private SimulationEnvironment<CarmaSystem> sim; private SamplingCollection<CarmaSystem> sc; // private CarmaModel model; // private IResource resource; private SimulationExperiment experiment; private long startTime; private long endTime; private String tag; public ExperimentJob( SimulationExperiment experiment ) { super("Simulation"); this.experiment = experiment; this.sim = new SimulationEnvironment<CarmaSystem>( this.experiment.getCarmaModel().getFactory( experiment.getSystem() ) ); this.sc = new SamplingCollection<CarmaSystem>(); for(MeasureData measure : this.experiment.getMeasures()){ this.sc.addSamplingFunction(new StatisticSampling<CarmaSystem>(1+experiment.getSamplings(), this.experiment.getSimulationTime()/this.experiment.getSamplings() , this.experiment.getCarmaModel().getMeasure(measure.getMeasureName(),measure.getParameters()))); } this.sim.setSampling(sc); } public void simulate(IProgressMonitor monitor){ DateFormat dateFormat1 = new SimpleDateFormat("dd-MM-yyyy HH.mm.ss"); Calendar cal1 = Calendar.getInstance(); this.tag = dateFormat1.format(cal1.getTime()); this.startTime = System.currentTimeMillis(); monitor.beginTask("Simulation...", experiment.getReplications()); this.sim.simulate( new SimulationMonitor() { @Override public void startIteration(int i) { monitor.subTask("Replication "+i); } @Override public boolean isCancelled() { return monitor.isCanceled(); } @Override public void endSimulation(int i) { monitor.worked(1); } } , experiment.getReplications(),experiment.getSimulationTime()); this.endTime = System.currentTimeMillis(); updateView(); } public String getModelName(){ return this.experiment.getResource().getName(); } public SamplingCollection<CarmaSystem> getCollection(){ return this.sc; } public String getSystem(){ return this.experiment.getSystem(); } public List<MeasureData> getMeasures(){ return this.experiment.getMeasures(); } public int getSamples(){ return this.experiment.getSamplings(); } public double getDeadline(){ return this.experiment.getSimulationTime(); } public int getIterations(){ return this.experiment.getReplications(); } public String toCSVString(){ return "Model;"+this.getSystem()+";deadline;"+this.getDeadline()+";iterations;"+this.getIterations()+";samples;"+this.getSamples(); } public void updateView(){ LinkedList<SimulationTrace> data = new LinkedList<SimulationTrace>(); for( SimulationTimeSeries series: sc.getSimulationTimeSeries( getIterations() )) { data.add(new SimulationTrace(series)); } double totalTime = endTime-startTime; experiment.addSimulationResult(new SimulationOutcome(tag, totalTime, totalTime/experiment.getReplications(), sc.getSimulationTimeSeries(getIterations()))); Display.getDefault().asyncExec(new Runnable() { public void run() { try { SimulationView simView = (SimulationView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView( SimulationView.ID ); simView.addExperiment( experiment ); ExperimentResultsView view = (ExperimentResultsView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView( ExperimentResultsView.ID ); view.showData( data ); } catch (PartInitException e) { MessageDialog.openError(PlatformUI.getWorkbench().getDisplay().getActiveShell(), "Internal error...", e.getMessage()); } } }); } @Override protected IStatus run(IProgressMonitor monitor) { simulate(monitor); return Status.OK_STATUS; } }