From 0d9cabc329379ffbfd152bd9110b8f441006836c Mon Sep 17 00:00:00 2001 From: Youngjoon Lee <5462944+youngjoon-lee@users.noreply.github.com> Date: Sun, 18 Aug 2024 10:25:07 +0900 Subject: [PATCH] add experiment5 --- mixnet-rs/dissemination/src/iteration.rs | 48 +++++++++++++++++++--- mixnet-rs/dissemination/src/paramset.rs | 52 +++++++++++++++++++++--- 2 files changed, 89 insertions(+), 11 deletions(-) diff --git a/mixnet-rs/dissemination/src/iteration.rs b/mixnet-rs/dissemination/src/iteration.rs index b1e3291..feb184e 100644 --- a/mixnet-rs/dissemination/src/iteration.rs +++ b/mixnet-rs/dissemination/src/iteration.rs @@ -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 = (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, + num_senders: usize, + random_senders_every_time: bool, + rng: StdRng, +} + +impl SenderSelector { + fn new( + candidates: Vec, + 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] + } + } +} diff --git a/mixnet-rs/dissemination/src/paramset.rs b/mixnet-rs/dissemination/src/paramset.rs index bfa675b..47c1362 100644 --- a/mixnet-rs/dissemination/src/paramset.rs +++ b/mixnet-rs/dissemination/src/paramset.rs @@ -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, num_senders_list: &[u16], + random_senders_every_time: bool, queue_type: QueueType, num_iterations: u16, ) -> (Vec, 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() {