-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.cpp
292 lines (248 loc) · 18.1 KB
/
main.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
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
#include <iostream>
#include <armadillo>
#include "gtest/gtest.h"
#include "shannonEntropy.hpp"
#include "ETC.hpp"
#include <thread>
#include "CCC.hpp"
#include "LZ.hpp"
#include "RPC.hpp"
#include "fractal.hpp"
#include <Eigen/Dense>
using Eigen::ArrayXi;
using namespace std;
using namespace arma;
ArrayXL ei(std::vector<long> v) {
ArrayXL seq(v.size());
for(size_t i=0; i < v.size(); i++) seq[i] = v[i];
return seq;
}
TEST(CCCTest, ShannonEntropyTest) {
EXPECT_DOUBLE_EQ(shannonEntropy::calc(ei({1,0,0,0,1,100,1,101,2,4,5,1})), 2.522055208874201);
EXPECT_DOUBLE_EQ(shannonEntropy::calc(ei({1,0,0,0})), 0.811278124459133);
EXPECT_DOUBLE_EQ(shannonEntropy::calc(ei({0})), 0);
EXPECT_DOUBLE_EQ(shannonEntropy::calc(ei({1,0,3,1,3,1,4,0,2,9,4,1,2,4,2,2,34,4,100,300,-20,20,-111,3,0,2,0,0,1,4,0,19,34,235,7,27,25,43})), 3.745464778448826);
}
TEST(CCCTest, PairTest) {
EXPECT_EQ(ETC::findHFPair(ei({1,0,1,0,3,3})).i128, ETC::makeETCPair(1,0).i128);
EXPECT_EQ(ETC::findHFPair(ei({1,1,1,0,3,3,0,2,2,4,3,3})).i128, ETC::makeETCPair(3,3).i128);
EXPECT_EQ(ETC::findHFPair(ei({1,1,1,1,0,3,3,0,2,2,4,3,3})).i128, ETC::makeETCPair(1,1).i128);
}
bool arma_eq(const ArrayXL &v1, const ArrayXL &v2) {
bool res = 1;
for(size_t i=0; i < v1.size(); i++) {
if (v1[i] != v2[i])
{
res = 0;
break;
}
}
return res;
}
TEST(CCCTest, SubstituteTest) {
EXPECT_EQ(arma_eq(get<0>(ETC::substitute(ei({1,1,3}), ETC::makeETCPair(1,1))), ei({4,3})), 1);
EXPECT_EQ(arma_eq(get<0>(ETC::substitute(ei({-1,-1,-3}), ETC::makeETCPair(-1,-3))),ei({-1,0})), 1);
auto [newSeqRepl, replaceCount, replaceSym] = ETC::substitute(ei({1,1,3,3,5,8,6,4,3,6,3,6,2,3,1,3,5,3,6,4,2,3,4,5,1,3,5,4,2,3}), ETC::makeETCPair(1,3));
EXPECT_EQ(arma_eq(newSeqRepl,
ei({1,9,3,5,8,6,4,3,6,3,6,2,3,9,5,3,6,4,2,3,4,5,9,5,4,2,3}))
, 1);
EXPECT_EQ(arma_eq(get<0>(ETC::substitute(ei({4,7,8,8,5,2,8,8}), ETC::makeETCPair(8,8))),ei({4,7,9,5,2,9})), 1);
}
TEST(CCCTest, ETCTest) {
EXPECT_DOUBLE_EQ(ETC::calc(ei({1,0,1,0,3,3})),4/5.0);
EXPECT_DOUBLE_EQ(ETC::calc(ei({1,4,5,3,3,3,5,5,7,5,7,7,7,7,8,2,4,9,2,4,6,7,8,5})),20/23.0);
EXPECT_DOUBLE_EQ(ETC::calc(ei({1,4,5,3, 3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3})),8/22.0);
EXPECT_DOUBLE_EQ(ETC::calc(ei({4294967297,21474836482,12884901891,17179869188,4294967297,8589934594})),1);
}
TEST(CCCTest, ETCJointTest) {
EXPECT_DOUBLE_EQ(ETC::calcJoint(ei({1,1,1,2}), ei({2,3,3,4})),3/3.0);
EXPECT_DOUBLE_EQ(ETC::calcJoint(ei({3,33,333,22, 30000,-20000,16,0}),ei({0,333,33,30000, 30000,30000,64,-1})),7/7.0);
EXPECT_DOUBLE_EQ(ETC::calcJoint(ei({0,0,0,0,0}),ei({1,1,1,1,1})),0/4.0);
EXPECT_DOUBLE_EQ(ETC::calcJoint(ei({0,1,2,2, 4,5,6,7, 2,2}),ei({0,1,2,2,4,5,6,7,2,2})),8/9.0);
EXPECT_DOUBLE_EQ(ETC::calcJoint(ei({0}), ei({100})),0);
}
TEST(CCCTest, DCTest) {
EXPECT_FLOAT_EQ(CCC::dynamicCC(ei({18,24,18,15,10,16,10,11,10,12,13,23,6,9,15,13,7,15,22,2,12,3,15,14,20,6,15,12,22,17,9,9,7,24,8,4,10,19,18,18,1,10,23,8,15,8,4,10,21,25,22,3,9,6,8,25,14,19,22,5,23,3,19,19,18,4,12,13,14,22,17,21,14,24,2,14,8,13,18,6,16,9,23,4,3,24,4,4,4,3,12,17,21,20,18,12,18,24,13,8,20,6,6,12,16,16,4,4,8,19,11,21,24,10,2,15,19,9,13,6,24,13,14,6,3,2,21,20,5,23,18,17,25,1,11,13,15,3,17,2,14,18,13,16,6,17,10,3,10,7,7,16,14,11,6,22,22,8,16,20,24,23,10,5,20,3,4,9,22,15,15,24,15,1,21,16,12,7,7,13,}), 7, 3, 1), 0.003267973856209149124963);
EXPECT_FLOAT_EQ(CCC::dynamicCC(ei({7,10,9,9,8,10,9,3,11,2,8,3,3,4,3,6,11,5,7,7,8,5,10,11,9,4,9,2,6,7,8,5,9,10,1,2,10,5,5,11,9,11,3,2,5,6,7,11,6,5,11,3,8,11,8,4,6,1,10,5,4,11,6,4,1,7,2,1,7,4,}), 10, 17, 3), -0.045192307692307663591347);
EXPECT_FLOAT_EQ(CCC::dynamicCC(ei({12,3,10,8,12,8,9,9,5,4,1,6,8,4,7,3,4,8,11,11,3,5,11,4,12,8,2,10,8,7,4,1,3,5,8,12,3,10,11,6,2,10,6,2,11,8,2,11,1,1,12,9,5,7,10,1,9,9,6,7,5,3,5,12,3,5,4,2,7,10,11,9,5,4,9,11,12,1,6,2,4,11,3,2,7,4,5,10,11,9,6,8,3,8,9,8,5,5,3,10,6,5,10,3,11,10,11,5,5,11,6,7,9,12,7,8,7,12,11,3,3,3,10,3,12,9,3,11,11,12,7,7,3,7,7,2,6,7,3,8,1,4,7,4,8,5,2,}), 21, 15, 2), -0.057908162);
EXPECT_FLOAT_EQ(CCC::dynamicCC(ei({7,2,2,2,6,2,3,7,5,8,1,4,5,5,7,2,3,1,8,7,7,2,3,2,4,7,6,6,6,6,7,6,2,5,2,8,1,3,5,4,7,5,2,6,2,6,6,2,2,2,2,2,}), 22, 3, 3), -0.134259259259259272623055);
EXPECT_FLOAT_EQ(CCC::dynamicCC(ei({2,4,6,6,2,4,6,6,1,2,5,1,1,3,6,6,1,4,6,6,6,6,5,1,4,2,5,6,2,6,3,3,2,6,5,3,5,6,2,2,4,5,6,3,1,1,3,5,2,5,4,1,5,6,3,6,1,5,6,5,2,2,4,3,3,6,4,6,3,3,5,5,3,1,1,5,4,1,4,5,1,2,5,1,6,6,1,3,2,4,1,1,6,6,3,4,1,2,1,}), 12, 6, 3), -0.099782132);
}
TEST(CCCTest, DCJointTest) {
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({1,2,3,4,1,2,3,4,1,2,3,4}), ei({1,5,3,7,1,1,3,7,1,2,4,7}), 3, 3, 1), 0);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({1,2,3,4,1,1,3,7,1,2,3,7}), ei({1,5,3,7,1,1,3,7,1,2,4,7}), 3, 3, 1), 0);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({1,2,3,4,1,1,3,7,1,2,3,7}), ei({1,5,3,7,1,1,3,7,1,2,4,7}), 4, 4, 1), 0);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({4,4,1,1,1,2,1,2,2,3,4,2,2,4,2,1,3,4,2,3,3,2,2,4,1,2,2,3,4,2,2,3,2,4,2,2,2,1,1,1,4,1,4,3,4,4,1,2,4,3,}), ei({4,2,1,3,1,3,3,3,3,2,1,2,1,3,4,1,1,4,1,1,4,1,4,1,2,3,3,3,3,2,1,4,1,3,4,1,4,1,4,4,1,3,4,2,4,3,4,4,1,2,}), 9, 12, 3), -0.050000000000000023592239);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({3,3,2,2,4,2,4,1,4,1,4,4,3,1,1,3,4,1,4,4,2,3,2,1,4,3,2,3,2,1,1,2,2,2,2,1,2,3,1,3,2,2,1,1,3,2,3,4,3,3,}), ei({4,4,3,4,1,2,4,4,2,3,2,2,1,2,1,2,2,4,3,4,2,2,4,4,3,4,3,3,4,4,4,3,2,2,4,1,1,2,3,1,3,4,1,2,2,4,3,2,1,3,}), 11, 19, 3), -0.048987411056376557738634);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({1,3,4,1,4,4,1,1,2,4,2,2,3,1,1,4,3,2,4,1,2,3,2,2,3,4,4,1,2,2,4,2,1,3,2,4,4,4,3,3,4,1,2,1,4,3,2,1,3,2,}), ei({1,1,1,2,1,2,4,2,1,3,4,2,1,1,1,3,2,3,3,3,3,4,3,4,2,1,1,3,2,3,3,3,3,3,2,2,4,2,1,1,3,4,4,1,4,3,2,3,2,3,}), 10, 9, 1), -0.035842293906810054893164);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({4,2,4,1,1,4,4,4,4,1,3,4,3,4,1,4,4,3,2,2,3,1,2,4,3,2,2,2,4,4,3,4,2,2,1,1,4,3,3,4,3,3,1,3,1,1,3,3,1,2,}), ei({3,3,1,1,1,2,2,1,3,1,1,4,4,1,2,4,1,4,4,3,1,2,4,3,2,3,1,3,4,4,2,3,2,4,1,2,4,1,3,4,3,1,2,2,2,3,1,4,3,1,}), 8, 21, 3), -0.030612244897959169087631);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({3,2,2,3,1,2,4,4,4,4,1,3,3,4,3,2,3,4,3,1,4,1,3,1,2,4,1,4,3,2,1,2,4,1,3,3,3,4,2,2,4,4,2,1,3,1,3,2,2,3,}), ei({3,4,1,3,1,4,3,4,1,4,3,3,2,1,4,1,2,3,4,3,4,1,2,3,1,3,2,4,2,2,4,3,2,1,3,3,1,1,4,2,1,1,1,4,2,3,2,1,4,2,}), 5, 14, 2), -0.031250000000000013877788);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({2,3,4,3,2,1,2,1,4,3,1,3,1,4,2,3,3,3,2,1,2,1,3,1,4,3,4,3,1,2,4,4,2,4,1,3,2,3,2,1,2,3,1,2,3,4,2,2,4,3,}), ei({1,4,2,2,1,2,2,2,2,1,4,4,2,2,3,2,2,4,1,4,1,2,3,3,1,4,3,2,3,4,4,2,2,2,1,4,1,2,2,4,1,4,2,2,2,3,1,1,4,3,}), 6, 22, 3), -0.010582010582010595300950);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({2,1,5,7,1,1,5,5,4,1,5,7,7,1,3,2,4,5,3,6,6,6,3,1,5,7,2,1,7,4,6,6,2,2,1,5,6,4,1,7,4,3,2,5,5,6,2,3,2,6,}), ei({3,2,1,6,4,4,7,6,5,2,4,7,5,6,7,7,2,1,4,1,4,7,2,3,4,6,6,4,3,7,6,6,7,4,6,4,6,3,6,7,4,4,2,3,1,3,3,3,6,4,}), 8, 18, 1), -0.003333333333333336149368);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({2,2,2,2,3,1,3,3,1,1,2,3,2,1,2,2,2,1,3,2,2,1,2,1,1,3,2,1,2,3,1,3,1,1,1,3,1,3,1,1,3,1,2,3,3,3,3,2,1,2,}), ei({1,3,2,3,3,2,1,3,3,3,3,3,2,3,2,3,1,3,1,2,2,1,3,2,3,2,3,2,3,3,2,3,2,3,1,3,1,1,3,3,3,1,3,2,2,3,3,1,3,1,}), 6, 8, 3), -0.078754578754578710708678);
}
TEST(CCCTest, DCJointTest_SingleThread) {
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({1,2,3,4,1,2,3,4,1,2,3,4}), ei({1,5,3,7,1,1,3,7,1,2,4,7}), 3, 3, 1, CCC::SINGLETHREAD), 0);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({1,2,3,4,1,1,3,7,1,2,3,7}), ei({1,5,3,7,1,1,3,7,1,2,4,7}), 3, 3, 1, CCC::SINGLETHREAD), 0);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({1,2,3,4,1,1,3,7,1,2,3,7}), ei({1,5,3,7,1,1,3,7,1,2,4,7}), 4, 4, 1, CCC::SINGLETHREAD), 0);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({4,4,1,1,1,2,1,2,2,3,4,2,2,4,2,1,3,4,2,3,3,2,2,4,1,2,2,3,4,2,2,3,2,4,2,2,2,1,1,1,4,1,4,3,4,4,1,2,4,3,}), ei({4,2,1,3,1,3,3,3,3,2,1,2,1,3,4,1,1,4,1,1,4,1,4,1,2,3,3,3,3,2,1,4,1,3,4,1,4,1,4,4,1,3,4,2,4,3,4,4,1,2,}), 9, 12, 3, CCC::SINGLETHREAD), -0.050000000000000023592239);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({3,3,2,2,4,2,4,1,4,1,4,4,3,1,1,3,4,1,4,4,2,3,2,1,4,3,2,3,2,1,1,2,2,2,2,1,2,3,1,3,2,2,1,1,3,2,3,4,3,3,}), ei({4,4,3,4,1,2,4,4,2,3,2,2,1,2,1,2,2,4,3,4,2,2,4,4,3,4,3,3,4,4,4,3,2,2,4,1,1,2,3,1,3,4,1,2,2,4,3,2,1,3,}), 11, 19, 3, CCC::SINGLETHREAD), -0.048987411056376557738634);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({1,3,4,1,4,4,1,1,2,4,2,2,3,1,1,4,3,2,4,1,2,3,2,2,3,4,4,1,2,2,4,2,1,3,2,4,4,4,3,3,4,1,2,1,4,3,2,1,3,2,}), ei({1,1,1,2,1,2,4,2,1,3,4,2,1,1,1,3,2,3,3,3,3,4,3,4,2,1,1,3,2,3,3,3,3,3,2,2,4,2,1,1,3,4,4,1,4,3,2,3,2,3,}), 10, 9, 1, CCC::SINGLETHREAD), -0.035842293906810054893164);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({4,2,4,1,1,4,4,4,4,1,3,4,3,4,1,4,4,3,2,2,3,1,2,4,3,2,2,2,4,4,3,4,2,2,1,1,4,3,3,4,3,3,1,3,1,1,3,3,1,2,}), ei({3,3,1,1,1,2,2,1,3,1,1,4,4,1,2,4,1,4,4,3,1,2,4,3,2,3,1,3,4,4,2,3,2,4,1,2,4,1,3,4,3,1,2,2,2,3,1,4,3,1,}), 8, 21, 3, CCC::SINGLETHREAD), -0.030612244897959169087631);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({3,2,2,3,1,2,4,4,4,4,1,3,3,4,3,2,3,4,3,1,4,1,3,1,2,4,1,4,3,2,1,2,4,1,3,3,3,4,2,2,4,4,2,1,3,1,3,2,2,3,}), ei({3,4,1,3,1,4,3,4,1,4,3,3,2,1,4,1,2,3,4,3,4,1,2,3,1,3,2,4,2,2,4,3,2,1,3,3,1,1,4,2,1,1,1,4,2,3,2,1,4,2,}), 5, 14, 2, CCC::SINGLETHREAD), -0.031250000000000013877788);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({2,3,4,3,2,1,2,1,4,3,1,3,1,4,2,3,3,3,2,1,2,1,3,1,4,3,4,3,1,2,4,4,2,4,1,3,2,3,2,1,2,3,1,2,3,4,2,2,4,3,}), ei({1,4,2,2,1,2,2,2,2,1,4,4,2,2,3,2,2,4,1,4,1,2,3,3,1,4,3,2,3,4,4,2,2,2,1,4,1,2,2,4,1,4,2,2,2,3,1,1,4,3,}), 6, 22, 3, CCC::SINGLETHREAD), -0.010582010582010595300950);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({2,1,5,7,1,1,5,5,4,1,5,7,7,1,3,2,4,5,3,6,6,6,3,1,5,7,2,1,7,4,6,6,2,2,1,5,6,4,1,7,4,3,2,5,5,6,2,3,2,6,}), ei({3,2,1,6,4,4,7,6,5,2,4,7,5,6,7,7,2,1,4,1,4,7,2,3,4,6,6,4,3,7,6,6,7,4,6,4,6,3,6,7,4,4,2,3,1,3,3,3,6,4,}), 8, 18, 1, CCC::SINGLETHREAD), -0.003333333333333336149368);
EXPECT_FLOAT_EQ(CCC::dynamicCCJoint(ei({2,2,2,2,3,1,3,3,1,1,2,3,2,1,2,2,2,1,3,2,2,1,2,1,1,3,2,1,2,3,1,3,1,1,1,3,1,3,1,1,3,1,2,3,3,3,3,2,1,2,}), ei({1,3,2,3,3,2,1,3,3,3,3,3,2,3,2,3,1,3,1,2,2,1,3,2,3,2,3,2,3,3,2,3,2,3,1,3,1,1,3,3,3,1,3,2,2,3,3,1,3,1,}), 6, 8, 3, CCC::SINGLETHREAD), -0.078754578754578710708678);
}
TEST(CCCTest, CCCausalityTest) {
// // EXPECT_FLOAT_EQ(CCC::CCCausality({1,2,3,4,1,1,3,7,1,2,3,7,7,}, {1,5,3,7,1,1,3,7,1,2,4,7,3,}, 3, 3, 1), 0);
EXPECT_FLOAT_EQ(get<0>(CCC::CCCausality(ei({1,5,3,7,1,1,3,7,1,2,4,7,3,}),ei({1,2,3,4,1,1,3,7,1,2,3,7,7,}), 3, 3, 1)), -0.057142857142857127195068);
EXPECT_FLOAT_EQ(get<0>(CCC::CCCausality(ei({2,4,3,3,3,3,1,4,4,1,4,4,4,1,4,3,1,2,4,4,1,2,1,4,2,4,2,4,1,4,1,3,3,2,1,4,1,2,1,1,2,4,1,3,3,1,2,4,1,3,}), ei({3,3,2,3,2,1,2,3,3,4,4,1,3,3,2,2,2,3,4,1,4,3,4,1,2,1,3,4,2,1,2,2,3,3,2,4,4,3,1,3,2,4,2,3,3,1,3,1,1,1,}), 3, 3, 1)), -0.009090909090909073120290);
EXPECT_FLOAT_EQ(get<0>(CCC::CCCausality(ei({1,2,3,2,4,2,1,3,1,4,4,2,1,1,2,4,3,2,2,2,4,4,3,3,3,1,3,1,2,2,1,1,4,3,2,2,1,1,2,2,4,2,2,1,4,3,4,3,4,4,}), ei({2,3,3,2,4,1,1,1,1,3,3,2,2,1,4,3,2,1,4,4,4,2,4,4,1,1,4,2,2,4,4,4,3,4,2,1,2,2,3,1,1,1,4,4,3,4,4,4,1,4,}), 3, 3, 1)), 0.009090909090909099141142);
EXPECT_FLOAT_EQ(get<0>(CCC::CCCausality(ei({1,3,4,2,4,1,2,2,1,3,2,4,2,3,1,3,3,4,3,4,4,1,1,4,1,2,2,3,1,4,4,3,2,1,3,1,1,1,2,3,4,2,1,2,3,4,2,2,4,3,}), ei({3,2,2,4,2,2,2,3,3,3,2,2,2,1,2,4,4,3,4,4,4,4,4,1,2,2,2,1,4,3,1,1,3,2,1,2,1,4,4,1,3,3,2,4,2,1,1,4,3,4,}), 9, 10, 1)), -0.014336917562723941466096);
EXPECT_FLOAT_EQ(get<0>(CCC::CCCausality(ei({3,4,3,4,4,4,1,1,1,1,1,3,3,4,3,2,2,2,3,1,3,4,3,2,3,2,1,4,3,2,4,1,2,2,1,1,3,1,3,2,2,4,1,1,4,3,3,3,1,4,}), ei({2,3,2,1,3,3,1,1,4,1,2,4,4,3,4,3,3,3,4,3,2,3,2,1,2,3,2,2,4,3,2,1,2,2,3,3,4,4,1,4,1,4,3,1,1,2,4,1,2,1,}), 6, 6, 3)), -0.020979020979020986809038);
EXPECT_FLOAT_EQ(get<0>(CCC::CCCausality(ei({2,2,2,1,1,2,1,2,1,1,1,2,2,2,2,2,2,2,1,1,1,2,2,1,2,1,1,2,2,2,2,2,2,1,1,2,1,1,1,2,2,2,2,2,2,1,2,1,1,1,}), ei({2,2,2,1,2,2,1,1,2,2,1,1,1,2,1,2,2,1,2,2,2,2,1,1,1,1,1,1,2,1,2,2,1,1,1,2,1,2,1,1,2,2,2,1,1,2,2,1,1,1,}), 8, 6, 1)), 0.027777778);
EXPECT_FLOAT_EQ(get<0>(CCC::CCCausality(ei({10,7,7,10,5,1,14,4,17,9,7,15,15,4,3,4,13,17,11,4,15,19,5,18,5,17,18,11,10,18,2,11,13,15,5,1,3,16,20,8,20,7,3,8,12,13,11,7,4,4,}), ei({3,15,10,3,15,4,17,11,11,5,16,11,12,9,15,2,12,18,9,14,7,13,6,16,16,20,9,10,12,17,1,4,19,19,10,17,19,14,8,9,9,14,10,20,8,7,18,11,15,3,}), 8, 6, 2)), 0);
}
TEST(CCCTest, CCCausalityMassTest) {
ArrayXL s1(100),s2(100);
for(int i=0; i < 10; i++) {
for(int j=0; j < s1.size(); j++) {
s1[j] = rand() % 16;
s2[j] = rand() % 16;
}
double res = get<0>(CCC::CCCausality(s1, s2, 30, 50, 1));
cout << res << ", ";
}
}
TEST(CCCTest, LZTest) {
EXPECT_EQ(LZ::calc(ei({0,1})), 2);
EXPECT_EQ(LZ::calc(ei({0,1,3,3})), 3);
EXPECT_EQ(LZ::calc(ei({1,2,3,3,3,2,3,1})), 5);
EXPECT_EQ(LZ::calc(ei({100,9,8,101,102,2,3,4,9,100,103,104,101,105,8,9,106,2,3,4,9,8,6,105,3,100})), 19);
}
TEST(CCCTest, RPCProjMatrixTest) {
auto proj = RPC::createProjectionMatrix(10,2);
EXPECT_EQ(proj.rows(), 2);
EXPECT_EQ(proj.cols(), 10);
}
TEST(CCCTest, RPCProjectionTest) {
auto proj = RPC::createProjectionMatrix(4,2);
Eigen::VectorXd data(12);
data << 0,0,1,0,2,0,0,0,1,0,0,0;
// cout << data << endl;
EXPECT_LT(RPC::calc(proj, data, 10), 5);
data = Eigen::VectorXd::Random(100,1);
// cout << data << endl;
EXPECT_GT(RPC::calc(proj, data, 4), 5);
auto proj2 = RPC::createProjectionMatrix(10,3);
EXPECT_GT(RPC::calc(proj2, data, 3, 0.001), 5);
}
TEST(CCCTest, RPCIndexing) {
Eigen::VectorXd idx1d(1);
idx1d << 3;
EXPECT_EQ(RPC::calcXdFlatArrayIndex(idx1d,10), 3);
EXPECT_EQ(RPC::calcXdFlatArrayIndex(idx1d,1000), 3);
Eigen::VectorXd idx2d(2);
idx2d << 0,0;
EXPECT_EQ(RPC::calcXdFlatArrayIndex(idx2d,10), 0);
idx2d << 1,0;
EXPECT_EQ(RPC::calcXdFlatArrayIndex(idx2d,10), 10);
idx2d << 9,9;
EXPECT_EQ(RPC::calcXdFlatArrayIndex(idx2d,10), 99);
Eigen::VectorXd idx3d(3);
idx3d << 1,1,1;
EXPECT_EQ(RPC::calcXdFlatArrayIndex(idx3d,4), 21);
idx3d << 0,0,1;
EXPECT_EQ(RPC::calcXdFlatArrayIndex(idx3d,4), 1);
idx3d << 0,2,1;
EXPECT_EQ(RPC::calcXdFlatArrayIndex(idx3d,4), 9);
idx3d << 2,2,1;
EXPECT_EQ(RPC::calcXdFlatArrayIndex(idx3d,4), 41);
}
TEST(CCCTest, sevcik) {
Eigen::VectorXd data(12);
data << 1.0, 3.0, 4.2, 4.2, 1.3,1.2,9.7,4.2, 2.71,2,5,10.3;
EXPECT_DOUBLE_EQ(fractal::sevcik::calc(data), 1.417138504999742);
Eigen::VectorXd data2(10);
data2 << 0.59268124, 0.10992054, 0.49541226, 0.92321486, 0.15333986,
0.10439158, 0.42802243, 0.22755213, 0.71985698, 0.84432153;
EXPECT_NEAR(fractal::sevcik::calc(data2), 1.4940149591892897, 0.00001);
Eigen::VectorXd data3(100);
data3 << 0. , 0.04997917, 0.09983342, 0.14943813, 0.19866933,
0.24740396, 0.29552021, 0.34289781, 0.38941834, 0.43496553,
0.47942554, 0.52268723, 0.56464247, 0.60518641, 0.64421769,
0.68163876, 0.71735609, 0.75128041, 0.78332691, 0.8134155 ,
0.84147098, 0.86742323, 0.89120736, 0.91276394, 0.93203909,
0.94898462, 0.96355819, 0.97572336, 0.98544973, 0.99271299,
0.99749499, 0.99978376, 0.9995736 , 0.99686503, 0.99166481,
0.98398595, 0.97384763, 0.9612752 , 0.94630009, 0.92895972,
0.90929743, 0.88736237, 0.86320937, 0.83689879, 0.8084964 ,
0.7780732 , 0.74570521, 0.71147335, 0.67546318, 0.6377647 ,
0.59847214, 0.55768372, 0.51550137, 0.47203054, 0.42737988,
0.38166099, 0.33498815, 0.28747801, 0.23924933, 0.19042265,
0.14112001, 0.09146464, 0.04158066, -0.00840725, -0.05837414,
-0.10819513, -0.15774569, -0.20690197, -0.2555411 , -0.30354151,
-0.35078323, -0.39714817, -0.44252044, -0.48678665, -0.52983614,
-0.57156132, -0.61185789, -0.65062514, -0.68776616, -0.72318812,
-0.7568025 , -0.78852525, -0.81827711, -0.8459837 , -0.87157577,
-0.89498936, -0.91616594, -0.93505258, -0.95160207, -0.96577306,
-0.97753012, -0.98684386, -0.993691 , -0.99805444, -0.99992326,
-0.99929279, -0.99616461, -0.99054654, -0.98245261, -0.97190307;
EXPECT_NEAR(fractal::sevcik::calc(data3), 1.1202632289010772, 0.00001);
}
int main(int argc, char **argv) {
cout << "CCC library tests\n";
// VectorXi test {0};
::testing::InitGoogleTest(&argc, argv);
int res = RUN_ALL_TESTS();
unsigned int n = std::thread::hardware_concurrency();
std::cout << n << " concurrent threads are supported.\n";
//perf testing
// auto proj = RPC::createProjectionMatrix(64,4);
// auto data = Eigen::VectorXd::Random(1000,1);
// clock_t t = clock();
// auto dataSym = ArrayXL::Random(1000,1);
// cout << dataSym << endl;
// for(int i=0; i < 1000; i++) {
// RPC::calc(proj, data, 100, 0.5);
// shannonEntropy::calc(dataSym);
// LZ::calc(dataSym);
// fractal::sevcik::calc(data);
// }
// const double work_time = (clock() - t) / double(CLOCKS_PER_SEC) * 1000;
// cout << work_time << " ms" << endl;
// auto tmp = ei({7,8,9});
// cout << tmp << endl;
// cout << "---" << endl;
// cout << tmp.segment(0,1) << endl;
// cout << "---" << endl;
// cout << tmp.segment(1,1) << endl;
// cout << "---" << endl;
// cout << tmp.segment(0,2) << endl;
// cout << "---" << endl;
// cout << tmp.segment(0,3) << endl;
// cout << "---" << endl;
// cout << tmp.segment(1,2) << endl;
//perf testing
// clock_t t = clock();
// for(int i=0; i < 86; i++) {
// ivec x(86);
// for(int j=0; j<x.size(); j++) x[j] = rand() % 16;
// cout << ETC::calc(x) << endl;
// }
// const double work_time = (clock() - t) / double(CLOCKS_PER_SEC) * 1000;
// cout << work_time << " ms" << endl;
// ivec test = {0,1,2,3,4,5,6,7,8,9};
// int offset=9, dx=2, past=3;
// cout << test.subvec(offset-dx-past+1,offset) << endl;
// cout << test.subvec(offset-dx-past+1,offset-dx) << endl;
// ivec test = {1,2,3,4,5,6,7,8,9};
// ivec test2 = {10,11,12,13,14,15};
// ivec comb = test.subvec(0,6);
// comb(span(4,5)) = test2(span(4,5));
// cout << test.t() << endl;
// cout << test2.t() << endl;
// cout << comb.t() << endl;
return res;
}