gpca/dynamics/implementations/
eca.rs

1// use std::marker::PhantomData;
2
3// use crate::{
4//     dynamic::Dynamic,
5//     space::{DiscreteSpace, OneDimensional},
6// };
7
8// #[derive(Debug, Clone)]
9// pub struct ElementaryCellularAutomaton<S: DiscreteSpace<1>> {
10//     rule: [u32; 8],
11//     phantom: PhantomData<S>,
12// }
13
14// impl<const X: usize> ElementaryCellularAutomaton<OneDimensional<X>> {
15//     pub fn new(rule: [u32; 8]) -> Self {
16//         Self {
17//             rule,
18//             phantom: PhantomData,
19//         }
20//     }
21
22//     pub fn new_from_number(rule: u32) -> Self {
23//         let mut rule_array = [0; 8];
24
25//         for (i, _) in rule_array.clone().iter_mut().enumerate() {
26//             rule_array[i] = (rule >> i) & 1;
27//         }
28
29//         Self::new(rule_array)
30//     }
31// }
32
33// impl<const X: usize> Dynamic<1, OneDimensional<X>>
34//     for ElementaryCellularAutomaton<OneDimensional<X>>
35// {
36//     fn states(&self) -> u32 {
37//         2
38//     }
39
40//     fn update(&self, input: &[u32]) -> Vec<u32> {
41//         let mut output: Vec<u32> = Vec::new();
42
43//         for i in 0..input.len() {
44//             let left = if i == 0 {
45//                 input[input.len() - 1]
46//             } else {
47//                 input[i - 1]
48//             };
49
50//             let right = if i == input.len() - 1 {
51//                 input[0]
52//             } else {
53//                 input[i + 1]
54//             };
55
56//             let index = (left << 2) | (input[i] << 1) | right;
57
58//             // self.rule
59
60//             output.push(self.rule[index as usize]);
61//         }
62
63//         output
64//     }
65// }