mirror of
https://github.com/logos-blockchain/logos-blockchain-simulations.git
synced 2026-01-05 22:53:10 +00:00
add NoisyCoinFlippingRandomRelease
This commit is contained in:
parent
8074e6aa09
commit
240f76881d
@ -10,6 +10,7 @@ pub enum QueueType {
|
|||||||
PureRandomSampling,
|
PureRandomSampling,
|
||||||
PermutedCoinFlipping,
|
PermutedCoinFlipping,
|
||||||
NoisyCoinFlipping,
|
NoisyCoinFlipping,
|
||||||
|
NoisyCoinFlippingRandomRelease,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::str::FromStr for QueueType {
|
impl std::str::FromStr for QueueType {
|
||||||
@ -22,6 +23,7 @@ impl std::str::FromStr for QueueType {
|
|||||||
"PureRandomSampling" => Ok(QueueType::PureRandomSampling),
|
"PureRandomSampling" => Ok(QueueType::PureRandomSampling),
|
||||||
"PermutedCoinFlipping" => Ok(QueueType::PermutedCoinFlipping),
|
"PermutedCoinFlipping" => Ok(QueueType::PermutedCoinFlipping),
|
||||||
"NoisyCoinFlipping" => Ok(QueueType::NoisyCoinFlipping),
|
"NoisyCoinFlipping" => Ok(QueueType::NoisyCoinFlipping),
|
||||||
|
"NoisyCoinFlippingRandomRelease" => Ok(QueueType::NoisyCoinFlippingRandomRelease),
|
||||||
_ => Err(format!("Unknown queue type: {}", s)),
|
_ => Err(format!("Unknown queue type: {}", s)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -51,6 +53,9 @@ pub fn new_queue<T: 'static + Copy>(cfg: &QueueConfig) -> Box<dyn Queue<T>> {
|
|||||||
Box::new(PermutedCoinFlippingQueue::new(cfg.min_queue_size, cfg.seed))
|
Box::new(PermutedCoinFlippingQueue::new(cfg.min_queue_size, cfg.seed))
|
||||||
}
|
}
|
||||||
QueueType::NoisyCoinFlipping => Box::new(NoisyCoinFlippingQueue::new(cfg.seed)),
|
QueueType::NoisyCoinFlipping => Box::new(NoisyCoinFlippingQueue::new(cfg.seed)),
|
||||||
|
QueueType::NoisyCoinFlippingRandomRelease => {
|
||||||
|
Box::new(NoisyCoinFlippingRandomReleaseQueue::new(cfg.seed))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -288,6 +293,37 @@ impl<T: Copy> Queue<T> for NoisyCoinFlippingQueue<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct NoisyCoinFlippingRandomReleaseQueue<T: Copy> {
|
||||||
|
queue: MixQueue<T>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Copy> NoisyCoinFlippingRandomReleaseQueue<T> {
|
||||||
|
pub fn new(seed: u64) -> Self {
|
||||||
|
Self {
|
||||||
|
queue: MixQueue::new(0, seed),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Copy> Queue<T> for NoisyCoinFlippingRandomReleaseQueue<T> {
|
||||||
|
fn push(&mut self, msg: T) {
|
||||||
|
self.queue.push(msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn pop(&mut self) -> Option<T> {
|
||||||
|
if self.queue.len() == 0 {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.queue.flip_coin() {
|
||||||
|
let i = self.queue.sample_index();
|
||||||
|
self.queue.pop(i)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
@ -328,6 +364,7 @@ mod tests {
|
|||||||
QueueType::PureRandomSampling,
|
QueueType::PureRandomSampling,
|
||||||
QueueType::PermutedCoinFlipping,
|
QueueType::PermutedCoinFlipping,
|
||||||
QueueType::NoisyCoinFlipping,
|
QueueType::NoisyCoinFlipping,
|
||||||
|
QueueType::NoisyCoinFlippingRandomRelease,
|
||||||
] {
|
] {
|
||||||
test_mix_queue(queue_type);
|
test_mix_queue(queue_type);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user