/
serial_test.cpp
121 lines (99 loc) · 3.27 KB
/
serial_test.cpp
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
namespace test{
double serial_test_P2;
double serial_test(vector<bool> &bits, unsigned int m){
if (bits.size()==0 || m<2 || m>30){
cerr<<"Illegal parameter!"<<endl;
throw;
}
int* patterns1 = new int[1<<m];
int* patterns2 = new int[1<<(m-1)];
int* patterns3 = new int[1<<(m-2)];
int n = bits.size();
double Phi1=0, Phi2=0, Phi3=0;
double DPhi2, D2Phi2;
double P1, P2;
unsigned int mask1=(1<<m)-1, mask2=(1<<(m-1))-1, mask3=(1<<(m-2))-1;
unsigned int tmp;
for (int i=0; i<m-1; i++){
bits.push_back(bits[i]);
}
memset(patterns1, 0, sizeof(int)<<m);
memset(patterns2, 0, sizeof(int)<<(m-1));
memset(patterns3, 0, sizeof(int)<<(m-2));
vector<bool>::const_iterator it=bits.begin();
for (int i=0; i<m-1; i++){
tmp<<=1;
if (*it) tmp++;
it++;
}
for (int i=0; i<n; i++){
tmp<<=1;
if (*it) tmp++;
it++;
patterns1[tmp&mask1]++;
patterns2[tmp&mask2]++;
patterns3[tmp&mask3]++;
}
for (int i=0; i<=mask1; i++)
Phi1+=pow(patterns1[i],2.0);
Phi1*=(mask1+1); Phi1/=n; Phi1-=n;
for (int i=0; i<=mask2; i++)
Phi2+=pow(patterns2[i],2.0);
Phi2*=(mask2+1); Phi2/=n; Phi2-=n;
for (int i=0; i<=mask3; i++)
Phi3+=pow(patterns3[i],2.0);
Phi3*=(mask3+1); Phi3/=n; Phi3-=n;
DPhi2=Phi1-Phi2;
D2Phi2=Phi1-2*Phi2+Phi3;
P1=igamc((1<<m)/4.0, DPhi2/2.0);
P2=igamc((1<<m)/8.0, D2Phi2/2.0);
for (int i=0; i<m-1; i++){
bits.pop_back();
}
cout<<"Serial test:"<<endl;
cout<<" n = "<<n<<endl;
cout<<" m = "<<m<<endl;
cout<<" Phi1 = "<<fixed<<setprecision(6)<<Phi1<<endl;
cout<<" Phi2 = "<<fixed<<setprecision(6)<<Phi2<<endl;
cout<<" Phi3 = "<<fixed<<setprecision(6)<<Phi3<<endl;
cout<<" DPhi2 = "<<fixed<<setprecision(6)<<DPhi2<<endl;
cout<<" D2Phi2 = "<<fixed<<setprecision(6)<<D2Phi2<<endl;
cout<<" P1 = "<<fixed<<setprecision(4)<<P1*100<<"%"<<endl;
cout<<" P2 = "<<fixed<<setprecision(4)<<P2*100<<"%"<<endl;
serial_test_P2=P2;
delete[] patterns1;
delete[] patterns2;
delete[] patterns3;
return P1;
}
double serial_test2(const vector<bool> &bits){
return serial_test_P2;
}
class SerialTest: public TestMethod{
public:
int m;
void run(std::vector<bool> &bits){
P = serial_test(bits, m);
}
const char* testName(int lang = 0){
char* names[1] = {"Serial test (1)"};
return names[lang];
}
SerialTest(int _m) {m = _m;}
~SerialTest() {}
};
class SerialTest2: public TestMethod{
public:
int m;
void run(std::vector<bool> &bits){
serial_test(bits, m);
P = serial_test2(bits);
}
const char* testName(int lang = 0){
char* names[1] = {"Serial test (2)"};
return names[lang];
}
SerialTest2(int _m) {m = _m;}
~SerialTest2() {}
};
}