mirror of
https://github.com/logos-blockchain/logos-blockchain-simulations.git
synced 2026-01-15 19:43:10 +00:00
add experiment5
This commit is contained in:
parent
21411d07d5
commit
0d9cabc329
@ -1,6 +1,6 @@
|
||||
use std::error::Error;
|
||||
|
||||
use rand::{rngs::StdRng, RngCore, SeedableRng};
|
||||
use rand::{rngs::StdRng, seq::SliceRandom, RngCore, SeedableRng};
|
||||
use rustc_hash::FxHashMap;
|
||||
|
||||
use crate::{
|
||||
@ -37,9 +37,12 @@ pub fn run_iteration(paramset: ParamSet, seed: u64, out_csv_path: &str, topology
|
||||
});
|
||||
}
|
||||
|
||||
// It's okay to choose the first `num_senders` nodes as senders
|
||||
// because the topology is randomly generated.
|
||||
let sender_ids: Vec<NodeId> = (0..paramset.num_senders).collect();
|
||||
let mut sender_selector = SenderSelector::new(
|
||||
(0..paramset.num_nodes).collect(),
|
||||
paramset.num_senders,
|
||||
paramset.random_senders_every_time,
|
||||
seed,
|
||||
);
|
||||
|
||||
// To generate unique message IDs
|
||||
let mut next_msg_id: MessageId = 0;
|
||||
@ -74,7 +77,7 @@ pub fn run_iteration(paramset: ParamSet, seed: u64, out_csv_path: &str, topology
|
||||
|
||||
send_messages(
|
||||
vtime,
|
||||
&sender_ids,
|
||||
sender_selector.next(),
|
||||
&mut nodes,
|
||||
&mut next_msg_id,
|
||||
&mut message_tracker,
|
||||
@ -170,3 +173,38 @@ fn save_topology(topology: &Topology, topology_path: &str) -> Result<(), Box<dyn
|
||||
wtr.flush()?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
struct SenderSelector {
|
||||
candidates: Vec<NodeId>,
|
||||
num_senders: usize,
|
||||
random_senders_every_time: bool,
|
||||
rng: StdRng,
|
||||
}
|
||||
|
||||
impl SenderSelector {
|
||||
fn new(
|
||||
candidates: Vec<NodeId>,
|
||||
num_senders: u16,
|
||||
random_senders_every_time: bool,
|
||||
seed: u64,
|
||||
) -> Self {
|
||||
assert!(candidates.len() >= num_senders as usize);
|
||||
Self {
|
||||
candidates,
|
||||
num_senders: num_senders as usize,
|
||||
random_senders_every_time,
|
||||
rng: StdRng::seed_from_u64(seed),
|
||||
}
|
||||
}
|
||||
|
||||
fn next(&mut self) -> &[NodeId] {
|
||||
if !self.random_senders_every_time {
|
||||
// It's okay to pick the first `num_senders` nodes
|
||||
// because the topology is randomly generated.
|
||||
&self.candidates[..self.num_senders]
|
||||
} else {
|
||||
self.candidates.shuffle(&mut self.rng);
|
||||
&self.candidates[..self.num_senders]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -7,6 +7,7 @@ pub enum ExperimentId {
|
||||
Experiment2 = 2,
|
||||
Experiment3 = 3,
|
||||
Experiment4 = 4,
|
||||
Experiment5 = 5,
|
||||
}
|
||||
|
||||
impl std::str::FromStr for ExperimentId {
|
||||
@ -18,6 +19,7 @@ impl std::str::FromStr for ExperimentId {
|
||||
"2" | "Experiment2" => Ok(ExperimentId::Experiment2),
|
||||
"3" | "Experiment3" => Ok(ExperimentId::Experiment3),
|
||||
"4" | "Experiment4" => Ok(ExperimentId::Experiment4),
|
||||
"5" | "Experiment5" => Ok(ExperimentId::Experiment5),
|
||||
_ => Err(format!("Invalid experiment ID: {}", s)),
|
||||
}
|
||||
}
|
||||
@ -52,6 +54,7 @@ pub const PARAMSET_CSV_COLUMNS: &[&str] = &[
|
||||
"transmission_rate",
|
||||
"num_sent_msgs",
|
||||
"num_senders",
|
||||
"random_senders_every_time",
|
||||
"queue_type",
|
||||
"num_iterations",
|
||||
];
|
||||
@ -65,6 +68,7 @@ pub struct ParamSet {
|
||||
pub transmission_rate: u16,
|
||||
pub num_sent_msgs: u16,
|
||||
pub num_senders: u16,
|
||||
pub random_senders_every_time: bool,
|
||||
pub queue_type: QueueType,
|
||||
pub num_iterations: u16,
|
||||
}
|
||||
@ -91,14 +95,19 @@ impl ParamSet {
|
||||
let transmission_rate_list = &[num_nodes / 2, num_nodes, num_nodes * 2];
|
||||
let num_sent_msgs_list = |_| match exp_id {
|
||||
ExperimentId::Experiment1 | ExperimentId::Experiment3 => vec![1],
|
||||
ExperimentId::Experiment2 | ExperimentId::Experiment4 => vec![8, 16, 32],
|
||||
ExperimentId::Experiment2
|
||||
| ExperimentId::Experiment4
|
||||
| ExperimentId::Experiment5 => vec![8, 16, 32],
|
||||
};
|
||||
let num_senders_list = match exp_id {
|
||||
ExperimentId::Experiment1 | ExperimentId::Experiment2 => vec![1],
|
||||
ExperimentId::Experiment3 | ExperimentId::Experiment4 => {
|
||||
ExperimentId::Experiment3
|
||||
| ExperimentId::Experiment4
|
||||
| ExperimentId::Experiment5 => {
|
||||
vec![num_nodes / 10, num_nodes / 5, num_nodes / 2]
|
||||
}
|
||||
};
|
||||
let random_senders_every_time = exp_id == ExperimentId::Experiment5;
|
||||
let num_iterations = num_nodes / 2;
|
||||
|
||||
let (mut new_paramsets, next_start_id) = Self::new_paramsets(
|
||||
@ -109,6 +118,7 @@ impl ParamSet {
|
||||
transmission_rate_list,
|
||||
num_sent_msgs_list,
|
||||
num_senders_list.as_slice(),
|
||||
random_senders_every_time,
|
||||
queue_type,
|
||||
num_iterations,
|
||||
);
|
||||
@ -127,16 +137,21 @@ impl ParamSet {
|
||||
let transmission_rate_list = &[1, 10, 100];
|
||||
let num_sent_msgs_list = |min_queue_size| match exp_id {
|
||||
ExperimentId::Experiment1 | ExperimentId::Experiment3 => vec![1],
|
||||
ExperimentId::Experiment2 | ExperimentId::Experiment4 => {
|
||||
ExperimentId::Experiment2
|
||||
| ExperimentId::Experiment4
|
||||
| ExperimentId::Experiment5 => {
|
||||
vec![min_queue_size / 2, min_queue_size, min_queue_size * 2]
|
||||
}
|
||||
};
|
||||
let num_senders_list = match exp_id {
|
||||
ExperimentId::Experiment1 | ExperimentId::Experiment2 => vec![1],
|
||||
ExperimentId::Experiment3 | ExperimentId::Experiment4 => {
|
||||
ExperimentId::Experiment3
|
||||
| ExperimentId::Experiment4
|
||||
| ExperimentId::Experiment5 => {
|
||||
vec![num_nodes / 10, num_nodes / 5, num_nodes / 2]
|
||||
}
|
||||
};
|
||||
let random_senders_every_time = exp_id == ExperimentId::Experiment5;
|
||||
let num_iterations = 20;
|
||||
|
||||
let (mut new_paramsets, next_start_id) = Self::new_paramsets(
|
||||
@ -147,6 +162,7 @@ impl ParamSet {
|
||||
transmission_rate_list,
|
||||
num_sent_msgs_list,
|
||||
num_senders_list.as_slice(),
|
||||
random_senders_every_time,
|
||||
queue_type,
|
||||
num_iterations,
|
||||
);
|
||||
@ -165,14 +181,19 @@ impl ParamSet {
|
||||
let transmission_rate_list = &[1];
|
||||
let num_sent_msgs_list = |_| match exp_id {
|
||||
ExperimentId::Experiment1 | ExperimentId::Experiment3 => vec![1],
|
||||
ExperimentId::Experiment2 | ExperimentId::Experiment4 => vec![1000],
|
||||
ExperimentId::Experiment2
|
||||
| ExperimentId::Experiment4
|
||||
| ExperimentId::Experiment5 => vec![1000],
|
||||
};
|
||||
let num_senders_list = match exp_id {
|
||||
ExperimentId::Experiment1 | ExperimentId::Experiment2 => vec![1],
|
||||
ExperimentId::Experiment3 | ExperimentId::Experiment4 => {
|
||||
ExperimentId::Experiment3
|
||||
| ExperimentId::Experiment4
|
||||
| ExperimentId::Experiment5 => {
|
||||
vec![num_nodes / 10, num_nodes / 5, num_nodes / 2]
|
||||
}
|
||||
};
|
||||
let random_senders_every_time = exp_id == ExperimentId::Experiment5;
|
||||
let num_iterations = 20;
|
||||
|
||||
let (mut new_paramsets, next_start_id) = Self::new_paramsets(
|
||||
@ -183,6 +204,7 @@ impl ParamSet {
|
||||
transmission_rate_list,
|
||||
num_sent_msgs_list,
|
||||
num_senders_list.as_slice(),
|
||||
random_senders_every_time,
|
||||
queue_type,
|
||||
num_iterations,
|
||||
);
|
||||
@ -201,6 +223,7 @@ impl ParamSet {
|
||||
transmission_rate_list: &[u16],
|
||||
num_sent_msgs_list: impl Fn(u16) -> Vec<u16>,
|
||||
num_senders_list: &[u16],
|
||||
random_senders_every_time: bool,
|
||||
queue_type: QueueType,
|
||||
num_iterations: u16,
|
||||
) -> (Vec<ParamSet>, u16) {
|
||||
@ -225,6 +248,7 @@ impl ParamSet {
|
||||
transmission_rate,
|
||||
num_sent_msgs,
|
||||
num_senders,
|
||||
random_senders_every_time,
|
||||
queue_type,
|
||||
num_iterations,
|
||||
});
|
||||
@ -255,6 +279,7 @@ impl ParamSet {
|
||||
self.transmission_rate.to_string(),
|
||||
self.num_sent_msgs.to_string(),
|
||||
self.num_senders.to_string(),
|
||||
self.random_senders_every_time.to_string(),
|
||||
format!("{:?}", self.queue_type),
|
||||
self.num_iterations.to_string(),
|
||||
]
|
||||
@ -289,6 +314,10 @@ mod tests {
|
||||
(ExperimentId::Experiment4, SessionId::Session1),
|
||||
3u32.pow(6),
|
||||
),
|
||||
(
|
||||
(ExperimentId::Experiment5, SessionId::Session1),
|
||||
3u32.pow(6),
|
||||
),
|
||||
(
|
||||
(ExperimentId::Experiment1, SessionId::Session2),
|
||||
3u32.pow(4),
|
||||
@ -297,6 +326,10 @@ mod tests {
|
||||
(ExperimentId::Experiment4, SessionId::Session2),
|
||||
3u32.pow(6),
|
||||
),
|
||||
(
|
||||
(ExperimentId::Experiment5, SessionId::Session2),
|
||||
3u32.pow(6),
|
||||
),
|
||||
(
|
||||
(ExperimentId::Experiment1, SessionId::Session2_1),
|
||||
3u32.pow(3),
|
||||
@ -305,6 +338,10 @@ mod tests {
|
||||
(ExperimentId::Experiment4, SessionId::Session2_1),
|
||||
3u32.pow(4),
|
||||
),
|
||||
(
|
||||
(ExperimentId::Experiment5, SessionId::Session2_1),
|
||||
3u32.pow(4),
|
||||
),
|
||||
];
|
||||
|
||||
for queue_type in QueueType::iter() {
|
||||
@ -338,10 +375,13 @@ mod tests {
|
||||
(ExperimentId::Experiment2, SessionId::Session1),
|
||||
(ExperimentId::Experiment3, SessionId::Session1),
|
||||
(ExperimentId::Experiment4, SessionId::Session1),
|
||||
(ExperimentId::Experiment5, SessionId::Session1),
|
||||
(ExperimentId::Experiment1, SessionId::Session2),
|
||||
(ExperimentId::Experiment4, SessionId::Session2),
|
||||
(ExperimentId::Experiment5, SessionId::Session2),
|
||||
(ExperimentId::Experiment1, SessionId::Session2_1),
|
||||
(ExperimentId::Experiment4, SessionId::Session2_1),
|
||||
(ExperimentId::Experiment5, SessionId::Session2_1),
|
||||
];
|
||||
|
||||
for (exp_id, session_id) in cases.into_iter() {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user