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// }