summaryrefslogtreecommitdiff
path: root/src/Persistence_representations/test/vector_representation_test.cpp
blob: 9c038727257f9ee5aaebbcf58b35a11299fcd8e0 (plain)
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
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
/*    This file is part of the Gudhi Library. The Gudhi library
 *    (Geometric Understanding in Higher Dimensions) is a generic C++
 *    library for computational topology.
 *
 *    Author(s):       Pawel Dlotko
 *
 *    Copyright (C) 2016 Inria
 *
 *    Modification(s):
 *      - YYYY/MM Author: Description of the modification
 */

#include <gudhi/Persistence_vectors.h>
#include <gudhi/common_persistence_representations.h>
#include <gudhi/read_persistence_from_file.h>
#include <iostream>

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE "vector_representation_test"
#include <boost/test/unit_test.hpp>
#include <gudhi/reader_utils.h>
#include <vector>
#include <cmath>
#include <iomanip>

using namespace Gudhi;
using namespace Gudhi::Persistence_representations;

BOOST_AUTO_TEST_CASE(check_read_write_to_files) {
  std::vector<std::pair<double, double> > intervals;
  intervals.push_back(std::make_pair(2, 3));
  intervals.push_back(std::make_pair(4, 7));
  intervals.push_back(std::make_pair(9, 10));
  intervals.push_back(std::make_pair(3, 11));
  Vector_distances_in_diagram<Euclidean_distance> p(intervals, -1);
  p.write_to_file("test_vector_representation_write_read");

  Vector_distances_in_diagram<Euclidean_distance> q;
  q.load_from_file("test_vector_representation_write_read");

  BOOST_CHECK(p == q);
}

