Skip to content

Commit f9f9a6c

Browse files
committed
Integrate SimX (https://github.com/ndebuhr/simx) into the core sim repository, as a workspace member
1 parent 18da9f3 commit f9f9a6c

25 files changed

+471
-9
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ jobs:
3131
key: ${{ runner.os }}-cargo-${{ matrix.rust }}-${{ hashFiles('./sim/Cargo.lock') }}
3232
- name: Run Tests
3333
working-directory: ./sim
34-
run: cargo test
34+
run: cargo test --all-features -- --nocapture
3535

3636
wasm-pack:
3737
name: Test (wasm)

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
/target
33
/sim/target
44
/sim_derive/target
5+
/simx/target
56

67
**/*.rs.bk
78

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
members = [
33
"sim",
44
"sim_derive",
5+
"simx",
56
]

sim/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ serde = { version = "1.0", features = ["derive"] }
2929
serde_json = "1.0"
3030
serde_yaml = "0.8"
3131
sim_derive = { version = "0.10", path = "../sim_derive" }
32+
simx = { version = "0.10", path = "../simx", optional = true }
3233
thiserror = "1.0"
3334
wasm-bindgen = "0.2"
3435
web-sys = { version = "0.3", features = [ "console" ] }

sim/src/models/batcher.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ use crate::utils::errors::SimulationError;
99

1010
use sim_derive::SerializableModel;
1111

12+
#[cfg(feature = "simx")]
13+
use simx::event_rules;
14+
1215
/// The batching process begins when the batcher receives a job. It will
1316
/// then accept additional jobs, adding them to a batch with the first job,
1417
/// until a max batching time or max batch size is reached - whichever comes
@@ -70,6 +73,7 @@ enum Phase {
7073
Release, // Releasing a batch
7174
}
7275

76+
#[cfg_attr(feature = "simx", event_rules)]
7377
impl Batcher {
7478
pub fn new(
7579
job_in_port: String,
@@ -209,6 +213,7 @@ impl Batcher {
209213
}
210214
}
211215

216+
#[cfg_attr(feature = "simx", event_rules)]
212217
impl DevsModel for Batcher {
213218
fn events_ext(
214219
&mut self,

sim/src/models/exclusive_gateway.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ use crate::utils::errors::SimulationError;
1010

1111
use sim_derive::SerializableModel;
1212

13+
#[cfg(feature = "simx")]
14+
use simx::event_rules;
15+
1316
/// The exclusive gateway splits a process flow into a set of possible paths.
1417
/// The process will only follow one of the possible paths. Path selection is
1518
/// determined by Weighted Index distribution random variates, so this atomic
@@ -65,6 +68,7 @@ enum Phase {
6568
Pass, // Passing a job from input to output
6669
}
6770

71+
#[cfg_attr(feature = "simx", event_rules)]
6872
impl ExclusiveGateway {
6973
pub fn new(
7074
flow_paths_in: Vec<String>,
@@ -145,6 +149,7 @@ impl ExclusiveGateway {
145149
}
146150
}
147151

152+
#[cfg_attr(feature = "simx", event_rules)]
148153
impl DevsModel for ExclusiveGateway {
149154
fn events_ext(
150155
&mut self,

sim/src/models/gate.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ use crate::utils::errors::SimulationError;
99

1010
use sim_derive::SerializableModel;
1111

12+
#[cfg(feature = "simx")]
13+
use simx::event_rules;
14+
1215
/// The gate model passes or blocks jobs, when it is in the open or closed
1316
/// state, respectively. The gate can be opened and closed throughout the
1417
/// course of a simulation. This model contains no stochastic behavior - job
@@ -73,6 +76,7 @@ enum Phase {
7376
Pass,
7477
}
7578

79+
#[cfg_attr(feature = "simx", event_rules)]
7680
impl Gate {
7781
pub fn new(
7882
job_in_port: String,
@@ -193,6 +197,7 @@ impl Gate {
193197
}
194198
}
195199

200+
#[cfg_attr(feature = "simx", event_rules)]
196201
impl DevsModel for Gate {
197202
fn events_ext(
198203
&mut self,

sim/src/models/generator.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ use crate::utils::errors::SimulationError;
99

1010
use sim_derive::SerializableModel;
1111

12+
#[cfg(feature = "simx")]
13+
use simx::event_rules;
14+
1215
/// The generator produces jobs based on a configured interarrival
1316
/// distribution. A normalized thinning function is used to enable
1417
/// non-stationary job generation. For non-stochastic generation of jobs, a
@@ -69,6 +72,7 @@ enum Phase {
6972
Generating,
7073
}
7174

75+
#[cfg_attr(feature = "simx", event_rules)]
7276
impl Generator {
7377
pub fn new(
7478
message_interdeparture_time: ContinuousRandomVariable,
@@ -137,6 +141,7 @@ impl Generator {
137141
}
138142
}
139143

144+
#[cfg_attr(feature = "simx", event_rules)]
140145
impl DevsModel for Generator {
141146
fn events_ext(
142147
&mut self,

sim/src/models/load_balancer.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ use crate::utils::errors::SimulationError;
99

1010
use sim_derive::SerializableModel;
1111

12+
#[cfg(feature = "simx")]
13+
use simx::event_rules;
14+
1215
/// The load balancer routes jobs to a set of possible process paths, using a
1316
/// round robin strategy. There is no stochastic behavior in this model.
1417
#[derive(Debug, Clone, Serialize, Deserialize, SerializableModel)]
@@ -61,6 +64,7 @@ enum Phase {
6164
LoadBalancing,
6265
}
6366

67+
#[cfg_attr(feature = "simx", event_rules)]
6468
impl LoadBalancer {
6569
pub fn new(job_port: String, flow_path_ports: Vec<String>, store_records: bool) -> Self {
6670
Self {
@@ -124,6 +128,7 @@ impl LoadBalancer {
124128
}
125129
}
126130

131+
#[cfg_attr(feature = "simx", event_rules)]
127132
impl DevsModel for LoadBalancer {
128133
fn events_ext(
129134
&mut self,
@@ -137,10 +142,9 @@ impl DevsModel for LoadBalancer {
137142
&mut self,
138143
services: &mut Services,
139144
) -> Result<Vec<ModelMessage>, SimulationError> {
140-
if self.state.jobs.is_empty() {
141-
self.passivate()
142-
} else {
143-
self.send_job(services)
145+
match self.state.jobs.len() {
146+
0 => self.passivate(),
147+
_ => self.send_job(services),
144148
}
145149
}
146150

sim/src/models/model.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,16 @@ impl DevsModel for Model {
7474
fn until_next_event(&self) -> f64 {
7575
self.inner.until_next_event()
7676
}
77+
78+
#[cfg(feature = "simx")]
79+
fn event_rules_scheduling(&self) -> &str {
80+
self.inner.event_rules_scheduling()
81+
}
82+
83+
#[cfg(feature = "simx")]
84+
fn event_rules(&self) -> String {
85+
self.inner.event_rules()
86+
}
7787
}
7888

7989
impl Reportable for Model {

0 commit comments

Comments
 (0)