Skip to content

Commit 1e59cae

Browse files
committed
Adding onInitSimulation
Adding new onInitSimulation and InitSimulationContext Updating workbench with new onInitSimulation Bumping version numbers
1 parent 12d1ae8 commit 1e59cae

16 files changed

Lines changed: 210 additions & 17 deletions

File tree

Core/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ plugins {
33
}
44

55
group 'com.scaleoutsoftware.digitaltwin'
6-
version '3.0.9'
6+
version '3.0.10'
77

88
sourceCompatibility = JavaVersion.VERSION_12
99

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.scaleoutsoftware.digitaltwin.core;
2+
3+
public interface InitSimulationContext {
4+
/**
5+
* Retrieve a {@link SharedData} accessor for this model's shared data.
6+
* @return a {@link SharedData} instance.
7+
*/
8+
public abstract SharedData getSharedModelData();
9+
10+
/**
11+
* Retrieve a {@link SharedData} accessor for globally shared data.
12+
* @return a {@link SharedData} instance.
13+
*/
14+
public abstract SharedData getSharedGlobalData();
15+
}

Core/src/main/java/com/scaleoutsoftware/digitaltwin/core/SimulationController.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,18 @@ public interface SimulationController {
3131
*/
3232
Duration getSimulationTimeIncrement();
3333

34+
/**
35+
*
36+
*/
37+
38+
/**
39+
* <p>
40+
* Retrieves the simulation start time.
41+
* </p>
42+
* @return the simulation start time.
43+
*/
44+
Date getSimulationStartTime();
45+
3446
/**
3547
* <p>
3648
* Delay simulation processing for this DigitalTwin instance for a duration of time.

Core/src/main/java/com/scaleoutsoftware/digitaltwin/core/SimulationProcessor.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,31 @@ public SimulationProcessor() {}
3838
* {@link ProcessingResult#NoUpdate} to ignore the changes.
3939
*/
4040
public abstract ProcessingResult processModel(ProcessingContext context, T instance, Date epoch);
41+
42+
/**
43+
* <p>
44+
* Optional method that is called per-instance when a simulation is started. Default behavior is a no-op.
45+
* </p>
46+
*
47+
* <p>
48+
* onInitSimulation can be used when internal digital twin starting state is set outside the context of a digital twins init method and may be changed
49+
* between simulation runs.
50+
* <p>
51+
* <ul>
52+
* <li>Set variables in global or shared data.</li>
53+
* <li>Run a simulation.</li>
54+
* <li>onInitSimulation is called (per-instance) and digital twin instances set internal state based on the values in shared data.</li>
55+
* <li>Complete simulation and evaluate the result.</li>
56+
* </ul>
57+
*
58+
* </p>
59+
* </p>
60+
* @param context The simulation init context.
61+
* @param instance The digital twin instance.
62+
* @param epoch the simulation start time.
63+
* @return {@link ProcessingResult#UpdateDigitalTwin} or {@link ProcessingResult#NoUpdate}. Default behavior: {@link ProcessingResult#NoUpdate}.
64+
*/
65+
public ProcessingResult onInitSimulation(InitSimulationContext context, T instance, Date epoch) {
66+
return ProcessingResult.NoUpdate;
67+
}
4168
}

Development/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ plugins {
44
}
55

66
group 'com.scaleoutsoftware.digitaltwin'
7-
version '3.2.1'
7+
version '3.2.2'
88

99
sourceCompatibility = JavaVersion.VERSION_12
1010