BOOST_AUTO_TEST_CASE(check_sortev_vector_distances_template) {
  Vector_distances_in_diagram<Euclidean_distance> p("data/file_with_diagram", 100);
  std::vector<double> sortev_vector_distances_template;

  sortev_vector_distances_template.push_back(0.609968);
  sortev_vector_distances_template.push_back(0.566317);
  sortev_vector_distances_template.push_back(0.538858);
  sortev_vector_distances_template.push_back(0.534927);
  sortev_vector_distances_template.push_back(0.515741);
  sortev_vector_distances_template.push_back(0.507828);
  sortev_vector_distances_template.push_back(0.500911);
  sortev_vector_distances_template.push_back(0.496986);
  sortev_vector_distances_template.push_back(0.495306);
  sortev_vector_distances_template.push_back(0.439945);
  sortev_vector_distances_template.push_back(0.424097);
  sortev_vector_distances_template.push_back(0.413891);
  sortev_vector_distances_template.push_back(0.413891);
  sortev_vector_distances_template.push_back(0.413891);
  sortev_vector_distances_template.push_back(0.412621);
  sortev_vector_distances_template.push_back(0.410613);
  sortev_vector_distances_template.push_back(0.407853);
  sortev_vector_distances_template.push_back(0.407853);
  sortev_vector_distances_template.push_back(0.402306);
  sortev_vector_distances_template.push_back(0.401937);
  sortev_vector_distances_template.push_back(0.377605);
  sortev_vector_distances_template.push_back(0.363859);
  sortev_vector_distances_template.push_back(0.357765);
  sortev_vector_distances_template.push_back(0.357765);
  sortev_vector_distances_template.push_back(0.357765);
  sortev_vector_distances_template.push_back(0.357765);
  sortev_vector_distances_template.push_back(0.357765);
  sortev_vector_distances_template.push_back(0.353401);
  sortev_vector_distances_template.push_back(0.348004);
  sortev_vector_distances_template.push_back(0.345124);
  sortev_vector_distances_template.push_back(0.345124);
  sortev_vector_distances_template.push_back(0.345124);
  sortev_vector_distances_template.push_back(0.345124);
  sortev_vector_distances_template.push_back(0.345124);
  sortev_vector_distances_template.push_back(0.345124);
  sortev_vector_distances_template.push_back(0.345124);
  sortev_vector_distances_template.push_back(0.345124);
  sortev_vector_distances_template.push_back(0.345124);
  sortev_vector_distances_template.push_back(0.345124);
  sortev_vector_distances_template.push_back(0.345124);
  sortev_vector_distances_template.push_back(0.345124);
  sortev_vector_distances_template.push_back(0.345124);
  sortev_vector_distances_template.push_back(0.345124);
  sortev_vector_distances_template.push_back(0.34469);
  sortev_vector_distances_template.push_back(0.339466);
  sortev_vector_distances_template.push_back(0.33935);
  sortev_vector_distances_template.push_back(0.32834);
  sortev_vector_distances_template.push_back(0.327276);
  sortev_vector_distances_template.push_back(0.318626);
  sortev_vector_distances_template.push_back(0.318082);
  sortev_vector_distances_template.push_back(0.30603);
  sortev_vector_distances_template.push_back(0.30525);
  sortev_vector_distances_template.push_back(0.297308);
  sortev_vector_distances_template.push_back(0.296333);
  sortev_vector_distances_template.push_back(0.296333);
  sortev_vector_distances_template.push_back(0.296333);
  sortev_vector_distances_template.push_back(0.296333);
  sortev_vector_distances_template.push_back(0.293372);
  sortev_vector_distances_template.push_back(0.292666);
  sortev_vector_distances_template.push_back(0.292666);
  sortev_vector_distances_template.push_back(0.292666);
  sortev_vector_distances_template.push_back(0.292666);
  sortev_vector_distances_template.push_back(0.292666);
  sortev_vector_distances_template.push_back(0.292666);
  sortev_vector_distances_template.push_back(0.292666);
  sortev_vector_distances_template.push_back(0.292666);
  sortev_vector_distances_template.push_back(0.292666);
  sortev_vector_distances_template.push_back(0.292666);
  sortev_vector_distances_template.push_back(0.292666);
  sortev_vector_distances_template.push_back(0.292666);
  sortev_vector_distances_template.push_back(0.292666);
  sortev_vector_distances_template.push_back(0.292666);
  sortev_vector_distances_template.push_back(0.292666);
  sortev_vector_distances_template.push_back(0.29029);
  sortev_vector_distances_template.push_back(0.290218);
  sortev_vector_distances_template.push_back(0.289782);
  sortev_vector_distances_template.push_back(0.288128);
  sortev_vector_distances_template.push_back(0.286416);
  sortev_vector_distances_template.push_back(0.285969);
  sortev_vector_distances_template.push_back(0.282046);
  sortev_vector_distances_template.push_back(0.28154);
  sortev_vector_distances_template.push_back(0.281085);
  sortev_vector_distances_template.push_back(0.280227);
  sortev_vector_distances_template.push_back(0.279273);
  sortev_vector_distances_template.push_back(0.278936);
  sortev_vector_distances_template.push_back(0.278706);
  sortev_vector_distances_template.push_back(0.278507);
  sortev_vector_distances_template.push_back(0.278097);
  sortev_vector_distances_template.push_back(0.276293);
  sortev_vector_distances_template.push_back(0.276293);
  sortev_vector_distances_template.push_back(0.276293);
  sortev_vector_distances_template.push_back(0.276293);
  sortev_vector_distances_template.push_back(0.276293);
  sortev_vector_distances_template.push_back(0.276293);
  sortev_vector_distances_template.push_back(0.276293);
  sortev_vector_distances_template.push_back(0.276293);
  sortev_vector_distances_template.push_back(0.276293);
  sortev_vector_distances_template.push_back(0.276169);
  sortev_vector_distances_template.push_back(0.270563);
  sortev_vector_distances_template.push_back(0.264009);

  size_t proj_no = p.number_of_vectorize_functions();
  std::vector<double> aa = p.vectorize(proj_no);

  for (size_t i = 0; i != aa.size(); ++i) {
    BOOST_CHECK(almost_equal(sortev_vector_distances_template[i], aa[i]));
  }
}

