use std::cell::Cell;
use crate::snowman::snowball::{self, unary};
use avalanche_types::ids::{bag::Bag, bits, Id};
#[derive(Clone, Debug)]
pub struct Tree {
pub parameters: crate::Parameters,
pub node: Box<snowball::Node>,
pub should_reset: Cell<bool>,
}
impl Tree {
pub fn new(parameters: crate::Parameters, choice: Id) -> Self {
let beta_virtuous = parameters.beta_virtuous as i64;
let unary_snowball = unary::Snowball::new(beta_virtuous);
let u = unary::node::Node {
parameters: parameters.clone(),
snowball: unary_snowball,
preference: Cell::new(choice),
decided_prefix: Cell::new(0),
common_prefix: Cell::new(bits::NUM_BITS as i64),
should_reset: Cell::new(false),
child: None,
};
Self {
parameters,
node: Box::new(snowball::Node::Unary(u)),
should_reset: Cell::new(false),
}
}
pub fn parameters(&self) -> crate::Parameters {
self.parameters.clone()
}
pub fn preference(&self) -> Id {
self.node.preference()
}
pub fn decided_prefix(&self) -> i64 {
self.node.decided_prefix()
}
pub fn finalized(&self) -> bool {
self.node.finalized()
}
pub fn add(&mut self, new_choice: &Id) {
if !bits::equal_subset(
0,
self.decided_prefix() as usize,
&self.preference(),
new_choice,
) {
return;
}
let added_node = self.node.add(new_choice);
self.node = Box::new(added_node);
}
pub fn record_poll(&mut self, votes: &Bag) -> bool {
let decided_prefix = self.decided_prefix();
let filtered_votes = votes.filter(0, decided_prefix as usize, &self.preference());
let (polled_node, successful) = self
.node
.record_poll(filtered_votes, self.should_reset.get());
self.node = Box::new(polled_node);
self.should_reset.set(false);
return successful;
}
pub fn record_unsuccessful_poll(&self) {
self.should_reset.set(true);
}
}
impl std::fmt::Display for Tree {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut prefixes: Vec<String> = vec![String::new()];
let mut nodes: Vec<snowball::Node> = vec![*self.node.clone()];
while let Some(prefix) = prefixes.pop() {
write!(f, "{}", prefix)?;
let new_prefix = format!("{} ", prefix);
match nodes.pop().unwrap() {
snowball::Node::Unary(n) => {
writeln!(f, "{}", n)?;
if n.child.is_some() {
prefixes.push(new_prefix);
nodes.push(*n.child.as_ref().unwrap().clone());
}
}
snowball::Node::Binary(n) => {
writeln!(f, "{}", n)?;
if n.child0.is_some() {
prefixes.push(new_prefix.clone());
prefixes.push(new_prefix);
nodes.push(*n.child1.as_ref().unwrap().clone());
nodes.push(*n.child0.as_ref().unwrap().clone());
}
}
}
}
Ok(())
}
}
#[test]
fn test_tree_snowball_singletone() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
let red = Id::empty().prefix(&[0]).unwrap();
let blue = Id::empty().prefix(&[1]).unwrap();
let mut tree = Tree::new(
crate::Parameters {
k: 1,
alpha: 1,
beta_virtuous: 2,
beta_rogue: 5,
..Default::default()
},
red.clone(),
);
assert_eq!(tree.finalized(), false);
let one_red = Bag::new();
one_red.add_count(&red, 1);
assert_eq!(tree.record_poll(&one_red), true);
assert_eq!(tree.finalized(), false);
let empty = Bag::new();
assert_eq!(tree.record_poll(&empty), false);
assert_eq!(tree.finalized(), false);
assert_eq!(tree.record_poll(&one_red), true);
assert_eq!(tree.finalized(), false);
assert_eq!(tree.record_poll(&one_red), true);
assert_eq!(tree.preference(), red);
assert_eq!(tree.finalized(), true);
tree.add(&blue);
let one_blue = Bag::new();
one_blue.add_count(&blue, 1);
tree.record_poll(&one_blue);
assert_eq!(tree.preference(), red);
assert_eq!(tree.finalized(), true);
}
#[test]
fn test_tree_snowball_record_unsuccessful_poll() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
let red = Id::empty().prefix(&[0]).unwrap();
let mut tree = Tree::new(
crate::Parameters {
k: 1,
alpha: 1,
beta_virtuous: 3,
beta_rogue: 5,
..Default::default()
},
red.clone(),
);
assert_eq!(tree.finalized(), false);
let one_red = Bag::new();
one_red.add_count(&red, 1);
assert_eq!(tree.record_poll(&one_red), true);
assert_eq!(tree.finalized(), false);
tree.record_unsuccessful_poll();
assert_eq!(tree.record_poll(&one_red), true);
assert_eq!(tree.finalized(), false);
assert_eq!(tree.record_poll(&one_red), true);
assert_eq!(tree.finalized(), false);
assert_eq!(tree.record_poll(&one_red), true);
assert_eq!(tree.preference(), red);
assert_eq!(tree.finalized(), true);
}
#[test]
fn test_tree_snowball_binary() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
let red = Id::empty().prefix(&[0]).unwrap();
let blue = Id::empty().prefix(&[1]).unwrap();
let mut tree = Tree::new(
crate::Parameters {
k: 1,
alpha: 1,
beta_virtuous: 1,
beta_rogue: 2,
..Default::default()
},
red.clone(),
);
assert_eq!(tree.finalized(), false);
tree.add(&blue);
assert_eq!(tree.preference(), red);
assert_eq!(tree.finalized(), false);
let one_blue = Bag::new();
one_blue.add_count(&blue, 1);
assert_eq!(tree.record_poll(&one_blue), true);
assert_eq!(tree.preference(), blue);
assert_eq!(tree.finalized(), false);
let one_red = Bag::new();
one_red.add_count(&red, 1);
assert_eq!(tree.record_poll(&one_red), true);
assert_eq!(tree.preference(), blue);
assert_eq!(tree.finalized(), false);
assert_eq!(tree.record_poll(&one_blue), true);
assert_eq!(tree.preference(), blue);
assert_eq!(tree.finalized(), false);
assert_eq!(tree.record_poll(&one_blue), true);
assert_eq!(tree.preference(), blue);
assert_eq!(tree.finalized(), true);
}
#[test]
fn test_tree_snowball_last_binary() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
let zero = Id::empty();
let one = Id::from_slice(&[
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80,
]);
let mut tree = Tree::new(
crate::Parameters {
k: 1,
alpha: 1,
beta_virtuous: 2,
beta_rogue: 2,
..Default::default()
},
zero.clone(),
);
assert_eq!(tree.finalized(), false);
tree.add(&one);
tree.add(&one); assert_eq!(tree.preference(), zero);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(tree.to_string(), "SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [0, 255)
SB(Preference = 0, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 255
");
let one_bag = Bag::new();
one_bag.add_count(&one, 1);
assert_eq!(tree.record_poll(&one_bag), true);
assert_eq!(tree.preference(), one);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(tree.to_string(), "SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = false)) Bits = [0, 255)
SB(Preference = 1, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 255
");
assert_eq!(tree.record_poll(&one_bag), true);
assert_eq!(tree.preference(), one);
assert_eq!(tree.finalized(), true);
log::info!("{}", tree);
assert_eq!(tree.to_string(), "SB(Preference = 1, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 2, SF(Confidence = 2, Finalized = true, SL(Preference = 1))) Bit = 255
");
}
#[test]
fn test_tree_snowball_add_previously_rejected() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
let zero = Id::from_slice(&[0b00000000]);
let one = Id::from_slice(&[0b00000001]);
let two = Id::from_slice(&[0b00000010]);
let four = Id::from_slice(&[0b00000100]);
let mut tree = Tree::new(
crate::Parameters {
k: 1,
alpha: 1,
beta_virtuous: 1,
beta_rogue: 2,
..Default::default()
},
zero.clone(),
);
assert_eq!(tree.finalized(), false);
tree.add(&one);
tree.add(&four);
assert_eq!(tree.preference(), zero);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(tree.to_string(), "SB(Preference = 0, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 2)
SB(Preference = 0, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 2
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
");
let zero_bag = Bag::new();
zero_bag.add_count(&zero, 1);
assert_eq!(tree.record_poll(&zero_bag), true);
assert_eq!(tree.preference(), zero);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(tree.to_string(), "SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0
SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 2
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = true)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
");
tree.add(&two);
assert_eq!(tree.preference(), zero);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(tree.to_string(), "SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0
SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 2
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = true)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
");
}
#[test]
fn test_tree_snowball_new_unary() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
let zero = Id::from_slice(&[0b00000000]);
let one = Id::from_slice(&[0b00000001]);
let mut tree = Tree::new(
crate::Parameters {
k: 1,
alpha: 1,
beta_virtuous: 2,
beta_rogue: 3,
..Default::default()
},
zero.clone(),
);
assert_eq!(tree.finalized(), false);
tree.add(&one);
assert_eq!(tree.preference(), zero);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(tree.to_string(), "SB(Preference = 0, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
");
let one_bag = Bag::new();
one_bag.add_count(&one, 1);
assert_eq!(tree.record_poll(&one_bag), true);
assert_eq!(tree.preference(), one);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(tree.to_string(), "SB(Preference = 1, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 0
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = false)) Bits = [1, 256)
");
assert_eq!(tree.record_poll(&one_bag), true);
assert_eq!(tree.preference(), one);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(tree.to_string(), "SB(Preference = 1, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 2, SF(Confidence = 2, Finalized = false, SL(Preference = 1))) Bit = 0
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
SB(NumSuccessfulPolls = 2, SF(Confidence = 2, Finalized = true)) Bits = [1, 256)
");
assert_eq!(tree.record_poll(&one_bag), true);
assert_eq!(tree.preference(), one);
assert_eq!(tree.finalized(), true);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(NumSuccessfulPolls = 3, SF(Confidence = 3, Finalized = true)) Bits = [1, 256)
"
);
}
#[test]
fn test_tree_snowball_transitive_reset() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
let zero = Id::from_slice(&[0b00000000]);
let two = Id::from_slice(&[0b00000010]);
let eight = Id::from_slice(&[0b00001000]);
let mut tree = Tree::new(
crate::Parameters {
k: 1,
alpha: 1,
beta_virtuous: 2,
beta_rogue: 2,
..Default::default()
},
zero.clone(),
);
assert_eq!(tree.finalized(), false);
tree.add(&two);
tree.add(&eight);
assert_eq!(tree.preference(), zero);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [0, 1)
SB(Preference = 0, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 1
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 3)
SB(Preference = 0, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 3
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [4, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [4, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)
"
);
let zero_bag = Bag::new();
zero_bag.add_count(&zero, 1);
assert_eq!(tree.record_poll(&zero_bag), true);
assert_eq!(tree.preference(), zero);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = false)) Bits = [0, 1)
SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 1
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 3)
SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 3
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = false)) Bits = [4, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [4, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)
"
);
let empty_bag = Bag::new();
assert_eq!(tree.record_poll(&empty_bag), false);
assert_eq!(tree.preference(), zero);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(NumSuccessfulPolls = 1, SF(Confidence = 0, Finalized = false)) Bits = [0, 1)
SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 1
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = false)) Bits = [2, 3)
SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 3
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = false)) Bits = [4, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [4, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)
"
);
assert_eq!(tree.record_poll(&zero_bag), true);
assert_eq!(tree.preference(), zero);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(NumSuccessfulPolls = 2, SF(Confidence = 1, Finalized = false)) Bits = [0, 1)
SB(Preference = 0, NumSuccessfulPolls[0] = 2, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 1
SB(NumSuccessfulPolls = 2, SF(Confidence = 1, Finalized = false)) Bits = [2, 3)
SB(Preference = 0, NumSuccessfulPolls[0] = 2, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 3
SB(NumSuccessfulPolls = 2, SF(Confidence = 1, Finalized = false)) Bits = [4, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [4, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)
"
);
assert_eq!(tree.record_poll(&zero_bag), true);
assert_eq!(tree.preference(), zero);
assert_eq!(tree.finalized(), true);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(NumSuccessfulPolls = 3, SF(Confidence = 2, Finalized = true)) Bits = [4, 256)
"
);
}
#[test]
fn test_tree_snowball_trinary() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
let red = Id::empty().prefix(&[0]).unwrap();
let blue = Id::empty().prefix(&[1]).unwrap();
let green = Id::empty().prefix(&[2]).unwrap();
let mut tree = Tree::new(
crate::Parameters {
k: 1,
alpha: 1,
beta_virtuous: 1,
beta_rogue: 2,
..Default::default()
},
green.clone(),
);
assert_eq!(tree.finalized(), false);
tree.add(&red);
tree.add(&blue);
assert_eq!(tree.preference(), green);
assert_eq!(tree.finalized(), false);
let red_bag = Bag::new();
red_bag.add_count(&red, 1);
assert_eq!(tree.record_poll(&red_bag), true);
assert_eq!(tree.preference(), red);
assert_eq!(tree.finalized(), false);
let blue_bag = Bag::new();
blue_bag.add_count(&blue, 1);
assert_eq!(tree.record_poll(&blue_bag), true);
assert_eq!(tree.preference(), red);
assert_eq!(tree.finalized(), false);
let green_bag = Bag::new();
green_bag.add_count(&green, 1);
assert_eq!(tree.record_poll(&green_bag), true);
assert_eq!(tree.preference(), blue);
assert_eq!(tree.finalized(), false);
assert_eq!(tree.record_poll(&red_bag), false);
assert_eq!(tree.preference(), blue);
assert_eq!(tree.finalized(), false);
assert_eq!(tree.record_poll(&green_bag), true);
assert_eq!(tree.preference(), green);
assert_eq!(tree.finalized(), false);
}
#[test]
fn test_tree_snowball_close_trinary() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
let yellow = Id::from_slice(&[0x01]);
let cyan = Id::from_slice(&[0x02]);
let magenta = Id::from_slice(&[0x03]);
let mut tree = Tree::new(
crate::Parameters {
k: 1,
alpha: 1,
beta_virtuous: 1,
beta_rogue: 2,
..Default::default()
},
yellow.clone(),
);
assert_eq!(tree.finalized(), false);
tree.add(&cyan);
tree.add(&magenta);
assert_eq!(tree.preference(), yellow);
assert_eq!(tree.finalized(), false);
let yellow_bag = Bag::new();
yellow_bag.add_count(&yellow, 1);
assert_eq!(tree.record_poll(&yellow_bag), true);
assert_eq!(tree.preference(), yellow);
assert_eq!(tree.finalized(), false);
let magenta_bag = Bag::new();
magenta_bag.add_count(&magenta, 1);
assert_eq!(tree.record_poll(&magenta_bag), true);
assert_eq!(tree.preference(), yellow);
assert_eq!(tree.finalized(), false);
let cyan_bag = Bag::new();
cyan_bag.add_count(&cyan, 1);
assert_eq!(tree.record_poll(&cyan_bag), false);
assert_eq!(tree.preference(), yellow);
assert_eq!(tree.finalized(), false);
assert_eq!(tree.record_poll(&cyan_bag), false);
assert_eq!(tree.preference(), yellow);
assert_eq!(tree.finalized(), false);
}
#[test]
fn test_tree_snowball_add_rejected() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
log::info!("{:#010b}", 0x00); log::info!("{:#010b}", 0x01); log::info!("{:#010b}", 0x0a); log::info!("{:#010b}", 0x04); assert_eq!(0x00, 0b00000000);
assert_eq!(0x01, 0b00000001);
assert_eq!(0x0a, 0b00001010);
assert_eq!(0x04, 0b00000100);
let c0000 = Id::from_slice(&[0b00000000]); let c1000 = Id::from_slice(&[0b00000001]); let c0101 = Id::from_slice(&[0b00001010]); let c0010 = Id::from_slice(&[0b00000100]);
let mut tree = Tree::new(
crate::Parameters {
k: 1,
alpha: 1,
beta_virtuous: 1,
beta_rogue: 2,
..Default::default()
},
c0000.clone(),
);
assert_eq!(tree.finalized(), false);
tree.add(&c1000);
tree.add(&c0010);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
let c0010_bag = Bag::new();
c0010_bag.add_count(&c0010, 1);
assert_eq!(tree.record_poll(&c0010_bag), true);
assert_eq!(tree.preference(), c0010);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0
SB(Preference = 1, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 2
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256)
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = true)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
"
);
tree.add(&c0101);
assert_eq!(tree.preference(), c0010);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0
SB(Preference = 1, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 2
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256)
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = true)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
"
);
}
#[test]
fn test_tree_snowball_reset_child() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
log::info!("{:#010b}", 0x00); log::info!("{:#010b}", 0x01); log::info!("{:#010b}", 0x02); assert_eq!(0x00, 0b00000000);
assert_eq!(0x01, 0b00000001);
assert_eq!(0x02, 0b00000010);
let c0000 = Id::from_slice(&[0b00000000]); let c1000 = Id::from_slice(&[0b00000001]); let c0100 = Id::from_slice(&[0b00000010]);
let mut tree = Tree::new(
crate::Parameters {
k: 1,
alpha: 1,
beta_virtuous: 1,
beta_rogue: 2,
..Default::default()
},
c0000.clone(),
);
assert_eq!(tree.finalized(), false);
tree.add(&c0100);
tree.add(&c1000);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
let c0000_bag = Bag::new();
c0000_bag.add_count(&c0000, 1);
assert_eq!(tree.record_poll(&c0000_bag), true);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0
SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 1
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = true)) Bits = [2, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
"
);
let empty_bag = Bag::new();
assert_eq!(tree.record_poll(&empty_bag), false);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0
SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 1
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = true)) Bits = [2, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
"
);
assert_eq!(tree.record_poll(&c0000_bag), true);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 2, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0
SB(Preference = 0, NumSuccessfulPolls[0] = 2, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 1
SB(NumSuccessfulPolls = 2, SF(Confidence = 1, Finalized = true)) Bits = [2, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
"
);
}
#[test]
fn test_tree_snowball_reset_sibling() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
let c0000 = Id::from_slice(&[0b00000000]); let c1000 = Id::from_slice(&[0b00000001]); let c0100 = Id::from_slice(&[0b00000010]);
let mut tree = Tree::new(
crate::Parameters {
k: 1,
alpha: 1,
beta_virtuous: 1,
beta_rogue: 2,
..Default::default()
},
c0000.clone(),
);
assert_eq!(tree.finalized(), false);
tree.add(&c0100);
tree.add(&c1000);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
let c0100_bag = Bag::new();
c0100_bag.add_count(&c0100, 1);
assert_eq!(tree.record_poll(&c0100_bag), true);
assert_eq!(tree.preference(), c0100);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0
SB(Preference = 1, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 1
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = true)) Bits = [2, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
"
);
let c1000_bag = Bag::new();
c1000_bag.add_count(&c1000, 1);
assert_eq!(tree.record_poll(&c1000_bag), true);
assert_eq!(tree.preference(), c0100);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 0
SB(Preference = 1, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 1
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = true)) Bits = [2, 256)
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = true)) Bits = [1, 256)
"
);
assert_eq!(tree.record_poll(&c0100_bag), true);
assert_eq!(tree.preference(), c0100);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 2, NumSuccessfulPolls[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0
SB(Preference = 1, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 2, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 1
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)
SB(NumSuccessfulPolls = 2, SF(Confidence = 1, Finalized = true)) Bits = [2, 256)
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = true)) Bits = [1, 256)
"
);
}
#[test]
fn test_tree_snowball_5_colors() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
let mut colors: Vec<Id> = Vec::new();
for i in 0..5 {
colors.push(Id::empty().prefix(&[i as u64]).unwrap());
}
let mut tree0 = Tree::new(
crate::Parameters {
k: 5,
alpha: 5,
beta_virtuous: 20,
beta_rogue: 30,
..Default::default()
},
colors[4].clone(),
);
assert_eq!(tree0.finalized(), false);
tree0.add(&colors[0]);
tree0.add(&colors[1]);
tree0.add(&colors[2]);
tree0.add(&colors[3]);
let mut tree1 = Tree::new(
crate::Parameters {
k: 5,
alpha: 5,
beta_virtuous: 20,
beta_rogue: 30,
..Default::default()
},
colors[3].clone(),
);
assert_eq!(tree1.finalized(), false);
tree1.add(&colors[0]);
tree1.add(&colors[1]);
tree1.add(&colors[2]);
tree1.add(&colors[4]);
log::info!("{}", tree0);
log::info!("{}", tree1);
let tree0_str = format!("{}", tree0);
let tree0_cnt = tree0_str.matches(" ").count();
let tree1_str = format!("{}", tree1);
let tree1_cnt = tree1_str.matches(" ").count();
assert_eq!(tree0_cnt, tree1_cnt);
}
#[test]
fn test_tree_snowball_fine_grained() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
log::info!("{:#010b}", 0x00); log::info!("{:#010b}", 0x01); log::info!("{:#010b}", 0x03); log::info!("{:#010b}", 0x04); assert_eq!(0x00, 0b00000000);
assert_eq!(0x01, 0b00000001);
assert_eq!(0x03, 0b00000011);
assert_eq!(0x04, 0b00000100);
let c0000 = Id::from_slice(&[0b00000000]); let c1000 = Id::from_slice(&[0b00000001]); let c1100 = Id::from_slice(&[0b00000011]); let c0010 = Id::from_slice(&[0b00000100]);
let mut tree = Tree::new(
crate::Parameters {
k: 1,
alpha: 1,
beta_virtuous: 1,
beta_rogue: 2,
..Default::default()
},
c0000.clone(),
);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [0, 256)
"
);
tree.add(&c1100);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
"
);
tree.add(&c1000);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
SB(Preference = 1, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 1))) Bit = 1
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)
"
);
tree.add(&c0010);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 2)
SB(Preference = 0, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 2
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256)
SB(Preference = 1, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 1))) Bit = 1
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)
"
);
let c0000_bag = Bag::new();
c0000_bag.add_count(&c0000, 1);
assert_eq!(tree.record_poll(&c0000_bag), true);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0
SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 2
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = true)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256)
SB(Preference = 1, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 1))) Bit = 1
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [2, 256)
"
);
let c0010_bag = Bag::new();
c0010_bag.add_count(&c0010, 1);
assert_eq!(tree.record_poll(&c0010_bag), true);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 1, SF(Confidence = 1, Finalized = false, SL(Preference = 1))) Bit = 2
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = true)) Bits = [3, 256)
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = true)) Bits = [3, 256)
"
);
assert_eq!(tree.record_poll(&c0010_bag), true);
assert_eq!(tree.preference(), c0010);
assert_eq!(tree.finalized(), true);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(NumSuccessfulPolls = 2, SF(Confidence = 2, Finalized = true)) Bits = [3, 256)
"
);
}
#[test]
fn test_tree_snowball_double_add() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
let red = Id::empty().prefix(&[0]).unwrap();
let mut tree = Tree::new(
crate::Parameters {
k: 1,
alpha: 1,
beta_virtuous: 3,
beta_rogue: 5,
..Default::default()
},
red.clone(),
);
assert_eq!(tree.finalized(), false);
tree.add(&red);
assert_eq!(tree.preference(), red);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [0, 256)
"
);
}
#[test]
fn test_tree_snowball_consistent() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
}
#[test]
fn test_tree_snowball_filter_binary_children() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
let c0000 = Id::from_slice(&[0b00000000]); let c1000 = Id::from_slice(&[0b00000001]); let c0100 = Id::from_slice(&[0b00000010]); let c0010 = Id::from_slice(&[0b00000100]);
let mut tree = Tree::new(
crate::Parameters {
k: 1,
alpha: 1,
beta_virtuous: 1,
beta_rogue: 2,
..Default::default()
},
c0000.clone(),
);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [0, 256)
"
);
tree.add(&c1000);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
"
);
tree.add(&c0010);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 0
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 2)
SB(Preference = 0, NumSuccessfulPolls[0] = 0, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 2
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
"
);
let c0000_bag = Bag::new();
c0000_bag.add_count(&c0000, 1);
assert_eq!(tree.record_poll(&c0000_bag), true);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0
SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 2
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = true)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
"
);
tree.add(&c0100);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 0
SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 1, Finalized = false, SL(Preference = 0))) Bit = 2
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = true)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [1, 256)
"
);
let c0100_bag = Bag::new();
c0100_bag.add_count(&c0100, 1);
assert_eq!(tree.record_poll(&c0100_bag), true);
assert_eq!(tree.preference(), c0000);
assert_eq!(tree.finalized(), false);
log::info!("{}", tree);
assert_eq!(
tree.to_string(),
"SB(Preference = 0, NumSuccessfulPolls[0] = 1, NumSuccessfulPolls[1] = 0, SF(Confidence = 0, Finalized = false, SL(Preference = 0))) Bit = 2
SB(NumSuccessfulPolls = 1, SF(Confidence = 1, Finalized = true)) Bits = [3, 256)
SB(NumSuccessfulPolls = 0, SF(Confidence = 0, Finalized = false)) Bits = [3, 256)
"
);
}