@@ -20,7 +20,7 @@ dependencies {
2020
testImplementation group: 'junit', name: 'junit', version: '4.12'
2121
implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
2222
// public build configuration
23-
//implementation group: 'com.scaleoutsoftware.digitaltwin', name: 'core', version: '3.0.7'
23+
//implementation group: 'com.scaleoutsoftware.digitaltwin', name: 'core', version: '3.0.9'
2424

2525
// local build configuration
2626
implementation fileTree(dir: '..\\Core\\build\\libs\\', include: '*.jar')

Development/src/main/java/com/scaleoutsoftware/digitaltwin/development/SimulationEvent.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ abstract class SimulationEvent implements Comparable<SimulationEvent> {
3737

3838
abstract void setProxyState(ProxyState newState);
3939

40+
abstract void handleResetNextSimulationTime();
41+
42+
abstract void simulationInit(Date simulationStartTime);
43+
4044
long getPriority() {
4145
return _priority;
4246
}
@@ -56,7 +60,7 @@ void setNextSimulationTime(long nextSimulationTime) {
5660
handleResetNextSimulationTime();
5761
}
5862

59-
abstract void handleResetNextSimulationTime();
63+
6064

6165
@Override
6266
public int compareTo(SimulationEvent other) {

Development/src/main/java/com/scaleoutsoftware/digitaltwin/development/SimulationEventTimerImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,9 @@ void setProxyState(ProxyState newState) {
5555
@Override
5656
void handleResetNextSimulationTime() {
5757
}
58+
59+
@Override
60+
void simulationInit(Date simulationStartTime) {
61+
62+
}
5863
}

Development/src/main/java/com/scaleoutsoftware/digitaltwin/development/SimulationEventTwinImpl.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@
1515
*/
1616
package com.scaleoutsoftware.digitaltwin.development;
1717

18-
import com.scaleoutsoftware.digitaltwin.core.DigitalTwinBase;
19-
import com.scaleoutsoftware.digitaltwin.core.ProcessingContext;
20-
import com.scaleoutsoftware.digitaltwin.core.SimulationProcessor;
18+
import com.scaleoutsoftware.digitaltwin.core.*;
2119

2220
import java.nio.charset.StandardCharsets;
2321
import java.util.Date;
@@ -26,11 +24,15 @@
2624
class SimulationEventTwinImpl extends SimulationEvent {
2725
SimulationProcessor _processor;
2826
TwinProxy _proxy;
27+
SharedData _modelSharedData;
28+
SharedData _globalSharedData;
2929

30-
SimulationEventTwinImpl(long priority, TwinProxy proxy, SimulationProcessor processor) {
30+
SimulationEventTwinImpl(long priority, TwinProxy proxy, SimulationProcessor processor, SharedData modelSharedData, SharedData globalSharedData) {
3131
super(proxy.getInstance().Model, proxy.getInstance().Id, priority);
32-
_proxy = proxy;
33-
_processor = processor;
32+
_proxy = proxy;
33+
_processor = processor;
34+
_modelSharedData = modelSharedData;
35+
_globalSharedData = globalSharedData;
3436
}
3537

3638
@Override
@@ -66,6 +68,16 @@ void handleResetNextSimulationTime() {
6668
_proxy.setInstance(base);
6769
}
6870

71+
@Override
72+
void simulationInit(Date simulationStartTime) {
73+
InitSimulationContext context = new WorkbenchInitSimulationContext(_globalSharedData, _modelSharedData);
74+
synchronized (_proxy) {
75+
DigitalTwinBase base = _proxy.getInstance();
76+
_processor.onInitSimulation(context, base, simulationStartTime);
77+
_proxy.setInstance(base);
78+
}
79+
}
80+
6981
@Override
7082
public boolean equals(Object o) {
7183
if (this == o) return true;

Development/src/main/java/com/scaleoutsoftware/digitaltwin/development/SimulationScheduler.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class SimulationScheduler {
3535
private final SimulationProcessor _simulationProcessor;
3636
private final Logger _logger = LogManager.getLogger(SimulationScheduler.class);
3737
private long _curSimulationTime;
38+
private Date _simulationStartTime;
3839
private boolean _isActive;
3940

4041

@@ -60,8 +61,8 @@ public Thread newThread(Runnable r) {
6061
}
6162
}
6263

63-
// -------------- public methods ----------------
64-
public SimulationStep runSimulation(SimulationStepArgs runSimulationEventArgs) {
64+
// -------------- package private methods ----------------
65+
SimulationStep runSimulation(SimulationStepArgs runSimulationEventArgs) {
6566
_logger.info("Received run simulation event with args: " + runSimulationEventArgs.getCurSimulationTime() + " iterationSize: " + runSimulationEventArgs.getIterationSize() + " flags: " + runSimulationEventArgs.getSimulationFlags() );
6667
long current = System.currentTimeMillis();
6768
SimulationStep ret;
@@ -73,12 +74,17 @@ public SimulationStep runSimulation(SimulationStepArgs runSimulationEventArgs) {
7374
worker.shutdown();
7475
}
7576
return new SimulationStep(SimulationStatus.UserRequested,_curSimulationTime);
77+
} if(runSimulationEventArgs.getSimulationFlags() == WorkbenchSimulationFlags.Start) {
78+
_logger.info("Starting simulation; initializing instances.");
79+
for(SimulationWorker worker : _workers) {
80+
worker.initSimulation(new Date(runSimulationEventArgs.getCurSimulationTime()));
81+
}
82+
return new SimulationStep(SimulationStatus.Running,_curSimulationTime);
7683
} else {
7784
ret = runSimulationStep(runSimulationEventArgs);
7885
}
7986

8087
_logger.info(String.format("runSim complete in %s ms... returning next: %s", (System.currentTimeMillis()-current), ret));
81-
_logger.info(String.format("Queued: %s Processed: %s Sent: %s", QUEUED.getAndSet(0), PROCESSED.getAndSet(0), SENT.getAndSet(0)));
8288
return ret;
8389
}
8490

@@ -93,6 +99,16 @@ void setStatus(boolean active) {
9399
_isActive = active;
94100
}
95101

102+
Date getSimulationStartTime() {
103+
return _simulationStartTime;
104+
}
105+
106+
void setSimulationStartTime(Date simulationStartTime) {
107+
_simulationStartTime = simulationStartTime;
108+
}
109+
110+
111+
96112
// -------------- private methods ----------------
97113
private SimulationStep runSimulationStep(SimulationStepArgs args) {
98114
long currentTimeMs = System.currentTimeMillis();

Development/src/main/java/com/scaleoutsoftware/digitaltwin/development/SimulationWorker.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public void shutdown() {
6666
}
6767

6868
public void addTwinToQueue(TwinProxy proxy) {
69-
SimulationEvent event = new SimulationEventTwinImpl(_curSimulationTime, proxy, _simulationProcessor);
69+
SimulationEvent event = new SimulationEventTwinImpl(_curSimulationTime, proxy, _simulationProcessor, new WorkbenchSharedData(_twinExecutionEngine.getGlobalSharedData()), new WorkbenchSharedData(_twinExecutionEngine.getModelData(_modelName)));
7070
_timeOrderedQueue.add(event);
7171
_events.put(String.format("%s%s",event.getModel(),event.getId()), event);
7272
}
@@ -89,11 +89,17 @@ public void stopTimer(String model, String id, String timerName) {
8989
_events.remove(String.format("%s%s",event.getModel(),event.getId()));
9090
}
9191

92+
void initSimulation(Date startTime) {
93+
for(SimulationEvent event : _events.values()) {
94+
event.simulationInit(startTime);
95+
}
96+
}
97+
9298
public void runThisInstance(String model, String id) throws WorkbenchException {
9399
SimulationEvent event = _events.remove(String.format("%s%s",model,id));
94100
if(event == null) {
95101
TwinProxy proxy = _twinExecutionEngine.getTwinProxy(model, id);
96-
event = new SimulationEventTwinImpl(_curSimulationTime, proxy, _simulationProcessor);
102+
event = new SimulationEventTwinImpl(_curSimulationTime, proxy, _simulationProcessor, new WorkbenchSharedData(_twinExecutionEngine.getGlobalSharedData()), new WorkbenchSharedData(_twinExecutionEngine.getModelData(_modelName)));
97103
} else {
98104
_timeOrderedQueue.remove(event);
99105
}

0 commit comments

Comments
 (0)