Skip to content

Commit 8d0a58d

Browse files
committed
Simulator and model clocks refactoring - maintain a single simulation clock at the simulator level
1 parent 870e7f4 commit 8d0a58d

File tree

10 files changed

+47
-60
lines changed

10 files changed

+47
-60
lines changed

src/models/exclusive_gateway.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ struct PortsOut {
4848
#[serde(rename_all = "camelCase")]
4949
struct State {
5050
event_list: Vec<ScheduledEvent>,
51-
#[serde(default)]
52-
global_time: f64,
5351
}
5452

5553
impl Default for State {
@@ -60,7 +58,6 @@ impl Default for State {
6058
};
6159
State {
6260
event_list: vec![initalization_event],
63-
global_time: 0.0,
6461
}
6562
}
6663
}
@@ -134,6 +131,7 @@ impl AsModel for ExclusiveGateway {
134131
&mut self,
135132
uniform_rng: &mut UniformRNG,
136133
incoming_message: ModelMessage,
134+
global_time: f64,
137135
) -> Result<Vec<ModelMessage>, SimulationError> {
138136
let mut outgoing_messages: Vec<ModelMessage> = Vec::new();
139137
let port_number = self.port_weights.random_variate(uniform_rng)?;
@@ -142,7 +140,7 @@ impl AsModel for ExclusiveGateway {
142140
self.snapshot.last_job = Some((
143141
self.ports_out.flow_paths[port_number].clone(),
144142
incoming_message.content.clone(),
145-
self.state.global_time,
143+
global_time,
146144
));
147145
}
148146
if self.need_historical_metrics() {
@@ -159,6 +157,7 @@ impl AsModel for ExclusiveGateway {
159157
fn events_int(
160158
&mut self,
161159
_uniform_rng: &mut UniformRNG,
160+
_global_time: f64,
162161
) -> Result<Vec<ModelMessage>, SimulationError> {
163162
let events = self.state.event_list.clone();
164163
self.state.event_list = self
@@ -184,7 +183,6 @@ impl AsModel for ExclusiveGateway {
184183
.for_each(|scheduled_event| {
185184
scheduled_event.time -= time_delta;
186185
});
187-
self.state.global_time += time_delta;
188186
}
189187

190188
fn until_next_event(&self) -> f64 {

src/models/gate.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ struct State {
4949
event_list: Vec<ScheduledEvent>,
5050
jobs: Vec<String>,
5151
phase: Phase,
52-
#[serde(default)]
53-
global_time: f64,
5452
}
5553

5654
impl Default for State {
@@ -63,7 +61,6 @@ impl Default for State {
6361
event_list: vec![initalization_event],
6462
jobs: Vec::new(),
6563
phase: Phase::Open,
66-
global_time: 0.0,
6764
}
6865
}
6966
}
@@ -162,13 +159,14 @@ impl AsModel for Gate {
162159
&mut self,
163160
_uniform_rng: &mut UniformRNG,
164161
incoming_message: ModelMessage,
162+
global_time: f64,
165163
) -> Result<Vec<ModelMessage>, SimulationError> {
166164
let incoming_port: &str = &incoming_message.port_name;
167165
match &self.ports_in {
168166
PortsIn { activation, .. } if activation == incoming_port => {
169167
// Possible metrics updates
170168
if self.need_snapshot_metrics() {
171-
self.snapshot.last_activation = Some(self.state.global_time);
169+
self.snapshot.last_activation = Some(global_time);
172170
self.snapshot.is_open = Some(true);
173171
}
174172
if self.need_historical_metrics() {
@@ -180,7 +178,7 @@ impl AsModel for Gate {
180178
PortsIn { deactivation, .. } if deactivation == incoming_port => {
181179
// Possible metrics updates
182180
if self.need_snapshot_metrics() {
183-
self.snapshot.last_deactivation = Some(self.state.global_time);
181+
self.snapshot.last_deactivation = Some(global_time);
184182
self.snapshot.is_open = Some(false);
185183
}
186184
if self.need_historical_metrics() {
@@ -193,7 +191,7 @@ impl AsModel for Gate {
193191
// Possible metrics updates
194192
if self.need_snapshot_metrics() {
195193
self.snapshot.last_received =
196-
Some((incoming_message.content.clone(), self.state.global_time));
194+
Some((incoming_message.content.clone(), global_time));
197195
}
198196
if self.need_historical_metrics() {
199197
self.history.push(self.snapshot.clone());
@@ -219,6 +217,7 @@ impl AsModel for Gate {
219217
fn events_int(
220218
&mut self,
221219
_uniform_rng: &mut UniformRNG,
220+
_global_time: f64,
222221
) -> Result<Vec<ModelMessage>, SimulationError> {
223222
let mut outgoing_messages: Vec<ModelMessage> = Vec::new();
224223
let events = self.state.event_list.clone();
@@ -270,7 +269,6 @@ impl AsModel for Gate {
270269
.for_each(|scheduled_event| {
271270
scheduled_event.time -= time_delta;
272271
});
273-
self.state.global_time += time_delta;
274272
}
275273

276274
fn until_next_event(&self) -> f64 {

src/models/generator.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,6 @@ struct State {
5555
event_list: Vec<ScheduledEvent>,
5656
until_message_interdeparture: f64,
5757
job_counter: usize,
58-
#[serde(default)]
59-
global_time: f64,
6058
}
6159

6260
impl Default for State {
@@ -69,7 +67,6 @@ impl Default for State {
6967
event_list: vec![initalization_event],
7068
until_message_interdeparture: INFINITY,
7169
job_counter: 0,
72-
global_time: 0.0,
7370
}
7471
}
7572
}
@@ -147,13 +144,15 @@ impl AsModel for Generator {
147144
&mut self,
148145
_uniform_rng: &mut UniformRNG,
149146
_incoming_message: ModelMessage,
147+
_global_time: f64,
150148
) -> Result<Vec<ModelMessage>, SimulationError> {
151149
Ok(Vec::new())
152150
}
153151

154152
fn events_int(
155153
&mut self,
156154
uniform_rng: &mut UniformRNG,
155+
global_time: f64,
157156
) -> Result<Vec<ModelMessage>, SimulationError> {
158157
let mut outgoing_messages: Vec<ModelMessage> = Vec::new();
159158
let events = self.state.event_list.clone();
@@ -185,8 +184,7 @@ impl AsModel for Generator {
185184
event: Event::BeginGeneration,
186185
});
187186
if let Some(thinning) = self.thinning.clone() {
188-
let thinning_threshold =
189-
thinning.evaluate(self.state.global_time)?;
187+
let thinning_threshold = thinning.evaluate(global_time)?;
190188
let uniform_rn = uniform_rng.rn();
191189
if uniform_rn < thinning_threshold {
192190
self.state.event_list.push(ScheduledEvent {
@@ -214,8 +212,7 @@ impl AsModel for Generator {
214212
});
215213
// Possible metrics updates
216214
if self.need_snapshot_metrics() {
217-
self.snapshot.last_generation =
218-
Some((generated, self.state.global_time));
215+
self.snapshot.last_generation = Some((generated, global_time));
219216
}
220217
if self.need_historical_metrics() {
221218
self.history.push(self.snapshot.clone());
@@ -236,7 +233,6 @@ impl AsModel for Generator {
236233
.for_each(|scheduled_event| {
237234
scheduled_event.time -= time_delta;
238235
});
239-
self.state.global_time += time_delta;
240236
}
241237

242238
fn until_next_event(&self) -> f64 {

src/models/load_balancer.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,6 @@ struct State {
4444
event_list: Vec<ScheduledEvent>,
4545
jobs: Vec<String>,
4646
next_port_out: usize,
47-
#[serde(default)]
48-
global_time: f64,
4947
}
5048

5149
impl Default for State {
@@ -58,7 +56,6 @@ impl Default for State {
5856
event_list: vec![initalization_event],
5957
jobs: Vec::new(),
6058
next_port_out: 0,
61-
global_time: 0.0,
6259
}
6360
}
6461
}
@@ -131,6 +128,7 @@ impl AsModel for LoadBalancer {
131128
&mut self,
132129
_uniform_rng: &mut UniformRNG,
133130
incoming_message: ModelMessage,
131+
_global_time: f64,
134132
) -> Result<Vec<ModelMessage>, SimulationError> {
135133
self.state.jobs.push(incoming_message.content);
136134
self.state.event_list.push(ScheduledEvent {
@@ -143,6 +141,7 @@ impl AsModel for LoadBalancer {
143141
fn events_int(
144142
&mut self,
145143
_uniform_rng: &mut UniformRNG,
144+
global_time: f64,
146145
) -> Result<Vec<ModelMessage>, SimulationError> {
147146
let mut outgoing_messages: Vec<ModelMessage> = Vec::new();
148147
let events = self.state.event_list.clone();
@@ -164,7 +163,7 @@ impl AsModel for LoadBalancer {
164163
self.snapshot.last_job = Some((
165164
self.ports_out.flow_paths[self.state.next_port_out].clone(),
166165
self.state.jobs[0].clone(),
167-
self.state.global_time,
166+
global_time,
168167
));
169168
}
170169
if self.need_historical_metrics() {
@@ -189,7 +188,6 @@ impl AsModel for LoadBalancer {
189188
.for_each(|scheduled_event| {
190189
scheduled_event.time -= time_delta;
191190
});
192-
self.state.global_time += time_delta;
193191
}
194192

195193
fn until_next_event(&self) -> f64 {

src/models/model.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,18 @@ impl AsModel for Model {
4242
&mut self,
4343
uniform_rng: &mut UniformRNG,
4444
incoming_message: ModelMessage,
45+
global_time: f64,
4546
) -> Result<Vec<ModelMessage>, SimulationError> {
46-
self.inner.events_ext(uniform_rng, incoming_message)
47+
self.inner
48+
.events_ext(uniform_rng, incoming_message, global_time)
4749
}
4850

4951
fn events_int(
5052
&mut self,
5153
uniform_rng: &mut UniformRNG,
54+
global_time: f64,
5255
) -> Result<Vec<ModelMessage>, SimulationError> {
53-
self.inner.events_int(uniform_rng)
56+
self.inner.events_int(uniform_rng, global_time)
5457
}
5558

5659
fn time_advance(&mut self, time_delta: f64) {
@@ -90,10 +93,12 @@ pub trait AsModel {
9093
&mut self,
9194
uniform_rng: &mut UniformRNG,
9295
incoming_message: ModelMessage,
96+
global_time: f64,
9397
) -> Result<Vec<ModelMessage>, SimulationError>;
9498
fn events_int(
9599
&mut self,
96100
uniform_rng: &mut UniformRNG,
101+
global_time: f64,
97102
) -> Result<Vec<ModelMessage>, SimulationError>;
98103
fn time_advance(&mut self, time_delta: f64);
99104
fn until_next_event(&self) -> f64;

src/models/parallel_gateway.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ struct PortsOut {
4747
struct State {
4848
event_list: Vec<ScheduledEvent>,
4949
collections: HashMap<String, usize>,
50-
#[serde(default)]
51-
global_time: f64,
5250
}
5351

5452
impl Default for State {
@@ -60,7 +58,6 @@ impl Default for State {
6058
State {
6159
event_list: vec![initalization_event],
6260
collections: HashMap::new(),
63-
global_time: 0.0,
6461
}
6562
}
6663
}
@@ -137,11 +134,11 @@ impl AsModel for ParallelGateway {
137134
&mut self,
138135
_uniform_rng: &mut UniformRNG,
139136
incoming_message: ModelMessage,
137+
global_time: f64,
140138
) -> Result<Vec<ModelMessage>, SimulationError> {
141139
// Possible metrics updates
142140
if self.need_snapshot_metrics() {
143-
self.snapshot.last_arrival =
144-
Some((incoming_message.content.clone(), self.state.global_time));
141+
self.snapshot.last_arrival = Some((incoming_message.content.clone(), global_time));
145142
}
146143
if self.need_historical_metrics() {
147144
self.history.push(self.snapshot.clone());
@@ -165,6 +162,7 @@ impl AsModel for ParallelGateway {
165162
fn events_int(
166163
&mut self,
167164
_uniform_rng: &mut UniformRNG,
165+
global_time: f64,
168166
) -> Result<Vec<ModelMessage>, SimulationError> {
169167
let mut outgoing_messages: Vec<ModelMessage> = Vec::new();
170168
let events = self.state.event_list.clone();
@@ -200,7 +198,7 @@ impl AsModel for ParallelGateway {
200198
// Possible metrics updates
201199
if self.need_snapshot_metrics() {
202200
self.snapshot.last_departure =
203-
Some((completed_collection, self.state.global_time));
201+
Some((completed_collection, global_time));
204202
}
205203
if self.need_historical_metrics() {
206204
self.history.push(self.snapshot.clone());

src/models/processor.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,6 @@ struct State {
6161
until_job_completion: f64,
6262
queue: Vec<String>,
6363
phase: Phase,
64-
#[serde(default)]
65-
global_time: f64,
6664
}
6765

6866
impl Default for State {
@@ -76,7 +74,6 @@ impl Default for State {
7674
until_job_completion: INFINITY,
7775
queue: Vec::new(),
7876
phase: Phase::Passive,
79-
global_time: 0.0,
8077
}
8178
}
8279
}
@@ -174,6 +171,7 @@ impl AsModel for Processor {
174171
&mut self,
175172
_uniform_rng: &mut UniformRNG,
176173
incoming_message: ModelMessage,
174+
global_time: f64,
177175
) -> Result<Vec<ModelMessage>, SimulationError> {
178176
let mut outgoing_messages: Vec<ModelMessage> = Vec::new();
179177
let incoming_port: String = incoming_message.port_name;
@@ -183,8 +181,7 @@ impl AsModel for Processor {
183181
// Possible metrics updates
184182
if self.need_snapshot_metrics() {
185183
self.snapshot.queue_size = self.state.queue.len();
186-
self.snapshot.last_arrival =
187-
Some((incoming_message.content, self.state.global_time));
184+
self.snapshot.last_arrival = Some((incoming_message.content, global_time));
188185
}
189186
if self.need_historical_metrics() {
190187
self.history.push(self.snapshot.clone());
@@ -241,6 +238,7 @@ impl AsModel for Processor {
241238
fn events_int(
242239
&mut self,
243240
uniform_rng: &mut UniformRNG,
241+
global_time: f64,
244242
) -> Result<Vec<ModelMessage>, SimulationError> {
245243
let mut outgoing_messages: Vec<ModelMessage> = Vec::new();
246244
let events = self.state.event_list.clone();
@@ -284,7 +282,7 @@ impl AsModel for Processor {
284282
.first()
285283
.ok_or_else(|| SimulationError::InvalidModelState)?
286284
.to_string(),
287-
self.state.global_time,
285+
global_time,
288286
));
289287
self.snapshot.is_utilized = true;
290288
}
@@ -304,7 +302,7 @@ impl AsModel for Processor {
304302
.first()
305303
.ok_or_else(|| SimulationError::InvalidModelState)?
306304
.to_string(),
307-
self.state.global_time,
305+
global_time,
308306
));
309307
}
310308
// Use just the job ID from the input message - transform job type
@@ -351,7 +349,6 @@ impl AsModel for Processor {
351349
.for_each(|scheduled_event| {
352350
scheduled_event.time -= time_delta;
353351
});
354-
self.state.global_time += time_delta;
355352
}
356353

357354
fn until_next_event(&self) -> f64 {

0 commit comments

Comments
 (0)