1 package org.simantics.simulation.experiment;
\r
3 import java.util.Collection;
\r
4 import java.util.UUID;
\r
5 import java.util.function.Consumer;
\r
7 import org.eclipse.core.runtime.IProgressMonitor;
\r
8 import org.eclipse.core.runtime.IStatus;
\r
9 import org.eclipse.core.runtime.Status;
\r
10 import org.eclipse.core.runtime.jobs.Job;
\r
11 import org.eclipse.ui.progress.IProgressConstants2;
\r
12 import org.simantics.DatabaseJob;
\r
13 import org.simantics.Simantics;
\r
14 import org.simantics.databoard.Bindings;
\r
15 import org.simantics.db.ReadGraph;
\r
16 import org.simantics.db.RequestProcessor;
\r
17 import org.simantics.db.Resource;
\r
18 import org.simantics.db.Session;
\r
19 import org.simantics.db.WriteGraph;
\r
20 import org.simantics.db.common.procedure.adapter.ProcedureAdapter;
\r
21 import org.simantics.db.common.request.ObjectsWithType;
\r
22 import org.simantics.db.common.request.WriteRequest;
\r
23 import org.simantics.db.common.request.WriteResultRequest;
\r
24 import org.simantics.db.exception.DatabaseException;
\r
25 import org.simantics.db.layer0.request.PossibleActiveExperiment;
\r
26 import org.simantics.db.layer0.request.PossibleActiveRun;
\r
27 import org.simantics.db.layer0.variable.Variable;
\r
28 import org.simantics.db.procedure.Procedure;
\r
29 import org.simantics.db.service.VirtualGraphSupport;
\r
30 import org.simantics.layer0.Layer0;
\r
31 import org.simantics.project.IProject;
\r
32 import org.simantics.simulation.ontology.SimulationResource;
\r
33 import org.simantics.simulation.project.IExperimentManager;
\r
36 * @author Tuukka Lehtonen
\r
38 public final class ExperimentUtil {
\r
40 public static void stepExperiment(IExperiment experiment, double duration) {
\r
41 if(experiment instanceof IDynamicExperiment)
\r
42 ((IDynamicExperiment)experiment).simulateDuration(duration);
\r
45 public static void simulateExperiment(IExperiment experiment, boolean enabled) {
\r
46 if(experiment instanceof IDynamicExperiment)
\r
47 ((IDynamicExperiment)experiment).simulate(enabled);
\r
50 public static void disposeExperiment(final IExperiment experiment) {
\r
52 if(experiment instanceof IDynamicExperiment) {
\r
54 ((IDynamicExperiment)experiment).shutdown(null);
\r
56 Session session = Simantics.getSession();
\r
57 VirtualGraphSupport vgs = session.getService(VirtualGraphSupport.class);
\r
58 session.asyncRequest(new WriteRequest(vgs.getMemoryPersistent("experiments")) {
\r
61 public void perform(WriteGraph graph) throws DatabaseException {
\r
63 SimulationResource SIMU = SimulationResource.getInstance(graph);
\r
64 Resource activeRun = experiment.getResource();
\r
65 graph.deny(activeRun, SIMU.IsActive, activeRun);
\r
75 public static void step(double duration) {
\r
76 IExperimentManager manager =
\r
77 Simantics.getProject().getHint(IExperimentManager.KEY_EXPERIMENT_MANAGER);
\r
78 IExperiment experiment = manager.getActiveExperiment();
\r
79 if(experiment instanceof IDynamicExperiment)
\r
80 ((IDynamicExperiment)experiment).simulateDuration(duration);
\r
83 public static void simulate(boolean enabled) {
\r
84 IExperimentManager manager =
\r
85 Simantics.getProject().getHint(IExperimentManager.KEY_EXPERIMENT_MANAGER);
\r
86 IExperiment experiment = manager.getActiveExperiment();
\r
87 if(experiment instanceof IDynamicExperiment)
\r
88 ((IDynamicExperiment)experiment).simulate(enabled);
\r
92 * Synchronously shutdown active experiment.
\r
96 public static void shutdownActiveExperiment(IProject project) {
\r
97 shutdownActiveExperiment(project, null);
\r
101 * Synchronously shutdown active experiment.
\r
105 public static void shutdownActiveExperiment(IProject project, IProgressMonitor monitor) {
\r
106 IExperimentManager manager = project.getHint(IExperimentManager.KEY_EXPERIMENT_MANAGER);
\r
107 IExperiment experiment = manager.getActiveExperiment();
\r
108 if (experiment != null)
\r
109 experiment.shutdown(monitor);
\r
113 * If there is an active experiment, schedule a job for its shutdown.
\r
117 public static void scheduleShutdownActiveExperiment(IProject project) {
\r
118 scheduleShutdownActiveExperiment(project, null);
\r
122 * If there is an active experiment, schedule a job for its shutdown.
\r
126 public static void scheduleShutdownActiveExperiment(IProject project, Consumer<IExperiment> callback) {
\r
127 IExperimentManager manager = project.getHint(IExperimentManager.KEY_EXPERIMENT_MANAGER);
\r
128 final IExperiment experiment = manager.getActiveExperiment();
\r
129 if (experiment != null) {
\r
130 Job job = new DatabaseJob("Shutting down experiment") {
\r
132 protected IStatus run(final IProgressMonitor monitor) {
\r
134 experiment.shutdown(monitor);
\r
135 if (callback != null)
\r
136 callback.accept(null);
\r
137 return Status.OK_STATUS;
\r
143 job.setProperty(IProgressConstants2.SHOW_IN_TASKBAR_ICON_PROPERTY, Boolean.TRUE);
\r
149 public static Variable possibleActiveRunVariable(ReadGraph graph, Resource model) throws DatabaseException {
\r
150 return graph.syncRequest(new PossibleActiveRun(model));
\r
155 * @param experiment
\r
156 * @param asyncCallback
\r
158 * @throws DatabaseException
\r
160 public static Resource activateExperiment(RequestProcessor processor, Resource experiment, Procedure<Resource> asyncCallback) throws DatabaseException {
\r
161 VirtualGraphSupport vgs = processor.getService(VirtualGraphSupport.class);
\r
162 WriteResultRequest<Resource> w = new WriteResultRequest<Resource>(vgs.getMemoryPersistent("experiments")) {
\r
164 public Resource perform(WriteGraph graph) throws DatabaseException {
\r
165 return activateExperiment(graph, experiment);
\r
168 if (processor instanceof WriteGraph) {
\r
169 return ((WriteGraph) processor).syncRequest(w);
\r
171 if (asyncCallback == null)
\r
172 asyncCallback = new ProcedureAdapter<>();
\r
173 processor.getSession().asyncRequest(w, asyncCallback);
\r
181 * @throws DatabaseException
\r
183 public static void activateRun(RequestProcessor processor, Resource run) throws DatabaseException {
\r
184 VirtualGraphSupport vgs = processor.getService(VirtualGraphSupport.class);
\r
185 WriteRequest w = new WriteRequest(vgs.getMemoryPersistent("experiments")) {
\r
187 public void perform(WriteGraph graph) throws DatabaseException {
\r
188 ExperimentUtil.activateRun(graph, run);
\r
191 if (processor instanceof WriteGraph) {
\r
192 ((WriteGraph) processor).syncRequest(w);
\r
194 processor.getSession().asyncRequest(w);
\r
198 private static Resource activateExperiment(WriteGraph graph, Resource experiment) throws DatabaseException {
\r
199 Layer0 L0 = Layer0.getInstance(graph);
\r
200 SimulationResource SIMU = SimulationResource.getInstance(graph);
\r
202 Resource experimentType = graph.getPossibleType(experiment, SIMU.Experiment);
\r
203 if (experimentType == null)
\r
204 throw new DatabaseException("No unique experiment type was found for experiment " + graph.getPossibleURI(experiment));
\r
205 Collection<Resource> runTypes = graph.sync(new ObjectsWithType(experimentType, L0.ConsistsOf, SIMU.RunType));
\r
206 if (runTypes.size() != 1)
\r
207 throw new DatabaseException("No unique run type was found for experiment " + graph.getPossibleURI(experiment));
\r
208 final Resource runType = runTypes.iterator().next();
\r
210 VirtualGraphSupport vgs = graph.getService(VirtualGraphSupport.class);
\r
211 return graph.syncRequest(new WriteResultRequest<Resource>(vgs.getMemoryPersistent("experiments")) {
\r
213 public Resource perform(WriteGraph graph) throws DatabaseException {
\r
214 Layer0 L0 = Layer0.getInstance(graph);
\r
215 Resource run = graph.newResource();
\r
216 graph.claim(run, L0.InstanceOf, runType);
\r
217 graph.addLiteral(run, L0.HasName, L0.NameOf, L0.String, UUID.randomUUID().toString(), Bindings.STRING);
\r
218 graph.claim(experiment, L0.ConsistsOf, run);
\r
220 Resource activeRun = graph.syncRequest(new PossibleActiveExperiment(experiment));
\r
221 if (activeRun != null) {
\r
222 graph.deny(activeRun, SIMU.IsActive, activeRun);
\r
224 graph.claim(run, SIMU.IsActive, run);
\r
231 private static void activateRun(WriteGraph graph, Resource run) throws DatabaseException {
\r
232 SimulationResource SIMU = SimulationResource.getInstance(graph);
\r
233 Resource activeRun = graph.syncRequest(new PossibleActiveExperiment(run));
\r
234 if (activeRun != null) {
\r
235 graph.deny(activeRun, SIMU.IsActive, activeRun);
\r
237 graph.claim(run, SIMU.IsActive, run);
\r