BOOST_AUTO_TEST_CASE(check_projections_to_R) {
  Vector_distances_in_diagram<Euclidean_distance> p("data/file_with_diagram", 100);
  std::vector<double> proj;
  proj.push_back(0);
  proj.push_back(0.6099679993);
  proj.push_back(1.176284775);
  proj.push_back(1.715142954);
  proj.push_back(2.25006986);
  proj.push_back(2.765810506);
  proj.push_back(3.273638431);
  proj.push_back(3.774549309);
  proj.push_back(4.271535042);
  proj.push_back(4.766840875);
  proj.push_back(5.206786149);
  proj.push_back(5.63088295);
  proj.push_back(6.04477433);
  proj.push_back(6.45866571);
  proj.push_back(6.87255709);
  proj.push_back(7.285177939);
  proj.push_back(7.695791381);
  proj.push_back(8.103643945);
  proj.push_back(8.511496508);
  proj.push_back(8.913802775);
  proj.push_back(9.315740229);
  proj.push_back(9.693344927);
  proj.push_back(10.0572035);
  proj.push_back(10.41496899);
  proj.push_back(10.77273448);
  proj.push_back(11.13049996);
  proj.push_back(11.48826545);
  proj.push_back(11.84603094);
  proj.push_back(12.19943233);
  proj.push_back(12.5474364);
  proj.push_back(12.89256042);
  proj.push_back(13.23768444);
  proj.push_back(13.58280846);
  proj.push_back(13.92793248);
  proj.push_back(14.2730565);
  proj.push_back(14.61818051);
  proj.push_back(14.96330453);
  proj.push_back(15.30842855);
  proj.push_back(15.65355257);
  proj.push_back(15.99867659);
  proj.push_back(16.34380061);
  proj.push_back(16.68892462);
  proj.push_back(17.03404864);
  proj.push_back(17.37917266);
  proj.push_back(17.7238622);
  proj.push_back(18.06332781);
  proj.push_back(18.40267754);
  proj.push_back(18.73101759);
  proj.push_back(19.05829313);
  proj.push_back(19.3769189);
  proj.push_back(19.69500045);
  proj.push_back(20.0010306);
  proj.push_back(20.30628026);
  proj.push_back(20.60358868);
  proj.push_back(20.89992192);
  proj.push_back(21.19625516);
  proj.push_back(21.4925884);
  proj.push_back(21.78892164);
  proj.push_back(22.08229394);
  proj.push_back(22.37495987);
  proj.push_back(22.66762581);
  proj.push_back(22.96029174);
  proj.push_back(23.25295768);
  proj.push_back(23.54562361);
  proj.push_back(23.83828955);
  proj.push_back(24.13095549);
  proj.push_back(24.42362142);
  proj.push_back(24.71628736);
  proj.push_back(25.00895329);
  proj.push_back(25.30161923);
  proj.push_back(25.59428516);
  proj.push_back(25.8869511);
  proj.push_back(26.17961703);
  proj.push_back(26.47228297);
  proj.push_back(26.76257262);
  proj.push_back(27.05279049);
  proj.push_back(27.34257265);
  proj.push_back(27.63070097);
  proj.push_back(27.91711687);
  proj.push_back(28.20308566);
  proj.push_back(28.48513176);
  proj.push_back(28.76667161);
  proj.push_back(29.04775635);
  proj.push_back(29.32798359);
  proj.push_back(29.60725702);
  proj.push_back(29.88619335);
  proj.push_back(30.16489915);
  proj.push_back(30.44340655);
  proj.push_back(30.72150329);
  proj.push_back(30.99779604);
  proj.push_back(31.27408878);
  proj.push_back(31.55038153);
  proj.push_back(31.82667427);
  proj.push_back(32.10296702);
  proj.push_back(32.37925976);
  proj.push_back(32.6555525);
  proj.push_back(32.93184525);
  proj.push_back(33.20813799);
  proj.push_back(33.48430662);
  proj.push_back(33.7548692);

  for (size_t proj_no = 0; proj_no != p.number_of_projections_to_R(); ++proj_no) {
    // cout << std::setprecision(10)  << 	p.project_to_R(proj_no) << endl;
    BOOST_CHECK(almost_equal(p.project_to_R(proj_no), proj[proj_no]));
  }
}

BOOST_AUTO_TEST_CASE(check_distance_computations) {
  Vector_distances_in_diagram<Euclidean_distance> p("data/file_with_diagram", 100);
  Vector_distances_in_diagram<Euclidean_distance> p_prime("data/file_with_diagram", 10);
  std::vector<std::pair<double, double> > intervals(10);
  intervals[0] = std::pair<double, double>(1, 2);
  intervals[1] = std::pair<double, double>(3, 4);
  intervals[2] = std::pair<double, double>(5, 6);
  intervals[3] = std::pair<double, double>(7, 8);
  intervals[4] = std::pair<double, double>(9, 10);
  intervals[5] = std::pair<double, double>(11, 12);
  intervals[6] = std::pair<double, double>(13, 14);
  intervals[7] = std::pair<double, double>(15, 16);
  intervals[8] = std::pair<double, double>(17, 18);
  intervals[9] = std::pair<double, double>(19, 20);
  Vector_distances_in_diagram<Euclidean_distance> p_bis(intervals, 10);
  // cerr << "p_prime.distance( (Abs_Topological_data_with_distances*)(&p_bis) , 1 ) : " << p_prime.distance(
  // (Abs_Topological_data_with_distances*)(&p_bis) , 1 ) << endl;
  BOOST_CHECK(almost_equal(p_prime.distance(p_bis, 1), 1.86428));
}

