Guest User

Untitled

a guest
Nov 17th, 2018
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 KB | None | 0 0
  1. use rand::random;
  2. use siphasher::sip::SipHasher24;
  3.  
  4. use std::hash::Hasher;
  5.  
  6. struct Solver {
  7. size: usize,
  8. key: u64,
  9. nodes: Vec<u32>,
  10. edges: Vec<bool>,
  11. round: u64,
  12. }
  13.  
  14. impl Solver {
  15. fn new(size: usize, key: u64) -> Solver {
  16. Solver {
  17. nodes: Vec::new(),
  18. edges: Vec::new(),
  19. round: 0,
  20. key,
  21. size,
  22. }.initialize()
  23. }
  24.  
  25. fn count(&self) -> usize {
  26. 2usize.pow(self.size as u32)
  27. }
  28.  
  29. fn edge_mask(&self) -> usize {
  30. self.count() - 1
  31. }
  32.  
  33. fn initialize(mut self) -> Solver {
  34. self.edges.resize(self.count(), true);
  35. self.nodes.resize(self.count() * 2, 0);
  36.  
  37. for i in 0..self.edges.len() {
  38. *self.top_mut(i) += 1;
  39. *self.bottom_mut(i) += 1;
  40. }
  41.  
  42. self
  43. }
  44.  
  45. fn top(&self, edge: usize) -> u32 {
  46. self.nodes[(self.hash(2 * edge + 0) % self.edge_mask()) * 2 + 0]
  47. }
  48.  
  49. fn bottom(&self, edge: usize) -> u32 {
  50. self.nodes[(self.hash(2 * edge + 1) % self.edge_mask()) * 2 + 1]
  51. }
  52.  
  53. fn top_mut(&mut self, edge: usize) -> &mut u32 {
  54. let i = (self.hash(2 * edge + 0) % self.edge_mask()) * 2 + 0;
  55. &mut self.nodes[i]
  56. }
  57.  
  58. fn bottom_mut(&mut self, edge: usize) -> &mut u32 {
  59. let i = (self.hash(2 * edge + 1) % self.edge_mask()) * 2 + 1;
  60. &mut self.nodes[i]
  61. }
  62.  
  63. fn trim(&mut self) {
  64. let start = self.alive();
  65.  
  66. for i in 0..self.edges.len() {
  67. if !self.edges[i] {
  68. continue;
  69. }
  70.  
  71. if self.top(i) < 2 || self.bottom(i) < 2 {
  72. *self.top_mut(i) -= 1;
  73. *self.bottom_mut(i) -= 1;
  74. self.edges[i] = false;
  75. }
  76. }
  77.  
  78. let end = self.alive();
  79.  
  80. println!(
  81. "Size {}, Round {}: {:9} -> {:9} -{:2}%",
  82. self.size,
  83. self.round,
  84. start,
  85. end,
  86. ((1.0 - (end as f64 / start as f64)) * 100.0) as u64
  87. );
  88.  
  89. self.round += 1;
  90. }
  91.  
  92. fn hash(&self, node: usize) -> usize {
  93. let mut hasher = SipHasher24::new_with_keys(self.key, self.key);
  94. hasher.write_usize(node);
  95. hasher.finish() as usize
  96. }
  97.  
  98. fn alive(&self) -> usize {
  99. self
  100. .edges
  101. .iter()
  102. .cloned()
  103. .map(|edge| if edge { 1 } else { 0 })
  104. .sum()
  105. }
  106. }
  107.  
  108. fn main() {
  109. for size in 16..19 {
  110. println!("------------------------------------------------");
  111. let mut solver = Solver::new(size, random());
  112. for _ in 0..3 {
  113. solver.trim();
  114. }
  115. }
  116. }
Add Comment
Please, Sign In to add comment