-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCA1DSimulator.java
154 lines (142 loc) · 5.01 KB
/
CA1DSimulator.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/**
* Class CA1DSimulator that emulates a cellular automata in 1D
* @author Carlos Gallardo Polanco
*/
import java.util.Random;
import java.util.concurrent.CyclicBarrier;
public class CA1DSimulator implements Runnable{
Random rd = new Random();
static int cores = Runtime.getRuntime().availableProcessors();
static CyclicBarrier br = new CyclicBarrier(cores);
static int[][] cells; //(nGen+1)x(nCells)
int[] sucessor; //next generation
static int nGen, nCells;
static int[] ruleBit = new int[8];
int ulimit, llimit, gen, cel;
/**
* Constructor
* @param int ulimit upper limit
* @param int llimit lower limit
*/
public CA1DSimulator(int ulimit, int llimit){
this.ulimit=ulimit;
this.llimit=llimit;
this.sucessor = new int[nCells];
}
/**
* No-argument constructor
*/
public CA1DSimulator(){}
/**
* run method
*/
public void run(){
for(gen=0; gen<nGen; gen++){ caComputation();}
try{Thread.sleep(2); }catch(InterruptedException e){}
}
/**
* initialize method inizializes the cellular automaton
* @param int g number of generations
* @param int c number of cells
* @param int r rule
*/
public void inizialize(int g, int c, int r){
nGen=g;
nCells=c;
toBinary(r);
cells = new int[nGen+1][nCells];
cells[0][nCells/2]=1; //inizializes the first generation
}
/**
* get_cells method returns the cellular automaton
* @return cellular automaton
*/
public int[][] get_cells(){
return cells;
}
/**
* toBinary method transforms a decimal number to binary
* @param int rule
*/
public void toBinary(int rule) {
final boolean[] ret = new boolean[8];
for (int i = 0; i < 8; i++){
ret[8 - 1 - i] = (1 << i & rule) != 0;
}
for (int i = 0; i < 8; i++){
if(ret[i]==true){ ruleBit[i]=1;}
else{ ruleBit[i]=0;}
}
}
/**
* nextGen computes the next generation
*/
public void nextGen(){
int zero=0;
for(int i=llimit; i<ulimit; i++){
if(i==0){
if(zero==1&&cells[gen][i]==1&&cells[gen][i+1]==1){sucessor[i]=ruleBit[0];}
else{if(zero==1&&cells[gen][i]==1&&cells[gen][i+1]==0){sucessor[i]=ruleBit[1];}
else{if(zero==1&&cells[gen][i]==0&&cells[gen][i+1]==1){sucessor[i]=ruleBit[2];}
else{if(zero==1&&cells[gen][i]==0&&cells[gen][i+1]==0){sucessor[i]=ruleBit[3];}
else{if(zero==0&&cells[gen][i]==1&&cells[gen][i+1]==1){sucessor[i]=ruleBit[4];}
else{if(zero==0&&cells[gen][i]==1&&cells[gen][i+1]==0){sucessor[i]=ruleBit[5];}
else{if(zero==0&&cells[gen][i]==0&&cells[gen][i+1]==1){sucessor[i]=ruleBit[6];}
else{if(zero==0&&cells[gen][i]==0&&cells[gen][i+1]==0){sucessor[i]=ruleBit[7];}
}
}
}
}
}
}
}
}else{
if(i==(nCells-1)){
if(cells[gen][i-1]==1&&cells[gen][i]==1&&zero==1){sucessor[i]=ruleBit[0];}
else{if(cells[gen][i-1]==1&&cells[gen][i]==1&&zero==0){sucessor[i]=ruleBit[1];}
else{if(cells[gen][i-1]==1&&cells[gen][i]==0&&zero==1){sucessor[i]=ruleBit[2];}
else{if(cells[gen][i-1]==1&&cells[gen][i]==0&&zero==0){sucessor[i]=ruleBit[3];}
else{if(cells[gen][i-1]==0&&cells[gen][i]==1&&zero==1){sucessor[i]=ruleBit[4];}
else{if(cells[gen][i-1]==0&&cells[gen][i]==1&&zero==0){sucessor[i]=ruleBit[5];}
else{if(cells[gen][i-1]==0&&cells[gen][i]==0&&zero==1){sucessor[i]=ruleBit[6];}
else{if(cells[gen][i-1]==0&&cells[gen][i]==0&&zero==0){sucessor[i]=ruleBit[7];}
}
}
}
}
}
}
}
}else{
if(cells[gen][i-1]==1&&cells[gen][i]==1&&cells[gen][i+1]==1){sucessor[i]=ruleBit[0];}
else{if(cells[gen][i-1]==1&&cells[gen][i]==1&&cells[gen][i+1]==0){sucessor[i]=ruleBit[1];}
else{if(cells[gen][i-1]==1&&cells[gen][i]==0&&cells[gen][i+1]==1){sucessor[i]=ruleBit[2];}
else{if(cells[gen][i-1]==1&&cells[gen][i]==0&&cells[gen][i+1]==0){sucessor[i]=ruleBit[3];}
else{if(cells[gen][i-1]==0&&cells[gen][i]==1&&cells[gen][i+1]==1){sucessor[i]=ruleBit[4];}
else{if(cells[gen][i-1]==0&&cells[gen][i]==1&&cells[gen][i+1]==0){sucessor[i]=ruleBit[5];}
else{if(cells[gen][i-1]==0&&cells[gen][i]==0&&cells[gen][i+1]==1){sucessor[i]=ruleBit[6];}
else{if(cells[gen][i-1]==0&&cells[gen][i]==0&&cells[gen][i+1]==0){sucessor[i]=ruleBit[7];}
}
}
}
}
}
}
}
}
}
}
}
/**
* caComputation computes the cellular automaton
*/
public void caComputation(){
nextGen();
for(int i=llimit; i<ulimit ;i++){
cells[gen+1][i]=sucessor[i];
}
try{
br.await();
}catch(Exception e){}
}
}