BOOST_AUTO_TEST_CASE(check_default_parameters_of_distances) {
  std::vector<std::pair<double, double> > diag = read_persistence_intervals_in_dimension("data/file_with_diagram");
  Vector_distances_in_diagram<Euclidean_distance> p(diag, 100);

  std::vector<std::pair<double, double> > diag1 = read_persistence_intervals_in_dimension("data/file_with_diagram_1");
  Vector_distances_in_diagram<Euclidean_distance> q(diag1, 100);

  double dist_numeric_limit_max = p.distance(q, std::numeric_limits<double>::max());
  double dist_infinity = p.distance(q, std::numeric_limits<double>::infinity());

  BOOST_CHECK(dist_numeric_limit_max == dist_infinity);
}

BOOST_AUTO_TEST_CASE(check_compute_average) {
  Vector_distances_in_diagram<Euclidean_distance> p("data/file_with_diagram", 100);
  // compute average
  std::vector<std::pair<double, double> > i1(3);
  i1[0] = std::pair<double, double>(1, 2);
  i1[1] = std::pair<double, double>(3, 8);
  i1[2] = std::pair<double, double>(1, 6);

  std::vector<std::pair<double, double> > i2(3);
  i2[0] = std::pair<double, double>(2, 9);
  i2[1] = std::pair<double, double>(2, 15);
  i2[2] = std::pair<double, double>(6, 17);

  Vector_distances_in_diagram<Euclidean_distance> A(i1, -1);
  Vector_distances_in_diagram<Euclidean_distance> B(i1, -1);

  Vector_distances_in_diagram<Euclidean_distance> average;
  average.compute_average({&A, &B});

  Vector_distances_in_diagram<Euclidean_distance> template_average;
  template_average.load_from_file("data/average_of_persistence_vectors");

  BOOST_CHECK(template_average == average);
}

BOOST_AUTO_TEST_CASE(check_arythmetic_operations) {
  std::vector<std::pair<double, double> > i1(3);
  i1[0] = std::pair<double, double>(1, 2);
  i1[1] = std::pair<double, double>(3, 8);
  i1[2] = std::pair<double, double>(1, 6);

  std::vector<std::pair<double, double> > i2(3);
  i2[0] = std::pair<double, double>(2, 9);
  i2[1] = std::pair<double, double>(2, 15);
  i2[2] = std::pair<double, double>(6, 17);

  Vector_distances_in_diagram<Euclidean_distance> A(i1, -1);
  Vector_distances_in_diagram<Euclidean_distance> B(i1, -1);

  Vector_distances_in_diagram<Euclidean_distance> sum = A + B;
  Vector_distances_in_diagram<Euclidean_distance> difference = A - B;

  BOOST_CHECK(almost_equal(sum.vector_in_position(0), 7.07107));
  BOOST_CHECK(almost_equal(sum.vector_in_position(1), 7.07107));
  BOOST_CHECK(almost_equal(sum.vector_in_position(2), 5.65685));
  BOOST_CHECK(almost_equal(sum.vector_in_position(3), 1.41421));
  BOOST_CHECK(almost_equal(sum.vector_in_position(4), 1.41421));
  BOOST_CHECK(almost_equal(sum.vector_in_position(5), 1.41421));

  BOOST_CHECK(almost_equal(difference.vector_in_position(0), 0));
  BOOST_CHECK(almost_equal(difference.vector_in_position(1), 0));
  BOOST_CHECK(almost_equal(difference.vector_in_position(2), 0));
  BOOST_CHECK(almost_equal(difference.vector_in_position(3), 0));
  BOOST_CHECK(almost_equal(difference.vector_in_position(4), 0));
  BOOST_CHECK(almost_equal(difference.vector_in_position(5), 0));

  Vector_distances_in_diagram<Euclidean_distance> prod = 2. * A;
  BOOST_CHECK(almost_equal(prod.vector_in_position(0), 7.07107));
  BOOST_CHECK(almost_equal(prod.vector_in_position(1), 7.07107));
  BOOST_CHECK(almost_equal(prod.vector_in_position(2), 5.65685));
  BOOST_CHECK(almost_equal(prod.vector_in_position(3), 1.41421));
  BOOST_CHECK(almost_equal(prod.vector_in_position(4), 1.41421));
  BOOST_CHECK(almost_equal(prod.vector_in_position(5), 1.41421));

  Vector_distances_in_diagram<Euclidean_distance> prod1 = A * 2;
  BOOST_CHECK(almost_equal(prod1.vector_in_position(0), 7.07107));
  BOOST_CHECK(almost_equal(prod1.vector_in_position(1), 7.07107));
  BOOST_CHECK(almost_equal(prod1.vector_in_position(2), 5.65685));
  BOOST_CHECK(almost_equal(prod1.vector_in_position(3), 1.41421));
  BOOST_CHECK(almost_equal(prod1.vector_in_position(4), 1.41421));
  BOOST_CHECK(almost_equal(prod1.vector_in_position(5), 1.41421));
}