summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeGUDHIVersion.txt4
-rw-r--r--[-rwxr-xr-x]data/points/KleinBottle5D.off0
-rw-r--r--[-rwxr-xr-x]data/points/human.off0
-rw-r--r--data/points/iso_cuboid_3_in_0_10.txt1
-rw-r--r--data/points/shifted_sphere.off1002
-rw-r--r--data/points/shifted_sphere.weights1000
-rw-r--r--src/Alpha_complex/include/gudhi/Alpha_complex.h2
-rw-r--r--src/Alpha_complex/utilities/CMakeLists.txt2
-rw-r--r--src/Alpha_complex/utilities/alpha_complex_3d_helper.h8
-rw-r--r--src/Alpha_complex/utilities/alpha_complex_3d_persistence.cpp50
-rw-r--r--src/Alpha_complex/utilities/exact_alpha_complex_3d_persistence.cpp33
-rw-r--r--src/Alpha_complex/utilities/periodic_alpha_complex_3d_persistence.cpp47
-rw-r--r--src/Alpha_complex/utilities/weighted_alpha_complex_3d_persistence.cpp33
-rw-r--r--src/Alpha_complex/utilities/weighted_periodic_alpha_complex_3d_persistence.cpp85
-rw-r--r--src/Bottleneck_distance/include/gudhi/Neighbors_finder.h2
-rw-r--r--src/Doxyfile2
-rw-r--r--src/Persistence_representations/include/gudhi/PSSK.h8
-rw-r--r--src/Persistence_representations/include/gudhi/Persistence_heat_maps.h11
-rw-r--r--src/Persistence_representations/include/gudhi/Persistence_intervals.h5
-rw-r--r--src/Persistence_representations/include/gudhi/Persistence_intervals_with_distances.h1
-rw-r--r--src/Persistence_representations/include/gudhi/Persistence_landscape.h119
-rw-r--r--src/Persistence_representations/include/gudhi/Persistence_vectors.h4
-rw-r--r--src/Persistence_representations/include/gudhi/read_persistence_from_file.h128
-rw-r--r--src/Persistence_representations/test/persistence_lanscapes_test.cpp4
-rw-r--r--src/Persistent_cohomology/doc/Intro_persistent_cohomology.h31
-rw-r--r--src/Simplex_tree/include/gudhi/Simplex_tree.h103
-rw-r--r--src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_iterators.h32
-rw-r--r--src/Subsampling/include/gudhi/choose_n_farthest_points.h4
-rw-r--r--src/cmake/modules/GUDHI_third_party_libraries.cmake2
-rw-r--r--src/common/doc/main_page.h4
-rw-r--r--src/common/include/gudhi/Debug_utils.h2
-rw-r--r--src/cython/cython/simplex_tree.pyx11
-rw-r--r--src/cython/doc/witness_complex_user.rst2
-rw-r--r--src/cython/include/Tangential_complex_interface.h2
34 files changed, 2352 insertions, 392 deletions
diff --git a/CMakeGUDHIVersion.txt b/CMakeGUDHIVersion.txt
index bfef1590..cb07e55a 100644
--- a/CMakeGUDHIVersion.txt
+++ b/CMakeGUDHIVersion.txt
@@ -1,6 +1,6 @@
set (GUDHI_MAJOR_VERSION 2)
-set (GUDHI_MINOR_VERSION 0)
-set (GUDHI_PATCH_VERSION 1)
+set (GUDHI_MINOR_VERSION 1)
+set (GUDHI_PATCH_VERSION 0.rc1)
set(GUDHI_VERSION ${GUDHI_MAJOR_VERSION}.${GUDHI_MINOR_VERSION}.${GUDHI_PATCH_VERSION})
message(STATUS "GUDHI version : ${GUDHI_VERSION}")
diff --git a/data/points/KleinBottle5D.off b/data/points/KleinBottle5D.off
index b578593c..b578593c 100755..100644
--- a/data/points/KleinBottle5D.off
+++ b/data/points/KleinBottle5D.off
diff --git a/data/points/human.off b/data/points/human.off
index f9f79a3f..f9f79a3f 100755..100644
--- a/data/points/human.off
+++ b/data/points/human.off
diff --git a/data/points/iso_cuboid_3_in_0_10.txt b/data/points/iso_cuboid_3_in_0_10.txt
new file mode 100644
index 00000000..d4bd2233
--- /dev/null
+++ b/data/points/iso_cuboid_3_in_0_10.txt
@@ -0,0 +1 @@
+0.0 0.0 0.0 10.0 10.0 10.0
diff --git a/data/points/shifted_sphere.off b/data/points/shifted_sphere.off
new file mode 100644
index 00000000..54051bb1
--- /dev/null
+++ b/data/points/shifted_sphere.off
@@ -0,0 +1,1002 @@
+OFF
+1000 0 0
+9.30846 0.674959 0.354663
+0.319662 1.44971 1.83394
+9.65204 0.108855 0.71069
+0.436642 0.138375 0.741799
+0.0632498 0.127158 1.4832
+9.82265 1.72038 0.329397
+9.68531 1.67209 1.6711
+9.1011 1.35914 0.751961
+9.65025 0.282699 1.60289
+0.595828 0.729081 1.75592
+9.80149 0.757514 0.050331
+9.10316 1.37502 0.766079
+0.206286 1.28181 0.062618
+9.86287 0.599391 1.90637
+0.752303 0.959047 1.65779
+0.408715 0.370051 0.339071
+0.763951 0.35776 0.96287
+0.787187 1.58585 1.19409
+9.19533 1.56634 0.817889
+0.389083 1.48987 1.77932
+9.29707 1.50344 1.5013
+9.52194 1.25374 1.84083
+9.11152 1.14569 1.43541
+9.13003 0.676105 1.36907
+9.26591 0.33078 1.11691
+0.225878 1.68793 0.309819
+9.17648 1.48207 1.29953
+9.06088 0.770958 1.26066
+0.40229 1.67195 1.62168
+0.36113 0.210086 0.505648
+0.513719 0.606886 0.237303
+0.465305 1.00616 0.11343
+9.79064 0.531028 1.85772
+0.402296 1.68593 0.392899
+9.39871 0.785732 1.76864
+9.50963 0.769971 1.84125
+0.574711 0.232991 1.28278
+9.46029 1.74245 1.39506
+9.70859 1.728 0.381063
+9.40135 1.6228 0.497349
+9.80349 0.350047 0.265554
+0.5205 0.315442 0.489697
+9.66743 1.59533 0.268522
+0.63638 0.459809 1.55151
+9.32128 1.69746 1.22987
+0.579606 1.62531 0.477566
+9.46979 1.05065 0.153742
+0.497503 0.295609 0.494444
+9.5305 0.311525 0.448818
+0.201698 0.559269 1.87594
+9.40197 0.242174 0.739812
+9.80384 0.436469 0.196842
+0.917472 1.3961 1.03098
+0.430443 1.70418 1.56464
+0.734443 1.0951 0.327576
+0.128518 1.23079 0.036416
+0.512276 0.354876 1.5682
+0.335417 1.94211 0.96602
+9.41638 1.61148 0.466857
+9.66932 0.48881 1.79411
+0.693771 1.19897 1.69116
+0.500594 1.0148 0.134668
+9.1287 1.41163 0.734505
+0.512771 0.175531 0.757848
+0.688494 0.28064 0.912601
+9.81907 1.45648 1.87221
+9.59914 0.361106 1.65511
+9.6906 0.729731 1.9109
+0.38137 0.228081 1.50909
+9.89254 0.171539 0.451542
+9.3757 0.669098 1.70762
+0.567413 0.506158 0.341853
+9.41361 0.356943 0.504933
+0.693218 1.33146 0.359005
+9.33618 1.02829 0.25267
+0.33001 0.889273 1.93754
+0.634114 1.7631 1.11676
+9.20523 0.969888 1.6064
+9.49207 1.43389 1.74365
+9.48723 1.3551 1.78098
+0.353267 0.171761 0.566745
+0.00281403 1.95322 0.694855
+9.81863 0.133865 1.466
+9.18333 0.606508 1.42101
+0.809911 0.481932 1.27582
+0.618363 0.306112 1.36657
+0.57338 0.861296 1.80684
+9.52152 0.375778 1.61674
+9.22189 0.377518 0.927135
+0.0672128 0.104379 1.44149
+0.747095 0.927229 0.338673
+0.608156 0.704862 0.264126
+0.363804 0.074293 1.10006
+0.0122474 1.98089 1.19565
+9.56964 0.781257 0.124396
+9.75726 1.35396 1.90289
+0.580618 0.348216 0.51222
+0.90293 1.25833 0.655364
+0.707832 0.496896 1.49614
+9.91197 1.44047 0.106621
+0.62221 0.633297 0.308156
+0.738081 0.545317 1.49771
+9.26368 0.870001 0.336853
+9.41656 0.303368 1.41853
+0.660177 1.55316 0.492621
+9.29193 1.11476 0.302828
+0.753703 0.922288 1.65315
+9.90122 1.57401 0.186427
+9.89515 0.81988 0.022722
+0.943642 0.669905 1.03831
+0.35494 0.121196 1.3186
+0.113821 0.725036 0.044863
+0.78621 0.525938 0.602937
+0.9436 0.711032 1.164
+0.693706 0.996992 1.71948
+9.55737 0.66744 1.832
+0.033109 1.90074 0.567379
+0.0303382 1.59115 1.80647
+0.510765 0.383863 1.59787
+0.504748 1.62916 0.408589
+0.599172 0.347881 1.4643
+0.770621 1.4112 0.513994
+9.89523 1.04275 0.007174
+0.918102 1.39349 1.05751
+0.289995 0.2713 0.378792
+0.635603 0.346144 1.41236
+9.27103 0.366076 0.746158
+0.744256 1.58078 0.671541
+9.82547 1.69795 0.305921
+0.475202 1.79287 1.3805
+9.23064 1.61766 1.16769
+0.839446 0.471308 1.12654
+9.64484 1.06402 1.93287
+0.869122 1.31313 0.619081
+9.37852 0.613046 0.317987
+9.12666 1.01357 1.48593
+0.61551 0.509337 0.383014
+9.49447 0.289841 1.49055
+9.33656 1.65404 0.637152
+9.2815 1.21595 0.338471
+0.175223 1.66642 0.275799
+9.91146 1.81366 0.425203
+9.5727 0.096868 0.968795
+0.675554 0.341694 1.33051
+9.47093 0.373629 0.427866
+0.424603 0.384317 1.66227
+0.742433 1.66671 0.919566
+9.36778 0.442545 0.462367
+9.73883 1.78075 1.5683
+0.726513 0.323835 1.1158
+0.302755 1.38553 1.87211
+0.535727 1.42295 1.7306
+9.58514 0.244869 1.50895
+9.52125 0.246166 1.44982
+9.31431 1.62892 1.36503
+9.98779 0.257898 0.329823
+0.0579226 1.5191 1.85295
+0.0992393 1.41632 1.90423
+9.31551 1.62831 1.37069
+0.405234 1.88855 1.21584
+0.625832 1.50754 1.59278
+0.540334 1.01342 1.84151
+0.6496 0.542131 1.60709
+9.1196 1.26202 1.39519
+9.86104 0.212888 0.399129
+9.06495 1.24027 0.737926
+0.344454 0.185716 0.532575
+9.75547 1.66099 0.291572
+9.63087 1.87689 0.690648
+9.49262 1.54726 1.66683
+9.6166 0.390168 0.305417
+0.137617 1.74887 0.351788
+0.510714 0.156618 0.831459
+0.910054 1.31334 0.726199
+0.306053 0.148671 1.42861
+9.30128 0.760904 1.67389
+9.77787 1.97485 1.02163
+9.36039 0.274654 1.2556
+0.650794 0.707288 1.70052
+9.28551 0.89261 0.308749
+9.6073 0.750516 1.88548
+0.139642 0.374535 0.233686
+0.169241 1.00351 1.98452
+0.17452 1.73298 0.342129
+9.81048 1.29468 0.064031
+0.613694 0.491945 1.6058
+0.86926 0.511672 0.928761
+9.37715 0.254352 1.23831
+0.529366 0.500958 1.68549
+0.707169 0.370226 1.32004
+0.583783 0.810561 0.211606
+0.817859 0.614869 1.42783
+0.273889 1.8313 0.517321
+9.65951 0.109985 1.30326
+0.534185 1.66958 1.51599
+9.40421 1.79876 1.08529
+0.401013 1.44468 1.79996
+0.734147 0.681305 0.40045
+0.267486 1.65773 1.7031
+0.207956 1.58052 0.213657
+9.50709 1.75553 1.4317
+9.6408 1.91814 1.1672
+0.603943 1.79704 0.968268
+9.29105 0.675764 1.62584
+9.45715 0.724906 0.207524
+0.896406 1.44072 1.0199
+0.452172 1.56373 1.6909
+9.18298 0.426014 1.05132
+9.58257 1.90551 1.08378
+0.241326 0.669849 0.086473
+0.69452 0.649301 1.62797
+9.31101 0.393937 1.39491
+0.606919 1.74714 1.26936
+9.01696 1.12479 0.868244
+0.699129 1.16957 0.305401
+9.78814 1.9726 0.901019
+0.110775 1.21621 1.97039
+9.87457 0.228483 0.377592
+0.244342 0.245656 0.390684
+0.209537 0.523986 0.145469
+0.0681799 1.90388 1.42101
+9.19912 1.10591 0.411084
+9.39365 0.622151 1.69953
+0.585521 1.47394 1.65807
+9.59435 1.03292 1.91382
+9.58259 0.12136 1.23316
+9.32166 0.278287 1.13967
+9.92846 0.598427 0.087388
+9.58126 0.739163 0.131286
+9.49655 1.79467 0.65822
+9.33657 1.7484 1.016
+9.12701 1.46677 1.14482
+0.561281 1.431 0.294166
+9.78693 1.67653 0.294285
+9.34118 1.65731 0.633753
+0.710196 1.64238 0.709801
+0.886622 1.20789 1.41162
+0.0677664 1.88706 1.45798
+0.698576 1.64678 0.693225
+0.448705 1.4017 0.200863
+9.07985 1.18138 1.34817
+0.336259 0.075346 0.820857
+9.20408 1.60515 0.946053
+0.287467 0.837373 0.056324
+0.749378 1.41774 0.486959
+9.26923 1.37711 0.430709
+0.14936 1.42609 0.107197
+0.0714009 0.385934 0.213925
+9.8277 1.53049 1.82976
+0.708935 1.65578 0.738062
+0.0948228 1.02128 1.99598
+9.46121 1.82926 0.851863
+0.351601 0.320042 1.64413
+9.14855 1.5226 0.95391
+9.66048 1.89872 0.723401
+0.731093 1.54757 1.4081
+0.568092 1.55204 0.390022
+9.50103 1.02343 1.86631
+0.900843 1.06925 0.572554
+0.924983 0.750278 0.71105
+9.5152 1.53088 1.69393
+0.526094 0.382679 1.58711
+9.27225 0.58499 0.451932
+9.8952 0.339988 1.7439
+0.539653 0.16291 0.908454
+0.764392 0.718045 0.420146
+0.212162 1.58316 0.215563
+0.586207 0.190524 0.98709
+0.762071 1.35318 0.457938
+0.667942 1.58796 0.543524
+0.919602 0.817803 1.34976
+0.979513 1.19215 1.04643
+0.604525 0.415454 0.457791
+9.31338 1.18312 0.295843
+0.826517 1.56001 0.957552
+0.960202 1.00363 0.71871
+9.88889 0.593648 0.092558
+9.26776 1.42434 1.53417
+9.72683 0.212705 0.446213
+0.0892455 0.428248 1.81447
+9.1279 0.803382 1.44952
+0.567967 0.233242 0.700016
+0.713055 1.30645 1.63019
+9.39379 0.533988 1.64534
+9.79079 0.392974 1.76697
+0.189703 1.7765 0.399243
+0.452701 0.330663 1.59137
+9.90818 1.98953 1.11297
+0.791462 0.396492 1.10484
+0.365535 1.62772 1.68677
+9.32953 0.284113 0.810467
+9.40158 0.427932 0.437794
+9.391 1.1379 1.78265
+0.18534 1.63937 0.252221
+9.2501 1.64904 0.877825
+0.555286 0.945554 1.8299
+9.06892 0.733273 1.24644
+9.56004 1.88069 0.82576
+0.536902 1.59437 1.59971
+0.719609 1.53732 1.44135
+0.815317 1.48107 0.679938
+9.09161 1.07216 0.587408
+0.38704 0.393483 0.305542
+0.58356 0.931129 1.80986
+9.76549 0.315478 1.69017
+9.41161 1.49959 1.63564
+0.857946 1.14196 1.49573
+9.1062 0.55662 1.06206
+0.655278 0.37006 1.41593
+0.43935 1.77927 0.553587
+0.498884 0.633188 0.215244
+0.0413873 0.052232 0.68187
+9.21432 1.21157 1.58165
+9.3669 0.288726 1.30683
+9.21879 0.732198 1.56605
+0.137692 0.009768 0.98158
+0.534583 1.82836 0.832465
+9.49295 1.73478 0.550143
+9.91646 0.353096 0.242656
+0.589176 0.86984 0.202279
+0.362188 0.280249 0.408181
+0.274268 0.578879 1.86326
+0.604039 0.646069 1.71282
+0.223247 0.248073 1.6204
+9.80604 0.039333 0.800413
+9.34856 0.519354 0.413036
+0.575657 0.363191 0.487241
+9.77876 0.111893 0.59577
+9.35382 0.371739 0.566805
+0.390854 1.63041 0.329802
+0.326032 0.299066 1.63321
+0.276027 1.93536 0.780336
+9.5341 0.308619 0.448063
+9.69074 1.65329 1.69065
+0.80983 1.41519 0.583414
+0.214206 1.97686 1.01529
+9.30424 0.422441 1.4283
+9.03621 0.932833 1.25919
+0.0162511 1.47352 0.119265
+0.634681 1.62576 1.45132
+9.62458 0.421022 0.276348
+9.59186 0.094231 1.1144
+0.235683 0.039578 1.14882
+0.679211 0.561997 0.409886
+9.27834 1.23643 1.64976
+9.98396 1.1683 0.01445
+0.89075 0.574707 0.841959
+0.599068 1.71862 0.645656
+0.735763 0.802774 0.351296
+0.221189 1.63699 0.261565
+0.491243 1.76319 1.42035
+9.52118 1.65738 0.419019
+0.585694 0.375541 0.483415
+0.396747 1.018 1.91799
+0.272033 0.049254 0.849099
+9.69974 1.88908 0.65217
+9.68837 0.238558 1.56671
+0.00255645 1.10273 0.005041
+9.55682 1.89631 1.00269
+9.55587 0.301162 0.439312
+9.53807 1.4991 0.268301
+9.89207 0.216586 0.389146
+9.1795 0.588829 1.39745
+9.31832 1.72452 1.09325
+9.13622 1.06525 0.499373
+9.52185 1.36872 1.79725
+9.22658 1.61069 1.16485
+9.94276 1.24572 1.96796
+9.02696 1.0582 1.22697
+0.80752 0.708452 0.487053
+9.10573 1.4299 1.1269
+0.98495 0.860354 1.10283
+9.38055 1.15878 1.76855
+9.45367 0.19399 0.77129
+0.875921 0.781193 0.568202
+9.87074 0.769623 0.034773
+0.224263 0.295292 0.32622
+0.731827 0.618023 0.434908
+9.99886 1.69083 1.72367
+0.623328 0.634997 1.6922
+9.3372 0.587922 1.62543
+9.3572 1.59656 1.48079
+9.27659 1.1581 0.327505
+0.39176 1.74876 0.466292
+0.143229 0.295076 1.69381
+9.88444 1.35346 0.07155
+0.596156 0.885592 1.79536
+0.632835 1.35451 0.312432
+9.91148 1.91254 0.601527
+9.70675 0.132142 1.40151
+0.0379983 1.96093 0.727646
+0.0695625 1.67084 1.73697
+0.0497337 0.069458 1.36443
+0.467864 1.64334 0.39398
+9.88243 0.325653 0.271916
+9.25849 0.352779 0.826798
+9.41786 0.615693 0.283297
+9.77252 0.06521 0.730099
+9.07278 0.724821 0.745202
+0.541446 0.554969 1.71349
+9.07219 1.36188 0.910299
+9.96347 1.31989 0.053531
+9.94233 0.057785 0.672203
+0.851371 0.633945 1.37547
+9.41634 1.75703 1.29234
+0.432735 0.89891 1.89562
+9.42798 1.77295 0.723062
+0.718712 0.939884 0.307506
+9.39573 0.349571 1.46192
+9.8909 0.057458 0.681189
+0.587289 0.65288 1.73061
+9.49098 0.527971 0.278984
+0.531355 0.407789 1.60662
+0.44577 1.61302 0.34676
+9.4039 0.875696 1.79229
+9.30052 0.300747 0.857446
+9.97632 1.36358 0.068381
+0.977321 0.981502 1.21586
+0.18791 1.7447 1.64068
+9.77844 1.69616 1.68323
+9.45987 1.02334 1.84107
+9.62908 0.371649 0.315032
+0.837233 0.791406 0.495623
+0.186518 1.57329 1.79823
+9.2765 1.54891 0.58079
+0.551206 0.643942 0.247098
+9.23363 0.46334 1.35321
+0.334144 1.80084 0.502846
+9.16145 1.5192 0.831298
+0.762642 0.358565 0.927552
+9.1761 1.26594 0.497657
+0.820286 1.10485 1.56154
+0.815722 1.5629 0.876298
+9.04692 1.21477 0.785943
+0.185109 1.97267 0.863569
+0.203111 0.42647 1.79413
+9.26044 0.45224 0.608183
+9.36708 0.422611 1.51615
+0.0531105 1.89548 1.44169
+9.57875 1.02138 0.093198
+9.43244 1.32488 0.243539
+9.31694 1.70926 0.829119
+9.62104 1.67553 1.63247
+9.83744 0.189483 0.435472
+0.550179 0.167419 1.06353
+0.00502337 1.72837 0.316535
+0.932246 1.35071 1.08601
+9.55128 0.16624 0.678766
+0.503754 1.13797 0.146266
+9.45202 1.46465 1.69603
+0.10128 0.400598 1.79456
+0.918924 0.803505 0.655406
+0.103326 1.81527 1.57046
+0.747962 0.946862 1.66143
+0.0327211 1.70282 0.28861
+0.218882 1.64983 0.272482
+0.199276 0.065998 0.706647
+0.504895 0.394994 0.384649
+9.94351 0.357309 1.76518
+0.694589 1.71921 0.969525
+9.67198 1.59351 1.73384
+0.421343 0.663674 1.8436
+0.551235 0.229307 1.32017
+0.758943 0.642131 0.456827
+9.4442 0.171738 0.924593
+9.28092 1.67664 1.1585
+0.659912 0.592402 0.369168
+0.114891 0.580276 0.098807
+9.91435 0.769098 0.029944
+9.04828 1.11313 0.715219
+0.968707 0.853522 0.798368
+9.94126 0.206713 1.60462
+0.65562 1.08526 1.7506
+9.11825 1.32529 0.656674
+0.246314 0.848914 0.04193
+0.731244 1.2672 0.372555
+9.87693 1.66967 1.73409
+9.9703 0.503362 1.86819
+0.667704 1.44317 1.59887
+9.53734 1.39847 0.207196
+9.97053 1.79371 0.393694
+9.37297 1.1686 0.23899
+9.45256 1.61958 0.43834
+9.76375 1.71549 0.340859
+9.3734 0.346872 1.42407
+0.5125 1.84211 0.832575
+0.932041 0.67555 0.845347
+9.49733 1.24542 0.171411
+9.83022 0.218933 0.398263
+9.3321 0.476499 1.53112
+0.550712 1.35084 0.243683
+9.6505 1.77285 1.53145
+0.11957 0.947519 0.007769
+9.75615 0.596159 1.88234
+0.809122 0.438308 1.17405
+9.95713 0.981126 1.99948
+0.591199 1.60434 1.53349
+0.487668 1.85321 1.18495
+0.956176 1.26081 0.862054
+9.46859 0.629161 1.76147
+0.547885 0.544311 0.29811
+0.536275 0.220812 1.32556
+0.398207 1.91061 1.11507
+0.0402346 0.316766 0.270353
+0.270426 1.61264 1.74224
+9.71078 0.358589 1.71085
+9.24733 1.50792 0.578291
+0.613955 1.19862 1.76316
+0.392413 1.74782 1.53531
+9.24869 1.06357 0.344695
+9.53261 1.5516 0.309929
+0.935946 0.813894 1.30057
+0.527774 0.162478 0.850937
+0.830806 1.53354 1.16061
+9.02502 0.812013 0.878552
+0.519587 1.78326 1.34115
+0.567002 1.21986 1.79448
+9.13955 0.850995 1.4861
+0.74967 1.64198 0.843855
+0.175846 0.700507 1.93899
+9.73844 0.22365 1.57498
+9.26819 1.66752 0.861099
+9.71894 0.404593 0.247375
+9.53267 0.214904 0.595629
+0.693719 0.917312 0.284077
+0.547917 0.402839 0.413438
+0.0844952 0.885454 1.99056
+0.202379 0.278 1.66239
+0.265358 1.08061 0.03905
+0.775521 1.24402 0.417377
+9.91364 1.99236 0.908648
+0.388763 1.55501 1.73574
+9.122 1.4585 1.14199
+0.856257 0.504886 1.147
+9.63301 1.91146 0.809757
+9.18053 1.46788 1.33201
+0.868119 1.49438 0.97842
+0.891772 1.17963 0.585111
+0.850286 0.863415 1.50974
+9.63805 1.8232 0.565249
+0.690344 0.877511 1.71198
+0.747495 1.20652 1.63033
+9.03804 1.1497 0.772564
+0.802784 1.39586 0.552522
+0.589376 1.57708 1.56531
+0.418664 1.67319 1.61064
+0.209528 1.85472 1.47302
+9.76727 1.54659 1.80444
+0.33653 1.63502 0.304715
+0.171426 0.258308 1.64949
+0.907411 0.666978 1.2608
+9.1637 1.07816 1.54336
+0.683719 0.303247 1.21306
+9.60125 0.247266 1.52338
+0.670147 0.446458 0.50591
+0.495214 0.186146 1.30503
+0.340572 0.770593 1.91229
+0.294228 1.9449 0.862692
+0.876347 1.18335 0.556539
+9.4379 0.336691 0.505474
+9.80748 0.375332 1.75574
+9.30654 0.782442 0.312649
+0.782074 1.29819 1.54777
+0.0583806 1.94132 1.33345
+9.38461 1.61502 1.49326
+9.45506 1.71879 0.568663
+9.69553 0.42906 1.7633
+9.44246 1.39375 1.73089
+9.27668 1.54311 1.42565
+0.244979 0.425879 1.78104
+0.0508857 1.35719 1.93165
+0.508441 0.568761 1.74461
+0.22771 1.12088 0.032771
+0.331629 1.7584 1.56037
+9.23481 1.57289 0.70378
+0.512795 1.3176 0.203395
+0.0350435 1.5893 0.193235
+9.20153 1.55324 0.762203
+0.164685 0.836704 0.027783
+0.0300097 0.303271 1.71596
+9.3172 1.71852 1.13144
+9.66242 0.280481 1.60535
+0.321784 0.157059 1.43201
+9.22851 0.822415 1.60948
+0.58427 1.07427 1.80832
+0.654863 0.87903 1.74468
+0.706336 0.531863 1.53079
+0.0169793 1.76133 0.352015
+9.66444 0.172158 1.44895
+0.67235 1.42259 0.391911
+0.829522 0.97393 1.55827
+9.81542 1.61738 1.76373
+0.756196 1.44959 0.523201
+0.65706 1.11249 1.74695
+9.37241 1.57875 0.479702
+9.33588 0.777786 1.71413
+0.375155 1.75113 1.54265
+0.0229391 0.531802 1.88295
+0.213719 1.48186 1.84872
+9.52401 1.24875 0.15692
+9.94211 0.006862 1.09663
+9.33013 0.519479 0.432186
+9.54022 1.37595 0.195345
+9.53769 0.137537 0.794878
+0.343332 1.93923 1.04129
+0.470026 1.46991 1.74635
+9.08859 1.15981 0.6218
+0.525781 0.441913 1.64174
+0.0525363 1.35865 0.069011
+0.110072 0.005576 1.01205
+9.2731 0.66746 1.6017
+0.689674 1.45809 0.438933
+0.847185 0.500752 1.18657
+9.54366 0.310179 0.437616
+9.80241 1.9473 0.745297
+0.352206 1.48317 1.80133
+0.994063 1.02097 1.11557
+0.363083 1.65831 1.65808
+0.0946325 0.915427 0.008875
+9.47179 1.66937 1.52266
+9.25627 1.64231 1.1838
+9.20909 1.31761 1.52317
+9.89843 0.192177 1.58247
+0.33303 0.81999 1.92628
+0.0657317 1.16105 0.015248
+0.755704 1.39947 0.483116
+0.275053 1.79415 1.54376
+0.0361209 0.384035 1.78787
+9.52975 1.6904 0.448524
+9.54536 1.30554 1.83667
+0.0349238 1.70847 0.295379
+9.22441 0.540634 0.567442
+0.386726 1.68692 0.383914
+0.934901 0.651698 1.04749
+0.0287155 1.8789 1.47413
+9.56574 1.90024 1.03899
+9.5682 1.6132 0.339015
+0.747524 1.48544 0.546733
+9.29441 0.8844 1.69898
+9.92357 0.95486 1.9963
+0.883612 1.46008 0.929191
+9.22409 0.513342 1.40356
+9.92647 0.405598 1.79989
+0.818444 1.4833 0.689723
+0.455696 0.897039 0.11702
+0.513092 0.214776 1.34538
+9.73375 1.76073 0.406789
+9.88884 0.328377 0.268188
+9.70471 0.561806 1.84959
+9.16429 1.412 1.36097
+0.274298 0.565471 0.142986
+9.86262 0.990513 1.99072
+0.592856 1.60034 0.464052
+0.937727 1.23643 1.2515
+9.92874 0.031265 0.761554
+9.88665 1.7512 1.65097
+0.7284 1.37457 1.57405
+0.924492 1.3548 1.13326
+9.52508 1.7702 0.571209
+9.28926 0.660586 0.383994
+0.739071 1.25631 0.377355
+0.86006 0.634698 1.35433
+9.59589 1.25798 1.87764
+0.906153 1.39396 0.844199
+9.26927 0.731891 1.62699
+9.53049 1.83076 0.701588
+0.444221 0.224474 1.4505
+9.99488 1.87759 0.519899
+0.66516 0.298101 0.744515
+0.49939 0.933317 0.135503
+9.72602 1.89041 1.36586
+0.9979 0.966813 1.03886
+9.72708 0.297366 1.65811
+0.895043 0.553516 0.973516
+9.87917 0.007656 0.948227
+9.61016 1.68094 0.381168
+0.769795 1.37345 1.51768
+0.267673 0.870071 1.95429
+9.41811 0.253617 1.32238
+9.69078 0.28435 1.62643
+9.88903 0.378559 0.225044
+0.738473 1.63003 0.758483
+0.676777 0.750002 1.69234
+0.324284 1.81755 0.523296
+0.198011 1.56812 1.80002
+0.846835 0.505819 1.19449
+0.964422 1.07372 0.742479
+9.8486 1.76812 1.62083
+0.325947 1.76194 1.55871
+0.0928117 1.79537 1.59902
+0.540065 1.82114 0.811507
+9.38792 1.67465 0.586693
+0.250774 0.403275 0.237141
+9.335 0.879029 0.264208
+0.34599 1.84448 1.40829
+9.81458 0.599094 1.89721
+0.716022 0.311804 0.877223
+9.33174 0.675852 0.329869
+0.628637 0.687032 1.71095
+9.96661 1.87236 0.510967
+0.42254 0.657619 1.84023
+9.59113 1.58078 1.70241
+9.58299 0.383387 1.66821
+9.3978 0.824698 1.77784
+9.97121 1.84906 0.473275
+0.274797 0.049728 0.853491
+0.0742825 0.128504 0.51645
+0.592091 0.741113 1.76144
+0.647568 1.63463 0.580052
+9.42798 0.649392 1.74144
+0.928172 1.25702 0.731125
+9.1111 1.40986 0.797008
+0.533476 0.982859 0.153788
+0.429166 0.290022 1.55578
+0.0600464 0.652227 0.063992
+0.0108808 0.001029 0.964279
+9.56753 0.315251 0.412289
+0.62443 0.279972 0.695399
+0.752 0.897714 1.64952
+0.906618 1.12086 1.40599
+9.61025 1.37057 1.84233
+0.328613 0.302526 0.363258
+0.678302 0.322806 0.716225
+0.390688 0.784454 1.89558
+0.947788 1.1148 1.29747
+0.662258 1.73855 0.873339
+9.79132 0.085265 0.653096
+9.89027 1.99426 0.971032
+9.82892 1.96772 1.18453
+9.21357 1.60729 0.879168
+0.379845 0.285926 0.410559
+0.604001 1.45742 0.347111
+9.61169 0.193379 0.556756
+0.760119 0.348519 0.999573
+9.47079 0.309741 0.507132
+9.49792 1.86474 0.965852
+9.58379 0.401567 1.68369
+9.16082 0.979655 0.455847
+9.65454 1.74968 1.56512
+9.68794 1.76119 1.56854
+9.27859 1.05479 1.68848
+9.95593 1.801 1.59887
+0.0838551 1.99355 1.06997
+9.64751 0.39576 1.7144
+0.509192 0.435253 1.64844
+9.2327 1.26592 1.58499
+9.83622 1.98537 0.98628
+9.1709 1.54751 0.885197
+9.17178 0.461224 0.844773
+0.848394 1.52499 0.939547
+0.0938825 0.14265 1.50551
+0.611498 0.486773 0.398772
+9.04195 1.21577 1.18978
+0.338911 0.443473 1.7597
+9.78861 0.930578 0.025412
+0.684417 1.64386 1.34436
+9.59616 0.90914 1.90959
+9.43427 1.82386 1.02924
+9.61441 0.266579 1.55917
+0.45135 1.22824 0.137735
+0.455622 1.16878 0.126224
+0.750743 1.12841 1.64856
+0.172786 0.075024 1.33716
+0.572666 0.294857 1.4187
+9.27381 1.21164 0.345058
+9.46202 1.64717 1.54077
+0.0366763 0.391544 0.206898
+9.40837 0.206739 0.857619
+0.611193 1.68799 1.39347
+0.862774 0.623728 0.66434
+9.42747 1.53546 1.6204
+0.0182886 3.2e-05 1.00195
+0.469988 1.28221 1.83664
+9.34452 1.75611 0.965025
+9.13378 1.26897 1.42142
+0.626128 0.813556 0.242849
+9.54174 1.23235 1.85908
+0.765526 0.35703 1.03416
+9.16656 0.738462 1.48587
+0.944991 1.22701 0.763345
+9.63657 0.623108 1.85221
+0.116017 0.007572 1.00673
+0.477945 1.72195 1.5003
+0.680767 1.61792 0.606739
+9.70777 1.79969 1.52572
+9.70878 1.76773 0.429594
+9.32819 0.263616 0.921956
+9.85216 1.60872 1.78044
+0.888413 0.788841 1.40964
+9.35123 0.243199 1.07959
+9.73072 1.71735 0.356638
+0.539146 1.66073 1.52119
+9.58888 1.71186 0.428579
+9.7705 1.96015 1.15494
+9.3271 0.271531 1.12971
+0.38882 0.177281 1.41333
+0.578109 1.80902 0.889951
+9.29671 1.27844 0.345163
+0.333766 0.377278 1.70815
+0.194681 0.02759 0.876214
+0.492794 0.515888 0.277186
+9.73075 0.522755 1.83764
+0.73811 1.01636 1.67471
+0.440905 1.64308 0.372436
+0.885936 0.697894 1.35044
+0.248017 0.483918 1.81979
+0.0595597 0.140828 0.490657
+0.744763 1.64309 0.821368
+0.628699 0.819193 0.242528
+0.806474 0.413315 1.05853
+9.86282 1.10855 1.98463
+9.5142 0.673339 0.188719
+0.609208 0.59979 1.6855
+9.46112 0.482508 1.66487
+0.29424 1.93157 0.788847
+0.887888 0.764671 1.39441
+9.36527 1.59945 0.512936
+0.670515 0.567908 1.60186
+0.387324 1.62551 1.67801
+9.69403 1.92717 1.21881
+0.855285 1.01646 1.51826
+0.874648 0.54619 1.16988
+0.401297 0.162778 1.37027
+0.699869 0.521882 0.468438
+9.04117 0.808129 1.20545
+9.79343 1.17177 0.036894
+0.629572 0.563369 1.64294
+0.237979 1.85532 0.539296
+9.61041 1.90074 1.19242
+0.0117479 1.46748 1.88395
+0.717363 1.02219 1.69744
+0.417465 1.65124 0.36796
+9.15203 1.45403 1.27388
+0.862344 0.676412 1.38781
+0.802817 0.442809 0.787517
+9.87139 1.07787 0.011176
+0.869561 1.39444 1.29918
+9.93289 0.37935 1.78029
+9.50474 0.578651 1.76021
+9.157 0.5742 1.32967
+0.974 1.1133 1.19294
+9.3209 0.358139 1.35532
+9.79115 1.8987 1.38553
+0.782911 0.424774 1.23823
+9.20991 0.653463 0.496746
+0.46777 1.75999 1.45042
+0.715743 0.892531 0.308989
+0.0960513 0.636225 0.0725
+9.40396 1.58373 0.451449
+9.95865 1.41271 0.089521
+9.76324 0.907231 0.033297
+9.73945 0.068106 1.25414
+0.536417 0.407007 0.398644
+0.839362 0.731562 0.527637
+0.294591 1.83059 1.4729
+9.83072 1.52465 0.164401
+9.04946 1.26663 1.15474
+0.205957 1.19858 1.95889
+9.36019 0.427652 1.51431
+9.47393 1.13945 0.160051
+0.686785 0.480854 1.50877
+9.74079 1.58783 0.234956
+9.79752 1.49862 0.156777
+9.61756 0.263588 1.55903
+9.39137 0.659291 1.71736
+0.580255 0.443237 1.59434
+9.34656 0.310227 1.31239
+0.0268579 0.554747 1.89521
+0.696521 0.689563 1.64594
+0.651964 1.72023 1.23989
+9.04386 0.753458 0.841026
+0.619664 1.53723 0.427654
+0.596641 0.497144 1.62423
+0.128775 1.73451 0.33271
+0.406038 1.70259 1.58592
+9.26017 1.2072 1.64047
+9.50083 0.472742 1.68693
+9.77601 0.608544 1.89236
+0.132479 0.93583 0.010117
+0.546506 1.40821 0.268103
+9.54142 0.342728 0.400954
+0.627297 1.73608 0.742049
+9.60283 1.36315 1.84372
+9.38232 0.92598 0.21726
+0.360034 1.92928 0.918004
+9.66062 0.260257 0.417215
+0.799573 0.959625 1.59881
+9.45903 0.839588 0.1733
+0.568969 0.219001 0.744878
+0.63884 0.428299 1.51465
+9.25013 1.32073 1.57945
+0.468303 0.123466 0.885497
+0.415226 0.324968 0.388973
+9.24282 0.833462 1.63171
+0.466496 1.56766 1.67818
+0.262187 0.143814 0.556028
+9.14692 0.936489 1.51721
+0.143808 0.16235 0.471895
+9.07604 0.635357 0.880006
+0.602601 0.642722 1.71231
+9.10192 0.959485 1.43947
+9.49288 1.84763 0.840536
+0.259475 0.836268 1.95074
+9.5931 0.169714 0.621414
+9.34152 0.54576 1.59995
+0.385993 0.077814 1.00309
+9.7543 0.392957 1.7549
+0.703594 1.59957 0.618014
+0.28396 1.38516 1.87763
+9.47216 1.49187 0.308427
+9.75064 0.847619 1.95524
+0.794438 0.533126 1.38927
+0.458255 0.447104 1.69467
+0.374261 1.40599 0.165617
+0.508332 1.45369 0.266876
+0.260436 0.04725 0.848098
+0.523546 1.46304 1.71365
+9.85853 1.07995 1.9863
+9.42973 1.81578 1.09982
+0.388103 1.05943 1.91992
+0.476978 1.70117 0.470762
+0.136105 0.778474 0.035417
+0.184601 1.54026 1.8208
+9.6957 0.689279 0.098452
+0.571886 1.46763 1.67421
+9.78389 0.721641 1.93675
+9.64603 1.50351 0.212504
+9.33479 1.43862 1.60356
+0.397572 1.58421 0.292223
+9.31721 0.443609 0.525264
+0.328354 0.357877 0.309063
+9.70621 1.71928 1.63125
+9.94985 1.74847 1.66185
+0.40709 0.384888 1.67494
+9.34601 1.20088 0.270165
+9.26684 1.04359 1.67861
+9.98278 0.071776 0.631486
+0.0335023 1.7533 0.343581
+0.126878 0.488354 0.150417
+9.42928 0.770031 0.212005
+9.86227 1.34485 1.92808
+9.69736 1.95041 0.943469
+9.45709 0.876758 0.168502
+0.151555 1.64388 0.249811
+9.81167 0.308096 1.69777
+9.29211 1.40989 1.57533
+0.943288 1.32913 1.0384
+9.51399 1.08536 0.129898
+0.862593 0.510705 0.869305
+0.402814 0.580634 1.81308
+0.560986 1.46185 1.68895
+0.597669 1.61114 1.517
+0.870172 0.746315 0.57874
+0.166247 1.62624 1.76249
+0.403377 0.646714 0.155771
+9.2505 1.10616 1.65508
+9.31197 1.63978 1.3402
+0.117564 1.83425 1.53848
+9.1859 1.5101 1.27657
+0.89193 1.16174 1.42446
+0.928389 1.35924 1.0886
+9.71862 1.43147 1.85746
+9.32164 1.73306 1.03569
+9.57868 0.207621 0.560166
+9.17069 0.465718 1.16609
+0.0749666 0.508784 0.131655
+9.00509 0.910826 0.982497
+9.18708 0.845121 1.55964
+0.230179 1.55547 0.201774
+0.963875 1.2047 0.829545
+0.639822 0.245481 1.14715
+0.330198 1.93655 0.876378
+0.415056 1.62304 1.66408
+9.5512 0.126185 1.1867
+0.919378 0.780583 1.32691
+0.211055 1.97731 1.0452
+9.63332 0.457348 0.245116
+9.11293 0.57283 0.824045
+9.2941 1.25297 1.66244
+9.24923 0.342548 1.06118
+0.512464 0.144511 1.06912
+9.20904 0.394573 0.920849
+9.75283 0.065458 1.25925
+0.0658611 1.9907 0.877273
+9.96161 0.012968 1.15098
+9.36225 1.28415 0.283022
+0.296386 1.04104 0.04487
+9.34276 1.75367 1.00771
+0.988566 0.930967 1.14033
+0.508411 0.803566 1.83833
+9.2627 1.08535 0.32846
+9.61688 1.50743 1.77102
+0.894891 0.787156 1.39054
+9.7692 1.77447 0.409455
+0.43942 0.105031 0.920975
+0.86666 0.528692 1.16637
+0.432977 1.30289 0.150308
+0.878035 1.34008 1.33693
+9.32994 1.62778 1.39603
+9.78551 0.265972 0.35543
diff --git a/data/points/shifted_sphere.weights b/data/points/shifted_sphere.weights
new file mode 100644
index 00000000..bb5602eb
--- /dev/null
+++ b/data/points/shifted_sphere.weights
@@ -0,0 +1,1000 @@
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
+0.0001
diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h
index 5f7d7622..63c6675c 100644
--- a/src/Alpha_complex/include/gudhi/Alpha_complex.h
+++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h
@@ -175,7 +175,7 @@ class Alpha_complex {
*
* @return The number of vertices.
*/
- const std::size_t number_of_vertices() const {
+ std::size_t number_of_vertices() const {
return vertex_handle_to_iterator_.size();
}
diff --git a/src/Alpha_complex/utilities/CMakeLists.txt b/src/Alpha_complex/utilities/CMakeLists.txt
index 79d9e7dd..a2dfac20 100644
--- a/src/Alpha_complex/utilities/CMakeLists.txt
+++ b/src/Alpha_complex/utilities/CMakeLists.txt
@@ -54,7 +54,7 @@ if(CGAL_FOUND)
target_link_libraries(weighted_periodic_alpha_complex_3d_persistence ${TBB_LIBRARIES})
endif(TBB_FOUND)
- add_test(NAME Persistent_cohomology_example_weigted_periodic_alpha_complex_3d COMMAND $<TARGET_FILE:weighted_periodic_alpha_complex_3d_persistence>
+ add_test(NAME Alpha_complex_utilities_weigted_periodic_alpha_complex_3d COMMAND $<TARGET_FILE:weighted_periodic_alpha_complex_3d_persistence>
"${CMAKE_SOURCE_DIR}/data/points/grid_10_10_10_in_0_1.off" "${CMAKE_SOURCE_DIR}/data/points/grid_10_10_10_in_0_1.weights"
"${CMAKE_SOURCE_DIR}/data/points/iso_cuboid_3_in_0_1.txt" "3" "1.0")
diff --git a/src/Alpha_complex/utilities/alpha_complex_3d_helper.h b/src/Alpha_complex/utilities/alpha_complex_3d_helper.h
index 6b3b7d5d..3747923f 100644
--- a/src/Alpha_complex/utilities/alpha_complex_3d_helper.h
+++ b/src/Alpha_complex/utilities/alpha_complex_3d_helper.h
@@ -52,13 +52,11 @@ Vertex_list from_facet(const Facet& fct) {
template <class Vertex_list, class Edge_3>
Vertex_list from_edge(const Edge_3& edg) {
Vertex_list the_list;
- for (auto i = 0; i < 4; i++) {
- if ((edg.second == i) || (edg.third == i)) {
+ for (auto i : { edg.second, edg.third }) {
#ifdef DEBUG_TRACES
- std::cout << "from edge[" << i << "]=" << edg.first->vertex(i)->point() << std::endl;
+ std::cout << "from edge[" << i << "]=" << edg.first->vertex(i)->point() << std::endl;
#endif // DEBUG_TRACES
- the_list.push_back(edg.first->vertex(i));
- }
+ the_list.push_back(edg.first->vertex(i));
}
return the_list;
}
diff --git a/src/Alpha_complex/utilities/alpha_complex_3d_persistence.cpp b/src/Alpha_complex/utilities/alpha_complex_3d_persistence.cpp
index 0a021a0f..1070d17b 100644
--- a/src/Alpha_complex/utilities/alpha_complex_3d_persistence.cpp
+++ b/src/Alpha_complex/utilities/alpha_complex_3d_persistence.cpp
@@ -20,9 +20,14 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <boost/version.hpp>
#include <boost/program_options.hpp>
#include <boost/variant.hpp>
+#if BOOST_VERSION >= 105400
+#include <boost/container/static_vector.hpp>
+#endif
+
#include <gudhi/Simplex_tree.h>
#include <gudhi/Persistent_cohomology.h>
#include <gudhi/Points_3D_off_io.h>
@@ -38,7 +43,6 @@
#include <tuple>
#include <map>
#include <utility>
-#include <list>
#include <vector>
#include <cstdlib>
@@ -66,14 +70,18 @@ using Cell_handle = Alpha_shape_3::Cell_handle;
using Facet = Alpha_shape_3::Facet;
using Edge_3 = Alpha_shape_3::Edge;
using Vertex_handle = Alpha_shape_3::Vertex_handle;
-using Vertex_list = std::list<Alpha_shape_3::Vertex_handle>;
+
+#if BOOST_VERSION >= 105400
+using Vertex_list = boost::container::static_vector<Alpha_shape_3::Vertex_handle, 4>;
+#else
+using Vertex_list = std::vector<Alpha_shape_3::Vertex_handle>;
+#endif
// gudhi type definition
using ST = Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_fast_persistence>;
using Filtration_value = ST::Filtration_value;
using Simplex_tree_vertex = ST::Vertex_handle;
using Alpha_shape_simplex_tree_map = std::map<Alpha_shape_3::Vertex_handle, Simplex_tree_vertex>;
-using Alpha_shape_simplex_tree_pair = std::pair<Alpha_shape_3::Vertex_handle, Simplex_tree_vertex>;
using Simplex_tree_vector_vertex = std::vector<Simplex_tree_vertex>;
using Persistent_cohomology =
Gudhi::persistent_cohomology::Persistent_cohomology<ST, Gudhi::persistent_cohomology::Field_Zp>;
@@ -97,7 +105,7 @@ int main(int argc, char **argv) {
exit(-1);
}
- // Retrieve the triangulation
+ // Retrieve the points
std::vector<Point_3> lp = off_reader.get_point_cloud();
// alpha shape construction from points. CGAL has a strange behavior in REGULARIZED mode.
@@ -128,37 +136,23 @@ int main(int argc, char **argv) {
ST simplex_tree;
Alpha_shape_simplex_tree_map map_cgal_simplex_tree;
std::vector<Alpha_value_type>::iterator the_alpha_value_iterator = the_alpha_values.begin();
- int dim_max = 0;
- Filtration_value filtration_max = 0.0;
for (auto object_iterator : the_objects) {
// Retrieve Alpha shape vertex list from object
if (const Cell_handle* cell = CGAL::object_cast<Cell_handle>(&object_iterator)) {
vertex_list = from_cell<Vertex_list, Cell_handle>(*cell);
count_cells++;
- if (dim_max < 3) {
- // Cell is of dim 3
- dim_max = 3;
- }
} else if (const Facet* facet = CGAL::object_cast<Facet>(&object_iterator)) {
vertex_list = from_facet<Vertex_list, Facet>(*facet);
count_facets++;
- if (dim_max < 2) {
- // Facet is of dim 2
- dim_max = 2;
- }
} else if (const Edge_3* edge = CGAL::object_cast<Edge_3>(&object_iterator)) {
vertex_list = from_edge<Vertex_list, Edge_3>(*edge);
count_edges++;
- if (dim_max < 1) {
- // Edge_3 is of dim 1
- dim_max = 1;
- }
} else if (const Vertex_handle* vertex = CGAL::object_cast<Vertex_handle>(&object_iterator)) {
count_vertices++;
vertex_list = from_vertex<Vertex_list, Vertex_handle>(*vertex);
}
// Construction of the vector of simplex_tree vertex from list of alpha_shapes vertex
- Simplex_tree_vector_vertex the_simplex_tree;
+ Simplex_tree_vector_vertex the_simplex;
for (auto the_alpha_shape_vertex : vertex_list) {
Alpha_shape_simplex_tree_map::iterator the_map_iterator = map_cgal_simplex_tree.find(the_alpha_shape_vertex);
if (the_map_iterator == map_cgal_simplex_tree.end()) {
@@ -167,15 +161,15 @@ int main(int argc, char **argv) {
#ifdef DEBUG_TRACES
std::cout << "vertex [" << the_alpha_shape_vertex->point() << "] not found - insert " << vertex << std::endl;
#endif // DEBUG_TRACES
- the_simplex_tree.push_back(vertex);
- map_cgal_simplex_tree.insert(Alpha_shape_simplex_tree_pair(the_alpha_shape_vertex, vertex));
+ the_simplex.push_back(vertex);
+ map_cgal_simplex_tree.emplace(the_alpha_shape_vertex, vertex);
} else {
// alpha shape found
Simplex_tree_vertex vertex = the_map_iterator->second;
#ifdef DEBUG_TRACES
std::cout << "vertex [" << the_alpha_shape_vertex->point() << "] found in " << vertex << std::endl;
#endif // DEBUG_TRACES
- the_simplex_tree.push_back(vertex);
+ the_simplex.push_back(vertex);
}
}
// Construction of the simplex_tree
@@ -183,14 +177,10 @@ int main(int argc, char **argv) {
#ifdef DEBUG_TRACES
std::cout << "filtration = " << filtr << std::endl;
#endif // DEBUG_TRACES
- if (filtr > filtration_max) {
- filtration_max = filtr;
- }
- simplex_tree.insert_simplex(the_simplex_tree, filtr);
- if (the_alpha_value_iterator != the_alpha_values.end())
- ++the_alpha_value_iterator;
- else
- std::cout << "This shall not happen" << std::endl;
+ simplex_tree.insert_simplex(the_simplex, filtr);
+ GUDHI_CHECK(the_alpha_value_iterator != the_alpha_values.end(),
+ "CGAL provided more simplices than values");
+ ++the_alpha_value_iterator;
}
#ifdef DEBUG_TRACES
diff --git a/src/Alpha_complex/utilities/exact_alpha_complex_3d_persistence.cpp b/src/Alpha_complex/utilities/exact_alpha_complex_3d_persistence.cpp
index 9a266418..3b9a2ae0 100644
--- a/src/Alpha_complex/utilities/exact_alpha_complex_3d_persistence.cpp
+++ b/src/Alpha_complex/utilities/exact_alpha_complex_3d_persistence.cpp
@@ -38,7 +38,6 @@
#include <tuple>
#include <map>
#include <utility>
-#include <list>
#include <vector>
#include <cstdlib>
@@ -67,14 +66,13 @@ using Cell_handle = Alpha_shape_3::Cell_handle;
using Facet = Alpha_shape_3::Facet;
using Edge_3 = Alpha_shape_3::Edge;
using Vertex_handle = Alpha_shape_3::Vertex_handle;
-using Vertex_list = std::list<Vertex_handle>;
+using Vertex_list = std::vector<Vertex_handle>;
// gudhi type definition
using ST = Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_fast_persistence>;
using Filtration_value = ST::Filtration_value;
using Simplex_tree_vertex = ST::Vertex_handle;
using Alpha_shape_simplex_tree_map = std::map<Alpha_shape_3::Vertex_handle, Simplex_tree_vertex>;
-using Alpha_shape_simplex_tree_pair = std::pair<Alpha_shape_3::Vertex_handle, Simplex_tree_vertex>;
using Simplex_tree_vector_vertex = std::vector<Simplex_tree_vertex>;
using Persistent_cohomology =
Gudhi::persistent_cohomology::Persistent_cohomology<ST, Gudhi::persistent_cohomology::Field_Zp>;
@@ -98,7 +96,7 @@ int main(int argc, char **argv) {
exit(-1);
}
- // Retrieve the triangulation
+ // Retrieve the points
std::vector<Point_3> lp = off_reader.get_point_cloud();
// alpha shape construction from points. CGAL has a strange behavior in REGULARIZED mode.
@@ -129,37 +127,23 @@ int main(int argc, char **argv) {
ST simplex_tree;
Alpha_shape_simplex_tree_map map_cgal_simplex_tree;
std::vector<Alpha_value_type>::iterator the_alpha_value_iterator = the_alpha_values.begin();
- int dim_max = 0;
- Filtration_value filtration_max = 0.0;
for (auto object_iterator : the_objects) {
// Retrieve Alpha shape vertex list from object
if (const Cell_handle* cell = CGAL::object_cast<Cell_handle>(&object_iterator)) {
vertex_list = from_cell<Vertex_list, Cell_handle>(*cell);
count_cells++;
- if (dim_max < 3) {
- // Cell is of dim 3
- dim_max = 3;
- }
} else if (const Facet* facet = CGAL::object_cast<Facet>(&object_iterator)) {
vertex_list = from_facet<Vertex_list, Facet>(*facet);
count_facets++;
- if (dim_max < 2) {
- // Facet is of dim 2
- dim_max = 2;
- }
} else if (const Edge_3* edge = CGAL::object_cast<Edge_3>(&object_iterator)) {
vertex_list = from_edge<Vertex_list, Edge_3>(*edge);
count_edges++;
- if (dim_max < 1) {
- // Edge_3 is of dim 1
- dim_max = 1;
- }
} else if (const Vertex_handle* vertex = CGAL::object_cast<Vertex_handle>(&object_iterator)) {
count_vertices++;
vertex_list = from_vertex<Vertex_list, Vertex_handle>(*vertex);
}
// Construction of the vector of simplex_tree vertex from list of alpha_shapes vertex
- Simplex_tree_vector_vertex the_simplex_tree;
+ Simplex_tree_vector_vertex the_simplex;
for (auto the_alpha_shape_vertex : vertex_list) {
Alpha_shape_simplex_tree_map::iterator the_map_iterator = map_cgal_simplex_tree.find(the_alpha_shape_vertex);
if (the_map_iterator == map_cgal_simplex_tree.end()) {
@@ -168,15 +152,15 @@ int main(int argc, char **argv) {
#ifdef DEBUG_TRACES
std::cout << "vertex [" << the_alpha_shape_vertex->point() << "] not found - insert " << vertex << std::endl;
#endif // DEBUG_TRACES
- the_simplex_tree.push_back(vertex);
- map_cgal_simplex_tree.insert(Alpha_shape_simplex_tree_pair(the_alpha_shape_vertex, vertex));
+ the_simplex.push_back(vertex);
+ map_cgal_simplex_tree.emplace(the_alpha_shape_vertex, vertex);
} else {
// alpha shape found
Simplex_tree_vertex vertex = the_map_iterator->second;
#ifdef DEBUG_TRACES
std::cout << "vertex [" << the_alpha_shape_vertex->point() << "] found in " << vertex << std::endl;
#endif // DEBUG_TRACES
- the_simplex_tree.push_back(vertex);
+ the_simplex.push_back(vertex);
}
}
// Construction of the simplex_tree
@@ -185,10 +169,7 @@ int main(int argc, char **argv) {
#ifdef DEBUG_TRACES
std::cout << "filtration = " << filtr << std::endl;
#endif // DEBUG_TRACES
- if (filtr > filtration_max) {
- filtration_max = filtr;
- }
- simplex_tree.insert_simplex(the_simplex_tree, filtr);
+ simplex_tree.insert_simplex(the_simplex, filtr);
if (the_alpha_value_iterator != the_alpha_values.end())
++the_alpha_value_iterator;
else
diff --git a/src/Alpha_complex/utilities/periodic_alpha_complex_3d_persistence.cpp b/src/Alpha_complex/utilities/periodic_alpha_complex_3d_persistence.cpp
index 186a58f8..ac72dcc4 100644
--- a/src/Alpha_complex/utilities/periodic_alpha_complex_3d_persistence.cpp
+++ b/src/Alpha_complex/utilities/periodic_alpha_complex_3d_persistence.cpp
@@ -3,6 +3,7 @@
* library for computational topology.
*
* Author(s): Vincent Rouvreau
+ * Pawel Dlotko - 2017 - Swansea University, UK
*
* Copyright (C) 2014 INRIA
*
@@ -39,7 +40,6 @@
#include <tuple>
#include <map>
#include <utility>
-#include <list>
#include <vector>
#include <cstdlib>
@@ -72,14 +72,13 @@ using Cell_handle = Alpha_shape_3::Cell_handle;
using Facet = Alpha_shape_3::Facet;
using Edge_3 = Alpha_shape_3::Edge;
using Vertex_handle = Alpha_shape_3::Vertex_handle;
-using Vertex_list = std::list<Alpha_shape_3::Vertex_handle>;
+using Vertex_list = std::vector<Alpha_shape_3::Vertex_handle>;
// gudhi type definition
using ST = Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_fast_persistence>;
using Filtration_value = ST::Filtration_value;
using Simplex_tree_vertex = ST::Vertex_handle;
using Alpha_shape_simplex_tree_map = std::map<Alpha_shape_3::Vertex_handle, Simplex_tree_vertex>;
-using Alpha_shape_simplex_tree_pair = std::pair<Alpha_shape_3::Vertex_handle, Simplex_tree_vertex>;
using Simplex_tree_vector_vertex = std::vector<Simplex_tree_vertex>;
using Persistent_cohomology =
Gudhi::persistent_cohomology::Persistent_cohomology<ST, Gudhi::persistent_cohomology::Field_Zp>;
@@ -114,8 +113,14 @@ int main(int argc, char **argv) {
std::cerr << "Unable to read file " << cuboid_file << std::endl;
exit(-1);
}
+ //Checking if the cuboid is the same in x,y and z direction. If not, CGAL will not process it.
+ if ((x_max-x_min != y_max-y_min) || (x_max-x_min != z_max-z_min) || (z_max-z_min != y_max-y_min))
+ {
+ std::cerr << "The size of the cuboid in every directions is not the same." << std::endl;
+ exit(-1);
+ }
- // Retrieve the triangulation
+ // Retrieve the points
std::vector<Point_3> lp = off_reader.get_point_cloud();
// Define the periodic cube
@@ -123,7 +128,12 @@ int main(int argc, char **argv) {
// Heuristic for inserting large point sets (if pts is reasonably large)
pdt.insert(lp.begin(), lp.end(), true);
// As pdt won't be modified anymore switch to 1-sheeted cover if possible
- if (pdt.is_triangulation_in_1_sheet()) pdt.convert_to_1_sheeted_covering();
+ if (pdt.is_triangulation_in_1_sheet()) {
+ pdt.convert_to_1_sheeted_covering();
+ } else {
+ std::cerr << "ERROR: we were not able to construct a triangulation within a single periodic domain." << std::endl;
+ exit(-1);
+ }
std::cout << "Periodic Delaunay computed." << std::endl;
// alpha shape construction from points. CGAL has a strange behavior in REGULARIZED mode. This is the default mode
@@ -152,37 +162,23 @@ int main(int argc, char **argv) {
ST simplex_tree;
Alpha_shape_simplex_tree_map map_cgal_simplex_tree;
std::vector<Alpha_value_type>::iterator the_alpha_value_iterator = the_alpha_values.begin();
- int dim_max = 0;
- Filtration_value filtration_max = 0.0;
for (auto object_iterator : the_objects) {
// Retrieve Alpha shape vertex list from object
if (const Cell_handle* cell = CGAL::object_cast<Cell_handle>(&object_iterator)) {
vertex_list = from_cell<Vertex_list, Cell_handle>(*cell);
count_cells++;
- if (dim_max < 3) {
- // Cell is of dim 3
- dim_max = 3;
- }
} else if (const Facet* facet = CGAL::object_cast<Facet>(&object_iterator)) {
vertex_list = from_facet<Vertex_list, Facet>(*facet);
count_facets++;
- if (dim_max < 2) {
- // Facet is of dim 2
- dim_max = 2;
- }
} else if (const Edge_3* edge = CGAL::object_cast<Edge_3>(&object_iterator)) {
vertex_list = from_edge<Vertex_list, Edge_3>(*edge);
count_edges++;
- if (dim_max < 1) {
- // Edge_3 is of dim 1
- dim_max = 1;
- }
} else if (const Vertex_handle* vertex = CGAL::object_cast<Vertex_handle>(&object_iterator)) {
count_vertices++;
vertex_list = from_vertex<Vertex_list, Vertex_handle>(*vertex);
}
// Construction of the vector of simplex_tree vertex from list of alpha_shapes vertex
- Simplex_tree_vector_vertex the_simplex_tree;
+ Simplex_tree_vector_vertex the_simplex;
for (auto the_alpha_shape_vertex : vertex_list) {
Alpha_shape_simplex_tree_map::iterator the_map_iterator = map_cgal_simplex_tree.find(the_alpha_shape_vertex);
if (the_map_iterator == map_cgal_simplex_tree.end()) {
@@ -191,15 +187,15 @@ int main(int argc, char **argv) {
#ifdef DEBUG_TRACES
std::cout << "vertex [" << the_alpha_shape_vertex->point() << "] not found - insert " << vertex << std::endl;
#endif // DEBUG_TRACES
- the_simplex_tree.push_back(vertex);
- map_cgal_simplex_tree.insert(Alpha_shape_simplex_tree_pair(the_alpha_shape_vertex, vertex));
+ the_simplex.push_back(vertex);
+ map_cgal_simplex_tree.emplace(the_alpha_shape_vertex, vertex);
} else {
// alpha shape found
Simplex_tree_vertex vertex = the_map_iterator->second;
#ifdef DEBUG_TRACES
std::cout << "vertex [" << the_alpha_shape_vertex->point() << "] found in " << vertex << std::endl;
#endif // DEBUG_TRACES
- the_simplex_tree.push_back(vertex);
+ the_simplex.push_back(vertex);
}
}
// Construction of the simplex_tree
@@ -207,10 +203,7 @@ int main(int argc, char **argv) {
#ifdef DEBUG_TRACES
std::cout << "filtration = " << filtr << std::endl;
#endif // DEBUG_TRACES
- if (filtr > filtration_max) {
- filtration_max = filtr;
- }
- simplex_tree.insert_simplex(the_simplex_tree, filtr);
+ simplex_tree.insert_simplex(the_simplex, filtr);
if (the_alpha_value_iterator != the_alpha_values.end())
++the_alpha_value_iterator;
else
diff --git a/src/Alpha_complex/utilities/weighted_alpha_complex_3d_persistence.cpp b/src/Alpha_complex/utilities/weighted_alpha_complex_3d_persistence.cpp
index 0e73a99b..f46f1a58 100644
--- a/src/Alpha_complex/utilities/weighted_alpha_complex_3d_persistence.cpp
+++ b/src/Alpha_complex/utilities/weighted_alpha_complex_3d_persistence.cpp
@@ -44,7 +44,6 @@
#include <tuple>
#include <map>
#include <utility>
-#include <list>
#include <vector>
#include <cstdlib>
@@ -92,14 +91,13 @@ using Cell_handle = Alpha_shape_3::Cell_handle;
using Facet = Alpha_shape_3::Facet;
using Edge_3 = Alpha_shape_3::Edge;
using Vertex_handle = Alpha_shape_3::Vertex_handle;
-using Vertex_list = std::list<Alpha_shape_3::Vertex_handle>;
+using Vertex_list = std::vector<Alpha_shape_3::Vertex_handle>;
// gudhi type definition
using ST = Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_fast_persistence>;
using Filtration_value = ST::Filtration_value;
using Simplex_tree_vertex = ST::Vertex_handle;
using Alpha_shape_simplex_tree_map = std::map<Alpha_shape_3::Vertex_handle, Simplex_tree_vertex>;
-using Alpha_shape_simplex_tree_pair = std::pair<Alpha_shape_3::Vertex_handle, Simplex_tree_vertex>;
using Simplex_tree_vector_vertex = std::vector<Simplex_tree_vertex>;
using Persistent_cohomology =
Gudhi::persistent_cohomology::Persistent_cohomology<ST, Gudhi::persistent_cohomology::Field_Zp>;
@@ -125,7 +123,7 @@ int main(int argc, char **argv) {
exit(-1);
}
- // Retrieve the triangulation
+ // Retrieve the points
std::vector<Point_3> lp = off_reader.get_point_cloud();
// Read weights information from file
@@ -177,37 +175,23 @@ int main(int argc, char **argv) {
ST simplex_tree;
Alpha_shape_simplex_tree_map map_cgal_simplex_tree;
std::vector<Alpha_value_type>::iterator the_alpha_value_iterator = the_alpha_values.begin();
- int dim_max = 0;
- Filtration_value filtration_max = 0.0;
for (auto object_iterator : the_objects) {
// Retrieve Alpha shape vertex list from object
if (const Cell_handle* cell = CGAL::object_cast<Cell_handle>(&object_iterator)) {
vertex_list = from_cell<Vertex_list, Cell_handle>(*cell);
count_cells++;
- if (dim_max < 3) {
- // Cell is of dim 3
- dim_max = 3;
- }
} else if (const Facet* facet = CGAL::object_cast<Facet>(&object_iterator)) {
vertex_list = from_facet<Vertex_list, Facet>(*facet);
count_facets++;
- if (dim_max < 2) {
- // Facet is of dim 2
- dim_max = 2;
- }
} else if (const Edge_3* edge = CGAL::object_cast<Edge_3>(&object_iterator)) {
vertex_list = from_edge<Vertex_list, Edge_3>(*edge);
count_edges++;
- if (dim_max < 1) {
- // Edge_3 is of dim 1
- dim_max = 1;
- }
} else if (const Vertex_handle* vertex = CGAL::object_cast<Vertex_handle>(&object_iterator)) {
count_vertices++;
vertex_list = from_vertex<Vertex_list, Vertex_handle>(*vertex);
}
// Construction of the vector of simplex_tree vertex from list of alpha_shapes vertex
- Simplex_tree_vector_vertex the_simplex_tree;
+ Simplex_tree_vector_vertex the_simplex;
for (auto the_alpha_shape_vertex : vertex_list) {
Alpha_shape_simplex_tree_map::iterator the_map_iterator = map_cgal_simplex_tree.find(the_alpha_shape_vertex);
if (the_map_iterator == map_cgal_simplex_tree.end()) {
@@ -216,15 +200,15 @@ int main(int argc, char **argv) {
#ifdef DEBUG_TRACES
std::cout << "vertex [" << the_alpha_shape_vertex->point() << "] not found - insert " << vertex << std::endl;
#endif // DEBUG_TRACES
- the_simplex_tree.push_back(vertex);
- map_cgal_simplex_tree.insert(Alpha_shape_simplex_tree_pair(the_alpha_shape_vertex, vertex));
+ the_simplex.push_back(vertex);
+ map_cgal_simplex_tree.emplace(the_alpha_shape_vertex, vertex);
} else {
// alpha shape found
Simplex_tree_vertex vertex = the_map_iterator->second;
#ifdef DEBUG_TRACES
std::cout << "vertex [" << the_alpha_shape_vertex->point() << "] found in " << vertex << std::endl;
#endif // DEBUG_TRACES
- the_simplex_tree.push_back(vertex);
+ the_simplex.push_back(vertex);
}
}
// Construction of the simplex_tree
@@ -232,10 +216,7 @@ int main(int argc, char **argv) {
#ifdef DEBUG_TRACES
std::cout << "filtration = " << filtr << std::endl;
#endif // DEBUG_TRACES
- if (filtr > filtration_max) {
- filtration_max = filtr;
- }
- simplex_tree.insert_simplex(the_simplex_tree, filtr);
+ simplex_tree.insert_simplex(the_simplex, filtr);
if (the_alpha_value_iterator != the_alpha_values.end())
++the_alpha_value_iterator;
else
diff --git a/src/Alpha_complex/utilities/weighted_periodic_alpha_complex_3d_persistence.cpp b/src/Alpha_complex/utilities/weighted_periodic_alpha_complex_3d_persistence.cpp
index 13634ff7..0fe8931f 100644
--- a/src/Alpha_complex/utilities/weighted_periodic_alpha_complex_3d_persistence.cpp
+++ b/src/Alpha_complex/utilities/weighted_periodic_alpha_complex_3d_persistence.cpp
@@ -3,6 +3,7 @@
* library for computational topology.
*
* Author(s): Vincent Rouvreau
+ * Pawel Dlotko - 2017 - Swansea University, UK
*
* Copyright (C) 2014 INRIA
*
@@ -38,7 +39,6 @@
#include <tuple>
#include <map>
#include <utility>
-#include <list>
#include <vector>
#include <cstdlib>
@@ -74,14 +74,13 @@ using Cell_handle = Alpha_shape_3::Cell_handle;
using Facet = Alpha_shape_3::Facet;
using Edge_3 = Alpha_shape_3::Edge;
using Vertex_handle = Alpha_shape_3::Vertex_handle;
-using Vertex_list = std::list<Alpha_shape_3::Vertex_handle>;
+using Vertex_list = std::vector<Alpha_shape_3::Vertex_handle>;
// gudhi type definition
using ST = Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_fast_persistence>;
using Filtration_value = ST::Filtration_value;
using Simplex_tree_vertex = ST::Vertex_handle;
using Alpha_shape_simplex_tree_map = std::map<Alpha_shape_3::Vertex_handle, Simplex_tree_vertex>;
-using Alpha_shape_simplex_tree_pair = std::pair<Alpha_shape_3::Vertex_handle, Simplex_tree_vertex>;
using Simplex_tree_vector_vertex = std::vector<Simplex_tree_vertex>;
using Persistent_cohomology =
Gudhi::persistent_cohomology::Persistent_cohomology<ST, Gudhi::persistent_cohomology::Field_Zp>;
@@ -112,18 +111,48 @@ int main(int argc, char* const argv[]) {
usage(argv[0]);
}
- // Retrieve the triangulation
+ // Retrieve the points
std::vector<Point_3> lp = off_reader.get_point_cloud();
+ // Read iso_cuboid_3 information from file
+ std::ifstream iso_cuboid_str(argv[3]);
+ double x_min, y_min, z_min, x_max, y_max, z_max;
+ if (iso_cuboid_str.is_open()) {
+ if (!(iso_cuboid_str >> x_min >> y_min >> z_min >> x_max >> y_max >> z_max)) {
+ std::cerr << argv[3] << " - Bad file format." << std::endl;
+ usage(argv[0]);
+ }
+
+ } else {
+ std::cerr << "Unable to read file " << argv[3] << std::endl;
+ usage(argv[0]);
+ }
+ //Checking if the cuboid is the same in x,y and z direction. If not, CGAL will not process it.
+ if ((x_max-x_min != y_max-y_min) || (x_max-x_min != z_max-z_min) || (z_max-z_min != y_max-y_min))
+ {
+ std::cerr << "The size of the cuboid in every directions is not the same." << std::endl;
+ exit(-1);
+ }
+
+ double maximal_possible_weight = 0.015625 * (x_max-x_min) * (x_max-x_min);
+
// Read weights information from file
std::ifstream weights_ifstr(argv[2]);
std::vector<Weighted_point_3> wp;
- if (weights_ifstr.good()) {
+ if (weights_ifstr.is_open()) {
double weight = 0.0;
std::size_t index = 0;
wp.reserve(lp.size());
// Attempt read the weight in a double format, return false if it fails
while ((weights_ifstr >> weight) && (index < lp.size())) {
+ if ((weight >= maximal_possible_weight) || (weight < 0))
+ {
+ std::cerr << "At line " << (index + 1) << ", the weight (" << weight
+ << ") is negative or more than or equal to maximal possible weight (" << maximal_possible_weight
+ << ") = 1/64*cuboid length squared, which is not an acceptable input." << std::endl;
+ exit(-1);
+ }
+
wp.push_back(Weighted_point_3(lp[index], weight));
index++;
}
@@ -136,23 +165,18 @@ int main(int argc, char* const argv[]) {
usage(argv[0]);
}
- // Read iso_cuboid_3 information from file
- std::ifstream iso_cuboid_str(argv[3]);
- double x_min, y_min, z_min, x_max, y_max, z_max;
- if (iso_cuboid_str.good()) {
- iso_cuboid_str >> x_min >> y_min >> z_min >> x_max >> y_max >> z_max;
- } else {
- std::cerr << "Unable to read file " << argv[3] << std::endl;
- usage(argv[0]);
- }
-
// Define the periodic cube
P3RT3 prt(PK::Iso_cuboid_3(x_min, y_min, z_min, x_max, y_max, z_max));
// Heuristic for inserting large point sets (if pts is reasonably large)
prt.insert(wp.begin(), wp.end(), true);
// As prt won't be modified anymore switch to 1-sheeted cover if possible
- if (prt.is_triangulation_in_1_sheet()) prt.convert_to_1_sheeted_covering();
- std::cout << "Periodic Delaunay computed." << std::endl;
+ if (prt.is_triangulation_in_1_sheet()) {
+ prt.convert_to_1_sheeted_covering();
+ } else {
+ std::cerr << "ERROR: we were not able to construct a triangulation within a single periodic domain." << std::endl;
+ exit(-1);
+ }
+ std::cout << "Weighted Periodic Delaunay computed." << std::endl;
// alpha shape construction from points. CGAL has a strange behavior in REGULARIZED mode. This is the default mode
// Maybe need to set it to GENERAL mode
@@ -180,37 +204,23 @@ int main(int argc, char* const argv[]) {
ST simplex_tree;
Alpha_shape_simplex_tree_map map_cgal_simplex_tree;
std::vector<Alpha_value_type>::iterator the_alpha_value_iterator = the_alpha_values.begin();
- int dim_max = 0;
- Filtration_value filtration_max = 0.0;
for (auto object_iterator : the_objects) {
// Retrieve Alpha shape vertex list from object
if (const Cell_handle* cell = CGAL::object_cast<Cell_handle>(&object_iterator)) {
vertex_list = from_cell<Vertex_list, Cell_handle>(*cell);
count_cells++;
- if (dim_max < 3) {
- // Cell is of dim 3
- dim_max = 3;
- }
} else if (const Facet* facet = CGAL::object_cast<Facet>(&object_iterator)) {
vertex_list = from_facet<Vertex_list, Facet>(*facet);
count_facets++;
- if (dim_max < 2) {
- // Facet is of dim 2
- dim_max = 2;
- }
} else if (const Edge_3* edge = CGAL::object_cast<Edge_3>(&object_iterator)) {
vertex_list = from_edge<Vertex_list, Edge_3>(*edge);
count_edges++;
- if (dim_max < 1) {
- // Edge_3 is of dim 1
- dim_max = 1;
- }
} else if (const Vertex_handle* vertex = CGAL::object_cast<Vertex_handle>(&object_iterator)) {
count_vertices++;
vertex_list = from_vertex<Vertex_list, Vertex_handle>(*vertex);
}
// Construction of the vector of simplex_tree vertex from list of alpha_shapes vertex
- Simplex_tree_vector_vertex the_simplex_tree;
+ Simplex_tree_vector_vertex the_simplex;
for (auto the_alpha_shape_vertex : vertex_list) {
Alpha_shape_simplex_tree_map::iterator the_map_iterator = map_cgal_simplex_tree.find(the_alpha_shape_vertex);
if (the_map_iterator == map_cgal_simplex_tree.end()) {
@@ -219,15 +229,15 @@ int main(int argc, char* const argv[]) {
#ifdef DEBUG_TRACES
std::cout << "vertex [" << the_alpha_shape_vertex->point() << "] not found - insert " << vertex << std::endl;
#endif // DEBUG_TRACES
- the_simplex_tree.push_back(vertex);
- map_cgal_simplex_tree.insert(Alpha_shape_simplex_tree_pair(the_alpha_shape_vertex, vertex));
+ the_simplex.push_back(vertex);
+ map_cgal_simplex_tree.emplace(the_alpha_shape_vertex, vertex);
} else {
// alpha shape found
Simplex_tree_vertex vertex = the_map_iterator->second;
#ifdef DEBUG_TRACES
std::cout << "vertex [" << the_alpha_shape_vertex->point() << "] found in " << vertex << std::endl;
#endif // DEBUG_TRACES
- the_simplex_tree.push_back(vertex);
+ the_simplex.push_back(vertex);
}
}
// Construction of the simplex_tree
@@ -235,10 +245,7 @@ int main(int argc, char* const argv[]) {
#ifdef DEBUG_TRACES
std::cout << "filtration = " << filtr << std::endl;
#endif // DEBUG_TRACES
- if (filtr > filtration_max) {
- filtration_max = filtr;
- }
- simplex_tree.insert_simplex(the_simplex_tree, filtr);
+ simplex_tree.insert_simplex(the_simplex, filtr);
if (the_alpha_value_iterator != the_alpha_values.end())
++the_alpha_value_iterator;
else
diff --git a/src/Bottleneck_distance/include/gudhi/Neighbors_finder.h b/src/Bottleneck_distance/include/gudhi/Neighbors_finder.h
index a6b9b021..dc804630 100644
--- a/src/Bottleneck_distance/include/gudhi/Neighbors_finder.h
+++ b/src/Bottleneck_distance/include/gudhi/Neighbors_finder.h
@@ -44,7 +44,7 @@ struct Square_query {
typedef Internal_point Point_d;
typedef double FT;
bool contains(Point_d p) const {
- return std::abs(p.x()-c.x()) <= size && std::abs(p.y()-c.y()) <= size;
+ return std::max(std::abs(p.x()-c.x()), std::abs(p.y()-c.y())) <= size;
}
bool inner_range_intersects(CGAL::Kd_tree_rectangle<FT, D> const&r) const {
return
diff --git a/src/Doxyfile b/src/Doxyfile
index 429bf6a1..2d5adea1 100644
--- a/src/Doxyfile
+++ b/src/Doxyfile
@@ -38,7 +38,7 @@ PROJECT_NAME = "GUDHI"
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = "2.0.1"
+PROJECT_NUMBER = "2.1.0.rc1"
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
diff --git a/src/Persistence_representations/include/gudhi/PSSK.h b/src/Persistence_representations/include/gudhi/PSSK.h
index e2d4225e..630f5623 100644
--- a/src/Persistence_representations/include/gudhi/PSSK.h
+++ b/src/Persistence_representations/include/gudhi/PSSK.h
@@ -121,10 +121,10 @@ void PSSK::construct(const std::vector<std::pair<double, double> >& intervals_,
for (size_t pt_nr = 0; pt_nr != intervals_.size(); ++pt_nr) {
// compute the value of intervals_[pt_nr] in the grid:
- int x_grid = static_cast<int>((intervals_[pt_nr].first - this->min_) /
- (this->max_ - this->min_) * number_of_pixels);
- int y_grid = static_cast<int>((intervals_[pt_nr].second - this->min_) /
- (this->max_ - this->min_) * number_of_pixels);
+ int x_grid =
+ static_cast<int>((intervals_[pt_nr].first - this->min_) / (this->max_ - this->min_) * number_of_pixels);
+ int y_grid =
+ static_cast<int>((intervals_[pt_nr].second - this->min_) / (this->max_ - this->min_) * number_of_pixels);
if (dbg) {
std::cerr << "point : " << intervals_[pt_nr].first << " , " << intervals_[pt_nr].second << std::endl;
diff --git a/src/Persistence_representations/include/gudhi/Persistence_heat_maps.h b/src/Persistence_representations/include/gudhi/Persistence_heat_maps.h
index ae1740a7..a80c3c40 100644
--- a/src/Persistence_representations/include/gudhi/Persistence_heat_maps.h
+++ b/src/Persistence_representations/include/gudhi/Persistence_heat_maps.h
@@ -582,10 +582,10 @@ void Persistence_heat_maps<Scalling_of_kernels>::construct(const std::vector<std
for (size_t pt_nr = 0; pt_nr != intervals_.size(); ++pt_nr) {
// compute the value of intervals_[pt_nr] in the grid:
- int x_grid = static_cast<int>((intervals_[pt_nr].first - this->min_) /
- (this->max_ - this->min_) * number_of_pixels);
- int y_grid = static_cast<int>((intervals_[pt_nr].second - this->min_) /
- (this->max_ - this->min_) * number_of_pixels);
+ int x_grid =
+ static_cast<int>((intervals_[pt_nr].first - this->min_) / (this->max_ - this->min_) * number_of_pixels);
+ int y_grid =
+ static_cast<int>((intervals_[pt_nr].second - this->min_) / (this->max_ - this->min_) * number_of_pixels);
if (dbg) {
std::cerr << "point : " << intervals_[pt_nr].first << " , " << intervals_[pt_nr].second << std::endl;
@@ -797,8 +797,7 @@ void Persistence_heat_maps<Scalling_of_kernels>::load_from_file(const char* file
std::string temp;
std::getline(in, temp);
-
- while (!in.eof()) {
+ while (in.good()) {
std::getline(in, temp);
std::stringstream lineSS;
lineSS << temp;
diff --git a/src/Persistence_representations/include/gudhi/Persistence_intervals.h b/src/Persistence_representations/include/gudhi/Persistence_intervals.h
index 1ed97882..3d04d8b7 100644
--- a/src/Persistence_representations/include/gudhi/Persistence_intervals.h
+++ b/src/Persistence_representations/include/gudhi/Persistence_intervals.h
@@ -402,9 +402,8 @@ std::vector<double> Persistence_intervals::characteristic_function_of_diagram(do
}
for (size_t pos = beginIt; pos != endIt; ++pos) {
- result[pos] +=
- ((x_max - x_min) / static_cast<double>(number_of_bins)) *
- (this->intervals[i].second - this->intervals[i].first);
+ result[pos] += ((x_max - x_min) / static_cast<double>(number_of_bins)) *
+ (this->intervals[i].second - this->intervals[i].first);
}
if (dbg) {
std::cerr << "Result at this stage \n";
diff --git a/src/Persistence_representations/include/gudhi/Persistence_intervals_with_distances.h b/src/Persistence_representations/include/gudhi/Persistence_intervals_with_distances.h
index 2a3858bf..79908883 100644
--- a/src/Persistence_representations/include/gudhi/Persistence_intervals_with_distances.h
+++ b/src/Persistence_representations/include/gudhi/Persistence_intervals_with_distances.h
@@ -26,7 +26,6 @@
#include <gudhi/Persistence_intervals.h>
#include <gudhi/Bottleneck.h>
-
#include <limits>
namespace Gudhi {
diff --git a/src/Persistence_representations/include/gudhi/Persistence_landscape.h b/src/Persistence_representations/include/gudhi/Persistence_landscape.h
index 72498edf..c5aa7867 100644
--- a/src/Persistence_representations/include/gudhi/Persistence_landscape.h
+++ b/src/Persistence_representations/include/gudhi/Persistence_landscape.h
@@ -79,14 +79,16 @@ class Persistence_landscape {
/**
* Constructor that takes as an input a vector of birth-death pairs.
**/
- Persistence_landscape(const std::vector<std::pair<double, double> >& p, size_t number_of_levels = std::numeric_limits<size_t>::max() );
+ Persistence_landscape(const std::vector<std::pair<double, double> >& p,
+ size_t number_of_levels = std::numeric_limits<size_t>::max());
/**
* Constructor that reads persistence intervals from file and creates persistence landscape. The format of the
*input file is the following: in each line we put birth-death pair. Last line is assumed
* to be empty. Even if the points within a line are not ordered, they will be ordered while the input is read.
**/
- Persistence_landscape(const char* filename, size_t dimension = std::numeric_limits<unsigned>::max() , size_t number_of_levels = std::numeric_limits<size_t>::max() );
+ Persistence_landscape(const char* filename, size_t dimension = std::numeric_limits<unsigned>::max(),
+ size_t number_of_levels = std::numeric_limits<size_t>::max());
/**
* This procedure loads a landscape from file. It erase all the data that was previously stored in this landscape.
@@ -285,7 +287,7 @@ class Persistence_landscape {
*distance, we need to take its absolute value. This is the purpose of this procedure.
**/
Persistence_landscape abs();
-
+
Persistence_landscape* new_abs();
/**
@@ -453,7 +455,8 @@ class Persistence_landscape {
size_t number_of_functions_for_vectorization;
size_t number_of_functions_for_projections_to_reals;
- void construct_persistence_landscape_from_barcode(const std::vector<std::pair<double, double> >& p , size_t number_of_levels = std::numeric_limits<size_t>::max());
+ void construct_persistence_landscape_from_barcode(const std::vector<std::pair<double, double> >& p,
+ size_t number_of_levels = std::numeric_limits<size_t>::max());
Persistence_landscape multiply_lanscape_by_real_number_not_overwrite(double x) const;
void multiply_lanscape_by_real_number_overwrite(double x);
friend double compute_maximal_distance_non_symmetric(const Persistence_landscape& pl1,
@@ -473,7 +476,7 @@ Persistence_landscape::Persistence_landscape(const char* filename, size_t dimens
} else {
barcode = read_persistence_intervals_in_one_dimension_from_file(filename);
}
- this->construct_persistence_landscape_from_barcode(barcode,number_of_levels);
+ this->construct_persistence_landscape_from_barcode(barcode, number_of_levels);
this->set_up_numbers_of_functions_for_vectorization_and_projections_to_reals();
}
@@ -506,14 +509,14 @@ bool Persistence_landscape::operator==(const Persistence_landscape& rhs) const {
return true;
}
-Persistence_landscape::Persistence_landscape(const std::vector<std::pair<double, double> >& p,size_t number_of_levels) {
- this->construct_persistence_landscape_from_barcode(p,number_of_levels);
+Persistence_landscape::Persistence_landscape(const std::vector<std::pair<double, double> >& p,
+ size_t number_of_levels) {
+ this->construct_persistence_landscape_from_barcode(p, number_of_levels);
this->set_up_numbers_of_functions_for_vectorization_and_projections_to_reals();
}
void Persistence_landscape::construct_persistence_landscape_from_barcode(
- const std::vector<std::pair<double, double> >& p, size_t number_of_levels)
- {
+ const std::vector<std::pair<double, double> >& p, size_t number_of_levels) {
bool dbg = false;
if (dbg) {
std::cerr << "Persistence_landscape::Persistence_landscape( const std::vector< std::pair< double , double > >& p )"
@@ -648,12 +651,11 @@ void Persistence_landscape::construct_persistence_landscape_from_barcode(
lambda_n.erase(std::unique(lambda_n.begin(), lambda_n.end()), lambda_n.end());
this->land.push_back(lambda_n);
-
+
++number_of_levels_in_the_landscape;
- if ( number_of_levels == number_of_levels_in_the_landscape )
- {
- break;
- }
+ if (number_of_levels == number_of_levels_in_the_landscape) {
+ break;
+ }
}
}
@@ -857,58 +859,47 @@ Persistence_landscape Persistence_landscape::abs() {
return result;
}
+Persistence_landscape* Persistence_landscape::new_abs() {
+ Persistence_landscape* result = new Persistence_landscape(*this);
+ for (size_t level = 0; level != this->land.size(); ++level) {
+ if (AbsDbg) {
+ std::cout << "level: " << level << std::endl;
+ }
+ std::vector<std::pair<double, double> > lambda_n;
+ lambda_n.push_back(std::make_pair(-std::numeric_limits<int>::max(), 0));
+ for (size_t i = 1; i != this->land[level].size(); ++i) {
+ if (AbsDbg) {
+ std::cout << "this->land[" << level << "][" << i << "] : " << this->land[level][i].first << " "
+ << this->land[level][i].second << std::endl;
+ }
+ // if a line segment between this->land[level][i-1] and this->land[level][i] crosses the x-axis, then we have to
+ // add one landscape point t o result
+ if ((this->land[level][i - 1].second) * (this->land[level][i].second) < 0) {
+ double zero =
+ find_zero_of_a_line_segment_between_those_two_points(this->land[level][i - 1], this->land[level][i]);
-Persistence_landscape* Persistence_landscape::new_abs()
-{
- Persistence_landscape* result = new Persistence_landscape(*this);
- for (size_t level = 0; level != this->land.size(); ++level)
- {
- if (AbsDbg)
- {
- std::cout << "level: " << level << std::endl;
- }
- std::vector<std::pair<double, double> > lambda_n;
- lambda_n.push_back(std::make_pair(-std::numeric_limits<int>::max(), 0));
- for (size_t i = 1; i != this->land[level].size(); ++i)
- {
- if (AbsDbg)
- {
- std::cout << "this->land[" << level << "][" << i << "] : " << this->land[level][i].first << " "
- << this->land[level][i].second << std::endl;
- }
- // if a line segment between this->land[level][i-1] and this->land[level][i] crosses the x-axis, then we have to
- // add one landscape point t o result
- if ((this->land[level][i - 1].second) * (this->land[level][i].second) < 0) {
- double zero =
- find_zero_of_a_line_segment_between_those_two_points(this->land[level][i - 1], this->land[level][i]);
-
- lambda_n.push_back(std::make_pair(zero, 0));
- lambda_n.push_back(std::make_pair(this->land[level][i].first, fabs(this->land[level][i].second)));
- if (AbsDbg)
- {
- std::cout << "Adding pair : (" << zero << ",0)" << std::endl;
- std::cout << "In the same step adding pair : (" << this->land[level][i].first << ","
- << fabs(this->land[level][i].second) << ") " << std::endl;
- std::cin.ignore();
- }
- }
- else
- {
- lambda_n.push_back(std::make_pair(this->land[level][i].first, fabs(this->land[level][i].second)));
- if (AbsDbg)
- {
- std::cout << "Adding pair : (" << this->land[level][i].first << "," << fabs(this->land[level][i].second)
- << ") " << std::endl;
- std::cin.ignore();
- }
- }
- }
- result->land.push_back(lambda_n);
- }
- return result;
+ lambda_n.push_back(std::make_pair(zero, 0));
+ lambda_n.push_back(std::make_pair(this->land[level][i].first, fabs(this->land[level][i].second)));
+ if (AbsDbg) {
+ std::cout << "Adding pair : (" << zero << ",0)" << std::endl;
+ std::cout << "In the same step adding pair : (" << this->land[level][i].first << ","
+ << fabs(this->land[level][i].second) << ") " << std::endl;
+ std::cin.ignore();
+ }
+ } else {
+ lambda_n.push_back(std::make_pair(this->land[level][i].first, fabs(this->land[level][i].second)));
+ if (AbsDbg) {
+ std::cout << "Adding pair : (" << this->land[level][i].first << "," << fabs(this->land[level][i].second)
+ << ") " << std::endl;
+ std::cin.ignore();
+ }
+ }
+ }
+ result->land.push_back(lambda_n);
+ }
+ return result;
}
-
Persistence_landscape Persistence_landscape::multiply_lanscape_by_real_number_not_overwrite(double x) const {
std::vector<std::vector<std::pair<double, double> > > result(this->land.size());
for (size_t dim = 0; dim != this->land.size(); ++dim) {
@@ -954,7 +945,7 @@ void Persistence_landscape::load_landscape_from_file(const char* filename) {
std::vector<std::pair<double, double> > landscapeAtThisLevel;
bool isThisAFirsLine = true;
- while (!in.eof()) {
+ while (in.good()) {
getline(in, line);
if (!(line.length() == 0 || line[0] == '#')) {
std::stringstream lineSS;
diff --git a/src/Persistence_representations/include/gudhi/Persistence_vectors.h b/src/Persistence_representations/include/gudhi/Persistence_vectors.h
index 39df37e0..63577e46 100644
--- a/src/Persistence_representations/include/gudhi/Persistence_vectors.h
+++ b/src/Persistence_representations/include/gudhi/Persistence_vectors.h
@@ -618,9 +618,7 @@ void Vector_distances_in_diagram<F>::load_from_file(const char* filename) {
}
double number;
- while (true) {
- in >> number;
- if (in.eof()) break;
+ while (in >> number) {
this->sorted_vector_of_distances.push_back(number);
}
in.close();
diff --git a/src/Persistence_representations/include/gudhi/read_persistence_from_file.h b/src/Persistence_representations/include/gudhi/read_persistence_from_file.h
index 770da15b..450c223c 100644
--- a/src/Persistence_representations/include/gudhi/read_persistence_from_file.h
+++ b/src/Persistence_representations/include/gudhi/read_persistence_from_file.h
@@ -50,81 +50,73 @@ namespace Persistence_representations {
* The procedure returns vector of persistence pairs.
**/
std::vector<std::pair<double, double> > read_persistence_intervals_in_one_dimension_from_file(
- std::string const& filename, int dimension = -1, double what_to_substitute_for_infinite_bar = -1) {
+ std::string const& filename, int dimension = -1, double what_to_substitute_for_infinite_bar = -1) {
bool dbg = false;
std::string line;
- std::vector<std::pair<double, double> > barcode_initial = read_persistence_intervals_in_dimension(filename,(int)dimension);
+ std::vector<std::pair<double, double> > barcode_initial =
+ read_persistence_intervals_in_dimension(filename, (int)dimension);
std::vector<std::pair<double, double> > final_barcode;
- final_barcode.reserve( barcode_initial.size() );
-
- if ( dbg )
- {
- std::cerr << "Here are the intervals that we read from the file : \n";
- for ( size_t i = 0 ; i != barcode_initial.size() ; ++i )
- {
- std::cout << barcode_initial[i].first << " " << barcode_initial[i].second << std::endl;
- }
- getchar();
+ final_barcode.reserve(barcode_initial.size());
+
+ if (dbg) {
+ std::cerr << "Here are the intervals that we read from the file : \n";
+ for (size_t i = 0; i != barcode_initial.size(); ++i) {
+ std::cout << barcode_initial[i].first << " " << barcode_initial[i].second << std::endl;
+ }
+ getchar();
}
-
- for ( size_t i = 0 ; i != barcode_initial.size() ; ++i )
- {
- if ( dbg )
- {
- std::cout << "COnsidering interval : " << barcode_initial[i].first << " " << barcode_initial[i].second << std::endl;
- }
- // if ( barcode_initial[i].first == barcode_initial[i].second )
- //{
- // if ( dbg )std::cout << "It has zero length \n";
- // continue;//zero length intervals are not relevant, so we skip all of them.
- //}
-
- if ( barcode_initial[i].first > barcode_initial[i].second )//note that in this case barcode_initial[i].second != std::numeric_limits<double>::infinity()
- {
- if ( dbg )std::cout << "Swap and enter \n";
- //swap them to make sure that birth < death
- final_barcode.push_back( std::pair<double,double>( barcode_initial[i].second , barcode_initial[i].first ) );
- continue;
- }
- else
- {
- if ( barcode_initial[i].second != std::numeric_limits<double>::infinity() )
- {
- if ( dbg )std::cout << "Simply enters\n";
- //in this case, due to the previous conditions we know that barcode_initial[i].first < barcode_initial[i].second, so we put them as they are
- final_barcode.push_back( std::pair<double,double>( barcode_initial[i].first , barcode_initial[i].second ) );
- }
- }
-
- if ( (barcode_initial[i].second == std::numeric_limits<double>::infinity() ) && ( what_to_substitute_for_infinite_bar != -1 ) )
- {
- if ( barcode_initial[i].first < what_to_substitute_for_infinite_bar )//if only birth < death.
- {
- final_barcode.push_back( std::pair<double,double>( barcode_initial[i].first , what_to_substitute_for_infinite_bar ) );
- }
- }
- else
- {
- //if the variable what_to_substitute_for_infinite_bar is not set, then we ignore all the infinite bars.
- }
+
+ for (size_t i = 0; i != barcode_initial.size(); ++i) {
+ if (dbg) {
+ std::cout << "COnsidering interval : " << barcode_initial[i].first << " " << barcode_initial[i].second
+ << std::endl;
+ }
+ // if ( barcode_initial[i].first == barcode_initial[i].second )
+ //{
+ // if ( dbg )std::cout << "It has zero length \n";
+ // continue;//zero length intervals are not relevant, so we skip all of them.
+ //}
+
+ if (barcode_initial[i].first >
+ barcode_initial[i]
+ .second) // note that in this case barcode_initial[i].second != std::numeric_limits<double>::infinity()
+ {
+ if (dbg) std::cout << "Swap and enter \n";
+ // swap them to make sure that birth < death
+ final_barcode.push_back(std::pair<double, double>(barcode_initial[i].second, barcode_initial[i].first));
+ continue;
+ } else {
+ if (barcode_initial[i].second != std::numeric_limits<double>::infinity()) {
+ if (dbg) std::cout << "Simply enters\n";
+ // in this case, due to the previous conditions we know that barcode_initial[i].first <
+ // barcode_initial[i].second, so we put them as they are
+ final_barcode.push_back(std::pair<double, double>(barcode_initial[i].first, barcode_initial[i].second));
+ }
+ }
+
+ if ((barcode_initial[i].second == std::numeric_limits<double>::infinity()) &&
+ (what_to_substitute_for_infinite_bar != -1)) {
+ if (barcode_initial[i].first < what_to_substitute_for_infinite_bar) // if only birth < death.
+ {
+ final_barcode.push_back(
+ std::pair<double, double>(barcode_initial[i].first, what_to_substitute_for_infinite_bar));
+ }
+ } else {
+ // if the variable what_to_substitute_for_infinite_bar is not set, then we ignore all the infinite bars.
+ }
}
-
-
- if ( dbg )
- {
- std::cerr << "Here are the final bars that we are sending further : \n";
- for ( size_t i = 0 ; i != final_barcode.size() ; ++i )
- {
- std::cout << final_barcode[i].first << " " << final_barcode[i].second << std::endl;
- }
- std::cerr << "final_barcode.size() : " << final_barcode.size() << std::endl;
- getchar();
+
+ if (dbg) {
+ std::cerr << "Here are the final bars that we are sending further : \n";
+ for (size_t i = 0; i != final_barcode.size(); ++i) {
+ std::cout << final_barcode[i].first << " " << final_barcode[i].second << std::endl;
+ }
+ std::cerr << "final_barcode.size() : " << final_barcode.size() << std::endl;
+ getchar();
}
-
-
-
- return final_barcode;
+
+ return final_barcode;
} // read_persistence_intervals_in_one_dimension_from_file
} // namespace Persistence_representations
diff --git a/src/Persistence_representations/test/persistence_lanscapes_test.cpp b/src/Persistence_representations/test/persistence_lanscapes_test.cpp
index 47737784..e7267bec 100644
--- a/src/Persistence_representations/test/persistence_lanscapes_test.cpp
+++ b/src/Persistence_representations/test/persistence_lanscapes_test.cpp
@@ -58,8 +58,6 @@ BOOST_AUTO_TEST_CASE(check_computations_of_integrals) {
std::vector<std::pair<double, double> > diag =
read_persistence_intervals_in_one_dimension_from_file("data/file_with_diagram");
Persistence_landscape p(diag);
- //double integral = p.compute_integral_of_landscape();
- //BOOST_CHECK(fabs(integral - 2.34992) <= 0.00001);
GUDHI_TEST_FLOAT_EQUALITY_CHECK(p.compute_integral_of_landscape(), 2.34992, epsilon);
}
@@ -97,10 +95,8 @@ BOOST_AUTO_TEST_CASE(check_computations_of_integrals_for_each_level_separatelly)
integrals_for_different_levels.push_back(0.000195296);
for (size_t level = 0; level != p.size(); ++level) {
- //double integral = p.compute_integral_of_a_level_of_a_landscape(level);
GUDHI_TEST_FLOAT_EQUALITY_CHECK(p.compute_integral_of_a_level_of_a_landscape(level),
integrals_for_different_levels[level], epsilon);
- //BOOST_CHECK(fabs(integral - integrals_for_different_levels[level]) <= 0.00001);
}
}
diff --git a/src/Persistent_cohomology/doc/Intro_persistent_cohomology.h b/src/Persistent_cohomology/doc/Intro_persistent_cohomology.h
index 62bbbfc5..ceaea505 100644
--- a/src/Persistent_cohomology/doc/Intro_persistent_cohomology.h
+++ b/src/Persistent_cohomology/doc/Intro_persistent_cohomology.h
@@ -165,7 +165,7 @@ outputs its persistence diagram.
\li <a href="_alpha_complex_2alpha_complex_3d_persistence_8cpp-example.html">
Alpha_complex/alpha_complex_3d_persistence.cpp</a> computes the persistent homology with
\f$\mathbb{Z}/2\mathbb{Z}\f$ coefficients of the alpha complex on points sampling from an OFF file.
-\code $> ./alpha_complex_3d_persistence ../../data/points/tore3D_300.off 2 0.45 \endcode
+\code $> ./alpha_complex_3d_persistence ../../data/points/tore3D_300.off -p 2 -m 0.45 \endcode
\code Simplex_tree dim: 3
2 0 0 inf
2 1 0.0682162 1.0001
@@ -177,7 +177,7 @@ Alpha_complex/exact_alpha_complex_3d_persistence.cpp</a> computes the persistent
\f$\mathbb{Z}/2\mathbb{Z}\f$ coefficients of the alpha complex on points sampling from an OFF file.
Here, as CGAL computes the exact values, it is slower, but it is necessary when points are on a grid
for instance.
-\code $> ./exact_alpha_complex_3d_persistence ../../data/points/sphere3D_pts_on_grid.off 2 0.1 \endcode
+\code $> ./exact_alpha_complex_3d_persistence ../../data/points/sphere3D_pts_on_grid.off -p 2 -m 0.1 \endcode
\code Simplex_tree dim: 3
2 0 0 inf
2 2 0.0002 0.2028 \endcode
@@ -187,7 +187,7 @@ Alpha_complex/weighted_alpha_complex_3d_persistence.cpp</a> computes the persist
\f$\mathbb{Z}/2\mathbb{Z}\f$ coefficients of the weighted alpha complex on points sampling from an OFF file
and a weights file.
\code $> ./weighted_alpha_complex_3d_persistence ../../data/points/tore3D_300.off
-../../data/points/tore3D_300.weights 2 0.45 \endcode
+../../data/points/tore3D_300.weights -p 2 -m 0.45 \endcode
\code Simplex_tree dim: 3
2 0 -1 inf
2 1 -0.931784 0.000103311
@@ -208,8 +208,10 @@ Simplex_tree dim: 3
\li <a href="_alpha_complex_2periodic_alpha_complex_3d_persistence_8cpp-example.html">
Alpha_complex/periodic_alpha_complex_3d_persistence.cpp</a> computes the persistent homology with
\f$\mathbb{Z}/2\mathbb{Z}\f$ coefficients of the periodic alpha complex on points sampling from an OFF file.
+The second parameter is a \ref FileFormatsIsoCuboid file with coordinates of the periodic cuboid.
+Note that the lengths of the sides of the periodic cuboid have to be the same.
\code $> ./periodic_alpha_complex_3d_persistence ../../data/points/grid_10_10_10_in_0_1.off
-../../data/points/iso_cuboid_3_in_0_1.txt 3 1.0 \endcode
+../../data/points/iso_cuboid_3_in_0_1.txt -p 3 -m 1.0 \endcode
\code Periodic Delaunay computed.
Simplex_tree dim: 3
3 0 0 inf
@@ -221,6 +223,27 @@ Simplex_tree dim: 3
3 2 0.005 inf
3 3 0.0075 inf \endcode
+\li <a href="_persistent_cohomology_2weighted_periodic_alpha_complex_3d_persistence_8cpp-example.html">
+Persistent_cohomology/weighted_periodic_alpha_complex_3d_persistence.cpp</a> computes the persistent homology with
+\f$\mathbb{Z}/2\mathbb{Z}\f$ coefficients of the periodic alpha complex on weighted points from an OFF file. The
+additional parameters of this program are:<br>
+(a) The file with the weights of points. The file consist of a sequence of numbers (as many as points).
+Note that the weight of each single point have to be bounded by 1/64 times the square of the cuboid edge length.<br>
+(b) A \ref FileFormatsIsoCuboid file with coordinates of the periodic cuboid.
+Note that the lengths of the sides of the periodic cuboid have to be the same.<br>
+\code $> ./weighted_periodic_alpha_complex_3d_persistence ../../data/points/shifted_sphere.off
+../../data/points/shifted_sphere.weights ../../data/points/iso_cuboid_3_in_0_10.txt 3 1.0 \endcode
+\code Weighted Periodic Delaunay computed.
+Simplex_tree dim: 3
+3 0 -0.0001 inf
+3 1 16.0264 inf
+3 1 16.0273 inf
+3 1 16.0303 inf
+3 2 36.8635 inf
+3 2 36.8704 inf
+3 2 36.8838 inf
+3 3 58.6783 inf \endcode
+
\li <a href="_persistent_cohomology_2plain_homology_8cpp-example.html">
Persistent_cohomology/plain_homology.cpp</a> computes the plain homology of a simple simplicial complex without
filtration values.
diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h
index cb6ab309..4094af25 100644
--- a/src/Simplex_tree/include/gudhi/Simplex_tree.h
+++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h
@@ -106,8 +106,9 @@ class Simplex_tree {
};
struct Key_simplex_base_dummy {
Key_simplex_base_dummy() {}
- void assign_key(Simplex_key) { }
- Simplex_key key() const { assert(false); return -1; }
+ // Undefined so it will not link
+ void assign_key(Simplex_key);
+ Simplex_key key() const;
};
typedef typename std::conditional<Options::store_key, Key_simplex_base_real, Key_simplex_base_dummy>::type
Key_simplex_base;
@@ -121,7 +122,7 @@ class Simplex_tree {
};
struct Filtration_simplex_base_dummy {
Filtration_simplex_base_dummy() {}
- void assign_filtration(Filtration_value f) { assert(f == 0); }
+ void assign_filtration(Filtration_value GUDHI_CHECK_code(f)) { GUDHI_CHECK(f == 0, "filtration value specified for a complex that does not store them"); }
Filtration_value filtration() const { return 0; }
};
typedef typename std::conditional<Options::store_filtration, Filtration_simplex_base_real,
@@ -664,71 +665,63 @@ class Simplex_tree {
*/
template<class InputVertexRange = std::initializer_list<Vertex_handle>>
std::pair<Simplex_handle, bool> insert_simplex_and_subfaces(const InputVertexRange& Nsimplex,
- Filtration_value filtration = 0) {
+ Filtration_value filtration = 0) {
auto first = std::begin(Nsimplex);
auto last = std::end(Nsimplex);
if (first == last)
- return std::pair<Simplex_handle, bool>(null_simplex(), true); // ----->>
+ return { null_simplex(), true }; // ----->>
// Copy before sorting
- std::vector<Vertex_handle> copy(first, last);
+ thread_local std::vector<Vertex_handle> copy;
+ copy.clear();
+ copy.insert(copy.end(), first, last);
std::sort(std::begin(copy), std::end(copy));
- std::vector<std::vector<Vertex_handle>> to_be_inserted;
- std::vector<std::vector<Vertex_handle>> to_be_propagated;
- return rec_insert_simplex_and_subfaces(copy, to_be_inserted, to_be_propagated, filtration);
+ return insert_simplex_and_subfaces_sorted(copy, filtration);
}
private:
- std::pair<Simplex_handle, bool> rec_insert_simplex_and_subfaces(std::vector<Vertex_handle>& the_simplex,
- std::vector<std::vector<Vertex_handle>>& to_be_inserted,
- std::vector<std::vector<Vertex_handle>>& to_be_propagated,
- Filtration_value filtration = 0.0) {
- std::pair<Simplex_handle, bool> insert_result;
- if (the_simplex.size() > 1) {
- // Get and remove last vertex
- Vertex_handle last_vertex = the_simplex.back();
- the_simplex.pop_back();
- // Recursive call after last vertex removal
- insert_result = rec_insert_simplex_and_subfaces(the_simplex, to_be_inserted, to_be_propagated, filtration);
-
- // Concatenation of to_be_inserted and to_be_propagated
- to_be_inserted.insert(to_be_inserted.begin(), to_be_propagated.begin(), to_be_propagated.end());
- to_be_propagated = to_be_inserted;
-
- // to_be_inserted treatment
- for (auto& simplex_tbi : to_be_inserted) {
- simplex_tbi.push_back(last_vertex);
- }
- std::vector<Vertex_handle> last_simplex(1, last_vertex);
- to_be_inserted.insert(to_be_inserted.begin(), last_simplex);
- // i.e. (0,1,2) =>
- // [to_be_inserted | to_be_propagated] = [(1) (0,1) | (0)]
- // [to_be_inserted | to_be_propagated] = [(2) (0,2) (1,2) (0,1,2) | (0) (1) (0,1)]
- // N.B. : it is important the last inserted to be the highest in dimension
- // in order to return the "last" insert_simplex result
-
- // insert all to_be_inserted
- for (auto& simplex_tbi : to_be_inserted) {
- insert_result = insert_vertex_vector(simplex_tbi, filtration);
- }
- } else if (the_simplex.size() == 1) {
- // When reaching the end of recursivity, vector of simplices shall be empty and filled on back recursive
- if ((to_be_inserted.size() != 0) || (to_be_propagated.size() != 0)) {
- std::cerr << "Simplex_tree::rec_insert_simplex_and_subfaces - Error vector not empty\n";
- exit(-1);
+ /// Same as insert_simplex_and_subfaces but assumes that the range of vertices is sorted
+ template<class ForwardVertexRange = std::initializer_list<Vertex_handle>>
+ std::pair<Simplex_handle, bool> insert_simplex_and_subfaces_sorted(const ForwardVertexRange& Nsimplex, Filtration_value filt = 0) {
+ auto first = std::begin(Nsimplex);
+ auto last = std::end(Nsimplex);
+ if (first == last)
+ return { null_simplex(), true }; // FIXME: false would make more sense to me.
+ GUDHI_CHECK(std::is_sorted(first, last), "simplex vertices listed in unsorted order");
+ // Update dimension if needed. We could wait to see if the insertion succeeds, but I doubt there is much to gain.
+ dimension_ = std::max(dimension_, static_cast<int>(std::distance(first, last)) - 1);
+ return rec_insert_simplex_and_subfaces_sorted(root(), first, last, filt);
+ }
+ // To insert {1,2,3,4}, we insert {2,3,4} twice, once at the root, and once below 1.
+ template<class ForwardVertexIterator>
+ std::pair<Simplex_handle, bool> rec_insert_simplex_and_subfaces_sorted(Siblings* sib, ForwardVertexIterator first, ForwardVertexIterator last, Filtration_value filt) {
+ // An alternative strategy would be:
+ // - try to find the complete simplex, if found (and low filtration) exit
+ // - insert all the vertices at once in sib
+ // - loop over those (new or not) simplices, with a recursive call(++first, last)
+ Vertex_handle vertex_one = *first;
+ auto&& dict = sib->members();
+ auto insertion_result = dict.emplace(vertex_one, Node(sib, filt));
+ Simplex_handle simplex_one = insertion_result.first;
+ bool one_is_new = insertion_result.second;
+ if (!one_is_new) {
+ if (filtration(simplex_one) > filt) {
+ assign_filtration(simplex_one, filt);
+ } else {
+ // FIXME: this interface makes no sense, and it doesn't seem to be tested.
+ insertion_result.first = null_simplex();
}
- std::vector<Vertex_handle> first_simplex(1, the_simplex.back());
- // i.e. (0,1,2) => [to_be_inserted | to_be_propagated] = [(0) | ]
- to_be_inserted.push_back(first_simplex);
-
- insert_result = insert_vertex_vector(first_simplex, filtration);
- } else {
- std::cerr << "Simplex_tree::rec_insert_simplex_and_subfaces - Recursivity error\n";
- exit(-1);
}
- return insert_result;
+ if (++first == last) return insertion_result;
+ if (!has_children(simplex_one))
+ // TODO: have special code here, we know we are building the whole subtree from scratch.
+ simplex_one->second.assign_children(new Siblings(sib, vertex_one));
+ auto res = rec_insert_simplex_and_subfaces_sorted(simplex_one->second.children(), first, last, filt);
+ // No need to continue if the full simplex was already there with a low enough filtration value.
+ if (res.first != null_simplex()) rec_insert_simplex_and_subfaces_sorted(sib, first, last, filt);
+ return res;
}
public:
diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_iterators.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_iterators.h
index 7e0a454d..ab7346d4 100644
--- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_iterators.h
+++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_iterators.h
@@ -23,6 +23,8 @@
#ifndef SIMPLEX_TREE_SIMPLEX_TREE_ITERATORS_H_
#define SIMPLEX_TREE_SIMPLEX_TREE_ITERATORS_H_
+#include <gudhi/Debug_utils.h>
+
#include <boost/iterator/iterator_facade.hpp>
#include <boost/version.hpp>
#if BOOST_VERSION >= 105600
@@ -109,11 +111,18 @@ class Simplex_tree_boundary_simplex_iterator : public boost::iterator_facade<
: last_(sh->first),
sib_(nullptr),
st_(st) {
+ // Only check once at the beginning instead of for every increment, as this is expensive.
+ if (SimplexTree::Options::contiguous_vertices)
+ GUDHI_CHECK(st_->contiguous_vertices(), "The set of vertices is not { 0, ..., n } without holes");
Siblings * sib = st->self_siblings(sh);
next_ = sib->parent();
sib_ = sib->oncles();
if (sib_ != nullptr) {
- sh_ = sib_->find(next_);
+ if (SimplexTree::Options::contiguous_vertices && sib_->oncles() == nullptr)
+ // Only relevant for edges
+ sh_ = sib_->members_.begin()+next_;
+ else
+ sh_ = sib_->find(next_);
} else {
sh_ = st->null_simplex();
} // vertex: == end()
@@ -140,14 +149,19 @@ class Simplex_tree_boundary_simplex_iterator : public boost::iterator_facade<
Siblings * for_sib = sib_;
Siblings * new_sib = sib_->oncles();
auto rit = suffix_.rbegin();
- if (SimplexTree::Options::contiguous_vertices && new_sib == nullptr && rit != suffix_.rend()) {
- // We reached the root, use a short-cut to find a vertex. We could also
- // optimize finding the second vertex of a segment, but people are
- // expected to call endpoints().
- assert(st_->contiguous_vertices());
- sh_ = for_sib->members_.begin()+*rit;
- for_sib = sh_->second.children();
- ++rit;
+ if (SimplexTree::Options::contiguous_vertices && new_sib == nullptr) {
+ // We reached the root, use a short-cut to find a vertex.
+ if (rit == suffix_.rend()) {
+ // Segment, this vertex is the last boundary simplex
+ sh_ = for_sib->members_.begin()+last_;
+ sib_ = nullptr;
+ return;
+ } else {
+ // Dim >= 2, initial step of the descent
+ sh_ = for_sib->members_.begin()+*rit;
+ for_sib = sh_->second.children();
+ ++rit;
+ }
}
for (; rit != suffix_.rend(); ++rit) {
sh_ = for_sib->find(*rit);
diff --git a/src/Subsampling/include/gudhi/choose_n_farthest_points.h b/src/Subsampling/include/gudhi/choose_n_farthest_points.h
index 86500b28..8390b4c9 100644
--- a/src/Subsampling/include/gudhi/choose_n_farthest_points.h
+++ b/src/Subsampling/include/gudhi/choose_n_farthest_points.h
@@ -93,7 +93,7 @@ void choose_n_farthest_points(Kernel const &k,
// Choose randomly the first landmark
std::random_device rd;
std::mt19937 gen(rd());
- std::uniform_int_distribution<std::size_t> dis(0, (input_pts.size() - 1));
+ std::uniform_int_distribution<std::size_t> dis(0, nb_points - 1);
starting_point = dis(gen);
}
@@ -110,7 +110,7 @@ void choose_n_farthest_points(Kernel const &k,
*output_it++ = input_pts[curr_max_w];
*dist_it++ = dist_to_L[curr_max_w];
std::size_t i = 0;
- for (auto& p : input_pts) {
+ for (auto&& p : input_pts) {
double curr_dist = sqdist(p, *(std::begin(input_pts) + curr_max_w));
if (curr_dist < dist_to_L[i])
dist_to_L[i] = curr_dist;
diff --git a/src/cmake/modules/GUDHI_third_party_libraries.cmake b/src/cmake/modules/GUDHI_third_party_libraries.cmake
index e44bbe04..419c2581 100644
--- a/src/cmake/modules/GUDHI_third_party_libraries.cmake
+++ b/src/cmake/modules/GUDHI_third_party_libraries.cmake
@@ -1,6 +1,6 @@
# This files manage third party libraries required by GUDHI
-find_package(Boost REQUIRED COMPONENTS system filesystem unit_test_framework program_options thread)
+find_package(Boost 1.48.0 REQUIRED COMPONENTS system filesystem unit_test_framework program_options thread)
if(NOT Boost_FOUND)
message(FATAL_ERROR "NOTICE: This program requires Boost and will not be compiled.")
diff --git a/src/common/doc/main_page.h b/src/common/doc/main_page.h
index 108cf6e3..148ee670 100644
--- a/src/common/doc/main_page.h
+++ b/src/common/doc/main_page.h
@@ -99,7 +99,7 @@
<tr>
<td width="25%">
<b>Author:</b> Mathieu Carri&egrave;re<br>
- <b>Introduced in:</b> GUDHI 2.0.1<br>
+ <b>Introduced in:</b> GUDHI 2.1.0<br>
<b>Copyright:</b> GPL v3<br>
</td>
<td width="75%">
@@ -551,4 +551,4 @@ make doxygen
* @example Witness_complex/weak_witness_persistence.cpp
* @example Witness_complex/strong_witness_persistence.cpp
*/
- \ No newline at end of file
+
diff --git a/src/common/include/gudhi/Debug_utils.h b/src/common/include/gudhi/Debug_utils.h
index f9d9c50c..90d3cf47 100644
--- a/src/common/include/gudhi/Debug_utils.h
+++ b/src/common/include/gudhi/Debug_utils.h
@@ -32,7 +32,7 @@
// GUDHI_CHECK throw an exception if expression is false in debug mode, but does nothing in release mode
// Could assert in release mode, but cmake sets NDEBUG (for "NO DEBUG") in this mode, means assert does nothing.
#ifdef GUDHI_DEBUG
- #define GUDHI_CHECK(expression, excpt) if ((expression) == 0) throw excpt
+ #define GUDHI_CHECK(expression, excpt) ((expression) ? (void) 0 : (throw excpt))
#define GUDHI_CHECK_code(CODE) CODE
#else
#define GUDHI_CHECK(expression, excpt) (void) 0
diff --git a/src/cython/cython/simplex_tree.pyx b/src/cython/cython/simplex_tree.pyx
index 8a436619..0cb575d2 100644
--- a/src/cython/cython/simplex_tree.pyx
+++ b/src/cython/cython/simplex_tree.pyx
@@ -106,8 +106,8 @@ cdef class SimplexTree:
return self.pcohptr != NULL
def filtration(self, simplex):
- """This function returns the simplicial complex filtration value for a
- given N-simplex.
+ """This function returns the filtration value for a given N-simplex in
+ this simplicial complex, or +infinity if it is not in the complex.
:param simplex: The N-simplex, represented by a list of vertex.
:type simplex: list of int.
@@ -222,14 +222,17 @@ cdef class SimplexTree:
def insert(self, simplex, filtration=0.0):
"""This function inserts the given N-simplex and its subfaces with the
- given filtration value (default value is '0.0').
+ given filtration value (default value is '0.0'). If some of those
+ simplices are already present with a higher filtration value, their
+ filtration value is lowered.
:param simplex: The N-simplex to insert, represented by a list of
vertex.
:type simplex: list of int.
:param filtration: The filtration value of the simplex.
:type filtration: float.
- :returns: true if the simplex was found, false otherwise.
+ :returns: true if the simplex was not yet in the complex, false
+ otherwise (whatever its original filtration value).
:rtype: bool
"""
cdef vector[int] csimplex
diff --git a/src/cython/doc/witness_complex_user.rst b/src/cython/doc/witness_complex_user.rst
index 29413269..99be5185 100644
--- a/src/cython/doc/witness_complex_user.rst
+++ b/src/cython/doc/witness_complex_user.rst
@@ -121,7 +121,7 @@ Example2: Computing persistence using strong relaxed witness complex
Here is an example of constructing a strong witness complex filtration and computing persistence on it:
-* :download:`euclidean_strong_witness_complex_diagram_persistence_from_off_file_example.py <../example/periodic_cubical_complex_barcode_persistence_from_perseus_file_example.py>`
+* :download:`euclidean_strong_witness_complex_diagram_persistence_from_off_file_example.py <../example/euclidean_strong_witness_complex_diagram_persistence_from_off_file_example.py>`
Bibliography
============
diff --git a/src/cython/include/Tangential_complex_interface.h b/src/cython/include/Tangential_complex_interface.h
index ecf014b3..0c3a510e 100644
--- a/src/cython/include/Tangential_complex_interface.h
+++ b/src/cython/include/Tangential_complex_interface.h
@@ -105,7 +105,7 @@ class Tangential_complex_interface {
}
void create_simplex_tree(Simplex_tree<>* simplex_tree) {
- int max_dim = tangential_complex_->create_complex<Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_full_featured>>(*simplex_tree);
+ tangential_complex_->create_complex<Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_full_featured>>(*simplex_tree);
simplex_tree->initialize_filtration();
}