add experiment5

This commit is contained in:
Youngjoon Lee 2024-08-18 10:25:07 +09:00
parent 21411d07d5
commit 0d9cabc329
No known key found for this signature in database
GPG Key ID: 167546E2D1712F8C
2 changed files with 89 additions and 11 deletions

View File

@ -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]
}
}
}

View File

@ -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() {