summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGard Spreemann <gspreemann@gmail.com>2018-02-02 14:05:27 +0100
committerGard Spreemann <gspreemann@gmail.com>2018-02-02 14:05:27 +0100
commitdf9caafd97960a610906a79cf40ba52e40c6cf48 (patch)
treea9c0b0330239e6438510432b0ba78f35799224d9
parent5bb200877fac0090032b9d56b782d2ae361efa9b (diff)
parent8e51c74d8855a641c006765ee246402e218828f3 (diff)
Merge branch 'dfsg/latest' into debian/sid
-rw-r--r--CMakeGUDHIVersion.txt4
-rw-r--r--CMakeLists.txt2
-rw-r--r--Doxyfile11
-rw-r--r--GudhUI/CMakeLists.txt66
-rw-r--r--biblio/bibliography.bib93
-rw-r--r--biblio/how_to_cite_gudhi.bib18
-rw-r--r--cmake/modules/GUDHI_doxygen_target.cmake5
-rw-r--r--cmake/modules/GUDHI_test_coverage.cmake14
-rw-r--r--cmake/modules/GUDHI_third_party_libraries.cmake17
-rw-r--r--cmake/modules/GUDHI_user_version_target.cmake6
-rw-r--r--concept/Persistence_representations/Real_valued_topological_data.h51
-rw-r--r--concept/Persistence_representations/Topological_data_with_averages.h44
-rw-r--r--concept/Persistence_representations/Topological_data_with_distances.h49
-rw-r--r--concept/Persistence_representations/Topological_data_with_scalar_product.h42
-rw-r--r--concept/Persistence_representations/Vectorized_topological_data.h51
-rw-r--r--cython/cython/periodic_cubical_complex.pyx14
-rw-r--r--cython/cython/simplex_tree.pyx141
-rw-r--r--cython/doc/_templates/layout.html6
-rwxr-xr-xcython/doc/conf.py4
-rw-r--r--cython/doc/cubical_complex_user.rst45
-rw-r--r--cython/doc/fileformats.rst55
-rwxr-xr-xcython/doc/python3-sphinx-build.py2
-rw-r--r--cython/doc/witness_complex_user.rst2
-rwxr-xr-xcython/example/simplex_tree_example.py2
-rw-r--r--cython/include/Cubical_complex_interface.h6
-rw-r--r--cython/include/Simplex_tree_interface.h4
-rw-r--r--cython/include/Tangential_complex_interface.h4
-rw-r--r--cython/setup.py.in4
-rwxr-xr-xcython/test/test_cubical_complex.py10
-rwxr-xr-xcython/test/test_simplex_tree.py38
-rw-r--r--data/points/KleinBottle5D.off15879
-rw-r--r--data/points/grid_10_10_10_in_0_1.weights1000
-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--doc/Alpha_complex/Intro_alpha_complex.h4
-rw-r--r--doc/Bitmap_cubical_complex/Gudhi_Cubical_Complex_doc.h56
-rw-r--r--doc/Nerve_GIC/COPYRIGHT19
-rw-r--r--doc/Nerve_GIC/GIC.jpgbin0 -> 457905 bytes
-rw-r--r--doc/Nerve_GIC/GIC.pdfbin0 -> 26073 bytes
-rw-r--r--doc/Nerve_GIC/Intro_graph_induced_complex.h186
-rw-r--r--doc/Nerve_GIC/coordGICvisu.pdfbin0 -> 20745 bytes
-rw-r--r--doc/Nerve_GIC/coordGICvisu2.jpgbin0 -> 1259868 bytes
-rw-r--r--doc/Nerve_GIC/funcGICvisu.jpgbin0 -> 68388 bytes
-rw-r--r--doc/Nerve_GIC/funcGICvisu.pdfbin0 -> 11347 bytes
-rw-r--r--doc/Nerve_GIC/gicvisu.jpgbin0 -> 167192 bytes
-rw-r--r--doc/Nerve_GIC/gicvoronoivisu.jpgbin0 -> 37785 bytes
-rw-r--r--doc/Nerve_GIC/nerve.pngbin0 -> 45129 bytes
-rw-r--r--doc/Nerve_GIC/nervevisu.jpgbin0 -> 127619 bytes
-rw-r--r--doc/Persistence_representations/Persistence_representations_doc.h259
-rw-r--r--doc/Persistence_representations/average_landscape.pngbin0 -> 14917 bytes
-rw-r--r--doc/Persistent_cohomology/Intro_persistent_cohomology.h60
-rw-r--r--doc/Rips_complex/Intro_rips_complex.h2
-rw-r--r--doc/Simplex_tree/Intro_simplex_tree.h10
-rw-r--r--doc/Spatial_searching/Intro_spatial_searching.h2
-rw-r--r--doc/Subsampling/Intro_subsampling.h2
-rw-r--r--doc/Tangential_complex/Intro_tangential_complex.h2
-rw-r--r--doc/Witness_complex/Witness_complex_doc.h13
-rw-r--r--doc/common/examples.h99
-rw-r--r--doc/common/file_formats.h66
-rw-r--r--doc/common/footer.html10
-rw-r--r--doc/common/header.html4
-rw-r--r--doc/common/installation.h263
-rw-r--r--doc/common/main_page.h309
-rw-r--r--example/Bitmap_cubical_complex/CMakeLists.txt26
-rw-r--r--example/Bitmap_cubical_complex/Random_bitmap_cubical_complex.cpp19
-rw-r--r--example/Bottleneck_distance/CMakeLists.txt34
-rw-r--r--example/Bottleneck_distance/README19
-rw-r--r--example/Contraction/CMakeLists.txt3
-rw-r--r--example/Contraction/Garland_heckbert.cpp5
-rw-r--r--example/Nerve_GIC/CMakeLists.txt26
-rw-r--r--example/Nerve_GIC/CoordGIC.cpp93
-rw-r--r--example/Nerve_GIC/FuncGIC.cpp94
-rw-r--r--example/Persistence_representations/CMakeLists.txt27
-rw-r--r--example/Persistence_representations/persistence_heat_maps.cpp80
-rw-r--r--example/Persistence_representations/persistence_intervals.cpp89
-rw-r--r--example/Persistence_representations/persistence_landscape.cpp86
-rw-r--r--example/Persistence_representations/persistence_landscape_on_grid.cpp82
-rw-r--r--example/Persistence_representations/persistence_vectors.cpp74
-rw-r--r--example/Persistent_cohomology/CMakeLists.txt52
-rw-r--r--example/Persistent_cohomology/README121
-rw-r--r--example/Persistent_cohomology/persistence_from_simple_simplex_tree.cpp1
-rw-r--r--example/Persistent_cohomology/plain_homology.cpp2
-rw-r--r--example/Persistent_cohomology/rips_persistence_step_by_step.cpp59
-rw-r--r--example/Simplex_tree/CMakeLists.txt17
-rw-r--r--example/Simplex_tree/cech_complex_cgal_mini_sphere_3d.cpp221
-rw-r--r--example/Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp2
-rw-r--r--example/Simplex_tree/graph_expansion_with_blocker.cpp77
-rw-r--r--example/Simplex_tree/mini_simplex_tree.cpp2
-rw-r--r--example/Simplex_tree/simple_simplex_tree.cpp95
-rw-r--r--example/Witness_complex/CMakeLists.txt32
-rw-r--r--example/Witness_complex/example_strong_witness_complex_off.cpp24
-rw-r--r--example/Witness_complex/example_witness_complex_off.cpp6
-rw-r--r--example/Witness_complex/example_witness_complex_sphere.cpp26
-rw-r--r--include/gudhi/Alpha_complex.h4
-rw-r--r--include/gudhi/Bitmap_cubical_complex.h130
-rw-r--r--include/gudhi/Bitmap_cubical_complex/counter.h13
-rw-r--r--include/gudhi/Bitmap_cubical_complex_base.h419
-rw-r--r--include/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h200
-rw-r--r--include/gudhi/Bottleneck.h4
-rw-r--r--include/gudhi/Debug_utils.h4
-rw-r--r--include/gudhi/Edge_contraction.h4
-rw-r--r--include/gudhi/GIC.h1298
-rw-r--r--include/gudhi/Kd_tree_search.h3
-rw-r--r--include/gudhi/Neighbors_finder.h3
-rw-r--r--include/gudhi/PSSK.h168
-rw-r--r--include/gudhi/Persistence_heat_maps.h919
-rw-r--r--include/gudhi/Persistence_intervals.h570
-rw-r--r--include/gudhi/Persistence_intervals_with_distances.h63
-rw-r--r--include/gudhi/Persistence_landscape.h1376
-rw-r--r--include/gudhi/Persistence_landscape_on_grid.h1348
-rw-r--r--include/gudhi/Persistence_vectors.h640
-rw-r--r--include/gudhi/Simplex_tree.h362
-rw-r--r--include/gudhi/Simplex_tree/Simplex_tree_iterators.h32
-rw-r--r--include/gudhi/Skeleton_blocker.h3
-rw-r--r--include/gudhi/Strong_witness_complex.h7
-rw-r--r--include/gudhi/Tangential_complex.h2
-rw-r--r--include/gudhi/Unitary_tests_utils.h40
-rw-r--r--include/gudhi/Witness_complex.h1
-rw-r--r--include/gudhi/choose_n_farthest_points.h4
-rw-r--r--include/gudhi/common_persistence_representations.h127
-rw-r--r--include/gudhi/distance_functions.h32
-rw-r--r--include/gudhi/graph_simplicial_complex.h63
-rw-r--r--include/gudhi/read_persistence_from_file.h120
-rw-r--r--utilities/Alpha_complex/CMakeLists.txt65
-rw-r--r--utilities/Alpha_complex/alpha_complex_3d_helper.h (renamed from example/Persistent_cohomology/alpha_complex_3d_helper.h)16
-rw-r--r--utilities/Alpha_complex/alpha_complex_3d_persistence.cpp (renamed from example/Persistent_cohomology/alpha_complex_3d_persistence.cpp)169
-rw-r--r--utilities/Alpha_complex/alpha_complex_persistence.cpp (renamed from example/Persistent_cohomology/alpha_complex_persistence.cpp)63
-rw-r--r--utilities/Alpha_complex/alphacomplex.md158
-rw-r--r--utilities/Alpha_complex/exact_alpha_complex_3d_persistence.cpp (renamed from example/Persistent_cohomology/exact_alpha_complex_3d_persistence.cpp)155
-rw-r--r--utilities/Alpha_complex/periodic_alpha_complex_3d_persistence.cpp300
-rw-r--r--utilities/Alpha_complex/weighted_alpha_complex_3d_persistence.cpp (renamed from example/Persistent_cohomology/weighted_alpha_complex_3d_persistence.cpp)197
-rw-r--r--utilities/Alpha_complex/weighted_periodic_alpha_complex_3d_persistence.cpp (renamed from example/Persistent_cohomology/periodic_alpha_complex_3d_persistence.cpp)172
-rw-r--r--utilities/Bitmap_cubical_complex/CMakeLists.txt29
-rw-r--r--utilities/Bitmap_cubical_complex/cubical_complex_persistence.cpp (renamed from example/Bitmap_cubical_complex/Bitmap_cubical_complex.cpp)24
-rw-r--r--utilities/Bitmap_cubical_complex/cubicalcomplex.md29
-rw-r--r--utilities/Bitmap_cubical_complex/periodic_cubical_complex_persistence.cpp (renamed from example/Bitmap_cubical_complex/Bitmap_cubical_complex_periodic_boundary_conditions.cpp)28
-rw-r--r--utilities/Bottleneck_distance/CMakeLists.txt16
-rw-r--r--utilities/Bottleneck_distance/bottleneck_distance.cpp (renamed from example/Bottleneck_distance/bottleneck_read_file_example.cpp)2
-rw-r--r--utilities/Bottleneck_distance/bottleneckdistance.md18
-rw-r--r--utilities/Nerve_GIC/CMakeLists.txt24
-rwxr-xr-xutilities/Nerve_GIC/KeplerMapperVisuFromTxtFile.py89
-rw-r--r--utilities/Nerve_GIC/Nerve.cpp96
-rw-r--r--utilities/Nerve_GIC/Nerve.txt63
-rw-r--r--utilities/Nerve_GIC/VoronoiGIC.cpp90
-rw-r--r--utilities/Nerve_GIC/covercomplex.md62
-rwxr-xr-xutilities/Nerve_GIC/km.py390
-rw-r--r--utilities/Nerve_GIC/km.py.COPYRIGHT26
-rw-r--r--utilities/Persistence_representations/CMakeLists.txt53
-rw-r--r--utilities/Persistence_representations/persistence_heat_maps/CMakeLists.txt15
-rw-r--r--utilities/Persistence_representations/persistence_heat_maps/average_persistence_heat_maps.cpp63
-rw-r--r--utilities/Persistence_representations/persistence_heat_maps/compute_distance_of_persistence_heat_maps.cpp94
-rw-r--r--utilities/Persistence_representations/persistence_heat_maps/compute_scalar_product_of_persistence_heat_maps.cpp85
-rw-r--r--utilities/Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_arctan_of_their_persistence.cpp81
-rw-r--r--utilities/Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_distance_from_diagonal.cpp81
-rw-r--r--utilities/Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_squared_diag_distance.cpp83
-rw-r--r--utilities/Persistence_representations/persistence_heat_maps/create_persistence_heat_maps.cpp78
-rw-r--r--utilities/Persistence_representations/persistence_heat_maps/create_pssk.cpp79
-rw-r--r--utilities/Persistence_representations/persistence_heat_maps/plot_persistence_heat_map.cpp42
-rw-r--r--utilities/Persistence_representations/persistence_intervals/CMakeLists.txt32
-rw-r--r--utilities/Persistence_representations/persistence_intervals/compute_birth_death_range_in_persistence_diagram.cpp68
-rw-r--r--utilities/Persistence_representations/persistence_intervals/compute_bottleneck_distance.cpp95
-rw-r--r--utilities/Persistence_representations/persistence_intervals/compute_number_of_dominant_intervals.cpp54
-rw-r--r--utilities/Persistence_representations/persistence_intervals/plot_histogram_of_intervals_lengths.cpp77
-rw-r--r--utilities/Persistence_representations/persistence_intervals/plot_persistence_Betti_numbers.cpp87
-rw-r--r--utilities/Persistence_representations/persistence_intervals/plot_persistence_intervals.cpp53
-rw-r--r--utilities/Persistence_representations/persistence_landscapes/CMakeLists.txt10
-rw-r--r--utilities/Persistence_representations/persistence_landscapes/average_landscapes.cpp63
-rw-r--r--utilities/Persistence_representations/persistence_landscapes/compute_distance_of_landscapes.cpp93
-rw-r--r--utilities/Persistence_representations/persistence_landscapes/compute_scalar_product_of_landscapes.cpp84
-rw-r--r--utilities/Persistence_representations/persistence_landscapes/create_landscapes.cpp65
-rw-r--r--utilities/Persistence_representations/persistence_landscapes/plot_landscapes.cpp43
-rw-r--r--utilities/Persistence_representations/persistence_landscapes_on_grid/CMakeLists.txt11
-rw-r--r--utilities/Persistence_representations/persistence_landscapes_on_grid/average_landscapes_on_grid.cpp63
-rw-r--r--utilities/Persistence_representations/persistence_landscapes_on_grid/compute_distance_of_landscapes_on_grid.cpp93
-rw-r--r--utilities/Persistence_representations/persistence_landscapes_on_grid/compute_scalar_product_of_landscapes_on_grid.cpp85
-rw-r--r--utilities/Persistence_representations/persistence_landscapes_on_grid/create_landscapes_on_grid.cpp79
-rw-r--r--utilities/Persistence_representations/persistence_landscapes_on_grid/plot_landscapes_on_grid.cpp44
-rw-r--r--utilities/Persistence_representations/persistence_vectors/CMakeLists.txt10
-rw-r--r--utilities/Persistence_representations/persistence_vectors/average_persistence_vectors.cpp65
-rw-r--r--utilities/Persistence_representations/persistence_vectors/compute_distance_of_persistence_vectors.cpp94
-rw-r--r--utilities/Persistence_representations/persistence_vectors/compute_scalar_product_of_persistence_vectors.cpp86
-rw-r--r--utilities/Persistence_representations/persistence_vectors/create_persistence_vectors.cpp69
-rw-r--r--utilities/Persistence_representations/persistence_vectors/plot_persistence_vectors.cpp43
-rw-r--r--utilities/Rips_complex/CMakeLists.txt21
-rw-r--r--utilities/Rips_complex/rips_distance_matrix_persistence.cpp (renamed from example/Persistent_cohomology/rips_distance_matrix_persistence.cpp)61
-rw-r--r--utilities/Rips_complex/rips_persistence.cpp (renamed from example/Persistent_cohomology/rips_persistence.cpp)60
-rw-r--r--utilities/Rips_complex/ripscomplex.md49
-rw-r--r--utilities/Witness_complex/CMakeLists.txt28
-rw-r--r--utilities/Witness_complex/strong_witness_persistence.cpp (renamed from example/Witness_complex/example_strong_witness_persistence.cpp)71
-rw-r--r--utilities/Witness_complex/weak_witness_persistence.cpp (renamed from example/Witness_complex/example_witness_complex_persistence.cpp)71
-rw-r--r--utilities/Witness_complex/witnesscomplex.md66
-rw-r--r--utilities/common/README19
-rw-r--r--utilities/common/pointsetgenerator.md33
194 files changed, 33737 insertions, 1854 deletions
diff --git a/CMakeGUDHIVersion.txt b/CMakeGUDHIVersion.txt
index bfef1590..5e71f7eb 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)
set(GUDHI_VERSION ${GUDHI_MAJOR_VERSION}.${GUDHI_MINOR_VERSION}.${GUDHI_PATCH_VERSION})
message(STATUS "GUDHI version : ${GUDHI_VERSION}")
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 795005b1..94587044 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,6 +16,7 @@ add_gudhi_module(Bitmap_cubical_complex)
add_gudhi_module(Bottleneck_distance)
add_gudhi_module(Contraction)
add_gudhi_module(Hasse_complex)
+add_gudhi_module(Persistence_representations)
add_gudhi_module(Persistent_cohomology)
add_gudhi_module(Rips_complex)
add_gudhi_module(Simplex_tree)
@@ -24,6 +25,7 @@ add_gudhi_module(Spatial_searching)
add_gudhi_module(Subsampling)
add_gudhi_module(Tangential_complex)
add_gudhi_module(Witness_complex)
+add_gudhi_module(Nerve_GIC)
message("++ GUDHI_MODULES list is:\"${GUDHI_MODULES}\"")
diff --git a/Doxyfile b/Doxyfile
index 0ef81e5c..f1981e2e 100644
--- a/Doxyfile
+++ b/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"
# 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
@@ -801,7 +801,7 @@ EXCLUDE_SYMLINKS = NO
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories for example use the pattern */test/*
-EXCLUDE_PATTERNS =
+EXCLUDE_PATTERNS = */utilities/*/*.md
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
# (namespaces, classes, functions, etc.) that should be excluded from the
@@ -819,7 +819,8 @@ EXCLUDE_SYMBOLS =
# command).
EXAMPLE_PATH = biblio/ \
- example/
+ example/ \
+ utilities/
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
@@ -851,7 +852,9 @@ IMAGE_PATH = doc/Skeleton_blocker/ \
doc/Subsampling/ \
doc/Spatial_searching/ \
doc/Tangential_complex/ \
- doc/Bottleneck_distance/
+ doc/Bottleneck_distance/ \
+ doc/Nerve_GIC/ \
+ doc/Persistence_representations/
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
diff --git a/GudhUI/CMakeLists.txt b/GudhUI/CMakeLists.txt
index 374195d0..2503a03e 100644
--- a/GudhUI/CMakeLists.txt
+++ b/GudhUI/CMakeLists.txt
@@ -1,37 +1,41 @@
cmake_minimum_required(VERSION 2.8)
project(GudhUI)
-find_package(Qt5 COMPONENTS Widgets Xml OpenGL)
-find_package(QGLViewer)
+# Need to find OpenGL first as find_package(Qt5) tries to #include"GL/gl.h" on some platforms
find_package(OpenGL)
-if ( CGAL_FOUND AND Qt5_FOUND AND OPENGL_FOUND AND QGLVIEWER_FOUND AND NOT CGAL_VERSION VERSION_EQUAL 4.8.0)
-
- set(CMAKE_AUTOMOC ON)
- set(CMAKE_AUTOUIC ON)
- set(CMAKE_INCLUDE_CURRENT_DIR ON)
-
- SET(Boost_USE_STATIC_LIBS ON)
- SET(Boost_USE_MULTITHREAD OFF)
- include_directories (${QGLVIEWER_INCLUDE_DIR})
-
- add_executable ( GudhUI
- gui/gudhui.cpp
- gui/MainWindow.cpp
- gui/Menu_k_nearest_neighbors.cpp
- gui/Menu_uniform_neighbors.cpp
- gui/Menu_edge_contraction.cpp
- gui/Menu_persistence.cpp
- view/Viewer_instructor.cpp
- view/Viewer.cpp
- )
- target_link_libraries( GudhUI Qt5::Widgets Qt5::Xml Qt5::OpenGL )
- target_link_libraries( GudhUI ${QGLVIEWER_LIBRARIES} )
- target_link_libraries( GudhUI ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} )
- if (TBB_FOUND)
- target_link_libraries( GudhUI ${TBB_LIBRARIES})
+if (OPENGL_FOUND)
+ find_package(Qt5 COMPONENTS Widgets Xml OpenGL)
+ find_package(QGLViewer)
+
+ if ( CGAL_FOUND AND Qt5_FOUND AND QGLVIEWER_FOUND AND NOT CGAL_VERSION VERSION_EQUAL 4.8.0)
+
+ set(CMAKE_AUTOMOC ON)
+ set(CMAKE_AUTOUIC ON)
+ set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+ SET(Boost_USE_STATIC_LIBS ON)
+ SET(Boost_USE_MULTITHREAD OFF)
+ include_directories (${QGLVIEWER_INCLUDE_DIR})
+
+ add_executable ( GudhUI
+ gui/gudhui.cpp
+ gui/MainWindow.cpp
+ gui/Menu_k_nearest_neighbors.cpp
+ gui/Menu_uniform_neighbors.cpp
+ gui/Menu_edge_contraction.cpp
+ gui/Menu_persistence.cpp
+ view/Viewer_instructor.cpp
+ view/Viewer.cpp
+ )
+ target_link_libraries( GudhUI Qt5::Widgets Qt5::Xml Qt5::OpenGL )
+ target_link_libraries( GudhUI ${QGLVIEWER_LIBRARIES} )
+ target_link_libraries( GudhUI ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} )
+ if (TBB_FOUND)
+ target_link_libraries( GudhUI ${TBB_LIBRARIES})
+ endif()
+
+ install(TARGETS GudhUI DESTINATION bin)
+
endif()
-
- install(TARGETS GudhUI DESTINATION bin)
-
-endif()
+endif(OPENGL_FOUND) \ No newline at end of file
diff --git a/biblio/bibliography.bib b/biblio/bibliography.bib
index 29fc5650..b101cb76 100644
--- a/biblio/bibliography.bib
+++ b/biblio/bibliography.bib
@@ -6,6 +6,30 @@
year = {2014},
}
+@article{Carriere17c,
+ author = {Carri\`ere, Mathieu and Michel, Bertrand and Oudot, Steve},
+ title = {{Statistical Analysis and Parameter Selection for Mapper}},
+ journal = {CoRR},
+ volume = {abs/1706.00204},
+ year = {2017}
+}
+
+@inproceedings{Dey13,
+ author = {Dey, Tamal and Fan, Fengtao and Wang, Yusu},
+ title = {Graph Induced Complex on Point Data},
+ booktitle = {Proceedings of the Twenty-ninth Annual Symposium on Computational Geometry},
+ year = {2013},
+ pages = {107--116},
+}
+
+@article{Carriere16,
+ title={{Structure and Stability of the 1-Dimensional Mapper}},
+ author={Carri\`ere, Mathieu and Oudot, Steve},
+ journal={CoRR},
+ volume= {abs/1511.05823},
+ year={2015}
+}
+
@inproceedings{zigzag_reflection,
author = {Jean-Daniel Boissonnat and Cl\'ement Maria and Steve Oudot},
title = {Zigzag Persistent Homology Algorithm via Reflections},
@@ -979,3 +1003,72 @@ language={English}
pages={157-166},
year={2004}
}
+
+@ARTICLE{bubenik_landscapes_2015,
+ author = {P. Bubenik},
+ title = {Statistical topological data analysis using persistence landscapes.},
+ journal = {Journal of Machine Learning Research},
+ year = {2015}
+}
+
+@ARTICLE{bubenik_dlotko_landscapes_2016,
+ author = {P. Bubenik and P. Dlotko},
+ title = {A persistence landscapes toolbox for topological statistics.},
+ journal = {Journal of Symbolic Computation.},
+ year = {2016}
+}
+
+@ARTICLE{Fasy_Kim_Lecci_Maria_tda,
+ author = {B. Fasy and J. Kim and F. Lecci and C. Maria},
+ title = {Introduction to the R package TDA.},
+ journal = {arXiv:1411.1830.},
+ year = {2016}
+}
+
+
+@ARTICLE{Ferri_Frosini_comparision_sheme_1,
+ author = {P. Donatini and P. Frosini and A. Lovato},
+ title = {Size functions for signature recognition.},
+ journal = {Proceedings of SPIE, Vision Geometry VII, vol. 3454},
+ year = {1998}
+}
+
+
+@ARTICLE{Ferri_Frosini_comparision_sheme_2,
+ author = {M. Ferri and P. Frosini and A. Lovato and C. Zambelli},
+ title = {Point selection: A new comparison scheme for size functions (With an application to monogram recognition).},
+ journal = {Proceedings Third Asian Conference on Computer Vision, Lecture Notes in Computer Science 1351.},
+ year = {1998}
+}
+
+@ARTICLE{Persistence_Images_2017,
+ author = {H. Adams and S. Chepushtanova and T. Emerson and E. Hanson and M. Kirby and F. Motta and R. Neville and C. Peterson and P. Shipman and L. Ziegelmeier},
+ title = {Persistence Images: A Stable Vector Representation of Persistent Homology.},
+ journal = {Journal of Machine Learning Research},
+ year = {2017}
+}
+
+
+@ARTICLE{Kusano_Fukumizu_Hiraoka_PWGK,
+ author = {G. Kusano and K. Fukumizu and Y. Hiraoka},
+ title = {Persistence weighted Gaussian kernel for topological data analysis.},
+ journal = {ICML'16 Proceedings of the 33rd International Conference on International Conference on Machine Learning - Volume 48},
+ year = {2016}
+}
+
+@ARTICLE{Reininghaus_Huber_ALL_PSSK,
+ author = {J. Reininghaus and S. Huber and U. Bauer and R. Kwitt},
+ title = {A Stable Multi-Scale Kernel for Topological Machine Learning.},
+ journal = {Proc. 2015 IEEE Conf. Comp. Vision & Pat. Rec. (CVPR '15)},
+ year = {2015}
+}
+
+@ARTICLE{Carriere_Oudot_Ovsjanikov_top_signatures_3d,
+ author = {M. Carrière and S. Oudot and M. Ovsjanikov},
+ title = {Stable Topological Signatures for Points on 3D Shapes.},
+ journal = {Proc. Sympos. on Geometry Processing},
+ year = {2015}
+}
+
+
+
diff --git a/biblio/how_to_cite_gudhi.bib b/biblio/how_to_cite_gudhi.bib
index 59c05a5b..5994124a 100644
--- a/biblio/how_to_cite_gudhi.bib
+++ b/biblio/how_to_cite_gudhi.bib
@@ -122,3 +122,21 @@
, url = "http://gudhi.gforge.inria.fr/python/latest/"
, year = 2016
}
+
+@incollection{gudhi:CoverComplex
+, author = "Mathieu Carri\`ere"
+, title = "Cover complex"
+, publisher = "{GUDHI Editorial Board}"
+, booktitle = "{GUDHI} User and Reference Manual"
+, url = "http://gudhi.gforge.inria.fr/doc/latest/group__cover__complex.html"
+, year = 2017
+}
+
+@incollection{gudhi:PersistenceRepresentations
+, author = "Pawel Dlotko"
+, title = "Persistence representations"
+, publisher = "{GUDHI Editorial Board}"
+, booktitle = "{GUDHI} User and Reference Manual"
+, url = "http://gudhi.gforge.inria.fr/doc/latest/group___persistence__representations.html"
+, year = 2017
+}
diff --git a/cmake/modules/GUDHI_doxygen_target.cmake b/cmake/modules/GUDHI_doxygen_target.cmake
index d2cb952d..f3e2d9f5 100644
--- a/cmake/modules/GUDHI_doxygen_target.cmake
+++ b/cmake/modules/GUDHI_doxygen_target.cmake
@@ -3,6 +3,11 @@ find_package(Doxygen)
if(DOXYGEN_FOUND)
# configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
+ #starting from cmake 3.9 the usage of DOXYGEN_EXECUTABLE is deprecated
+ if(TARGET Doxygen::doxygen)
+ get_property(DOXYGEN_EXECUTABLE TARGET Doxygen::doxygen PROPERTY IMPORTED_LOCATION)
+ endif()
+
add_custom_target(doxygen ${DOXYGEN_EXECUTABLE} ${GUDHI_USER_VERSION_DIR}/Doxyfile
WORKING_DIRECTORY ${GUDHI_USER_VERSION_DIR}
DEPENDS ${GUDHI_USER_VERSION_DIR}/Doxyfile ${GUDHI_DOXYGEN_DEPENDENCY}
diff --git a/cmake/modules/GUDHI_test_coverage.cmake b/cmake/modules/GUDHI_test_coverage.cmake
index ce171a0e..bea5b2d6 100644
--- a/cmake/modules/GUDHI_test_coverage.cmake
+++ b/cmake/modules/GUDHI_test_coverage.cmake
@@ -8,7 +8,19 @@ if (GPROF_PATH)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
endif()
+if (DEBUG_TRACES)
+ # Make CTest more verbose with DEBUG_TRACES - no XML output
+ set(GUDHI_UT_LOG_LEVEL "--log_level=all")
+ set(GUDHI_UT_REPORT_LEVEL "--report_level=detailed")
+else()
+ set(GUDHI_UT_LOG_FORMAT "--log_format=XML")
+ set(GUDHI_UT_LOG_SINK "--log_sink=${CMAKE_BINARY_DIR}/${unitary_test}_UT.xml")
+ set(GUDHI_UT_LOG_LEVEL "--log_level=test_suite")
+ set(GUDHI_UT_REPORT_LEVEL "--report_level=no")
+endif()
+
function(gudhi_add_coverage_test unitary_test)
add_test(NAME ${unitary_test} COMMAND $<TARGET_FILE:${unitary_test}>
- "--log_format=XML" "--log_sink=${CMAKE_BINARY_DIR}/${unitary_test}_UT.xml" "--log_level=test_suite" "--report_level=no")
+ ${GUDHI_UT_LOG_FORMAT} ${GUDHI_UT_LOG_SINK}
+ ${GUDHI_UT_LOG_LEVEL} ${GUDHI_UT_REPORT_LEVEL})
endfunction()
diff --git a/cmake/modules/GUDHI_third_party_libraries.cmake b/cmake/modules/GUDHI_third_party_libraries.cmake
index f2bbafdc..419c2581 100644
--- a/cmake/modules/GUDHI_third_party_libraries.cmake
+++ b/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.")
@@ -54,10 +54,12 @@ if(CGAL_FOUND)
endforeach(CGAL_INCLUDE_DIR ${CGAL_INCLUDE_DIRS})
endif(NOT CGAL_VERSION VERSION_GREATER 4.9.0)
- # For dev version
- include_directories(BEFORE "src/common/include/gudhi_patches")
- # For user version
- include_directories(BEFORE "include/gudhi_patches")
+ if (NOT CGAL_VERSION VERSION_GREATER 4.11.0)
+ # For dev version
+ include_directories(BEFORE "src/common/include/gudhi_patches")
+ # For user version
+ include_directories(BEFORE "include/gudhi_patches")
+ endif (NOT CGAL_VERSION VERSION_GREATER 4.11.0)
endif()
endif()
@@ -83,7 +85,6 @@ FIND_PROGRAM( GCOVR_PATH gcovr )
if (GCOVR_PATH)
message("gcovr found in ${GCOVR_PATH}")
endif()
-# Required programs for unitary tests purpose
FIND_PROGRAM( GPROF_PATH gprof )
if (GPROF_PATH)
message("gprof found in ${GPROF_PATH}")
@@ -92,6 +93,10 @@ FIND_PROGRAM( DIFF_PATH diff )
if (DIFF_PATH)
message("diff found in ${DIFF_PATH}")
endif()
+FIND_PROGRAM( GNUPLOT_PATH gnuplot )
+if (GNUPLOT_PATH)
+ message("gnuplot found in ${GNUPLOT_PATH}")
+endif()
# BOOST ISSUE result_of vs C++11
add_definitions(-DBOOST_RESULT_OF_USE_DECLTYPE)
diff --git a/cmake/modules/GUDHI_user_version_target.cmake b/cmake/modules/GUDHI_user_version_target.cmake
index cff64ad2..4abc2574 100644
--- a/cmake/modules/GUDHI_user_version_target.cmake
+++ b/cmake/modules/GUDHI_user_version_target.cmake
@@ -48,7 +48,11 @@ if (NOT CMAKE_VERSION VERSION_LESS 2.8.11)
copy_directory ${CMAKE_SOURCE_DIR}/src/GudhUI ${GUDHI_USER_VERSION_DIR}/GudhUI)
set(GUDHI_DIRECTORIES "doc;example;concept;utilities")
- set(GUDHI_INCLUDE_DIRECTORIES "include/gudhi;include/gudhi_patches")
+ if (NOT CGAL_VERSION VERSION_GREATER 4.11.0)
+ set(GUDHI_INCLUDE_DIRECTORIES "include/gudhi;include/gudhi_patches")
+ else ()
+ set(GUDHI_INCLUDE_DIRECTORIES "include/gudhi")
+ endif ()
foreach(GUDHI_MODULE ${GUDHI_MODULES_FULL_LIST})
foreach(GUDHI_DIRECTORY ${GUDHI_DIRECTORIES})
diff --git a/concept/Persistence_representations/Real_valued_topological_data.h b/concept/Persistence_representations/Real_valued_topological_data.h
new file mode 100644
index 00000000..1d3595ad
--- /dev/null
+++ b/concept/Persistence_representations/Real_valued_topological_data.h
@@ -0,0 +1,51 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef CONCEPT_REAL_VALUED_TOPOLOGICAL_DATA_H_
+#define CONCEPT_REAL_VALUED_TOPOLOGICAL_DATA_H_
+
+namespace Gudhi {
+
+namespace Persistence_representations {
+
+/** \brief The concept Real_valued_topological_data describes the requirements
+ * for a type to implement a container that allows computations of its projections to R.
+ */
+class Real_valued_topological_data {
+ public:
+ /**
+* Typically there are various ways data can be projected to R. This function gives us the number of functions for
+* vectorization provided by a given class.
+ **/
+ size_t number_of_projections_to_R();
+ /**
+* This is a function to compute the projection from this container to reals. The parameter of a function have to
+* be between 0 and the value returned by number_of_projections_to_R().
+**/
+ double project_to_R(size_t number_of_projection);
+};
+
+} // namespace Persistence_representations
+
+} // namespace Gudhi
+
+#endif // CONCEPT_REAL_VALUED_TOPOLOGICAL_DATA_H_
diff --git a/concept/Persistence_representations/Topological_data_with_averages.h b/concept/Persistence_representations/Topological_data_with_averages.h
new file mode 100644
index 00000000..9ebd105f
--- /dev/null
+++ b/concept/Persistence_representations/Topological_data_with_averages.h
@@ -0,0 +1,44 @@
+
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef CONCEPT_TOPOLOGICAL_DATA_WITH_AVERAGES_H_
+#define CONCEPT_TOPOLOGICAL_DATA_WITH_AVERAGES_H_
+
+namespace Gudhi {
+
+namespace Persistence_representations {
+
+/** \brief The concept Topological_data_with_averages describes the requirements
+ * for a type to implement a container that allows computations of averages.
+ * Note that the average object after being computed is stored in *this.
+ */
+class Topological_data_with_averages {
+ public:
+ void compute_average(const std::vector<Topological_data_with_averages*>& to_average);
+};
+
+} // namespace Persistence_representations
+
+} // namespace Gudhi
+
+#endif // CONCEPT_TOPOLOGICAL_DATA_WITH_AVERAGES_H_
diff --git a/concept/Persistence_representations/Topological_data_with_distances.h b/concept/Persistence_representations/Topological_data_with_distances.h
new file mode 100644
index 00000000..a6a62307
--- /dev/null
+++ b/concept/Persistence_representations/Topological_data_with_distances.h
@@ -0,0 +1,49 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef CONCEPT_TOPOLOGICAL_DATA_WITH_DISTANCES_H_
+#define CONCEPT_TOPOLOGICAL_DATA_WITH_DISTANCES_H_
+
+namespace Gudhi {
+
+namespace Persistence_representations {
+
+/** \brief The concept Topological_data_with_distances describes the requirements
+ * for a type to implement a container that allows computations of distance to another contained of that type.
+ * \details
+ * The second parameter of the distance function allow to declare power of a distance. The exact meaning of that
+ * number will be different for different distances. A few examples are given below:
+ * In case of p-Wasserstein distance, the power is equal to p. power = std::limit<double>::max() for bottleneck
+ * distance.
+ *
+ * In case of L^p landscape distance, the power is equal to p. s
+ */
+class Topological_data_with_distances {
+ public:
+ double distance(const Topological_data_with_distances& second, double power = 1);
+};
+
+} // namespace Persistence_representations
+
+} // namespace Gudhi
+
+#endif // CONCEPT_TOPOLOGICAL_DATA_WITH_DISTANCES_H_
diff --git a/concept/Persistence_representations/Topological_data_with_scalar_product.h b/concept/Persistence_representations/Topological_data_with_scalar_product.h
new file mode 100644
index 00000000..2e506ca9
--- /dev/null
+++ b/concept/Persistence_representations/Topological_data_with_scalar_product.h
@@ -0,0 +1,42 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef CONCEPT_TOPOLOGICAL_DATA_WITH_SCALAR_PRODUCT_H_
+#define CONCEPT_TOPOLOGICAL_DATA_WITH_SCALAR_PRODUCT_H_
+
+namespace Gudhi {
+
+namespace Persistence_representations {
+
+/** \brief The concept Topological_data_with_scalar_product describes the requirements
+ * for a type to implement a container that allows computations of scalar products.
+ */
+class Topological_data_with_scalar_product {
+ public:
+ double compute_scalar_product(const Topological_data_with_scalar_product& second);
+};
+
+} // namespace Persistence_representations
+
+} // namespace Gudhi
+
+#endif // CONCEPT_TOPOLOGICAL_DATA_WITH_SCALAR_PRODUCT_H_
diff --git a/concept/Persistence_representations/Vectorized_topological_data.h b/concept/Persistence_representations/Vectorized_topological_data.h
new file mode 100644
index 00000000..b6b5b109
--- /dev/null
+++ b/concept/Persistence_representations/Vectorized_topological_data.h
@@ -0,0 +1,51 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef CONCEPT_VECTORIZED_TOPOLOGICAL_DATA_H_
+#define CONCEPT_VECTORIZED_TOPOLOGICAL_DATA_H_
+
+namespace Gudhi {
+
+namespace Persistence_representations {
+
+/** \brief The concept Vectorized_topological_data describes the requirements
+ * for a type to implement a container that allows vectorization.
+ */
+class Vectorized_topological_data {
+ public:
+ /**
+ * There are various ways data can be vectorized. This function give us the number of functions for vectorization
+ *provided by a given class.
+ **/
+ size_t number_of_vectorize_functions();
+ /**
+ * This is a function to vectorize given container. The parameter of a function have to be between 0 and the value
+ *returned by number_of_vectorize_functions().
+ **/
+ std::vector<double> vectorize(int number_of_function);
+};
+
+} // namespace Persistence_representations
+
+} // namespace Gudhi
+
+#endif // CONCEPT_VECTORIZED_TOPOLOGICAL_DATA_H_
diff --git a/cython/cython/periodic_cubical_complex.pyx b/cython/cython/periodic_cubical_complex.pyx
index 581c7b69..3025f125 100644
--- a/cython/cython/periodic_cubical_complex.pyx
+++ b/cython/cython/periodic_cubical_complex.pyx
@@ -33,7 +33,7 @@ __license__ = "GPL v3"
cdef extern from "Cubical_complex_interface.h" namespace "Gudhi":
cdef cppclass Periodic_cubical_complex_base_interface "Gudhi::Cubical_complex::Cubical_complex_interface<Gudhi::cubical_complex::Bitmap_cubical_complex_periodic_boundary_conditions_base<double>>":
- Periodic_cubical_complex_base_interface(vector[unsigned] dimensions, vector[double] top_dimensional_cells)
+ Periodic_cubical_complex_base_interface(vector[unsigned] dimensions, vector[double] top_dimensional_cells, vector[bool] periodic_dimensions)
Periodic_cubical_complex_base_interface(string perseus_file)
int num_simplices()
int dimension()
@@ -58,7 +58,7 @@ cdef class PeriodicCubicalComplex:
# Fake constructor that does nothing but documenting the constructor
def __init__(self, dimensions=None, top_dimensional_cells=None,
- perseus_file=''):
+ periodic_dimensions=None, perseus_file=''):
"""PeriodicCubicalComplex constructor from dimensions and
top_dimensional_cells or from a Perseus-style file name.
@@ -66,6 +66,8 @@ cdef class PeriodicCubicalComplex:
:type dimensions: list of int
:param top_dimensional_cells: A list of cells filtration values.
:type top_dimensional_cells: list of double
+ :param periodic_dimensions: A list of top dimensional cells periodicity value.
+ :type periodic_dimensions: list of boolean
Or
@@ -75,10 +77,10 @@ cdef class PeriodicCubicalComplex:
# The real cython constructor
def __cinit__(self, dimensions=None, top_dimensional_cells=None,
- perseus_file=''):
- if (dimensions is not None) and (top_dimensional_cells is not None) and (perseus_file is ''):
- self.thisptr = new Periodic_cubical_complex_base_interface(dimensions, top_dimensional_cells)
- elif (dimensions is None) and (top_dimensional_cells is None) and (perseus_file is not ''):
+ periodic_dimensions=None, perseus_file=''):
+ if (dimensions is not None) and (top_dimensional_cells is not None) and (periodic_dimensions is not None) and (perseus_file is ''):
+ self.thisptr = new Periodic_cubical_complex_base_interface(dimensions, top_dimensional_cells, periodic_dimensions)
+ elif (dimensions is None) and (top_dimensional_cells is None) and (periodic_dimensions is None) and (perseus_file is not ''):
if os.path.isfile(perseus_file):
self.thisptr = new Periodic_cubical_complex_base_interface(str.encode(perseus_file))
else:
diff --git a/cython/cython/simplex_tree.pyx b/cython/cython/simplex_tree.pyx
index 45487158..0cb575d2 100644
--- a/cython/cython/simplex_tree.pyx
+++ b/cython/cython/simplex_tree.pyx
@@ -37,11 +37,13 @@ cdef extern from "Simplex_tree_interface.h" namespace "Gudhi":
cdef cppclass Simplex_tree_interface_full_featured "Gudhi::Simplex_tree_interface<Gudhi::Simplex_tree_options_full_featured>":
Simplex_tree()
double simplex_filtration(vector[int] simplex)
+ void assign_simplex_filtration(vector[int] simplex, double filtration)
void initialize_filtration()
int num_vertices()
int num_simplices()
void set_dimension(int dimension)
int dimension()
+ int upper_bound_dimension()
bint find_simplex(vector[int] simplex)
bint insert_simplex_and_subfaces(vector[int] simplex,
double filtration)
@@ -50,8 +52,9 @@ cdef extern from "Simplex_tree_interface.h" namespace "Gudhi":
vector[pair[vector[int], double]] get_star(vector[int] simplex)
vector[pair[vector[int], double]] get_cofaces(vector[int] simplex,
int dimension)
- void remove_maximal_simplex(vector[int] simplex)
void expansion(int max_dim)
+ void remove_maximal_simplex(vector[int] simplex)
+ bool prune_above_filtration(double filtration)
cdef extern from "Persistent_cohomology_interface.h" namespace "Gudhi":
cdef cppclass Simplex_tree_persistence_interface "Gudhi::Persistent_cohomology_interface<Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_full_featured>>":
@@ -103,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.
@@ -113,15 +116,31 @@ cdef class SimplexTree:
"""
return self.thisptr.simplex_filtration(simplex)
+ def assign_filtration(self, simplex, filtration):
+ """This function assigns the simplicial complex filtration value for a
+ given N-simplex.
+
+ :param simplex: The N-simplex, represented by a list of vertex.
+ :type simplex: list of int.
+ :param filtration: The simplicial complex filtration value.
+ :type filtration: float
+ """
+ self.thisptr.assign_simplex_filtration(simplex, filtration)
+
def initialize_filtration(self):
"""This function initializes and sorts the simplicial complex
filtration vector.
.. note::
- This function must be launched before persistence, betti_numbers,
- persistent_betti_numbers or get_filtration after inserting or
- removing simplices.
+ This function must be launched before
+ :func:`persistence()<gudhi.SimplexTree.persistence>`,
+ :func:`betti_numbers()<gudhi.SimplexTree.betti_numbers>`,
+ :func:`persistent_betti_numbers()<gudhi.SimplexTree.persistent_betti_numbers>`,
+ or :func:`get_filtration()<gudhi.SimplexTree.get_filtration>`
+ after :func:`inserting<gudhi.SimplexTree.insert>` or
+ :func:`removing<gudhi.SimplexTree.remove_maximal_simplex>`
+ simplices.
"""
self.thisptr.initialize_filtration()
@@ -148,21 +167,42 @@ cdef class SimplexTree:
:returns: the simplicial complex dimension.
:rtype: int
+
+ .. note::
+
+ This function is not constant time because it can recompute
+ dimension if required (can be triggered by
+ :func:`remove_maximal_simplex()<gudhi.SimplexTree.remove_maximal_simplex>`
+ or
+ :func:`prune_above_filtration()<gudhi.SimplexTree.prune_above_filtration>`
+ methods).
"""
return self.thisptr.dimension()
- def set_dimension(self, dimension):
- """This function sets the dimension of the simplicial complex.
+ def upper_bound_dimension(self):
+ """This function returns a valid dimension upper bound of the
+ simplicial complex.
- insert and remove_maximal_simplex functions do not update dimension
- value of the `SimplexTree`.
+ :returns: an upper bound on the dimension of the simplicial complex.
+ :rtype: int
+ """
+ return self.thisptr.upper_bound_dimension()
- `AlphaComplex`, `RipsComplex`, `TangentialComplex` and `WitnessComplex`
- automatically sets the correct dimension in their `create_simplex_tree`
- functions.
+ def set_dimension(self, dimension):
+ """This function sets the dimension of the simplicial complex.
:param dimension: The new dimension value.
:type dimension: int.
+
+ .. note::
+
+ This function must be used with caution because it disables
+ dimension recomputation when required
+ (this recomputation can be triggered by
+ :func:`remove_maximal_simplex()<gudhi.SimplexTree.remove_maximal_simplex>`
+ or
+ :func:`prune_above_filtration()<gudhi.SimplexTree.prune_above_filtration>`
+ ).
"""
self.thisptr.set_dimension(<int>dimension)
@@ -182,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
@@ -286,9 +329,57 @@ cdef class SimplexTree:
:param simplex: The N-simplex, represented by a list of vertex.
:type simplex: list of int.
+
+ .. note::
+
+ Be aware that removing is shifting data in a flat_map
+ (:func:`initialize_filtration()<gudhi.SimplexTree.initialize_filtration>` to be done).
+
+ .. note::
+
+ The dimension of the simplicial complex may be lower after calling
+ remove_maximal_simplex than it was before. However,
+ :func:`upper_bound_dimension()<gudhi.SimplexTree.upper_bound_dimension>`
+ method will return the old value, which
+ remains a valid upper bound. If you care, you can call
+ :func:`dimension()<gudhi.SimplexTree.dimension>`
+ to recompute the exact dimension.
"""
self.thisptr.remove_maximal_simplex(simplex)
+ def prune_above_filtration(self, filtration):
+ """Prune above filtration value given as parameter.
+
+ :param filtration: Maximum threshold value.
+ :type filtration: float.
+ :returns: The filtration modification information.
+ :rtype: bint
+
+
+ .. note::
+
+ Some simplex tree functions require the filtration to be valid.
+ prune_above_filtration function is not launching
+ :func:`initialize_filtration()<gudhi.SimplexTree.initialize_filtration>`
+ but returns the filtration modification
+ information. If the complex has changed , please call
+ :func:`initialize_filtration()<gudhi.SimplexTree.initialize_filtration>`
+ to recompute it.
+
+ .. note::
+
+ Note that the dimension of the simplicial complex may be lower
+ after calling
+ :func:`prune_above_filtration()<gudhi.SimplexTree.prune_above_filtration>`
+ than it was before. However,
+ :func:`upper_bound_dimension()<gudhi.SimplexTree.upper_bound_dimension>`
+ will return the old value, which remains a
+ valid upper bound. If you care, you can call
+ :func:`dimension()<gudhi.SimplexTree.dimension>`
+ method to recompute the exact dimension.
+ """
+ return self.thisptr.prune_above_filtration(filtration)
+
def expansion(self, max_dim):
"""Expands the Simplex_tree containing only its one skeleton
until dimension max_dim.
@@ -312,7 +403,7 @@ cdef class SimplexTree:
"""This function returns the persistence of the simplicial complex.
:param homology_coeff_field: The homology coefficient field. Must be a
- prime number
+ prime number. Default value is 11.
:type homology_coeff_field: int.
:param min_persistence: The minimum persistence value to take into
account (strictly greater than min_persistence). Default value is
@@ -336,8 +427,9 @@ cdef class SimplexTree:
:returns: The Betti numbers ([B0, B1, ..., Bn]).
:rtype: list of int
- :note: betti_numbers function requires persistence function to be
- launched first.
+ :note: betti_numbers function requires
+ :func:`persistence()<gudhi.SimplexTree.persistence>`
+ function to be launched first.
"""
cdef vector[int] bn_result
if self.pcohptr != NULL:
@@ -361,7 +453,8 @@ cdef class SimplexTree:
:returns: The persistent Betti numbers ([B0, B1, ..., Bn]).
:rtype: list of int
- :note: persistent_betti_numbers function requires persistence
+ :note: persistent_betti_numbers function requires
+ :func:`persistence()<gudhi.SimplexTree.persistence>`
function to be launched first.
"""
cdef vector[int] pbn_result
@@ -381,8 +474,9 @@ cdef class SimplexTree:
:returns: The persistence intervals.
:rtype: list of pair of float
- :note: intervals_in_dim function requires persistence function to be
- launched first.
+ :note: intervals_in_dim function requires
+ :func:`persistence()<gudhi.SimplexTree.persistence>`
+ function to be launched first.
"""
cdef vector[pair[double,double]] intervals_result
if self.pcohptr != NULL:
@@ -399,8 +493,9 @@ cdef class SimplexTree:
:param persistence_file: The specific dimension.
:type persistence_file: string.
- :note: intervals_in_dim function requires persistence function to be
- launched first.
+ :note: intervals_in_dim function requires
+ :func:`persistence()<gudhi.SimplexTree.persistence>`
+ function to be launched first.
"""
if self.pcohptr != NULL:
if persistence_file != '':
diff --git a/cython/doc/_templates/layout.html b/cython/doc/_templates/layout.html
index 243f33c6..8e4eba40 100644
--- a/cython/doc/_templates/layout.html
+++ b/cython/doc/_templates/layout.html
@@ -198,6 +198,8 @@
<ul class="dropdown">
<li><a href="http://gudhi.gforge.inria.fr/licensing/">Licensing</a></li>
<li><a href="https://gforge.inria.fr/frs/?group_id=3865" target="_blank">Get the sources</a></li>
+ <li><a href="https://gforge.inria.fr/frs/download.php/file/37113/GUDHI_2.0.0_OSX_UTILS.beta.tar.gz" target="_blank">Utils for Mac OSx</a></li>
+ <li><a href="https://gforge.inria.fr/frs/download.php/file/37112/GUDHI_2.0.0_WIN64_UTILS.beta.zip" target="_blank">Utils for Win x64</a></li>
</ul>
</li>
<li class="divider"></li>
@@ -208,6 +210,8 @@
<li><a href="http://gudhi.gforge.inria.fr/doc/latest/installation.html">C++ installation manual</a></li>
<li><a href="http://gudhi.gforge.inria.fr/python/latest/">Python documentation</a></li>
<li><a href="http://gudhi.gforge.inria.fr/python/latest/installation.html">Python installation manual</a></li>
+ <li><a href="http://gudhi.gforge.inria.fr/utils/">Utilities</a></li>
+ <li><a href="http://bertrand.michel.perso.math.cnrs.fr/Enseignements/TDA-Gudhi-Python.html" target="_blank">Tutorial</a></li>
</ul>
</li>
<li class="divider"></li>
@@ -255,7 +259,7 @@
{%- if hasdoc('copyright') %}
{% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
{%- else %}
- {% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
+ {% trans copyright=copyright|e %} {{ copyright }}.{% endtrans %}
{%- endif %}
{%- endif %}
{%- if last_updated %}
diff --git a/cython/doc/conf.py b/cython/doc/conf.py
index 19a880d4..a13c9751 100755
--- a/cython/doc/conf.py
+++ b/cython/doc/conf.py
@@ -62,7 +62,7 @@ import gudhi
# General information about the project.
project = gudhi.__name__
-copyright = gudhi.__copyright__
+copyright = gudhi.__copyright__ + ' - ' + gudhi.__license__
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
@@ -158,7 +158,7 @@ html_static_path = ['_static']
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
-#html_last_updated_fmt = '%b %d, %Y'
+html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
diff --git a/cython/doc/cubical_complex_user.rst b/cython/doc/cubical_complex_user.rst
index 2bfac62a..34598f02 100644
--- a/cython/doc/cubical_complex_user.rst
+++ b/cython/doc/cubical_complex_user.rst
@@ -81,23 +81,7 @@ filtration to all cubes. There are a number of constructors that can be used to
who want to use the code directly. They can be found in the :doc:`cubical_complex_ref`.
Currently one input from a text file is used. It uses a format used already in
`Perseus software <http://www.sas.upenn.edu/~vnanda/perseus/>`_ by Vidit Nanda.
-Below we are providing a description of the format. The first line contains a number d begin the dimension of the
-bitmap (2 in the example below). Next d lines are the numbers of top dimensional cubes in each dimensions (3 and 3
-in the example below). Next, in lexicographical order, the filtration of top dimensional cubes is given (1 4 6 8
-20 4 7 6 5 in the example below).
-
-.. figure::
- ../../doc/Bitmap_cubical_complex/exampleBitmap.png
- :alt: Example of a input data.
- :figclass: align-center
-
- Example of a input data.
-
-The input file for the following complex is:
-
-.. literalinclude:: ../../data/bitmap/cubicalcomplexdoc.txt
-
-.. centered:: ../../data/bitmap/cubicalcomplexdoc.txt
+The file format is described here: :doc:`Perseus <fileformats>`.
.. testcode::
@@ -124,15 +108,9 @@ Imposing periodic boundary conditions in the direction i, means that the left an
:math:`\mathcal{K}` are considered the same. In particular, if for a bitmap :math:`\mathcal{K}` periodic boundary
conditions are imposed in all directions, then complex :math:`\mathcal{K}` became n-dimensional torus. One can use
various constructors from the file Bitmap_cubical_complex_periodic_boundary_conditions_base.h to construct cubical
-complex with periodic boundary conditions. One can also use Perseus style input files. To indicate periodic boundary
-conditions in a given direction, then number of top dimensional cells in this direction have to be multiplied by -1.
-For instance:
-
-.. literalinclude:: ../../data/bitmap/periodiccubicalcomplexdoc.txt
-
-.. centered:: ../../data/bitmap/periodiccubicalcomplexdoc.txt
+complex with periodic boundary conditions.
-Indicate that we have imposed periodic boundary conditions in the direction x, but not in the direction y.
+One can also use Perseus style input files (see :doc:`Perseus <fileformats>`) for the specific periodic case:
.. testcode::
@@ -149,6 +127,23 @@ the program output is:
Periodic cubical complex is of dimension 2 - 42 simplices.
+Or it can be defined as follows:
+
+.. testcode::
+
+ from gudhi import PeriodicCubicalComplex as pcc
+ periodic_cc = pcc(dimensions=[3,3],
+ top_dimensional_cells= [0, 0, 0, 0, 1, 0, 0, 0, 0],
+ periodic_dimensions=[True, False])
+ result_str = 'Periodic cubical complex is of dimension ' + repr(periodic_cc.dimension()) + ' - ' + \
+ repr(periodic_cc.num_simplices()) + ' simplices.'
+ print(result_str)
+
+the program output is:
+
+.. testoutput::
+
+ Periodic cubical complex is of dimension 2 - 42 simplices.
Examples.
---------
diff --git a/cython/doc/fileformats.rst b/cython/doc/fileformats.rst
index 156ef4e4..4f0b6f6d 100644
--- a/cython/doc/fileformats.rst
+++ b/cython/doc/fileformats.rst
@@ -23,7 +23,7 @@ Here is a simple sample file::
3 34.2 34.974
4 3. inf
-Other sample files can be found in the data/persistence_diagram folder.
+Other sample files can be found in the `data/persistence_diagram` folder.
Such files can be generated with
:meth:`gudhi.SimplexTree.write_persistence_diagram`, read with
@@ -31,3 +31,56 @@ Such files can be generated with
:meth:`gudhi.read_persistence_intervals_in_dimension` and displayed with
:meth:`gudhi.plot_persistence_barcode` or
:meth:`gudhi.plot_persistence_diagram`.
+
+Iso-cuboid
+**********
+
+Such a file describes an iso-oriented cuboid with diagonal opposite vertices
+(min_x, min_y, min_z,...) and (max_x, max_y, max_z, ...). The format is::
+
+ min_x min_y [min_z ...]
+ max_x max_y [max_z ...]
+
+Here is a simple sample file in the 3D case::
+
+ -1. -1. -1.
+ 1. 1. 1.
+
+
+Perseus
+*******
+
+This file format is the format used by the
+`Perseus software <http://www.sas.upenn.edu/~vnanda/perseus/>`_ by Vidit Nanda.
+The first line contains a number d begin the dimension of the bitmap (2 in the
+example below). Next d lines are the numbers of top dimensional cubes in each
+dimensions (3 and 3 in the example below). Next, in lexicographical order, the
+filtration of top dimensional cubes is given (1 4 6 8 20 4 7 6 5 in the example
+below).
+
+.. figure::
+ ../../doc/Bitmap_cubical_complex/exampleBitmap.png
+ :alt: Example of a input data.
+ :figclass: align-center
+
+ Example of a input data.
+
+The input file for the following complex is:
+
+.. literalinclude:: ../../data/bitmap/cubicalcomplexdoc.txt
+
+.. centered:: ../../data/bitmap/cubicalcomplexdoc.txt
+
+To indicate periodic boundary conditions in a given direction, then number of
+top dimensional cells in this direction have to be multiplied by -1. For
+instance:
+
+.. literalinclude:: ../../data/bitmap/periodiccubicalcomplexdoc.txt
+
+.. centered:: ../../data/bitmap/periodiccubicalcomplexdoc.txt
+
+
+Indicate that we have imposed periodic boundary conditions in the direction x,
+but not in the direction y.
+
+Other sample files can be found in the `data/bitmap` folder.
diff --git a/cython/doc/python3-sphinx-build.py b/cython/doc/python3-sphinx-build.py
index 44b94169..84d158cf 100755
--- a/cython/doc/python3-sphinx-build.py
+++ b/cython/doc/python3-sphinx-build.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python3
+#!/usr/bin/env python3
"""
Emulate sphinx-build for python3
diff --git a/cython/doc/witness_complex_user.rst b/cython/doc/witness_complex_user.rst
index 29413269..99be5185 100644
--- a/cython/doc/witness_complex_user.rst
+++ b/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/cython/example/simplex_tree_example.py b/cython/example/simplex_tree_example.py
index 831d9da8..51a60e73 100755
--- a/cython/example/simplex_tree_example.py
+++ b/cython/example/simplex_tree_example.py
@@ -48,8 +48,6 @@ if st.insert([0, 1, 2], filtration=4.0):
else:
print("Not inserted...")
-# FIXME: Remove this line
-st.set_dimension(3)
print("dimension=", st.dimension())
st.initialize_filtration()
diff --git a/cython/include/Cubical_complex_interface.h b/cython/include/Cubical_complex_interface.h
index 7c0148f1..fad92c2c 100644
--- a/cython/include/Cubical_complex_interface.h
+++ b/cython/include/Cubical_complex_interface.h
@@ -43,6 +43,12 @@ class Cubical_complex_interface : public Bitmap_cubical_complex<CubicalComplexOp
: Bitmap_cubical_complex<CubicalComplexOptions>(dimensions, top_dimensional_cells) {
}
+ Cubical_complex_interface(const std::vector<unsigned>& dimensions,
+ const std::vector<double>& top_dimensional_cells,
+ const std::vector<bool>& periodic_dimensions)
+ : Bitmap_cubical_complex<CubicalComplexOptions>(dimensions, top_dimensional_cells, periodic_dimensions) {
+ }
+
Cubical_complex_interface(const std::string& perseus_file)
: Bitmap_cubical_complex<CubicalComplexOptions>(perseus_file.c_str()) {
}
diff --git a/cython/include/Simplex_tree_interface.h b/cython/include/Simplex_tree_interface.h
index 09e7e992..54a4f824 100644
--- a/cython/include/Simplex_tree_interface.h
+++ b/cython/include/Simplex_tree_interface.h
@@ -52,6 +52,10 @@ class Simplex_tree_interface : public Simplex_tree<SimplexTreeOptions> {
return (Base::find(vh) != Base::null_simplex());
}
+ void assign_simplex_filtration(const Simplex& vh, Filtration_value filtration) {
+ Base::assign_filtration(Base::find(vh), filtration);
+ }
+
bool insert(const Simplex& simplex, Filtration_value filtration = 0) {
Insertion_result result = Base::insert_simplex_and_subfaces(simplex, filtration);
return (result.second);
diff --git a/cython/include/Tangential_complex_interface.h b/cython/include/Tangential_complex_interface.h
index 5e9dc0e4..0c3a510e 100644
--- a/cython/include/Tangential_complex_interface.h
+++ b/cython/include/Tangential_complex_interface.h
@@ -105,9 +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);
- // FIXME
- simplex_tree->set_dimension(max_dim);
+ tangential_complex_->create_complex<Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_full_featured>>(*simplex_tree);
simplex_tree->initialize_filtration();
}
diff --git a/cython/setup.py.in b/cython/setup.py.in
index fefa36bb..c767e93d 100644
--- a/cython/setup.py.in
+++ b/cython/setup.py.in
@@ -23,7 +23,7 @@ from Cython.Build import cythonize
along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
-__author__ = "Vincent Rouvreau"
+__author__ = "GUDHI Editorial Board"
__copyright__ = "Copyright (C) 2016 INRIA"
__license__ = "GPL v3"
@@ -41,7 +41,7 @@ gudhi = Extension(
setup(
name = 'gudhi',
- author='Vincent Rouvreau',
+ author='GUDHI Editorial Board',
author_email='gudhi-contact@lists.gforge.inria.fr',
version='@GUDHI_VERSION@',
url='http://gudhi.gforge.inria.fr/',
diff --git a/cython/test/test_cubical_complex.py b/cython/test/test_cubical_complex.py
index 9a365823..0e81554d 100755
--- a/cython/test/test_cubical_complex.py
+++ b/cython/test/test_cubical_complex.py
@@ -62,17 +62,17 @@ def test_dimension_or_perseus_file_constructor():
assert cub.__is_defined() == False
assert cub.__is_persistence_defined() == False
-def test_dimension_constructor():
+def test_dimension_simple_constructor():
cub = CubicalComplex(dimensions=[3, 3],
top_dimensional_cells = [1,2,3,4,5,6,7,8,9])
assert cub.__is_defined() == True
assert cub.__is_persistence_defined() == False
- assert cub.persistence() == [(1, (0.0, 100.0)), (0, (0.0, float('inf')))]
+ assert cub.persistence() == [(0, (1.0, float('inf')))]
assert cub.__is_persistence_defined() == True
- assert cub.betti_numbers() == [1, 0]
- assert cub.persistent_betti_numbers(0, 1000) == [0, 0]
+ assert cub.betti_numbers() == [1, 0, 0]
+ assert cub.persistent_betti_numbers(0, 1000) == [0, 0, 0]
-def test_dimension_constructor():
+def test_dimension_file_constructor():
# Create test file
test_file = open('CubicalOneSphere.txt', 'w')
test_file.write('2\n3\n3\n0\n0\n0\n0\n100\n0\n0\n0\n0\n')
diff --git a/cython/test/test_simplex_tree.py b/cython/test/test_simplex_tree.py
index 4d452d7d..6dec5d94 100755
--- a/cython/test/test_simplex_tree.py
+++ b/cython/test/test_simplex_tree.py
@@ -34,9 +34,13 @@ def test_insertion():
# insert test
assert st.insert([0, 1]) == True
+
+ assert st.dimension() == 1
+
assert st.insert([0, 1, 2], filtration=4.0) == True
- # FIXME: Remove this line
- st.set_dimension(2)
+
+ assert st.dimension() == 2
+
assert st.num_simplices() == 7
assert st.num_vertices() == 3
@@ -86,8 +90,9 @@ def test_insertion():
assert st.find([2]) == True
st.initialize_filtration()
- assert st.persistence() == [(1, (4.0, float('inf'))), (0, (0.0, float('inf')))]
+ assert st.persistence(persistence_dim_max = True) == [(1, (4.0, float('inf'))), (0, (0.0, float('inf')))]
assert st.__is_persistence_defined() == True
+
assert st.betti_numbers() == [1, 1]
assert st.persistent_betti_numbers(-0.1, 10000.0) == [0, 0]
assert st.persistent_betti_numbers(0.0, 10000.0) == [1, 0]
@@ -129,3 +134,30 @@ def test_expansion():
([1, 2], 0.5), ([0, 1, 2], 0.5), ([1, 2, 3], 0.5), ([5], 0.6), ([6], 0.6),
([5, 6], 0.6), ([4], 0.7), ([2, 4], 0.7), ([0, 3], 0.8), ([0, 1, 3], 0.8),
([0, 2, 3], 0.8), ([0, 1, 2, 3], 0.8), ([4, 6], 0.9), ([3, 6], 1.0)]
+
+def test_automatic_dimension():
+ st = SimplexTree()
+ assert st.__is_defined() == True
+ assert st.__is_persistence_defined() == False
+
+ # insert test
+ assert st.insert([0,1,3], filtration=0.5) == True
+ assert st.insert([0,1,2], filtration=1.) == True
+
+ assert st.num_vertices() == 4
+ assert st.num_simplices() == 11
+
+ assert st.dimension() == 2
+ assert st.upper_bound_dimension() == 2
+
+ assert st.prune_above_filtration(0.6) == True
+ assert st.dimension() == 2
+ assert st.upper_bound_dimension() == 2
+
+ st.assign_filtration([0, 1, 3], 0.7)
+ assert st.filtration([0, 1, 3]) == 0.7
+
+ st.remove_maximal_simplex([0, 1, 3])
+ assert st.upper_bound_dimension() == 2
+ assert st.dimension() == 1
+ assert st.upper_bound_dimension() == 1
diff --git a/data/points/KleinBottle5D.off b/data/points/KleinBottle5D.off
new file mode 100644
index 00000000..b578593c
--- /dev/null
+++ b/data/points/KleinBottle5D.off
@@ -0,0 +1,15879 @@
+nOFF
+5
+15876 0 0
+3 0 0 0 1
+3.05 0 0.09983 0 0.9988
+3.1 0 0.1987 0 0.995
+3.149 0 0.2955 0 0.9888
+3.199 0 0.3894 0 0.9801
+3.247 0 0.4794 0 0.9689
+3.296 0 0.5646 0 0.9553
+3.343 0 0.6442 0 0.9394
+3.389 0 0.7174 0 0.9211
+3.435 0 0.7833 0 0.9004
+3.479 0 0.8415 0 0.8776
+3.523 0 0.8912 0 0.8525
+3.565 0 0.932 0 0.8253
+3.605 0 0.9636 0 0.7961
+3.644 0 0.9854 0 0.7648
+3.682 0 0.9975 0 0.7317
+3.717 0 0.9996 0 0.6967
+3.751 0 0.9917 0 0.66
+3.783 0 0.9738 0 0.6216
+3.813 0 0.9463 0 0.5817
+3.841 0 0.9093 0 0.5403
+3.867 0 0.8632 0 0.4976
+3.891 0 0.8085 0 0.4536
+3.913 0 0.7457 0 0.4085
+3.932 0 0.6755 0 0.3624
+3.949 0 0.5985 0 0.3153
+3.964 0 0.5155 0 0.2675
+3.976 0 0.4274 0 0.219
+3.985 0 0.335 0 0.17
+3.993 0 0.2392 0 0.1205
+3.997 0 0.1411 0 0.07074
+4 0 0.04158 0 0.02079
+4 0 -0.05837 0 -0.0292
+3.997 0 -0.1577 0 -0.07912
+3.992 0 -0.2555 0 -0.1288
+3.984 0 -0.3508 0 -0.1782
+3.974 0 -0.4425 0 -0.2272
+3.961 0 -0.5298 0 -0.2756
+3.946 0 -0.6119 0 -0.3233
+3.929 0 -0.6878 0 -0.3702
+3.909 0 -0.7568 0 -0.4161
+3.887 0 -0.8183 0 -0.4611
+3.863 0 -0.8716 0 -0.5048
+3.837 0 -0.9162 0 -0.5474
+3.808 0 -0.9516 0 -0.5885
+3.778 0 -0.9775 0 -0.6282
+3.746 0 -0.9937 0 -0.6663
+3.711 0 -0.9999 0 -0.7027
+3.675 0 -0.9962 0 -0.7374
+3.638 0 -0.9825 0 -0.7702
+3.598 0 -0.9589 0 -0.8011
+3.558 0 -0.9258 0 -0.8301
+3.516 0 -0.8835 0 -0.8569
+3.472 0 -0.8323 0 -0.8816
+3.427 0 -0.7728 0 -0.9041
+3.382 0 -0.7055 0 -0.9243
+3.335 0 -0.6313 0 -0.9422
+3.287 0 -0.5507 0 -0.9578
+3.239 0 -0.4646 0 -0.971
+3.19 0 -0.3739 0 -0.9817
+3.141 0 -0.2794 0 -0.99
+3.091 0 -0.1822 0 -0.9958
+3.042 0 -0.08309 0 -0.9991
+2.992 0 0.01681 0 -1
+2.942 0 0.1165 0 -0.9983
+2.892 0 0.2151 0 -0.9941
+2.842 0 0.3115 0 -0.9875
+2.793 0 0.4048 0 -0.9784
+2.744 0 0.4941 0 -0.9668
+2.696 0 0.5784 0 -0.9528
+2.649 0 0.657 0 -0.9365
+2.603 0 0.729 0 -0.9178
+2.557 0 0.7937 0 -0.8968
+2.513 0 0.8504 0 -0.8735
+2.47 0 0.8987 0 -0.8481
+2.428 0 0.938 0 -0.8206
+2.388 0 0.9679 0 -0.791
+2.349 0 0.9882 0 -0.7594
+2.312 0 0.9985 0 -0.7259
+2.277 0 0.9989 0 -0.6907
+2.243 0 0.9894 0 -0.6536
+2.211 0 0.9699 0 -0.615
+2.182 0 0.9407 0 -0.5748
+2.154 0 0.9022 0 -0.5332
+2.128 0 0.8546 0 -0.4903
+2.105 0 0.7985 0 -0.4461
+2.084 0 0.7344 0 -0.4008
+2.065 0 0.663 0 -0.3545
+2.048 0 0.5849 0 -0.3073
+2.034 0 0.501 0 -0.2594
+2.022 0 0.4121 0 -0.2108
+2.013 0 0.3191 0 -0.1617
+2.006 0 0.2229 0 -0.1122
+2.002 0 0.1245 0 -0.06235
+2 0 0.02478 0 -0.01239
+2.001 0 -0.07515 0 0.0376
+2.004 0 -0.1743 0 0.0875
+2.009 0 -0.2718 0 0.1372
+2.018 0 -0.3665 0 0.1865
+2.028 0 -0.4575 0 0.2354
+2.041 0 -0.544 0 0.2837
+2.056 0 -0.6251 0 0.3312
+2.074 0 -0.6999 0 0.378
+2.094 0 -0.7677 0 0.4238
+2.117 0 -0.8278 0 0.4685
+2.141 0 -0.8797 0 0.5121
+2.168 0 -0.9228 0 0.5544
+2.196 0 -0.9566 0 0.5953
+2.227 0 -0.9809 0 0.6347
+2.26 0 -0.9954 0 0.6725
+2.294 0 -1 0 0.7087
+2.331 0 -0.9946 0 0.743
+2.369 0 -0.9792 0 0.7756
+2.408 0 -0.954 0 0.8061
+2.449 0 -0.9193 0 0.8347
+2.492 0 -0.8755 0 0.8612
+2.535 0 -0.8228 0 0.8855
+2.58 0 -0.762 0 0.9076
+2.626 0 -0.6935 0 0.9275
+2.673 0 -0.6181 0 0.945
+2.721 0 -0.5366 0 0.9602
+2.769 0 -0.4496 0 0.9729
+2.818 0 -0.3582 0 0.9833
+2.867 0 -0.2632 0 0.9911
+2.917 0 -0.1656 0 0.9965
+2.967 0 -0.06632 0 0.9994
+2.996 0.1499 0 0.04998 1
+3.044 0.1523 0.1011 0.04998 0.9988
+3.091 0.1547 0.2011 0.04998 0.995
+3.138 0.157 0.2992 0.04998 0.9888
+3.185 0.1594 0.3943 0.04998 0.9801
+3.231 0.1617 0.4855 0.04998 0.9689
+3.277 0.164 0.5719 0.04998 0.9553
+3.323 0.1663 0.6526 0.04998 0.9394
+3.367 0.1685 0.7269 0.04998 0.9211
+3.411 0.1707 0.794 0.04998 0.9004
+3.454 0.1728 0.8532 0.04998 0.8776
+3.496 0.1749 0.904 0.04998 0.8525
+3.537 0.177 0.9459 0.04998 0.8253
+3.576 0.179 0.9784 0.04998 0.7961
+3.615 0.1809 1.001 0.04998 0.7648
+3.652 0.1827 1.014 0.04998 0.7317
+3.688 0.1845 1.017 0.04998 0.6967
+3.722 0.1862 1.01 0.04998 0.66
+3.754 0.1879 0.9931 0.04998 0.6216
+3.785 0.1894 0.9663 0.04998 0.5817
+3.814 0.1908 0.93 0.04998 0.5403
+3.841 0.1922 0.8846 0.04998 0.4976
+3.866 0.1935 0.8305 0.04998 0.4536
+3.889 0.1946 0.7683 0.04998 0.4085
+3.91 0.1957 0.6986 0.04998 0.3624
+3.929 0.1966 0.622 0.04998 0.3153
+3.945 0.1974 0.5394 0.04998 0.2675
+3.96 0.1982 0.4516 0.04998 0.219
+3.972 0.1988 0.3595 0.04998 0.17
+3.981 0.1992 0.264 0.04998 0.1205
+3.989 0.1996 0.166 0.04998 0.07074
+3.993 0.1998 0.06656 0.04998 0.02079
+3.996 0.2 -0.03337 0.04998 -0.0292
+3.995 0.1999 -0.1328 0.04998 -0.07912
+3.993 0.1998 -0.2307 0.04998 -0.1288
+3.987 0.1995 -0.3261 0.04998 -0.1782
+3.98 0.1991 -0.418 0.04998 -0.2272
+3.969 0.1986 -0.5056 0.04998 -0.2756
+3.956 0.198 -0.588 0.04998 -0.3233
+3.941 0.1972 -0.6643 0.04998 -0.3702
+3.923 0.1963 -0.7338 0.04998 -0.4161
+3.903 0.1953 -0.7958 0.04998 -0.4611
+3.88 0.1942 -0.8497 0.04998 -0.5048
+3.855 0.1929 -0.895 0.04998 -0.5474
+3.827 0.1915 -0.9311 0.04998 -0.5885
+3.798 0.19 -0.9578 0.04998 -0.6282
+3.766 0.1884 -0.9747 0.04998 -0.6663
+3.732 0.1867 -0.9818 0.04998 -0.7027
+3.696 0.1849 -0.979 0.04998 -0.7374
+3.658 0.183 -0.9662 0.04998 -0.7702
+3.618 0.181 -0.9437 0.04998 -0.8011
+3.576 0.179 -0.9116 0.04998 -0.8301
+3.533 0.1768 -0.8703 0.04998 -0.8569
+3.488 0.1746 -0.8202 0.04998 -0.8816
+3.442 0.1723 -0.7618 0.04998 -0.9041
+3.395 0.1699 -0.6958 0.04998 -0.9243
+3.346 0.1675 -0.6227 0.04998 -0.9422
+3.297 0.165 -0.5433 0.04998 -0.9578
+3.247 0.1625 -0.4585 0.04998 -0.971
+3.196 0.1599 -0.369 0.04998 -0.9817
+3.144 0.1573 -0.2758 0.04998 -0.99
+3.092 0.1547 -0.1798 0.04998 -0.9958
+3.04 0.1521 -0.08202 0.04998 -0.9991
+2.987 0.1495 0.0166 0.04998 -1
+2.935 0.1469 0.1151 0.04998 -0.9983
+2.883 0.1443 0.2123 0.04998 -0.9941
+2.831 0.1417 0.3075 0.04998 -0.9875
+2.78 0.1391 0.3996 0.04998 -0.9784
+2.729 0.1366 0.4876 0.04998 -0.9668
+2.679 0.134 0.5707 0.04998 -0.9528
+2.63 0.1316 0.648 0.04998 -0.9365
+2.582 0.1292 0.7188 0.04998 -0.9178
+2.535 0.1268 0.7824 0.04998 -0.8968
+2.489 0.1246 0.838 0.04998 -0.8735
+2.445 0.1223 0.8852 0.04998 -0.8481
+2.402 0.1202 0.9234 0.04998 -0.8206
+2.361 0.1182 0.9523 0.04998 -0.791
+2.322 0.1162 0.9716 0.04998 -0.7594
+2.285 0.1143 0.981 0.04998 -0.7259
+2.249 0.1126 0.9806 0.04998 -0.6907
+2.216 0.1109 0.9701 0.04998 -0.6536
+2.185 0.1093 0.9499 0.04998 -0.615
+2.156 0.1079 0.92 0.04998 -0.5748
+2.129 0.1065 0.8807 0.04998 -0.5332
+2.105 0.1053 0.8325 0.04998 -0.4903
+2.083 0.1042 0.7759 0.04998 -0.4461
+2.063 0.1032 0.7113 0.04998 -0.4008
+2.046 0.1024 0.6394 0.04998 -0.3545
+2.032 0.1017 0.5609 0.04998 -0.3073
+2.019 0.1011 0.4767 0.04998 -0.2594
+2.01 0.1006 0.3876 0.04998 -0.2108
+2.003 0.1002 0.2943 0.04998 -0.1617
+1.999 0.1 0.198 0.04998 -0.1122
+1.997 0.09992 0.09947 0.04998 -0.06235
+1.997 0.09995 -0.0002278 0.04998 -0.01239
+2 0.1001 -0.1001 0.04998 0.0376
+2.006 0.1004 -0.1992 0.04998 0.0875
+2.014 0.1008 -0.2964 0.04998 0.1372
+2.024 0.1013 -0.3909 0.04998 0.1865
+2.037 0.1019 -0.4817 0.04998 0.2354
+2.052 0.1027 -0.5678 0.04998 0.2837
+2.07 0.1036 -0.6485 0.04998 0.3312
+2.089 0.1046 -0.7228 0.04998 0.378
+2.111 0.1056 -0.7901 0.04998 0.4238
+2.135 0.1068 -0.8497 0.04998 0.4685
+2.161 0.1081 -0.9009 0.04998 0.5121
+2.188 0.1095 -0.9433 0.04998 0.5544
+2.218 0.111 -0.9764 0.04998 0.5953
+2.249 0.1126 -0.9999 0.04998 0.6347
+2.282 0.1142 -1.014 0.04998 0.6725
+2.317 0.1159 -1.017 0.04998 0.7087
+2.353 0.1177 -1.011 0.04998 0.743
+2.39 0.1196 -0.9947 0.04998 0.7756
+2.429 0.1216 -0.9685 0.04998 0.8061
+2.469 0.1236 -0.9328 0.04998 0.8347
+2.511 0.1256 -0.8879 0.04998 0.8612
+2.553 0.1278 -0.8342 0.04998 0.8855
+2.596 0.1299 -0.7722 0.04998 0.9076
+2.64 0.1321 -0.7027 0.04998 0.9275
+2.685 0.1344 -0.6261 0.04998 0.945
+2.731 0.1366 -0.5434 0.04998 0.9602
+2.777 0.139 -0.4553 0.04998 0.9729
+2.823 0.1413 -0.3627 0.04998 0.9833
+2.87 0.1436 -0.2665 0.04998 0.9911
+2.917 0.146 -0.1676 0.04998 0.9965
+2.965 0.1484 -0.06713 0.04998 0.9994
+2.985 0.2995 0 0.09983 1
+3.03 0.304 0.1022 0.09983 0.9988
+3.074 0.3085 0.2034 0.09983 0.995
+3.119 0.3129 0.3026 0.09983 0.9888
+3.163 0.3174 0.3989 0.09983 0.9801
+3.207 0.3218 0.4912 0.09983 0.9689
+3.251 0.3261 0.5787 0.09983 0.9553
+3.294 0.3305 0.6606 0.09983 0.9394
+3.336 0.3347 0.7359 0.09983 0.9211
+3.378 0.339 0.8041 0.09983 0.9004
+3.42 0.3431 0.8644 0.09983 0.8776
+3.46 0.3472 0.9162 0.09983 0.8525
+3.5 0.3511 0.9591 0.09983 0.8253
+3.539 0.355 0.9926 0.09983 0.7961
+3.576 0.3588 1.016 0.09983 0.7648
+3.613 0.3625 1.03 0.09983 0.7317
+3.648 0.366 1.034 0.09983 0.6967
+3.682 0.3695 1.028 0.09983 0.66
+3.715 0.3727 1.012 0.09983 0.6216
+3.746 0.3759 0.9858 0.09983 0.5817
+3.776 0.3789 0.9502 0.09983 0.5403
+3.804 0.3817 0.9055 0.09983 0.4976
+3.83 0.3843 0.852 0.09983 0.4536
+3.855 0.3868 0.7904 0.09983 0.4085
+3.878 0.3891 0.7212 0.09983 0.3624
+3.898 0.3911 0.6452 0.09983 0.3153
+3.917 0.393 0.563 0.09983 0.2675
+3.933 0.3947 0.4756 0.09983 0.219
+3.948 0.3961 0.3838 0.09983 0.17
+3.96 0.3973 0.2886 0.09983 0.1205
+3.969 0.3983 0.1908 0.09983 0.07074
+3.976 0.399 0.0915 0.09983 0.02079
+3.981 0.3995 -0.008343 0.09983 -0.0292
+3.984 0.3997 -0.1077 0.09983 -0.07912
+3.983 0.3997 -0.2057 0.09983 -0.1288
+3.98 0.3994 -0.3012 0.09983 -0.1782
+3.975 0.3988 -0.3933 0.09983 -0.2272
+3.967 0.398 -0.4811 0.09983 -0.2756
+3.956 0.3969 -0.5638 0.09983 -0.3233
+3.942 0.3956 -0.6405 0.09983 -0.3702
+3.926 0.3939 -0.7104 0.09983 -0.4161
+3.908 0.3921 -0.7729 0.09983 -0.4611
+3.886 0.3899 -0.8273 0.09983 -0.5048
+3.862 0.3875 -0.8732 0.09983 -0.5474
+3.836 0.3849 -0.91 0.09983 -0.5885
+3.807 0.382 -0.9374 0.09983 -0.6282
+3.775 0.3788 -0.9552 0.09983 -0.6663
+3.742 0.3754 -0.9631 0.09983 -0.7027
+3.706 0.3718 -0.9612 0.09983 -0.7374
+3.668 0.368 -0.9493 0.09983 -0.7702
+3.627 0.364 -0.9278 0.09983 -0.8011
+3.585 0.3597 -0.8968 0.09983 -0.8301
+3.541 0.3553 -0.8566 0.09983 -0.8569
+3.495 0.3507 -0.8076 0.09983 -0.8816
+3.448 0.346 -0.7504 0.09983 -0.9041
+3.399 0.3411 -0.6856 0.09983 -0.9243
+3.349 0.3361 -0.6137 0.09983 -0.9422
+3.298 0.3309 -0.5356 0.09983 -0.9578
+3.246 0.3257 -0.4521 0.09983 -0.971
+3.193 0.3204 -0.3639 0.09983 -0.9817
+3.139 0.315 -0.272 0.09983 -0.99
+3.085 0.3095 -0.1774 0.09983 -0.9958
+3.03 0.3041 -0.08091 0.09983 -0.9991
+2.976 0.2986 0.01637 0.09983 -1
+2.921 0.2931 0.1135 0.09983 -0.9983
+2.867 0.2876 0.2094 0.09983 -0.9941
+2.813 0.2822 0.3033 0.09983 -0.9875
+2.759 0.2769 0.394 0.09983 -0.9784
+2.706 0.2716 0.4807 0.09983 -0.9668
+2.655 0.2663 0.5625 0.09983 -0.9528
+2.604 0.2612 0.6386 0.09983 -0.9365
+2.554 0.2563 0.7082 0.09983 -0.9178
+2.506 0.2514 0.7706 0.09983 -0.8968
+2.459 0.2467 0.825 0.09983 -0.8735
+2.414 0.2422 0.8711 0.09983 -0.8481
+2.37 0.2378 0.9083 0.09983 -0.8206
+2.329 0.2337 0.9361 0.09983 -0.791
+2.289 0.2297 0.9544 0.09983 -0.7594
+2.252 0.2259 0.9629 0.09983 -0.7259
+2.217 0.2224 0.9615 0.09983 -0.6907
+2.184 0.2191 0.9503 0.09983 -0.6536
+2.153 0.216 0.9293 0.09983 -0.615
+2.125 0.2132 0.8987 0.09983 -0.5748
+2.099 0.2106 0.8588 0.09983 -0.5332
+2.076 0.2083 0.81 0.09983 -0.4903
+2.056 0.2063 0.7528 0.09983 -0.4461
+2.038 0.2045 0.6877 0.09983 -0.4008
+2.023 0.203 0.6154 0.09983 -0.3545
+2.01 0.2017 0.5366 0.09983 -0.3073
+2 0.2007 0.4521 0.09983 -0.2594
+1.993 0.2 0.3627 0.09983 -0.2108
+1.988 0.1995 0.2694 0.09983 -0.1617
+1.986 0.1993 0.1729 0.09983 -0.1122
+1.987 0.1994 0.07442 0.09983 -0.06235
+1.99 0.1997 -0.02523 0.09983 -0.01239
+1.996 0.2002 -0.125 0.09983 0.0376
+2.004 0.201 -0.2239 0.09983 0.0875
+2.014 0.2021 -0.3209 0.09983 0.1372
+2.027 0.2034 -0.4151 0.09983 0.1865
+2.042 0.2049 -0.5055 0.09983 0.2354
+2.059 0.2066 -0.5913 0.09983 0.2837
+2.078 0.2085 -0.6714 0.09983 0.3312
+2.1 0.2107 -0.7453 0.09983 0.378
+2.123 0.213 -0.812 0.09983 0.4238
+2.148 0.2155 -0.8709 0.09983 0.4685
+2.175 0.2182 -0.9215 0.09983 0.5121
+2.204 0.2211 -0.9632 0.09983 0.5544
+2.234 0.2242 -0.9956 0.09983 0.5953
+2.266 0.2273 -1.018 0.09983 0.6347
+2.299 0.2307 -1.031 0.09983 0.6725
+2.334 0.2341 -1.034 0.09983 0.7087
+2.369 0.2377 -1.027 0.09983 0.743
+2.406 0.2414 -1.01 0.09983 0.7756
+2.444 0.2453 -0.9824 0.09983 0.8061
+2.483 0.2492 -0.9457 0.09983 0.8347
+2.523 0.2532 -0.8998 0.09983 0.8612
+2.564 0.2573 -0.845 0.09983 0.8855
+2.606 0.2614 -0.782 0.09983 0.9076
+2.648 0.2657 -0.7113 0.09983 0.9275
+2.691 0.27 -0.6337 0.09983 0.945
+2.734 0.2743 -0.5499 0.09983 0.9602
+2.778 0.2787 -0.4606 0.09983 0.9729
+2.822 0.2831 -0.3669 0.09983 0.9833
+2.866 0.2876 -0.2695 0.09983 0.9911
+2.911 0.292 -0.1695 0.09983 0.9965
+2.955 0.2965 -0.0679 0.09983 0.9994
+2.966 0.4483 0 0.1494 1
+3.008 0.4546 0.1033 0.1494 0.9988
+3.05 0.461 0.2056 0.1494 0.995
+3.092 0.4673 0.3059 0.1494 0.9888
+3.133 0.4736 0.4032 0.1494 0.9801
+3.175 0.4798 0.4966 0.1494 0.9689
+3.216 0.486 0.5852 0.1494 0.9553
+3.257 0.4922 0.6681 0.1494 0.9394
+3.297 0.4983 0.7445 0.1494 0.9211
+3.337 0.5044 0.8137 0.1494 0.9004
+3.377 0.5103 0.875 0.1494 0.8776
+3.416 0.5162 0.9279 0.1494 0.8525
+3.454 0.522 0.9717 0.1494 0.8253
+3.492 0.5277 1.006 0.1494 0.7961
+3.528 0.5333 1.031 0.1494 0.7648
+3.565 0.5387 1.046 0.1494 0.7317
+3.6 0.544 1.051 0.1494 0.6967
+3.634 0.5492 1.045 0.1494 0.66
+3.667 0.5541 1.03 0.1494 0.6216
+3.698 0.5589 1.005 0.1494 0.5817
+3.729 0.5635 0.9698 0.1494 0.5403
+3.758 0.5679 0.9258 0.1494 0.4976
+3.785 0.5721 0.873 0.1494 0.4536
+3.811 0.576 0.812 0.1494 0.4085
+3.835 0.5796 0.7434 0.1494 0.3624
+3.858 0.583 0.6679 0.1494 0.3153
+3.878 0.5861 0.5863 0.1494 0.2675
+3.897 0.5889 0.4993 0.1494 0.219
+3.913 0.5914 0.4079 0.1494 0.17
+3.927 0.5936 0.313 0.1494 0.1205
+3.939 0.5954 0.2155 0.1494 0.07074
+3.949 0.5968 0.1164 0.1494 0.02079
+3.956 0.5979 0.01669 0.1494 -0.0292
+3.961 0.5986 -0.08261 0.1494 -0.07912
+3.963 0.599 -0.1805 0.1494 -0.1288
+3.963 0.5989 -0.2761 0.1494 -0.1782
+3.959 0.5984 -0.3683 0.1494 -0.2272
+3.953 0.5975 -0.4563 0.1494 -0.2756
+3.945 0.5962 -0.5392 0.1494 -0.3233
+3.933 0.5944 -0.6162 0.1494 -0.3702
+3.919 0.5923 -0.6865 0.1494 -0.4161
+3.902 0.5897 -0.7495 0.1494 -0.4611
+3.882 0.5867 -0.8044 0.1494 -0.5048
+3.859 0.5833 -0.8509 0.1494 -0.5474
+3.834 0.5795 -0.8883 0.1494 -0.5885
+3.806 0.5752 -0.9165 0.1494 -0.6282
+3.775 0.5706 -0.935 0.1494 -0.6663
+3.742 0.5655 -0.9438 0.1494 -0.7027
+3.706 0.5601 -0.9428 0.1494 -0.7374
+3.668 0.5544 -0.9319 0.1494 -0.7702
+3.627 0.5482 -0.9114 0.1494 -0.8011
+3.585 0.5418 -0.8814 0.1494 -0.8301
+3.54 0.535 -0.8423 0.1494 -0.8569
+3.493 0.528 -0.7946 0.1494 -0.8816
+3.445 0.5207 -0.7386 0.1494 -0.9041
+3.395 0.5131 -0.675 0.1494 -0.9243
+3.343 0.5053 -0.6044 0.1494 -0.9422
+3.291 0.4973 -0.5276 0.1494 -0.9578
+3.237 0.4892 -0.4454 0.1494 -0.971
+3.182 0.4809 -0.3586 0.1494 -0.9817
+3.126 0.4725 -0.2681 0.1494 -0.99
+3.07 0.464 -0.1748 0.1494 -0.9958
+3.013 0.4554 -0.07974 0.1494 -0.9991
+2.957 0.4469 0.01614 0.1494 -1
+2.9 0.4383 0.1118 0.1494 -0.9983
+2.844 0.4298 0.2064 0.1494 -0.9941
+2.788 0.4213 0.2988 0.1494 -0.9875
+2.732 0.4129 0.3882 0.1494 -0.9784
+2.678 0.4047 0.4736 0.1494 -0.9668
+2.624 0.3966 0.5541 0.1494 -0.9528
+2.572 0.3887 0.6289 0.1494 -0.9365
+2.521 0.381 0.6972 0.1494 -0.9178
+2.471 0.3735 0.7583 0.1494 -0.8968
+2.423 0.3663 0.8116 0.1494 -0.8735
+2.377 0.3593 0.8565 0.1494 -0.8481
+2.333 0.3526 0.8925 0.1494 -0.8206
+2.291 0.3463 0.9194 0.1494 -0.791
+2.252 0.3403 0.9366 0.1494 -0.7594
+2.214 0.3346 0.9442 0.1494 -0.7259
+2.179 0.3294 0.9419 0.1494 -0.6907
+2.147 0.3245 0.9299 0.1494 -0.6536
+2.117 0.3199 0.9081 0.1494 -0.615
+2.09 0.3158 0.8768 0.1494 -0.5748
+2.065 0.3121 0.8362 0.1494 -0.5332
+2.044 0.3089 0.7869 0.1494 -0.4903
+2.025 0.306 0.7292 0.1494 -0.4461
+2.009 0.3036 0.6637 0.1494 -0.4008
+1.995 0.3016 0.591 0.1494 -0.3545
+1.985 0.3 0.512 0.1494 -0.3073
+1.977 0.2988 0.4272 0.1494 -0.2594
+1.972 0.298 0.3377 0.1494 -0.2108
+1.97 0.2977 0.2443 0.1494 -0.1617
+1.97 0.2977 0.1478 0.1494 -0.1122
+1.973 0.2982 0.04932 0.1494 -0.06235
+1.979 0.299 -0.05022 0.1494 -0.01239
+1.987 0.3002 -0.1498 0.1494 0.0376
+1.997 0.3018 -0.2485 0.1494 0.0875
+2.01 0.3037 -0.3452 0.1494 0.1372
+2.025 0.306 -0.4391 0.1494 0.1865
+2.042 0.3086 -0.5291 0.1494 0.2354
+2.061 0.3115 -0.6143 0.1494 0.2837
+2.082 0.3147 -0.694 0.1494 0.3312
+2.105 0.3182 -0.7673 0.1494 0.378
+2.13 0.3219 -0.8334 0.1494 0.4238
+2.157 0.3259 -0.8917 0.1494 0.4685
+2.185 0.3302 -0.9416 0.1494 0.5121
+2.214 0.3346 -0.9825 0.1494 0.5544
+2.245 0.3393 -1.014 0.1494 0.5953
+2.277 0.3441 -1.036 0.1494 0.6347
+2.31 0.3492 -1.048 0.1494 0.6725
+2.345 0.3544 -1.05 0.1494 0.7087
+2.38 0.3597 -1.042 0.1494 0.743
+2.416 0.3652 -1.024 0.1494 0.7756
+2.454 0.3708 -0.9957 0.1494 0.8061
+2.491 0.3765 -0.958 0.1494 0.8347
+2.53 0.3824 -0.9111 0.1494 0.8612
+2.569 0.3883 -0.8553 0.1494 0.8855
+2.609 0.3943 -0.7913 0.1494 0.9076
+2.649 0.4004 -0.7196 0.1494 0.9275
+2.69 0.4065 -0.6409 0.1494 0.945
+2.731 0.4127 -0.556 0.1494 0.9602
+2.772 0.4189 -0.4657 0.1494 0.9729
+2.813 0.4252 -0.3709 0.1494 0.9833
+2.855 0.4315 -0.2724 0.1494 0.9911
+2.897 0.4378 -0.1714 0.1494 0.9965
+2.939 0.4441 -0.06862 0.1494 0.9994
+2.94 0.596 0 0.1987 1
+2.979 0.6039 0.1043 0.1987 0.9988
+3.018 0.6118 0.2076 0.1987 0.995
+3.057 0.6197 0.309 0.1987 0.9888
+3.096 0.6276 0.4073 0.1987 0.9801
+3.135 0.6354 0.5017 0.1987 0.9689
+3.173 0.6432 0.5913 0.1987 0.9553
+3.212 0.651 0.6752 0.1987 0.9394
+3.25 0.6588 0.7526 0.1987 0.9211
+3.288 0.6665 0.8228 0.1987 0.9004
+3.325 0.6741 0.8851 0.1987 0.8776
+3.363 0.6817 0.9389 0.1987 0.8525
+3.4 0.6891 0.9838 0.1987 0.8253
+3.436 0.6965 1.019 0.1987 0.7961
+3.472 0.7038 1.045 0.1987 0.7648
+3.507 0.711 1.061 0.1987 0.7317
+3.542 0.718 1.066 0.1987 0.6967
+3.576 0.7249 1.062 0.1987 0.66
+3.609 0.7315 1.047 0.1987 0.6216
+3.641 0.738 1.023 0.1987 0.5817
+3.672 0.7443 0.9888 0.1987 0.5403
+3.702 0.7504 0.9455 0.1987 0.4976
+3.73 0.7561 0.8934 0.1987 0.4536
+3.757 0.7617 0.8331 0.1987 0.4085
+3.783 0.7669 0.7651 0.1987 0.3624
+3.807 0.7717 0.6902 0.1987 0.3153
+3.829 0.7763 0.6091 0.1987 0.2675
+3.85 0.7804 0.5227 0.1987 0.219
+3.868 0.7842 0.4317 0.1987 0.17
+3.885 0.7875 0.3372 0.1987 0.1205
+3.899 0.7904 0.24 0.1987 0.07074
+3.911 0.7928 0.1412 0.1987 0.02079
+3.921 0.7948 0.04171 0.1987 -0.0292
+3.928 0.7962 -0.05744 0.1987 -0.07912
+3.932 0.7971 -0.1553 0.1987 -0.1288
+3.934 0.7975 -0.2508 0.1987 -0.1782
+3.933 0.7973 -0.3431 0.1987 -0.2272
+3.929 0.7965 -0.4312 0.1987 -0.2756
+3.923 0.7952 -0.5143 0.1987 -0.3233
+3.913 0.7933 -0.5916 0.1987 -0.3702
+3.901 0.7908 -0.6622 0.1987 -0.4161
+3.886 0.7876 -0.7256 0.1987 -0.4611
+3.867 0.7839 -0.781 0.1987 -0.5048
+3.846 0.7796 -0.828 0.1987 -0.5474
+3.822 0.7747 -0.8661 0.1987 -0.5885
+3.795 0.7692 -0.895 0.1987 -0.6282
+3.765 0.7631 -0.9143 0.1987 -0.6663
+3.732 0.7565 -0.9239 0.1987 -0.7027
+3.696 0.7493 -0.9238 0.1987 -0.7374
+3.658 0.7416 -0.9139 0.1987 -0.7702
+3.618 0.7333 -0.8944 0.1987 -0.8011
+3.575 0.7246 -0.8655 0.1987 -0.8301
+3.529 0.7154 -0.8276 0.1987 -0.8569
+3.482 0.7058 -0.781 0.1987 -0.8816
+3.433 0.6958 -0.7262 0.1987 -0.9041
+3.381 0.6854 -0.6639 0.1987 -0.9243
+3.329 0.6747 -0.5947 0.1987 -0.9422
+3.274 0.6638 -0.5192 0.1987 -0.9578
+3.219 0.6525 -0.4384 0.1987 -0.971
+3.162 0.6411 -0.353 0.1987 -0.9817
+3.105 0.6294 -0.2639 0.1987 -0.99
+3.047 0.6177 -0.1721 0.1987 -0.9958
+2.989 0.6059 -0.07852 0.1987 -0.9991
+2.93 0.594 0.01589 0.1987 -1
+2.872 0.5822 0.1101 0.1987 -0.9983
+2.814 0.5704 0.2032 0.1987 -0.9941
+2.756 0.5586 0.2942 0.1987 -0.9875
+2.699 0.5471 0.3822 0.1987 -0.9784
+2.643 0.5357 0.4661 0.1987 -0.9668
+2.588 0.5245 0.5452 0.1987 -0.9528
+2.534 0.5136 0.6187 0.1987 -0.9365
+2.482 0.503 0.6857 0.1987 -0.9178
+2.431 0.4928 0.7455 0.1987 -0.8968
+2.382 0.4829 0.7976 0.1987 -0.8735
+2.336 0.4734 0.8413 0.1987 -0.8481
+2.291 0.4644 0.8763 0.1987 -0.8206
+2.249 0.4559 0.902 0.1987 -0.791
+2.209 0.4478 0.9183 0.1987 -0.7594
+2.172 0.4402 0.9249 0.1987 -0.7259
+2.137 0.4332 0.9218 0.1987 -0.6907
+2.105 0.4268 0.9089 0.1987 -0.6536
+2.076 0.4209 0.8863 0.1987 -0.615
+2.05 0.4156 0.8543 0.1987 -0.5748
+2.027 0.4109 0.8132 0.1987 -0.5332
+2.007 0.4068 0.7633 0.1987 -0.4903
+1.989 0.4033 0.7051 0.1987 -0.4461
+1.975 0.4003 0.6393 0.1987 -0.4008
+1.963 0.398 0.5663 0.1987 -0.3545
+1.955 0.3963 0.487 0.1987 -0.3073
+1.949 0.3952 0.4021 0.1987 -0.2594
+1.947 0.3946 0.3125 0.1987 -0.2108
+1.947 0.3946 0.219 0.1987 -0.1617
+1.949 0.3952 0.1226 0.1987 -0.1122
+1.955 0.3962 0.02419 0.1987 -0.06235
+1.963 0.3979 -0.07517 0.1987 -0.01239
+1.973 0.4 -0.1745 0.1987 0.0376
+1.986 0.4025 -0.2729 0.1987 0.0875
+2.001 0.4056 -0.3693 0.1987 0.1372
+2.018 0.4091 -0.4627 0.1987 0.1865
+2.037 0.413 -0.5523 0.1987 0.2354
+2.058 0.4172 -0.637 0.1987 0.2837
+2.081 0.4219 -0.7161 0.1987 0.3312
+2.106 0.4269 -0.7888 0.1987 0.378
+2.132 0.4322 -0.8543 0.1987 0.4238
+2.16 0.4378 -0.9119 0.1987 0.4685
+2.189 0.4437 -0.9611 0.1987 0.5121
+2.219 0.4498 -1.001 0.1987 0.5544
+2.25 0.4561 -1.032 0.1987 0.5953
+2.283 0.4627 -1.053 0.1987 0.6347
+2.316 0.4695 -1.064 0.1987 0.6725
+2.35 0.4764 -1.065 0.1987 0.7087
+2.385 0.4834 -1.056 0.1987 0.743
+2.42 0.4906 -1.037 0.1987 0.7756
+2.457 0.498 -1.008 0.1987 0.8061
+2.493 0.5054 -0.9697 0.1987 0.8347
+2.53 0.5129 -0.9218 0.1987 0.8612
+2.568 0.5205 -0.8651 0.1987 0.8855
+2.605 0.5281 -0.8001 0.1987 0.9076
+2.643 0.5359 -0.7274 0.1987 0.9275
+2.682 0.5436 -0.6477 0.1987 0.945
+2.72 0.5514 -0.5618 0.1987 0.9602
+2.759 0.5592 -0.4705 0.1987 0.9729
+2.798 0.5671 -0.3746 0.1987 0.9833
+2.836 0.575 -0.2752 0.1987 0.9911
+2.875 0.5829 -0.1731 0.1987 0.9965
+2.914 0.5908 -0.0693 0.1987 0.9994
+2.907 0.7422 0 0.2474 1
+2.943 0.7514 0.1053 0.2474 0.9988
+2.979 0.7606 0.2096 0.2474 0.995
+3.015 0.7698 0.3118 0.2474 0.9888
+3.051 0.779 0.4111 0.2474 0.9801
+3.087 0.7882 0.5065 0.2474 0.9689
+3.123 0.7973 0.5971 0.2474 0.9553
+3.159 0.8065 0.6819 0.2474 0.9394
+3.194 0.8157 0.7603 0.2474 0.9211
+3.23 0.8248 0.8314 0.2474 0.9004
+3.266 0.8339 0.8947 0.2474 0.8776
+3.302 0.843 0.9494 0.2474 0.8525
+3.337 0.8521 0.9952 0.2474 0.8253
+3.372 0.861 1.031 0.2474 0.7961
+3.407 0.87 1.058 0.2474 0.7648
+3.442 0.8788 1.075 0.2474 0.7317
+3.476 0.8875 1.081 0.2474 0.6967
+3.509 0.896 1.078 0.2474 0.66
+3.542 0.9045 1.064 0.2474 0.6216
+3.574 0.9127 1.04 0.2474 0.5817
+3.606 0.9207 1.007 0.2474 0.5403
+3.636 0.9285 0.9646 0.2474 0.4976
+3.666 0.936 0.9133 0.2474 0.4536
+3.694 0.9433 0.8537 0.2474 0.4085
+3.721 0.9502 0.7864 0.2474 0.3624
+3.747 0.9567 0.7121 0.2474 0.3153
+3.771 0.9628 0.6316 0.2474 0.2675
+3.793 0.9685 0.5457 0.2474 0.219
+3.814 0.9738 0.4552 0.2474 0.17
+3.832 0.9785 0.3611 0.2474 0.1205
+3.849 0.9827 0.2644 0.2474 0.07074
+3.863 0.9863 0.1659 0.2474 0.02079
+3.875 0.9894 0.0667 0.2474 -0.0292
+3.884 0.9918 -0.03223 0.2474 -0.07912
+3.891 0.9935 -0.1299 0.2474 -0.1288
+3.895 0.9946 -0.2254 0.2474 -0.1782
+3.896 0.9949 -0.3177 0.2474 -0.2272
+3.895 0.9945 -0.4059 0.2474 -0.2756
+3.89 0.9934 -0.4891 0.2474 -0.3233
+3.883 0.9915 -0.5666 0.2474 -0.3702
+3.872 0.9888 -0.6375 0.2474 -0.4161
+3.859 0.9853 -0.7013 0.2474 -0.4611
+3.842 0.981 -0.7572 0.2474 -0.5048
+3.822 0.9759 -0.8047 0.2474 -0.5474
+3.799 0.97 -0.8434 0.2474 -0.5885
+3.773 0.9634 -0.8729 0.2474 -0.6282
+3.744 0.9559 -0.893 0.2474 -0.6663
+3.712 0.9477 -0.9034 0.2474 -0.7027
+3.676 0.9387 -0.9042 0.2474 -0.7374
+3.639 0.9291 -0.8953 0.2474 -0.7702
+3.598 0.9187 -0.8768 0.2474 -0.8011
+3.555 0.9077 -0.8491 0.2474 -0.8301
+3.509 0.896 -0.8123 0.2474 -0.8569
+3.461 0.8838 -0.7669 0.2474 -0.8816
+3.411 0.871 -0.7135 0.2474 -0.9041
+3.359 0.8577 -0.6525 0.2474 -0.9243
+3.305 0.8439 -0.5846 0.2474 -0.9422
+3.25 0.8298 -0.5105 0.2474 -0.9578
+3.193 0.8153 -0.4311 0.2474 -0.971
+3.135 0.8005 -0.3472 0.2474 -0.9817
+3.076 0.7855 -0.2596 0.2474 -0.99
+3.017 0.7703 -0.1693 0.2474 -0.9958
+2.957 0.755 -0.07726 0.2474 -0.9991
+2.897 0.7396 0.01563 0.2474 -1
+2.837 0.7243 0.1084 0.2474 -0.9983
+2.777 0.709 0.2 0.2474 -0.9941
+2.717 0.6939 0.2894 0.2474 -0.9875
+2.659 0.6789 0.3759 0.2474 -0.9784
+2.601 0.6642 0.4584 0.2474 -0.9668
+2.545 0.6499 0.5361 0.2474 -0.9528
+2.49 0.6358 0.6081 0.2474 -0.9365
+2.437 0.6222 0.6738 0.2474 -0.9178
+2.385 0.6091 0.7323 0.2474 -0.8968
+2.336 0.5965 0.7831 0.2474 -0.8735
+2.289 0.5844 0.8256 0.2474 -0.8481
+2.244 0.573 0.8594 0.2474 -0.8206
+2.202 0.5622 0.8841 0.2474 -0.791
+2.162 0.552 0.8993 0.2474 -0.7594
+2.125 0.5426 0.905 0.2474 -0.7259
+2.091 0.5339 0.901 0.2474 -0.6907
+2.06 0.5259 0.8873 0.2474 -0.6536
+2.032 0.5187 0.864 0.2474 -0.615
+2.006 0.5123 0.8314 0.2474 -0.5748
+1.984 0.5067 0.7897 0.2474 -0.5332
+1.966 0.5019 0.7393 0.2474 -0.4903
+1.95 0.4979 0.6807 0.2474 -0.4461
+1.937 0.4947 0.6144 0.2474 -0.4008
+1.928 0.4922 0.5412 0.2474 -0.3545
+1.921 0.4906 0.4617 0.2474 -0.3073
+1.918 0.4897 0.3767 0.2474 -0.2594
+1.917 0.4895 0.287 0.2474 -0.2108
+1.919 0.4901 0.1936 0.2474 -0.1617
+1.925 0.4914 0.09726 0.2474 -0.1122
+1.932 0.4934 -0.0009488 0.2474 -0.06235
+1.942 0.496 -0.1001 0.2474 -0.01239
+1.955 0.4992 -0.1992 0.2474 0.0376
+1.97 0.5031 -0.2972 0.2474 0.0875
+1.987 0.5074 -0.3931 0.2474 0.1372
+2.007 0.5123 -0.4861 0.2474 0.1865
+2.028 0.5177 -0.5751 0.2474 0.2354
+2.051 0.5236 -0.6593 0.2474 0.2837
+2.075 0.5299 -0.7378 0.2474 0.3312
+2.101 0.5365 -0.8098 0.2474 0.378
+2.129 0.5435 -0.8746 0.2474 0.4238
+2.157 0.5509 -0.9315 0.2474 0.4685
+2.187 0.5585 -0.9799 0.2474 0.5121
+2.218 0.5664 -1.019 0.2474 0.5544
+2.25 0.5745 -1.049 0.2474 0.5953
+2.282 0.5828 -1.07 0.2474 0.6347
+2.316 0.5912 -1.08 0.2474 0.6725
+2.349 0.5999 -1.08 0.2474 0.7087
+2.384 0.6086 -1.07 0.2474 0.743
+2.418 0.6175 -1.05 0.2474 0.7756
+2.453 0.6264 -1.02 0.2474 0.8061
+2.488 0.6354 -0.9808 0.2474 0.8347
+2.524 0.6444 -0.932 0.2474 0.8612
+2.559 0.6535 -0.8743 0.2474 0.8855
+2.595 0.6627 -0.8084 0.2474 0.9076
+2.631 0.6718 -0.7347 0.2474 0.9275
+2.667 0.681 -0.6541 0.2474 0.945
+2.703 0.6902 -0.5672 0.2474 0.9602
+2.739 0.6994 -0.4749 0.2474 0.9729
+2.775 0.7085 -0.3781 0.2474 0.9833
+2.811 0.7177 -0.2777 0.2474 0.9911
+2.847 0.7269 -0.1747 0.2474 0.9965
+2.883 0.7361 -0.06994 0.2474 0.9994
+2.866 0.8866 0 0.2955 1
+2.899 0.8968 0.1062 0.2955 0.9988
+2.932 0.907 0.2114 0.2955 0.995
+2.965 0.9172 0.3145 0.2955 0.9888
+2.998 0.9274 0.4147 0.2955 0.9801
+3.031 0.9377 0.511 0.2955 0.9689
+3.065 0.948 0.6025 0.2955 0.9553
+3.098 0.9583 0.6882 0.2955 0.9394
+3.131 0.9687 0.7675 0.2955 0.9211
+3.165 0.9791 0.8395 0.2955 0.9004
+3.199 0.9895 0.9037 0.2955 0.8776
+3.233 0.9999 0.9593 0.2955 0.8525
+3.266 1.01 1.006 0.2955 0.8253
+3.3 1.021 1.043 0.2955 0.7961
+3.334 1.031 1.071 0.2955 0.7648
+3.367 1.042 1.088 0.2955 0.7317
+3.401 1.052 1.096 0.2955 0.6967
+3.434 1.062 1.093 0.2955 0.66
+3.467 1.072 1.08 0.2955 0.6216
+3.499 1.082 1.057 0.2955 0.5817
+3.531 1.092 1.025 0.2955 0.5403
+3.562 1.102 0.9831 0.2955 0.4976
+3.592 1.111 0.9326 0.2955 0.4536
+3.622 1.12 0.8737 0.2955 0.4085
+3.65 1.129 0.8072 0.2955 0.3624
+3.677 1.137 0.7336 0.2955 0.3153
+3.703 1.145 0.6537 0.2955 0.2675
+3.727 1.153 0.5684 0.2955 0.219
+3.749 1.16 0.4785 0.2955 0.17
+3.77 1.166 0.3849 0.2955 0.1205
+3.788 1.172 0.2886 0.2955 0.07074
+3.804 1.177 0.1905 0.2955 0.02079
+3.819 1.181 0.09166 0.2955 -0.0292
+3.83 1.185 -0.007005 0.2955 -0.07912
+3.839 1.188 -0.1045 0.2955 -0.1288
+3.846 1.19 -0.1998 0.2955 -0.1782
+3.849 1.191 -0.292 0.2955 -0.2272
+3.85 1.191 -0.3802 0.2955 -0.2756
+3.847 1.19 -0.4636 0.2955 -0.3233
+3.842 1.188 -0.5412 0.2955 -0.3702
+3.833 1.186 -0.6124 0.2955 -0.4161
+3.821 1.182 -0.6765 0.2955 -0.4611
+3.806 1.177 -0.7328 0.2955 -0.5048
+3.787 1.172 -0.7808 0.2955 -0.5474
+3.766 1.165 -0.8201 0.2955 -0.5885
+3.741 1.157 -0.8503 0.2955 -0.6282
+3.712 1.148 -0.8711 0.2955 -0.6663
+3.681 1.139 -0.8824 0.2955 -0.7027
+3.646 1.128 -0.884 0.2955 -0.7374
+3.609 1.116 -0.8761 0.2955 -0.7702
+3.568 1.104 -0.8587 0.2955 -0.8011
+3.525 1.09 -0.8321 0.2955 -0.8301
+3.479 1.076 -0.7965 0.2955 -0.8569
+3.431 1.061 -0.7524 0.2955 -0.8816
+3.38 1.046 -0.7002 0.2955 -0.9041
+3.327 1.029 -0.6406 0.2955 -0.9243
+3.273 1.012 -0.5741 0.2955 -0.9422
+3.216 0.9949 -0.5015 0.2955 -0.9578
+3.158 0.977 -0.4236 0.2955 -0.971
+3.099 0.9587 -0.3412 0.2955 -0.9817
+3.039 0.9401 -0.2552 0.2955 -0.99
+2.978 0.9213 -0.1664 0.2955 -0.9958
+2.917 0.9024 -0.07594 0.2955 -0.9991
+2.856 0.8834 0.01537 0.2955 -1
+2.794 0.8644 0.1065 0.2955 -0.9983
+2.733 0.8454 0.1965 0.2955 -0.9941
+2.673 0.8267 0.2845 0.2955 -0.9875
+2.613 0.8082 0.3694 0.2955 -0.9784
+2.554 0.7901 0.4504 0.2955 -0.9668
+2.497 0.7723 0.5266 0.2955 -0.9528
+2.441 0.755 0.5972 0.2955 -0.9365
+2.387 0.7383 0.6614 0.2955 -0.9178
+2.335 0.7222 0.7186 0.2955 -0.8968
+2.285 0.7068 0.7681 0.2955 -0.8735
+2.237 0.6921 0.8094 0.2955 -0.8481
+2.192 0.6781 0.8421 0.2955 -0.8206
+2.15 0.665 0.8656 0.2955 -0.791
+2.11 0.6528 0.8798 0.2955 -0.7594
+2.074 0.6415 0.8846 0.2955 -0.7259
+2.04 0.6311 0.8797 0.2955 -0.6907
+2.01 0.6217 0.8652 0.2955 -0.6536
+1.983 0.6133 0.8412 0.2955 -0.615
+1.959 0.6059 0.8079 0.2955 -0.5748
+1.938 0.5995 0.7656 0.2955 -0.5332
+1.921 0.5941 0.7148 0.2955 -0.4903
+1.907 0.5898 0.6558 0.2955 -0.4461
+1.896 0.5864 0.5892 0.2955 -0.4008
+1.888 0.5841 0.5158 0.2955 -0.3545
+1.884 0.5827 0.4361 0.2955 -0.3073
+1.882 0.5822 0.3511 0.2955 -0.2594
+1.884 0.5827 0.2614 0.2955 -0.2108
+1.888 0.5841 0.168 0.2955 -0.1617
+1.896 0.5864 0.07189 0.2955 -0.1122
+1.905 0.5894 -0.02609 0.2955 -0.06235
+1.918 0.5933 -0.1249 0.2955 -0.01239
+1.933 0.5979 -0.2236 0.2955 0.0376
+1.95 0.6032 -0.3212 0.2955 0.0875
+1.969 0.6091 -0.4167 0.2955 0.1372
+1.99 0.6157 -0.5092 0.2955 0.1865
+2.013 0.6228 -0.5976 0.2955 0.2354
+2.038 0.6304 -0.6812 0.2955 0.2837
+2.064 0.6385 -0.7591 0.2955 0.3312
+2.091 0.6469 -0.8304 0.2955 0.378
+2.12 0.6558 -0.8944 0.2955 0.4238
+2.15 0.665 -0.9506 0.2955 0.4685
+2.18 0.6744 -0.9982 0.2955 0.5121
+2.212 0.6841 -1.037 0.2955 0.5544
+2.244 0.694 -1.066 0.2955 0.5953
+2.276 0.7041 -1.085 0.2955 0.6347
+2.309 0.7143 -1.095 0.2955 0.6725
+2.342 0.7246 -1.094 0.2955 0.7087
+2.376 0.7349 -1.083 0.2955 0.743
+2.41 0.7453 -1.063 0.2955 0.7756
+2.443 0.7558 -1.032 0.2955 0.8061
+2.477 0.7662 -0.9913 0.2955 0.8347
+2.511 0.7767 -0.9416 0.2955 0.8612
+2.545 0.7871 -0.883 0.2955 0.8855
+2.578 0.7976 -0.8162 0.2955 0.9076
+2.612 0.8079 -0.7416 0.2955 0.9275
+2.645 0.8183 -0.6601 0.2955 0.945
+2.679 0.8286 -0.5723 0.2955 0.9602
+2.712 0.8389 -0.4791 0.2955 0.9729
+2.745 0.8492 -0.3814 0.2955 0.9833
+2.778 0.8594 -0.2801 0.2955 0.9911
+2.811 0.8696 -0.1762 0.2955 0.9965
+2.844 0.8798 -0.07054 0.2955 0.9994
+2.818 1.029 0 0.3429 1
+2.848 1.04 0.107 0.3429 0.9988
+2.878 1.051 0.213 0.3429 0.995
+2.908 1.062 0.317 0.3429 0.9888
+2.938 1.073 0.4181 0.3429 0.9801
+2.969 1.084 0.5152 0.3429 0.9689
+2.999 1.095 0.6075 0.3429 0.9553
+3.03 1.106 0.6941 0.3429 0.9394
+3.061 1.117 0.7742 0.3429 0.9211
+3.092 1.129 0.8471 0.3429 0.9004
+3.124 1.14 0.9121 0.3429 0.8776
+3.156 1.152 0.9686 0.3429 0.8525
+3.188 1.164 1.016 0.3429 0.8253
+3.22 1.176 1.054 0.3429 0.7961
+3.253 1.187 1.083 0.3429 0.7648
+3.286 1.199 1.101 0.3429 0.7317
+3.318 1.211 1.109 0.3429 0.6967
+3.351 1.223 1.107 0.3429 0.66
+3.383 1.235 1.095 0.3429 0.6216
+3.416 1.247 1.073 0.3429 0.5817
+3.448 1.259 1.042 0.3429 0.5403
+3.479 1.27 1.001 0.3429 0.4976
+3.51 1.281 0.9513 0.3429 0.4536
+3.54 1.292 0.8932 0.3429 0.4085
+3.57 1.303 0.8274 0.3429 0.3624
+3.598 1.313 0.7546 0.3429 0.3153
+3.625 1.323 0.6754 0.3429 0.2675
+3.651 1.333 0.5907 0.3429 0.219
+3.675 1.341 0.5014 0.3429 0.17
+3.697 1.35 0.4084 0.3429 0.1205
+3.718 1.357 0.3126 0.3429 0.07074
+3.736 1.364 0.215 0.3429 0.02079
+3.752 1.37 0.1166 0.3429 -0.0292
+3.766 1.375 0.01823 0.3429 -0.07912
+3.777 1.379 -0.07898 0.3429 -0.1288
+3.786 1.382 -0.1741 0.3429 -0.1782
+3.791 1.384 -0.2662 0.3429 -0.2272
+3.794 1.385 -0.3544 0.3429 -0.2756
+3.794 1.385 -0.4378 0.3429 -0.3233
+3.79 1.383 -0.5155 0.3429 -0.3702
+3.783 1.381 -0.5869 0.3429 -0.4161
+3.773 1.377 -0.6513 0.3429 -0.4611
+3.759 1.372 -0.708 0.3429 -0.5048
+3.742 1.366 -0.7565 0.3429 -0.5474
+3.722 1.359 -0.7963 0.3429 -0.5885
+3.698 1.35 -0.8271 0.3429 -0.6282
+3.67 1.34 -0.8487 0.3429 -0.6663
+3.64 1.329 -0.8608 0.3429 -0.7027
+3.606 1.316 -0.8633 0.3429 -0.7374
+3.569 1.303 -0.8564 0.3429 -0.7702
+3.529 1.288 -0.8401 0.3429 -0.8011
+3.485 1.272 -0.8146 0.3429 -0.8301
+3.439 1.256 -0.7802 0.3429 -0.8569
+3.391 1.238 -0.7374 0.3429 -0.8816
+3.34 1.219 -0.6866 0.3429 -0.9041
+3.287 1.2 -0.6283 0.3429 -0.9243
+3.231 1.179 -0.5633 0.3429 -0.9422
+3.174 1.159 -0.4922 0.3429 -0.9578
+3.115 1.137 -0.4159 0.3429 -0.971
+3.055 1.115 -0.335 0.3429 -0.9817
+2.994 1.093 -0.2506 0.3429 -0.99
+2.933 1.07 -0.1635 0.3429 -0.9958
+2.87 1.048 -0.07458 0.3429 -0.9991
+2.808 1.025 0.01509 0.3429 -1
+2.745 1.002 0.1046 0.3429 -0.9983
+2.683 0.9793 0.193 0.3429 -0.9941
+2.621 0.9568 0.2793 0.3429 -0.9875
+2.561 0.9347 0.3626 0.3429 -0.9784
+2.501 0.9129 0.4421 0.3429 -0.9668
+2.443 0.8917 0.5168 0.3429 -0.9528
+2.386 0.871 0.5859 0.3429 -0.9365
+2.332 0.8511 0.6487 0.3429 -0.9178
+2.279 0.8319 0.7045 0.3429 -0.8968
+2.229 0.8136 0.7527 0.3429 -0.8735
+2.181 0.7961 0.7927 0.3429 -0.8481
+2.136 0.7797 0.8242 0.3429 -0.8206
+2.094 0.7643 0.8466 0.3429 -0.791
+2.055 0.75 0.8598 0.3429 -0.7594
+2.019 0.7368 0.8635 0.3429 -0.7259
+1.986 0.7249 0.8578 0.3429 -0.6907
+1.956 0.7141 0.8425 0.3429 -0.6536
+1.93 0.7045 0.8178 0.3429 -0.615
+1.907 0.6962 0.7839 0.3429 -0.5748
+1.888 0.6892 0.7411 0.3429 -0.5332
+1.872 0.6834 0.6898 0.3429 -0.4903
+1.86 0.6788 0.6305 0.3429 -0.4461
+1.851 0.6755 0.5637 0.3429 -0.4008
+1.845 0.6734 0.49 0.3429 -0.3545
+1.842 0.6725 0.4103 0.3429 -0.3073
+1.843 0.6727 0.3252 0.3429 -0.2594
+1.846 0.674 0.2356 0.3429 -0.2108
+1.853 0.6764 0.1424 0.3429 -0.1617
+1.862 0.6799 0.04648 0.3429 -0.1122
+1.875 0.6843 -0.05122 0.3429 -0.06235
+1.889 0.6896 -0.1497 0.3429 -0.01239
+1.906 0.6958 -0.248 0.3429 0.0376
+1.925 0.7027 -0.3451 0.3429 0.0875
+1.946 0.7104 -0.4401 0.3429 0.1372
+1.969 0.7188 -0.5319 0.3429 0.1865
+1.994 0.7278 -0.6198 0.3429 0.2354
+2.02 0.7374 -0.7027 0.3429 0.2837
+2.048 0.7474 -0.7798 0.3429 0.3312
+2.076 0.7579 -0.8504 0.3429 0.378
+2.106 0.7687 -0.9137 0.3429 0.4238
+2.136 0.7798 -0.969 0.3429 0.4685
+2.167 0.7912 -1.016 0.3429 0.5121
+2.199 0.8028 -1.054 0.3429 0.5544
+2.231 0.8145 -1.082 0.3429 0.5953
+2.264 0.8263 -1.1 0.3429 0.6347
+2.296 0.8382 -1.109 0.3429 0.6725
+2.329 0.8502 -1.108 0.3429 0.7087
+2.362 0.8621 -1.096 0.3429 0.743
+2.394 0.874 -1.074 0.3429 0.7756
+2.427 0.8859 -1.042 0.3429 0.8061
+2.459 0.8976 -1.001 0.3429 0.8347
+2.491 0.9093 -0.9506 0.3429 0.8612
+2.523 0.9209 -0.8912 0.3429 0.8855
+2.554 0.9324 -0.8234 0.3429 0.9076
+2.586 0.9439 -0.748 0.3429 0.9275
+2.617 0.9552 -0.6656 0.3429 0.945
+2.647 0.9664 -0.577 0.3429 0.9602
+2.678 0.9775 -0.483 0.3429 0.9729
+2.708 0.9886 -0.3845 0.3429 0.9833
+2.738 0.9996 -0.2823 0.3429 0.9911
+2.768 1.011 -0.1775 0.3429 0.9965
+2.798 1.021 -0.07109 0.3429 0.9994
+2.763 1.168 0 0.3894 1
+2.79 1.18 0.1078 0.3894 0.9988
+2.817 1.191 0.2145 0.3894 0.995
+2.844 1.202 0.3193 0.3894 0.9888
+2.871 1.214 0.4211 0.3894 0.9801
+2.899 1.226 0.519 0.3894 0.9689
+2.927 1.237 0.6121 0.3894 0.9553
+2.955 1.249 0.6995 0.3894 0.9394
+2.983 1.261 0.7804 0.3894 0.9211
+3.012 1.274 0.8541 0.3894 0.9004
+3.042 1.286 0.9199 0.3894 0.8776
+3.072 1.299 0.9773 0.3894 0.8525
+3.102 1.312 1.026 0.3894 0.8253
+3.133 1.325 1.065 0.3894 0.7961
+3.164 1.338 1.094 0.3894 0.7648
+3.196 1.351 1.113 0.3894 0.7317
+3.228 1.365 1.122 0.3894 0.6967
+3.26 1.378 1.121 0.3894 0.66
+3.292 1.392 1.11 0.3894 0.6216
+3.324 1.405 1.089 0.3894 0.5817
+3.356 1.419 1.058 0.3894 0.5403
+3.388 1.433 1.018 0.3894 0.4976
+3.42 1.446 0.9694 0.3894 0.4536
+3.451 1.459 0.9122 0.3894 0.4085
+3.481 1.472 0.8472 0.3894 0.3624
+3.51 1.484 0.7751 0.3894 0.3153
+3.539 1.496 0.6967 0.3894 0.2675
+3.566 1.508 0.6127 0.3894 0.219
+3.591 1.518 0.5241 0.3894 0.17
+3.616 1.529 0.4317 0.3894 0.1205
+3.638 1.538 0.3365 0.3894 0.07074
+3.658 1.547 0.2394 0.3894 0.02079
+3.676 1.554 0.1414 0.3894 -0.0292
+3.692 1.561 0.04345 0.3894 -0.07912
+3.705 1.566 -0.05343 0.3894 -0.1288
+3.716 1.571 -0.1483 0.3894 -0.1782
+3.723 1.574 -0.2402 0.3894 -0.2272
+3.728 1.576 -0.3283 0.3894 -0.2756
+3.729 1.577 -0.4117 0.3894 -0.3233
+3.728 1.576 -0.4895 0.3894 -0.3702
+3.722 1.574 -0.5611 0.3894 -0.4161
+3.714 1.57 -0.6257 0.3894 -0.4611
+3.702 1.565 -0.6827 0.3894 -0.5048
+3.686 1.559 -0.7316 0.3894 -0.5474
+3.667 1.55 -0.772 0.3894 -0.5885
+3.644 1.541 -0.8035 0.3894 -0.6282
+3.618 1.53 -0.8257 0.3894 -0.6663
+3.588 1.517 -0.8386 0.3894 -0.7027
+3.555 1.503 -0.8421 0.3894 -0.7374
+3.519 1.488 -0.8362 0.3894 -0.7702
+3.479 1.471 -0.8209 0.3894 -0.8011
+3.436 1.453 -0.7966 0.3894 -0.8301
+3.39 1.433 -0.7634 0.3894 -0.8569
+3.342 1.413 -0.7219 0.3894 -0.8816
+3.29 1.391 -0.6725 0.3894 -0.9041
+3.237 1.369 -0.6157 0.3894 -0.9243
+3.181 1.345 -0.5521 0.3894 -0.9422
+3.123 1.321 -0.4826 0.3894 -0.9578
+3.064 1.296 -0.4078 0.3894 -0.971
+3.003 1.27 -0.3286 0.3894 -0.9817
+2.942 1.244 -0.2458 0.3894 -0.99
+2.879 1.217 -0.1604 0.3894 -0.9958
+2.816 1.191 -0.07317 0.3894 -0.9991
+2.753 1.164 0.01481 0.3894 -1
+2.689 1.137 0.1026 0.3894 -0.9983
+2.626 1.11 0.1893 0.3894 -0.9941
+2.564 1.084 0.274 0.3894 -0.9875
+2.502 1.058 0.3557 0.3894 -0.9784
+2.442 1.032 0.4335 0.3894 -0.9668
+2.383 1.008 0.5066 0.3894 -0.9528
+2.326 0.9835 0.5742 0.3894 -0.9365
+2.271 0.9603 0.6355 0.3894 -0.9178
+2.218 0.938 0.6899 0.3894 -0.8968
+2.168 0.9167 0.7368 0.3894 -0.8735
+2.12 0.8965 0.7755 0.3894 -0.8481
+2.076 0.8775 0.8058 0.3894 -0.8206
+2.034 0.8599 0.8271 0.3894 -0.791
+1.995 0.8435 0.8392 0.3894 -0.7594
+1.96 0.8285 0.842 0.3894 -0.7259
+1.928 0.815 0.8354 0.3894 -0.6907
+1.899 0.8029 0.8193 0.3894 -0.6536
+1.874 0.7923 0.7939 0.3894 -0.615
+1.852 0.7832 0.7594 0.3894 -0.5748
+1.834 0.7756 0.7161 0.3894 -0.5332
+1.82 0.7695 0.6644 0.3894 -0.4903
+1.809 0.7649 0.6048 0.3894 -0.4461
+1.802 0.7618 0.5377 0.3894 -0.4008
+1.798 0.7601 0.464 0.3894 -0.3545
+1.797 0.7598 0.3842 0.3894 -0.3073
+1.8 0.7609 0.2992 0.3894 -0.2594
+1.805 0.7633 0.2097 0.3894 -0.2108
+1.814 0.7669 0.1167 0.3894 -0.1617
+1.825 0.7718 0.02103 0.3894 -0.1122
+1.839 0.7777 -0.07631 0.3894 -0.06235
+1.856 0.7847 -0.1744 0.3894 -0.01239
+1.875 0.7927 -0.2722 0.3894 0.0376
+1.896 0.8015 -0.3688 0.3894 0.0875
+1.919 0.8112 -0.4631 0.3894 0.1372
+1.943 0.8216 -0.5544 0.3894 0.1865
+1.97 0.8327 -0.6415 0.3894 0.2354
+1.997 0.8444 -0.7237 0.3894 0.2837
+2.026 0.8565 -0.8001 0.3894 0.3312
+2.056 0.8691 -0.8699 0.3894 0.378
+2.086 0.882 -0.9323 0.3894 0.4238
+2.117 0.8951 -0.9868 0.3894 0.4685
+2.149 0.9085 -1.033 0.3894 0.5121
+2.181 0.922 -1.07 0.3894 0.5544
+2.213 0.9356 -1.097 0.3894 0.5953
+2.245 0.9492 -1.115 0.3894 0.6347
+2.277 0.9628 -1.123 0.3894 0.6725
+2.309 0.9763 -1.12 0.3894 0.7087
+2.341 0.9898 -1.108 0.3894 0.743
+2.373 1.003 -1.085 0.3894 0.7756
+2.404 1.016 -1.053 0.3894 0.8061
+2.434 1.029 -1.01 0.3894 0.8347
+2.465 1.042 -0.959 0.3894 0.8612
+2.494 1.055 -0.8987 0.3894 0.8855
+2.524 1.067 -0.8302 0.3894 0.9076
+2.553 1.079 -0.754 0.3894 0.9275
+2.581 1.091 -0.6708 0.3894 0.945
+2.609 1.103 -0.5814 0.3894 0.9602
+2.637 1.115 -0.4866 0.3894 0.9729
+2.664 1.126 -0.3873 0.3894 0.9833
+2.691 1.138 -0.2844 0.3894 0.9911
+2.718 1.149 -0.1788 0.3894 0.9965
+2.745 1.161 -0.07159 0.3894 0.9994
+2.701 1.305 0 0.435 1
+2.725 1.316 0.1085 0.435 0.9988
+2.749 1.328 0.2159 0.435 0.995
+2.773 1.34 0.3214 0.435 0.9888
+2.797 1.351 0.4239 0.435 0.9801
+2.822 1.363 0.5225 0.435 0.9689
+2.847 1.375 0.6163 0.435 0.9553
+2.873 1.388 0.7045 0.435 0.9394
+2.899 1.4 0.7862 0.435 0.9211
+2.926 1.413 0.8606 0.435 0.9004
+2.953 1.427 0.9272 0.435 0.8776
+2.981 1.44 0.9854 0.435 0.8525
+3.01 1.454 1.035 0.435 0.8253
+3.039 1.468 1.074 0.435 0.7961
+3.069 1.482 1.104 0.435 0.7648
+3.099 1.497 1.124 0.435 0.7317
+3.13 1.512 1.134 0.435 0.6967
+3.162 1.527 1.134 0.435 0.66
+3.193 1.543 1.124 0.435 0.6216
+3.225 1.558 1.104 0.435 0.5817
+3.257 1.573 1.074 0.435 0.5403
+3.289 1.589 1.035 0.435 0.4976
+3.321 1.604 0.987 0.435 0.4536
+3.353 1.62 0.9306 0.435 0.4085
+3.384 1.635 0.8664 0.435 0.3624
+3.414 1.649 0.7951 0.435 0.3153
+3.444 1.663 0.7175 0.435 0.2675
+3.472 1.677 0.6343 0.435 0.219
+3.499 1.69 0.5464 0.435 0.17
+3.525 1.703 0.4547 0.435 0.1205
+3.549 1.714 0.3601 0.435 0.07074
+3.571 1.725 0.2636 0.435 0.02079
+3.59 1.734 0.1661 0.435 -0.0292
+3.608 1.743 0.06864 0.435 -0.07912
+3.623 1.75 -0.02785 0.435 -0.1288
+3.636 1.756 -0.1224 0.435 -0.1782
+3.645 1.761 -0.2141 0.435 -0.2272
+3.652 1.764 -0.302 0.435 -0.2756
+3.655 1.766 -0.3853 0.435 -0.3233
+3.655 1.766 -0.4632 0.435 -0.3702
+3.652 1.764 -0.5349 0.435 -0.4161
+3.645 1.761 -0.5997 0.435 -0.4611
+3.634 1.755 -0.657 0.435 -0.5048
+3.62 1.749 -0.7064 0.435 -0.5474
+3.602 1.74 -0.7472 0.435 -0.5885
+3.581 1.73 -0.7793 0.435 -0.6282
+3.556 1.718 -0.8023 0.435 -0.6663
+3.527 1.704 -0.816 0.435 -0.7027
+3.494 1.688 -0.8204 0.435 -0.7374
+3.459 1.671 -0.8154 0.435 -0.7702
+3.419 1.652 -0.8012 0.435 -0.8011
+3.377 1.631 -0.7781 0.435 -0.8301
+3.331 1.609 -0.7462 0.435 -0.8569
+3.283 1.586 -0.706 0.435 -0.8816
+3.232 1.561 -0.6579 0.435 -0.9041
+3.178 1.535 -0.6026 0.435 -0.9243
+3.122 1.508 -0.5406 0.435 -0.9422
+3.064 1.48 -0.4727 0.435 -0.9578
+3.005 1.451 -0.3995 0.435 -0.971
+2.944 1.422 -0.322 0.435 -0.9817
+2.881 1.392 -0.2409 0.435 -0.99
+2.818 1.361 -0.1572 0.435 -0.9958
+2.755 1.331 -0.07172 0.435 -0.9991
+2.691 1.3 0.01451 0.435 -1
+2.627 1.269 0.1006 0.435 -0.9983
+2.563 1.238 0.1856 0.435 -0.9941
+2.5 1.208 0.2685 0.435 -0.9875
+2.438 1.178 0.3485 0.435 -0.9784
+2.378 1.149 0.4246 0.435 -0.9668
+2.319 1.12 0.4961 0.435 -0.9528
+2.261 1.092 0.5622 0.435 -0.9365
+2.206 1.066 0.622 0.435 -0.9178
+2.153 1.04 0.6749 0.435 -0.8968
+2.103 1.016 0.7204 0.435 -0.8735
+2.056 0.993 0.7578 0.435 -0.8481
+2.011 0.9715 0.7868 0.435 -0.8206
+1.97 0.9515 0.807 0.435 -0.791
+1.932 0.9331 0.8181 0.435 -0.7594
+1.897 0.9164 0.8199 0.435 -0.7259
+1.866 0.9013 0.8124 0.435 -0.6907
+1.838 0.888 0.7956 0.435 -0.6536
+1.814 0.8764 0.7695 0.435 -0.615
+1.794 0.8667 0.7345 0.435 -0.5748
+1.778 0.8586 0.6907 0.435 -0.5332
+1.765 0.8524 0.6386 0.435 -0.4903
+1.755 0.8479 0.5787 0.435 -0.4461
+1.75 0.8452 0.5115 0.435 -0.4008
+1.747 0.8441 0.4376 0.435 -0.3545
+1.749 0.8447 0.3579 0.435 -0.3073
+1.753 0.8468 0.2729 0.435 -0.2594
+1.761 0.8504 0.1836 0.435 -0.2108
+1.771 0.8555 0.09088 0.435 -0.1617
+1.784 0.8619 -0.004427 0.435 -0.1122
+1.8 0.8696 -0.1014 0.435 -0.06235
+1.819 0.8785 -0.1989 0.435 -0.01239
+1.839 0.8885 -0.2962 0.435 0.0376
+1.862 0.8994 -0.3922 0.435 0.0875
+1.886 0.9113 -0.4859 0.435 0.1372
+1.913 0.9239 -0.5764 0.435 0.1865
+1.94 0.9372 -0.6628 0.435 0.2354
+1.969 0.9511 -0.7443 0.435 0.2837
+1.999 0.9655 -0.8198 0.435 0.3312
+2.029 0.9803 -0.8888 0.435 0.378
+2.061 0.9953 -0.9504 0.435 0.4238
+2.092 1.011 -1.004 0.435 0.4685
+2.124 1.026 -1.049 0.435 0.5121
+2.156 1.042 -1.085 0.435 0.5544
+2.188 1.057 -1.112 0.435 0.5953
+2.22 1.072 -1.129 0.435 0.6347
+2.252 1.088 -1.135 0.435 0.6725
+2.283 1.103 -1.132 0.435 0.7087
+2.314 1.118 -1.119 0.435 0.743
+2.344 1.132 -1.095 0.435 0.7756
+2.374 1.147 -1.062 0.435 0.8061
+2.403 1.161 -1.019 0.435 0.8347
+2.431 1.174 -0.9668 0.435 0.8612
+2.459 1.188 -0.9057 0.435 0.8855
+2.486 1.201 -0.8364 0.435 0.9076
+2.512 1.214 -0.7595 0.435 0.9275
+2.538 1.226 -0.6755 0.435 0.945
+2.564 1.238 -0.5854 0.435 0.9602
+2.589 1.251 -0.4899 0.435 0.9729
+2.613 1.262 -0.3898 0.435 0.9833
+2.638 1.274 -0.2862 0.435 0.9911
+2.662 1.286 -0.18 0.435 0.9965
+2.686 1.297 -0.07205 0.435 0.9994
+2.633 1.438 0 0.4794 1
+2.654 1.45 0.1091 0.4794 0.9988
+2.675 1.461 0.2172 0.4794 0.995
+2.696 1.473 0.3233 0.4794 0.9888
+2.717 1.484 0.4265 0.4794 0.9801
+2.739 1.496 0.5257 0.4794 0.9689
+2.761 1.509 0.6202 0.4794 0.9553
+2.784 1.521 0.709 0.4794 0.9394
+2.808 1.534 0.7914 0.4794 0.9211
+2.833 1.547 0.8666 0.4794 0.9004
+2.858 1.561 0.9339 0.4794 0.8776
+2.884 1.575 0.9928 0.4794 0.8525
+2.911 1.59 1.043 0.4794 0.8253
+2.938 1.605 1.083 0.4794 0.7961
+2.967 1.621 1.114 0.4794 0.7648
+2.996 1.637 1.135 0.4794 0.7317
+3.026 1.653 1.146 0.4794 0.6967
+3.056 1.67 1.147 0.4794 0.66
+3.087 1.687 1.137 0.4794 0.6216
+3.119 1.704 1.118 0.4794 0.5817
+3.151 1.721 1.089 0.4794 0.5403
+3.183 1.739 1.051 0.4794 0.4976
+3.215 1.756 1.004 0.4794 0.4536
+3.247 1.774 0.9483 0.4794 0.4085
+3.279 1.791 0.8851 0.4794 0.3624
+3.31 1.808 0.8146 0.4794 0.3153
+3.34 1.825 0.7379 0.4794 0.2675
+3.37 1.841 0.6555 0.4794 0.219
+3.398 1.856 0.5684 0.4794 0.17
+3.425 1.871 0.4774 0.4794 0.1205
+3.45 1.885 0.3835 0.4794 0.07074
+3.474 1.898 0.2876 0.4794 0.02079
+3.495 1.91 0.1907 0.4794 -0.0292
+3.515 1.92 0.09379 0.4794 -0.07912
+3.531 1.929 -0.002255 0.4794 -0.1288
+3.546 1.937 -0.09644 0.4794 -0.1782
+3.557 1.943 -0.1878 0.4794 -0.2272
+3.565 1.948 -0.2755 0.4794 -0.2756
+3.57 1.95 -0.3587 0.4794 -0.3233
+3.572 1.951 -0.4366 0.4794 -0.3702
+3.57 1.95 -0.5083 0.4794 -0.4161
+3.565 1.948 -0.5733 0.4794 -0.4611
+3.556 1.943 -0.6309 0.4794 -0.5048
+3.543 1.936 -0.6806 0.4794 -0.5474
+3.527 1.927 -0.722 0.4794 -0.5885
+3.507 1.916 -0.7546 0.4794 -0.6282
+3.483 1.903 -0.7783 0.4794 -0.6663
+3.455 1.887 -0.7928 0.4794 -0.7027
+3.423 1.87 -0.7981 0.4794 -0.7374
+3.388 1.851 -0.7941 0.4794 -0.7702
+3.35 1.83 -0.781 0.4794 -0.8011
+3.308 1.807 -0.7591 0.4794 -0.8301
+3.263 1.783 -0.7285 0.4794 -0.8569
+3.215 1.756 -0.6896 0.4794 -0.8816
+3.164 1.728 -0.643 0.4794 -0.9041
+3.11 1.699 -0.5892 0.4794 -0.9243
+3.055 1.669 -0.5288 0.4794 -0.9422
+2.997 1.637 -0.4624 0.4794 -0.9578
+2.937 1.605 -0.391 0.4794 -0.971
+2.876 1.571 -0.3151 0.4794 -0.9817
+2.813 1.537 -0.2358 0.4794 -0.99
+2.75 1.502 -0.1539 0.4794 -0.9958
+2.686 1.467 -0.07022 0.4794 -0.9991
+2.622 1.432 0.01421 0.4794 -1
+2.558 1.397 0.09848 0.4794 -0.9983
+2.494 1.363 0.1817 0.4794 -0.9941
+2.431 1.328 0.2628 0.4794 -0.9875
+2.369 1.294 0.3411 0.4794 -0.9784
+2.308 1.261 0.4155 0.4794 -0.9668
+2.249 1.229 0.4854 0.4794 -0.9528
+2.192 1.197 0.5498 0.4794 -0.9365
+2.137 1.167 0.6081 0.4794 -0.9178
+2.084 1.139 0.6595 0.4794 -0.8968
+2.034 1.111 0.7036 0.4794 -0.8735
+1.987 1.086 0.7397 0.4794 -0.8481
+1.943 1.062 0.7674 0.4794 -0.8206
+1.902 1.039 0.7865 0.4794 -0.791
+1.865 1.019 0.7965 0.4794 -0.7594
+1.831 1 0.7973 0.4794 -0.7259
+1.801 0.9839 0.789 0.4794 -0.6907
+1.774 0.9694 0.7714 0.4794 -0.6536
+1.752 0.9569 0.7447 0.4794 -0.615
+1.733 0.9466 0.709 0.4794 -0.5748
+1.718 0.9383 0.6648 0.4794 -0.5332
+1.706 0.932 0.6124 0.4794 -0.4903
+1.698 0.9278 0.5522 0.4794 -0.4461
+1.694 0.9256 0.4849 0.4794 -0.4008
+1.694 0.9253 0.411 0.4794 -0.3545
+1.697 0.9269 0.3313 0.4794 -0.3073
+1.703 0.9302 0.2465 0.4794 -0.2594
+1.712 0.9353 0.1575 0.4794 -0.2108
+1.724 0.942 0.06503 0.4794 -0.1617
+1.739 0.9502 -0.02988 0.4794 -0.1122
+1.757 0.9599 -0.1263 0.4794 -0.06235
+1.777 0.9709 -0.2234 0.4794 -0.01239
+1.799 0.983 -0.32 0.4794 0.0376
+1.824 0.9962 -0.4154 0.4794 0.0875
+1.849 1.01 -0.5084 0.4794 0.1372
+1.877 1.025 -0.5981 0.4794 0.1865
+1.906 1.041 -0.6838 0.4794 0.2354
+1.935 1.057 -0.7644 0.4794 0.2837
+1.966 1.074 -0.8391 0.4794 0.3312
+1.997 1.091 -0.9072 0.4794 0.378
+2.029 1.109 -0.9679 0.4794 0.4238
+2.061 1.126 -1.021 0.4794 0.4685
+2.093 1.144 -1.065 0.4794 0.5121
+2.125 1.161 -1.1 0.4794 0.5544
+2.157 1.178 -1.126 0.4794 0.5953
+2.189 1.196 -1.142 0.4794 0.6347
+2.22 1.213 -1.148 0.4794 0.6725
+2.25 1.229 -1.143 0.4794 0.7087
+2.28 1.245 -1.129 0.4794 0.743
+2.309 1.261 -1.105 0.4794 0.7756
+2.337 1.277 -1.071 0.4794 0.8061
+2.364 1.292 -1.027 0.4794 0.8347
+2.391 1.306 -0.974 0.4794 0.8612
+2.416 1.32 -0.9122 0.4794 0.8855
+2.441 1.334 -0.8421 0.4794 0.9076
+2.465 1.347 -0.7645 0.4794 0.9275
+2.489 1.36 -0.6798 0.4794 0.945
+2.512 1.372 -0.589 0.4794 0.9602
+2.534 1.384 -0.4928 0.4794 0.9729
+2.556 1.396 -0.3922 0.4794 0.9833
+2.577 1.408 -0.2879 0.4794 0.9911
+2.598 1.419 -0.181 0.4794 0.9965
+2.619 1.431 -0.07247 0.4794 0.9994
+2.558 1.568 0 0.5227 1
+2.575 1.579 0.1097 0.5227 0.9988
+2.593 1.59 0.2183 0.5227 0.995
+2.612 1.601 0.325 0.5227 0.9888
+2.63 1.613 0.4287 0.5227 0.9801
+2.65 1.624 0.5286 0.5227 0.9689
+2.669 1.637 0.6237 0.5227 0.9553
+2.69 1.649 0.7131 0.5227 0.9394
+2.711 1.662 0.7961 0.5227 0.9211
+2.733 1.676 0.872 0.5227 0.9004
+2.756 1.69 0.94 0.5227 0.8776
+2.78 1.705 0.9997 0.5227 0.8525
+2.805 1.72 1.05 0.5227 0.8253
+2.831 1.736 1.092 0.5227 0.7961
+2.858 1.752 1.123 0.5227 0.7648
+2.886 1.769 1.145 0.5227 0.7317
+2.915 1.787 1.157 0.5227 0.6967
+2.944 1.805 1.158 0.5227 0.66
+2.975 1.824 1.15 0.5227 0.6216
+3.006 1.843 1.132 0.5227 0.5817
+3.037 1.862 1.104 0.5227 0.5403
+3.069 1.882 1.066 0.5227 0.4976
+3.102 1.902 1.02 0.5227 0.4536
+3.134 1.921 0.9655 0.5227 0.4085
+3.166 1.941 0.9032 0.5227 0.3624
+3.198 1.961 0.8337 0.5227 0.3153
+3.229 1.98 0.7578 0.5227 0.2675
+3.259 1.998 0.6763 0.5227 0.219
+3.289 2.016 0.59 0.5227 0.17
+3.317 2.033 0.4998 0.5227 0.1205
+3.343 2.05 0.4067 0.5227 0.07074
+3.368 2.065 0.3115 0.5227 0.02079
+3.391 2.079 0.2153 0.5227 -0.0292
+3.412 2.092 0.1189 0.5227 -0.07912
+3.43 2.103 0.02334 0.5227 -0.1288
+3.446 2.113 -0.0704 0.5227 -0.1782
+3.459 2.121 -0.1614 0.5227 -0.2272
+3.469 2.127 -0.2489 0.5227 -0.2756
+3.476 2.131 -0.3319 0.5227 -0.3233
+3.479 2.133 -0.4097 0.5227 -0.3702
+3.479 2.133 -0.4814 0.5227 -0.4161
+3.475 2.131 -0.5466 0.5227 -0.4611
+3.468 2.126 -0.6044 0.5227 -0.5048
+3.456 2.119 -0.6545 0.5227 -0.5474
+3.441 2.11 -0.6963 0.5227 -0.5885
+3.422 2.098 -0.7295 0.5227 -0.6282
+3.399 2.084 -0.7539 0.5227 -0.6663
+3.373 2.068 -0.7692 0.5227 -0.7027
+3.342 2.049 -0.7753 0.5227 -0.7374
+3.308 2.028 -0.7724 0.5227 -0.7702
+3.271 2.005 -0.7604 0.5227 -0.8011
+3.229 1.98 -0.7396 0.5227 -0.8301
+3.185 1.953 -0.7103 0.5227 -0.8569
+3.138 1.924 -0.6728 0.5227 -0.8816
+3.087 1.893 -0.6277 0.5227 -0.9041
+3.034 1.86 -0.5754 0.5227 -0.9243
+2.979 1.826 -0.5166 0.5227 -0.9422
+2.921 1.791 -0.4519 0.5227 -0.9578
+2.861 1.754 -0.3822 0.5227 -0.971
+2.8 1.717 -0.3081 0.5227 -0.9817
+2.738 1.679 -0.2306 0.5227 -0.99
+2.675 1.64 -0.1505 0.5227 -0.9958
+2.611 1.601 -0.06868 0.5227 -0.9991
+2.547 1.561 0.0139 0.5227 -1
+2.483 1.522 0.09632 0.5227 -0.9983
+2.419 1.483 0.1777 0.5227 -0.9941
+2.356 1.444 0.257 0.5227 -0.9875
+2.294 1.407 0.3335 0.5227 -0.9784
+2.234 1.369 0.4062 0.5227 -0.9668
+2.175 1.333 0.4743 0.5227 -0.9528
+2.118 1.298 0.537 0.5227 -0.9365
+2.063 1.265 0.5937 0.5227 -0.9178
+2.011 1.233 0.6437 0.5227 -0.8968
+1.961 1.202 0.6863 0.5227 -0.8735
+1.915 1.174 0.7211 0.5227 -0.8481
+1.871 1.147 0.7475 0.5227 -0.8206
+1.831 1.123 0.7654 0.5227 -0.791
+1.795 1.101 0.7744 0.5227 -0.7594
+1.762 1.08 0.7743 0.5227 -0.7259
+1.733 1.062 0.765 0.5227 -0.6907
+1.708 1.047 0.7467 0.5227 -0.6536
+1.686 1.034 0.7193 0.5227 -0.615
+1.668 1.023 0.6832 0.5227 -0.5748
+1.655 1.014 0.6385 0.5227 -0.5332
+1.645 1.008 0.5858 0.5227 -0.4903
+1.638 1.005 0.5255 0.5227 -0.4461
+1.636 1.003 0.458 0.5227 -0.4008
+1.637 1.004 0.3841 0.5227 -0.3545
+1.641 1.006 0.3045 0.5227 -0.3073
+1.649 1.011 0.2199 0.5227 -0.2594
+1.66 1.018 0.1312 0.5227 -0.2108
+1.674 1.026 0.03913 0.5227 -0.1617
+1.691 1.037 -0.05532 0.5227 -0.1122
+1.71 1.048 -0.1512 0.5227 -0.06235
+1.731 1.062 -0.2477 0.5227 -0.01239
+1.755 1.076 -0.3437 0.5227 0.0376
+1.781 1.092 -0.4383 0.5227 0.0875
+1.808 1.108 -0.5305 0.5227 0.1372
+1.836 1.126 -0.6195 0.5227 0.1865
+1.866 1.144 -0.7043 0.5227 0.2354
+1.897 1.163 -0.784 0.5227 0.2837
+1.928 1.182 -0.8578 0.5227 0.3312
+1.96 1.202 -0.925 0.5227 0.378
+1.992 1.221 -0.9848 0.5227 0.4238
+2.024 1.241 -1.037 0.5227 0.4685
+2.056 1.261 -1.08 0.5227 0.5121
+2.088 1.28 -1.114 0.5227 0.5544
+2.12 1.3 -1.139 0.5227 0.5953
+2.151 1.319 -1.154 0.5227 0.6347
+2.181 1.337 -1.159 0.5227 0.6725
+2.21 1.355 -1.154 0.5227 0.7087
+2.239 1.373 -1.139 0.5227 0.743
+2.266 1.389 -1.114 0.5227 0.7756
+2.293 1.406 -1.079 0.5227 0.8061
+2.319 1.422 -1.034 0.5227 0.8347
+2.343 1.437 -0.9806 0.5227 0.8612
+2.367 1.451 -0.9181 0.5227 0.8855
+2.39 1.465 -0.8473 0.5227 0.9076
+2.411 1.478 -0.769 0.5227 0.9275
+2.432 1.491 -0.6837 0.5227 0.945
+2.453 1.504 -0.5923 0.5227 0.9602
+2.472 1.516 -0.4955 0.5227 0.9729
+2.491 1.527 -0.3942 0.5227 0.9833
+2.51 1.539 -0.2894 0.5227 0.9911
+2.528 1.55 -0.1819 0.5227 0.9965
+2.546 1.561 -0.07284 0.5227 0.9994
+2.476 1.694 0 0.5646 1
+2.491 1.704 0.1101 0.5646 0.9988
+2.506 1.715 0.2193 0.5646 0.995
+2.522 1.725 0.3265 0.5646 0.9888
+2.538 1.736 0.4307 0.5646 0.9801
+2.554 1.747 0.5311 0.5646 0.9689
+2.571 1.759 0.6268 0.5646 0.9553
+2.589 1.771 0.7168 0.5646 0.9394
+2.608 1.784 0.8004 0.5646 0.9211
+2.628 1.798 0.8769 0.5646 0.9004
+2.649 1.812 0.9456 0.5646 0.8776
+2.671 1.827 1.006 0.5646 0.8525
+2.694 1.843 1.057 0.5646 0.8253
+2.718 1.86 1.099 0.5646 0.7961
+2.744 1.877 1.132 0.5646 0.7648
+2.77 1.895 1.154 0.5646 0.7317
+2.798 1.914 1.167 0.5646 0.6967
+2.827 1.934 1.169 0.5646 0.66
+2.856 1.954 1.162 0.5646 0.6216
+2.887 1.975 1.144 0.5646 0.5817
+2.918 1.996 1.117 0.5646 0.5403
+2.949 2.018 1.081 0.5646 0.4976
+2.982 2.04 1.036 0.5646 0.4536
+3.014 2.062 0.9821 0.5646 0.4085
+3.046 2.084 0.9207 0.5646 0.3624
+3.078 2.106 0.8522 0.5646 0.3153
+3.11 2.128 0.7772 0.5646 0.2675
+3.141 2.149 0.6966 0.5646 0.219
+3.171 2.17 0.6112 0.5646 0.17
+3.2 2.189 0.5219 0.5646 0.1205
+3.228 2.208 0.4296 0.5646 0.07074
+3.254 2.226 0.3352 0.5646 0.02079
+3.278 2.243 0.2396 0.5646 -0.0292
+3.3 2.258 0.1439 0.5646 -0.07912
+3.32 2.271 0.04893 0.5646 -0.1288
+3.337 2.283 -0.04433 0.5646 -0.1782
+3.352 2.293 -0.135 0.5646 -0.2272
+3.363 2.301 -0.2221 0.5646 -0.2756
+3.371 2.306 -0.3049 0.5646 -0.3233
+3.376 2.31 -0.3825 0.5646 -0.3702
+3.378 2.311 -0.4543 0.5646 -0.4161
+3.375 2.309 -0.5195 0.5646 -0.4611
+3.369 2.305 -0.5776 0.5646 -0.5048
+3.359 2.298 -0.6279 0.5646 -0.5474
+3.346 2.289 -0.6702 0.5646 -0.5885
+3.328 2.277 -0.7039 0.5646 -0.6282
+3.306 2.262 -0.7289 0.5646 -0.6663
+3.281 2.245 -0.745 0.5646 -0.7027
+3.252 2.225 -0.7521 0.5646 -0.7374
+3.218 2.202 -0.7501 0.5646 -0.7702
+3.182 2.177 -0.7392 0.5646 -0.8011
+3.142 2.149 -0.7197 0.5646 -0.8301
+3.098 2.119 -0.6917 0.5646 -0.8569
+3.051 2.087 -0.6556 0.5646 -0.8816
+3.001 2.053 -0.612 0.5646 -0.9041
+2.949 2.018 -0.5612 0.5646 -0.9243
+2.894 1.98 -0.5041 0.5646 -0.9422
+2.837 1.941 -0.4411 0.5646 -0.9578
+2.778 1.901 -0.3731 0.5646 -0.971
+2.717 1.859 -0.3009 0.5646 -0.9817
+2.655 1.817 -0.2252 0.5646 -0.99
+2.593 1.774 -0.147 0.5646 -0.9958
+2.529 1.73 -0.06709 0.5646 -0.9991
+2.465 1.687 0.01358 0.5646 -1
+2.402 1.643 0.09409 0.5646 -0.9983
+2.338 1.6 0.1735 0.5646 -0.9941
+2.276 1.557 0.251 0.5646 -0.9875
+2.214 1.515 0.3256 0.5646 -0.9784
+2.154 1.474 0.3965 0.5646 -0.9668
+2.096 1.434 0.4629 0.5646 -0.9528
+2.039 1.395 0.524 0.5646 -0.9365
+1.985 1.358 0.579 0.5646 -0.9178
+1.934 1.323 0.6274 0.5646 -0.8968
+1.885 1.289 0.6686 0.5646 -0.8735
+1.839 1.258 0.702 0.5646 -0.8481
+1.797 1.229 0.7272 0.5646 -0.8206
+1.757 1.202 0.7439 0.5646 -0.791
+1.722 1.178 0.7518 0.5646 -0.7594
+1.69 1.156 0.7507 0.5646 -0.7259
+1.662 1.137 0.7406 0.5646 -0.6907
+1.638 1.121 0.7215 0.5646 -0.6536
+1.618 1.107 0.6935 0.5646 -0.615
+1.601 1.096 0.6569 0.5646 -0.5748
+1.589 1.087 0.6119 0.5646 -0.5332
+1.58 1.081 0.5589 0.5646 -0.4903
+1.576 1.078 0.4983 0.5646 -0.4461
+1.575 1.077 0.4309 0.5646 -0.4008
+1.577 1.079 0.357 0.5646 -0.3545
+1.583 1.083 0.2776 0.5646 -0.3073
+1.592 1.089 0.1932 0.5646 -0.2594
+1.605 1.098 0.1048 0.5646 -0.2108
+1.62 1.108 0.01321 0.5646 -0.1617
+1.638 1.121 -0.08072 0.5646 -0.1122
+1.659 1.135 -0.176 0.5646 -0.06235
+1.682 1.15 -0.2718 0.5646 -0.01239
+1.706 1.167 -0.3671 0.5646 0.0376
+1.733 1.186 -0.4609 0.5646 0.0875
+1.761 1.205 -0.5523 0.5646 0.1372
+1.791 1.225 -0.6404 0.5646 0.1865
+1.821 1.246 -0.7243 0.5646 0.2354
+1.853 1.267 -0.8031 0.5646 0.2837
+1.885 1.289 -0.876 0.5646 0.3312
+1.917 1.311 -0.9422 0.5646 0.378
+1.949 1.333 -1.001 0.5646 0.4238
+1.981 1.356 -1.052 0.5646 0.4685
+2.013 1.377 -1.094 0.5646 0.5121
+2.045 1.399 -1.128 0.5646 0.5544
+2.076 1.42 -1.151 0.5646 0.5953
+2.106 1.441 -1.165 0.5646 0.6347
+2.135 1.461 -1.17 0.5646 0.6725
+2.164 1.48 -1.164 0.5646 0.7087
+2.191 1.499 -1.148 0.5646 0.743
+2.217 1.517 -1.122 0.5646 0.7756
+2.242 1.534 -1.086 0.5646 0.8061
+2.266 1.55 -1.041 0.5646 0.8347
+2.289 1.566 -0.9866 0.5646 0.8612
+2.31 1.581 -0.9234 0.5646 0.8855
+2.331 1.595 -0.852 0.5646 0.9076
+2.35 1.608 -0.773 0.5646 0.9275
+2.369 1.621 -0.6872 0.5646 0.945
+2.387 1.633 -0.5952 0.5646 0.9602
+2.403 1.644 -0.4979 0.5646 0.9729
+2.42 1.655 -0.3961 0.5646 0.9833
+2.436 1.666 -0.2907 0.5646 0.9911
+2.451 1.677 -0.1828 0.5646 0.9965
+2.466 1.687 -0.07316 0.5646 0.9994
+2.388 1.816 0 0.6052 1
+2.401 1.825 0.1106 0.6052 0.9988
+2.413 1.834 0.2201 0.6052 0.995
+2.426 1.844 0.3278 0.6052 0.9888
+2.439 1.854 0.4325 0.6052 0.9801
+2.453 1.865 0.5333 0.6052 0.9689
+2.468 1.876 0.6294 0.6052 0.9553
+2.483 1.888 0.72 0.6052 0.9394
+2.5 1.9 0.8041 0.6052 0.9211
+2.517 1.914 0.8812 0.6052 0.9004
+2.536 1.928 0.9505 0.6052 0.8776
+2.556 1.943 1.011 0.6052 0.8525
+2.577 1.959 1.064 0.6052 0.8253
+2.6 1.976 1.106 0.6052 0.7961
+2.624 1.995 1.14 0.6052 0.7648
+2.649 2.014 1.163 0.6052 0.7317
+2.675 2.034 1.176 0.6052 0.6967
+2.703 2.055 1.18 0.6052 0.66
+2.732 2.077 1.173 0.6052 0.6216
+2.761 2.099 1.156 0.6052 0.5817
+2.792 2.122 1.13 0.6052 0.5403
+2.823 2.146 1.095 0.6052 0.4976
+2.855 2.17 1.051 0.6052 0.4536
+2.887 2.195 0.9981 0.6052 0.4085
+2.92 2.22 0.9377 0.6052 0.3624
+2.952 2.244 0.8702 0.6052 0.3153
+2.984 2.269 0.7962 0.6052 0.2675
+3.016 2.293 0.7166 0.6052 0.219
+3.047 2.316 0.6321 0.6052 0.17
+3.076 2.339 0.5437 0.6052 0.1205
+3.105 2.36 0.4522 0.6052 0.07074
+3.132 2.381 0.3586 0.6052 0.02079
+3.157 2.4 0.2639 0.6052 -0.0292
+3.18 2.418 0.1688 0.6052 -0.07912
+3.201 2.434 0.07448 0.6052 -0.1288
+3.22 2.448 -0.01822 0.6052 -0.1782
+3.235 2.46 -0.1084 0.6052 -0.2272
+3.248 2.469 -0.1952 0.6052 -0.2756
+3.258 2.477 -0.2777 0.6052 -0.3233
+3.264 2.481 -0.3551 0.6052 -0.3702
+3.267 2.483 -0.4268 0.6052 -0.4161
+3.266 2.483 -0.4921 0.6052 -0.4611
+3.261 2.479 -0.5503 0.6052 -0.5048
+3.253 2.473 -0.601 0.6052 -0.5474
+3.24 2.463 -0.6436 0.6052 -0.5885
+3.224 2.451 -0.6779 0.6052 -0.6282
+3.203 2.435 -0.7036 0.6052 -0.6663
+3.179 2.417 -0.7204 0.6052 -0.7027
+3.151 2.395 -0.7283 0.6052 -0.7374
+3.119 2.371 -0.7274 0.6052 -0.7702
+3.083 2.344 -0.7176 0.6052 -0.8011
+3.044 2.314 -0.6993 0.6052 -0.8301
+3.002 2.282 -0.6726 0.6052 -0.8569
+2.956 2.247 -0.638 0.6052 -0.8816
+2.907 2.21 -0.5958 0.6052 -0.9041
+2.856 2.171 -0.5467 0.6052 -0.9243
+2.801 2.13 -0.4913 0.6052 -0.9422
+2.745 2.087 -0.4301 0.6052 -0.9578
+2.687 2.043 -0.3639 0.6052 -0.971
+2.627 1.997 -0.2935 0.6052 -0.9817
+2.566 1.95 -0.2197 0.6052 -0.99
+2.504 1.903 -0.1434 0.6052 -0.9958
+2.441 1.855 -0.06546 0.6052 -0.9991
+2.378 1.807 0.01325 0.6052 -1
+2.315 1.76 0.09181 0.6052 -0.9983
+2.252 1.712 0.1693 0.6052 -0.9941
+2.19 1.665 0.2449 0.6052 -0.9875
+2.129 1.619 0.3176 0.6052 -0.9784
+2.07 1.574 0.3867 0.6052 -0.9668
+2.012 1.53 0.4512 0.6052 -0.9528
+1.957 1.487 0.5106 0.6052 -0.9365
+1.903 1.447 0.564 0.6052 -0.9178
+1.853 1.408 0.6108 0.6052 -0.8968
+1.805 1.372 0.6505 0.6052 -0.8735
+1.76 1.338 0.6825 0.6052 -0.8481
+1.719 1.307 0.7064 0.6052 -0.8206
+1.681 1.278 0.7219 0.6052 -0.791
+1.646 1.251 0.7287 0.6052 -0.7594
+1.616 1.228 0.7267 0.6052 -0.7259
+1.589 1.208 0.7157 0.6052 -0.6907
+1.566 1.19 0.6959 0.6052 -0.6536
+1.547 1.176 0.6673 0.6052 -0.615
+1.532 1.164 0.6302 0.6052 -0.5748
+1.521 1.156 0.5848 0.6052 -0.5332
+1.513 1.151 0.5316 0.6052 -0.4903
+1.51 1.148 0.4709 0.6052 -0.4461
+1.51 1.148 0.4034 0.6052 -0.4008
+1.514 1.151 0.3297 0.6052 -0.3545
+1.522 1.157 0.2504 0.6052 -0.3073
+1.532 1.165 0.1664 0.6052 -0.2594
+1.546 1.175 0.07841 0.6052 -0.2108
+1.563 1.188 -0.01271 0.6052 -0.1617
+1.582 1.203 -0.1061 0.6052 -0.1122
+1.604 1.219 -0.2007 0.6052 -0.06235
+1.628 1.237 -0.2958 0.6052 -0.01239
+1.653 1.257 -0.3903 0.6052 0.0376
+1.681 1.278 -0.4833 0.6052 0.0875
+1.71 1.3 -0.5738 0.6052 0.1372
+1.74 1.323 -0.661 0.6052 0.1865
+1.771 1.347 -0.7439 0.6052 0.2354
+1.803 1.371 -0.8217 0.6052 0.2837
+1.835 1.395 -0.8936 0.6052 0.3312
+1.868 1.42 -0.9589 0.6052 0.378
+1.9 1.444 -1.017 0.6052 0.4238
+1.932 1.469 -1.067 0.6052 0.4685
+1.964 1.493 -1.108 0.6052 0.5121
+1.995 1.517 -1.14 0.6052 0.5544
+2.025 1.54 -1.163 0.6052 0.5953
+2.055 1.562 -1.176 0.6052 0.6347
+2.083 1.583 -1.18 0.6052 0.6725
+2.11 1.604 -1.173 0.6052 0.7087
+2.136 1.624 -1.156 0.6052 0.743
+2.161 1.643 -1.129 0.6052 0.7756
+2.184 1.661 -1.093 0.6052 0.8061
+2.206 1.677 -1.047 0.6052 0.8347
+2.227 1.693 -0.9919 0.6052 0.8612
+2.247 1.708 -0.9281 0.6052 0.8855
+2.265 1.722 -0.8561 0.6052 0.9076
+2.282 1.735 -0.7766 0.6052 0.9275
+2.299 1.747 -0.6902 0.6052 0.945
+2.314 1.759 -0.5977 0.6052 0.9602
+2.328 1.77 -0.4999 0.6052 0.9729
+2.342 1.78 -0.3976 0.6052 0.9833
+2.355 1.79 -0.2919 0.6052 0.9911
+2.368 1.8 -0.1835 0.6052 0.9965
+2.38 1.809 -0.07344 0.6052 0.9994
+2.295 1.933 0 0.6442 1
+2.304 1.941 0.1109 0.6442 0.9988
+2.314 1.949 0.2209 0.6442 0.995
+2.324 1.958 0.3288 0.6442 0.9888
+2.335 1.967 0.4339 0.6442 0.9801
+2.347 1.976 0.5352 0.6442 0.9689
+2.359 1.987 0.6317 0.6442 0.9553
+2.372 1.998 0.7227 0.6442 0.9394
+2.386 2.01 0.8074 0.6442 0.9211
+2.402 2.023 0.885 0.6442 0.9004
+2.418 2.037 0.9548 0.6442 0.8776
+2.436 2.052 1.016 0.6442 0.8525
+2.456 2.068 1.069 0.6442 0.8253
+2.477 2.086 1.113 0.6442 0.7961
+2.499 2.105 1.147 0.6442 0.7648
+2.523 2.125 1.171 0.6442 0.7317
+2.548 2.146 1.185 0.6442 0.6967
+2.574 2.168 1.189 0.6442 0.66
+2.602 2.192 1.183 0.6442 0.6216
+2.631 2.216 1.168 0.6442 0.5817
+2.661 2.241 1.143 0.6442 0.5403
+2.691 2.267 1.108 0.6442 0.4976
+2.723 2.293 1.065 0.6442 0.4536
+2.755 2.32 1.013 0.6442 0.4085
+2.787 2.347 0.9541 0.6442 0.3624
+2.819 2.375 0.8876 0.6442 0.3153
+2.852 2.402 0.8146 0.6442 0.2675
+2.883 2.429 0.736 0.6442 0.219
+2.915 2.455 0.6526 0.6442 0.17
+2.945 2.481 0.5651 0.6442 0.1205
+2.974 2.505 0.4746 0.6442 0.07074
+3.002 2.528 0.3819 0.6442 0.02079
+3.028 2.55 0.2879 0.6442 -0.0292
+3.052 2.571 0.1936 0.6442 -0.07912
+3.074 2.589 0.09999 0.6442 -0.1288
+3.093 2.606 0.00789 0.6442 -0.1782
+3.11 2.62 -0.08176 0.6442 -0.2272
+3.124 2.631 -0.1681 0.6442 -0.2756
+3.135 2.64 -0.2503 0.6442 -0.3233
+3.142 2.647 -0.3275 0.6442 -0.3702
+3.146 2.65 -0.3991 0.6442 -0.4161
+3.147 2.65 -0.4644 0.6442 -0.4611
+3.143 2.648 -0.5227 0.6442 -0.5048
+3.136 2.641 -0.5737 0.6442 -0.5474
+3.125 2.632 -0.6167 0.6442 -0.5885
+3.11 2.619 -0.6515 0.6442 -0.6282
+3.091 2.603 -0.6777 0.6442 -0.6663
+3.068 2.584 -0.6953 0.6442 -0.7027
+3.041 2.561 -0.7042 0.6442 -0.7374
+3.01 2.536 -0.7042 0.6442 -0.7702
+2.976 2.507 -0.6956 0.6442 -0.8011
+2.938 2.475 -0.6785 0.6442 -0.8301
+2.897 2.44 -0.6531 0.6442 -0.8569
+2.852 2.402 -0.62 0.6442 -0.8816
+2.804 2.362 -0.5794 0.6442 -0.9041
+2.754 2.319 -0.5319 0.6442 -0.9243
+2.701 2.275 -0.4781 0.6442 -0.9422
+2.645 2.228 -0.4187 0.6442 -0.9578
+2.588 2.18 -0.3544 0.6442 -0.971
+2.529 2.13 -0.2859 0.6442 -0.9817
+2.469 2.08 -0.2141 0.6442 -0.99
+2.408 2.028 -0.1398 0.6442 -0.9958
+2.346 1.976 -0.06379 0.6442 -0.9991
+2.284 1.924 0.01291 0.6442 -1
+2.222 1.872 0.08947 0.6442 -0.9983
+2.16 1.82 0.165 0.6442 -0.9941
+2.099 1.768 0.2386 0.6442 -0.9875
+2.04 1.718 0.3094 0.6442 -0.9784
+1.981 1.669 0.3765 0.6442 -0.9668
+1.925 1.621 0.4393 0.6442 -0.9528
+1.87 1.575 0.4969 0.6442 -0.9365
+1.818 1.531 0.5486 0.6442 -0.9178
+1.768 1.49 0.5938 0.6442 -0.8968
+1.722 1.45 0.632 0.6442 -0.8735
+1.678 1.413 0.6625 0.6442 -0.8481
+1.638 1.38 0.6851 0.6442 -0.8206
+1.601 1.349 0.6994 0.6442 -0.791
+1.568 1.321 0.7052 0.6442 -0.7594
+1.539 1.296 0.7022 0.6442 -0.7259
+1.513 1.274 0.6904 0.6442 -0.6907
+1.491 1.256 0.6699 0.6442 -0.6536
+1.474 1.241 0.6407 0.6442 -0.615
+1.46 1.23 0.6031 0.6442 -0.5748
+1.45 1.221 0.5574 0.6442 -0.5332
+1.444 1.216 0.5039 0.6442 -0.4903
+1.442 1.215 0.4432 0.6442 -0.4461
+1.444 1.216 0.3757 0.6442 -0.4008
+1.449 1.22 0.3021 0.6442 -0.3545
+1.457 1.228 0.2232 0.6442 -0.3073
+1.469 1.238 0.1395 0.6442 -0.2594
+1.484 1.25 0.05194 0.6442 -0.2108
+1.502 1.265 -0.03863 0.6442 -0.1617
+1.522 1.282 -0.1314 0.6442 -0.1122
+1.545 1.301 -0.2253 0.6442 -0.06235
+1.57 1.322 -0.3196 0.6442 -0.01239
+1.596 1.345 -0.4133 0.6442 0.0376
+1.625 1.368 -0.5053 0.6442 0.0875
+1.654 1.393 -0.5949 0.6442 0.1372
+1.685 1.419 -0.6811 0.6442 0.1865
+1.716 1.446 -0.7631 0.6442 0.2354
+1.748 1.473 -0.8399 0.6442 0.2837
+1.781 1.5 -0.9107 0.6442 0.3312
+1.813 1.527 -0.9749 0.6442 0.378
+1.845 1.554 -1.032 0.6442 0.4238
+1.877 1.581 -1.081 0.6442 0.4685
+1.908 1.607 -1.121 0.6442 0.5121
+1.939 1.633 -1.152 0.6442 0.5544
+1.968 1.658 -1.174 0.6442 0.5953
+1.997 1.682 -1.186 0.6442 0.6347
+2.024 1.705 -1.189 0.6442 0.6725
+2.05 1.727 -1.181 0.6442 0.7087
+2.075 1.747 -1.164 0.6442 0.743
+2.098 1.767 -1.136 0.6442 0.7756
+2.12 1.785 -1.099 0.6442 0.8061
+2.14 1.802 -1.052 0.6442 0.8347
+2.159 1.818 -0.9967 0.6442 0.8612
+2.177 1.833 -0.9323 0.6442 0.8855
+2.193 1.847 -0.8597 0.6442 0.9076
+2.208 1.86 -0.7797 0.6442 0.9275
+2.222 1.871 -0.6928 0.6442 0.945
+2.234 1.882 -0.5999 0.6442 0.9602
+2.246 1.892 -0.5016 0.6442 0.9729
+2.258 1.902 -0.399 0.6442 0.9833
+2.268 1.91 -0.2928 0.6442 0.9911
+2.278 1.919 -0.1841 0.6442 0.9965
+2.288 1.927 -0.07368 0.6442 0.9994
+2.195 2.045 0 0.6816 1
+2.202 2.052 0.1112 0.6816 0.9988
+2.21 2.059 0.2214 0.6816 0.995
+2.218 2.066 0.3297 0.6816 0.9888
+2.226 2.074 0.4351 0.6816 0.9801
+2.235 2.082 0.5367 0.6816 0.9689
+2.245 2.091 0.6336 0.6816 0.9553
+2.256 2.102 0.725 0.6816 0.9394
+2.268 2.113 0.8101 0.6816 0.9211
+2.281 2.125 0.8882 0.6816 0.9004
+2.296 2.139 0.9586 0.6816 0.8776
+2.312 2.154 1.021 0.6816 0.8525
+2.33 2.17 1.074 0.6816 0.8253
+2.349 2.188 1.118 0.6816 0.7961
+2.37 2.207 1.153 0.6816 0.7648
+2.392 2.228 1.178 0.6816 0.7317
+2.416 2.25 1.193 0.6816 0.6967
+2.441 2.274 1.198 0.6816 0.66
+2.467 2.299 1.193 0.6816 0.6216
+2.495 2.325 1.178 0.6816 0.5817
+2.524 2.352 1.154 0.6816 0.5403
+2.554 2.38 1.121 0.6816 0.4976
+2.585 2.408 1.079 0.6816 0.4536
+2.617 2.438 1.028 0.6816 0.4085
+2.649 2.467 0.9699 0.6816 0.3624
+2.681 2.497 0.9045 0.6816 0.3153
+2.713 2.527 0.8326 0.6816 0.2675
+2.745 2.557 0.7551 0.6816 0.219
+2.776 2.586 0.6727 0.6816 0.17
+2.807 2.615 0.5862 0.6816 0.1205
+2.836 2.642 0.4967 0.6816 0.07074
+2.865 2.669 0.4049 0.6816 0.02079
+2.891 2.693 0.3118 0.6816 -0.0292
+2.916 2.717 0.2183 0.6816 -0.07912
+2.939 2.738 0.1254 0.6816 -0.1288
+2.959 2.757 0.034 0.6816 -0.1782
+2.977 2.773 -0.05508 0.6816 -0.2272
+2.992 2.787 -0.1409 0.6816 -0.2756
+3.003 2.798 -0.2227 0.6816 -0.3233
+3.012 2.806 -0.2997 0.6816 -0.3702
+3.017 2.811 -0.3712 0.6816 -0.4161
+3.019 2.812 -0.4364 0.6816 -0.4611
+3.016 2.81 -0.4948 0.6816 -0.5048
+3.01 2.804 -0.546 0.6816 -0.5474
+3.001 2.795 -0.5893 0.6816 -0.5885
+2.987 2.782 -0.6246 0.6816 -0.6282
+2.969 2.766 -0.6515 0.6816 -0.6663
+2.947 2.746 -0.6698 0.6816 -0.7027
+2.922 2.722 -0.6795 0.6816 -0.7374
+2.893 2.695 -0.6806 0.6816 -0.7702
+2.86 2.664 -0.6731 0.6816 -0.8011
+2.823 2.63 -0.6572 0.6816 -0.8301
+2.783 2.592 -0.6332 0.6816 -0.8569
+2.739 2.552 -0.6015 0.6816 -0.8816
+2.693 2.509 -0.5625 0.6816 -0.9041
+2.644 2.463 -0.5167 0.6816 -0.9243
+2.592 2.415 -0.4647 0.6816 -0.9422
+2.538 2.365 -0.4071 0.6816 -0.9578
+2.482 2.313 -0.3447 0.6816 -0.971
+2.425 2.259 -0.2781 0.6816 -0.9817
+2.366 2.204 -0.2083 0.6816 -0.99
+2.306 2.148 -0.136 0.6816 -0.9958
+2.246 2.092 -0.06209 0.6816 -0.9991
+2.185 2.035 0.01257 0.6816 -1
+2.124 1.979 0.08707 0.6816 -0.9983
+2.064 1.923 0.1605 0.6816 -0.9941
+2.004 1.867 0.2321 0.6816 -0.9875
+1.946 1.813 0.3009 0.6816 -0.9784
+1.889 1.759 0.3662 0.6816 -0.9668
+1.833 1.708 0.4271 0.6816 -0.9528
+1.78 1.658 0.4828 0.6816 -0.9365
+1.729 1.611 0.5328 0.6816 -0.9178
+1.681 1.566 0.5764 0.6816 -0.8968
+1.636 1.524 0.613 0.6816 -0.8735
+1.593 1.484 0.6422 0.6816 -0.8481
+1.555 1.448 0.6635 0.6816 -0.8206
+1.519 1.415 0.6765 0.6816 -0.791
+1.487 1.386 0.6812 0.6816 -0.7594
+1.459 1.359 0.6772 0.6816 -0.7259
+1.435 1.337 0.6646 0.6816 -0.6907
+1.415 1.318 0.6434 0.6816 -0.6536
+1.398 1.303 0.6137 0.6816 -0.615
+1.386 1.291 0.5756 0.6816 -0.5748
+1.377 1.283 0.5296 0.6816 -0.5332
+1.373 1.279 0.476 0.6816 -0.4903
+1.372 1.278 0.4152 0.6816 -0.4461
+1.374 1.28 0.3478 0.6816 -0.4008
+1.381 1.286 0.2744 0.6816 -0.3545
+1.39 1.295 0.1957 0.6816 -0.3073
+1.403 1.307 0.1125 0.6816 -0.2594
+1.419 1.322 0.02544 0.6816 -0.2108
+1.438 1.339 -0.06453 0.6816 -0.1617
+1.459 1.359 -0.1566 0.6816 -0.1122
+1.482 1.381 -0.2498 0.6816 -0.06235
+1.508 1.405 -0.3432 0.6816 -0.01239
+1.535 1.43 -0.4359 0.6816 0.0376
+1.564 1.457 -0.5271 0.6816 0.0875
+1.593 1.484 -0.6157 0.6816 0.1372
+1.624 1.513 -0.7009 0.6816 0.1865
+1.656 1.543 -0.7817 0.6816 0.2354
+1.688 1.573 -0.8574 0.6816 0.2837
+1.72 1.603 -0.9272 0.6816 0.3312
+1.752 1.632 -0.9903 0.6816 0.378
+1.784 1.662 -1.046 0.6816 0.4238
+1.815 1.691 -1.094 0.6816 0.4685
+1.846 1.72 -1.133 0.6816 0.5121
+1.876 1.747 -1.163 0.6816 0.5544
+1.904 1.774 -1.184 0.6816 0.5953
+1.932 1.8 -1.196 0.6816 0.6347
+1.958 1.824 -1.197 0.6816 0.6725
+1.983 1.847 -1.189 0.6816 0.7087
+2.006 1.869 -1.171 0.6816 0.743
+2.028 1.889 -1.142 0.6816 0.7756
+2.048 1.908 -1.104 0.6816 0.8061
+2.067 1.925 -1.057 0.6816 0.8347
+2.084 1.941 -1.001 0.6816 0.8612
+2.099 1.956 -0.9358 0.6816 0.8855
+2.113 1.969 -0.8628 0.6816 0.9076
+2.126 1.981 -0.7823 0.6816 0.9275
+2.138 1.992 -0.695 0.6816 0.945
+2.149 2.002 -0.6016 0.6816 0.9602
+2.158 2.011 -0.503 0.6816 0.9729
+2.167 2.019 -0.4001 0.6816 0.9833
+2.175 2.026 -0.2936 0.6816 0.9911
+2.183 2.034 -0.1845 0.6816 0.9965
+2.19 2.04 -0.07387 0.6816 0.9994
+2.09 2.152 0 0.7174 1
+2.095 2.157 0.1114 0.7174 0.9988
+2.1 2.163 0.2219 0.7174 0.995
+2.106 2.168 0.3304 0.7174 0.9888
+2.112 2.175 0.436 0.7174 0.9801
+2.119 2.182 0.5379 0.7174 0.9689
+2.127 2.19 0.6352 0.7174 0.9553
+2.135 2.199 0.7269 0.7174 0.9394
+2.145 2.209 0.8124 0.7174 0.9211
+2.157 2.221 0.8909 0.7174 0.9004
+2.169 2.234 0.9617 0.7174 0.8776
+2.184 2.248 1.024 0.7174 0.8525
+2.2 2.265 1.078 0.7174 0.8253
+2.217 2.283 1.123 0.7174 0.7961
+2.236 2.302 1.159 0.7174 0.7648
+2.257 2.324 1.184 0.7174 0.7317
+2.279 2.347 1.2 0.7174 0.6967
+2.303 2.371 1.206 0.7174 0.66
+2.329 2.398 1.202 0.7174 0.6216
+2.355 2.425 1.188 0.7174 0.5817
+2.383 2.454 1.165 0.7174 0.5403
+2.413 2.484 1.133 0.7174 0.4976
+2.443 2.515 1.092 0.7174 0.4536
+2.474 2.547 1.042 0.7174 0.4085
+2.505 2.579 0.9851 0.7174 0.3624
+2.537 2.612 0.9208 0.7174 0.3153
+2.569 2.645 0.85 0.7174 0.2675
+2.6 2.677 0.7736 0.7174 0.219
+2.632 2.71 0.6923 0.7174 0.17
+2.662 2.741 0.6069 0.7174 0.1205
+2.692 2.772 0.5184 0.7174 0.07074
+2.72 2.801 0.4276 0.7174 0.02079
+2.747 2.829 0.3355 0.7174 -0.0292
+2.773 2.855 0.2429 0.7174 -0.07912
+2.796 2.879 0.1508 0.7174 -0.1288
+2.817 2.9 0.06009 0.7174 -0.1782
+2.835 2.919 -0.02835 0.7174 -0.2272
+2.851 2.935 -0.1137 0.7174 -0.2756
+2.863 2.948 -0.1951 0.7174 -0.3233
+2.873 2.958 -0.2717 0.7174 -0.3702
+2.879 2.964 -0.343 0.7174 -0.4161
+2.882 2.967 -0.4081 0.7174 -0.4611
+2.881 2.966 -0.4666 0.7174 -0.5048
+2.876 2.961 -0.5179 0.7174 -0.5474
+2.867 2.952 -0.5616 0.7174 -0.5885
+2.855 2.939 -0.5974 0.7174 -0.6282
+2.838 2.922 -0.6249 0.7174 -0.6663
+2.818 2.901 -0.6439 0.7174 -0.7027
+2.794 2.877 -0.6545 0.7174 -0.7374
+2.766 2.848 -0.6565 0.7174 -0.7702
+2.734 2.815 -0.6502 0.7174 -0.8011
+2.699 2.779 -0.6356 0.7174 -0.8301
+2.661 2.739 -0.613 0.7174 -0.8569
+2.619 2.696 -0.5828 0.7174 -0.8816
+2.574 2.65 -0.5453 0.7174 -0.9041
+2.526 2.601 -0.5012 0.7174 -0.9243
+2.476 2.55 -0.451 0.7174 -0.9422
+2.424 2.496 -0.3953 0.7174 -0.9578
+2.37 2.44 -0.3348 0.7174 -0.971
+2.314 2.382 -0.2702 0.7174 -0.9817
+2.256 2.323 -0.2024 0.7174 -0.99
+2.198 2.263 -0.1322 0.7174 -0.9958
+2.139 2.203 -0.06034 0.7174 -0.9991
+2.08 2.142 0.01221 0.7174 -1
+2.021 2.081 0.08462 0.7174 -0.9983
+1.962 2.02 0.156 0.7174 -0.9941
+1.904 1.961 0.2255 0.7174 -0.9875
+1.848 1.902 0.2923 0.7174 -0.9784
+1.792 1.845 0.3556 0.7174 -0.9668
+1.738 1.79 0.4146 0.7174 -0.9528
+1.687 1.737 0.4685 0.7174 -0.9365
+1.637 1.686 0.5168 0.7174 -0.9178
+1.591 1.638 0.5587 0.7174 -0.8968
+1.547 1.593 0.5937 0.7174 -0.8735
+1.506 1.551 0.6214 0.7174 -0.8481
+1.469 1.512 0.6414 0.7174 -0.8206
+1.435 1.477 0.6532 0.7174 -0.791
+1.405 1.446 0.6568 0.7174 -0.7594
+1.378 1.419 0.6519 0.7174 -0.7259
+1.355 1.395 0.6385 0.7174 -0.6907
+1.336 1.376 0.6165 0.7174 -0.6536
+1.321 1.36 0.5863 0.7174 -0.615
+1.31 1.349 0.5478 0.7174 -0.5748
+1.302 1.341 0.5015 0.7174 -0.5332
+1.299 1.337 0.4477 0.7174 -0.4903
+1.299 1.338 0.3869 0.7174 -0.4461
+1.303 1.342 0.3197 0.7174 -0.4008
+1.31 1.349 0.2465 0.7174 -0.3545
+1.321 1.36 0.1682 0.7174 -0.3073
+1.334 1.374 0.08538 0.7174 -0.2594
+1.351 1.391 -0.001082 0.7174 -0.2108
+1.37 1.411 -0.09039 0.7174 -0.1617
+1.392 1.433 -0.1817 0.7174 -0.1122
+1.416 1.458 -0.274 0.7174 -0.06235
+1.442 1.484 -0.3666 0.7174 -0.01239
+1.469 1.513 -0.4584 0.7174 0.0376
+1.498 1.543 -0.5485 0.7174 0.0875
+1.528 1.574 -0.636 0.7174 0.1372
+1.559 1.605 -0.7201 0.7174 0.1865
+1.591 1.638 -0.7999 0.7174 0.2354
+1.622 1.67 -0.8745 0.7174 0.2837
+1.654 1.703 -0.9432 0.7174 0.3312
+1.686 1.736 -1.005 0.7174 0.378
+1.717 1.768 -1.06 0.7174 0.4238
+1.748 1.8 -1.107 0.7174 0.4685
+1.778 1.83 -1.145 0.7174 0.5121
+1.806 1.86 -1.174 0.7174 0.5544
+1.834 1.888 -1.194 0.7174 0.5953
+1.86 1.916 -1.204 0.7174 0.6347
+1.885 1.941 -1.205 0.7174 0.6725
+1.909 1.965 -1.196 0.7174 0.7087
+1.93 1.988 -1.177 0.7174 0.743
+1.951 2.009 -1.148 0.7174 0.7756
+1.969 2.028 -1.109 0.7174 0.8061
+1.986 2.045 -1.061 0.7174 0.8347
+2.001 2.061 -1.004 0.7174 0.8612
+2.015 2.075 -0.9388 0.7174 0.8855
+2.027 2.088 -0.8653 0.7174 0.9076
+2.038 2.099 -0.7844 0.7174 0.9275
+2.048 2.109 -0.6967 0.7174 0.945
+2.056 2.117 -0.603 0.7174 0.9602
+2.064 2.125 -0.5041 0.7174 0.9729
+2.07 2.132 -0.4009 0.7174 0.9833
+2.076 2.138 -0.2942 0.7174 0.9911
+2.082 2.143 -0.1849 0.7174 0.9965
+2.087 2.149 -0.07401 0.7174 0.9994
+1.98 2.254 0 0.7513 1
+1.983 2.257 0.1116 0.7513 0.9988
+1.986 2.261 0.2222 0.7513 0.995
+1.989 2.265 0.3308 0.7513 0.9888
+1.993 2.269 0.4367 0.7513 0.9801
+1.998 2.275 0.5388 0.7513 0.9689
+2.004 2.281 0.6363 0.7513 0.9553
+2.011 2.289 0.7283 0.7513 0.9394
+2.019 2.298 0.8141 0.7513 0.9211
+2.028 2.309 0.893 0.7513 0.9004
+2.039 2.321 0.9643 0.7513 0.8776
+2.052 2.336 1.027 0.7513 0.8525
+2.066 2.352 1.082 0.7513 0.8253
+2.082 2.37 1.127 0.7513 0.7961
+2.099 2.39 1.163 0.7513 0.7648
+2.118 2.411 1.19 0.7513 0.7317
+2.139 2.435 1.206 0.7513 0.6967
+2.162 2.461 1.213 0.7513 0.66
+2.186 2.488 1.21 0.7513 0.6216
+2.212 2.517 1.198 0.7513 0.5817
+2.238 2.548 1.175 0.7513 0.5403
+2.267 2.58 1.144 0.7513 0.4976
+2.296 2.613 1.104 0.7513 0.4536
+2.326 2.648 1.056 0.7513 0.4085
+2.357 2.683 0.9997 0.7513 0.3624
+2.388 2.718 0.9365 0.7513 0.3153
+2.419 2.754 0.8669 0.7513 0.2675
+2.45 2.789 0.7917 0.7513 0.219
+2.481 2.825 0.7115 0.7513 0.17
+2.512 2.859 0.6273 0.7513 0.1205
+2.541 2.893 0.5399 0.7513 0.07074
+2.57 2.925 0.4501 0.7513 0.02079
+2.597 2.956 0.359 0.7513 -0.0292
+2.622 2.985 0.2673 0.7513 -0.07912
+2.646 3.012 0.1761 0.7513 -0.1288
+2.667 3.036 0.08614 0.7513 -0.1782
+2.686 3.057 -0.001616 0.7513 -0.2272
+2.702 3.076 -0.08635 0.7513 -0.2756
+2.715 3.091 -0.1672 0.7513 -0.3233
+2.726 3.103 -0.2436 0.7513 -0.3702
+2.733 3.111 -0.3146 0.7513 -0.4161
+2.736 3.115 -0.3796 0.7513 -0.4611
+2.736 3.115 -0.4381 0.7513 -0.5048
+2.732 3.11 -0.4896 0.7513 -0.5474
+2.725 3.102 -0.5336 0.7513 -0.5885
+2.714 3.089 -0.5698 0.7513 -0.6282
+2.699 3.072 -0.5978 0.7513 -0.6663
+2.68 3.051 -0.6176 0.7513 -0.7027
+2.657 3.025 -0.629 0.7513 -0.7374
+2.631 2.995 -0.6321 0.7513 -0.7702
+2.601 2.961 -0.6269 0.7513 -0.8011
+2.567 2.922 -0.6135 0.7513 -0.8301
+2.53 2.88 -0.5923 0.7513 -0.8569
+2.49 2.835 -0.5636 0.7513 -0.8816
+2.447 2.786 -0.5278 0.7513 -0.9041
+2.401 2.734 -0.4854 0.7513 -0.9243
+2.353 2.679 -0.437 0.7513 -0.9422
+2.303 2.621 -0.3832 0.7513 -0.9578
+2.25 2.562 -0.3246 0.7513 -0.971
+2.196 2.5 -0.2621 0.7513 -0.9817
+2.141 2.437 -0.1964 0.7513 -0.99
+2.085 2.373 -0.1282 0.7513 -0.9958
+2.028 2.308 -0.05855 0.7513 -0.9991
+1.97 2.243 0.01185 0.7513 -1
+1.913 2.178 0.08211 0.7513 -0.9983
+1.856 2.113 0.1514 0.7513 -0.9941
+1.8 2.049 0.2188 0.7513 -0.9875
+1.745 1.987 0.2835 0.7513 -0.9784
+1.692 1.926 0.3448 0.7513 -0.9668
+1.64 1.867 0.4018 0.7513 -0.9528
+1.59 1.81 0.4539 0.7513 -0.9365
+1.543 1.756 0.5004 0.7513 -0.9178
+1.498 1.705 0.5406 0.7513 -0.8968
+1.456 1.657 0.5741 0.7513 -0.8735
+1.417 1.613 0.6003 0.7513 -0.8481
+1.381 1.572 0.6189 0.7513 -0.8206
+1.349 1.535 0.6295 0.7513 -0.791
+1.32 1.502 0.632 0.7513 -0.7594
+1.295 1.474 0.6261 0.7513 -0.7259
+1.273 1.449 0.6119 0.7513 -0.6907
+1.256 1.429 0.5893 0.7513 -0.6536
+1.242 1.414 0.5585 0.7513 -0.615
+1.232 1.402 0.5196 0.7513 -0.5748
+1.226 1.395 0.4731 0.7513 -0.5332
+1.223 1.393 0.4192 0.7513 -0.4903
+1.225 1.394 0.3584 0.7513 -0.4461
+1.229 1.399 0.2913 0.7513 -0.4008
+1.237 1.408 0.2184 0.7513 -0.3545
+1.249 1.421 0.1405 0.7513 -0.3073
+1.263 1.438 0.05824 0.7513 -0.2594
+1.28 1.457 -0.0276 0.7513 -0.2108
+1.3 1.48 -0.1162 0.7513 -0.1617
+1.322 1.505 -0.2067 0.7513 -0.1122
+1.346 1.532 -0.2981 0.7513 -0.06235
+1.372 1.562 -0.3897 0.7513 -0.01239
+1.4 1.593 -0.4805 0.7513 0.0376
+1.428 1.626 -0.5696 0.7513 0.0875
+1.458 1.66 -0.656 0.7513 0.1372
+1.489 1.695 -0.739 0.7513 0.1865
+1.52 1.73 -0.8176 0.7513 0.2354
+1.551 1.766 -0.891 0.7513 0.2837
+1.583 1.802 -0.9585 0.7513 0.3312
+1.614 1.837 -1.019 0.7513 0.378
+1.644 1.872 -1.073 0.7513 0.4238
+1.674 1.906 -1.118 0.7513 0.4685
+1.703 1.938 -1.156 0.7513 0.5121
+1.731 1.97 -1.184 0.7513 0.5544
+1.757 2 -1.203 0.7513 0.5953
+1.782 2.029 -1.212 0.7513 0.6347
+1.806 2.056 -1.212 0.7513 0.6725
+1.828 2.081 -1.202 0.7513 0.7087
+1.848 2.104 -1.182 0.7513 0.743
+1.867 2.125 -1.152 0.7513 0.7756
+1.884 2.144 -1.113 0.7513 0.8061
+1.899 2.162 -1.065 0.7513 0.8347
+1.913 2.177 -1.007 0.7513 0.8612
+1.925 2.191 -0.9412 0.7513 0.8855
+1.935 2.203 -0.8673 0.7513 0.9076
+1.944 2.213 -0.786 0.7513 0.9275
+1.952 2.221 -0.698 0.7513 0.945
+1.958 2.229 -0.604 0.7513 0.9602
+1.963 2.235 -0.5049 0.7513 0.9729
+1.968 2.24 -0.4015 0.7513 0.9833
+1.972 2.244 -0.2946 0.7513 0.9911
+1.975 2.248 -0.1851 0.7513 0.9965
+1.978 2.252 -0.0741 0.7513 0.9994
+1.865 2.35 0 0.7833 1
+1.866 2.351 0.1116 0.7833 0.9988
+1.867 2.353 0.2223 0.7833 0.995
+1.869 2.355 0.3311 0.7833 0.9888
+1.871 2.357 0.4371 0.7833 0.9801
+1.874 2.361 0.5393 0.7833 0.9689
+1.878 2.366 0.637 0.7833 0.9553
+1.883 2.372 0.7292 0.7833 0.9394
+1.889 2.38 0.8153 0.7833 0.9211
+1.896 2.39 0.8945 0.7833 0.9004
+1.906 2.401 0.9662 0.7833 0.8776
+1.916 2.415 1.03 0.7833 0.8525
+1.929 2.431 1.085 0.7833 0.8253
+1.943 2.449 1.131 0.7833 0.7961
+1.959 2.469 1.168 0.7833 0.7648
+1.977 2.491 1.195 0.7833 0.7317
+1.996 2.515 1.212 0.7833 0.6967
+2.017 2.542 1.22 0.7833 0.66
+2.04 2.571 1.218 0.7833 0.6216
+2.064 2.601 1.206 0.7833 0.5817
+2.09 2.634 1.185 0.7833 0.5403
+2.117 2.668 1.155 0.7833 0.4976
+2.145 2.703 1.116 0.7833 0.4536
+2.174 2.74 1.068 0.7833 0.4085
+2.204 2.777 1.014 0.7833 0.3624
+2.234 2.815 0.9517 0.7833 0.3153
+2.265 2.854 0.8833 0.7833 0.2675
+2.295 2.893 0.8092 0.7833 0.219
+2.326 2.931 0.7303 0.7833 0.17
+2.356 2.969 0.6472 0.7833 0.1205
+2.385 3.005 0.5609 0.7833 0.07074
+2.413 3.041 0.4723 0.7833 0.02079
+2.44 3.075 0.3822 0.7833 -0.0292
+2.465 3.107 0.2916 0.7833 -0.07912
+2.489 3.137 0.2012 0.7833 -0.1288
+2.51 3.164 0.1121 0.7833 -0.1782
+2.53 3.188 0.02512 0.7833 -0.2272
+2.546 3.209 -0.05897 0.7833 -0.2756
+2.56 3.226 -0.1393 0.7833 -0.3233
+2.571 3.24 -0.2152 0.7833 -0.3702
+2.578 3.249 -0.2859 0.7833 -0.4161
+2.583 3.255 -0.3508 0.7833 -0.4611
+2.584 3.256 -0.4093 0.7833 -0.5048
+2.581 3.252 -0.4609 0.7833 -0.5474
+2.575 3.244 -0.5052 0.7833 -0.5885
+2.565 3.232 -0.5418 0.7833 -0.6282
+2.551 3.215 -0.5704 0.7833 -0.6663
+2.533 3.193 -0.5909 0.7833 -0.7027
+2.512 3.166 -0.6032 0.7833 -0.7374
+2.487 3.135 -0.6072 0.7833 -0.7702
+2.459 3.099 -0.6031 0.7833 -0.8011
+2.427 3.059 -0.5911 0.7833 -0.8301
+2.392 3.015 -0.5713 0.7833 -0.8569
+2.354 2.966 -0.5441 0.7833 -0.8816
+2.313 2.915 -0.5099 0.7833 -0.9041
+2.269 2.86 -0.4693 0.7833 -0.9243
+2.223 2.801 -0.4227 0.7833 -0.9422
+2.175 2.74 -0.3708 0.7833 -0.9578
+2.124 2.677 -0.3143 0.7833 -0.971
+2.073 2.612 -0.2538 0.7833 -0.9817
+2.019 2.545 -0.1902 0.7833 -0.99
+1.965 2.477 -0.1242 0.7833 -0.9958
+1.911 2.408 -0.05673 0.7833 -0.9991
+1.856 2.338 0.01148 0.7833 -1
+1.801 2.269 0.07956 0.7833 -0.9983
+1.746 2.2 0.1466 0.7833 -0.9941
+1.692 2.133 0.2119 0.7833 -0.9875
+1.64 2.066 0.2746 0.7833 -0.9784
+1.588 2.001 0.3338 0.7833 -0.9668
+1.539 1.939 0.3888 0.7833 -0.9528
+1.491 1.879 0.439 0.7833 -0.9365
+1.445 1.821 0.4837 0.7833 -0.9178
+1.403 1.767 0.5222 0.7833 -0.8968
+1.362 1.717 0.554 0.7833 -0.8735
+1.325 1.67 0.5788 0.7833 -0.8481
+1.291 1.627 0.596 0.7833 -0.8206
+1.261 1.589 0.6054 0.7833 -0.791
+1.233 1.554 0.6068 0.7833 -0.7594
+1.21 1.525 0.6 0.7833 -0.7259
+1.19 1.5 0.5849 0.7833 -0.6907
+1.174 1.479 0.5617 0.7833 -0.6536
+1.161 1.463 0.5304 0.7833 -0.615
+1.152 1.452 0.4912 0.7833 -0.5748
+1.147 1.446 0.4444 0.7833 -0.5332
+1.146 1.444 0.3904 0.7833 -0.4903
+1.148 1.447 0.3297 0.7833 -0.4461
+1.153 1.454 0.2628 0.7833 -0.4008
+1.162 1.465 0.1903 0.7833 -0.3545
+1.174 1.479 0.1128 0.7833 -0.3073
+1.189 1.498 0.03106 0.7833 -0.2594
+1.206 1.52 -0.0541 0.7833 -0.2108
+1.226 1.545 -0.1419 0.7833 -0.1617
+1.248 1.573 -0.2315 0.7833 -0.1122
+1.273 1.604 -0.3221 0.7833 -0.06235
+1.298 1.636 -0.4126 0.7833 -0.01239
+1.326 1.671 -0.5023 0.7833 0.0376
+1.354 1.707 -0.5903 0.7833 0.0875
+1.384 1.744 -0.6756 0.7833 0.1372
+1.414 1.782 -0.7573 0.7833 0.1865
+1.445 1.82 -0.8347 0.7833 0.2354
+1.475 1.859 -0.907 0.7833 0.2837
+1.506 1.897 -0.9733 0.7833 0.3312
+1.536 1.935 -1.033 0.7833 0.378
+1.565 1.973 -1.085 0.7833 0.4238
+1.594 2.009 -1.13 0.7833 0.4685
+1.622 2.044 -1.166 0.7833 0.5121
+1.648 2.077 -1.193 0.7833 0.5544
+1.674 2.109 -1.211 0.7833 0.5953
+1.698 2.139 -1.219 0.7833 0.6347
+1.72 2.167 -1.218 0.7833 0.6725
+1.74 2.193 -1.207 0.7833 0.7087
+1.759 2.217 -1.187 0.7833 0.743
+1.776 2.238 -1.156 0.7833 0.7756
+1.792 2.258 -1.116 0.7833 0.8061
+1.805 2.275 -1.067 0.7833 0.8347
+1.817 2.29 -1.009 0.7833 0.8612
+1.827 2.303 -0.943 0.7833 0.8855
+1.836 2.314 -0.8687 0.7833 0.9076
+1.843 2.323 -0.7871 0.7833 0.9275
+1.849 2.33 -0.6989 0.7833 0.945
+1.854 2.336 -0.6047 0.7833 0.9602
+1.857 2.34 -0.5054 0.7833 0.9729
+1.86 2.344 -0.4018 0.7833 0.9833
+1.862 2.346 -0.2948 0.7833 0.9911
+1.863 2.348 -0.1853 0.7833 0.9965
+1.864 2.349 -0.07415 0.7833 0.9994
+1.745 2.44 0 0.8134 1
+1.744 2.439 0.1116 0.8134 0.9988
+1.744 2.439 0.2223 0.8134 0.995
+1.744 2.438 0.3311 0.8134 0.9888
+1.744 2.439 0.4372 0.8134 0.9801
+1.745 2.441 0.5395 0.8134 0.9689
+1.748 2.444 0.6373 0.8134 0.9553
+1.751 2.449 0.7297 0.8134 0.9394
+1.756 2.455 0.816 0.8134 0.9211
+1.762 2.463 0.8955 0.8134 0.9004
+1.769 2.474 0.9676 0.8134 0.8776
+1.778 2.487 1.032 0.8134 0.8525
+1.789 2.502 1.087 0.8134 0.8253
+1.802 2.52 1.134 0.8134 0.7961
+1.816 2.54 1.171 0.8134 0.7648
+1.832 2.562 1.199 0.8134 0.7317
+1.85 2.587 1.217 0.8134 0.6967
+1.87 2.615 1.225 0.8134 0.66
+1.891 2.645 1.224 0.8134 0.6216
+1.914 2.677 1.214 0.8134 0.5817
+1.938 2.711 1.193 0.8134 0.5403
+1.964 2.747 1.164 0.8134 0.4976
+1.991 2.784 1.127 0.8134 0.4536
+2.019 2.823 1.081 0.8134 0.4085
+2.047 2.863 1.027 0.8134 0.3624
+2.077 2.904 0.9662 0.8134 0.3153
+2.106 2.945 0.8991 0.8134 0.2675
+2.136 2.987 0.8263 0.8134 0.219
+2.166 3.028 0.7486 0.8134 0.17
+2.195 3.069 0.6668 0.8134 0.1205
+2.223 3.109 0.5817 0.8134 0.07074
+2.251 3.148 0.4942 0.8134 0.02079
+2.278 3.185 0.4052 0.8134 -0.0292
+2.303 3.22 0.3156 0.8134 -0.07912
+2.326 3.253 0.2263 0.8134 -0.1288
+2.347 3.283 0.1381 0.8134 -0.1782
+2.367 3.309 0.05185 0.8134 -0.2272
+2.383 3.333 -0.03155 0.8134 -0.2756
+2.397 3.352 -0.1113 0.8134 -0.3233
+2.409 3.368 -0.1868 0.8134 -0.3702
+2.417 3.38 -0.2572 0.8134 -0.4161
+2.422 3.387 -0.3219 0.8134 -0.4611
+2.423 3.389 -0.3803 0.8134 -0.5048
+2.422 3.386 -0.432 0.8134 -0.5474
+2.416 3.379 -0.4765 0.8134 -0.5885
+2.408 3.367 -0.5135 0.8134 -0.6282
+2.395 3.349 -0.5426 0.8134 -0.6663
+2.379 3.327 -0.5638 0.8134 -0.7027
+2.359 3.299 -0.577 0.8134 -0.7374
+2.336 3.267 -0.582 0.8134 -0.7702
+2.31 3.23 -0.5791 0.8134 -0.8011
+2.28 3.188 -0.5683 0.8134 -0.8301
+2.247 3.142 -0.5499 0.8134 -0.8569
+2.211 3.091 -0.5243 0.8134 -0.8816
+2.172 3.037 -0.4918 0.8134 -0.9041
+2.13 2.979 -0.4529 0.8134 -0.9243
+2.086 2.917 -0.4082 0.8134 -0.9422
+2.04 2.853 -0.3582 0.8134 -0.9578
+1.992 2.786 -0.3037 0.8134 -0.971
+1.943 2.717 -0.2454 0.8134 -0.9817
+1.892 2.646 -0.1839 0.8134 -0.99
+1.841 2.574 -0.1202 0.8134 -0.9958
+1.789 2.501 -0.05487 0.8134 -0.9991
+1.736 2.428 0.01111 0.8134 -1
+1.684 2.355 0.07695 0.8134 -0.9983
+1.632 2.282 0.1418 0.8134 -0.9941
+1.581 2.21 0.2049 0.8134 -0.9875
+1.53 2.14 0.2654 0.8134 -0.9784
+1.481 2.072 0.3225 0.8134 -0.9668
+1.434 2.005 0.3756 0.8134 -0.9528
+1.389 1.942 0.4238 0.8134 -0.9365
+1.346 1.882 0.4666 0.8134 -0.9178
+1.305 1.825 0.5034 0.8134 -0.8968
+1.267 1.772 0.5337 0.8134 -0.8735
+1.232 1.723 0.5569 0.8134 -0.8481
+1.2 1.678 0.5728 0.8134 -0.8206
+1.171 1.638 0.5809 0.8134 -0.791
+1.146 1.602 0.5812 0.8134 -0.7594
+1.124 1.571 0.5735 0.8134 -0.7259
+1.105 1.546 0.5576 0.8134 -0.6907
+1.09 1.525 0.5337 0.8134 -0.6536
+1.079 1.509 0.5019 0.8134 -0.615
+1.072 1.498 0.4624 0.8134 -0.5748
+1.067 1.493 0.4154 0.8134 -0.5332
+1.067 1.492 0.3614 0.8134 -0.4903
+1.07 1.496 0.3008 0.8134 -0.4461
+1.076 1.504 0.2341 0.8134 -0.4008
+1.085 1.517 0.1619 0.8134 -0.3545
+1.097 1.534 0.08496 0.8134 -0.3073
+1.112 1.555 0.003869 0.8134 -0.2594
+1.13 1.58 -0.08057 0.8134 -0.2108
+1.15 1.608 -0.1675 0.8134 -0.1617
+1.172 1.639 -0.2562 0.8134 -0.1122
+1.196 1.672 -0.3458 0.8134 -0.06235
+1.221 1.708 -0.4353 0.8134 -0.01239
+1.248 1.745 -0.5238 0.8134 0.0376
+1.276 1.785 -0.6106 0.8134 0.0875
+1.305 1.825 -0.6947 0.8134 0.1372
+1.334 1.866 -0.7752 0.8134 0.1865
+1.364 1.907 -0.8514 0.8134 0.2354
+1.394 1.949 -0.9223 0.8134 0.2837
+1.423 1.99 -0.9874 0.8134 0.3312
+1.452 2.031 -1.046 0.8134 0.378
+1.481 2.071 -1.097 0.8134 0.4238
+1.508 2.109 -1.14 0.8134 0.4685
+1.535 2.146 -1.175 0.8134 0.5121
+1.56 2.181 -1.201 0.8134 0.5544
+1.584 2.215 -1.218 0.8134 0.5953
+1.606 2.246 -1.226 0.8134 0.6347
+1.627 2.275 -1.224 0.8134 0.6725
+1.646 2.302 -1.212 0.8134 0.7087
+1.663 2.326 -1.191 0.8134 0.743
+1.679 2.348 -1.159 0.8134 0.7756
+1.693 2.367 -1.119 0.8134 0.8061
+1.705 2.384 -1.069 0.8134 0.8347
+1.715 2.398 -1.011 0.8134 0.8612
+1.724 2.41 -0.9442 0.8134 0.8855
+1.731 2.42 -0.8696 0.8134 0.9076
+1.736 2.428 -0.7877 0.8134 0.9275
+1.74 2.434 -0.6993 0.8134 0.945
+1.743 2.438 -0.605 0.8134 0.9602
+1.745 2.44 -0.5055 0.8134 0.9729
+1.746 2.442 -0.4019 0.8134 0.9833
+1.746 2.442 -0.2948 0.8134 0.9911
+1.746 2.442 -0.1853 0.8134 0.9965
+1.746 2.441 -0.07415 0.8134 0.9994
+1.621 2.524 0 0.8415 1
+1.619 2.521 0.1116 0.8415 0.9988
+1.617 2.518 0.2222 0.8415 0.995
+1.615 2.516 0.331 0.8415 0.9888
+1.614 2.514 0.437 0.8415 0.9801
+1.614 2.514 0.5393 0.8415 0.9689
+1.615 2.515 0.6372 0.8415 0.9553
+1.617 2.518 0.7297 0.8415 0.9394
+1.62 2.523 0.8162 0.8415 0.9211
+1.624 2.53 0.896 0.8415 0.9004
+1.63 2.539 0.9683 0.8415 0.8776
+1.638 2.551 1.033 0.8415 0.8525
+1.647 2.565 1.089 0.8415 0.8253
+1.658 2.583 1.136 0.8415 0.7961
+1.671 2.603 1.174 0.8415 0.7648
+1.686 2.625 1.202 0.8415 0.7317
+1.702 2.651 1.221 0.8415 0.6967
+1.72 2.679 1.23 0.8415 0.66
+1.74 2.71 1.23 0.8415 0.6216
+1.761 2.743 1.22 0.8415 0.5817
+1.784 2.779 1.201 0.8415 0.5403
+1.809 2.817 1.173 0.8415 0.4976
+1.834 2.856 1.137 0.8415 0.4536
+1.861 2.898 1.092 0.8415 0.4085
+1.888 2.94 1.04 0.8415 0.3624
+1.916 2.984 0.9802 0.8415 0.3153
+1.944 3.028 0.9143 0.8415 0.2675
+1.973 3.073 0.8428 0.8415 0.219
+2.001 3.117 0.7664 0.8415 0.17
+2.03 3.161 0.6859 0.8415 0.1205
+2.057 3.204 0.6021 0.8415 0.07074
+2.084 3.246 0.5158 0.8415 0.02079
+2.11 3.286 0.428 0.8415 -0.0292
+2.134 3.324 0.3395 0.8415 -0.07912
+2.157 3.36 0.2512 0.8415 -0.1288
+2.178 3.393 0.1639 0.8415 -0.1782
+2.197 3.422 0.07854 0.8415 -0.2272
+2.214 3.448 -0.004115 0.8415 -0.2756
+2.228 3.47 -0.08328 0.8415 -0.3233
+2.24 3.488 -0.1582 0.8415 -0.3702
+2.248 3.501 -0.2282 0.8415 -0.4161
+2.254 3.51 -0.2927 0.8415 -0.4611
+2.256 3.513 -0.351 0.8415 -0.5048
+2.255 3.512 -0.4028 0.8415 -0.5474
+2.251 3.505 -0.4475 0.8415 -0.5885
+2.243 3.493 -0.4848 0.8415 -0.6282
+2.232 3.476 -0.5145 0.8415 -0.6663
+2.217 3.453 -0.5364 0.8415 -0.7027
+2.199 3.425 -0.5504 0.8415 -0.7374
+2.178 3.392 -0.5564 0.8415 -0.7702
+2.153 3.353 -0.5546 0.8415 -0.8011
+2.125 3.31 -0.5451 0.8415 -0.8301
+2.094 3.261 -0.5282 0.8415 -0.8569
+2.06 3.209 -0.5041 0.8415 -0.8816
+2.024 3.152 -0.4733 0.8415 -0.9041
+1.985 3.091 -0.4362 0.8415 -0.9243
+1.943 3.026 -0.3934 0.8415 -0.9422
+1.9 2.959 -0.3454 0.8415 -0.9578
+1.855 2.889 -0.293 0.8415 -0.971
+1.808 2.816 -0.2368 0.8415 -0.9817
+1.76 2.741 -0.1776 0.8415 -0.99
+1.711 2.665 -0.116 0.8415 -0.9958
+1.662 2.589 -0.05298 0.8415 -0.9991
+1.613 2.511 0.01072 0.8415 -1
+1.563 2.434 0.0743 0.8415 -0.9983
+1.514 2.358 0.1369 0.8415 -0.9941
+1.465 2.282 0.1978 0.8415 -0.9875
+1.418 2.208 0.2561 0.8415 -0.9784
+1.372 2.136 0.3111 0.8415 -0.9668
+1.327 2.067 0.3621 0.8415 -0.9528
+1.284 2 0.4084 0.8415 -0.9365
+1.244 1.937 0.4493 0.8415 -0.9178
+1.205 1.877 0.4844 0.8415 -0.8968
+1.17 1.822 0.513 0.8415 -0.8735
+1.137 1.771 0.5347 0.8415 -0.8481
+1.107 1.724 0.5492 0.8415 -0.8206
+1.08 1.682 0.5561 0.8415 -0.791
+1.056 1.645 0.5553 0.8415 -0.7594
+1.036 1.614 0.5466 0.8415 -0.7259
+1.019 1.587 0.5299 0.8415 -0.6907
+1.006 1.566 0.5054 0.8415 -0.6536
+0.9958 1.551 0.4731 0.8415 -0.615
+0.9892 1.541 0.4333 0.8415 -0.5748
+0.9861 1.536 0.3861 0.8415 -0.5332
+0.9863 1.536 0.3321 0.8415 -0.4903
+0.9897 1.541 0.2717 0.8415 -0.4461
+0.9963 1.552 0.2053 0.8415 -0.4008
+1.006 1.566 0.1335 0.8415 -0.3545
+1.018 1.586 0.05709 0.8415 -0.3073
+1.033 1.609 -0.02333 0.8415 -0.2594
+1.051 1.636 -0.107 0.8415 -0.2108
+1.07 1.667 -0.1931 0.8415 -0.1617
+1.092 1.701 -0.2808 0.8415 -0.1122
+1.115 1.737 -0.3693 0.8415 -0.06235
+1.14 1.776 -0.4576 0.8415 -0.01239
+1.167 1.817 -0.545 0.8415 0.0376
+1.194 1.859 -0.6306 0.8415 0.0875
+1.222 1.903 -0.7134 0.8415 0.1372
+1.25 1.947 -0.7926 0.8415 0.1865
+1.279 1.991 -0.8675 0.8415 0.2354
+1.307 2.036 -0.9372 0.8415 0.2837
+1.335 2.08 -1.001 0.8415 0.3312
+1.363 2.123 -1.058 0.8415 0.378
+1.39 2.165 -1.108 0.8415 0.4238
+1.416 2.206 -1.15 0.8415 0.4685
+1.442 2.245 -1.184 0.8415 0.5121
+1.465 2.282 -1.209 0.8415 0.5544
+1.488 2.317 -1.225 0.8415 0.5953
+1.509 2.349 -1.231 0.8415 0.6347
+1.528 2.379 -1.228 0.8415 0.6725
+1.545 2.407 -1.216 0.8415 0.7087
+1.561 2.431 -1.194 0.8415 0.743
+1.575 2.453 -1.162 0.8415 0.7756
+1.587 2.472 -1.121 0.8415 0.8061
+1.598 2.489 -1.071 0.8415 0.8347
+1.607 2.502 -1.012 0.8415 0.8612
+1.614 2.513 -0.9448 0.8415 0.8855
+1.619 2.522 -0.8699 0.8415 0.9076
+1.623 2.528 -0.7879 0.8415 0.9275
+1.626 2.532 -0.6993 0.8415 0.945
+1.627 2.535 -0.6048 0.8415 0.9602
+1.628 2.535 -0.5054 0.8415 0.9729
+1.627 2.534 -0.4017 0.8415 0.9833
+1.626 2.533 -0.2947 0.8415 0.9911
+1.624 2.53 -0.1852 0.8415 0.9965
+1.622 2.527 -0.07411 0.8415 0.9994
+1.493 2.602 0 0.8674 1
+1.489 2.596 0.1114 0.8674 0.9988
+1.486 2.591 0.222 0.8674 0.995
+1.483 2.586 0.3306 0.8674 0.9888
+1.481 2.582 0.4365 0.8674 0.9801
+1.48 2.58 0.5389 0.8674 0.9689
+1.479 2.579 0.6367 0.8674 0.9553
+1.48 2.58 0.7293 0.8674 0.9394
+1.481 2.583 0.8159 0.8674 0.9211
+1.485 2.588 0.8958 0.8674 0.9004
+1.489 2.596 0.9684 0.8674 0.8776
+1.496 2.607 1.033 0.8674 0.8525
+1.503 2.621 1.09 0.8674 0.8253
+1.513 2.638 1.137 0.8674 0.7961
+1.524 2.657 1.176 0.8674 0.7648
+1.537 2.68 1.205 0.8674 0.7317
+1.552 2.706 1.225 0.8674 0.6967
+1.569 2.735 1.235 0.8674 0.66
+1.587 2.767 1.235 0.8674 0.6216
+1.607 2.801 1.227 0.8674 0.5817
+1.628 2.839 1.209 0.8674 0.5403
+1.651 2.878 1.182 0.8674 0.4976
+1.675 2.92 1.146 0.8674 0.4536
+1.7 2.963 1.103 0.8674 0.4085
+1.726 3.008 1.052 0.8674 0.3624
+1.752 3.054 0.9935 0.8674 0.3153
+1.779 3.101 0.929 0.8674 0.2675
+1.806 3.149 0.8589 0.8674 0.219
+1.833 3.196 0.7838 0.8674 0.17
+1.86 3.243 0.7046 0.8674 0.1205
+1.887 3.29 0.6221 0.8674 0.07074
+1.913 3.335 0.5371 0.8674 0.02079
+1.938 3.378 0.4505 0.8674 -0.0292
+1.961 3.419 0.3631 0.8674 -0.07912
+1.983 3.458 0.2759 0.8674 -0.1288
+2.004 3.493 0.1896 0.8674 -0.1782
+2.022 3.526 0.1052 0.8674 -0.2272
+2.039 3.554 0.02332 0.8674 -0.2756
+2.053 3.579 -0.05516 0.8674 -0.3233
+2.064 3.599 -0.1295 0.8674 -0.3702
+2.073 3.614 -0.1991 0.8674 -0.4161
+2.079 3.624 -0.2633 0.8674 -0.4611
+2.082 3.629 -0.3215 0.8674 -0.5048
+2.082 3.629 -0.3733 0.8674 -0.5474
+2.078 3.623 -0.4182 0.8674 -0.5885
+2.072 3.611 -0.4559 0.8674 -0.6282
+2.062 3.594 -0.4861 0.8674 -0.6663
+2.048 3.571 -0.5087 0.8674 -0.7027
+2.032 3.542 -0.5235 0.8674 -0.7374
+2.012 3.508 -0.5305 0.8674 -0.7702
+1.99 3.468 -0.5298 0.8674 -0.8011
+1.964 3.423 -0.5216 0.8674 -0.8301
+1.935 3.373 -0.5061 0.8674 -0.8569
+1.904 3.318 -0.4836 0.8674 -0.8816
+1.869 3.259 -0.4545 0.8674 -0.9041
+1.833 3.195 -0.4192 0.8674 -0.9243
+1.794 3.128 -0.3783 0.8674 -0.9422
+1.754 3.057 -0.3324 0.8674 -0.9578
+1.712 2.984 -0.2821 0.8674 -0.971
+1.668 2.908 -0.2281 0.8674 -0.9817
+1.623 2.83 -0.1711 0.8674 -0.99
+1.578 2.75 -0.1118 0.8674 -0.9958
+1.531 2.67 -0.05106 0.8674 -0.9991
+1.485 2.589 0.01034 0.8674 -1
+1.439 2.508 0.07159 0.8674 -0.9983
+1.392 2.428 0.1319 0.8674 -0.9941
+1.347 2.348 0.1905 0.8674 -0.9875
+1.303 2.271 0.2466 0.8674 -0.9784
+1.259 2.196 0.2995 0.8674 -0.9668
+1.218 2.123 0.3484 0.8674 -0.9528
+1.178 2.053 0.3927 0.8674 -0.9365
+1.14 1.987 0.4317 0.8674 -0.9178
+1.104 1.925 0.465 0.8674 -0.8968
+1.071 1.867 0.4919 0.8674 -0.8735
+1.04 1.814 0.5121 0.8674 -0.8481
+1.013 1.765 0.5252 0.8674 -0.8206
+0.9879 1.722 0.5309 0.8674 -0.791
+0.9661 1.684 0.529 0.8674 -0.7594
+0.9476 1.652 0.5193 0.8674 -0.7259
+0.9322 1.625 0.5019 0.8674 -0.6907
+0.9201 1.604 0.4768 0.8674 -0.6536
+0.9113 1.589 0.444 0.8674 -0.615
+0.9058 1.579 0.4039 0.8674 -0.5748
+0.9035 1.575 0.3567 0.8674 -0.5332
+0.9043 1.577 0.3027 0.8674 -0.4903
+0.9082 1.583 0.2424 0.8674 -0.4461
+0.9151 1.595 0.1763 0.8674 -0.4008
+0.9248 1.612 0.105 0.8674 -0.3545
+0.9371 1.634 0.02919 0.8674 -0.3073
+0.9519 1.66 -0.05051 0.8674 -0.2594
+0.969 1.689 -0.1333 0.8674 -0.2108
+0.9882 1.723 -0.2185 0.8674 -0.1617
+1.009 1.759 -0.3052 0.8674 -0.1122
+1.032 1.799 -0.3925 0.8674 -0.06235
+1.056 1.841 -0.4797 0.8674 -0.01239
+1.081 1.885 -0.5659 0.8674 0.0376
+1.107 1.93 -0.6501 0.8674 0.0875
+1.134 1.977 -0.7316 0.8674 0.1372
+1.161 2.024 -0.8095 0.8674 0.1865
+1.188 2.072 -0.883 0.8674 0.2354
+1.216 2.119 -0.9514 0.8674 0.2837
+1.242 2.166 -1.014 0.8674 0.3312
+1.269 2.212 -1.07 0.8674 0.378
+1.294 2.256 -1.118 0.8674 0.4238
+1.319 2.299 -1.159 0.8674 0.4685
+1.342 2.34 -1.192 0.8674 0.5121
+1.365 2.379 -1.216 0.8674 0.5544
+1.385 2.415 -1.231 0.8674 0.5953
+1.405 2.449 -1.236 0.8674 0.6347
+1.422 2.48 -1.232 0.8674 0.6725
+1.438 2.507 -1.219 0.8674 0.7087
+1.453 2.532 -1.196 0.8674 0.743
+1.465 2.554 -1.164 0.8674 0.7756
+1.476 2.573 -1.122 0.8674 0.8061
+1.485 2.589 -1.072 0.8674 0.8347
+1.492 2.601 -1.012 0.8674 0.8612
+1.498 2.611 -0.9449 0.8674 0.8855
+1.502 2.618 -0.8698 0.8674 0.9076
+1.505 2.623 -0.7875 0.8674 0.9275
+1.506 2.626 -0.6988 0.8674 0.945
+1.506 2.626 -0.6044 0.8674 0.9602
+1.505 2.624 -0.5049 0.8674 0.9729
+1.504 2.621 -0.4013 0.8674 0.9833
+1.501 2.617 -0.2943 0.8674 0.9911
+1.498 2.612 -0.1849 0.8674 0.9965
+1.495 2.606 -0.07402 0.8674 0.9994
+1.361 2.674 0 0.8912 1
+1.356 2.665 0.1112 0.8912 0.9988
+1.352 2.657 0.2216 0.8912 0.995
+1.349 2.65 0.33 0.8912 0.9888
+1.345 2.643 0.4358 0.8912 0.9801
+1.343 2.638 0.538 0.8912 0.9689
+1.341 2.635 0.6358 0.8912 0.9553
+1.341 2.634 0.7284 0.8912 0.9394
+1.341 2.635 0.8151 0.8912 0.9211
+1.343 2.639 0.8952 0.8912 0.9004
+1.347 2.646 0.968 0.8912 0.8776
+1.352 2.656 1.033 0.8912 0.8525
+1.358 2.668 1.09 0.8912 0.8253
+1.366 2.685 1.138 0.8912 0.7961
+1.376 2.704 1.177 0.8912 0.7648
+1.388 2.727 1.207 0.8912 0.7317
+1.401 2.753 1.227 0.8912 0.6967
+1.416 2.782 1.238 0.8912 0.66
+1.433 2.815 1.24 0.8912 0.6216
+1.451 2.851 1.232 0.8912 0.5817
+1.471 2.889 1.215 0.8912 0.5403
+1.492 2.931 1.189 0.8912 0.4976
+1.514 2.974 1.155 0.8912 0.4536
+1.537 3.02 1.113 0.8912 0.4085
+1.561 3.067 1.063 0.8912 0.3624
+1.586 3.116 1.006 0.8912 0.3153
+1.611 3.166 0.9431 0.8912 0.2675
+1.637 3.216 0.8743 0.8912 0.219
+1.662 3.266 0.8007 0.8912 0.17
+1.688 3.316 0.7228 0.8912 0.1205
+1.713 3.366 0.6417 0.8912 0.07074
+1.738 3.414 0.558 0.8912 0.02079
+1.761 3.46 0.4727 0.8912 -0.0292
+1.784 3.504 0.3866 0.8912 -0.07912
+1.805 3.546 0.3005 0.8912 -0.1288
+1.824 3.585 0.2153 0.8912 -0.1782
+1.842 3.62 0.1318 0.8912 -0.2272
+1.858 3.651 0.05075 0.8912 -0.2756
+1.872 3.678 -0.027 0.8912 -0.3233
+1.883 3.7 -0.1008 0.8912 -0.3702
+1.892 3.717 -0.1699 0.8912 -0.4161
+1.898 3.729 -0.2338 0.8912 -0.4611
+1.901 3.735 -0.2919 0.8912 -0.5048
+1.902 3.736 -0.3436 0.8912 -0.5474
+1.899 3.731 -0.3887 0.8912 -0.5885
+1.893 3.72 -0.4267 0.8912 -0.6282
+1.885 3.703 -0.4574 0.8912 -0.6663
+1.873 3.68 -0.4806 0.8912 -0.7027
+1.858 3.651 -0.4962 0.8912 -0.7374
+1.84 3.616 -0.5042 0.8912 -0.7702
+1.82 3.575 -0.5047 0.8912 -0.8011
+1.796 3.529 -0.4978 0.8912 -0.8301
+1.77 3.477 -0.4837 0.8912 -0.8569
+1.741 3.42 -0.4628 0.8912 -0.8816
+1.709 3.358 -0.4354 0.8912 -0.9041
+1.676 3.292 -0.402 0.8912 -0.9243
+1.64 3.222 -0.3631 0.8912 -0.9422
+1.603 3.149 -0.3192 0.8912 -0.9578
+1.563 3.072 -0.271 0.8912 -0.971
+1.523 2.992 -0.2192 0.8912 -0.9817
+1.482 2.911 -0.1644 0.8912 -0.99
+1.439 2.828 -0.1075 0.8912 -0.9958
+1.397 2.744 -0.0491 0.8912 -0.9991
+1.354 2.659 0.00994 0.8912 -1
+1.311 2.575 0.06885 0.8912 -0.9983
+1.268 2.491 0.1268 0.8912 -0.9941
+1.226 2.409 0.1831 0.8912 -0.9875
+1.185 2.328 0.237 0.8912 -0.9784
+1.145 2.249 0.2877 0.8912 -0.9668
+1.106 2.174 0.3345 0.8912 -0.9528
+1.069 2.101 0.3767 0.8912 -0.9365
+1.034 2.032 0.4139 0.8912 -0.9178
+1.001 1.968 0.4453 0.8912 -0.8968
+0.9709 1.908 0.4706 0.8912 -0.8735
+0.9428 1.852 0.4892 0.8912 -0.8481
+0.9174 1.802 0.5009 0.8912 -0.8206
+0.8947 1.758 0.5054 0.8912 -0.791
+0.8749 1.719 0.5024 0.8912 -0.7594
+0.8581 1.686 0.4918 0.8912 -0.7259
+0.8443 1.659 0.4736 0.8912 -0.6907
+0.8336 1.638 0.4479 0.8912 -0.6536
+0.8259 1.623 0.4147 0.8912 -0.615
+0.8213 1.614 0.3743 0.8912 -0.5748
+0.8198 1.611 0.3269 0.8912 -0.5332
+0.8211 1.613 0.273 0.8912 -0.4903
+0.8254 1.622 0.2129 0.8912 -0.4461
+0.8324 1.635 0.1472 0.8912 -0.4008
+0.842 1.654 0.07646 0.8912 -0.3545
+0.8541 1.678 0.001266 0.8912 -0.3073
+0.8685 1.706 -0.07766 0.8912 -0.2594
+0.8851 1.739 -0.1596 0.8912 -0.2108
+0.9035 1.775 -0.2438 0.8912 -0.1617
+0.9237 1.815 -0.3294 0.8912 -0.1122
+0.9453 1.857 -0.4156 0.8912 -0.06235
+0.9682 1.902 -0.5015 0.8912 -0.01239
+0.9922 1.949 -0.5864 0.8912 0.0376
+1.017 1.998 -0.6693 0.8912 0.0875
+1.042 2.048 -0.7494 0.8912 0.1372
+1.068 2.098 -0.8259 0.8912 0.1865
+1.093 2.148 -0.8981 0.8912 0.2354
+1.119 2.198 -0.965 0.8912 0.2837
+1.144 2.248 -1.026 0.8912 0.3312
+1.169 2.296 -1.081 0.8912 0.378
+1.193 2.343 -1.128 0.8912 0.4238
+1.215 2.388 -1.168 0.8912 0.4685
+1.237 2.431 -1.199 0.8912 0.5121
+1.258 2.471 -1.222 0.8912 0.5544
+1.277 2.509 -1.236 0.8912 0.5953
+1.295 2.543 -1.24 0.8912 0.6347
+1.311 2.575 -1.235 0.8912 0.6725
+1.325 2.603 -1.221 0.8912 0.7087
+1.338 2.628 -1.198 0.8912 0.743
+1.349 2.65 -1.165 0.8912 0.7756
+1.358 2.668 -1.123 0.8912 0.8061
+1.366 2.683 -1.072 0.8912 0.8347
+1.372 2.695 -1.012 0.8912 0.8612
+1.376 2.704 -0.9443 0.8912 0.8855
+1.379 2.71 -0.869 0.8912 0.9076
+1.381 2.713 -0.7867 0.8912 0.9275
+1.381 2.713 -0.6979 0.8912 0.945
+1.38 2.711 -0.6035 0.8912 0.9602
+1.378 2.708 -0.5041 0.8912 0.9729
+1.375 2.702 -0.4006 0.8912 0.9833
+1.372 2.695 -0.2938 0.8912 0.9911
+1.368 2.688 -0.1846 0.8912 0.9965
+1.364 2.679 -0.07388 0.8912 0.9994
+1.225 2.738 0 0.9128 1
+1.22 2.727 0.111 0.9128 0.9988
+1.216 2.716 0.221 0.9128 0.995
+1.211 2.706 0.3293 0.9128 0.9888
+1.207 2.697 0.4348 0.9128 0.9801
+1.204 2.69 0.5369 0.9128 0.9689
+1.201 2.684 0.6346 0.9128 0.9553
+1.2 2.681 0.7271 0.9128 0.9394
+1.2 2.68 0.8138 0.9128 0.9211
+1.201 2.683 0.8939 0.9128 0.9004
+1.203 2.688 0.9669 0.9128 0.8776
+1.207 2.696 1.032 0.9128 0.8525
+1.212 2.708 1.089 0.9128 0.8253
+1.219 2.724 1.138 0.9128 0.7961
+1.227 2.743 1.177 0.9128 0.7648
+1.238 2.765 1.208 0.9128 0.7317
+1.249 2.792 1.229 0.9128 0.6967
+1.263 2.822 1.241 0.9128 0.66
+1.278 2.855 1.243 0.9128 0.6216
+1.294 2.892 1.236 0.9128 0.5817
+1.312 2.931 1.221 0.9128 0.5403
+1.331 2.974 1.196 0.9128 0.4976
+1.351 3.02 1.163 0.9128 0.4536
+1.373 3.067 1.122 0.9128 0.4085
+1.395 3.117 1.074 0.9128 0.3624
+1.418 3.168 1.018 0.9128 0.3153
+1.441 3.22 0.9566 0.9128 0.2675
+1.465 3.274 0.8893 0.9128 0.219
+1.489 3.327 0.817 0.9128 0.17
+1.513 3.38 0.7406 0.9128 0.1205
+1.536 3.432 0.6609 0.9128 0.07074
+1.559 3.483 0.5786 0.9128 0.02079
+1.581 3.533 0.4946 0.9128 -0.0292
+1.602 3.58 0.4098 0.9128 -0.07912
+1.622 3.625 0.3249 0.9128 -0.1288
+1.641 3.666 0.2408 0.9128 -0.1782
+1.658 3.704 0.1583 0.9128 -0.2272
+1.673 3.738 0.07814 0.9128 -0.2756
+1.686 3.767 0.001164 0.9128 -0.3233
+1.697 3.791 -0.07197 0.9128 -0.3702
+1.705 3.81 -0.1406 0.9128 -0.4161
+1.711 3.824 -0.2041 0.9128 -0.4611
+1.715 3.832 -0.262 0.9128 -0.5048
+1.716 3.834 -0.3137 0.9128 -0.5474
+1.714 3.83 -0.3589 0.9128 -0.5885
+1.709 3.82 -0.3972 0.9128 -0.6282
+1.702 3.803 -0.4284 0.9128 -0.6663
+1.691 3.78 -0.4522 0.9128 -0.7027
+1.678 3.75 -0.4686 0.9128 -0.7374
+1.662 3.714 -0.4776 0.9128 -0.7702
+1.644 3.673 -0.4793 0.9128 -0.8011
+1.622 3.625 -0.4736 0.9128 -0.8301
+1.598 3.572 -0.461 0.9128 -0.8569
+1.572 3.513 -0.4417 0.9128 -0.8816
+1.544 3.449 -0.4161 0.9128 -0.9041
+1.513 3.381 -0.3845 0.9128 -0.9243
+1.481 3.308 -0.3476 0.9128 -0.9422
+1.446 3.232 -0.3058 0.9128 -0.9578
+1.411 3.152 -0.2598 0.9128 -0.971
+1.374 3.07 -0.2102 0.9128 -0.9817
+1.336 2.985 -0.1577 0.9128 -0.99
+1.297 2.899 -0.1031 0.9128 -0.9958
+1.258 2.811 -0.04711 0.9128 -0.9991
+1.219 2.724 0.009538 0.9128 -1
+1.18 2.636 0.06606 0.9128 -0.9983
+1.141 2.549 0.1217 0.9128 -0.9941
+1.102 2.463 0.1757 0.9128 -0.9875
+1.065 2.379 0.2272 0.9128 -0.9784
+1.028 2.297 0.2757 0.9128 -0.9668
+0.9929 2.219 0.3203 0.9128 -0.9528
+0.9593 2.143 0.3606 0.9128 -0.9365
+0.9274 2.072 0.3958 0.9128 -0.9178
+0.8975 2.005 0.4254 0.9128 -0.8968
+0.8697 1.943 0.4489 0.9128 -0.8735
+0.8442 1.886 0.466 0.9128 -0.8481
+0.8212 1.835 0.4763 0.9128 -0.8206
+0.8007 1.789 0.4795 0.9128 -0.791
+0.7829 1.749 0.4754 0.9128 -0.7594
+0.7679 1.716 0.4639 0.9128 -0.7259
+0.7556 1.688 0.445 0.9128 -0.6907
+0.7462 1.667 0.4187 0.9128 -0.6536
+0.7397 1.653 0.3851 0.9128 -0.615
+0.736 1.645 0.3444 0.9128 -0.5748
+0.735 1.642 0.297 0.9128 -0.5332
+0.7368 1.646 0.2432 0.9128 -0.4903
+0.7413 1.656 0.1834 0.9128 -0.4461
+0.7483 1.672 0.1181 0.9128 -0.4008
+0.7576 1.693 0.04784 0.9128 -0.3545
+0.7693 1.719 -0.02666 0.9128 -0.3073
+0.7831 1.75 -0.1048 0.9128 -0.2594
+0.7988 1.785 -0.1858 0.9128 -0.2108
+0.8163 1.824 -0.2689 0.9128 -0.1617
+0.8353 1.866 -0.3534 0.9128 -0.1122
+0.8557 1.912 -0.4383 0.9128 -0.06235
+0.8772 1.96 -0.523 0.9128 -0.01239
+0.8996 2.01 -0.6065 0.9128 0.0376
+0.9227 2.062 -0.688 0.9128 0.0875
+0.9463 2.114 -0.7668 0.9128 0.1372
+0.9701 2.168 -0.8418 0.9128 0.1865
+0.9939 2.221 -0.9125 0.9128 0.2354
+1.018 2.274 -0.978 0.9128 0.2837
+1.041 2.326 -1.038 0.9128 0.3312
+1.064 2.377 -1.091 0.9128 0.378
+1.086 2.426 -1.137 0.9128 0.4238
+1.107 2.473 -1.175 0.9128 0.4685
+1.126 2.517 -1.205 0.9128 0.5121
+1.145 2.559 -1.227 0.9128 0.5544
+1.163 2.598 -1.24 0.9128 0.5953
+1.178 2.633 -1.243 0.9128 0.6347
+1.193 2.666 -1.238 0.9128 0.6725
+1.206 2.694 -1.223 0.9128 0.7087
+1.217 2.719 -1.199 0.9128 0.743
+1.227 2.741 -1.165 0.9128 0.7756
+1.235 2.759 -1.122 0.9128 0.8061
+1.241 2.773 -1.071 0.9128 0.8347
+1.246 2.784 -1.011 0.9128 0.8612
+1.249 2.791 -0.9432 0.9128 0.8855
+1.251 2.795 -0.8677 0.9128 0.9076
+1.251 2.796 -0.7853 0.9128 0.9275
+1.251 2.795 -0.6966 0.9128 0.945
+1.249 2.791 -0.6022 0.9128 0.9602
+1.246 2.784 -0.503 0.9128 0.9729
+1.243 2.777 -0.3997 0.9128 0.9833
+1.238 2.767 -0.2931 0.9128 0.9911
+1.234 2.757 -0.1842 0.9128 0.9965
+1.229 2.746 -0.0737 0.9128 0.9994
+1.087 2.796 0 0.932 1
+1.082 2.782 0.1106 0.932 0.9988
+1.076 2.768 0.2203 0.932 0.995
+1.071 2.756 0.3283 0.932 0.9888
+1.067 2.744 0.4336 0.932 0.9801
+1.063 2.734 0.5354 0.932 0.9689
+1.06 2.726 0.6329 0.932 0.9553
+1.058 2.721 0.7253 0.932 0.9394
+1.057 2.718 0.8119 0.932 0.9211
+1.057 2.718 0.8921 0.932 0.9004
+1.058 2.722 0.9652 0.932 0.8776
+1.061 2.729 1.031 0.932 0.8525
+1.065 2.74 1.088 0.932 0.8253
+1.071 2.755 1.137 0.932 0.7961
+1.078 2.773 1.177 0.932 0.7648
+1.087 2.796 1.208 0.932 0.7317
+1.097 2.822 1.23 0.932 0.6967
+1.109 2.852 1.243 0.932 0.66
+1.122 2.886 1.246 0.932 0.6216
+1.137 2.924 1.24 0.932 0.5817
+1.153 2.965 1.226 0.932 0.5403
+1.17 3.009 1.202 0.932 0.4976
+1.188 3.056 1.17 0.932 0.4536
+1.207 3.106 1.131 0.932 0.4085
+1.228 3.158 1.084 0.932 0.3624
+1.248 3.211 1.03 0.932 0.3153
+1.27 3.266 0.9695 0.932 0.2675
+1.291 3.322 0.9037 0.932 0.219
+1.313 3.378 0.8329 0.932 0.17
+1.335 3.434 0.758 0.932 0.1205
+1.357 3.489 0.6797 0.932 0.07074
+1.378 3.543 0.5988 0.932 0.02079
+1.398 3.596 0.5162 0.932 -0.0292
+1.417 3.646 0.4327 0.932 -0.07912
+1.436 3.693 0.349 0.932 -0.1288
+1.453 3.738 0.2661 0.932 -0.1782
+1.469 3.778 0.1846 0.932 -0.2272
+1.483 3.814 0.1055 0.932 -0.2756
+1.495 3.846 0.02933 0.932 -0.3233
+1.506 3.873 -0.04311 0.932 -0.3702
+1.514 3.894 -0.1112 0.932 -0.4161
+1.52 3.909 -0.1743 0.932 -0.4611
+1.524 3.919 -0.2319 0.932 -0.5048
+1.525 3.922 -0.2836 0.932 -0.5474
+1.524 3.919 -0.3289 0.932 -0.5885
+1.52 3.909 -0.3675 0.932 -0.6282
+1.513 3.893 -0.3991 0.932 -0.6663
+1.504 3.87 -0.4235 0.932 -0.7027
+1.493 3.84 -0.4408 0.932 -0.7374
+1.479 3.804 -0.4507 0.932 -0.7702
+1.462 3.761 -0.4535 0.932 -0.8011
+1.443 3.712 -0.4492 0.932 -0.8301
+1.422 3.658 -0.4381 0.932 -0.8569
+1.399 3.597 -0.4204 0.932 -0.8816
+1.373 3.532 -0.3965 0.932 -0.9041
+1.346 3.461 -0.3668 0.932 -0.9243
+1.316 3.386 -0.3319 0.932 -0.9422
+1.286 3.307 -0.2922 0.932 -0.9578
+1.254 3.225 -0.2484 0.932 -0.971
+1.221 3.139 -0.2011 0.932 -0.9817
+1.186 3.052 -0.1509 0.932 -0.99
+1.152 2.962 -0.0987 0.932 -0.9958
+1.117 2.872 -0.0451 0.932 -0.9991
+1.081 2.781 0.00913 0.932 -1
+1.046 2.69 0.06323 0.932 -0.9983
+1.011 2.6 0.1165 0.932 -0.9941
+0.9762 2.511 0.1681 0.932 -0.9875
+0.9424 2.424 0.2173 0.932 -0.9784
+0.9096 2.34 0.2635 0.932 -0.9668
+0.8779 2.258 0.306 0.932 -0.9528
+0.8477 2.181 0.3442 0.932 -0.9365
+0.8192 2.107 0.3774 0.932 -0.9178
+0.7923 2.038 0.4052 0.932 -0.8968
+0.7675 1.974 0.427 0.932 -0.8735
+0.7447 1.916 0.4426 0.932 -0.8481
+0.7242 1.863 0.4514 0.932 -0.8206
+0.706 1.816 0.4534 0.932 -0.791
+0.6903 1.776 0.4482 0.932 -0.7594
+0.6771 1.742 0.4358 0.932 -0.7259
+0.6664 1.714 0.4161 0.932 -0.6907
+0.6583 1.693 0.3892 0.932 -0.6536
+0.6528 1.679 0.3552 0.932 -0.615
+0.6499 1.672 0.3144 0.932 -0.5748
+0.6495 1.671 0.2669 0.932 -0.5332
+0.6516 1.676 0.2132 0.932 -0.4903
+0.656 1.687 0.1537 0.932 -0.4461
+0.6628 1.705 0.08882 0.932 -0.4008
+0.6718 1.728 0.0192 0.932 -0.3545
+0.6828 1.756 -0.05456 0.932 -0.3073
+0.6957 1.79 -0.1318 0.932 -0.2594
+0.7104 1.827 -0.2118 0.932 -0.2108
+0.7267 1.869 -0.2939 0.932 -0.1617
+0.7443 1.914 -0.3771 0.932 -0.1122
+0.7631 1.963 -0.4608 0.932 -0.06235
+0.783 2.014 -0.5442 0.932 -0.01239
+0.8036 2.067 -0.6263 0.932 0.0376
+0.8248 2.122 -0.7064 0.932 0.0875
+0.8464 2.177 -0.7836 0.932 0.1372
+0.8682 2.233 -0.8572 0.932 0.1865
+0.89 2.289 -0.9264 0.932 0.2354
+0.9116 2.345 -0.9904 0.932 0.2837
+0.9328 2.399 -1.049 0.932 0.3312
+0.9534 2.452 -1.1 0.932 0.378
+0.9733 2.503 -1.145 0.932 0.4238
+0.9922 2.552 -1.182 0.932 0.4685
+1.01 2.598 -1.211 0.932 0.5121
+1.027 2.642 -1.232 0.932 0.5544
+1.042 2.681 -1.243 0.932 0.5953
+1.057 2.718 -1.246 0.932 0.6347
+1.069 2.751 -1.239 0.932 0.6725
+1.081 2.78 -1.224 0.932 0.7087
+1.09 2.805 -1.199 0.932 0.743
+1.099 2.826 -1.165 0.932 0.7756
+1.105 2.843 -1.121 0.932 0.8061
+1.11 2.856 -1.07 0.932 0.8347
+1.114 2.866 -1.01 0.932 0.8612
+1.116 2.872 -0.9414 0.932 0.8855
+1.117 2.874 -0.8659 0.932 0.9076
+1.117 2.873 -0.7835 0.932 0.9275
+1.116 2.87 -0.6948 0.932 0.945
+1.113 2.864 -0.6006 0.932 0.9602
+1.11 2.855 -0.5016 0.932 0.9729
+1.106 2.845 -0.3985 0.932 0.9833
+1.101 2.832 -0.2922 0.932 0.9911
+1.096 2.819 -0.1836 0.932 0.9965
+1.091 2.805 -0.07347 0.932 0.9994
+0.946 2.847 0 0.949 1
+0.9403 2.83 0.1102 0.949 0.9988
+0.9348 2.813 0.2195 0.949 0.995
+0.9297 2.798 0.3271 0.949 0.9888
+0.9249 2.784 0.432 0.949 0.9801
+0.9208 2.771 0.5336 0.949 0.9689
+0.9174 2.761 0.6308 0.949 0.9553
+0.9148 2.753 0.7231 0.949 0.9394
+0.9132 2.748 0.8096 0.949 0.9211
+0.9127 2.747 0.8897 0.949 0.9004
+0.9133 2.749 0.9629 0.949 0.8776
+0.9152 2.754 1.029 0.949 0.8525
+0.9184 2.764 1.086 0.949 0.8253
+0.923 2.778 1.136 0.949 0.7961
+0.9289 2.796 1.176 0.949 0.7648
+0.9362 2.818 1.208 0.949 0.7317
+0.945 2.844 1.23 0.949 0.6967
+0.9551 2.875 1.244 0.949 0.66
+0.9666 2.909 1.248 0.949 0.6216
+0.9794 2.948 1.243 0.949 0.5817
+0.9934 2.99 1.23 0.949 0.5403
+1.009 3.035 1.208 0.949 0.4976
+1.025 3.084 1.177 0.949 0.4536
+1.042 3.135 1.139 0.949 0.4085
+1.06 3.189 1.093 0.949 0.3624
+1.078 3.245 1.041 0.949 0.3153
+1.097 3.302 0.9818 0.949 0.2675
+1.117 3.361 0.9175 0.949 0.219
+1.136 3.419 0.8482 0.949 0.17
+1.156 3.478 0.7749 0.949 0.1205
+1.175 3.536 0.6981 0.949 0.07074
+1.194 3.593 0.6187 0.949 0.02079
+1.212 3.649 0.5375 0.949 -0.0292
+1.23 3.702 0.4553 0.949 -0.07912
+1.247 3.752 0.373 0.949 -0.1288
+1.262 3.799 0.2913 0.949 -0.1782
+1.277 3.842 0.2109 0.949 -0.2272
+1.29 3.881 0.1328 0.949 -0.2756
+1.301 3.915 0.05748 0.949 -0.3233
+1.31 3.944 -0.01422 0.949 -0.3702
+1.318 3.967 -0.08171 0.949 -0.4161
+1.324 3.984 -0.1444 0.949 -0.4611
+1.328 3.995 -0.2018 0.949 -0.5048
+1.329 4 -0.2533 0.949 -0.5474
+1.328 3.998 -0.2987 0.949 -0.5885
+1.325 3.989 -0.3375 0.949 -0.6282
+1.32 3.973 -0.3695 0.949 -0.6663
+1.312 3.95 -0.3946 0.949 -0.7027
+1.302 3.92 -0.4126 0.949 -0.7374
+1.29 3.883 -0.4236 0.949 -0.7702
+1.276 3.84 -0.4275 0.949 -0.8011
+1.259 3.79 -0.4245 0.949 -0.8301
+1.241 3.734 -0.4148 0.949 -0.8569
+1.22 3.672 -0.3988 0.949 -0.8816
+1.198 3.605 -0.3766 0.949 -0.9041
+1.174 3.532 -0.3489 0.949 -0.9243
+1.148 3.455 -0.3159 0.949 -0.9422
+1.121 3.374 -0.2784 0.949 -0.9578
+1.093 3.289 -0.2368 0.949 -0.971
+1.064 3.201 -0.1918 0.949 -0.9817
+1.034 3.111 -0.144 0.949 -0.99
+1.003 3.018 -0.09421 0.949 -0.9958
+0.9719 2.925 -0.04305 0.949 -0.9991
+0.9407 2.831 0.008716 0.949 -1
+0.9095 2.737 0.06036 0.949 -0.9983
+0.8786 2.644 0.1111 0.949 -0.9941
+0.8482 2.553 0.1604 0.949 -0.9875
+0.8184 2.463 0.2073 0.949 -0.9784
+0.7895 2.376 0.2512 0.949 -0.9668
+0.7616 2.292 0.2915 0.949 -0.9528
+0.7351 2.212 0.3275 0.949 -0.9365
+0.7099 2.137 0.3588 0.949 -0.9178
+0.6864 2.066 0.3847 0.949 -0.8968
+0.6646 2 0.4049 0.949 -0.8735
+0.6447 1.94 0.4188 0.949 -0.8481
+0.6268 1.886 0.4263 0.949 -0.8206
+0.6109 1.839 0.427 0.949 -0.791
+0.5973 1.798 0.4207 0.949 -0.7594
+0.5859 1.763 0.4074 0.949 -0.7259
+0.5767 1.736 0.387 0.949 -0.6907
+0.5699 1.715 0.3595 0.949 -0.6536
+0.5654 1.702 0.3252 0.949 -0.615
+0.5632 1.695 0.2841 0.949 -0.5748
+0.5632 1.695 0.2366 0.949 -0.5332
+0.5654 1.702 0.1831 0.949 -0.4903
+0.5698 1.715 0.1239 0.949 -0.4461
+0.5762 1.734 0.05952 0.949 -0.4008
+0.5845 1.759 -0.009453 0.949 -0.3545
+0.5947 1.79 -0.08243 0.949 -0.3073
+0.6066 1.826 -0.1588 0.949 -0.2594
+0.62 1.866 -0.2377 0.949 -0.2108
+0.6347 1.91 -0.3186 0.949 -0.1617
+0.6507 1.958 -0.4007 0.949 -0.1122
+0.6678 2.01 -0.483 0.949 -0.06235
+0.6857 2.064 -0.565 0.949 -0.01239
+0.7043 2.12 -0.6456 0.949 0.0376
+0.7234 2.177 -0.7242 0.949 0.0875
+0.7428 2.236 -0.8 0.949 0.1372
+0.7624 2.294 -0.872 0.949 0.1865
+0.7818 2.353 -0.9397 0.949 0.2354
+0.8011 2.411 -1.002 0.949 0.2837
+0.82 2.468 -1.059 0.949 0.3312
+0.8383 2.523 -1.109 0.949 0.378
+0.856 2.576 -1.153 0.949 0.4238
+0.8728 2.627 -1.188 0.949 0.4685
+0.8886 2.674 -1.216 0.949 0.5121
+0.9034 2.719 -1.235 0.949 0.5544
+0.917 2.76 -1.246 0.949 0.5953
+0.9293 2.797 -1.248 0.949 0.6347
+0.9404 2.83 -1.24 0.949 0.6725
+0.95 2.859 -1.224 0.949 0.7087
+0.9583 2.884 -1.198 0.949 0.743
+0.9652 2.905 -1.163 0.949 0.7756
+0.9707 2.921 -1.12 0.949 0.8061
+0.9748 2.934 -1.068 0.949 0.8347
+0.9775 2.942 -1.007 0.949 0.8612
+0.979 2.946 -0.9391 0.949 0.8855
+0.9792 2.947 -0.8635 0.949 0.9076
+0.9783 2.944 -0.7812 0.949 0.9275
+0.9764 2.938 -0.6926 0.949 0.945
+0.9735 2.93 -0.5986 0.949 0.9602
+0.9698 2.919 -0.4999 0.949 0.9729
+0.9655 2.906 -0.3971 0.949 0.9833
+0.9606 2.891 -0.2912 0.949 0.9911
+0.9553 2.875 -0.1829 0.949 0.9965
+0.9497 2.858 -0.0732 0.949 0.9994
+0.8025 2.891 0 0.9636 1
+0.797 2.871 0.1097 0.9636 0.9988
+0.7916 2.851 0.2186 0.9636 0.995
+0.7865 2.833 0.3257 0.9636 0.9888
+0.7818 2.816 0.4302 0.9636 0.9801
+0.7776 2.801 0.5314 0.9636 0.9689
+0.774 2.788 0.6283 0.9636 0.9553
+0.7712 2.778 0.7204 0.9636 0.9394
+0.7693 2.771 0.8067 0.9636 0.9211
+0.7683 2.768 0.8868 0.9636 0.9004
+0.7684 2.768 0.96 0.9636 0.8776
+0.7695 2.772 1.026 0.9636 0.8525
+0.7719 2.78 1.084 0.9636 0.8253
+0.7754 2.793 1.133 0.9636 0.7961
+0.7802 2.81 1.174 0.9636 0.7648
+0.7862 2.832 1.207 0.9636 0.7317
+0.7934 2.858 1.23 0.9636 0.6967
+0.8019 2.889 1.244 0.9636 0.66
+0.8117 2.924 1.249 0.9636 0.6216
+0.8225 2.963 1.246 0.9636 0.5817
+0.8345 3.006 1.233 0.9636 0.5403
+0.8475 3.053 1.212 0.9636 0.4976
+0.8614 3.103 1.183 0.9636 0.4536
+0.8762 3.156 1.146 0.9636 0.4085
+0.8916 3.212 1.102 0.9636 0.3624
+0.9077 3.27 1.051 0.9636 0.3153
+0.9242 3.329 0.9935 0.9636 0.2675
+0.9411 3.39 0.9307 0.9636 0.219
+0.9581 3.451 0.8631 0.9636 0.17
+0.9752 3.513 0.7912 0.9636 0.1205
+0.9921 3.574 0.716 0.9636 0.07074
+1.009 3.633 0.6382 0.9636 0.02079
+1.025 3.691 0.5585 0.9636 -0.0292
+1.04 3.747 0.4777 0.9636 -0.07912
+1.055 3.8 0.3967 0.9636 -0.1288
+1.069 3.85 0.3162 0.9636 -0.1782
+1.082 3.896 0.2371 0.9636 -0.2272
+1.093 3.937 0.16 0.9636 -0.2756
+1.103 3.973 0.0856 0.9636 -0.3233
+1.112 4.004 0.01467 0.9636 -0.3702
+1.119 4.029 -0.05218 0.9636 -0.4161
+1.124 4.049 -0.1144 0.9636 -0.4611
+1.127 4.061 -0.1714 0.9636 -0.5048
+1.129 4.067 -0.2229 0.9636 -0.5474
+1.129 4.066 -0.2683 0.9636 -0.5885
+1.126 4.058 -0.3073 0.9636 -0.6282
+1.122 4.042 -0.3398 0.9636 -0.6663
+1.116 4.02 -0.3654 0.9636 -0.7027
+1.108 3.99 -0.3842 0.9636 -0.7374
+1.097 3.953 -0.3961 0.9636 -0.7702
+1.085 3.909 -0.4012 0.9636 -0.8011
+1.071 3.858 -0.3995 0.9636 -0.8301
+1.055 3.801 -0.3913 0.9636 -0.8569
+1.038 3.738 -0.3769 0.9636 -0.8816
+1.019 3.669 -0.3565 0.9636 -0.9041
+0.998 3.595 -0.3307 0.9636 -0.9243
+0.976 3.516 -0.2998 0.9636 -0.9422
+0.9529 3.432 -0.2644 0.9636 -0.9578
+0.9287 3.345 -0.2251 0.9636 -0.971
+0.9036 3.255 -0.1824 0.9636 -0.9817
+0.8778 3.162 -0.137 0.9636 -0.99
+0.8515 3.067 -0.08966 0.9636 -0.9958
+0.8248 2.971 -0.04098 0.9636 -0.9991
+0.798 2.874 0.008297 0.9636 -1
+0.7712 2.778 0.05746 0.9636 -0.9983
+0.7446 2.682 0.1058 0.9636 -0.9941
+0.7185 2.588 0.1525 0.9636 -0.9875
+0.6929 2.496 0.1971 0.9636 -0.9784
+0.6681 2.407 0.2387 0.9636 -0.9668
+0.6442 2.321 0.2768 0.9636 -0.9528
+0.6214 2.238 0.3107 0.9636 -0.9365
+0.5999 2.161 0.34 0.9636 -0.9178
+0.5798 2.088 0.364 0.9636 -0.8968
+0.5612 2.021 0.3824 0.9636 -0.8735
+0.5442 1.96 0.3948 0.9636 -0.8481
+0.5289 1.905 0.4008 0.9636 -0.8206
+0.5155 1.857 0.4003 0.9636 -0.791
+0.504 1.815 0.3929 0.9636 -0.7594
+0.4944 1.781 0.3787 0.9636 -0.7259
+0.4868 1.753 0.3576 0.9636 -0.6907
+0.4812 1.733 0.3296 0.9636 -0.6536
+0.4776 1.72 0.2949 0.9636 -0.615
+0.476 1.714 0.2537 0.9636 -0.5748
+0.4763 1.716 0.2062 0.9636 -0.5332
+0.4785 1.724 0.1529 0.9636 -0.4903
+0.4826 1.739 0.09403 0.9636 -0.4461
+0.4885 1.76 0.03019 0.9636 -0.4008
+0.496 1.787 -0.0381 0.9636 -0.3545
+0.5052 1.82 -0.1103 0.9636 -0.3073
+0.5157 1.858 -0.1856 0.9636 -0.2594
+0.5276 1.901 -0.2635 0.9636 -0.2108
+0.5407 1.948 -0.3432 0.9636 -0.1617
+0.5548 1.998 -0.4239 0.9636 -0.1122
+0.5698 2.053 -0.5049 0.9636 -0.06235
+0.5856 2.109 -0.5854 0.9636 -0.01239
+0.6019 2.168 -0.6646 0.9636 0.0376
+0.6186 2.228 -0.7416 0.9636 0.0875
+0.6356 2.289 -0.8158 0.9636 0.1372
+0.6526 2.351 -0.8863 0.9636 0.1865
+0.6696 2.412 -0.9524 0.9636 0.2354
+0.6864 2.472 -1.013 0.9636 0.2837
+0.7028 2.531 -1.069 0.9636 0.3312
+0.7186 2.589 -1.117 0.9636 0.378
+0.7339 2.644 -1.159 0.9636 0.4238
+0.7484 2.696 -1.194 0.9636 0.4685
+0.762 2.745 -1.22 0.9636 0.5121
+0.7746 2.79 -1.238 0.9636 0.5544
+0.7863 2.832 -1.248 0.9636 0.5953
+0.7967 2.87 -1.249 0.9636 0.6347
+0.806 2.903 -1.24 0.9636 0.6725
+0.8141 2.933 -1.223 0.9636 0.7087
+0.821 2.957 -1.197 0.9636 0.743
+0.8266 2.977 -1.162 0.9636 0.7756
+0.8309 2.993 -1.118 0.9636 0.8061
+0.8341 3.004 -1.065 0.9636 0.8347
+0.836 3.011 -1.005 0.9636 0.8612
+0.8368 3.014 -0.9362 0.9636 0.8855
+0.8365 3.013 -0.8606 0.9636 0.9076
+0.8352 3.008 -0.7784 0.9636 0.9275
+0.8329 3 -0.69 0.9636 0.945
+0.8299 2.989 -0.5963 0.9636 0.9602
+0.8261 2.976 -0.4978 0.9636 0.9729
+0.8217 2.96 -0.3954 0.9636 0.9833
+0.8168 2.942 -0.2899 0.9636 0.9911
+0.8116 2.924 -0.1821 0.9636 0.9965
+0.8062 2.904 -0.07288 0.9636 0.9994
+0.657 2.927 0 0.9757 1
+0.6519 2.904 0.1092 0.9757 0.9988
+0.6469 2.882 0.2175 0.9757 0.995
+0.6421 2.861 0.3241 0.9757 0.9888
+0.6377 2.841 0.4282 0.9757 0.9801
+0.6337 2.823 0.5289 0.9757 0.9689
+0.6303 2.808 0.6255 0.9757 0.9553
+0.6275 2.796 0.7172 0.9757 0.9394
+0.6254 2.786 0.8034 0.9757 0.9211
+0.6242 2.781 0.8834 0.9757 0.9004
+0.6238 2.779 0.9565 0.9757 0.8776
+0.6244 2.782 1.022 0.9757 0.8525
+0.626 2.789 1.08 0.9757 0.8253
+0.6286 2.801 1.13 0.9757 0.7961
+0.6323 2.817 1.172 0.9757 0.7648
+0.6371 2.838 1.205 0.9757 0.7317
+0.6429 2.864 1.229 0.9757 0.6967
+0.6498 2.895 1.244 0.9757 0.66
+0.6577 2.93 1.25 0.9757 0.6216
+0.6666 2.97 1.247 0.9757 0.5817
+0.6765 3.014 1.236 0.9757 0.5403
+0.6872 3.062 1.216 0.9757 0.4976
+0.6988 3.113 1.188 0.9757 0.4536
+0.711 3.168 1.153 0.9757 0.4085
+0.7239 3.225 1.11 0.9757 0.3624
+0.7374 3.285 1.06 0.9757 0.3153
+0.7512 3.347 1.005 0.9757 0.2675
+0.7654 3.41 0.9434 0.9757 0.219
+0.7797 3.474 0.8773 0.9757 0.17
+0.794 3.537 0.8071 0.9757 0.1205
+0.8083 3.601 0.7335 0.9757 0.07074
+0.8223 3.663 0.6572 0.9757 0.02079
+0.8359 3.724 0.5791 0.9757 -0.0292
+0.8491 3.783 0.4998 0.9757 -0.07912
+0.8615 3.838 0.4202 0.9757 -0.1288
+0.8733 3.891 0.341 0.9757 -0.1782
+0.8841 3.939 0.2631 0.9757 -0.2272
+0.8939 3.982 0.1871 0.9757 -0.2756
+0.9026 4.021 0.1137 0.9757 -0.3233
+0.91 4.054 0.04356 0.9757 -0.3702
+0.9161 4.081 -0.02262 0.9757 -0.4161
+0.9207 4.102 -0.08432 0.9757 -0.4611
+0.9239 4.116 -0.141 0.9757 -0.5048
+0.9255 4.123 -0.1923 0.9757 -0.5474
+0.9255 4.123 -0.2377 0.9757 -0.5885
+0.9238 4.116 -0.2769 0.9757 -0.6282
+0.9205 4.101 -0.3098 0.9757 -0.6663
+0.9155 4.079 -0.336 0.9757 -0.7027
+0.9088 4.049 -0.3556 0.9757 -0.7374
+0.9005 4.012 -0.3685 0.9757 -0.7702
+0.8906 3.968 -0.3747 0.9757 -0.8011
+0.8791 3.916 -0.3743 0.9757 -0.8301
+0.8661 3.859 -0.3676 0.9757 -0.8569
+0.8516 3.794 -0.3548 0.9757 -0.8816
+0.8359 3.724 -0.3362 0.9757 -0.9041
+0.8188 3.648 -0.3123 0.9757 -0.9243
+0.8007 3.567 -0.2835 0.9757 -0.9422
+0.7815 3.482 -0.2503 0.9757 -0.9578
+0.7615 3.393 -0.2132 0.9757 -0.971
+0.7407 3.3 -0.1729 0.9757 -0.9817
+0.7194 3.205 -0.13 0.9757 -0.99
+0.6976 3.108 -0.08506 0.9757 -0.9958
+0.6755 3.01 -0.03888 0.9757 -0.9991
+0.6533 2.911 0.007873 0.9757 -1
+0.6311 2.812 0.05451 0.9757 -0.9983
+0.6091 2.714 0.1003 0.9757 -0.9941
+0.5874 2.617 0.1446 0.9757 -0.9875
+0.5662 2.523 0.1868 0.9757 -0.9784
+0.5457 2.431 0.2261 0.9757 -0.9668
+0.526 2.343 0.2619 0.9757 -0.9528
+0.5071 2.259 0.2937 0.9757 -0.9365
+0.4894 2.18 0.3209 0.9757 -0.9178
+0.4727 2.106 0.3431 0.9757 -0.8968
+0.4574 2.038 0.3598 0.9757 -0.8735
+0.4434 1.976 0.3705 0.9757 -0.8481
+0.4309 1.92 0.3751 0.9757 -0.8206
+0.4199 1.871 0.3733 0.9757 -0.791
+0.4105 1.829 0.3649 0.9757 -0.7594
+0.4028 1.794 0.3498 0.9757 -0.7259
+0.3967 1.767 0.328 0.9757 -0.6907
+0.3922 1.747 0.2995 0.9757 -0.6536
+0.3895 1.735 0.2645 0.9757 -0.615
+0.3884 1.73 0.2231 0.9757 -0.5748
+0.3889 1.733 0.1757 0.9757 -0.5332
+0.391 1.742 0.1225 0.9757 -0.4903
+0.3947 1.759 0.06411 0.9757 -0.4461
+0.3999 1.781 0.0008393 0.9757 -0.4008
+0.4064 1.811 -0.06673 0.9757 -0.3545
+0.4143 1.846 -0.138 0.9757 -0.3073
+0.4233 1.886 -0.2124 0.9757 -0.2594
+0.4335 1.931 -0.2891 0.9757 -0.2108
+0.4446 1.981 -0.3676 0.9757 -0.1617
+0.4566 2.034 -0.4469 0.9757 -0.1122
+0.4693 2.091 -0.5265 0.9757 -0.06235
+0.4827 2.15 -0.6055 0.9757 -0.01239
+0.4964 2.212 -0.6831 0.9757 0.0376
+0.5106 2.275 -0.7586 0.9757 0.0875
+0.5248 2.338 -0.8312 0.9757 0.1372
+0.5392 2.402 -0.9 0.9757 0.1865
+0.5535 2.466 -0.9645 0.9757 0.2354
+0.5675 2.528 -1.024 0.9757 0.2837
+0.5812 2.59 -1.078 0.9757 0.3312
+0.5945 2.649 -1.125 0.9757 0.378
+0.6072 2.705 -1.165 0.9757 0.4238
+0.6193 2.759 -1.198 0.9757 0.4685
+0.6306 2.809 -1.224 0.9757 0.5121
+0.641 2.856 -1.24 0.9757 0.5544
+0.6506 2.898 -1.249 0.9757 0.5953
+0.6591 2.937 -1.249 0.9757 0.6347
+0.6667 2.97 -1.24 0.9757 0.6725
+0.6732 2.999 -1.222 0.9757 0.7087
+0.6787 3.024 -1.195 0.9757 0.743
+0.6831 3.043 -1.159 0.9757 0.7756
+0.6864 3.058 -1.115 0.9757 0.8061
+0.6887 3.068 -1.062 0.9757 0.8347
+0.6899 3.074 -1.001 0.9757 0.8612
+0.6902 3.075 -0.9327 0.9757 0.8855
+0.6895 3.072 -0.8572 0.9757 0.9076
+0.688 3.065 -0.7751 0.9757 0.9275
+0.6857 3.055 -0.687 0.9757 0.945
+0.6827 3.041 -0.5935 0.9757 0.9602
+0.679 3.025 -0.4954 0.9757 0.9729
+0.6749 3.007 -0.3935 0.9757 0.9833
+0.6703 2.987 -0.2885 0.9757 0.9911
+0.6655 2.965 -0.1812 0.9757 0.9965
+0.6604 2.942 -0.07251 0.9757 0.9994
+0.5099 2.956 0 0.9854 1
+0.5055 2.931 0.1086 0.9854 0.9988
+0.5011 2.905 0.2163 0.9854 0.995
+0.497 2.881 0.3223 0.9854 0.9888
+0.4931 2.859 0.4258 0.9854 0.9801
+0.4896 2.838 0.5261 0.9854 0.9689
+0.4865 2.821 0.6222 0.9854 0.9553
+0.4839 2.806 0.7136 0.9854 0.9394
+0.482 2.794 0.7995 0.9854 0.9211
+0.4807 2.787 0.8793 0.9854 0.9004
+0.4801 2.783 0.9524 0.9854 0.8776
+0.4803 2.785 1.018 0.9854 0.8525
+0.4812 2.79 1.077 0.9854 0.8253
+0.4831 2.801 1.127 0.9854 0.7961
+0.4857 2.816 1.169 0.9854 0.7648
+0.4893 2.837 1.202 0.9854 0.7317
+0.4937 2.862 1.227 0.9854 0.6967
+0.499 2.893 1.242 0.9854 0.66
+0.5051 2.929 1.249 0.9854 0.6216
+0.512 2.969 1.248 0.9854 0.5817
+0.5197 3.013 1.238 0.9854 0.5403
+0.5281 3.062 1.219 0.9854 0.4976
+0.5372 3.115 1.193 0.9854 0.4536
+0.5469 3.171 1.158 0.9854 0.4085
+0.5571 3.23 1.117 0.9854 0.3624
+0.5677 3.292 1.069 0.9854 0.3153
+0.5787 3.355 1.015 0.9854 0.2675
+0.5899 3.42 0.9555 0.9854 0.219
+0.6013 3.486 0.8911 0.9854 0.17
+0.6128 3.553 0.8225 0.9854 0.1205
+0.6241 3.619 0.7505 0.9854 0.07074
+0.6353 3.684 0.6759 0.9854 0.02079
+0.6462 3.747 0.5993 0.9854 -0.0292
+0.6568 3.808 0.5215 0.9854 -0.07912
+0.6668 3.866 0.4434 0.9854 -0.1288
+0.6762 3.921 0.3656 0.9854 -0.1782
+0.685 3.971 0.2889 0.9854 -0.2272
+0.6929 4.017 0.214 0.9854 -0.2756
+0.6999 4.058 0.1416 0.9854 -0.3233
+0.706 4.093 0.07242 0.9854 -0.3702
+0.711 4.122 0.006951 0.9854 -0.4161
+0.7149 4.145 -0.0542 0.9854 -0.4611
+0.7176 4.16 -0.1105 0.9854 -0.5048
+0.719 4.169 -0.1616 0.9854 -0.5474
+0.7192 4.17 -0.207 0.9854 -0.5885
+0.7181 4.163 -0.2464 0.9854 -0.6282
+0.7156 4.149 -0.2796 0.9854 -0.6663
+0.7119 4.127 -0.3064 0.9854 -0.7027
+0.7068 4.098 -0.3268 0.9854 -0.7374
+0.7004 4.061 -0.3406 0.9854 -0.7702
+0.6927 4.016 -0.3479 0.9854 -0.8011
+0.6838 3.964 -0.3488 0.9854 -0.8301
+0.6737 3.906 -0.3436 0.9854 -0.8569
+0.6624 3.84 -0.3325 0.9854 -0.8816
+0.6501 3.769 -0.3157 0.9854 -0.9041
+0.6368 3.692 -0.2938 0.9854 -0.9243
+0.6226 3.61 -0.267 0.9854 -0.9422
+0.6076 3.523 -0.236 0.9854 -0.9578
+0.5919 3.432 -0.2012 0.9854 -0.971
+0.5756 3.337 -0.1633 0.9854 -0.9817
+0.5588 3.24 -0.1228 0.9854 -0.99
+0.5417 3.141 -0.0804 0.9854 -0.9958
+0.5244 3.04 -0.03676 0.9854 -0.9991
+0.507 2.939 0.007444 0.9854 -1
+0.4896 2.838 0.05154 0.9854 -0.9983
+0.4723 2.738 0.09483 0.9854 -0.9941
+0.4553 2.64 0.1367 0.9854 -0.9875
+0.4387 2.543 0.1764 0.9854 -0.9784
+0.4226 2.45 0.2133 0.9854 -0.9668
+0.4071 2.36 0.2469 0.9854 -0.9528
+0.3924 2.275 0.2765 0.9854 -0.9365
+0.3785 2.194 0.3017 0.9854 -0.9178
+0.3655 2.119 0.322 0.9854 -0.8968
+0.3535 2.05 0.3369 0.9854 -0.8735
+0.3426 1.986 0.346 0.9854 -0.8481
+0.3329 1.93 0.3492 0.9854 -0.8206
+0.3244 1.881 0.3461 0.9854 -0.791
+0.3171 1.839 0.3366 0.9854 -0.7594
+0.3112 1.804 0.3207 0.9854 -0.7259
+0.3065 1.777 0.2981 0.9854 -0.6907
+0.3032 1.758 0.2692 0.9854 -0.6536
+0.3012 1.746 0.2338 0.9854 -0.615
+0.3005 1.742 0.1924 0.9854 -0.5748
+0.3011 1.746 0.145 0.9854 -0.5332
+0.303 1.757 0.09215 0.9854 -0.4903
+0.3061 1.775 0.03415 0.9854 -0.4461
+0.3104 1.8 -0.02851 0.9854 -0.4008
+0.3158 1.831 -0.09531 0.9854 -0.3545
+0.3221 1.868 -0.1657 0.9854 -0.3073
+0.3295 1.91 -0.239 0.9854 -0.2594
+0.3377 1.958 -0.3145 0.9854 -0.2108
+0.3467 2.01 -0.3917 0.9854 -0.1617
+0.3563 2.066 -0.4697 0.9854 -0.1122
+0.3665 2.125 -0.5478 0.9854 -0.06235
+0.3772 2.187 -0.6252 0.9854 -0.01239
+0.3882 2.251 -0.7012 0.9854 0.0376
+0.3995 2.316 -0.7751 0.9854 0.0875
+0.4109 2.382 -0.846 0.9854 0.1372
+0.4223 2.449 -0.9132 0.9854 0.1865
+0.4337 2.514 -0.9761 0.9854 0.2354
+0.4448 2.579 -1.034 0.9854 0.2837
+0.4557 2.642 -1.086 0.9854 0.3312
+0.4662 2.703 -1.132 0.9854 0.378
+0.4762 2.761 -1.171 0.9854 0.4238
+0.4857 2.816 -1.202 0.9854 0.4685
+0.4946 2.867 -1.226 0.9854 0.5121
+0.5027 2.915 -1.242 0.9854 0.5544
+0.5102 2.958 -1.249 0.9854 0.5953
+0.5169 2.997 -1.248 0.9854 0.6347
+0.5227 3.03 -1.238 0.9854 0.6725
+0.5277 3.059 -1.219 0.9854 0.7087
+0.5318 3.083 -1.192 0.9854 0.743
+0.5351 3.102 -1.156 0.9854 0.7756
+0.5374 3.116 -1.111 0.9854 0.8061
+0.539 3.125 -1.058 0.9854 0.8347
+0.5397 3.129 -0.997 0.9854 0.8612
+0.5396 3.129 -0.9286 0.9854 0.8855
+0.5388 3.124 -0.8532 0.9854 0.9076
+0.5372 3.115 -0.7713 0.9854 0.9275
+0.5351 3.102 -0.6835 0.9854 0.945
+0.5323 3.086 -0.5904 0.9854 0.9602
+0.5291 3.068 -0.4928 0.9854 0.9729
+0.5254 3.046 -0.3913 0.9854 0.9833
+0.5215 3.023 -0.2869 0.9854 0.9911
+0.5172 2.999 -0.1802 0.9854 0.9965
+0.5129 2.973 -0.0721 0.9854 0.9994
+0.3615 2.978 0 0.9927 1
+0.358 2.95 0.1079 0.9927 0.9988
+0.3546 2.922 0.2149 0.9927 0.995
+0.3514 2.895 0.3203 0.9927 0.9888
+0.3483 2.869 0.4232 0.9927 0.9801
+0.3455 2.846 0.5229 0.9927 0.9689
+0.343 2.826 0.6186 0.9927 0.9553
+0.341 2.809 0.7096 0.9927 0.9394
+0.3393 2.795 0.7952 0.9927 0.9211
+0.3381 2.786 0.8748 0.9927 0.9004
+0.3375 2.78 0.9478 0.9927 0.8776
+0.3374 2.78 1.014 0.9927 0.8525
+0.338 2.784 1.072 0.9927 0.8253
+0.3391 2.794 1.123 0.9927 0.7961
+0.3409 2.808 1.165 0.9927 0.7648
+0.3433 2.828 1.199 0.9927 0.7317
+0.3463 2.853 1.224 0.9927 0.6967
+0.35 2.884 1.24 0.9927 0.66
+0.3543 2.919 1.248 0.9927 0.6216
+0.3593 2.96 1.248 0.9927 0.5817
+0.3647 3.005 1.239 0.9927 0.5403
+0.3708 3.054 1.221 0.9927 0.4976
+0.3773 3.108 1.196 0.9927 0.4536
+0.3842 3.165 1.163 0.9927 0.4085
+0.3916 3.226 1.124 0.9927 0.3624
+0.3993 3.289 1.077 0.9927 0.3153
+0.4072 3.355 1.025 0.9927 0.2675
+0.4154 3.422 0.9669 0.9927 0.219
+0.4236 3.49 0.9042 0.9927 0.17
+0.4319 3.558 0.8374 0.9927 0.1205
+0.4402 3.626 0.7671 0.9927 0.07074
+0.4484 3.694 0.6941 0.9927 0.02079
+0.4563 3.759 0.6192 0.9927 -0.0292
+0.464 3.823 0.543 0.9927 -0.07912
+0.4714 3.883 0.4663 0.9927 -0.1288
+0.4783 3.94 0.39 0.9927 -0.1782
+0.4847 3.993 0.3146 0.9927 -0.2272
+0.4906 4.041 0.2409 0.9927 -0.2756
+0.4958 4.084 0.1695 0.9927 -0.3233
+0.5003 4.121 0.1012 0.9927 -0.3702
+0.504 4.152 0.03652 0.9927 -0.4161
+0.5069 4.176 -0.02404 0.9927 -0.4611
+0.509 4.193 -0.07995 0.9927 -0.5048
+0.5102 4.203 -0.1308 0.9927 -0.5474
+0.5105 4.205 -0.1761 0.9927 -0.5885
+0.5098 4.2 -0.2157 0.9927 -0.6282
+0.5082 4.186 -0.2493 0.9927 -0.6663
+0.5056 4.165 -0.2766 0.9927 -0.7027
+0.502 4.136 -0.2977 0.9927 -0.7374
+0.4975 4.099 -0.3124 0.9927 -0.7702
+0.4921 4.054 -0.3209 0.9927 -0.8011
+0.4858 4.002 -0.3232 0.9927 -0.8301
+0.4786 3.943 -0.3194 0.9927 -0.8569
+0.4706 3.877 -0.3099 0.9927 -0.8816
+0.4618 3.804 -0.295 0.9927 -0.9041
+0.4523 3.726 -0.275 0.9927 -0.9243
+0.4422 3.643 -0.2504 0.9927 -0.9422
+0.4314 3.554 -0.2216 0.9927 -0.9578
+0.4202 3.462 -0.1891 0.9927 -0.971
+0.4086 3.366 -0.1536 0.9927 -0.9817
+0.3966 3.267 -0.1156 0.9927 -0.99
+0.3843 3.166 -0.0757 0.9927 -0.9958
+0.3719 3.064 -0.03462 0.9927 -0.9991
+0.3594 2.961 0.00701 0.9927 -1
+0.3469 2.858 0.04853 0.9927 -0.9983
+0.3346 2.756 0.08927 0.9927 -0.9941
+0.3224 2.656 0.1286 0.9927 -0.9875
+0.3105 2.558 0.1658 0.9927 -0.9784
+0.299 2.463 0.2004 0.9927 -0.9668
+0.2879 2.372 0.2317 0.9927 -0.9528
+0.2774 2.285 0.2591 0.9927 -0.9365
+0.2674 2.203 0.2823 0.9927 -0.9178
+0.2582 2.127 0.3006 0.9927 -0.8968
+0.2496 2.057 0.3137 0.9927 -0.8735
+0.2419 1.993 0.3213 0.9927 -0.8481
+0.235 1.936 0.3231 0.9927 -0.8206
+0.229 1.886 0.3187 0.9927 -0.791
+0.2239 1.844 0.3082 0.9927 -0.7594
+0.2197 1.81 0.2913 0.9927 -0.7259
+0.2165 1.783 0.2681 0.9927 -0.6907
+0.2142 1.765 0.2387 0.9927 -0.6536
+0.2129 1.754 0.2031 0.9927 -0.615
+0.2125 1.751 0.1615 0.9927 -0.5748
+0.2131 1.756 0.1143 0.9927 -0.5332
+0.2146 1.768 0.06169 0.9927 -0.4903
+0.217 1.787 0.004168 0.9927 -0.4461
+0.2202 1.814 -0.05785 0.9927 -0.4008
+0.2242 1.847 -0.1238 0.9927 -0.3545
+0.2289 1.886 -0.1932 0.9927 -0.3073
+0.2344 1.931 -0.2654 0.9927 -0.2594
+0.2404 1.98 -0.3398 0.9927 -0.2108
+0.247 2.035 -0.4156 0.9927 -0.1617
+0.2541 2.093 -0.4921 0.9927 -0.1122
+0.2615 2.155 -0.5687 0.9927 -0.06235
+0.2693 2.219 -0.6445 0.9927 -0.01239
+0.2774 2.285 -0.7189 0.9927 0.0376
+0.2856 2.353 -0.7911 0.9927 0.0875
+0.2939 2.421 -0.8603 0.9927 0.1372
+0.3022 2.489 -0.9258 0.9927 0.1865
+0.3104 2.557 -0.987 0.9927 0.2354
+0.3185 2.624 -1.043 0.9927 0.2837
+0.3264 2.689 -1.094 0.9927 0.3312
+0.3339 2.751 -1.138 0.9927 0.378
+0.3412 2.81 -1.175 0.9927 0.4238
+0.348 2.867 -1.205 0.9927 0.4685
+0.3543 2.919 -1.228 0.9927 0.5121
+0.3602 2.967 -1.243 0.9927 0.5544
+0.3655 3.011 -1.249 0.9927 0.5953
+0.3702 3.05 -1.247 0.9927 0.6347
+0.3743 3.084 -1.236 0.9927 0.6725
+0.3778 3.112 -1.216 0.9927 0.7087
+0.3806 3.136 -1.188 0.9927 0.743
+0.3828 3.154 -1.152 0.9927 0.7756
+0.3844 3.167 -1.106 0.9927 0.8061
+0.3853 3.174 -1.053 0.9927 0.8347
+0.3856 3.177 -0.9923 0.9927 0.8612
+0.3854 3.175 -0.924 0.9927 0.8855
+0.3845 3.168 -0.8487 0.9927 0.9076
+0.3832 3.157 -0.767 0.9927 0.9275
+0.3814 3.142 -0.6796 0.9927 0.945
+0.3792 3.124 -0.5869 0.9927 0.9602
+0.3766 3.102 -0.4898 0.9927 0.9729
+0.3737 3.079 -0.3889 0.9927 0.9833
+0.3706 3.053 -0.2851 0.9927 0.9911
+0.3672 3.025 -0.1791 0.9927 0.9965
+0.3638 2.997 -0.07164 0.9927 0.9994
+0.2122 2.992 0 0.9975 1
+0.21 2.961 0.1071 0.9975 0.9988
+0.2078 2.93 0.2134 0.9975 0.995
+0.2057 2.901 0.3181 0.9975 0.9888
+0.2037 2.873 0.4204 0.9975 0.9801
+0.2019 2.847 0.5194 0.9975 0.9689
+0.2003 2.824 0.6146 0.9975 0.9553
+0.1989 2.805 0.7051 0.9975 0.9394
+0.1978 2.789 0.7903 0.9975 0.9211
+0.197 2.777 0.8696 0.9975 0.9004
+0.1965 2.77 0.9425 0.9975 0.8776
+0.1963 2.768 1.008 0.9975 0.8525
+0.1965 2.771 1.067 0.9975 0.8253
+0.1971 2.779 1.118 0.9975 0.7961
+0.198 2.793 1.16 0.9975 0.7648
+0.1994 2.812 1.194 0.9975 0.7317
+0.2011 2.836 1.22 0.9975 0.6967
+0.2033 2.867 1.238 0.9975 0.66
+0.2058 2.902 1.246 0.9975 0.6216
+0.2087 2.943 1.247 0.9975 0.5817
+0.2119 2.988 1.239 0.9975 0.5403
+0.2155 3.039 1.223 0.9975 0.4976
+0.2194 3.093 1.199 0.9975 0.4536
+0.2235 3.152 1.168 0.9975 0.4085
+0.2279 3.213 1.13 0.9975 0.3624
+0.2325 3.278 1.085 0.9975 0.3153
+0.2372 3.345 1.034 0.9975 0.2675
+0.2421 3.414 0.9778 0.9975 0.219
+0.2471 3.484 0.9168 0.9975 0.17
+0.2521 3.554 0.8517 0.9975 0.1205
+0.257 3.625 0.7832 0.9975 0.07074
+0.262 3.694 0.7119 0.9975 0.02079
+0.2668 3.762 0.6386 0.9975 -0.0292
+0.2714 3.827 0.5641 0.9975 -0.07912
+0.2759 3.89 0.489 0.9975 -0.1288
+0.2801 3.949 0.4141 0.9975 -0.1782
+0.284 4.004 0.34 0.9975 -0.2272
+0.2875 4.054 0.2676 0.9975 -0.2756
+0.2907 4.099 0.1973 0.9975 -0.3233
+0.2935 4.138 0.13 0.9975 -0.3702
+0.2958 4.171 0.06607 0.9975 -0.4161
+0.2976 4.197 0.006136 0.9975 -0.4611
+0.2989 4.215 -0.04933 0.9975 -0.5048
+0.2997 4.226 -0.09989 0.9975 -0.5474
+0.2999 4.23 -0.1452 0.9975 -0.5885
+0.2996 4.225 -0.1849 0.9975 -0.6282
+0.2987 4.212 -0.2188 0.9975 -0.6663
+0.2972 4.192 -0.2467 0.9975 -0.7027
+0.2952 4.163 -0.2685 0.9975 -0.7374
+0.2926 4.126 -0.2841 0.9975 -0.7702
+0.2894 4.081 -0.2937 0.9975 -0.8011
+0.2857 4.029 -0.2973 0.9975 -0.8301
+0.2815 3.969 -0.295 0.9975 -0.8569
+0.2768 3.903 -0.2872 0.9975 -0.8816
+0.2716 3.83 -0.2741 0.9975 -0.9041
+0.266 3.751 -0.2561 0.9975 -0.9243
+0.26 3.666 -0.2335 0.9975 -0.9422
+0.2536 3.577 -0.207 0.9975 -0.9578
+0.247 3.483 -0.1769 0.9975 -0.971
+0.2401 3.386 -0.1438 0.9975 -0.9817
+0.233 3.285 -0.1083 0.9975 -0.99
+0.2257 3.183 -0.07094 0.9975 -0.9958
+0.2184 3.079 -0.03245 0.9975 -0.9991
+0.211 2.975 0.006572 0.9975 -1
+0.2036 2.871 0.04549 0.9975 -0.9983
+0.1962 2.767 0.08365 0.9975 -0.9941
+0.189 2.666 0.1204 0.9975 -0.9875
+0.182 2.566 0.1552 0.9975 -0.9784
+0.1752 2.47 0.1874 0.9975 -0.9668
+0.1686 2.378 0.2163 0.9975 -0.9528
+0.1624 2.29 0.2416 0.9975 -0.9365
+0.1565 2.207 0.2627 0.9975 -0.9178
+0.151 2.13 0.2791 0.9975 -0.8968
+0.146 2.059 0.2904 0.9975 -0.8735
+0.1415 1.995 0.2964 0.9975 -0.8481
+0.1374 1.938 0.2967 0.9975 -0.8206
+0.1339 1.888 0.2911 0.9975 -0.791
+0.1309 1.846 0.2795 0.9975 -0.7594
+0.1285 1.812 0.2618 0.9975 -0.7259
+0.1266 1.785 0.238 0.9975 -0.6907
+0.1253 1.767 0.208 0.9975 -0.6536
+0.1246 1.758 0.1722 0.9975 -0.615
+0.1245 1.756 0.1306 0.9975 -0.5748
+0.1249 1.762 0.08345 0.9975 -0.5332
+0.1259 1.775 0.0312 0.9975 -0.4903
+0.1274 1.796 -0.02582 0.9975 -0.4461
+0.1294 1.824 -0.08714 0.9975 -0.4008
+0.1318 1.859 -0.1523 0.9975 -0.3545
+0.1348 1.9 -0.2207 0.9975 -0.3073
+0.1381 1.947 -0.2917 0.9975 -0.2594
+0.1417 1.999 -0.3648 0.9975 -0.2108
+0.1457 2.055 -0.4392 0.9975 -0.1617
+0.15 2.116 -0.5143 0.9975 -0.1122
+0.1546 2.179 -0.5893 0.9975 -0.06235
+0.1593 2.246 -0.6635 0.9975 -0.01239
+0.1641 2.314 -0.7361 0.9975 0.0376
+0.1691 2.384 -0.8066 0.9975 0.0875
+0.174 2.454 -0.874 0.9975 0.1372
+0.179 2.525 -0.9378 0.9975 0.1865
+0.184 2.594 -0.9973 0.9975 0.2354
+0.1888 2.663 -1.052 0.9975 0.2837
+0.1935 2.729 -1.101 0.9975 0.3312
+0.198 2.793 -1.143 0.9975 0.378
+0.2023 2.853 -1.179 0.9975 0.4238
+0.2064 2.911 -1.208 0.9975 0.4685
+0.2102 2.964 -1.229 0.9975 0.5121
+0.2136 3.012 -1.242 0.9975 0.5544
+0.2167 3.056 -1.248 0.9975 0.5953
+0.2195 3.095 -1.244 0.9975 0.6347
+0.2219 3.129 -1.233 0.9975 0.6725
+0.2239 3.157 -1.213 0.9975 0.7087
+0.2255 3.18 -1.184 0.9975 0.743
+0.2268 3.198 -1.147 0.9975 0.7756
+0.2276 3.209 -1.101 0.9975 0.8061
+0.228 3.216 -1.048 0.9975 0.8347
+0.2281 3.217 -0.987 0.9975 0.8612
+0.2278 3.213 -0.9187 0.9975 0.8855
+0.2272 3.204 -0.8437 0.9975 0.9076
+0.2263 3.191 -0.7623 0.9975 0.9275
+0.2251 3.174 -0.6752 0.9975 0.945
+0.2236 3.153 -0.5831 0.9975 0.9602
+0.2219 3.13 -0.4865 0.9975 0.9729
+0.2201 3.103 -0.3863 0.9975 0.9833
+0.218 3.075 -0.2831 0.9975 0.9911
+0.2159 3.044 -0.1778 0.9975 0.9965
+0.2137 3.013 -0.07114 0.9975 0.9994
+0.06238 2.999 0 0.9998 1
+0.06167 2.965 0.1063 0.9998 0.9988
+0.06098 2.932 0.2118 0.9998 0.995
+0.0603 2.899 0.3157 0.9998 0.9888
+0.05967 2.869 0.4172 0.9998 0.9801
+0.05908 2.841 0.5156 0.9998 0.9689
+0.05856 2.815 0.6102 0.9998 0.9553
+0.0581 2.794 0.7002 0.9998 0.9394
+0.05773 2.776 0.785 0.9998 0.9211
+0.05745 2.762 0.864 0.9998 0.9004
+0.05726 2.753 0.9366 0.9998 0.8776
+0.05718 2.749 1.002 0.9998 0.8525
+0.05721 2.751 1.061 0.9998 0.8253
+0.05736 2.758 1.112 0.9998 0.7961
+0.05762 2.77 1.155 0.9998 0.7648
+0.058 2.788 1.19 0.9998 0.7317
+0.0585 2.812 1.216 0.9998 0.6967
+0.05912 2.842 1.234 0.9998 0.66
+0.05985 2.878 1.244 0.9998 0.6216
+0.0607 2.918 1.245 0.9998 0.5817
+0.06165 2.964 1.238 0.9998 0.5403
+0.06271 3.015 1.224 0.9998 0.4976
+0.06386 3.07 1.201 0.9998 0.4536
+0.06509 3.13 1.171 0.9998 0.4085
+0.0664 3.193 1.135 0.9998 0.3624
+0.06777 3.259 1.092 0.9998 0.3153
+0.0692 3.327 1.043 0.9998 0.2675
+0.07066 3.397 0.9881 0.9998 0.219
+0.07215 3.469 0.9289 0.9998 0.17
+0.07365 3.541 0.8655 0.9998 0.1205
+0.07515 3.613 0.7988 0.9998 0.07074
+0.07663 3.684 0.7293 0.9998 0.02079
+0.07808 3.754 0.6577 0.9998 -0.0292
+0.07949 3.822 0.5848 0.9998 -0.07912
+0.08084 3.886 0.5113 0.9998 -0.1288
+0.08211 3.948 0.4379 0.9998 -0.1782
+0.08329 4.005 0.3653 0.9998 -0.2272
+0.08437 4.057 0.2941 0.9998 -0.2756
+0.08535 4.103 0.225 0.9998 -0.3233
+0.08619 4.144 0.1587 0.9998 -0.3702
+0.08691 4.178 0.09557 0.9998 -0.4161
+0.08747 4.206 0.03631 0.9998 -0.4611
+0.08789 4.226 -0.01867 0.9998 -0.5048
+0.08815 4.238 -0.06894 0.9998 -0.5474
+0.08824 4.243 -0.1141 0.9998 -0.5885
+0.08817 4.239 -0.1539 0.9998 -0.6282
+0.08792 4.227 -0.1881 0.9998 -0.6663
+0.0875 4.207 -0.2165 0.9998 -0.7027
+0.08691 4.179 -0.239 0.9998 -0.7374
+0.08615 4.142 -0.2556 0.9998 -0.7702
+0.08523 4.098 -0.2663 0.9998 -0.8011
+0.08414 4.045 -0.2712 0.9998 -0.8301
+0.0829 3.986 -0.2705 0.9998 -0.8569
+0.08151 3.919 -0.2643 0.9998 -0.8816
+0.07998 3.845 -0.253 0.9998 -0.9041
+0.07832 3.766 -0.237 0.9998 -0.9243
+0.07655 3.68 -0.2166 0.9998 -0.9422
+0.07467 3.59 -0.1923 0.9998 -0.9578
+0.0727 3.495 -0.1645 0.9998 -0.971
+0.07065 3.397 -0.1339 0.9998 -0.9817
+0.06855 3.296 -0.1009 0.9998 -0.99
+0.06639 3.192 -0.06614 0.9998 -0.9958
+0.06421 3.087 -0.03027 0.9998 -0.9991
+0.06201 2.982 0.00613 0.9998 -1
+0.05982 2.876 0.04242 0.9998 -0.9983
+0.05765 2.772 0.07798 0.9998 -0.9941
+0.05551 2.669 0.1122 0.9998 -0.9875
+0.05342 2.568 0.1445 0.9998 -0.9784
+0.0514 2.471 0.1742 0.9998 -0.9668
+0.04946 2.378 0.2009 0.9998 -0.9528
+0.04761 2.289 0.2239 0.9998 -0.9365
+0.04588 2.206 0.2429 0.9998 -0.9178
+0.04426 2.128 0.2574 0.9998 -0.8968
+0.04278 2.057 0.267 0.9998 -0.8735
+0.04144 1.992 0.2713 0.9998 -0.8481
+0.04024 1.935 0.2702 0.9998 -0.8206
+0.03921 1.885 0.2634 0.9998 -0.791
+0.03834 1.843 0.2507 0.9998 -0.7594
+0.03764 1.81 0.2321 0.9998 -0.7259
+0.03711 1.784 0.2076 0.9998 -0.6907
+0.03675 1.767 0.1773 0.9998 -0.6536
+0.03656 1.758 0.1412 0.9998 -0.615
+0.03654 1.757 0.09952 0.9998 -0.5748
+0.03669 1.764 0.05258 0.9998 -0.5332
+0.037 1.779 0.0006879 0.9998 -0.4903
+0.03747 1.801 -0.05578 0.9998 -0.4461
+0.03809 1.831 -0.1164 0.9998 -0.4008
+0.03885 1.868 -0.1806 0.9998 -0.3545
+0.03974 1.91 -0.248 0.9998 -0.3073
+0.04075 1.959 -0.3178 0.9998 -0.2594
+0.04187 2.013 -0.3896 0.9998 -0.2108
+0.04308 2.071 -0.4625 0.9998 -0.1617
+0.04438 2.134 -0.5361 0.9998 -0.1122
+0.04575 2.199 -0.6094 0.9998 -0.06235
+0.04717 2.268 -0.682 0.9998 -0.01239
+0.04863 2.338 -0.7529 0.9998 0.0376
+0.05012 2.41 -0.8216 0.9998 0.0875
+0.05162 2.482 -0.8873 0.9998 0.1372
+0.05312 2.554 -0.9493 0.9998 0.1865
+0.0546 2.625 -1.007 0.9998 0.2354
+0.05605 2.695 -1.06 0.9998 0.2837
+0.05746 2.763 -1.107 0.9998 0.3312
+0.05881 2.828 -1.148 0.9998 0.378
+0.0601 2.889 -1.182 0.9998 0.4238
+0.0613 2.947 -1.21 0.9998 0.4685
+0.06242 3.001 -1.229 0.9998 0.5121
+0.06345 3.05 -1.242 0.9998 0.5544
+0.06437 3.095 -1.246 0.9998 0.5953
+0.06518 3.134 -1.242 0.9998 0.6347
+0.06587 3.167 -1.229 0.9998 0.6725
+0.06645 3.195 -1.208 0.9998 0.7087
+0.06691 3.217 -1.179 0.9998 0.743
+0.06725 3.233 -1.141 0.9998 0.7756
+0.06748 3.244 -1.096 0.9998 0.8061
+0.06758 3.249 -1.042 0.9998 0.8347
+0.06757 3.249 -0.9811 0.9998 0.8612
+0.06745 3.243 -0.9129 0.9998 0.8855
+0.06724 3.233 -0.8381 0.9998 0.9076
+0.06692 3.217 -0.7571 0.9998 0.9275
+0.06652 3.198 -0.6705 0.9998 0.945
+0.06604 3.175 -0.5789 0.9998 0.9602
+0.06549 3.149 -0.4829 0.9998 0.9729
+0.06489 3.12 -0.3834 0.9998 0.9833
+0.06424 3.089 -0.281 0.9998 0.9911
+0.06356 3.056 -0.1765 0.9998 0.9965
+0.06286 3.022 -0.0706 0.9998 0.9994
+-0.0876 2.999 0 0.9996 1
+-0.08652 2.962 0.1054 0.9996 0.9988
+-0.08547 2.926 0.21 0.9996 0.995
+-0.08445 2.891 0.3131 0.9996 0.9888
+-0.08348 2.858 0.4138 0.9996 0.9801
+-0.08259 2.827 0.5115 0.9996 0.9689
+-0.08178 2.8 0.6054 0.9996 0.9553
+-0.08108 2.776 0.6948 0.9996 0.9394
+-0.08049 2.756 0.7791 0.9996 0.9211
+-0.08004 2.74 0.8578 0.9996 0.9004
+-0.07973 2.729 0.9302 0.9996 0.8776
+-0.07956 2.724 0.9959 0.9996 0.8525
+-0.07956 2.724 1.054 0.9996 0.8253
+-0.07973 2.729 1.105 0.9996 0.7961
+-0.08006 2.741 1.149 0.9996 0.7648
+-0.08057 2.758 1.184 0.9996 0.7317
+-0.08125 2.782 1.211 0.9996 0.6967
+-0.08211 2.811 1.23 0.9996 0.66
+-0.08314 2.846 1.24 0.9996 0.6216
+-0.08432 2.887 1.243 0.9996 0.5817
+-0.08567 2.933 1.237 0.9996 0.5403
+-0.08716 2.984 1.224 0.9996 0.4976
+-0.08879 3.04 1.203 0.9996 0.4536
+-0.09055 3.1 1.174 0.9996 0.4085
+-0.09241 3.163 1.139 0.9996 0.3624
+-0.09437 3.23 1.098 0.9996 0.3153
+-0.0964 3.3 1.05 0.9996 0.2675
+-0.0985 3.372 0.9977 0.9996 0.219
+-0.1006 3.445 0.9403 0.9996 0.17
+-0.1028 3.519 0.8788 0.9996 0.1205
+-0.1049 3.592 0.8139 0.9996 0.07074
+-0.1071 3.665 0.7462 0.9996 0.02079
+-0.1092 3.737 0.6764 0.9996 -0.0292
+-0.1112 3.806 0.6052 0.9996 -0.07912
+-0.1131 3.873 0.5333 0.9996 -0.1288
+-0.115 3.936 0.4615 0.9996 -0.1782
+-0.1167 3.994 0.3903 0.9996 -0.2272
+-0.1183 4.048 0.3204 0.9996 -0.2756
+-0.1197 4.096 0.2525 0.9996 -0.3233
+-0.1209 4.139 0.1872 0.9996 -0.3702
+-0.1219 4.175 0.125 0.9996 -0.4161
+-0.1228 4.203 0.06646 0.9996 -0.4611
+-0.1234 4.225 0.012 0.9996 -0.5048
+-0.1238 4.238 -0.03794 0.9996 -0.5474
+-0.124 4.244 -0.08301 0.9996 -0.5885
+-0.1239 4.242 -0.1229 0.9996 -0.6282
+-0.1236 4.231 -0.1574 0.9996 -0.6663
+-0.123 4.211 -0.1863 0.9996 -0.7027
+-0.1222 4.183 -0.2095 0.9996 -0.7374
+-0.1212 4.147 -0.227 0.9996 -0.7702
+-0.1199 4.103 -0.2388 0.9996 -0.8011
+-0.1183 4.051 -0.245 0.9996 -0.8301
+-0.1166 3.991 -0.2457 0.9996 -0.8569
+-0.1146 3.924 -0.2412 0.9996 -0.8816
+-0.1125 3.85 -0.2318 0.9996 -0.9041
+-0.1101 3.77 -0.2178 0.9996 -0.9243
+-0.1076 3.685 -0.1995 0.9996 -0.9422
+-0.105 3.594 -0.1774 0.9996 -0.9578
+-0.1022 3.498 -0.1521 0.9996 -0.971
+-0.0993 3.399 -0.1239 0.9996 -0.9817
+-0.09632 3.297 -0.09344 0.9996 -0.99
+-0.09327 3.193 -0.0613 0.9996 -0.9958
+-0.09018 3.087 -0.02806 0.9996 -0.9991
+-0.08708 2.981 0.005683 0.9996 -1
+-0.08397 2.874 0.03933 0.9996 -0.9983
+-0.08089 2.769 0.07226 0.9996 -0.9941
+-0.07786 2.665 0.1039 0.9996 -0.9875
+-0.07491 2.564 0.1336 0.9996 -0.9784
+-0.07205 2.466 0.1609 0.9996 -0.9668
+-0.06931 2.373 0.1853 0.9996 -0.9528
+-0.0667 2.283 0.2061 0.9996 -0.9365
+-0.06425 2.199 0.223 0.9996 -0.9178
+-0.06197 2.121 0.2355 0.9996 -0.8968
+-0.05988 2.05 0.2433 0.9996 -0.8735
+-0.058 1.985 0.2461 0.9996 -0.8481
+-0.05632 1.928 0.2435 0.9996 -0.8206
+-0.05488 1.879 0.2354 0.9996 -0.791
+-0.05366 1.837 0.2217 0.9996 -0.7594
+-0.05269 1.804 0.2023 0.9996 -0.7259
+-0.05196 1.779 0.1772 0.9996 -0.6907
+-0.05148 1.762 0.1464 0.9996 -0.6536
+-0.05124 1.754 0.1101 0.9996 -0.615
+-0.05125 1.754 0.06842 0.9996 -0.5748
+-0.05149 1.763 0.02168 0.9996 -0.5332
+-0.05197 1.779 -0.02983 0.9996 -0.4903
+-0.05267 1.803 -0.08571 0.9996 -0.4461
+-0.05358 1.834 -0.1456 0.9996 -0.4008
+-0.05469 1.872 -0.2089 0.9996 -0.3545
+-0.05599 1.917 -0.2751 0.9996 -0.3073
+-0.05746 1.967 -0.3437 0.9996 -0.2594
+-0.05908 2.022 -0.4141 0.9996 -0.2108
+-0.06084 2.083 -0.4856 0.9996 -0.1617
+-0.06271 2.147 -0.5575 0.9996 -0.1122
+-0.06469 2.214 -0.6293 0.9996 -0.06235
+-0.06674 2.285 -0.7 0.9996 -0.01239
+-0.06884 2.357 -0.7692 0.9996 0.0376
+-0.07098 2.43 -0.8361 0.9996 0.0875
+-0.07314 2.504 -0.8999 0.9996 0.1372
+-0.07529 2.577 -0.9601 0.9996 0.1865
+-0.07741 2.65 -1.016 0.9996 0.2354
+-0.07949 2.721 -1.067 0.9996 0.2837
+-0.0815 2.79 -1.112 0.9996 0.3312
+-0.08342 2.856 -1.152 0.9996 0.378
+-0.08525 2.918 -1.185 0.9996 0.4238
+-0.08697 2.977 -1.211 0.9996 0.4685
+-0.08855 3.031 -1.229 0.9996 0.5121
+-0.09 3.081 -1.24 0.9996 0.5544
+-0.09129 3.125 -1.243 0.9996 0.5953
+-0.09242 3.164 -1.238 0.9996 0.6347
+-0.09339 3.197 -1.224 0.9996 0.6725
+-0.09419 3.224 -1.203 0.9996 0.7087
+-0.09482 3.246 -1.173 0.9996 0.743
+-0.09527 3.261 -1.135 0.9996 0.7756
+-0.09554 3.271 -1.089 0.9996 0.8061
+-0.09565 3.274 -1.036 0.9996 0.8347
+-0.0956 3.272 -0.9746 0.9996 0.8612
+-0.09538 3.265 -0.9066 0.9996 0.8855
+-0.09502 3.253 -0.832 0.9996 0.9076
+-0.09452 3.236 -0.7514 0.9996 0.9275
+-0.09389 3.214 -0.6653 0.9996 0.945
+-0.09315 3.189 -0.5743 0.9996 0.9602
+-0.09232 3.16 -0.479 0.9996 0.9729
+-0.0914 3.129 -0.3803 0.9996 0.9833
+-0.09041 3.095 -0.2787 0.9996 0.9911
+-0.08938 3.06 -0.175 0.9996 0.9965
+-0.08831 3.023 -0.07001 0.9996 0.9994
+-0.2374 2.991 0 0.9969 1
+-0.2342 2.951 0.1045 0.9969 0.9988
+-0.2312 2.913 0.2081 0.9969 0.995
+-0.2282 2.875 0.3103 0.9969 0.9888
+-0.2254 2.84 0.4102 0.9969 0.9801
+-0.2228 2.807 0.507 0.9969 0.9689
+-0.2204 2.777 0.6002 0.9969 0.9553
+-0.2183 2.751 0.689 0.9969 0.9394
+-0.2166 2.729 0.7728 0.9969 0.9211
+-0.2152 2.711 0.851 0.9969 0.9004
+-0.2142 2.699 0.9231 0.9969 0.8776
+-0.2136 2.692 0.9887 0.9969 0.8525
+-0.2135 2.69 1.047 0.9969 0.8253
+-0.2139 2.694 1.098 0.9969 0.7961
+-0.2147 2.705 1.142 0.9969 0.7648
+-0.216 2.721 1.178 0.9969 0.7317
+-0.2178 2.744 1.205 0.9969 0.6967
+-0.2201 2.773 1.225 0.9969 0.66
+-0.2228 2.807 1.236 0.9969 0.6216
+-0.226 2.848 1.24 0.9969 0.5817
+-0.2297 2.894 1.235 0.9969 0.5403
+-0.2338 2.945 1.223 0.9969 0.4976
+-0.2382 3.001 1.203 0.9969 0.4536
+-0.243 3.062 1.176 0.9969 0.4085
+-0.2481 3.126 1.143 0.9969 0.3624
+-0.2535 3.194 1.103 0.9969 0.3153
+-0.2591 3.265 1.058 0.9969 0.2675
+-0.2649 3.338 1.007 0.9969 0.219
+-0.2708 3.412 0.9512 0.9969 0.17
+-0.2768 3.487 0.8915 0.9969 0.1205
+-0.2827 3.562 0.8285 0.9969 0.07074
+-0.2886 3.636 0.7626 0.9969 0.02079
+-0.2944 3.709 0.6946 0.9969 -0.0292
+-0.3001 3.78 0.6252 0.9969 -0.07912
+-0.3055 3.849 0.555 0.9969 -0.1288
+-0.3106 3.913 0.4848 0.9969 -0.1782
+-0.3154 3.973 0.4151 0.9969 -0.2272
+-0.3198 4.029 0.3466 0.9969 -0.2756
+-0.3237 4.079 0.2799 0.9969 -0.3233
+-0.3272 4.123 0.2157 0.9969 -0.3702
+-0.3302 4.16 0.1544 0.9969 -0.4161
+-0.3326 4.19 0.09656 0.9969 -0.4611
+-0.3344 4.213 0.04265 0.9969 -0.5048
+-0.3355 4.228 -0.006929 0.9969 -0.5474
+-0.3361 4.234 -0.05184 0.9969 -0.5885
+-0.3359 4.233 -0.09178 0.9969 -0.6282
+-0.3351 4.223 -0.1265 0.9969 -0.6663
+-0.3337 4.204 -0.1559 0.9969 -0.7027
+-0.3315 4.177 -0.1798 0.9969 -0.7374
+-0.3287 4.141 -0.1982 0.9969 -0.7702
+-0.3252 4.098 -0.2111 0.9969 -0.8011
+-0.3211 4.046 -0.2186 0.9969 -0.8301
+-0.3164 3.986 -0.2208 0.9969 -0.8569
+-0.3111 3.919 -0.218 0.9969 -0.8816
+-0.3052 3.846 -0.2104 0.9969 -0.9041
+-0.2989 3.765 -0.1984 0.9969 -0.9243
+-0.292 3.679 -0.1823 0.9969 -0.9422
+-0.2848 3.588 -0.1625 0.9969 -0.9578
+-0.2772 3.493 -0.1395 0.9969 -0.971
+-0.2693 3.393 -0.1138 0.9969 -0.9817
+-0.2612 3.291 -0.08594 0.9969 -0.99
+-0.2529 3.186 -0.05642 0.9969 -0.9958
+-0.2444 3.08 -0.02584 0.9969 -0.9991
+-0.2359 2.973 0.005234 0.9969 -1
+-0.2275 2.866 0.03621 0.9969 -0.9983
+-0.2191 2.76 0.0665 0.9969 -0.9941
+-0.2108 2.656 0.09553 0.9969 -0.9875
+-0.2027 2.554 0.1227 0.9969 -0.9784
+-0.1949 2.456 0.1476 0.9969 -0.9668
+-0.1874 2.362 0.1695 0.9969 -0.9528
+-0.1803 2.272 0.1881 0.9969 -0.9365
+-0.1737 2.188 0.2029 0.9969 -0.9178
+-0.1675 2.11 0.2135 0.9969 -0.8968
+-0.1618 2.039 0.2195 0.9969 -0.8735
+-0.1567 1.974 0.2206 0.9969 -0.8481
+-0.1522 1.917 0.2166 0.9969 -0.8206
+-0.1483 1.868 0.2073 0.9969 -0.791
+-0.145 1.827 0.1926 0.9969 -0.7594
+-0.1424 1.794 0.1724 0.9969 -0.7259
+-0.1405 1.77 0.1466 0.9969 -0.6907
+-0.1392 1.754 0.1154 0.9969 -0.6536
+-0.1387 1.747 0.07892 0.9969 -0.615
+-0.1388 1.748 0.03728 0.9969 -0.5748
+-0.1395 1.758 -0.00924 0.9969 -0.5332
+-0.1409 1.775 -0.06032 0.9969 -0.4903
+-0.1429 1.801 -0.1156 0.9969 -0.4461
+-0.1455 1.833 -0.1746 0.9969 -0.4008
+-0.1486 1.873 -0.237 0.9969 -0.3545
+-0.1523 1.919 -0.3021 0.9969 -0.3073
+-0.1564 1.97 -0.3694 0.9969 -0.2594
+-0.1609 2.028 -0.4384 0.9969 -0.2108
+-0.1658 2.089 -0.5084 0.9969 -0.1617
+-0.1711 2.155 -0.5787 0.9969 -0.1122
+-0.1765 2.224 -0.6487 0.9969 -0.06235
+-0.1822 2.296 -0.7177 0.9969 -0.01239
+-0.1881 2.37 -0.785 0.9969 0.0376
+-0.194 2.444 -0.85 0.9969 0.0875
+-0.2 2.52 -0.912 0.9969 0.1372
+-0.2059 2.594 -0.9703 0.9969 0.1865
+-0.2118 2.668 -1.024 0.9969 0.2354
+-0.2175 2.74 -1.074 0.9969 0.2837
+-0.223 2.81 -1.117 0.9969 0.3312
+-0.2283 2.877 -1.155 0.9969 0.378
+-0.2334 2.94 -1.186 0.9969 0.4238
+-0.238 2.999 -1.211 0.9969 0.4685
+-0.2424 3.054 -1.228 0.9969 0.5121
+-0.2463 3.103 -1.237 0.9969 0.5544
+-0.2498 3.148 -1.239 0.9969 0.5953
+-0.2529 3.186 -1.233 0.9969 0.6347
+-0.2555 3.219 -1.219 0.9969 0.6725
+-0.2576 3.246 -1.197 0.9969 0.7087
+-0.2592 3.266 -1.166 0.9969 0.743
+-0.2604 3.281 -1.128 0.9969 0.7756
+-0.261 3.289 -1.082 0.9969 0.8061
+-0.2612 3.291 -1.028 0.9969 0.8347
+-0.261 3.288 -0.9674 0.9969 0.8612
+-0.2602 3.279 -0.8996 0.9969 0.8855
+-0.2591 3.265 -0.8254 0.9969 0.9076
+-0.2576 3.246 -0.7452 0.9969 0.9275
+-0.2557 3.222 -0.6597 0.9969 0.945
+-0.2535 3.194 -0.5693 0.9969 0.9602
+-0.2511 3.164 -0.4748 0.9969 0.9729
+-0.2484 3.13 -0.3769 0.9969 0.9833
+-0.2455 3.094 -0.2762 0.9969 0.9911
+-0.2425 3.056 -0.1734 0.9969 0.9965
+-0.2394 3.017 -0.06937 0.9969 0.9994
+-0.3865 2.975 0 0.9917 1
+-0.3811 2.933 0.1034 0.9917 0.9988
+-0.3758 2.892 0.2061 0.9917 0.995
+-0.3706 2.853 0.3073 0.9917 0.9888
+-0.3657 2.815 0.4063 0.9917 0.9801
+-0.3612 2.78 0.5023 0.9917 0.9689
+-0.357 2.748 0.5947 0.9917 0.9553
+-0.3533 2.719 0.6828 0.9917 0.9394
+-0.3502 2.695 0.766 0.9917 0.9211
+-0.3477 2.676 0.8438 0.9917 0.9004
+-0.3458 2.662 0.9155 0.9917 0.8776
+-0.3447 2.653 0.9809 0.9917 0.8525
+-0.3443 2.65 1.039 0.9917 0.8253
+-0.3447 2.653 1.091 0.9917 0.7961
+-0.3459 2.662 1.134 0.9917 0.7648
+-0.3479 2.678 1.17 0.9917 0.7317
+-0.3508 2.7 1.199 0.9917 0.6967
+-0.3544 2.728 1.219 0.9917 0.66
+-0.3589 2.762 1.231 0.9917 0.6216
+-0.3641 2.802 1.236 0.9917 0.5817
+-0.3701 2.848 1.232 0.9917 0.5403
+-0.3767 2.9 1.221 0.9917 0.4976
+-0.3841 2.956 1.203 0.9917 0.4536
+-0.392 3.017 1.178 0.9917 0.4085
+-0.4004 3.082 1.146 0.9917 0.3624
+-0.4093 3.15 1.108 0.9917 0.3153
+-0.4186 3.222 1.064 0.9917 0.2675
+-0.4281 3.295 1.015 0.9917 0.219
+-0.4379 3.37 0.9614 0.9917 0.17
+-0.4478 3.446 0.9037 0.9917 0.1205
+-0.4577 3.523 0.8425 0.9917 0.07074
+-0.4675 3.598 0.7786 0.9917 0.02079
+-0.4772 3.673 0.7124 0.9917 -0.0292
+-0.4866 3.745 0.6448 0.9917 -0.07912
+-0.4956 3.814 0.5764 0.9917 -0.1288
+-0.5042 3.88 0.5077 0.9917 -0.1782
+-0.5122 3.942 0.4396 0.9917 -0.2272
+-0.5196 3.999 0.3725 0.9917 -0.2756
+-0.5262 4.05 0.3071 0.9917 -0.3233
+-0.5321 4.095 0.244 0.9917 -0.3702
+-0.5371 4.134 0.1837 0.9917 -0.4161
+-0.5412 4.165 0.1266 0.9917 -0.4611
+-0.5443 4.189 0.07329 0.9917 -0.5048
+-0.5464 4.205 0.02409 0.9917 -0.5474
+-0.5474 4.213 -0.02063 0.9917 -0.5885
+-0.5473 4.213 -0.0606 0.9917 -0.6282
+-0.5461 4.203 -0.09559 0.9917 -0.6663
+-0.5438 4.186 -0.1254 0.9917 -0.7027
+-0.5404 4.159 -0.15 0.9917 -0.7374
+-0.5359 4.124 -0.1693 0.9917 -0.7702
+-0.5302 4.081 -0.1833 0.9917 -0.8011
+-0.5236 4.03 -0.192 0.9917 -0.8301
+-0.5159 3.971 -0.1958 0.9917 -0.8569
+-0.5072 3.904 -0.1947 0.9917 -0.8816
+-0.4977 3.83 -0.1889 0.9917 -0.9041
+-0.4873 3.75 -0.1789 0.9917 -0.9243
+-0.4761 3.665 -0.165 0.9917 -0.9422
+-0.4643 3.573 -0.1475 0.9917 -0.9578
+-0.4519 3.478 -0.1269 0.9917 -0.971
+-0.4389 3.378 -0.1037 0.9917 -0.9817
+-0.4256 3.276 -0.07839 0.9917 -0.99
+-0.4119 3.171 -0.05151 0.9917 -0.9958
+-0.3981 3.064 -0.0236 0.9917 -0.9991
+-0.3842 2.957 0.004781 0.9917 -1
+-0.3703 2.85 0.03307 0.9917 -0.9983
+-0.3565 2.744 0.06069 0.9917 -0.9941
+-0.343 2.64 0.0871 0.9917 -0.9875
+-0.3298 2.538 0.1118 0.9917 -0.9784
+-0.317 2.44 0.1341 0.9917 -0.9668
+-0.3047 2.345 0.1537 0.9917 -0.9528
+-0.2931 2.256 0.1701 0.9917 -0.9365
+-0.2822 2.172 0.1827 0.9917 -0.9178
+-0.2721 2.094 0.1914 0.9917 -0.8968
+-0.2628 2.023 0.1956 0.9917 -0.8735
+-0.2545 1.959 0.1951 0.9917 -0.8481
+-0.2471 1.902 0.1897 0.9917 -0.8206
+-0.2408 1.853 0.1791 0.9917 -0.791
+-0.2356 1.813 0.1634 0.9917 -0.7594
+-0.2314 1.781 0.1423 0.9917 -0.7259
+-0.2283 1.757 0.116 0.9917 -0.6907
+-0.2264 1.743 0.08439 0.9917 -0.6536
+-0.2256 1.736 0.04771 0.9917 -0.615
+-0.2259 1.739 0.006111 0.9917 -0.5748
+-0.2273 1.749 -0.04015 0.9917 -0.5332
+-0.2297 1.768 -0.09078 0.9917 -0.4903
+-0.2331 1.794 -0.1454 0.9917 -0.4461
+-0.2375 1.828 -0.2036 0.9917 -0.4008
+-0.2428 1.869 -0.2649 0.9917 -0.3545
+-0.249 1.916 -0.3289 0.9917 -0.3073
+-0.2559 1.97 -0.3949 0.9917 -0.2594
+-0.2635 2.028 -0.4624 0.9917 -0.2108
+-0.2717 2.091 -0.5308 0.9917 -0.1617
+-0.2805 2.159 -0.5994 0.9917 -0.1122
+-0.2896 2.229 -0.6677 0.9917 -0.06235
+-0.2991 2.302 -0.7349 0.9917 -0.01239
+-0.3088 2.377 -0.8003 0.9917 0.0376
+-0.3187 2.453 -0.8635 0.9917 0.0875
+-0.3286 2.529 -0.9235 0.9917 0.1372
+-0.3385 2.605 -0.98 0.9917 0.1865
+-0.3482 2.68 -1.032 0.9917 0.2354
+-0.3577 2.753 -1.079 0.9917 0.2837
+-0.3668 2.823 -1.121 0.9917 0.3312
+-0.3756 2.89 -1.157 0.9917 0.378
+-0.3838 2.954 -1.187 0.9917 0.4238
+-0.3915 3.014 -1.21 0.9917 0.4685
+-0.3986 3.068 -1.226 0.9917 0.5121
+-0.4051 3.118 -1.234 0.9917 0.5544
+-0.4108 3.162 -1.235 0.9917 0.5953
+-0.4158 3.2 -1.228 0.9917 0.6347
+-0.42 3.232 -1.213 0.9917 0.6725
+-0.4233 3.258 -1.19 0.9917 0.7087
+-0.4259 3.278 -1.159 0.9917 0.743
+-0.4276 3.291 -1.12 0.9917 0.7756
+-0.4286 3.298 -1.074 0.9917 0.8061
+-0.4287 3.299 -1.02 0.9917 0.8347
+-0.4281 3.295 -0.9596 0.9917 0.8612
+-0.4267 3.284 -0.8921 0.9917 0.8855
+-0.4246 3.268 -0.8183 0.9917 0.9076
+-0.4219 3.247 -0.7386 0.9917 0.9275
+-0.4186 3.221 -0.6537 0.9917 0.945
+-0.4147 3.192 -0.564 0.9917 0.9602
+-0.4104 3.159 -0.4704 0.9917 0.9729
+-0.4057 3.123 -0.3733 0.9917 0.9833
+-0.4007 3.084 -0.2735 0.9917 0.9911
+-0.3955 3.044 -0.1717 0.9917 0.9965
+-0.3901 3.003 -0.0687 0.9917 0.9994
+-0.5347 2.952 0 0.984 1
+-0.5268 2.908 0.1024 0.984 0.9988
+-0.519 2.865 0.204 0.984 0.995
+-0.5114 2.823 0.3041 0.984 0.9888
+-0.5042 2.783 0.4021 0.984 0.9801
+-0.4974 2.746 0.4972 0.984 0.9689
+-0.4913 2.712 0.5888 0.984 0.9553
+-0.4858 2.682 0.6761 0.984 0.9394
+-0.4811 2.656 0.7587 0.984 0.9211
+-0.4773 2.635 0.836 0.984 0.9004
+-0.4744 2.619 0.9074 0.984 0.8776
+-0.4725 2.609 0.9724 0.984 0.8525
+-0.4717 2.604 1.031 0.984 0.8253
+-0.4721 2.606 1.082 0.984 0.7961
+-0.4735 2.614 1.126 0.984 0.7648
+-0.4762 2.629 1.163 0.984 0.7317
+-0.4799 2.649 1.191 0.984 0.6967
+-0.4849 2.677 1.212 0.984 0.66
+-0.491 2.711 1.225 0.984 0.6216
+-0.4982 2.75 1.231 0.984 0.5817
+-0.5065 2.796 1.229 0.984 0.5403
+-0.5157 2.847 1.219 0.984 0.4976
+-0.526 2.903 1.202 0.984 0.4536
+-0.537 2.964 1.179 0.984 0.4085
+-0.5488 3.03 1.148 0.984 0.3624
+-0.5613 3.099 1.112 0.984 0.3153
+-0.5743 3.17 1.07 0.984 0.2675
+-0.5877 3.245 1.023 0.984 0.219
+-0.6015 3.321 0.9711 0.984 0.17
+-0.6154 3.397 0.9153 0.984 0.1205
+-0.6294 3.475 0.8561 0.984 0.07074
+-0.6433 3.551 0.794 0.984 0.02079
+-0.6569 3.627 0.7298 0.984 -0.0292
+-0.6702 3.7 0.664 0.984 -0.07912
+-0.683 3.77 0.5973 0.984 -0.1288
+-0.6952 3.838 0.5304 0.984 -0.1782
+-0.7065 3.9 0.4638 0.984 -0.2272
+-0.7171 3.958 0.3982 0.984 -0.2756
+-0.7266 4.011 0.3341 0.984 -0.3233
+-0.735 4.057 0.2722 0.984 -0.3702
+-0.7422 4.097 0.2128 0.984 -0.4161
+-0.7481 4.13 0.1566 0.984 -0.4611
+-0.7526 4.155 0.1039 0.984 -0.5048
+-0.7557 4.172 0.0551 0.984 -0.5474
+-0.7573 4.181 0.01058 0.984 -0.5885
+-0.7574 4.181 -0.02939 0.984 -0.6282
+-0.7559 4.173 -0.06459 0.984 -0.6663
+-0.7528 4.156 -0.09486 0.984 -0.7027
+-0.7482 4.13 -0.1201 0.984 -0.7374
+-0.742 4.096 -0.1402 0.984 -0.7702
+-0.7343 4.054 -0.1553 0.984 -0.8011
+-0.7251 4.003 -0.1654 0.984 -0.8301
+-0.7145 3.944 -0.1706 0.984 -0.8569
+-0.7025 3.878 -0.1712 0.984 -0.8816
+-0.6893 3.805 -0.1673 0.984 -0.9041
+-0.6749 3.726 -0.1593 0.984 -0.9243
+-0.6594 3.64 -0.1475 0.984 -0.9422
+-0.6429 3.549 -0.1323 0.984 -0.9578
+-0.6256 3.454 -0.1142 0.984 -0.971
+-0.6076 3.354 -0.0935 0.984 -0.9817
+-0.5891 3.252 -0.07079 0.984 -0.99
+-0.5701 3.147 -0.04656 0.984 -0.9958
+-0.5509 3.041 -0.02135 0.984 -0.9991
+-0.5315 2.934 0.004325 0.984 -1
+-0.5121 2.827 0.0299 0.984 -0.9983
+-0.4929 2.721 0.05485 0.984 -0.9941
+-0.4741 2.617 0.07862 0.984 -0.9875
+-0.4557 2.516 0.1007 0.984 -0.9784
+-0.4379 2.418 0.1206 0.984 -0.9668
+-0.4209 2.324 0.1378 0.984 -0.9528
+-0.4048 2.235 0.1519 0.984 -0.9365
+-0.3896 2.151 0.1624 0.984 -0.9178
+-0.3756 2.073 0.1691 0.984 -0.8968
+-0.3628 2.003 0.1715 0.984 -0.8735
+-0.3512 1.939 0.1694 0.984 -0.8481
+-0.3411 1.883 0.1626 0.984 -0.8206
+-0.3324 1.835 0.1508 0.984 -0.791
+-0.3252 1.795 0.134 0.984 -0.7594
+-0.3195 1.764 0.1122 0.984 -0.7259
+-0.3154 1.741 0.08524 0.984 -0.6907
+-0.3129 1.727 0.0533 0.984 -0.6536
+-0.312 1.722 0.01647 0.984 -0.615
+-0.3125 1.725 -0.02506 0.984 -0.5748
+-0.3147 1.737 -0.07104 0.984 -0.5332
+-0.3182 1.757 -0.1212 0.984 -0.4903
+-0.3232 1.784 -0.1751 0.984 -0.4461
+-0.3296 1.819 -0.2325 0.984 -0.4008
+-0.3372 1.861 -0.2927 0.984 -0.3545
+-0.346 1.91 -0.3555 0.984 -0.3073
+-0.3558 1.964 -0.4201 0.984 -0.2594
+-0.3667 2.024 -0.4861 0.984 -0.2108
+-0.3783 2.089 -0.5529 0.984 -0.1617
+-0.3907 2.157 -0.6198 0.984 -0.1122
+-0.4037 2.228 -0.6863 0.984 -0.06235
+-0.4171 2.303 -0.7516 0.984 -0.01239
+-0.4308 2.378 -0.8152 0.984 0.0376
+-0.4448 2.455 -0.8763 0.984 0.0875
+-0.4587 2.532 -0.9345 0.984 0.1372
+-0.4726 2.609 -0.989 0.984 0.1865
+-0.4863 2.685 -1.039 0.984 0.2354
+-0.4996 2.758 -1.085 0.984 0.2837
+-0.5124 2.829 -1.125 0.984 0.3312
+-0.5247 2.897 -1.159 0.984 0.378
+-0.5363 2.96 -1.187 0.984 0.4238
+-0.5471 3.02 -1.209 0.984 0.4685
+-0.557 3.075 -1.223 0.984 0.5121
+-0.5659 3.124 -1.23 0.984 0.5544
+-0.5738 3.168 -1.23 0.984 0.5953
+-0.5806 3.205 -1.222 0.984 0.6347
+-0.5864 3.237 -1.206 0.984 0.6725
+-0.5909 3.262 -1.183 0.984 0.7087
+-0.5943 3.281 -1.151 0.984 0.743
+-0.5966 3.293 -1.112 0.984 0.7756
+-0.5977 3.299 -1.066 0.984 0.8061
+-0.5976 3.299 -1.012 0.984 0.8347
+-0.5964 3.293 -0.9513 0.984 0.8612
+-0.5942 3.28 -0.884 0.984 0.8855
+-0.591 3.263 -0.8106 0.984 0.9076
+-0.5869 3.24 -0.7315 0.984 0.9275
+-0.5819 3.213 -0.6473 0.984 0.945
+-0.5762 3.181 -0.5584 0.984 0.9602
+-0.5699 3.146 -0.4656 0.984 0.9729
+-0.5629 3.108 -0.3694 0.984 0.9833
+-0.5556 3.067 -0.2707 0.984 0.9911
+-0.5479 3.025 -0.1699 0.984 0.9965
+-0.54 2.981 -0.06798 0.984 0.9994
+-0.6816 2.922 0 0.9738 1
+-0.6709 2.876 0.1012 0.9738 0.9988
+-0.6603 2.83 0.2017 0.9738 0.995
+-0.6501 2.787 0.3008 0.9738 0.9888
+-0.6404 2.745 0.3977 0.9738 0.9801
+-0.6312 2.706 0.4918 0.9738 0.9689
+-0.6229 2.67 0.5825 0.9738 0.9553
+-0.6154 2.638 0.6691 0.9738 0.9394
+-0.6089 2.61 0.751 0.9738 0.9211
+-0.6036 2.587 0.8276 0.9738 0.9004
+-0.5996 2.57 0.8986 0.9738 0.8776
+-0.5968 2.558 0.9634 0.9738 0.8525
+-0.5955 2.552 1.022 0.9738 0.8253
+-0.5956 2.553 1.073 0.9738 0.7961
+-0.5972 2.56 1.117 0.9738 0.7648
+-0.6003 2.573 1.154 0.9738 0.7317
+-0.605 2.593 1.183 0.9738 0.6967
+-0.6112 2.62 1.205 0.9738 0.66
+-0.6189 2.653 1.219 0.9738 0.6216
+-0.6281 2.692 1.225 0.9738 0.5817
+-0.6386 2.737 1.224 0.9738 0.5403
+-0.6505 2.788 1.216 0.9738 0.4976
+-0.6636 2.844 1.201 0.9738 0.4536
+-0.6778 2.905 1.179 0.9738 0.4085
+-0.693 2.97 1.15 0.9738 0.3624
+-0.7091 3.039 1.115 0.9738 0.3153
+-0.7259 3.112 1.075 0.9738 0.2675
+-0.7433 3.186 1.03 0.9738 0.219
+-0.7612 3.263 0.9802 0.9738 0.17
+-0.7792 3.34 0.9263 0.9738 0.1205
+-0.7974 3.418 0.8691 0.9738 0.07074
+-0.8154 3.495 0.809 0.9738 0.02079
+-0.8332 3.571 0.7467 0.9738 -0.0292
+-0.8505 3.645 0.6828 0.9738 -0.07912
+-0.8671 3.717 0.618 0.9738 -0.1288
+-0.883 3.785 0.5527 0.9738 -0.1782
+-0.8979 3.849 0.4878 0.9738 -0.2272
+-0.9117 3.908 0.4236 0.9738 -0.2756
+-0.9241 3.961 0.3609 0.9738 -0.3233
+-0.9352 4.009 0.3002 0.9738 -0.3702
+-0.9447 4.049 0.2418 0.9738 -0.4161
+-0.9526 4.083 0.1864 0.9738 -0.4611
+-0.9586 4.109 0.1344 0.9738 -0.5048
+-0.9629 4.127 0.08607 0.9738 -0.5474
+-0.9652 4.137 0.04179 0.9738 -0.5885
+-0.9655 4.138 0.001843 0.9738 -0.6282
+-0.9638 4.131 -0.03356 0.9738 -0.6663
+-0.96 4.115 -0.06425 0.9738 -0.7027
+-0.9543 4.09 -0.09012 0.9738 -0.7374
+-0.9465 4.057 -0.1111 0.9738 -0.7702
+-0.9368 4.015 -0.1273 0.9738 -0.8011
+-0.9251 3.965 -0.1386 0.9738 -0.8301
+-0.9116 3.908 -0.1454 0.9738 -0.8569
+-0.8964 3.842 -0.1476 0.9738 -0.8816
+-0.8795 3.77 -0.1456 0.9738 -0.9041
+-0.8611 3.691 -0.1396 0.9738 -0.9243
+-0.8413 3.606 -0.13 0.9738 -0.9422
+-0.8202 3.516 -0.1171 0.9738 -0.9578
+-0.7981 3.421 -0.1014 0.9738 -0.971
+-0.775 3.322 -0.08324 0.9738 -0.9817
+-0.7513 3.22 -0.06314 0.9738 -0.99
+-0.7269 3.116 -0.04159 0.9738 -0.9958
+-0.7023 3.01 -0.01908 0.9738 -0.9991
+-0.6774 2.904 0.003866 0.9738 -1
+-0.6526 2.797 0.02672 0.9738 -0.9983
+-0.628 2.692 0.04897 0.9738 -0.9941
+-0.6039 2.588 0.07009 0.9738 -0.9875
+-0.5803 2.487 0.08959 0.9738 -0.9784
+-0.5576 2.39 0.107 0.9738 -0.9668
+-0.5358 2.297 0.1218 0.9738 -0.9528
+-0.5151 2.208 0.1336 0.9738 -0.9365
+-0.4958 2.125 0.142 0.9738 -0.9178
+-0.4779 2.048 0.1467 0.9738 -0.8968
+-0.4615 1.978 0.1473 0.9738 -0.8735
+-0.4468 1.915 0.1436 0.9738 -0.8481
+-0.4339 1.86 0.1354 0.9738 -0.8206
+-0.4229 1.813 0.1224 0.9738 -0.791
+-0.4139 1.774 0.1046 0.9738 -0.7594
+-0.4068 1.743 0.08196 0.9738 -0.7259
+-0.4017 1.722 0.05446 0.9738 -0.6907
+-0.3986 1.709 0.02217 0.9738 -0.6536
+-0.3976 1.704 -0.01478 0.9738 -0.615
+-0.3986 1.709 -0.05621 0.9738 -0.5748
+-0.4016 1.721 -0.1019 0.9738 -0.5332
+-0.4064 1.742 -0.1515 0.9738 -0.4903
+-0.4131 1.771 -0.2047 0.9738 -0.4461
+-0.4215 1.807 -0.2611 0.9738 -0.4008
+-0.4316 1.85 -0.3203 0.9738 -0.3545
+-0.4431 1.899 -0.3818 0.9738 -0.3073
+-0.456 1.955 -0.4451 0.9738 -0.2594
+-0.4702 2.015 -0.5095 0.9738 -0.2108
+-0.4854 2.081 -0.5747 0.9738 -0.1617
+-0.5016 2.15 -0.6398 0.9738 -0.1122
+-0.5185 2.222 -0.7044 0.9738 -0.06235
+-0.536 2.297 -0.7679 0.9738 -0.01239
+-0.5538 2.374 -0.8295 0.9738 0.0376
+-0.5719 2.451 -0.8887 0.9738 0.0875
+-0.5901 2.529 -0.9449 0.9738 0.1372
+-0.6081 2.606 -0.9974 0.9738 0.1865
+-0.6258 2.682 -1.046 0.9738 0.2354
+-0.643 2.756 -1.089 0.9738 0.2837
+-0.6596 2.827 -1.128 0.9738 0.3312
+-0.6754 2.895 -1.16 0.9738 0.378
+-0.6903 2.959 -1.187 0.9738 0.4238
+-0.7042 3.018 -1.207 0.9738 0.4685
+-0.7169 3.073 -1.22 0.9738 0.5121
+-0.7283 3.122 -1.226 0.9738 0.5544
+-0.7384 3.165 -1.224 0.9738 0.5953
+-0.747 3.202 -1.215 0.9738 0.6347
+-0.7542 3.233 -1.198 0.9738 0.6725
+-0.7599 3.257 -1.174 0.9738 0.7087
+-0.7641 3.275 -1.142 0.9738 0.743
+-0.7667 3.286 -1.103 0.9738 0.7756
+-0.7678 3.291 -1.057 0.9738 0.8061
+-0.7674 3.289 -1.003 0.9738 0.8347
+-0.7656 3.282 -0.9423 0.9738 0.8612
+-0.7624 3.268 -0.8754 0.9738 0.8855
+-0.7579 3.249 -0.8025 0.9738 0.9076
+-0.7522 3.224 -0.724 0.9738 0.9275
+-0.7454 3.195 -0.6404 0.9738 0.945
+-0.7376 3.162 -0.5524 0.9738 0.9602
+-0.729 3.125 -0.4605 0.9738 0.9729
+-0.7196 3.085 -0.3654 0.9738 0.9833
+-0.7097 3.042 -0.2676 0.9738 0.9911
+-0.6993 2.998 -0.168 0.9738 0.9965
+-0.6887 2.952 -0.06722 0.9738 0.9994
+-0.8268 2.884 0 0.9613 1
+-0.8131 2.836 0.1 0.9613 0.9988
+-0.7996 2.789 0.1993 0.9613 0.995
+-0.7865 2.743 0.2972 0.9613 0.9888
+-0.774 2.7 0.393 0.9613 0.9801
+-0.7623 2.659 0.4861 0.9613 0.9689
+-0.7515 2.621 0.5758 0.9613 0.9553
+-0.7419 2.588 0.6616 0.9613 0.9394
+-0.7335 2.558 0.7427 0.9613 0.9211
+-0.7265 2.534 0.8188 0.9613 0.9004
+-0.7211 2.515 0.8893 0.9613 0.8776
+-0.7173 2.502 0.9538 0.9613 0.8525
+-0.7153 2.495 1.012 0.9613 0.8253
+-0.7151 2.494 1.063 0.9613 0.7961
+-0.7167 2.5 1.108 0.9613 0.7648
+-0.7203 2.512 1.145 0.9613 0.7317
+-0.7258 2.531 1.174 0.9613 0.6967
+-0.7331 2.557 1.197 0.9613 0.66
+-0.7424 2.589 1.212 0.9613 0.6216
+-0.7534 2.628 1.219 0.9613 0.5817
+-0.7662 2.673 1.219 0.9613 0.5403
+-0.7807 2.723 1.212 0.9613 0.4976
+-0.7966 2.779 1.198 0.9613 0.4536
+-0.814 2.839 1.178 0.9613 0.4085
+-0.8327 2.904 1.151 0.9613 0.3624
+-0.8525 2.973 1.118 0.9613 0.3153
+-0.8731 3.046 1.08 0.9613 0.2675
+-0.8945 3.12 1.036 0.9613 0.219
+-0.9165 3.197 0.9886 0.9613 0.17
+-0.9388 3.274 0.9368 0.9613 0.1205
+-0.9612 3.353 0.8816 0.9613 0.07074
+-0.9834 3.43 0.8235 0.9613 0.02079
+-1.005 3.507 0.7631 0.9613 -0.0292
+-1.027 3.582 0.7012 0.9613 -0.07912
+-1.047 3.654 0.6382 0.9613 -0.1288
+-1.067 3.722 0.5747 0.9613 -0.1782
+-1.086 3.787 0.5114 0.9613 -0.2272
+-1.103 3.847 0.4488 0.9613 -0.2756
+-1.118 3.901 0.3875 0.9613 -0.3233
+-1.132 3.949 0.328 0.9613 -0.3702
+-1.144 3.991 0.2707 0.9613 -0.4161
+-1.154 4.025 0.2162 0.9613 -0.4611
+-1.162 4.052 0.1648 0.9613 -0.5048
+-1.167 4.071 0.117 0.9613 -0.5474
+-1.17 4.082 0.07297 0.9613 -0.5885
+-1.171 4.084 0.03307 0.9613 -0.6282
+-1.169 4.078 -0.002502 0.9613 -0.6663
+-1.165 4.063 -0.03359 0.9613 -0.7027
+-1.158 4.039 -0.06009 0.9613 -0.7374
+-1.149 4.007 -0.08194 0.9613 -0.7702
+-1.137 3.966 -0.09916 0.9613 -0.8011
+-1.123 3.917 -0.1118 0.9613 -0.8301
+-1.107 3.86 -0.12 0.9613 -0.8569
+-1.088 3.796 -0.1239 0.9613 -0.8816
+-1.068 3.724 -0.1238 0.9613 -0.9041
+-1.045 3.646 -0.1198 0.9613 -0.9243
+-1.021 3.562 -0.1124 0.9613 -0.9422
+-0.9957 3.473 -0.1018 0.9613 -0.9578
+-0.9687 3.379 -0.08854 0.9613 -0.971
+-0.9406 3.281 -0.07294 0.9613 -0.9817
+-0.9117 3.18 -0.05546 0.9613 -0.99
+-0.882 3.077 -0.03659 0.9613 -0.9958
+-0.852 2.972 -0.0168 0.9613 -0.9991
+-0.8217 2.866 0.003405 0.9613 -1
+-0.7914 2.761 0.02352 0.9613 -0.9983
+-0.7615 2.656 0.04306 0.9613 -0.9941
+-0.732 2.553 0.06152 0.9613 -0.9875
+-0.7033 2.453 0.07842 0.9613 -0.9784
+-0.6756 2.357 0.09329 0.9613 -0.9668
+-0.6491 2.264 0.1057 0.9613 -0.9528
+-0.624 2.177 0.1153 0.9613 -0.9365
+-0.6005 2.094 0.1215 0.9613 -0.9178
+-0.5787 2.019 0.1243 0.9613 -0.8968
+-0.5589 1.949 0.1231 0.9613 -0.8735
+-0.5411 1.887 0.1177 0.9613 -0.8481
+-0.5255 1.833 0.1081 0.9613 -0.8206
+-0.5123 1.787 0.09389 0.9613 -0.791
+-0.5014 1.749 0.07511 0.9613 -0.7594
+-0.4929 1.719 0.05169 0.9613 -0.7259
+-0.487 1.699 0.02364 0.9613 -0.6907
+-0.4835 1.686 -0.008968 0.9613 -0.6536
+-0.4825 1.683 -0.04602 0.9613 -0.615
+-0.484 1.688 -0.08733 0.9613 -0.5748
+-0.4879 1.702 -0.1327 0.9613 -0.5332
+-0.4941 1.724 -0.1817 0.9613 -0.4903
+-0.5026 1.753 -0.2342 0.9613 -0.4461
+-0.5132 1.79 -0.2897 0.9613 -0.4008
+-0.5258 1.834 -0.3478 0.9613 -0.3545
+-0.5402 1.884 -0.4079 0.9613 -0.3073
+-0.5563 1.94 -0.4698 0.9613 -0.2594
+-0.5739 2.002 -0.5326 0.9613 -0.2108
+-0.5929 2.068 -0.5961 0.9613 -0.1617
+-0.6129 2.138 -0.6594 0.9613 -0.1122
+-0.6338 2.211 -0.7222 0.9613 -0.06235
+-0.6555 2.286 -0.7836 0.9613 -0.01239
+-0.6776 2.363 -0.8433 0.9613 0.0376
+-0.6999 2.441 -0.9005 0.9613 0.0875
+-0.7223 2.519 -0.9546 0.9613 0.1372
+-0.7445 2.597 -1.005 0.9613 0.1865
+-0.7663 2.673 -1.052 0.9613 0.2354
+-0.7875 2.747 -1.093 0.9613 0.2837
+-0.8078 2.818 -1.13 0.9613 0.3312
+-0.8273 2.886 -1.161 0.9613 0.378
+-0.8455 2.949 -1.185 0.9613 0.4238
+-0.8624 3.008 -1.204 0.9613 0.4685
+-0.8779 3.062 -1.215 0.9613 0.5121
+-0.8918 3.111 -1.22 0.9613 0.5544
+-0.904 3.153 -1.217 0.9613 0.5953
+-0.9145 3.19 -1.208 0.9613 0.6347
+-0.9231 3.22 -1.19 0.9613 0.6725
+-0.9298 3.243 -1.165 0.9613 0.7087
+-0.9347 3.26 -1.133 0.9613 0.743
+-0.9376 3.27 -1.093 0.9613 0.7756
+-0.9386 3.274 -1.047 0.9613 0.8061
+-0.9378 3.271 -0.9931 0.9613 0.8347
+-0.9351 3.262 -0.9328 0.9613 0.8612
+-0.9308 3.247 -0.8662 0.9613 0.8855
+-0.9249 3.226 -0.7938 0.9613 0.9076
+-0.9174 3.2 -0.716 0.9613 0.9275
+-0.9086 3.169 -0.6332 0.9613 0.945
+-0.8985 3.134 -0.5461 0.9613 0.9602
+-0.8874 3.095 -0.4552 0.9613 0.9729
+-0.8754 3.053 -0.3611 0.9613 0.9833
+-0.8627 3.009 -0.2645 0.9613 0.9911
+-0.8494 2.963 -0.166 0.9613 0.9965
+-0.8359 2.916 -0.06641 0.9613 0.9994
+-0.9699 2.839 0 0.9463 1
+-0.953 2.79 0.09873 0.9463 0.9988
+-0.9364 2.741 0.1968 0.9463 0.995
+-0.9203 2.694 0.2935 0.9463 0.9888
+-0.9048 2.649 0.3881 0.9463 0.9801
+-0.8903 2.606 0.4801 0.9463 0.9689
+-0.877 2.567 0.5688 0.9463 0.9553
+-0.8649 2.532 0.6536 0.9463 0.9394
+-0.8545 2.501 0.734 0.9463 0.9211
+-0.8457 2.475 0.8095 0.9463 0.9004
+-0.8387 2.455 0.8794 0.9463 0.8776
+-0.8338 2.441 0.9436 0.9463 0.8525
+-0.831 2.432 1.001 0.9463 0.8253
+-0.8303 2.43 1.053 0.9463 0.7961
+-0.8319 2.435 1.097 0.9463 0.7648
+-0.8357 2.446 1.135 0.9463 0.7317
+-0.8419 2.464 1.165 0.9463 0.6967
+-0.8504 2.489 1.188 0.9463 0.66
+-0.8611 2.52 1.204 0.9463 0.6216
+-0.874 2.558 1.212 0.9463 0.5817
+-0.889 2.602 1.213 0.9463 0.5403
+-0.906 2.652 1.208 0.9463 0.4976
+-0.9249 2.707 1.195 0.9463 0.4536
+-0.9454 2.767 1.176 0.9463 0.4085
+-0.9675 2.832 1.151 0.9463 0.3624
+-0.9909 2.901 1.12 0.9463 0.3153
+-1.016 2.972 1.084 0.9463 0.2675
+-1.041 3.047 1.042 0.9463 0.219
+-1.067 3.123 0.9964 0.9463 0.17
+-1.094 3.201 0.9467 0.9463 0.1205
+-1.12 3.279 0.8935 0.9463 0.07074
+-1.147 3.357 0.8374 0.9463 0.02079
+-1.173 3.434 0.7791 0.9463 -0.0292
+-1.199 3.509 0.7191 0.9463 -0.07912
+-1.224 3.581 0.658 0.9463 -0.1288
+-1.247 3.651 0.5963 0.9463 -0.1782
+-1.269 3.716 0.5347 0.9463 -0.2272
+-1.29 3.776 0.4737 0.9463 -0.2756
+-1.309 3.831 0.4138 0.9463 -0.3233
+-1.325 3.88 0.3556 0.9463 -0.3702
+-1.34 3.922 0.2994 0.9463 -0.4161
+-1.352 3.957 0.2458 0.9463 -0.4611
+-1.361 3.985 0.1952 0.9463 -0.5048
+-1.368 4.005 0.1478 0.9463 -0.5474
+-1.372 4.016 0.1041 0.9463 -0.5885
+-1.373 4.02 0.06428 0.9463 -0.6282
+-1.371 4.014 0.02855 0.9463 -0.6663
+-1.367 4 -0.002915 0.9463 -0.7027
+-1.359 3.977 -0.03002 0.9463 -0.7374
+-1.348 3.946 -0.05271 0.9463 -0.7702
+-1.335 3.906 -0.07098 0.9463 -0.8011
+-1.318 3.859 -0.0849 0.9463 -0.8301
+-1.299 3.803 -0.09457 0.9463 -0.8569
+-1.277 3.739 -0.1002 0.9463 -0.8816
+-1.253 3.669 -0.1019 0.9463 -0.9041
+-1.227 3.592 -0.09995 0.9463 -0.9243
+-1.199 3.509 -0.09471 0.9463 -0.9422
+-1.169 3.421 -0.08649 0.9463 -0.9578
+-1.137 3.328 -0.07564 0.9463 -0.971
+-1.104 3.232 -0.06258 0.9463 -0.9817
+-1.07 3.132 -0.04774 0.9463 -0.99
+-1.035 3.029 -0.03156 0.9463 -0.9958
+-0.9995 2.926 -0.01451 0.9463 -0.9991
+-0.9639 2.821 0.002942 0.9463 -1
+-0.9282 2.717 0.02031 0.9463 -0.9983
+-0.893 2.614 0.03712 0.9463 -0.9941
+-0.8583 2.512 0.05291 0.9463 -0.9875
+-0.8245 2.413 0.0672 0.9463 -0.9784
+-0.7919 2.318 0.07956 0.9463 -0.9668
+-0.7607 2.227 0.08956 0.9463 -0.9528
+-0.7311 2.14 0.09683 0.9463 -0.9365
+-0.7035 2.059 0.101 0.9463 -0.9178
+-0.6779 1.984 0.1017 0.9463 -0.8968
+-0.6547 1.916 0.09872 0.9463 -0.8735
+-0.6339 1.855 0.09179 0.9463 -0.8481
+-0.6157 1.802 0.0807 0.9463 -0.8206
+-0.6003 1.757 0.06533 0.9463 -0.791
+-0.5877 1.72 0.04557 0.9463 -0.7594
+-0.5779 1.692 0.0214 0.9463 -0.7259
+-0.5712 1.672 -0.007185 0.9463 -0.6907
+-0.5674 1.661 -0.0401 0.9463 -0.6536
+-0.5665 1.658 -0.07723 0.9463 -0.615
+-0.5686 1.664 -0.1184 0.9463 -0.5748
+-0.5735 1.679 -0.1634 0.9463 -0.5332
+-0.5812 1.701 -0.2118 0.9463 -0.4903
+-0.5916 1.732 -0.2635 0.9463 -0.4461
+-0.6045 1.769 -0.318 0.9463 -0.4008
+-0.6197 1.814 -0.3749 0.9463 -0.3545
+-0.6371 1.865 -0.4338 0.9463 -0.3073
+-0.6565 1.922 -0.4941 0.9463 -0.2594
+-0.6777 1.984 -0.5554 0.9463 -0.2108
+-0.7004 2.05 -0.6171 0.9463 -0.1617
+-0.7244 2.12 -0.6786 0.9463 -0.1122
+-0.7495 2.194 -0.7394 0.9463 -0.06235
+-0.7753 2.269 -0.7989 0.9463 -0.01239
+-0.8017 2.347 -0.8566 0.9463 0.0376
+-0.8284 2.425 -0.9117 0.9463 0.0875
+-0.8551 2.503 -0.9638 0.9463 0.1372
+-0.8815 2.58 -1.012 0.9463 0.1865
+-0.9074 2.656 -1.057 0.9463 0.2354
+-0.9326 2.73 -1.096 0.9463 0.2837
+-0.9568 2.801 -1.131 0.9463 0.3312
+-0.9798 2.868 -1.16 0.9463 0.378
+-1.001 2.931 -1.183 0.9463 0.4238
+-1.021 2.99 -1.2 0.9463 0.4685
+-1.04 3.043 -1.21 0.9463 0.5121
+-1.056 3.091 -1.214 0.9463 0.5544
+-1.07 3.133 -1.21 0.9463 0.5953
+-1.083 3.169 -1.199 0.9463 0.6347
+-1.092 3.198 -1.181 0.9463 0.6725
+-1.1 3.22 -1.156 0.9463 0.7087
+-1.106 3.236 -1.123 0.9463 0.743
+-1.109 3.245 -1.083 0.9463 0.7756
+-1.109 3.248 -1.036 0.9463 0.8061
+-1.108 3.243 -0.9827 0.9463 0.8347
+-1.105 3.233 -0.9227 0.9463 0.8612
+-1.099 3.217 -0.8565 0.9463 0.8855
+-1.091 3.194 -0.7847 0.9463 0.9076
+-1.082 3.167 -0.7075 0.9463 0.9275
+-1.071 3.135 -0.6256 0.9463 0.945
+-1.058 3.098 -0.5394 0.9463 0.9602
+-1.045 3.058 -0.4495 0.9463 0.9729
+-1.03 3.014 -0.3565 0.9463 0.9833
+-1.014 2.968 -0.2611 0.9463 0.9911
+-0.9978 2.921 -0.1639 0.9463 0.9965
+-0.9811 2.872 -0.06557 0.9463 0.9994
+-1.111 2.787 0 0.929 1
+-1.09 2.736 0.09739 0.929 0.9988
+-1.07 2.686 0.1941 0.929 0.995
+-1.051 2.638 0.2895 0.929 0.9888
+-1.032 2.591 0.383 0.929 0.9801
+-1.015 2.547 0.4738 0.929 0.9689
+-0.9989 2.507 0.5615 0.929 0.9553
+-0.9844 2.47 0.6453 0.929 0.9394
+-0.9716 2.438 0.7249 0.929 0.9211
+-0.9609 2.411 0.7996 0.929 0.9004
+-0.9523 2.39 0.869 0.929 0.8776
+-0.9461 2.374 0.9327 0.929 0.8525
+-0.9423 2.365 0.9904 0.929 0.8253
+-0.941 2.361 1.042 0.929 0.7961
+-0.9424 2.365 1.086 0.929 0.7648
+-0.9465 2.375 1.124 0.929 0.7317
+-0.9533 2.392 1.155 0.929 0.6967
+-0.9628 2.416 1.178 0.929 0.66
+-0.9749 2.446 1.195 0.929 0.6216
+-0.9896 2.483 1.204 0.929 0.5817
+-1.007 2.526 1.207 0.929 0.5403
+-1.026 2.575 1.202 0.929 0.4976
+-1.048 2.63 1.191 0.929 0.4536
+-1.072 2.689 1.174 0.929 0.4085
+-1.097 2.753 1.15 0.929 0.3624
+-1.124 2.821 1.121 0.929 0.3153
+-1.153 2.893 1.087 0.929 0.2675
+-1.182 2.967 1.047 0.929 0.219
+-1.213 3.043 1.004 0.929 0.17
+-1.243 3.12 0.9559 0.929 0.1205
+-1.275 3.198 0.9048 0.929 0.07074
+-1.305 3.276 0.8509 0.929 0.02079
+-1.336 3.353 0.7946 0.929 -0.0292
+-1.366 3.428 0.7366 0.929 -0.07912
+-1.395 3.5 0.6774 0.929 -0.1288
+-1.422 3.57 0.6176 0.929 -0.1782
+-1.448 3.635 0.5577 0.929 -0.2272
+-1.473 3.695 0.4983 0.929 -0.2756
+-1.495 3.751 0.4399 0.929 -0.3233
+-1.514 3.8 0.3829 0.929 -0.3702
+-1.531 3.843 0.3279 0.929 -0.4161
+-1.546 3.879 0.2753 0.929 -0.4611
+-1.557 3.907 0.2254 0.929 -0.5048
+-1.565 3.928 0.1786 0.929 -0.5474
+-1.57 3.94 0.1352 0.929 -0.5885
+-1.572 3.944 0.09545 0.929 -0.6282
+-1.57 3.94 0.05959 0.929 -0.6663
+-1.565 3.927 0.02776 0.929 -0.7027
+-1.556 3.905 6.64e-05 0.929 -0.7374
+-1.544 3.875 -0.02344 0.929 -0.7702
+-1.529 3.836 -0.04276 0.929 -0.8011
+-1.51 3.789 -0.05794 0.929 -0.8301
+-1.488 3.735 -0.06909 0.929 -0.8569
+-1.464 3.673 -0.07634 0.929 -0.8816
+-1.436 3.604 -0.07991 0.929 -0.9041
+-1.406 3.528 -0.08003 0.929 -0.9243
+-1.374 3.447 -0.07698 0.929 -0.9422
+-1.339 3.36 -0.07108 0.929 -0.9578
+-1.303 3.269 -0.06269 0.929 -0.971
+-1.265 3.174 -0.05219 0.929 -0.9817
+-1.225 3.075 -0.03999 0.929 -0.99
+-1.185 2.975 -0.02652 0.929 -0.9958
+-1.145 2.872 -0.01221 0.929 -0.9991
+-1.104 2.77 0.002477 0.929 -1
+-1.063 2.667 0.01709 0.929 -0.9983
+-1.022 2.565 0.03117 0.929 -0.9941
+-0.9823 2.465 0.04426 0.929 -0.9875
+-0.9435 2.368 0.05594 0.929 -0.9784
+-0.9061 2.274 0.06577 0.929 -0.9668
+-0.8703 2.184 0.07336 0.929 -0.9528
+-0.8364 2.099 0.07834 0.929 -0.9365
+-0.8047 2.019 0.08035 0.929 -0.9178
+-0.7754 1.946 0.07911 0.929 -0.8968
+-0.7488 1.879 0.07432 0.929 -0.8735
+-0.7251 1.82 0.06578 0.929 -0.8481
+-0.7044 1.768 0.05329 0.929 -0.8206
+-0.6869 1.724 0.03673 0.929 -0.791
+-0.6726 1.688 0.016 0.929 -0.7594
+-0.6617 1.661 -0.008915 0.929 -0.7259
+-0.6542 1.642 -0.03801 0.929 -0.6907
+-0.6502 1.632 -0.07121 0.929 -0.6536
+-0.6496 1.63 -0.1084 0.929 -0.615
+-0.6523 1.637 -0.1494 0.929 -0.5748
+-0.6584 1.652 -0.194 0.929 -0.5332
+-0.6676 1.675 -0.2418 0.929 -0.4903
+-0.68 1.706 -0.2927 0.929 -0.4461
+-0.6952 1.745 -0.3462 0.929 -0.4008
+-0.7132 1.79 -0.4019 0.929 -0.3545
+-0.7336 1.841 -0.4594 0.929 -0.3073
+-0.7564 1.898 -0.5182 0.929 -0.2594
+-0.7812 1.96 -0.5778 0.929 -0.2108
+-0.8078 2.027 -0.6377 0.929 -0.1617
+-0.8358 2.097 -0.6974 0.929 -0.1122
+-0.8651 2.171 -0.7563 0.929 -0.06235
+-0.8952 2.247 -0.8137 0.929 -0.01239
+-0.926 2.324 -0.8693 0.929 0.0376
+-0.957 2.402 -0.9224 0.929 0.0875
+-0.988 2.479 -0.9724 0.929 0.1372
+-1.019 2.557 -1.019 0.929 0.1865
+-1.049 2.632 -1.061 0.929 0.2354
+-1.078 2.705 -1.099 0.929 0.2837
+-1.106 2.776 -1.132 0.929 0.3312
+-1.133 2.842 -1.159 0.929 0.378
+-1.158 2.905 -1.181 0.929 0.4238
+-1.181 2.963 -1.196 0.929 0.4685
+-1.202 3.016 -1.205 0.929 0.5121
+-1.22 3.063 -1.207 0.929 0.5544
+-1.237 3.104 -1.202 0.929 0.5953
+-1.251 3.138 -1.19 0.929 0.6347
+-1.262 3.166 -1.171 0.929 0.6725
+-1.27 3.188 -1.145 0.929 0.7087
+-1.276 3.203 -1.112 0.929 0.743
+-1.279 3.211 -1.072 0.929 0.7756
+-1.28 3.212 -1.025 0.929 0.8061
+-1.278 3.207 -0.9717 0.929 0.8347
+-1.273 3.195 -0.912 0.929 0.8612
+-1.266 3.177 -0.8463 0.929 0.8855
+-1.257 3.154 -0.775 0.929 0.9076
+-1.245 3.125 -0.6986 0.929 0.9275
+-1.232 3.092 -0.6176 0.929 0.945
+-1.217 3.054 -0.5324 0.929 0.9602
+-1.2 3.012 -0.4436 0.929 0.9729
+-1.182 2.967 -0.3518 0.929 0.9833
+-1.164 2.92 -0.2576 0.929 0.9911
+-1.144 2.871 -0.1617 0.929 0.9965
+-1.124 2.821 -0.06468 0.929 0.9994
+-1.248 2.728 0 0.9093 1
+-1.225 2.676 0.096 0.9093 0.9988
+-1.201 2.625 0.1913 0.9093 0.995
+-1.179 2.575 0.2854 0.9093 0.9888
+-1.157 2.528 0.3776 0.9093 0.9801
+-1.136 2.483 0.4672 0.9093 0.9689
+-1.117 2.441 0.5537 0.9093 0.9553
+-1.1 2.403 0.6366 0.9093 0.9394
+-1.085 2.37 0.7153 0.9093 0.9211
+-1.072 2.342 0.7892 0.9093 0.9004
+-1.062 2.32 0.8581 0.9093 0.8776
+-1.054 2.303 0.9213 0.9093 0.8525
+-1.049 2.292 0.9787 0.9093 0.8253
+-1.047 2.288 1.03 0.9093 0.7961
+-1.048 2.29 1.075 0.9093 0.7648
+-1.052 2.3 1.113 0.9093 0.7317
+-1.06 2.316 1.144 0.9093 0.6967
+-1.07 2.338 1.168 0.9093 0.66
+-1.084 2.368 1.185 0.9093 0.6216
+-1.1 2.403 1.196 0.9093 0.5817
+-1.119 2.446 1.199 0.9093 0.5403
+-1.141 2.494 1.196 0.9093 0.4976
+-1.166 2.547 1.187 0.9093 0.4536
+-1.193 2.606 1.171 0.9093 0.4085
+-1.221 2.669 1.149 0.9093 0.3624
+-1.252 2.736 1.122 0.9093 0.3153
+-1.285 2.807 1.089 0.9093 0.2675
+-1.318 2.88 1.052 0.9093 0.219
+-1.353 2.956 1.01 0.9093 0.17
+-1.388 3.033 0.9646 0.9093 0.1205
+-1.423 3.11 0.9156 0.9093 0.07074
+-1.459 3.187 0.8638 0.9093 0.02079
+-1.494 3.264 0.8096 0.9093 -0.0292
+-1.528 3.338 0.7536 0.9093 -0.07912
+-1.561 3.411 0.6964 0.9093 -0.1288
+-1.593 3.48 0.6385 0.9093 -0.1782
+-1.622 3.545 0.5804 0.9093 -0.2272
+-1.65 3.606 0.5226 0.9093 -0.2756
+-1.675 3.661 0.4657 0.9093 -0.3233
+-1.698 3.711 0.4101 0.9093 -0.3702
+-1.718 3.754 0.3562 0.9093 -0.4161
+-1.735 3.79 0.3046 0.9093 -0.4611
+-1.748 3.819 0.2555 0.9093 -0.5048
+-1.757 3.84 0.2092 0.9093 -0.5474
+-1.763 3.853 0.1662 0.9093 -0.5885
+-1.766 3.858 0.1266 0.9093 -0.6282
+-1.764 3.855 0.0906 0.9093 -0.6663
+-1.759 3.843 0.05842 0.9093 -0.7027
+-1.749 3.822 0.03015 0.9093 -0.7374
+-1.736 3.793 0.005839 0.9093 -0.7702
+-1.719 3.756 -0.01451 0.9093 -0.8011
+-1.698 3.71 -0.03095 0.9093 -0.8301
+-1.674 3.657 -0.04355 0.9093 -0.8569
+-1.646 3.597 -0.05248 0.9093 -0.8816
+-1.615 3.529 -0.0579 0.9093 -0.9041
+-1.581 3.455 -0.06005 0.9093 -0.9243
+-1.545 3.375 -0.05919 0.9093 -0.9422
+-1.506 3.29 -0.05563 0.9093 -0.9578
+-1.465 3.201 -0.0497 0.9093 -0.971
+-1.422 3.108 -0.04177 0.9093 -0.9817
+-1.378 3.011 -0.03222 0.9093 -0.99
+-1.333 2.912 -0.02146 0.9093 -0.9958
+-1.287 2.812 -0.009904 0.9093 -0.9991
+-1.241 2.711 0.00201 0.9093 -1
+-1.195 2.61 0.01385 0.9093 -0.9983
+-1.149 2.51 0.02519 0.9093 -0.9941
+-1.104 2.412 0.03559 0.9093 -0.9875
+-1.06 2.316 0.04464 0.9093 -0.9784
+-1.018 2.224 0.05194 0.9093 -0.9668
+-0.9776 2.136 0.05711 0.9093 -0.9528
+-0.9395 2.053 0.0598 0.9093 -0.9365
+-0.9039 1.975 0.05967 0.9093 -0.9178
+-0.871 1.903 0.05645 0.9093 -0.8968
+-0.8412 1.838 0.04988 0.9093 -0.8735
+-0.8146 1.78 0.03973 0.9093 -0.8481
+-0.7915 1.729 0.02585 0.9093 -0.8206
+-0.7719 1.687 0.008109 0.9093 -0.791
+-0.7561 1.652 -0.01357 0.9093 -0.7594
+-0.7441 1.626 -0.03922 0.9093 -0.7259
+-0.736 1.608 -0.06881 0.9093 -0.6907
+-0.7318 1.599 -0.1023 0.9093 -0.6536
+-0.7315 1.598 -0.1395 0.9093 -0.615
+-0.735 1.606 -0.1803 0.9093 -0.5748
+-0.7423 1.622 -0.2244 0.9093 -0.5332
+-0.7532 1.646 -0.2717 0.9093 -0.4903
+-0.7676 1.677 -0.3217 0.9093 -0.4461
+-0.7853 1.716 -0.3741 0.9093 -0.4008
+-0.806 1.761 -0.4286 0.9093 -0.3545
+-0.8297 1.813 -0.4847 0.9093 -0.3073
+-0.8558 1.87 -0.542 0.9093 -0.2594
+-0.8843 1.932 -0.5999 0.9093 -0.2108
+-0.9148 1.999 -0.658 0.9093 -0.1617
+-0.947 2.069 -0.7157 0.9093 -0.1122
+-0.9805 2.142 -0.7726 0.9093 -0.06235
+-1.015 2.218 -0.828 0.9093 -0.01239
+-1.05 2.294 -0.8815 0.9093 0.0376
+-1.086 2.372 -0.9324 0.9093 0.0875
+-1.121 2.449 -0.9803 0.9093 0.1372
+-1.156 2.526 -1.025 0.9093 0.1865
+-1.19 2.6 -1.065 0.9093 0.2354
+-1.223 2.673 -1.101 0.9093 0.2837
+-1.255 2.743 -1.132 0.9093 0.3312
+-1.285 2.809 -1.157 0.9093 0.378
+-1.314 2.87 -1.177 0.9093 0.4238
+-1.34 2.927 -1.191 0.9093 0.4685
+-1.363 2.979 -1.198 0.9093 0.5121
+-1.384 3.025 -1.199 0.9093 0.5544
+-1.403 3.065 -1.193 0.9093 0.5953
+-1.418 3.099 -1.18 0.9093 0.6347
+-1.431 3.126 -1.161 0.9093 0.6725
+-1.44 3.146 -1.134 0.9093 0.7087
+-1.446 3.16 -1.101 0.9093 0.743
+-1.449 3.167 -1.06 0.9093 0.7756
+-1.449 3.167 -1.013 0.9093 0.8061
+-1.447 3.161 -0.9601 0.9093 0.8347
+-1.441 3.148 -0.9007 0.9093 0.8612
+-1.432 3.129 -0.8355 0.9093 0.8855
+-1.421 3.105 -0.7649 0.9093 0.9076
+-1.407 3.075 -0.6893 0.9093 0.9275
+-1.391 3.04 -0.6092 0.9093 0.945
+-1.374 3.001 -0.525 0.9093 0.9602
+-1.354 2.958 -0.4374 0.9093 0.9729
+-1.333 2.912 -0.3468 0.9093 0.9833
+-1.311 2.864 -0.254 0.9093 0.9911
+-1.288 2.814 -0.1594 0.9093 0.9965
+-1.264 2.762 -0.06375 0.9093 0.9994
+-1.383 2.662 0 0.8874 1
+-1.356 2.609 0.09454 0.8874 0.9988
+-1.329 2.557 0.1885 0.8874 0.995
+-1.303 2.507 0.2811 0.8874 0.9888
+-1.277 2.458 0.372 0.8874 0.9801
+-1.253 2.412 0.4603 0.8874 0.9689
+-1.231 2.37 0.5457 0.8874 0.9553
+-1.211 2.331 0.6275 0.8874 0.9394
+-1.194 2.297 0.7052 0.8874 0.9211
+-1.179 2.268 0.7784 0.8874 0.9004
+-1.166 2.245 0.8466 0.8874 0.8776
+-1.157 2.227 0.9094 0.8874 0.8525
+-1.151 2.215 0.9664 0.8874 0.8253
+-1.148 2.21 1.017 0.8874 0.7961
+-1.149 2.211 1.062 0.8874 0.7648
+-1.153 2.22 1.1 0.8874 0.7317
+-1.161 2.234 1.132 0.8874 0.6967
+-1.172 2.256 1.157 0.8874 0.66
+-1.187 2.284 1.175 0.8874 0.6216
+-1.205 2.319 1.186 0.8874 0.5817
+-1.226 2.36 1.191 0.8874 0.5403
+-1.251 2.407 1.189 0.8874 0.4976
+-1.278 2.459 1.181 0.8874 0.4536
+-1.308 2.517 1.167 0.8874 0.4085
+-1.34 2.579 1.147 0.8874 0.3624
+-1.375 2.645 1.122 0.8874 0.3153
+-1.411 2.715 1.091 0.8874 0.2675
+-1.448 2.787 1.056 0.8874 0.219
+-1.487 2.862 1.016 0.8874 0.17
+-1.527 2.938 0.9727 0.8874 0.1205
+-1.566 3.015 0.9258 0.8874 0.07074
+-1.606 3.091 0.8761 0.8874 0.02079
+-1.645 3.167 0.824 0.8874 -0.0292
+-1.684 3.241 0.7701 0.8874 -0.07912
+-1.721 3.313 0.7149 0.8874 -0.1288
+-1.757 3.381 0.6589 0.8874 -0.1782
+-1.791 3.446 0.6026 0.8874 -0.2272
+-1.822 3.507 0.5466 0.8874 -0.2756
+-1.851 3.562 0.4912 0.8874 -0.3233
+-1.877 3.612 0.437 0.8874 -0.3702
+-1.899 3.655 0.3843 0.8874 -0.4161
+-1.918 3.691 0.3337 0.8874 -0.4611
+-1.933 3.721 0.2854 0.8874 -0.5048
+-1.945 3.742 0.2397 0.8874 -0.5474
+-1.952 3.756 0.1971 0.8874 -0.5885
+-1.955 3.762 0.1576 0.8874 -0.6282
+-1.953 3.759 0.1215 0.8874 -0.6663
+-1.948 3.748 0.08905 0.8874 -0.7027
+-1.937 3.729 0.06022 0.8874 -0.7374
+-1.923 3.701 0.03512 0.8874 -0.7702
+-1.904 3.665 0.01375 0.8874 -0.8011
+-1.882 3.621 -0.003929 0.8874 -0.8301
+-1.855 3.57 -0.01799 0.8874 -0.8569
+-1.824 3.511 -0.02858 0.8874 -0.8816
+-1.79 3.445 -0.03585 0.8874 -0.9041
+-1.753 3.373 -0.04003 0.8874 -0.9243
+-1.712 3.295 -0.04137 0.8874 -0.9422
+-1.669 3.212 -0.04015 0.8874 -0.9578
+-1.624 3.125 -0.03668 0.8874 -0.971
+-1.576 3.033 -0.03132 0.8874 -0.9817
+-1.527 2.939 -0.02443 0.8874 -0.99
+-1.477 2.842 -0.01638 0.8874 -0.9958
+-1.426 2.744 -0.007592 0.8874 -0.9991
+-1.375 2.645 0.001542 0.8874 -1
+-1.323 2.547 0.01061 0.8874 -0.9983
+-1.273 2.449 0.01919 0.8874 -0.9941
+-1.223 2.353 0.02689 0.8874 -0.9875
+-1.174 2.26 0.03332 0.8874 -0.9784
+-1.127 2.17 0.03808 0.8874 -0.9668
+-1.083 2.084 0.04083 0.8874 -0.9528
+-1.04 2.002 0.04122 0.8874 -0.9365
+-1.001 1.926 0.03896 0.8874 -0.9178
+-0.9645 1.856 0.03376 0.8874 -0.8968
+-0.9316 1.793 0.0254 0.8874 -0.8735
+-0.9022 1.736 0.01366 0.8874 -0.8481
+-0.8768 1.687 -0.001607 0.8874 -0.8206
+-0.8553 1.646 -0.02052 0.8874 -0.791
+-0.8381 1.613 -0.04314 0.8874 -0.7594
+-0.8251 1.588 -0.0695 0.8874 -0.7259
+-0.8165 1.571 -0.09957 0.8874 -0.6907
+-0.8122 1.563 -0.1333 0.8874 -0.6536
+-0.8123 1.563 -0.1705 0.8874 -0.615
+-0.8166 1.572 -0.2111 0.8874 -0.5748
+-0.8252 1.588 -0.2548 0.8874 -0.5332
+-0.8378 1.612 -0.3013 0.8874 -0.4903
+-0.8543 1.644 -0.3505 0.8874 -0.4461
+-0.8745 1.683 -0.4018 0.8874 -0.4008
+-0.8982 1.729 -0.4551 0.8874 -0.3545
+-0.925 1.78 -0.5097 0.8874 -0.3073
+-0.9546 1.837 -0.5654 0.8874 -0.2594
+-0.9868 1.899 -0.6216 0.8874 -0.2108
+-1.021 1.966 -0.6778 0.8874 -0.1617
+-1.058 2.035 -0.7336 0.8874 -0.1122
+-1.095 2.108 -0.7884 0.8874 -0.06235
+-1.134 2.183 -0.8418 0.8874 -0.01239
+-1.174 2.259 -0.8931 0.8874 0.0376
+-1.213 2.335 -0.9419 0.8874 0.0875
+-1.253 2.412 -0.9877 0.8874 0.1372
+-1.292 2.487 -1.03 0.8874 0.1865
+-1.331 2.561 -1.068 0.8874 0.2354
+-1.368 2.633 -1.102 0.8874 0.2837
+-1.404 2.702 -1.131 0.8874 0.3312
+-1.437 2.766 -1.155 0.8874 0.378
+-1.469 2.827 -1.173 0.8874 0.4238
+-1.498 2.883 -1.185 0.8874 0.4685
+-1.524 2.934 -1.191 0.8874 0.5121
+-1.548 2.979 -1.19 0.8874 0.5544
+-1.568 3.018 -1.183 0.8874 0.5953
+-1.585 3.05 -1.17 0.8874 0.6347
+-1.598 3.076 -1.149 0.8874 0.6725
+-1.608 3.096 -1.122 0.8874 0.7087
+-1.615 3.108 -1.088 0.8874 0.743
+-1.618 3.114 -1.048 0.8874 0.7756
+-1.618 3.113 -1.001 0.8874 0.8061
+-1.614 3.106 -0.9479 0.8874 0.8347
+-1.607 3.092 -0.8889 0.8874 0.8612
+-1.596 3.072 -0.8242 0.8874 0.8855
+-1.583 3.047 -0.7543 0.8874 0.9076
+-1.567 3.016 -0.6796 0.8874 0.9275
+-1.549 2.98 -0.6004 0.8874 0.945
+-1.528 2.94 -0.5174 0.8874 0.9602
+-1.505 2.897 -0.4309 0.8874 0.9729
+-1.481 2.85 -0.3417 0.8874 0.9833
+-1.455 2.801 -0.2501 0.8874 0.9911
+-1.429 2.749 -0.157 0.8874 0.9965
+-1.401 2.697 -0.06279 0.8874 0.9994
+-1.515 2.59 0 0.8632 1
+-1.483 2.536 0.09303 0.8632 0.9988
+-1.453 2.484 0.1854 0.8632 0.995
+-1.423 2.433 0.2767 0.8632 0.9888
+-1.394 2.383 0.3661 0.8632 0.9801
+-1.367 2.337 0.4532 0.8632 0.9689
+-1.342 2.294 0.5373 0.8632 0.9553
+-1.319 2.255 0.618 0.8632 0.9394
+-1.298 2.22 0.6947 0.8632 0.9211
+-1.281 2.19 0.7671 0.8632 0.9004
+-1.266 2.165 0.8346 0.8632 0.8776
+-1.256 2.147 0.8968 0.8632 0.8525
+-1.248 2.134 0.9535 0.8632 0.8253
+-1.245 2.128 1.004 0.8632 0.7961
+-1.245 2.128 1.049 0.8632 0.7648
+-1.249 2.136 1.088 0.8632 0.7317
+-1.257 2.149 1.12 0.8632 0.6967
+-1.269 2.17 1.145 0.8632 0.66
+-1.285 2.197 1.164 0.8632 0.6216
+-1.304 2.23 1.176 0.8632 0.5817
+-1.328 2.27 1.182 0.8632 0.5403
+-1.354 2.316 1.182 0.8632 0.4976
+-1.384 2.367 1.175 0.8632 0.4536
+-1.417 2.423 1.163 0.8632 0.4085
+-1.453 2.484 1.145 0.8632 0.3624
+-1.491 2.549 1.121 0.8632 0.3153
+-1.531 2.617 1.092 0.8632 0.2675
+-1.572 2.689 1.059 0.8632 0.219
+-1.615 2.762 1.021 0.8632 0.17
+-1.659 2.837 0.9801 0.8632 0.1205
+-1.703 2.912 0.9355 0.8632 0.07074
+-1.747 2.988 0.8879 0.8632 0.02079
+-1.791 3.063 0.838 0.8632 -0.0292
+-1.834 3.136 0.7862 0.8632 -0.07912
+-1.876 3.207 0.733 0.8632 -0.1288
+-1.915 3.275 0.679 0.8632 -0.1782
+-1.953 3.339 0.6246 0.8632 -0.2272
+-1.988 3.399 0.5702 0.8632 -0.2756
+-2.02 3.454 0.5164 0.8632 -0.3233
+-2.049 3.504 0.4636 0.8632 -0.3702
+-2.074 3.547 0.4122 0.8632 -0.4161
+-2.096 3.583 0.3626 0.8632 -0.4611
+-2.113 3.613 0.3151 0.8632 -0.5048
+-2.126 3.635 0.2701 0.8632 -0.5474
+-2.134 3.649 0.2278 0.8632 -0.5885
+-2.138 3.656 0.1885 0.8632 -0.6282
+-2.137 3.654 0.1524 0.8632 -0.6663
+-2.131 3.644 0.1196 0.8632 -0.7027
+-2.12 3.626 0.09025 0.8632 -0.7374
+-2.105 3.599 0.06437 0.8632 -0.7702
+-2.085 3.565 0.042 0.8632 -0.8011
+-2.06 3.522 0.02309 0.8632 -0.8301
+-2.031 3.473 0.007576 0.8632 -0.8569
+-1.998 3.416 -0.004662 0.8632 -0.8816
+-1.96 3.352 -0.01379 0.8632 -0.9041
+-1.919 3.282 -0.01999 0.8632 -0.9243
+-1.875 3.206 -0.02352 0.8632 -0.9422
+-1.828 3.125 -0.02464 0.8632 -0.9578
+-1.778 3.04 -0.02364 0.8632 -0.971
+-1.726 2.951 -0.02085 0.8632 -0.9817
+-1.672 2.859 -0.01662 0.8632 -0.99
+-1.617 2.765 -0.0113 0.8632 -0.9958
+-1.561 2.67 -0.005275 0.8632 -0.9991
+-1.505 2.573 0.001073 0.8632 -1
+-1.449 2.477 0.007356 0.8632 -0.9983
+-1.393 2.382 0.01319 0.8632 -0.9941
+-1.338 2.289 0.01818 0.8632 -0.9875
+-1.285 2.198 0.02197 0.8632 -0.9784
+-1.234 2.11 0.02419 0.8632 -0.9668
+-1.185 2.026 0.02452 0.8632 -0.9528
+-1.139 1.947 0.02262 0.8632 -0.9365
+-1.096 1.873 0.01822 0.8632 -0.9178
+-1.056 1.805 0.01105 0.8632 -0.8968
+-1.02 1.744 0.0009026 0.8632 -0.8735
+-0.9879 1.689 -0.01242 0.8632 -0.8481
+-0.9602 1.642 -0.02906 0.8632 -0.8206
+-0.937 1.602 -0.04913 0.8632 -0.791
+-0.9184 1.57 -0.07268 0.8632 -0.7594
+-0.9045 1.547 -0.09974 0.8632 -0.7259
+-0.8954 1.531 -0.1303 0.8632 -0.6907
+-0.8912 1.524 -0.1642 0.8632 -0.6536
+-0.8917 1.525 -0.2014 0.8632 -0.615
+-0.897 1.534 -0.2417 0.8632 -0.5748
+-0.907 1.551 -0.2849 0.8632 -0.5332
+-0.9214 1.575 -0.3308 0.8632 -0.4903
+-0.9401 1.607 -0.379 0.8632 -0.4461
+-0.9628 1.646 -0.4293 0.8632 -0.4008
+-0.9893 1.692 -0.4812 0.8632 -0.3545
+-1.019 1.743 -0.5344 0.8632 -0.3073
+-1.053 1.8 -0.5884 0.8632 -0.2594
+-1.089 1.861 -0.6429 0.8632 -0.2108
+-1.127 1.927 -0.6972 0.8632 -0.1617
+-1.167 1.996 -0.751 0.8632 -0.1122
+-1.209 2.068 -0.8038 0.8632 -0.06235
+-1.253 2.142 -0.855 0.8632 -0.01239
+-1.296 2.217 -0.9042 0.8632 0.0376
+-1.341 2.292 -0.9508 0.8632 0.0875
+-1.385 2.368 -0.9944 0.8632 0.1372
+-1.428 2.442 -1.035 0.8632 0.1865
+-1.471 2.515 -1.071 0.8632 0.2354
+-1.512 2.585 -1.102 0.8632 0.2837
+-1.551 2.652 -1.129 0.8632 0.3312
+-1.588 2.716 -1.151 0.8632 0.378
+-1.623 2.775 -1.168 0.8632 0.4238
+-1.655 2.83 -1.178 0.8632 0.4685
+-1.684 2.879 -1.183 0.8632 0.5121
+-1.71 2.923 -1.181 0.8632 0.5544
+-1.732 2.961 -1.173 0.8632 0.5953
+-1.75 2.992 -1.158 0.8632 0.6347
+-1.765 3.017 -1.137 0.8632 0.6725
+-1.775 3.035 -1.11 0.8632 0.7087
+-1.782 3.047 -1.075 0.8632 0.743
+-1.785 3.052 -1.035 0.8632 0.7756
+-1.784 3.05 -0.988 0.8632 0.8061
+-1.779 3.041 -0.9351 0.8632 0.8347
+-1.77 3.027 -0.8765 0.8632 0.8612
+-1.758 3.006 -0.8124 0.8632 0.8855
+-1.743 2.98 -0.7433 0.8632 0.9076
+-1.724 2.948 -0.6694 0.8632 0.9275
+-1.703 2.912 -0.5913 0.8632 0.945
+-1.679 2.871 -0.5094 0.8632 0.9602
+-1.653 2.827 -0.4242 0.8632 0.9729
+-1.626 2.78 -0.3363 0.8632 0.9833
+-1.596 2.73 -0.2462 0.8632 0.9911
+-1.566 2.678 -0.1545 0.8632 0.9965
+-1.535 2.625 -0.06178 0.8632 0.9994
+-1.642 2.511 0 0.8369 1
+-1.607 2.457 0.09146 0.8369 0.9988
+-1.572 2.404 0.1823 0.8369 0.995
+-1.539 2.353 0.272 0.8369 0.9888
+-1.506 2.303 0.36 0.8369 0.9801
+-1.476 2.256 0.4457 0.8369 0.9689
+-1.447 2.213 0.5286 0.8369 0.9553
+-1.421 2.173 0.6081 0.8369 0.9394
+-1.398 2.138 0.6838 0.8369 0.9211
+-1.378 2.107 0.7552 0.8369 0.9004
+-1.362 2.082 0.822 0.8369 0.8776
+-1.349 2.063 0.8837 0.8369 0.8525
+-1.34 2.049 0.9401 0.8369 0.8253
+-1.336 2.042 0.9907 0.8369 0.7961
+-1.335 2.042 1.035 0.8369 0.7648
+-1.339 2.048 1.074 0.8369 0.7317
+-1.348 2.06 1.107 0.8369 0.6967
+-1.36 2.08 1.133 0.8369 0.66
+-1.377 2.106 1.152 0.8369 0.6216
+-1.398 2.138 1.166 0.8369 0.5817
+-1.423 2.176 1.173 0.8369 0.5403
+-1.452 2.221 1.174 0.8369 0.4976
+-1.485 2.27 1.169 0.8369 0.4536
+-1.521 2.325 1.158 0.8369 0.4085
+-1.56 2.385 1.141 0.8369 0.3624
+-1.601 2.448 1.119 0.8369 0.3153
+-1.645 2.515 1.093 0.8369 0.2675
+-1.69 2.585 1.062 0.8369 0.219
+-1.737 2.656 1.026 0.8369 0.17
+-1.785 2.73 0.987 0.8369 0.1205
+-1.834 2.804 0.9445 0.8369 0.07074
+-1.882 2.878 0.8992 0.8369 0.02079
+-1.93 2.952 0.8514 0.8369 -0.0292
+-1.978 3.024 0.8018 0.8369 -0.07912
+-2.023 3.094 0.7507 0.8369 -0.1288
+-2.067 3.161 0.6986 0.8369 -0.1782
+-2.109 3.224 0.6461 0.8369 -0.2272
+-2.147 3.283 0.5935 0.8369 -0.2756
+-2.183 3.338 0.5413 0.8369 -0.3233
+-2.215 3.387 0.4899 0.8369 -0.3702
+-2.243 3.43 0.4398 0.8369 -0.4161
+-2.267 3.466 0.3912 0.8369 -0.4611
+-2.286 3.496 0.3446 0.8369 -0.5048
+-2.301 3.518 0.3003 0.8369 -0.5474
+-2.311 3.533 0.2584 0.8369 -0.5885
+-2.315 3.54 0.2193 0.8369 -0.6282
+-2.315 3.539 0.1832 0.8369 -0.6663
+-2.309 3.53 0.1501 0.8369 -0.7027
+-2.298 3.513 0.1202 0.8369 -0.7374
+-2.281 3.488 0.09359 0.8369 -0.7702
+-2.26 3.455 0.07022 0.8369 -0.8011
+-2.233 3.414 0.05009 0.8369 -0.8301
+-2.202 3.366 0.03314 0.8369 -0.8569
+-2.166 3.311 0.01926 0.8369 -0.8816
+-2.125 3.25 0.00829 0.8369 -0.9041
+-2.081 3.182 5.697e-05 0.8369 -0.9243
+-2.033 3.109 -0.005662 0.8369 -0.9422
+-1.982 3.031 -0.009116 0.8369 -0.9578
+-1.928 2.948 -0.01058 0.8369 -0.971
+-1.872 2.862 -0.01037 0.8369 -0.9817
+-1.813 2.773 -0.008799 0.8369 -0.99
+-1.754 2.681 -0.006209 0.8369 -0.9958
+-1.693 2.588 -0.002954 0.8369 -0.9991
+-1.632 2.495 0.000604 0.8369 -1
+-1.571 2.402 0.004101 0.8369 -0.9983
+-1.51 2.309 0.007172 0.8369 -0.9941
+-1.451 2.219 0.009459 0.8369 -0.9875
+-1.393 2.13 0.01061 0.8369 -0.9784
+-1.338 2.045 0.01029 0.8369 -0.9668
+-1.285 1.964 0.00819 0.8369 -0.9528
+-1.234 1.887 0.004004 0.8369 -0.9365
+-1.188 1.816 -0.002534 0.8369 -0.9178
+-1.145 1.75 -0.01166 0.8369 -0.8968
+-1.106 1.691 -0.02359 0.8369 -0.8735
+-1.071 1.638 -0.03849 0.8369 -0.8481
+-1.042 1.593 -0.0565 0.8369 -0.8206
+-1.017 1.555 -0.07771 0.8369 -0.791
+-0.9969 1.524 -0.1022 0.8369 -0.7594
+-0.9822 1.502 -0.1299 0.8369 -0.7259
+-0.9728 1.487 -0.1609 0.8369 -0.6907
+-0.9687 1.481 -0.195 0.8369 -0.6536
+-0.9698 1.483 -0.2322 0.8369 -0.615
+-0.9761 1.492 -0.2722 0.8369 -0.5748
+-0.9874 1.51 -0.3149 0.8369 -0.5332
+-1.004 1.535 -0.3601 0.8369 -0.4903
+-1.025 1.567 -0.4074 0.8369 -0.4461
+-1.05 1.605 -0.4565 0.8369 -0.4008
+-1.079 1.65 -0.5071 0.8369 -0.3545
+-1.113 1.701 -0.5588 0.8369 -0.3073
+-1.149 1.757 -0.6111 0.8369 -0.2594
+-1.189 1.818 -0.6638 0.8369 -0.2108
+-1.231 1.883 -0.7162 0.8369 -0.1617
+-1.276 1.951 -0.768 0.8369 -0.1122
+-1.322 2.022 -0.8187 0.8369 -0.06235
+-1.37 2.094 -0.8677 0.8369 -0.01239
+-1.418 2.168 -0.9147 0.8369 0.0376
+-1.467 2.242 -0.9591 0.8369 0.0875
+-1.515 2.316 -1.001 0.8369 0.1372
+-1.563 2.389 -1.039 0.8369 0.1865
+-1.609 2.461 -1.073 0.8369 0.2354
+-1.654 2.529 -1.102 0.8369 0.2837
+-1.697 2.595 -1.127 0.8369 0.3312
+-1.738 2.657 -1.147 0.8369 0.378
+-1.776 2.715 -1.162 0.8369 0.4238
+-1.811 2.768 -1.171 0.8369 0.4685
+-1.842 2.816 -1.174 0.8369 0.5121
+-1.87 2.859 -1.171 0.8369 0.5544
+-1.893 2.895 -1.162 0.8369 0.5953
+-1.913 2.925 -1.146 0.8369 0.6347
+-1.929 2.949 -1.125 0.8369 0.6725
+-1.94 2.966 -1.096 0.8369 0.7087
+-1.947 2.976 -1.062 0.8369 0.743
+-1.949 2.98 -1.021 0.8369 0.7756
+-1.947 2.977 -0.9743 0.8369 0.8061
+-1.941 2.968 -0.9217 0.8369 0.8347
+-1.931 2.953 -0.8636 0.8369 0.8612
+-1.917 2.931 -0.8001 0.8369 0.8855
+-1.9 2.904 -0.7317 0.8369 0.9076
+-1.879 2.872 -0.6588 0.8369 0.9275
+-1.855 2.836 -0.5817 0.8369 0.945
+-1.828 2.794 -0.501 0.8369 0.9602
+-1.798 2.75 -0.4172 0.8369 0.9729
+-1.767 2.702 -0.3306 0.8369 0.9833
+-1.734 2.652 -0.242 0.8369 0.9911
+-1.7 2.6 -0.1519 0.8369 0.9965
+-1.665 2.546 -0.06074 0.8369 0.9994
+-1.766 2.425 0 0.8085 1
+-1.726 2.372 0.08983 0.8085 0.9988
+-1.688 2.319 0.1791 0.8085 0.995
+-1.65 2.267 0.2672 0.8085 0.9888
+-1.614 2.218 0.3537 0.8085 0.9801
+-1.58 2.171 0.438 0.8085 0.9689
+-1.548 2.127 0.5195 0.8085 0.9553
+-1.519 2.087 0.5978 0.8085 0.9394
+-1.493 2.051 0.6724 0.8085 0.9211
+-1.471 2.021 0.743 0.8085 0.9004
+-1.452 1.995 0.809 0.8085 0.8776
+-1.438 1.975 0.8701 0.8085 0.8525
+-1.427 1.961 0.926 0.8085 0.8253
+-1.422 1.953 0.9764 0.8085 0.7961
+-1.421 1.952 1.021 0.8085 0.7648
+-1.424 1.957 1.06 0.8085 0.7317
+-1.433 1.968 1.093 0.8085 0.6967
+-1.446 1.986 1.119 0.8085 0.66
+-1.464 2.011 1.14 0.8085 0.6216
+-1.486 2.042 1.154 0.8085 0.5817
+-1.513 2.079 1.162 0.8085 0.5403
+-1.544 2.122 1.165 0.8085 0.4976
+-1.579 2.17 1.161 0.8085 0.4536
+-1.618 2.223 1.152 0.8085 0.4085
+-1.66 2.281 1.137 0.8085 0.3624
+-1.705 2.342 1.117 0.8085 0.3153
+-1.752 2.407 1.093 0.8085 0.2675
+-1.802 2.475 1.063 0.8085 0.219
+-1.853 2.546 1.03 0.8085 0.17
+-1.905 2.617 0.9932 0.8085 0.1205
+-1.958 2.69 0.953 0.8085 0.07074
+-2.011 2.762 0.9099 0.8085 0.02079
+-2.063 2.834 0.8643 0.8085 -0.0292
+-2.114 2.905 0.8169 0.8085 -0.07912
+-2.164 2.973 0.7679 0.8085 -0.1288
+-2.212 3.039 0.7178 0.8085 -0.1782
+-2.258 3.101 0.6672 0.8085 -0.2272
+-2.3 3.16 0.6164 0.8085 -0.2756
+-2.339 3.213 0.5658 0.8085 -0.3233
+-2.374 3.262 0.5159 0.8085 -0.3702
+-2.405 3.304 0.4671 0.8085 -0.4161
+-2.432 3.341 0.4197 0.8085 -0.4611
+-2.453 3.37 0.374 0.8085 -0.5048
+-2.469 3.393 0.3303 0.8085 -0.5474
+-2.48 3.408 0.2889 0.8085 -0.5885
+-2.486 3.415 0.25 0.8085 -0.6282
+-2.486 3.415 0.2138 0.8085 -0.6663
+-2.48 3.407 0.1805 0.8085 -0.7027
+-2.468 3.391 0.1501 0.8085 -0.7374
+-2.451 3.367 0.1227 0.8085 -0.7702
+-2.428 3.336 0.0984 0.8085 -0.8011
+-2.4 3.297 0.07707 0.8085 -0.8301
+-2.366 3.251 0.05869 0.8085 -0.8569
+-2.328 3.198 0.04316 0.8085 -0.8816
+-2.285 3.139 0.03036 0.8085 -0.9041
+-2.237 3.074 0.02011 0.8085 -0.9243
+-2.186 3.003 0.0122 0.8085 -0.9422
+-2.131 2.928 0.006414 0.8085 -0.9578
+-2.073 2.848 0.002479 0.8085 -0.971
+-2.012 2.765 0.0001171 0.8085 -0.9817
+-1.95 2.679 -0.0009746 0.8085 -0.99
+-1.885 2.59 -0.001114 0.8085 -0.9958
+-1.82 2.501 -0.000632 0.8085 -0.9991
+-1.754 2.41 0.0001341 0.8085 -1
+-1.689 2.32 0.0008428 0.8085 -0.9983
+-1.624 2.231 0.001153 0.8085 -0.9941
+-1.56 2.143 0.0007298 0.8085 -0.9875
+-1.498 2.058 -0.0007542 0.8085 -0.9784
+-1.438 1.976 -0.003612 0.8085 -0.9668
+-1.381 1.897 -0.00814 0.8085 -0.9528
+-1.327 1.823 -0.01461 0.8085 -0.9365
+-1.277 1.755 -0.02328 0.8085 -0.9178
+-1.231 1.691 -0.03437 0.8085 -0.8968
+-1.19 1.634 -0.04807 0.8085 -0.8735
+-1.153 1.584 -0.06454 0.8085 -0.8481
+-1.121 1.54 -0.08391 0.8085 -0.8206
+-1.095 1.504 -0.1062 0.8085 -0.791
+-1.074 1.475 -0.1316 0.8085 -0.7594
+-1.058 1.454 -0.16 0.8085 -0.7259
+-1.049 1.44 -0.1914 0.8085 -0.6907
+-1.045 1.435 -0.2257 0.8085 -0.6536
+-1.046 1.437 -0.2628 0.8085 -0.615
+-1.054 1.448 -0.3025 0.8085 -0.5748
+-1.067 1.465 -0.3447 0.8085 -0.5332
+-1.085 1.49 -0.3891 0.8085 -0.4903
+-1.108 1.522 -0.4354 0.8085 -0.4461
+-1.136 1.56 -0.4834 0.8085 -0.4008
+-1.168 1.605 -0.5326 0.8085 -0.3545
+-1.205 1.655 -0.5828 0.8085 -0.3073
+-1.245 1.71 -0.6334 0.8085 -0.2594
+-1.288 1.77 -0.6842 0.8085 -0.2108
+-1.335 1.834 -0.7347 0.8085 -0.1617
+-1.383 1.9 -0.7845 0.8085 -0.1122
+-1.434 1.97 -0.833 0.8085 -0.06235
+-1.486 2.041 -0.8799 0.8085 -0.01239
+-1.538 2.113 -0.9247 0.8085 0.0376
+-1.591 2.186 -0.9669 0.8085 0.0875
+-1.644 2.258 -1.006 0.8085 0.1372
+-1.695 2.329 -1.042 0.8085 0.1865
+-1.746 2.399 -1.074 0.8085 0.2354
+-1.795 2.466 -1.101 0.8085 0.2837
+-1.841 2.53 -1.124 0.8085 0.3312
+-1.885 2.59 -1.143 0.8085 0.378
+-1.926 2.646 -1.155 0.8085 0.4238
+-1.964 2.698 -1.163 0.8085 0.4685
+-1.998 2.744 -1.165 0.8085 0.5121
+-2.027 2.785 -1.16 0.8085 0.5544
+-2.053 2.82 -1.15 0.8085 0.5953
+-2.074 2.849 -1.134 0.8085 0.6347
+-2.09 2.871 -1.111 0.8085 0.6725
+-2.102 2.887 -1.082 0.8085 0.7087
+-2.108 2.897 -1.048 0.8085 0.743
+-2.111 2.9 -1.007 0.8085 0.7756
+-2.108 2.896 -0.9601 0.8085 0.8061
+-2.101 2.886 -0.9078 0.8085 0.8347
+-2.089 2.87 -0.8501 0.8085 0.8612
+-2.073 2.848 -0.7873 0.8085 0.8855
+-2.053 2.821 -0.7197 0.8085 0.9076
+-2.029 2.788 -0.6478 0.8085 0.9275
+-2.002 2.751 -0.5719 0.8085 0.945
+-1.972 2.71 -0.4924 0.8085 0.9602
+-1.94 2.665 -0.4099 0.8085 0.9729
+-1.905 2.617 -0.3248 0.8085 0.9833
+-1.868 2.566 -0.2377 0.8085 0.9911
+-1.83 2.514 -0.1492 0.8085 0.9965
+-1.791 2.461 -0.05965 0.8085 0.9994
+-1.885 2.334 0 0.7781 1
+-1.841 2.281 0.08814 0.7781 0.9988
+-1.799 2.228 0.1757 0.7781 0.995
+-1.758 2.177 0.2623 0.7781 0.9888
+-1.718 2.127 0.3472 0.7781 0.9801
+-1.68 2.081 0.4299 0.7781 0.9689
+-1.645 2.037 0.5101 0.7781 0.9553
+-1.612 1.997 0.5872 0.7781 0.9394
+-1.583 1.961 0.6607 0.7781 0.9211
+-1.558 1.93 0.7302 0.7781 0.9004
+-1.537 1.904 0.7954 0.7781 0.8776
+-1.521 1.884 0.8559 0.7781 0.8525
+-1.509 1.869 0.9113 0.7781 0.8253
+-1.502 1.861 0.9615 0.7781 0.7961
+-1.5 1.859 1.006 0.7781 0.7648
+-1.504 1.863 1.045 0.7781 0.7317
+-1.512 1.873 1.078 0.7781 0.6967
+-1.526 1.89 1.105 0.7781 0.66
+-1.545 1.913 1.127 0.7781 0.6216
+-1.568 1.943 1.142 0.7781 0.5817
+-1.597 1.978 1.151 0.7781 0.5403
+-1.63 2.019 1.155 0.7781 0.4976
+-1.668 2.066 1.153 0.7781 0.4536
+-1.709 2.117 1.145 0.7781 0.4085
+-1.754 2.173 1.132 0.7781 0.3624
+-1.802 2.232 1.114 0.7781 0.3153
+-1.853 2.296 1.092 0.7781 0.2675
+-1.907 2.362 1.065 0.7781 0.219
+-1.962 2.43 1.034 0.7781 0.17
+-2.018 2.499 0.9989 0.7781 0.1205
+-2.075 2.57 0.9609 0.7781 0.07074
+-2.132 2.64 0.92 0.7781 0.02079
+-2.188 2.711 0.8767 0.7781 -0.0292
+-2.244 2.779 0.8314 0.7781 -0.07912
+-2.298 2.846 0.7846 0.7781 -0.1288
+-2.35 2.911 0.7366 0.7781 -0.1782
+-2.399 2.972 0.6879 0.7781 -0.2272
+-2.445 3.029 0.6389 0.7781 -0.2756
+-2.488 3.081 0.59 0.7781 -0.3233
+-2.526 3.129 0.5416 0.7781 -0.3702
+-2.56 3.171 0.4941 0.7781 -0.4161
+-2.589 3.206 0.4478 0.7781 -0.4611
+-2.612 3.236 0.403 0.7781 -0.5048
+-2.63 3.258 0.3601 0.7781 -0.5474
+-2.643 3.274 0.3192 0.7781 -0.5885
+-2.649 3.282 0.2805 0.7781 -0.6282
+-2.65 3.282 0.2444 0.7781 -0.6663
+-2.644 3.275 0.2108 0.7781 -0.7027
+-2.632 3.26 0.1799 0.7781 -0.7374
+-2.614 3.238 0.1518 0.7781 -0.7702
+-2.59 3.208 0.1265 0.7781 -0.8011
+-2.56 3.171 0.104 0.7781 -0.8301
+-2.525 3.127 0.0842 0.7781 -0.8569
+-2.484 3.077 0.06704 0.7781 -0.8816
+-2.438 3.02 0.05241 0.7781 -0.9041
+-2.388 2.958 0.04015 0.7781 -0.9243
+-2.333 2.89 0.03006 0.7781 -0.9422
+-2.275 2.817 0.02194 0.7781 -0.9578
+-2.213 2.741 0.01554 0.7781 -0.971
+-2.148 2.661 0.01061 0.7781 -0.9817
+-2.081 2.578 0.006851 0.7781 -0.99
+-2.013 2.493 0.003981 0.7781 -0.9958
+-1.943 2.407 0.001691 0.7781 -0.9991
+-1.873 2.32 -0.0003358 0.7781 -1
+-1.803 2.233 -0.002416 0.7781 -0.9983
+-1.733 2.147 -0.004866 0.7781 -0.9941
+-1.665 2.063 -0.008 0.7781 -0.9875
+-1.599 1.981 -0.01212 0.7781 -0.9784
+-1.535 1.902 -0.01752 0.7781 -0.9668
+-1.474 1.826 -0.02447 0.7781 -0.9528
+-1.417 1.755 -0.03322 0.7781 -0.9365
+-1.364 1.689 -0.04402 0.7781 -0.9178
+-1.315 1.629 -0.05706 0.7781 -0.8968
+-1.271 1.574 -0.07252 0.7781 -0.8735
+-1.232 1.526 -0.09055 0.7781 -0.8481
+-1.198 1.484 -0.1113 0.7781 -0.8206
+-1.17 1.449 -0.1347 0.7781 -0.791
+-1.148 1.422 -0.161 0.7781 -0.7594
+-1.132 1.402 -0.19 0.7781 -0.7259
+-1.122 1.39 -0.2218 0.7781 -0.6907
+-1.119 1.386 -0.2563 0.7781 -0.6536
+-1.121 1.389 -0.2933 0.7781 -0.615
+-1.13 1.399 -0.3327 0.7781 -0.5748
+-1.144 1.417 -0.3743 0.7781 -0.5332
+-1.164 1.442 -0.4179 0.7781 -0.4903
+-1.19 1.473 -0.4632 0.7781 -0.4461
+-1.22 1.511 -0.51 0.7781 -0.4008
+-1.256 1.555 -0.5578 0.7781 -0.3545
+-1.295 1.604 -0.6064 0.7781 -0.3073
+-1.339 1.658 -0.6554 0.7781 -0.2594
+-1.386 1.717 -0.7043 0.7781 -0.2108
+-1.436 1.779 -0.7528 0.7781 -0.1617
+-1.489 1.844 -0.8005 0.7781 -0.1122
+-1.544 1.912 -0.8469 0.7781 -0.06235
+-1.6 1.981 -0.8915 0.7781 -0.01239
+-1.656 2.052 -0.934 0.7781 0.0376
+-1.714 2.122 -0.974 0.7781 0.0875
+-1.77 2.193 -1.011 0.7781 0.1372
+-1.826 2.262 -1.044 0.7781 0.1865
+-1.881 2.329 -1.074 0.7781 0.2354
+-1.933 2.394 -1.1 0.7781 0.2837
+-1.983 2.456 -1.121 0.7781 0.3312
+-2.03 2.515 -1.137 0.7781 0.378
+-2.074 2.569 -1.148 0.7781 0.4238
+-2.114 2.619 -1.154 0.7781 0.4685
+-2.15 2.664 -1.154 0.7781 0.5121
+-2.182 2.703 -1.149 0.7781 0.5544
+-2.209 2.736 -1.137 0.7781 0.5953
+-2.231 2.764 -1.12 0.7781 0.6347
+-2.248 2.785 -1.097 0.7781 0.6725
+-2.26 2.8 -1.068 0.7781 0.7087
+-2.267 2.808 -1.033 0.7781 0.743
+-2.269 2.81 -0.9918 0.7781 0.7756
+-2.265 2.805 -0.9452 0.7781 0.8061
+-2.256 2.795 -0.8933 0.7781 0.8347
+-2.243 2.778 -0.8361 0.7781 0.8612
+-2.225 2.756 -0.774 0.7781 0.8855
+-2.203 2.728 -0.7073 0.7781 0.9076
+-2.176 2.696 -0.6364 0.7781 0.9275
+-2.146 2.658 -0.5616 0.7781 0.945
+-2.113 2.617 -0.4835 0.7781 0.9602
+-2.077 2.572 -0.4024 0.7781 0.9729
+-2.038 2.525 -0.3188 0.7781 0.9833
+-1.998 2.474 -0.2333 0.7781 0.9911
+-1.956 2.423 -0.1464 0.7781 0.9965
+-1.913 2.37 -0.05853 0.7781 0.9994
+-1.999 2.237 0 0.7457 1
+-1.952 2.184 0.0864 0.7457 0.9988
+-1.905 2.132 0.1723 0.7457 0.995
+-1.86 2.081 0.2571 0.7457 0.9888
+-1.816 2.033 0.3404 0.7457 0.9801
+-1.775 1.986 0.4217 0.7457 0.9689
+-1.736 1.943 0.5004 0.7457 0.9553
+-1.7 1.903 0.5761 0.7457 0.9394
+-1.669 1.867 0.6485 0.7457 0.9211
+-1.641 1.836 0.717 0.7457 0.9004
+-1.618 1.81 0.7813 0.7457 0.8776
+-1.599 1.79 0.8411 0.7457 0.8525
+-1.586 1.775 0.8961 0.7457 0.8253
+-1.578 1.766 0.946 0.7457 0.7961
+-1.575 1.763 0.9906 0.7457 0.7648
+-1.578 1.766 1.03 0.7457 0.7317
+-1.586 1.775 1.063 0.7457 0.6967
+-1.6 1.791 1.091 0.7457 0.66
+-1.62 1.813 1.113 0.7457 0.6216
+-1.645 1.841 1.129 0.7457 0.5817
+-1.675 1.875 1.14 0.7457 0.5403
+-1.71 1.914 1.144 0.7457 0.4976
+-1.75 1.958 1.144 0.7457 0.4536
+-1.794 2.008 1.138 0.7457 0.4085
+-1.842 2.061 1.127 0.7457 0.3624
+-1.893 2.119 1.111 0.7457 0.3153
+-1.948 2.18 1.09 0.7457 0.2675
+-2.004 2.243 1.065 0.7457 0.219
+-2.063 2.309 1.036 0.7457 0.17
+-2.124 2.377 1.004 0.7457 0.1205
+-2.184 2.445 0.9681 0.7457 0.07074
+-2.246 2.513 0.9296 0.7457 0.02079
+-2.306 2.581 0.8885 0.7457 -0.0292
+-2.366 2.648 0.8455 0.7457 -0.07912
+-2.424 2.713 0.8008 0.7457 -0.1288
+-2.48 2.776 0.7549 0.7457 -0.1782
+-2.533 2.835 0.7081 0.7457 -0.2272
+-2.583 2.891 0.661 0.7457 -0.2756
+-2.628 2.942 0.6138 0.7457 -0.3233
+-2.67 2.988 0.567 0.7457 -0.3702
+-2.707 3.029 0.5208 0.7457 -0.4161
+-2.738 3.064 0.4757 0.7457 -0.4611
+-2.764 3.093 0.4319 0.7457 -0.5048
+-2.784 3.116 0.3896 0.7457 -0.5474
+-2.798 3.131 0.3492 0.7457 -0.5885
+-2.805 3.139 0.3109 0.7457 -0.6282
+-2.806 3.141 0.2747 0.7457 -0.6663
+-2.801 3.134 0.241 0.7457 -0.7027
+-2.788 3.121 0.2096 0.7457 -0.7374
+-2.77 3.1 0.1808 0.7457 -0.7702
+-2.745 3.072 0.1546 0.7457 -0.8011
+-2.714 3.037 0.1308 0.7457 -0.8301
+-2.676 2.995 0.1097 0.7457 -0.8569
+-2.633 2.947 0.09088 0.7457 -0.8816
+-2.585 2.893 0.07443 0.7457 -0.9041
+-2.532 2.834 0.06016 0.7457 -0.9243
+-2.474 2.769 0.0479 0.7457 -0.9422
+-2.412 2.7 0.03745 0.7457 -0.9578
+-2.346 2.626 0.02859 0.7457 -0.971
+-2.278 2.55 0.02109 0.7457 -0.9817
+-2.207 2.47 0.01467 0.7457 -0.99
+-2.135 2.389 0.009075 0.7457 -0.9958
+-2.061 2.306 0.004012 0.7457 -0.9991
+-1.986 2.223 -0.0008056 0.7457 -1
+-1.912 2.14 -0.005673 0.7457 -0.9983
+-1.839 2.058 -0.01088 0.7457 -0.9941
+-1.766 1.977 -0.01672 0.7457 -0.9875
+-1.696 1.899 -0.02348 0.7457 -0.9784
+-1.629 1.823 -0.03141 0.7457 -0.9668
+-1.564 1.751 -0.04078 0.7457 -0.9528
+-1.504 1.683 -0.05181 0.7457 -0.9365
+-1.447 1.62 -0.06473 0.7457 -0.9178
+-1.396 1.562 -0.07971 0.7457 -0.8968
+-1.349 1.51 -0.09693 0.7457 -0.8735
+-1.308 1.464 -0.1165 0.7457 -0.8481
+-1.273 1.425 -0.1385 0.7457 -0.8206
+-1.244 1.392 -0.1631 0.7457 -0.791
+-1.221 1.366 -0.1902 0.7457 -0.7594
+-1.204 1.348 -0.2199 0.7457 -0.7259
+-1.194 1.337 -0.252 0.7457 -0.6907
+-1.191 1.333 -0.2866 0.7457 -0.6536
+-1.194 1.337 -0.3235 0.7457 -0.615
+-1.204 1.348 -0.3626 0.7457 -0.5748
+-1.22 1.365 -0.4037 0.7457 -0.5332
+-1.242 1.39 -0.4465 0.7457 -0.4903
+-1.27 1.421 -0.4907 0.7457 -0.4461
+-1.303 1.458 -0.5363 0.7457 -0.4008
+-1.341 1.501 -0.5827 0.7457 -0.3545
+-1.384 1.549 -0.6297 0.7457 -0.3073
+-1.431 1.602 -0.6769 0.7457 -0.2594
+-1.482 1.659 -0.7239 0.7457 -0.2108
+-1.536 1.719 -0.7704 0.7457 -0.1617
+-1.593 1.783 -0.816 0.7457 -0.1122
+-1.652 1.848 -0.8602 0.7457 -0.06235
+-1.712 1.916 -0.9026 0.7457 -0.01239
+-1.773 1.984 -0.9428 0.7457 0.0376
+-1.834 2.052 -0.9805 0.7457 0.0875
+-1.895 2.12 -1.015 0.7457 0.1372
+-1.954 2.187 -1.046 0.7457 0.1865
+-2.013 2.252 -1.074 0.7457 0.2354
+-2.069 2.315 -1.097 0.7457 0.2837
+-2.122 2.375 -1.117 0.7457 0.3312
+-2.172 2.431 -1.131 0.7457 0.378
+-2.219 2.484 -1.14 0.7457 0.4238
+-2.262 2.531 -1.145 0.7457 0.4685
+-2.3 2.574 -1.143 0.7457 0.5121
+-2.334 2.612 -1.137 0.7457 0.5544
+-2.362 2.643 -1.124 0.7457 0.5953
+-2.385 2.669 -1.106 0.7457 0.6347
+-2.403 2.689 -1.082 0.7457 0.6725
+-2.415 2.703 -1.052 0.7457 0.7087
+-2.422 2.71 -1.017 0.7457 0.743
+-2.423 2.711 -0.9762 0.7457 0.7756
+-2.418 2.706 -0.9298 0.7457 0.8061
+-2.408 2.695 -0.8782 0.7457 0.8347
+-2.393 2.678 -0.8216 0.7457 0.8612
+-2.373 2.656 -0.7602 0.7457 0.8855
+-2.348 2.628 -0.6944 0.7457 0.9076
+-2.319 2.595 -0.6246 0.7457 0.9275
+-2.286 2.558 -0.551 0.7457 0.945
+-2.249 2.517 -0.4742 0.7457 0.9602
+-2.209 2.473 -0.3946 0.7457 0.9729
+-2.167 2.425 -0.3126 0.7457 0.9833
+-2.123 2.376 -0.2287 0.7457 0.9911
+-2.077 2.325 -0.1435 0.7457 0.9965
+-2.03 2.272 -0.05738 0.7457 0.9994
+-2.108 2.134 0 0.7115 1
+-2.057 2.083 0.08461 0.7115 0.9988
+-2.006 2.031 0.1687 0.7115 0.995
+-1.957 1.981 0.2518 0.7115 0.9888
+-1.909 1.933 0.3334 0.7115 0.9801
+-1.864 1.888 0.4131 0.7115 0.9689
+-1.822 1.845 0.4904 0.7115 0.9553
+-1.783 1.806 0.5648 0.7115 0.9394
+-1.749 1.77 0.6359 0.7115 0.9211
+-1.718 1.74 0.7033 0.7115 0.9004
+-1.692 1.714 0.7668 0.7115 0.8776
+-1.672 1.693 0.8259 0.7115 0.8525
+-1.657 1.677 0.8803 0.7115 0.8253
+-1.647 1.668 0.9299 0.7115 0.7961
+-1.644 1.664 0.9743 0.7115 0.7648
+-1.646 1.667 1.014 0.7115 0.7317
+-1.654 1.675 1.047 0.7115 0.6967
+-1.669 1.69 1.076 0.7115 0.66
+-1.689 1.71 1.098 0.7115 0.6216
+-1.715 1.736 1.115 0.7115 0.5817
+-1.747 1.768 1.127 0.7115 0.5403
+-1.783 1.806 1.133 0.7115 0.4976
+-1.825 1.848 1.134 0.7115 0.4536
+-1.872 1.895 1.13 0.7115 0.4085
+-1.923 1.947 1.12 0.7115 0.3624
+-1.977 2.002 1.106 0.7115 0.3153
+-2.035 2.06 1.088 0.7115 0.2675
+-2.095 2.122 1.065 0.7115 0.219
+-2.158 2.185 1.038 0.7115 0.17
+-2.222 2.25 1.008 0.7115 0.1205
+-2.287 2.315 0.9748 0.7115 0.07074
+-2.352 2.381 0.9385 0.7115 0.02079
+-2.417 2.447 0.8998 0.7115 -0.0292
+-2.48 2.511 0.859 0.7115 -0.07912
+-2.542 2.574 0.8165 0.7115 -0.1288
+-2.602 2.635 0.7727 0.7115 -0.1782
+-2.659 2.692 0.7279 0.7115 -0.2272
+-2.712 2.746 0.6827 0.7115 -0.2756
+-2.761 2.796 0.6372 0.7115 -0.3233
+-2.806 2.841 0.592 0.7115 -0.3702
+-2.845 2.881 0.5472 0.7115 -0.4161
+-2.879 2.915 0.5033 0.7115 -0.4611
+-2.907 2.943 0.4604 0.7115 -0.5048
+-2.929 2.965 0.419 0.7115 -0.5474
+-2.944 2.981 0.3791 0.7115 -0.5885
+-2.953 2.99 0.341 0.7115 -0.6282
+-2.954 2.991 0.3049 0.7115 -0.6663
+-2.949 2.986 0.271 0.7115 -0.7027
+-2.937 2.974 0.2392 0.7115 -0.7374
+-2.918 2.954 0.2097 0.7115 -0.7702
+-2.892 2.928 0.1825 0.7115 -0.8011
+-2.86 2.895 0.1576 0.7115 -0.8301
+-2.821 2.856 0.135 0.7115 -0.8569
+-2.776 2.81 0.1147 0.7115 -0.8816
+-2.725 2.759 0.09641 0.7115 -0.9041
+-2.669 2.702 0.08014 0.7115 -0.9243
+-2.608 2.641 0.06571 0.7115 -0.9422
+-2.543 2.575 0.05294 0.7115 -0.9578
+-2.474 2.505 0.04163 0.7115 -0.971
+-2.402 2.432 0.03156 0.7115 -0.9817
+-2.328 2.357 0.02248 0.7115 -0.99
+-2.251 2.279 0.01416 0.7115 -0.9958
+-2.173 2.2 0.006332 0.7115 -0.9991
+-2.095 2.121 -0.001275 0.7115 -1
+-2.017 2.042 -0.008926 0.7115 -0.9983
+-1.939 1.964 -0.01689 0.7115 -0.9941
+-1.863 1.887 -0.02544 0.7115 -0.9875
+-1.79 1.812 -0.03482 0.7115 -0.9784
+-1.719 1.74 -0.04528 0.7115 -0.9668
+-1.651 1.671 -0.05706 0.7115 -0.9528
+-1.587 1.607 -0.07037 0.7115 -0.9365
+-1.528 1.547 -0.0854 0.7115 -0.9178
+-1.474 1.492 -0.1023 0.7115 -0.8968
+-1.425 1.443 -0.1213 0.7115 -0.8735
+-1.382 1.399 -0.1424 0.7115 -0.8481
+-1.345 1.362 -0.1657 0.7115 -0.8206
+-1.315 1.331 -0.1914 0.7115 -0.791
+-1.291 1.307 -0.2193 0.7115 -0.7594
+-1.274 1.29 -0.2496 0.7115 -0.7259
+-1.265 1.28 -0.2821 0.7115 -0.6907
+-1.262 1.277 -0.3169 0.7115 -0.6536
+-1.266 1.281 -0.3536 0.7115 -0.615
+-1.276 1.292 -0.3923 0.7115 -0.5748
+-1.294 1.31 -0.4328 0.7115 -0.5332
+-1.318 1.334 -0.4747 0.7115 -0.4903
+-1.348 1.365 -0.5179 0.7115 -0.4461
+-1.384 1.401 -0.5622 0.7115 -0.4008
+-1.425 1.443 -0.6072 0.7115 -0.3545
+-1.471 1.489 -0.6525 0.7115 -0.3073
+-1.522 1.541 -0.6979 0.7115 -0.2594
+-1.576 1.596 -0.7431 0.7115 -0.2108
+-1.634 1.654 -0.7875 0.7115 -0.1617
+-1.694 1.716 -0.8309 0.7115 -0.1122
+-1.757 1.779 -0.8729 0.7115 -0.06235
+-1.821 1.844 -0.9131 0.7115 -0.01239
+-1.886 1.91 -0.951 0.7115 0.0376
+-1.951 1.976 -0.9864 0.7115 0.0875
+-2.016 2.041 -1.019 0.7115 0.1372
+-2.08 2.106 -1.048 0.7115 0.1865
+-2.141 2.168 -1.073 0.7115 0.2354
+-2.201 2.229 -1.095 0.7115 0.2837
+-2.258 2.286 -1.112 0.7115 0.3312
+-2.311 2.34 -1.124 0.7115 0.378
+-2.361 2.39 -1.132 0.7115 0.4238
+-2.406 2.436 -1.134 0.7115 0.4685
+-2.446 2.476 -1.132 0.7115 0.5121
+-2.481 2.512 -1.124 0.7115 0.5544
+-2.511 2.542 -1.11 0.7115 0.5953
+-2.535 2.566 -1.091 0.7115 0.6347
+-2.553 2.585 -1.067 0.7115 0.6725
+-2.565 2.597 -1.037 0.7115 0.7087
+-2.572 2.604 -1.001 0.7115 0.743
+-2.572 2.604 -0.96 0.7115 0.7756
+-2.566 2.598 -0.9138 0.7115 0.8061
+-2.555 2.587 -0.8626 0.7115 0.8347
+-2.538 2.57 -0.8065 0.7115 0.8612
+-2.516 2.547 -0.7459 0.7115 0.8855
+-2.488 2.519 -0.6811 0.7115 0.9076
+-2.457 2.487 -0.6124 0.7115 0.9275
+-2.42 2.45 -0.5401 0.7115 0.945
+-2.38 2.41 -0.4647 0.7115 0.9602
+-2.337 2.366 -0.3866 0.7115 0.9729
+-2.291 2.32 -0.3062 0.7115 0.9833
+-2.243 2.271 -0.224 0.7115 0.9911
+-2.193 2.22 -0.1405 0.7115 0.9965
+-2.142 2.169 -0.05618 0.7115 0.9994
+-2.212 2.026 0 0.6755 1
+-2.157 1.976 0.08276 0.6755 0.9988
+-2.102 1.926 0.165 0.6755 0.995
+-2.049 1.877 0.2464 0.6755 0.9888
+-1.998 1.83 0.3263 0.6755 0.9801
+-1.949 1.785 0.4043 0.6755 0.9689
+-1.903 1.743 0.48 0.6755 0.9553
+-1.861 1.705 0.553 0.6755 0.9394
+-1.823 1.67 0.6229 0.6755 0.9211
+-1.79 1.64 0.6892 0.6755 0.9004
+-1.762 1.614 0.7518 0.6755 0.8776
+-1.739 1.593 0.8101 0.6755 0.8525
+-1.722 1.578 0.864 0.6755 0.8253
+-1.712 1.568 0.9132 0.6755 0.7961
+-1.707 1.564 0.9575 0.6755 0.7648
+-1.709 1.565 0.9968 0.6755 0.7317
+-1.717 1.573 1.031 0.6755 0.6967
+-1.731 1.586 1.06 0.6755 0.66
+-1.752 1.605 1.083 0.6755 0.6216
+-1.779 1.63 1.101 0.6755 0.5817
+-1.812 1.66 1.114 0.6755 0.5403
+-1.851 1.695 1.121 0.6755 0.4976
+-1.895 1.736 1.124 0.6755 0.4536
+-1.944 1.78 1.121 0.6755 0.4085
+-1.997 1.829 1.113 0.6755 0.3624
+-2.054 1.882 1.101 0.6755 0.3153
+-2.115 1.938 1.085 0.6755 0.2675
+-2.179 1.996 1.064 0.6755 0.219
+-2.245 2.057 1.04 0.6755 0.17
+-2.313 2.119 1.012 0.6755 0.1205
+-2.382 2.182 0.9808 0.6755 0.07074
+-2.451 2.245 0.9469 0.6755 0.02079
+-2.519 2.308 0.9105 0.6755 -0.0292
+-2.587 2.37 0.872 0.6755 -0.07912
+-2.653 2.43 0.8317 0.6755 -0.1288
+-2.716 2.488 0.79 0.6755 -0.1782
+-2.777 2.543 0.7473 0.6755 -0.2272
+-2.833 2.595 0.704 0.6755 -0.2756
+-2.886 2.643 0.6603 0.6755 -0.3233
+-2.933 2.687 0.6166 0.6755 -0.3702
+-2.975 2.725 0.5733 0.6755 -0.4161
+-3.012 2.759 0.5305 0.6755 -0.4611
+-3.042 2.786 0.4887 0.6755 -0.5048
+-3.065 2.808 0.448 0.6755 -0.5474
+-3.082 2.823 0.4087 0.6755 -0.5885
+-3.092 2.832 0.371 0.6755 -0.6282
+-3.094 2.834 0.335 0.6755 -0.6663
+-3.09 2.83 0.3008 0.6755 -0.7027
+-3.077 2.819 0.2686 0.6755 -0.7374
+-3.058 2.801 0.2384 0.6755 -0.7702
+-3.031 2.777 0.2103 0.6755 -0.8011
+-2.997 2.746 0.1843 0.6755 -0.8301
+-2.957 2.709 0.1603 0.6755 -0.8569
+-2.91 2.666 0.1384 0.6755 -0.8816
+-2.857 2.617 0.1183 0.6755 -0.9041
+-2.799 2.564 0.1001 0.6755 -0.9243
+-2.736 2.506 0.08348 0.6755 -0.9422
+-2.667 2.443 0.0684 0.6755 -0.9578
+-2.595 2.377 0.05464 0.6755 -0.971
+-2.52 2.308 0.042 0.6755 -0.9817
+-2.442 2.237 0.03028 0.6755 -0.99
+-2.362 2.163 0.01924 0.6755 -0.9958
+-2.28 2.089 0.008647 0.6755 -0.9991
+-2.198 2.014 -0.001743 0.6755 -1
+-2.116 1.939 -0.01217 0.6755 -0.9983
+-2.035 1.864 -0.02289 0.6755 -0.9941
+-1.956 1.792 -0.03414 0.6755 -0.9875
+-1.879 1.721 -0.04614 0.6755 -0.9784
+-1.804 1.653 -0.05913 0.6755 -0.9668
+-1.734 1.588 -0.07331 0.6755 -0.9528
+-1.667 1.527 -0.08888 0.6755 -0.9365
+-1.605 1.47 -0.106 0.6755 -0.9178
+-1.548 1.418 -0.1249 0.6755 -0.8968
+-1.498 1.372 -0.1455 0.6755 -0.8735
+-1.453 1.331 -0.1682 0.6755 -0.8481
+-1.415 1.296 -0.1928 0.6755 -0.8206
+-1.383 1.267 -0.2195 0.6755 -0.791
+-1.359 1.245 -0.2483 0.6755 -0.7594
+-1.342 1.229 -0.2792 0.6755 -0.7259
+-1.332 1.22 -0.3121 0.6755 -0.6907
+-1.33 1.218 -0.3469 0.6755 -0.6536
+-1.335 1.223 -0.3835 0.6755 -0.615
+-1.347 1.234 -0.4218 0.6755 -0.5748
+-1.366 1.251 -0.4616 0.6755 -0.5332
+-1.392 1.275 -0.5027 0.6755 -0.4903
+-1.424 1.305 -0.5448 0.6755 -0.4461
+-1.463 1.34 -0.5878 0.6755 -0.4008
+-1.507 1.38 -0.6313 0.6755 -0.3545
+-1.556 1.425 -0.675 0.6755 -0.3073
+-1.61 1.475 -0.7186 0.6755 -0.2594
+-1.668 1.528 -0.7618 0.6755 -0.2108
+-1.729 1.584 -0.8041 0.6755 -0.1617
+-1.793 1.643 -0.8454 0.6755 -0.1122
+-1.86 1.704 -0.8851 0.6755 -0.06235
+-1.928 1.766 -0.923 0.6755 -0.01239
+-1.997 1.829 -0.9586 0.6755 0.0376
+-2.066 1.892 -0.9916 0.6755 0.0875
+-2.134 1.955 -1.022 0.6755 0.1372
+-2.202 2.017 -1.048 0.6755 0.1865
+-2.267 2.077 -1.072 0.6755 0.2354
+-2.33 2.134 -1.091 0.6755 0.2837
+-2.39 2.189 -1.106 0.6755 0.3312
+-2.446 2.24 -1.117 0.6755 0.378
+-2.498 2.288 -1.122 0.6755 0.4238
+-2.545 2.331 -1.123 0.6755 0.4685
+-2.587 2.37 -1.119 0.6755 0.5121
+-2.624 2.404 -1.11 0.6755 0.5544
+-2.655 2.432 -1.096 0.6755 0.5953
+-2.68 2.455 -1.076 0.6755 0.6347
+-2.699 2.472 -1.05 0.6755 0.6725
+-2.711 2.483 -1.02 0.6755 0.7087
+-2.717 2.489 -0.9841 0.6755 0.743
+-2.716 2.488 -0.9432 0.6755 0.7756
+-2.71 2.482 -0.8972 0.6755 0.8061
+-2.697 2.47 -0.8464 0.6755 0.8347
+-2.678 2.453 -0.791 0.6755 0.8612
+-2.654 2.431 -0.7312 0.6755 0.8855
+-2.624 2.403 -0.6673 0.6755 0.9076
+-2.589 2.371 -0.5998 0.6755 0.9275
+-2.55 2.335 -0.5288 0.6755 0.945
+-2.506 2.296 -0.4549 0.6755 0.9602
+-2.459 2.253 -0.3783 0.6755 0.9729
+-2.41 2.207 -0.2996 0.6755 0.9833
+-2.358 2.16 -0.2192 0.6755 0.9911
+-2.304 2.11 -0.1375 0.6755 0.9965
+-2.249 2.06 -0.05496 0.6755 0.9994
+-2.311 1.913 0 0.6378 1
+-2.251 1.864 0.08086 0.6378 0.9988
+-2.193 1.816 0.1613 0.6378 0.995
+-2.136 1.768 0.2408 0.6378 0.9888
+-2.08 1.723 0.3189 0.6378 0.9801
+-2.028 1.679 0.3953 0.6378 0.9689
+-1.979 1.638 0.4694 0.6378 0.9553
+-1.933 1.601 0.541 0.6378 0.9394
+-1.893 1.567 0.6095 0.6378 0.9211
+-1.857 1.537 0.6747 0.6378 0.9004
+-1.826 1.512 0.7363 0.6378 0.8776
+-1.801 1.492 0.7938 0.6378 0.8525
+-1.783 1.476 0.8471 0.6378 0.8253
+-1.77 1.466 0.896 0.6378 0.7961
+-1.765 1.461 0.9401 0.6378 0.7648
+-1.766 1.462 0.9794 0.6378 0.7317
+-1.774 1.469 1.014 0.6378 0.6967
+-1.788 1.481 1.043 0.6378 0.66
+-1.81 1.498 1.067 0.6378 0.6216
+-1.837 1.521 1.086 0.6378 0.5817
+-1.871 1.55 1.1 0.6378 0.5403
+-1.912 1.583 1.109 0.6378 0.4976
+-1.957 1.621 1.112 0.6378 0.4536
+-2.009 1.663 1.111 0.6378 0.4085
+-2.065 1.709 1.106 0.6378 0.3624
+-2.125 1.759 1.096 0.6378 0.3153
+-2.189 1.812 1.081 0.6378 0.2675
+-2.256 1.868 1.063 0.6378 0.219
+-2.325 1.925 1.041 0.6378 0.17
+-2.396 1.984 1.015 0.6378 0.1205
+-2.469 2.044 0.9863 0.6378 0.07074
+-2.542 2.104 0.9547 0.6378 0.02079
+-2.614 2.164 0.9206 0.6378 -0.0292
+-2.685 2.223 0.8844 0.6378 -0.07912
+-2.755 2.281 0.8463 0.6378 -0.1288
+-2.822 2.336 0.8068 0.6378 -0.1782
+-2.886 2.389 0.7662 0.6378 -0.2272
+-2.946 2.439 0.7248 0.6378 -0.2756
+-3.001 2.485 0.6829 0.6378 -0.3233
+-3.052 2.527 0.6409 0.6378 -0.3702
+-3.096 2.564 0.599 0.6378 -0.4161
+-3.135 2.596 0.5575 0.6378 -0.4611
+-3.168 2.623 0.5167 0.6378 -0.5048
+-3.193 2.644 0.4768 0.6378 -0.5474
+-3.211 2.659 0.4381 0.6378 -0.5885
+-3.222 2.668 0.4007 0.6378 -0.6282
+-3.225 2.671 0.3648 0.6378 -0.6663
+-3.221 2.667 0.3304 0.6378 -0.7027
+-3.209 2.657 0.2978 0.6378 -0.7374
+-3.189 2.641 0.267 0.6378 -0.7702
+-3.162 2.618 0.238 0.6378 -0.8011
+-3.127 2.589 0.2109 0.6378 -0.8301
+-3.085 2.555 0.1855 0.6378 -0.8569
+-3.037 2.515 0.162 0.6378 -0.8816
+-2.982 2.469 0.1402 0.6378 -0.9041
+-2.922 2.419 0.1199 0.6378 -0.9243
+-2.856 2.364 0.1012 0.6378 -0.9422
+-2.785 2.306 0.08381 0.6378 -0.9578
+-2.71 2.244 0.06761 0.6378 -0.971
+-2.631 2.179 0.05243 0.6378 -0.9817
+-2.55 2.111 0.03806 0.6378 -0.99
+-2.467 2.042 0.02431 0.6378 -0.9958
+-2.382 1.972 0.01096 0.6378 -0.9991
+-2.296 1.901 -0.002211 0.6378 -1
+-2.211 1.831 -0.01541 0.6378 -0.9983
+-2.127 1.761 -0.02888 0.6378 -0.9941
+-2.044 1.692 -0.04281 0.6378 -0.9875
+-1.963 1.626 -0.05743 0.6378 -0.9784
+-1.886 1.562 -0.07294 0.6378 -0.9668
+-1.812 1.501 -0.08951 0.6378 -0.9528
+-1.743 1.443 -0.1073 0.6378 -0.9365
+-1.679 1.39 -0.1266 0.6378 -0.9178
+-1.62 1.341 -0.1473 0.6378 -0.8968
+-1.567 1.298 -0.1697 0.6378 -0.8735
+-1.521 1.26 -0.1939 0.6378 -0.8481
+-1.482 1.227 -0.2198 0.6378 -0.8206
+-1.45 1.2 -0.2476 0.6378 -0.791
+-1.425 1.18 -0.2772 0.6378 -0.7594
+-1.408 1.165 -0.3086 0.6378 -0.7259
+-1.398 1.158 -0.3418 0.6378 -0.6907
+-1.396 1.156 -0.3767 0.6378 -0.6536
+-1.402 1.161 -0.4131 0.6378 -0.615
+-1.415 1.172 -0.451 0.6378 -0.5748
+-1.436 1.189 -0.4901 0.6378 -0.5332
+-1.464 1.212 -0.5303 0.6378 -0.4903
+-1.498 1.241 -0.5714 0.6378 -0.4461
+-1.539 1.275 -0.613 0.6378 -0.4008
+-1.586 1.313 -0.655 0.6378 -0.3545
+-1.638 1.357 -0.697 0.6378 -0.3073
+-1.696 1.404 -0.7388 0.6378 -0.2594
+-1.757 1.455 -0.78 0.6378 -0.2108
+-1.822 1.509 -0.8203 0.6378 -0.1617
+-1.89 1.565 -0.8593 0.6378 -0.1122
+-1.96 1.623 -0.8968 0.6378 -0.06235
+-2.032 1.682 -0.9323 0.6378 -0.01239
+-2.104 1.742 -0.9656 0.6378 0.0376
+-2.177 1.803 -0.9963 0.6378 0.0875
+-2.249 1.862 -1.024 0.6378 0.1372
+-2.32 1.921 -1.049 0.6378 0.1865
+-2.389 1.978 -1.069 0.6378 0.2354
+-2.455 2.032 -1.087 0.6378 0.2837
+-2.517 2.084 -1.1 0.6378 0.3312
+-2.576 2.133 -1.108 0.6378 0.378
+-2.631 2.178 -1.112 0.6378 0.4238
+-2.68 2.219 -1.112 0.6378 0.4685
+-2.724 2.255 -1.106 0.6378 0.5121
+-2.762 2.287 -1.096 0.6378 0.5544
+-2.794 2.314 -1.08 0.6378 0.5953
+-2.82 2.335 -1.06 0.6378 0.6347
+-2.839 2.351 -1.034 0.6378 0.6725
+-2.851 2.361 -1.003 0.6378 0.7087
+-2.857 2.365 -0.9667 0.6378 0.743
+-2.855 2.364 -0.9258 0.6378 0.7756
+-2.848 2.358 -0.8801 0.6378 0.8061
+-2.833 2.346 -0.8297 0.6378 0.8347
+-2.812 2.329 -0.7749 0.6378 0.8612
+-2.786 2.307 -0.716 0.6378 0.8855
+-2.753 2.28 -0.6532 0.6378 0.9076
+-2.716 2.249 -0.5868 0.6378 0.9275
+-2.673 2.213 -0.5172 0.6378 0.945
+-2.627 2.175 -0.4447 0.6378 0.9602
+-2.576 2.133 -0.3698 0.6378 0.9729
+-2.523 2.089 -0.2928 0.6378 0.9833
+-2.467 2.043 -0.2142 0.6378 0.9911
+-2.409 1.995 -0.1343 0.6378 0.9965
+-2.35 1.946 -0.05369 0.6378 0.9994
+-2.403 1.795 0 0.5985 1
+-2.34 1.748 0.07891 0.5985 0.9988
+-2.278 1.701 0.1574 0.5985 0.995
+-2.217 1.656 0.235 0.5985 0.9888
+-2.158 1.612 0.3113 0.5985 0.9801
+-2.101 1.57 0.386 0.5985 0.9689
+-2.049 1.531 0.4585 0.5985 0.9553
+-2 1.494 0.5285 0.5985 0.9394
+-1.956 1.461 0.5958 0.5985 0.9211
+-1.918 1.433 0.6598 0.5985 0.9004
+-1.885 1.408 0.7203 0.5985 0.8776
+-1.858 1.388 0.777 0.5985 0.8525
+-1.837 1.373 0.8297 0.5985 0.8253
+-1.824 1.362 0.8781 0.5985 0.7961
+-1.817 1.357 0.9221 0.5985 0.7648
+-1.817 1.358 0.9614 0.5985 0.7317
+-1.825 1.363 0.9959 0.5985 0.6967
+-1.839 1.374 1.026 0.5985 0.66
+-1.861 1.39 1.05 0.5985 0.6216
+-1.889 1.411 1.07 0.5985 0.5817
+-1.925 1.438 1.085 0.5985 0.5403
+-1.966 1.469 1.095 0.5985 0.4976
+-2.014 1.504 1.101 0.5985 0.4536
+-2.067 1.544 1.101 0.5985 0.4085
+-2.125 1.588 1.097 0.5985 0.3624
+-2.188 1.635 1.089 0.5985 0.3153
+-2.255 1.684 1.077 0.5985 0.2675
+-2.325 1.737 1.061 0.5985 0.219
+-2.398 1.791 1.041 0.5985 0.17
+-2.472 1.847 1.018 0.5985 0.1205
+-2.548 1.904 0.9911 0.5985 0.07074
+-2.624 1.96 0.9619 0.5985 0.02079
+-2.7 2.017 0.9302 0.5985 -0.0292
+-2.775 2.073 0.8963 0.5985 -0.07912
+-2.848 2.128 0.8605 0.5985 -0.1288
+-2.919 2.18 0.8232 0.5985 -0.1782
+-2.986 2.231 0.7846 0.5985 -0.2272
+-3.049 2.278 0.7452 0.5985 -0.2756
+-3.108 2.321 0.7051 0.5985 -0.3233
+-3.161 2.361 0.6647 0.5985 -0.3702
+-3.209 2.397 0.6243 0.5985 -0.4161
+-3.25 2.428 0.5841 0.5985 -0.4611
+-3.284 2.453 0.5443 0.5985 -0.5048
+-3.311 2.474 0.5053 0.5985 -0.5474
+-3.331 2.488 0.4672 0.5985 -0.5885
+-3.343 2.497 0.4301 0.5985 -0.6282
+-3.347 2.5 0.3943 0.5985 -0.6663
+-3.343 2.498 0.3599 0.5985 -0.7027
+-3.331 2.489 0.3269 0.5985 -0.7374
+-3.311 2.474 0.2954 0.5985 -0.7702
+-3.284 2.453 0.2656 0.5985 -0.8011
+-3.248 2.426 0.2373 0.5985 -0.8301
+-3.205 2.394 0.2106 0.5985 -0.8569
+-3.155 2.357 0.1855 0.5985 -0.8816
+-3.099 2.315 0.1619 0.5985 -0.9041
+-3.036 2.268 0.1397 0.5985 -0.9243
+-2.968 2.217 0.1188 0.5985 -0.9422
+-2.895 2.162 0.09917 0.5985 -0.9578
+-2.817 2.104 0.08054 0.5985 -0.971
+-2.736 2.044 0.06282 0.5985 -0.9817
+-2.652 1.981 0.04581 0.5985 -0.99
+-2.565 1.916 0.02936 0.5985 -0.9958
+-2.477 1.85 0.01326 0.5985 -0.9991
+-2.389 1.784 -0.002677 0.5985 -1
+-2.3 1.718 -0.01865 0.5985 -0.9983
+-2.213 1.653 -0.03484 0.5985 -0.9941
+-2.127 1.589 -0.05146 0.5985 -0.9875
+-2.043 1.526 -0.06869 0.5985 -0.9784
+-1.963 1.467 -0.0867 0.5985 -0.9668
+-1.887 1.41 -0.1057 0.5985 -0.9528
+-1.815 1.356 -0.1257 0.5985 -0.9365
+-1.749 1.306 -0.147 0.5985 -0.9178
+-1.688 1.261 -0.1697 0.5985 -0.8968
+-1.634 1.221 -0.1938 0.5985 -0.8735
+-1.586 1.185 -0.2194 0.5985 -0.8481
+-1.546 1.155 -0.2466 0.5985 -0.8206
+-1.513 1.13 -0.2754 0.5985 -0.791
+-1.488 1.111 -0.3058 0.5985 -0.7594
+-1.471 1.099 -0.3378 0.5985 -0.7259
+-1.461 1.092 -0.3713 0.5985 -0.6907
+-1.46 1.091 -0.4062 0.5985 -0.6536
+-1.467 1.096 -0.4425 0.5985 -0.615
+-1.482 1.107 -0.4799 0.5985 -0.5748
+-1.504 1.123 -0.5184 0.5985 -0.5332
+-1.534 1.146 -0.5576 0.5985 -0.4903
+-1.57 1.173 -0.5976 0.5985 -0.4461
+-1.614 1.205 -0.6379 0.5985 -0.4008
+-1.663 1.242 -0.6783 0.5985 -0.3545
+-1.718 1.284 -0.7186 0.5985 -0.3073
+-1.779 1.329 -0.7585 0.5985 -0.2594
+-1.843 1.377 -0.7977 0.5985 -0.2108
+-1.912 1.428 -0.8359 0.5985 -0.1617
+-1.983 1.481 -0.8727 0.5985 -0.1122
+-2.057 1.536 -0.9079 0.5985 -0.06235
+-2.132 1.593 -0.9411 0.5985 -0.01239
+-2.208 1.65 -0.972 0.5985 0.0376
+-2.284 1.706 -1 0.5985 0.0875
+-2.36 1.763 -1.026 0.5985 0.1372
+-2.434 1.818 -1.048 0.5985 0.1865
+-2.506 1.872 -1.067 0.5985 0.2354
+-2.575 1.923 -1.082 0.5985 0.2837
+-2.64 1.972 -1.093 0.5985 0.3312
+-2.702 2.018 -1.099 0.5985 0.378
+-2.758 2.06 -1.102 0.5985 0.4238
+-2.81 2.099 -1.099 0.5985 0.4685
+-2.855 2.133 -1.093 0.5985 0.5121
+-2.895 2.162 -1.081 0.5985 0.5544
+-2.928 2.187 -1.064 0.5985 0.5953
+-2.954 2.207 -1.043 0.5985 0.6347
+-2.973 2.221 -1.016 0.5985 0.6725
+-2.985 2.23 -0.9849 0.5985 0.7087
+-2.99 2.234 -0.9487 0.5985 0.743
+-2.988 2.232 -0.9078 0.5985 0.7756
+-2.979 2.226 -0.8624 0.5985 0.8061
+-2.963 2.214 -0.8125 0.5985 0.8347
+-2.941 2.197 -0.7584 0.5985 0.8612
+-2.912 2.175 -0.7004 0.5985 0.8855
+-2.877 2.149 -0.6386 0.5985 0.9076
+-2.836 2.119 -0.5735 0.5985 0.9275
+-2.791 2.085 -0.5053 0.5985 0.945
+-2.741 2.047 -0.4344 0.5985 0.9602
+-2.687 2.007 -0.3611 0.5985 0.9729
+-2.63 1.964 -0.2858 0.5985 0.9833
+-2.57 1.92 -0.209 0.5985 0.9911
+-2.508 1.874 -0.1311 0.5985 0.9965
+-2.445 1.827 -0.0524 0.5985 0.9994
+-2.49 1.673 0 0.5577 1
+-2.423 1.628 0.07691 0.5577 0.9988
+-2.357 1.583 0.1534 0.5577 0.995
+-2.292 1.54 0.2291 0.5577 0.9888
+-2.229 1.498 0.3036 0.5577 0.9801
+-2.169 1.458 0.3764 0.5577 0.9689
+-2.113 1.42 0.4473 0.5577 0.9553
+-2.062 1.385 0.5158 0.5577 0.9394
+-2.015 1.354 0.5816 0.5577 0.9211
+-1.973 1.326 0.6444 0.5577 0.9004
+-1.938 1.302 0.7039 0.5577 0.8776
+-1.909 1.283 0.7598 0.5577 0.8525
+-1.887 1.268 0.8118 0.5577 0.8253
+-1.872 1.257 0.8598 0.5577 0.7961
+-1.864 1.252 0.9035 0.5577 0.7648
+-1.863 1.252 0.9428 0.5577 0.7317
+-1.87 1.256 0.9776 0.5577 0.6967
+-1.885 1.266 1.008 0.5577 0.66
+-1.906 1.281 1.033 0.5577 0.6216
+-1.936 1.3 1.054 0.5577 0.5817
+-1.972 1.325 1.07 0.5577 0.5403
+-2.015 1.354 1.081 0.5577 0.4976
+-2.064 1.387 1.088 0.5577 0.4536
+-2.119 1.424 1.09 0.5577 0.4085
+-2.179 1.464 1.088 0.5577 0.3624
+-2.245 1.508 1.082 0.5577 0.3153
+-2.314 1.555 1.072 0.5577 0.2675
+-2.387 1.604 1.058 0.5577 0.219
+-2.463 1.655 1.04 0.5577 0.17
+-2.54 1.707 1.019 0.5577 0.1205
+-2.619 1.76 0.9953 0.5577 0.07074
+-2.699 1.813 0.9685 0.5577 0.02079
+-2.778 1.867 0.9391 0.5577 -0.0292
+-2.857 1.919 0.9076 0.5577 -0.07912
+-2.933 1.971 0.8741 0.5577 -0.1288
+-3.007 2.02 0.839 0.5577 -0.1782
+-3.077 2.067 0.8026 0.5577 -0.2272
+-3.143 2.112 0.7651 0.5577 -0.2756
+-3.205 2.153 0.7268 0.5577 -0.3233
+-3.261 2.191 0.6881 0.5577 -0.3702
+-3.311 2.225 0.6492 0.5577 -0.4161
+-3.355 2.254 0.6103 0.5577 -0.4611
+-3.391 2.278 0.5717 0.5577 -0.5048
+-3.42 2.298 0.5335 0.5577 -0.5474
+-3.441 2.312 0.496 0.5577 -0.5885
+-3.455 2.321 0.4593 0.5577 -0.6282
+-3.46 2.324 0.4237 0.5577 -0.6663
+-3.456 2.322 0.3891 0.5577 -0.7027
+-3.445 2.314 0.3557 0.5577 -0.7374
+-3.425 2.301 0.3237 0.5577 -0.7702
+-3.396 2.282 0.293 0.5577 -0.8011
+-3.36 2.258 0.2636 0.5577 -0.8301
+-3.316 2.228 0.2356 0.5577 -0.8569
+-3.265 2.194 0.2089 0.5577 -0.8816
+-3.207 2.155 0.1836 0.5577 -0.9041
+-3.143 2.111 0.1594 0.5577 -0.9243
+-3.072 2.064 0.1364 0.5577 -0.9422
+-2.997 2.014 0.1145 0.5577 -0.9578
+-2.917 1.96 0.09343 0.5577 -0.971
+-2.833 1.903 0.07317 0.5577 -0.9817
+-2.746 1.845 0.05354 0.5577 -0.99
+-2.657 1.785 0.03439 0.5577 -0.9958
+-2.566 1.724 0.01555 0.5577 -0.9991
+-2.475 1.663 -0.003141 0.5577 -1
+-2.383 1.601 -0.02186 0.5577 -0.9983
+-2.293 1.541 -0.04079 0.5577 -0.9941
+-2.205 1.481 -0.06008 0.5577 -0.9875
+-2.119 1.423 -0.0799 0.5577 -0.9784
+-2.036 1.368 -0.1004 0.5577 -0.9668
+-1.957 1.315 -0.1217 0.5577 -0.9528
+-1.884 1.266 -0.144 0.5577 -0.9365
+-1.815 1.22 -0.1674 0.5577 -0.9178
+-1.753 1.178 -0.1919 0.5577 -0.8968
+-1.697 1.14 -0.2177 0.5577 -0.8735
+-1.648 1.107 -0.2449 0.5577 -0.8481
+-1.607 1.08 -0.2733 0.5577 -0.8206
+-1.574 1.057 -0.3031 0.5577 -0.791
+-1.548 1.04 -0.3343 0.5577 -0.7594
+-1.531 1.029 -0.3668 0.5577 -0.7259
+-1.522 1.023 -0.4006 0.5577 -0.6907
+-1.521 1.022 -0.4355 0.5577 -0.6536
+-1.529 1.027 -0.4716 0.5577 -0.615
+-1.545 1.038 -0.5085 0.5577 -0.5748
+-1.569 1.054 -0.5463 0.5577 -0.5332
+-1.601 1.075 -0.5846 0.5577 -0.4903
+-1.64 1.102 -0.6234 0.5577 -0.4461
+-1.685 1.132 -0.6623 0.5577 -0.4008
+-1.738 1.167 -0.7012 0.5577 -0.3545
+-1.795 1.206 -0.7398 0.5577 -0.3073
+-1.859 1.249 -0.7778 0.5577 -0.2594
+-1.926 1.294 -0.8149 0.5577 -0.2108
+-1.998 1.342 -0.851 0.5577 -0.1617
+-2.073 1.393 -0.8856 0.5577 -0.1122
+-2.15 1.444 -0.9184 0.5577 -0.06235
+-2.229 1.497 -0.9493 0.5577 -0.01239
+-2.308 1.551 -0.9778 0.5577 0.0376
+-2.388 1.604 -1.004 0.5577 0.0875
+-2.466 1.657 -1.027 0.5577 0.1372
+-2.543 1.709 -1.047 0.5577 0.1865
+-2.618 1.759 -1.063 0.5577 0.2354
+-2.69 1.807 -1.076 0.5577 0.2837
+-2.758 1.853 -1.085 0.5577 0.3312
+-2.822 1.896 -1.09 0.5577 0.378
+-2.881 1.935 -1.09 0.5577 0.4238
+-2.934 1.971 -1.086 0.5577 0.4685
+-2.981 2.003 -1.078 0.5577 0.5121
+-3.021 2.03 -1.065 0.5577 0.5544
+-3.055 2.053 -1.047 0.5577 0.5953
+-3.082 2.071 -1.025 0.5577 0.6347
+-3.101 2.084 -0.9981 0.5577 0.6725
+-3.113 2.092 -0.9664 0.5577 0.7087
+-3.118 2.095 -0.9301 0.5577 0.743
+-3.115 2.093 -0.8893 0.5577 0.7756
+-3.104 2.086 -0.8441 0.5577 0.8061
+-3.087 2.074 -0.7948 0.5577 0.8347
+-3.062 2.057 -0.7414 0.5577 0.8612
+-3.031 2.036 -0.6843 0.5577 0.8855
+-2.994 2.011 -0.6237 0.5577 0.9076
+-2.95 1.982 -0.5598 0.5577 0.9275
+-2.902 1.95 -0.493 0.5577 0.945
+-2.849 1.914 -0.4237 0.5577 0.9602
+-2.791 1.875 -0.3521 0.5577 0.9729
+-2.731 1.835 -0.2787 0.5577 0.9833
+-2.667 1.792 -0.2038 0.5577 0.9911
+-2.602 1.748 -0.1278 0.5577 0.9965
+-2.535 1.703 -0.05107 0.5577 0.9994
+-2.571 1.547 0 0.5155 1
+-2.5 1.504 0.07486 0.5155 0.9988
+-2.43 1.462 0.1493 0.5155 0.995
+-2.361 1.42 0.223 0.5155 0.9888
+-2.295 1.38 0.2956 0.5155 0.9801
+-2.232 1.342 0.3666 0.5155 0.9689
+-2.172 1.307 0.4358 0.5155 0.9553
+-2.117 1.274 0.5027 0.5155 0.9394
+-2.068 1.244 0.5671 0.5155 0.9211
+-2.024 1.217 0.6287 0.5155 0.9004
+-1.986 1.195 0.687 0.5155 0.8776
+-1.955 1.176 0.742 0.5155 0.8525
+-1.931 1.161 0.7934 0.5155 0.8253
+-1.914 1.151 0.8409 0.5155 0.7961
+-1.905 1.146 0.8843 0.5155 0.7648
+-1.903 1.145 0.9236 0.5155 0.7317
+-1.91 1.149 0.9586 0.5155 0.6967
+-1.924 1.158 0.9892 0.5155 0.66
+-1.946 1.171 1.015 0.5155 0.6216
+-1.976 1.189 1.037 0.5155 0.5817
+-2.013 1.211 1.054 0.5155 0.5403
+-2.057 1.237 1.067 0.5155 0.4976
+-2.107 1.268 1.075 0.5155 0.4536
+-2.164 1.302 1.079 0.5155 0.4085
+-2.227 1.34 1.079 0.5155 0.3624
+-2.294 1.38 1.074 0.5155 0.3153
+-2.366 1.423 1.066 0.5155 0.2675
+-2.441 1.469 1.054 0.5155 0.219
+-2.52 1.516 1.039 0.5155 0.17
+-2.601 1.565 1.021 0.5155 0.1205
+-2.683 1.614 0.9989 0.5155 0.07074
+-2.766 1.664 0.9745 0.5155 0.02079
+-2.848 1.713 0.9475 0.5155 -0.0292
+-2.929 1.762 0.9183 0.5155 -0.07912
+-3.009 1.81 0.8872 0.5155 -0.1288
+-3.086 1.856 0.8543 0.5155 -0.1782
+-3.159 1.901 0.82 0.5155 -0.2272
+-3.228 1.942 0.7845 0.5155 -0.2756
+-3.293 1.981 0.7481 0.5155 -0.3233
+-3.351 2.016 0.7111 0.5155 -0.3702
+-3.404 2.048 0.6737 0.5155 -0.4161
+-3.45 2.075 0.6361 0.5155 -0.4611
+-3.488 2.098 0.5986 0.5155 -0.5048
+-3.519 2.117 0.5613 0.5155 -0.5474
+-3.542 2.131 0.5245 0.5155 -0.5885
+-3.556 2.139 0.4882 0.5155 -0.6282
+-3.562 2.143 0.4527 0.5155 -0.6663
+-3.559 2.141 0.4181 0.5155 -0.7027
+-3.548 2.134 0.3844 0.5155 -0.7374
+-3.528 2.122 0.3517 0.5155 -0.7702
+-3.5 2.105 0.3202 0.5155 -0.8011
+-3.463 2.083 0.2897 0.5155 -0.8301
+-3.418 2.056 0.2604 0.5155 -0.8569
+-3.366 2.025 0.2322 0.5155 -0.8816
+-3.307 1.989 0.2051 0.5155 -0.9041
+-3.241 1.95 0.179 0.5155 -0.9243
+-3.169 1.906 0.1539 0.5155 -0.9422
+-3.091 1.86 0.1297 0.5155 -0.9578
+-3.009 1.81 0.1063 0.5155 -0.971
+-2.923 1.758 0.08347 0.5155 -0.9817
+-2.834 1.705 0.06123 0.5155 -0.99
+-2.742 1.65 0.0394 0.5155 -0.9958
+-2.649 1.594 0.01784 0.5155 -0.9991
+-2.555 1.537 -0.003603 0.5155 -1
+-2.461 1.481 -0.02507 0.5155 -0.9983
+-2.368 1.425 -0.04671 0.5155 -0.9941
+-2.277 1.37 -0.06866 0.5155 -0.9875
+-2.189 1.317 -0.09107 0.5155 -0.9784
+-2.104 1.266 -0.1141 0.5155 -0.9668
+-2.023 1.217 -0.1377 0.5155 -0.9528
+-1.948 1.172 -0.1623 0.5155 -0.9365
+-1.878 1.13 -0.1877 0.5155 -0.9178
+-1.814 1.091 -0.2141 0.5155 -0.8968
+-1.757 1.057 -0.2416 0.5155 -0.8735
+-1.707 1.027 -0.2701 0.5155 -0.8481
+-1.665 1.002 -0.2998 0.5155 -0.8206
+-1.631 0.9814 -0.3306 0.5155 -0.791
+-1.606 0.9659 -0.3626 0.5155 -0.7594
+-1.589 0.9557 -0.3956 0.5155 -0.7259
+-1.58 0.9506 -0.4296 0.5155 -0.6907
+-1.58 0.9507 -0.4646 0.5155 -0.6536
+-1.589 0.956 -0.5003 0.5155 -0.615
+-1.606 0.9664 -0.5368 0.5155 -0.5748
+-1.632 0.9817 -0.5738 0.5155 -0.5332
+-1.665 1.002 -0.6112 0.5155 -0.4903
+-1.706 1.026 -0.6488 0.5155 -0.4461
+-1.754 1.055 -0.6863 0.5155 -0.4008
+-1.809 1.088 -0.7236 0.5155 -0.3545
+-1.87 1.125 -0.7605 0.5155 -0.3073
+-1.936 1.164 -0.7966 0.5155 -0.2594
+-2.006 1.207 -0.8317 0.5155 -0.2108
+-2.081 1.252 -0.8655 0.5155 -0.1617
+-2.159 1.299 -0.8979 0.5155 -0.1122
+-2.239 1.347 -0.9284 0.5155 -0.06235
+-2.321 1.396 -0.9569 0.5155 -0.01239
+-2.404 1.446 -0.983 0.5155 0.0376
+-2.486 1.496 -1.006 0.5155 0.0875
+-2.568 1.545 -1.027 0.5155 0.1372
+-2.648 1.593 -1.045 0.5155 0.1865
+-2.726 1.64 -1.059 0.5155 0.2354
+-2.8 1.684 -1.07 0.5155 0.2837
+-2.87 1.727 -1.076 0.5155 0.3312
+-2.936 1.766 -1.079 0.5155 0.378
+-2.997 1.803 -1.078 0.5155 0.4238
+-3.052 1.836 -1.073 0.5155 0.4685
+-3.1 1.865 -1.063 0.5155 0.5121
+-3.142 1.89 -1.049 0.5155 0.5544
+-3.176 1.911 -1.03 0.5155 0.5953
+-3.203 1.927 -1.007 0.5155 0.6347
+-3.223 1.939 -0.9794 0.5155 0.6725
+-3.235 1.946 -0.9473 0.5155 0.7087
+-3.238 1.948 -0.9109 0.5155 0.743
+-3.234 1.946 -0.8702 0.5155 0.7756
+-3.223 1.939 -0.8254 0.5155 0.8061
+-3.203 1.927 -0.7765 0.5155 0.8347
+-3.177 1.911 -0.7239 0.5155 0.8612
+-3.144 1.891 -0.6678 0.5155 0.8855
+-3.104 1.867 -0.6083 0.5155 0.9076
+-3.058 1.839 -0.5458 0.5155 0.9275
+-3.006 1.808 -0.4805 0.5155 0.945
+-2.95 1.774 -0.4128 0.5155 0.9602
+-2.889 1.738 -0.3429 0.5155 0.9729
+-2.825 1.699 -0.2714 0.5155 0.9833
+-2.758 1.659 -0.1984 0.5155 0.9911
+-2.688 1.617 -0.1244 0.5155 0.9965
+-2.618 1.575 -0.04971 0.5155 0.9994
+-2.645 1.416 0 0.472 1
+-2.57 1.376 0.07277 0.472 0.9988
+-2.496 1.337 0.1452 0.472 0.995
+-2.424 1.298 0.2169 0.472 0.9888
+-2.354 1.261 0.2875 0.472 0.9801
+-2.288 1.225 0.3566 0.472 0.9689
+-2.225 1.192 0.424 0.472 0.9553
+-2.167 1.161 0.4893 0.472 0.9394
+-2.115 1.132 0.5523 0.472 0.9211
+-2.068 1.107 0.6125 0.472 0.9004
+-2.028 1.086 0.6698 0.472 0.8776
+-1.995 1.068 0.7238 0.472 0.8525
+-1.969 1.054 0.7745 0.472 0.8253
+-1.951 1.044 0.8215 0.472 0.7961
+-1.94 1.039 0.8646 0.472 0.7648
+-1.938 1.038 0.9039 0.472 0.7317
+-1.944 1.041 0.939 0.472 0.6967
+-1.958 1.048 0.97 0.472 0.66
+-1.98 1.06 0.9967 0.472 0.6216
+-2.01 1.076 1.019 0.472 0.5817
+-2.048 1.096 1.037 0.472 0.5403
+-2.093 1.121 1.051 0.472 0.4976
+-2.145 1.148 1.061 0.472 0.4536
+-2.203 1.18 1.067 0.472 0.4085
+-2.267 1.214 1.068 0.472 0.3624
+-2.337 1.251 1.066 0.472 0.3153
+-2.411 1.291 1.06 0.472 0.2675
+-2.489 1.332 1.05 0.472 0.219
+-2.57 1.376 1.037 0.472 0.17
+-2.653 1.421 1.021 0.472 0.1205
+-2.738 1.466 1.002 0.472 0.07074
+-2.824 1.512 0.9799 0.472 0.02079
+-2.909 1.558 0.9553 0.472 -0.0292
+-2.993 1.603 0.9285 0.472 -0.07912
+-3.076 1.647 0.8997 0.472 -0.1288
+-3.156 1.69 0.8691 0.472 -0.1782
+-3.232 1.731 0.8369 0.472 -0.2272
+-3.304 1.769 0.8035 0.472 -0.2756
+-3.371 1.805 0.769 0.472 -0.3233
+-3.432 1.838 0.7337 0.472 -0.3702
+-3.487 1.867 0.6978 0.472 -0.4161
+-3.535 1.893 0.6616 0.472 -0.4611
+-3.575 1.914 0.6252 0.472 -0.5048
+-3.608 1.932 0.5888 0.472 -0.5474
+-3.632 1.945 0.5526 0.472 -0.5885
+-3.648 1.953 0.5168 0.472 -0.6282
+-3.654 1.957 0.4815 0.472 -0.6663
+-3.652 1.956 0.4468 0.472 -0.7027
+-3.641 1.95 0.4128 0.472 -0.7374
+-3.622 1.939 0.3795 0.472 -0.7702
+-3.593 1.924 0.3472 0.472 -0.8011
+-3.556 1.904 0.3156 0.472 -0.8301
+-3.511 1.88 0.285 0.472 -0.8569
+-3.458 1.851 0.2553 0.472 -0.8816
+-3.397 1.819 0.2265 0.472 -0.9041
+-3.33 1.783 0.1985 0.472 -0.9243
+-3.256 1.744 0.1713 0.472 -0.9422
+-3.177 1.701 0.1448 0.472 -0.9578
+-3.093 1.656 0.119 0.472 -0.971
+-3.005 1.609 0.09372 0.472 -0.9817
+-2.914 1.56 0.06889 0.472 -0.99
+-2.82 1.51 0.04439 0.472 -0.9958
+-2.725 1.459 0.02011 0.472 -0.9991
+-2.629 1.407 -0.004063 0.472 -1
+-2.533 1.356 -0.02826 0.472 -0.9983
+-2.438 1.305 -0.0526 0.472 -0.9941
+-2.345 1.255 -0.0772 0.472 -0.9875
+-2.254 1.207 -0.1022 0.472 -0.9784
+-2.167 1.161 -0.1276 0.472 -0.9668
+-2.085 1.116 -0.1537 0.472 -0.9528
+-2.008 1.075 -0.1804 0.472 -0.9365
+-1.936 1.037 -0.2078 0.472 -0.9178
+-1.871 1.002 -0.2361 0.472 -0.8968
+-1.813 0.9708 -0.2652 0.472 -0.8735
+-1.763 0.9438 -0.2952 0.472 -0.8481
+-1.72 0.921 -0.3261 0.472 -0.8206
+-1.686 0.9027 -0.3579 0.472 -0.791
+-1.66 0.8889 -0.3906 0.472 -0.7594
+-1.643 0.8799 -0.4241 0.472 -0.7259
+-1.635 0.8757 -0.4584 0.472 -0.6907
+-1.636 0.8762 -0.4933 0.472 -0.6536
+-1.646 0.8815 -0.5288 0.472 -0.615
+-1.665 0.8914 -0.5648 0.472 -0.5748
+-1.692 0.9059 -0.601 0.472 -0.5332
+-1.727 0.9247 -0.6374 0.472 -0.4903
+-1.77 0.9477 -0.6738 0.472 -0.4461
+-1.82 0.9746 -0.7099 0.472 -0.4008
+-1.877 1.005 -0.7456 0.472 -0.3545
+-1.94 1.039 -0.7807 0.472 -0.3073
+-2.009 1.076 -0.8148 0.472 -0.2594
+-2.083 1.115 -0.8479 0.472 -0.2108
+-2.16 1.157 -0.8795 0.472 -0.1617
+-2.241 1.2 -0.9096 0.472 -0.1122
+-2.324 1.244 -0.9378 0.472 -0.06235
+-2.409 1.29 -0.9638 0.472 -0.01239
+-2.495 1.336 -0.9875 0.472 0.0376
+-2.58 1.381 -1.009 0.472 0.0875
+-2.665 1.427 -1.027 0.472 0.1372
+-2.747 1.471 -1.042 0.472 0.1865
+-2.827 1.514 -1.054 0.472 0.2354
+-2.904 1.555 -1.062 0.472 0.2837
+-2.977 1.594 -1.067 0.472 0.3312
+-3.045 1.63 -1.068 0.472 0.378
+-3.107 1.664 -1.065 0.472 0.4238
+-3.163 1.694 -1.058 0.472 0.4685
+-3.213 1.72 -1.047 0.472 0.5121
+-3.255 1.743 -1.032 0.472 0.5544
+-3.29 1.762 -1.012 0.472 0.5953
+-3.318 1.776 -0.9882 0.472 0.6347
+-3.337 1.787 -0.9601 0.472 0.6725
+-3.348 1.793 -0.9277 0.472 0.7087
+-3.352 1.795 -0.8911 0.472 0.743
+-3.347 1.792 -0.8506 0.472 0.7756
+-3.334 1.785 -0.8061 0.472 0.8061
+-3.313 1.774 -0.7578 0.472 0.8347
+-3.284 1.759 -0.706 0.472 0.8612
+-3.249 1.739 -0.6509 0.472 0.8855
+-3.206 1.717 -0.5926 0.472 0.9076
+-3.158 1.691 -0.5314 0.472 0.9275
+-3.103 1.662 -0.4676 0.472 0.945
+-3.044 1.63 -0.4016 0.472 0.9602
+-2.98 1.595 -0.3335 0.472 0.9729
+-2.912 1.559 -0.2639 0.472 0.9833
+-2.841 1.521 -0.1929 0.472 0.9911
+-2.769 1.482 -0.1209 0.472 0.9965
+-2.694 1.443 -0.04832 0.472 0.9994
+-2.712 1.282 0 0.4274 1
+-2.634 1.245 0.07063 0.4274 0.9988
+-2.557 1.209 0.1409 0.4274 0.995
+-2.481 1.173 0.2105 0.4274 0.9888
+-2.408 1.138 0.2791 0.4274 0.9801
+-2.338 1.105 0.3464 0.4274 0.9689
+-2.273 1.074 0.412 0.4274 0.9553
+-2.212 1.046 0.4757 0.4274 0.9394
+-2.157 1.019 0.5371 0.4274 0.9211
+-2.107 0.9962 0.596 0.4274 0.9004
+-2.065 0.9761 0.6521 0.4274 0.8776
+-2.03 0.9594 0.7052 0.4274 0.8525
+-2.002 0.9463 0.7551 0.4274 0.8253
+-1.982 0.937 0.8015 0.4274 0.7961
+-1.97 0.9315 0.8444 0.4274 0.7648
+-1.967 0.93 0.8835 0.4274 0.7317
+-1.973 0.9325 0.9189 0.4274 0.6967
+-1.986 0.9389 0.9502 0.4274 0.66
+-2.008 0.9494 0.9776 0.4274 0.6216
+-2.039 0.9637 1.001 0.4274 0.5817
+-2.077 0.9817 1.02 0.4274 0.5403
+-2.123 1.003 1.035 0.4274 0.4976
+-2.175 1.028 1.047 0.4274 0.4536
+-2.235 1.057 1.054 0.4274 0.4085
+-2.301 1.088 1.057 0.4274 0.3624
+-2.372 1.121 1.057 0.4274 0.3153
+-2.448 1.157 1.053 0.4274 0.2675
+-2.528 1.195 1.046 0.4274 0.219
+-2.612 1.235 1.035 0.4274 0.17
+-2.698 1.275 1.021 0.4274 0.1205
+-2.785 1.317 1.004 0.4274 0.07074
+-2.873 1.358 0.9846 0.4274 0.02079
+-2.962 1.4 0.9625 0.4274 -0.0292
+-3.049 1.441 0.9381 0.4274 -0.07912
+-3.134 1.482 0.9116 0.4274 -0.1288
+-3.216 1.521 0.8833 0.4274 -0.1782
+-3.295 1.558 0.8533 0.4274 -0.2272
+-3.37 1.593 0.8219 0.4274 -0.2756
+-3.439 1.626 0.7893 0.4274 -0.3233
+-3.503 1.656 0.7558 0.4274 -0.3702
+-3.56 1.683 0.7215 0.4274 -0.4161
+-3.61 1.706 0.6866 0.4274 -0.4611
+-3.652 1.726 0.6514 0.4274 -0.5048
+-3.686 1.743 0.6159 0.4274 -0.5474
+-3.712 1.755 0.5805 0.4274 -0.5885
+-3.729 1.763 0.5451 0.4274 -0.6282
+-3.736 1.766 0.51 0.4274 -0.6663
+-3.735 1.766 0.4752 0.4274 -0.7027
+-3.725 1.761 0.4409 0.4274 -0.7374
+-3.705 1.752 0.4071 0.4274 -0.7702
+-3.677 1.738 0.3739 0.4274 -0.8011
+-3.639 1.72 0.3414 0.4274 -0.8301
+-3.594 1.699 0.3095 0.4274 -0.8569
+-3.54 1.673 0.2783 0.4274 -0.8816
+-3.479 1.644 0.2478 0.4274 -0.9041
+-3.41 1.612 0.2179 0.4274 -0.9243
+-3.335 1.577 0.1886 0.4274 -0.9422
+-3.255 1.539 0.1599 0.4274 -0.9578
+-3.169 1.498 0.1317 0.4274 -0.971
+-3.08 1.456 0.1039 0.4274 -0.9817
+-2.987 1.412 0.0765 0.4274 -0.99
+-2.891 1.367 0.04935 0.4274 -0.9958
+-2.794 1.321 0.02237 0.4274 -0.9991
+-2.696 1.274 -0.004521 0.4274 -1
+-2.598 1.228 -0.03143 0.4274 -0.9983
+-2.501 1.182 -0.05846 0.4274 -0.9941
+-2.406 1.137 -0.08569 0.4274 -0.9875
+-2.314 1.094 -0.1132 0.4274 -0.9784
+-2.226 1.052 -0.1411 0.4274 -0.9668
+-2.142 1.013 -0.1695 0.4274 -0.9528
+-2.063 0.9753 -0.1984 0.4274 -0.9365
+-1.991 0.941 -0.2279 0.4274 -0.9178
+-1.924 0.9098 -0.258 0.4274 -0.8968
+-1.866 0.8819 -0.2887 0.4274 -0.8735
+-1.815 0.8578 -0.3202 0.4274 -0.8481
+-1.772 0.8375 -0.3523 0.4274 -0.8206
+-1.737 0.8212 -0.385 0.4274 -0.791
+-1.712 0.8092 -0.4184 0.4274 -0.7594
+-1.695 0.8014 -0.4524 0.4274 -0.7259
+-1.688 0.7979 -0.4869 0.4274 -0.6907
+-1.69 0.7987 -0.5218 0.4274 -0.6536
+-1.701 0.8039 -0.557 0.4274 -0.615
+-1.72 0.8133 -0.5924 0.4274 -0.5748
+-1.749 0.8267 -0.6279 0.4274 -0.5332
+-1.786 0.8442 -0.6633 0.4274 -0.4903
+-1.831 0.8654 -0.6984 0.4274 -0.4461
+-1.883 0.8901 -0.7331 0.4274 -0.4008
+-1.942 0.9182 -0.7672 0.4274 -0.3545
+-2.008 0.9492 -0.8004 0.4274 -0.3073
+-2.079 0.9828 -0.8326 0.4274 -0.2594
+-2.155 1.019 -0.8635 0.4274 -0.2108
+-2.235 1.057 -0.893 0.4274 -0.1617
+-2.319 1.096 -0.9208 0.4274 -0.1122
+-2.405 1.137 -0.9466 0.4274 -0.06235
+-2.492 1.178 -0.9702 0.4274 -0.01239
+-2.581 1.22 -0.9915 0.4274 0.0376
+-2.669 1.262 -1.01 0.4274 0.0875
+-2.756 1.303 -1.026 0.4274 0.1372
+-2.841 1.343 -1.039 0.4274 0.1865
+-2.923 1.382 -1.049 0.4274 0.2354
+-3.002 1.419 -1.055 0.4274 0.2837
+-3.077 1.454 -1.058 0.4274 0.3312
+-3.146 1.487 -1.057 0.4274 0.378
+-3.21 1.517 -1.052 0.4274 0.4238
+-3.268 1.545 -1.043 0.4274 0.4685
+-3.318 1.569 -1.031 0.4274 0.5121
+-3.361 1.589 -1.014 0.4274 0.5544
+-3.397 1.606 -0.9935 0.4274 0.5953
+-3.425 1.619 -0.9688 0.4274 0.6347
+-3.444 1.628 -0.9401 0.4274 0.6725
+-3.455 1.633 -0.9074 0.4274 0.7087
+-3.457 1.634 -0.8708 0.4274 0.743
+-3.451 1.631 -0.8304 0.4274 0.7756
+-3.437 1.625 -0.7863 0.4274 0.8061
+-3.414 1.614 -0.7387 0.4274 0.8347
+-3.384 1.6 -0.6877 0.4274 0.8612
+-3.346 1.582 -0.6335 0.4274 0.8855
+-3.301 1.561 -0.5765 0.4274 0.9076
+-3.25 1.536 -0.5167 0.4274 0.9275
+-3.193 1.509 -0.4545 0.4274 0.945
+-3.13 1.48 -0.3901 0.4274 0.9602
+-3.063 1.448 -0.3239 0.4274 0.9729
+-2.992 1.414 -0.2562 0.4274 0.9833
+-2.918 1.379 -0.1872 0.4274 0.9911
+-2.842 1.343 -0.1173 0.4274 0.9965
+-2.764 1.307 -0.0469 0.4274 0.9994
+-2.773 1.145 0 0.3817 1
+-2.691 1.111 0.06845 0.3817 0.9988
+-2.611 1.078 0.1366 0.3817 0.995
+-2.532 1.045 0.2041 0.3817 0.9888
+-2.456 1.014 0.2706 0.3817 0.9801
+-2.383 0.9839 0.3359 0.3817 0.9689
+-2.314 0.9555 0.3997 0.3817 0.9553
+-2.25 0.9293 0.4617 0.3817 0.9394
+-2.193 0.9053 0.5215 0.3817 0.9211
+-2.141 0.884 0.579 0.3817 0.9004
+-2.096 0.8656 0.634 0.3817 0.8776
+-2.059 0.8502 0.6861 0.3817 0.8525
+-2.029 0.838 0.7352 0.3817 0.8253
+-2.008 0.8292 0.7811 0.3817 0.7961
+-1.995 0.8239 0.8236 0.3817 0.7648
+-1.991 0.8222 0.8627 0.3817 0.7317
+-1.996 0.824 0.8981 0.3817 0.6967
+-2.009 0.8295 0.9299 0.3817 0.66
+-2.031 0.8386 0.9578 0.3817 0.6216
+-2.061 0.8511 0.982 0.3817 0.5817
+-2.1 0.8671 1.002 0.3817 0.5403
+-2.146 0.8862 1.019 0.3817 0.4976
+-2.2 0.9085 1.031 0.3817 0.4536
+-2.261 0.9336 1.04 0.3817 0.4085
+-2.328 0.9613 1.046 0.3817 0.3624
+-2.401 0.9914 1.047 0.3817 0.3153
+-2.479 1.024 1.045 0.3817 0.2675
+-2.561 1.057 1.04 0.3817 0.219
+-2.646 1.093 1.032 0.3817 0.17
+-2.735 1.129 1.02 0.3817 0.1205
+-2.824 1.166 1.006 0.3817 0.07074
+-2.915 1.204 0.9888 0.3817 0.02079
+-3.006 1.241 0.9691 0.3817 -0.0292
+-3.095 1.278 0.9471 0.3817 -0.07912
+-3.183 1.314 0.923 0.3817 -0.1288
+-3.268 1.349 0.8969 0.3817 -0.1782
+-3.349 1.383 0.8691 0.3817 -0.2272
+-3.426 1.415 0.8398 0.3817 -0.2756
+-3.498 1.444 0.8092 0.3817 -0.3233
+-3.564 1.471 0.7774 0.3817 -0.3702
+-3.623 1.496 0.7447 0.3817 -0.4161
+-3.674 1.517 0.7112 0.3817 -0.4611
+-3.718 1.535 0.6772 0.3817 -0.5048
+-3.754 1.55 0.6427 0.3817 -0.5474
+-3.781 1.561 0.6079 0.3817 -0.5885
+-3.799 1.569 0.573 0.3817 -0.6282
+-3.808 1.572 0.5381 0.3817 -0.6663
+-3.807 1.572 0.5033 0.3817 -0.7027
+-3.798 1.568 0.4688 0.3817 -0.7374
+-3.778 1.56 0.4344 0.3817 -0.7702
+-3.75 1.548 0.4005 0.3817 -0.8011
+-3.713 1.533 0.3669 0.3817 -0.8301
+-3.667 1.514 0.3338 0.3817 -0.8569
+-3.612 1.492 0.3011 0.3817 -0.8816
+-3.55 1.466 0.2689 0.3817 -0.9041
+-3.481 1.437 0.2371 0.3817 -0.9243
+-3.405 1.406 0.2058 0.3817 -0.9422
+-3.324 1.372 0.1749 0.3817 -0.9578
+-3.237 1.337 0.1443 0.3817 -0.971
+-3.146 1.299 0.114 0.3817 -0.9817
+-3.052 1.26 0.08406 0.3817 -0.99
+-2.955 1.22 0.05428 0.3817 -0.9958
+-2.856 1.179 0.02462 0.3817 -0.9991
+-2.756 1.138 -0.004976 0.3817 -1
+-2.657 1.097 -0.03458 0.3817 -0.9983
+-2.558 1.056 -0.06428 0.3817 -0.9941
+-2.462 1.017 -0.09412 0.3817 -0.9875
+-2.369 0.9781 -0.1242 0.3817 -0.9784
+-2.279 0.941 -0.1545 0.3817 -0.9668
+-2.194 0.9059 -0.1852 0.3817 -0.9528
+-2.114 0.873 -0.2163 0.3817 -0.9365
+-2.041 0.8426 -0.2477 0.3817 -0.9178
+-1.974 0.815 -0.2797 0.3817 -0.8968
+-1.914 0.7905 -0.312 0.3817 -0.8735
+-1.863 0.7692 -0.3449 0.3817 -0.8481
+-1.82 0.7514 -0.3782 0.3817 -0.8206
+-1.785 0.7372 -0.4119 0.3817 -0.791
+-1.76 0.7267 -0.4459 0.3817 -0.7594
+-1.744 0.7201 -0.4804 0.3817 -0.7259
+-1.737 0.7173 -0.515 0.3817 -0.6907
+-1.74 0.7184 -0.5499 0.3817 -0.6536
+-1.752 0.7233 -0.5848 0.3817 -0.615
+-1.773 0.732 -0.6196 0.3817 -0.5748
+-1.803 0.7444 -0.6543 0.3817 -0.5332
+-1.841 0.7603 -0.6887 0.3817 -0.4903
+-1.888 0.7796 -0.7225 0.3817 -0.4461
+-1.942 0.802 -0.7558 0.3817 -0.4008
+-2.004 0.8274 -0.7882 0.3817 -0.3545
+-2.071 0.8554 -0.8196 0.3817 -0.3073
+-2.145 0.8857 -0.8498 0.3817 -0.2594
+-2.223 0.9181 -0.8787 0.3817 -0.2108
+-2.306 0.9522 -0.9059 0.3817 -0.1617
+-2.392 0.9878 -0.9313 0.3817 -0.1122
+-2.481 1.024 -0.9548 0.3817 -0.06235
+-2.571 1.061 -0.976 0.3817 -0.01239
+-2.661 1.099 -0.9948 0.3817 0.0376
+-2.752 1.136 -1.011 0.3817 0.0875
+-2.841 1.173 -1.024 0.3817 0.1372
+-2.929 1.209 -1.035 0.3817 0.1865
+-3.013 1.244 -1.042 0.3817 0.2354
+-3.094 1.277 -1.046 0.3817 0.2837
+-3.17 1.309 -1.047 0.3817 0.3312
+-3.241 1.338 -1.044 0.3817 0.378
+-3.306 1.365 -1.038 0.3817 0.4238
+-3.365 1.389 -1.028 0.3817 0.4685
+-3.416 1.411 -1.014 0.3817 0.5121
+-3.46 1.429 -0.9959 0.3817 0.5544
+-3.496 1.443 -0.9743 0.3817 0.5953
+-3.523 1.455 -0.9488 0.3817 0.6347
+-3.542 1.463 -0.9196 0.3817 0.6725
+-3.553 1.467 -0.8866 0.3817 0.7087
+-3.554 1.468 -0.8499 0.3817 0.743
+-3.547 1.465 -0.8097 0.3817 0.7756
+-3.531 1.458 -0.766 0.3817 0.8061
+-3.507 1.448 -0.719 0.3817 0.8347
+-3.475 1.435 -0.6689 0.3817 0.8612
+-3.435 1.419 -0.6158 0.3817 0.8855
+-3.388 1.399 -0.56 0.3817 0.9076
+-3.334 1.377 -0.5017 0.3817 0.9275
+-3.275 1.352 -0.4411 0.3817 0.945
+-3.209 1.325 -0.3785 0.3817 0.9602
+-3.139 1.296 -0.3141 0.3817 0.9729
+-3.065 1.266 -0.2484 0.3817 0.9833
+-2.988 1.234 -0.1815 0.3817 0.9911
+-2.908 1.201 -0.1137 0.3817 0.9965
+-2.827 1.167 -0.04545 0.3817 0.9994
+-2.827 1.005 0 0.335 1
+-2.742 0.9749 0.06622 0.335 0.9988
+-2.658 0.9451 0.1321 0.335 0.995
+-2.576 0.9159 0.1975 0.335 0.9888
+-2.497 0.8877 0.262 0.335 0.9801
+-2.421 0.8608 0.3253 0.335 0.9689
+-2.35 0.8354 0.3872 0.335 0.9553
+-2.283 0.8118 0.4474 0.335 0.9394
+-2.223 0.7903 0.5057 0.335 0.9211
+-2.169 0.7711 0.5618 0.335 0.9004
+-2.122 0.7545 0.6155 0.335 0.8776
+-2.083 0.7405 0.6666 0.335 0.8525
+-2.052 0.7294 0.7148 0.335 0.8253
+-2.029 0.7213 0.7602 0.335 0.7961
+-2.015 0.7163 0.8023 0.335 0.7648
+-2.01 0.7145 0.8413 0.335 0.7317
+-2.013 0.7158 0.8768 0.335 0.6967
+-2.026 0.7204 0.9089 0.335 0.66
+-2.048 0.7281 0.9375 0.335 0.6216
+-2.078 0.7389 0.9624 0.335 0.5817
+-2.117 0.7527 0.9838 0.335 0.5403
+-2.164 0.7694 1.002 0.335 0.4976
+-2.219 0.7888 1.016 0.335 0.4536
+-2.28 0.8108 1.026 0.335 0.4085
+-2.349 0.8351 1.033 0.335 0.3624
+-2.423 0.8614 1.037 0.335 0.3153
+-2.502 0.8897 1.037 0.335 0.2675
+-2.586 0.9194 1.034 0.335 0.219
+-2.673 0.9505 1.028 0.335 0.17
+-2.764 0.9825 1.019 0.335 0.1205
+-2.855 1.015 1.007 0.335 0.07074
+-2.948 1.048 0.9923 0.335 0.02079
+-3.041 1.081 0.9751 0.335 -0.0292
+-3.133 1.114 0.9555 0.335 -0.07912
+-3.223 1.146 0.9338 0.335 -0.1288
+-3.31 1.177 0.91 0.335 -0.1782
+-3.394 1.206 0.8845 0.335 -0.2272
+-3.473 1.235 0.8572 0.335 -0.2756
+-3.546 1.261 0.8285 0.335 -0.3233
+-3.614 1.285 0.7985 0.335 -0.3702
+-3.675 1.307 0.7674 0.335 -0.4161
+-3.729 1.326 0.7354 0.335 -0.4611
+-3.774 1.342 0.7025 0.335 -0.5048
+-3.811 1.355 0.669 0.335 -0.5474
+-3.84 1.365 0.635 0.335 -0.5885
+-3.859 1.372 0.6006 0.335 -0.6282
+-3.869 1.375 0.566 0.335 -0.6663
+-3.869 1.376 0.5312 0.335 -0.7027
+-3.86 1.372 0.4963 0.335 -0.7374
+-3.841 1.366 0.4615 0.335 -0.7702
+-3.813 1.356 0.4268 0.335 -0.8011
+-3.776 1.342 0.3922 0.335 -0.8301
+-3.73 1.326 0.3578 0.335 -0.8569
+-3.675 1.307 0.3237 0.335 -0.8816
+-3.613 1.284 0.2898 0.335 -0.9041
+-3.543 1.26 0.2562 0.335 -0.9243
+-3.466 1.232 0.2228 0.335 -0.9422
+-3.384 1.203 0.1897 0.335 -0.9578
+-3.296 1.172 0.1568 0.335 -0.971
+-3.204 1.139 0.1241 0.335 -0.9817
+-3.109 1.105 0.09158 0.335 -0.99
+-3.01 1.07 0.05917 0.335 -0.9958
+-2.91 1.035 0.02685 0.335 -0.9991
+-2.81 0.9989 -0.005427 0.335 -1
+-2.709 0.9632 -0.03772 0.335 -0.9983
+-2.61 0.9278 -0.07006 0.335 -0.9941
+-2.512 0.8931 -0.1025 0.335 -0.9875
+-2.418 0.8595 -0.1351 0.335 -0.9784
+-2.327 0.8273 -0.1678 0.335 -0.9668
+-2.241 0.7967 -0.2008 0.335 -0.9528
+-2.16 0.7681 -0.234 0.335 -0.9365
+-2.086 0.7417 -0.2675 0.335 -0.9178
+-2.019 0.7178 -0.3012 0.335 -0.8968
+-1.959 0.6965 -0.3352 0.335 -0.8735
+-1.907 0.6781 -0.3694 0.335 -0.8481
+-1.864 0.6628 -0.4038 0.335 -0.8206
+-1.83 0.6506 -0.4384 0.335 -0.791
+-1.805 0.6417 -0.4732 0.335 -0.7594
+-1.789 0.6362 -0.508 0.335 -0.7259
+-1.783 0.634 -0.5429 0.335 -0.6907
+-1.787 0.6353 -0.5776 0.335 -0.6536
+-1.8 0.6399 -0.6122 0.335 -0.615
+-1.822 0.6478 -0.6465 0.335 -0.5748
+-1.854 0.659 -0.6803 0.335 -0.5332
+-1.894 0.6732 -0.7136 0.335 -0.4903
+-1.942 0.6904 -0.7463 0.335 -0.4461
+-1.998 0.7104 -0.778 0.335 -0.4008
+-2.061 0.7329 -0.8088 0.335 -0.3545
+-2.131 0.7577 -0.8383 0.335 -0.3073
+-2.207 0.7846 -0.8666 0.335 -0.2594
+-2.287 0.8133 -0.8933 0.335 -0.2108
+-2.372 0.8434 -0.9182 0.335 -0.1617
+-2.461 0.8748 -0.9413 0.335 -0.1122
+-2.551 0.9071 -0.9624 0.335 -0.06235
+-2.644 0.9399 -0.9812 0.335 -0.01239
+-2.736 0.9729 -0.9975 0.335 0.0376
+-2.829 1.006 -1.011 0.335 0.0875
+-2.92 1.038 -1.022 0.335 0.1372
+-3.01 1.07 -1.03 0.335 0.1865
+-3.096 1.101 -1.036 0.335 0.2354
+-3.178 1.13 -1.037 0.335 0.2837
+-3.256 1.158 -1.036 0.335 0.3312
+-3.328 1.183 -1.031 0.335 0.378
+-3.394 1.207 -1.023 0.335 0.4238
+-3.454 1.228 -1.011 0.335 0.4685
+-3.506 1.246 -0.996 0.335 0.5121
+-3.55 1.262 -0.977 0.335 0.5544
+-3.586 1.275 -0.9544 0.335 0.5953
+-3.614 1.285 -0.9282 0.335 0.6347
+-3.632 1.291 -0.8985 0.335 0.6725
+-3.642 1.295 -0.8652 0.335 0.7087
+-3.643 1.295 -0.8285 0.335 0.743
+-3.635 1.292 -0.7885 0.335 0.7756
+-3.618 1.286 -0.7453 0.335 0.8061
+-3.592 1.277 -0.6989 0.335 0.8347
+-3.558 1.265 -0.6497 0.335 0.8612
+-3.516 1.25 -0.5977 0.335 0.8855
+-3.467 1.233 -0.5432 0.335 0.9076
+-3.411 1.213 -0.4863 0.335 0.9275
+-3.348 1.19 -0.4274 0.335 0.945
+-3.28 1.166 -0.3665 0.335 0.9602
+-3.207 1.14 -0.3041 0.335 0.9729
+-3.13 1.113 -0.2404 0.335 0.9833
+-3.05 1.084 -0.1756 0.335 0.9911
+-2.967 1.055 -0.11 0.335 0.9965
+-2.883 1.025 -0.04397 0.335 0.9994
+-2.873 0.8624 0 0.2875 1
+-2.786 0.8361 0.06395 0.2875 0.9988
+-2.699 0.8101 0.1276 0.2875 0.995
+-2.614 0.7846 0.1908 0.2875 0.9888
+-2.532 0.76 0.2531 0.2875 0.9801
+-2.453 0.7364 0.3144 0.2875 0.9689
+-2.379 0.7142 0.3744 0.2875 0.9553
+-2.311 0.6935 0.4329 0.2875 0.9394
+-2.248 0.6747 0.4895 0.2875 0.9211
+-2.192 0.6578 0.5442 0.2875 0.9004
+-2.143 0.6431 0.5966 0.2875 0.8776
+-2.102 0.6308 0.6466 0.2875 0.8525
+-2.069 0.6209 0.6941 0.2875 0.8253
+-2.044 0.6136 0.7388 0.2875 0.7961
+-2.029 0.6091 0.7805 0.2875 0.7648
+-2.023 0.6072 0.8193 0.2875 0.7317
+-2.026 0.6081 0.855 0.2875 0.6967
+-2.038 0.6118 0.8874 0.2875 0.66
+-2.06 0.6182 0.9165 0.2875 0.6216
+-2.09 0.6273 0.9423 0.2875 0.5817
+-2.129 0.6389 0.9646 0.2875 0.5403
+-2.176 0.6531 0.9836 0.2875 0.4976
+-2.231 0.6697 0.9992 0.2875 0.4536
+-2.294 0.6885 1.011 0.2875 0.4085
+-2.363 0.7092 1.02 0.2875 0.3624
+-2.438 0.7318 1.026 0.2875 0.3153
+-2.519 0.7561 1.028 0.2875 0.2675
+-2.604 0.7816 1.027 0.2875 0.219
+-2.693 0.8083 1.024 0.2875 0.17
+-2.785 0.8358 1.017 0.2875 0.1205
+-2.878 0.864 1.007 0.2875 0.07074
+-2.973 0.8924 0.9952 0.2875 0.02079
+-3.068 0.9208 0.9805 0.2875 -0.0292
+-3.162 0.9489 0.9634 0.2875 -0.07912
+-3.254 0.9765 0.944 0.2875 -0.1288
+-3.343 1.003 0.9226 0.2875 -0.1782
+-3.428 1.029 0.8992 0.2875 -0.2272
+-3.509 1.053 0.8741 0.2875 -0.2756
+-3.585 1.076 0.8474 0.2875 -0.3233
+-3.654 1.097 0.8192 0.2875 -0.3702
+-3.717 1.116 0.7897 0.2875 -0.4161
+-3.772 1.132 0.7591 0.2875 -0.4611
+-3.819 1.146 0.7274 0.2875 -0.5048
+-3.858 1.158 0.6949 0.2875 -0.5474
+-3.888 1.167 0.6617 0.2875 -0.5885
+-3.908 1.173 0.6278 0.2875 -0.6282
+-3.919 1.176 0.5934 0.2875 -0.6663
+-3.92 1.177 0.5587 0.2875 -0.7027
+-3.911 1.174 0.5236 0.2875 -0.7374
+-3.893 1.169 0.4883 0.2875 -0.7702
+-3.865 1.16 0.4528 0.2875 -0.8011
+-3.828 1.149 0.4173 0.2875 -0.8301
+-3.782 1.135 0.3817 0.2875 -0.8569
+-3.728 1.119 0.3461 0.2875 -0.8816
+-3.665 1.1 0.3106 0.2875 -0.9041
+-3.595 1.079 0.2751 0.2875 -0.9243
+-3.518 1.056 0.2397 0.2875 -0.9422
+-3.435 1.031 0.2044 0.2875 -0.9578
+-3.347 1.005 0.1692 0.2875 -0.971
+-3.254 0.9767 0.1341 0.2875 -0.9817
+-3.158 0.9478 0.09903 0.2875 -0.99
+-3.059 0.9181 0.06403 0.2875 -0.9958
+-2.958 0.8878 0.02907 0.2875 -0.9991
+-2.856 0.8573 -0.005875 0.2875 -1
+-2.755 0.8268 -0.04082 0.2875 -0.9983
+-2.654 0.7967 -0.07579 0.2875 -0.9941
+-2.556 0.7672 -0.1108 0.2875 -0.9875
+-2.461 0.7386 -0.1459 0.2875 -0.9784
+-2.37 0.7112 -0.181 0.2875 -0.9668
+-2.283 0.6852 -0.2163 0.2875 -0.9528
+-2.202 0.6609 -0.2516 0.2875 -0.9365
+-2.127 0.6385 -0.287 0.2875 -0.9178
+-2.06 0.6182 -0.3225 0.2875 -0.8968
+-2 0.6002 -0.3581 0.2875 -0.8735
+-1.948 0.5847 -0.3937 0.2875 -0.8481
+-1.905 0.5718 -0.4292 0.2875 -0.8206
+-1.871 0.5616 -0.4647 0.2875 -0.791
+-1.846 0.5542 -0.5002 0.2875 -0.7594
+-1.831 0.5497 -0.5354 0.2875 -0.7259
+-1.826 0.5481 -0.5704 0.2875 -0.6907
+-1.831 0.5494 -0.605 0.2875 -0.6536
+-1.845 0.5536 -0.6393 0.2875 -0.615
+-1.868 0.5607 -0.6729 0.2875 -0.5748
+-1.901 0.5705 -0.7059 0.2875 -0.5332
+-1.942 0.583 -0.7382 0.2875 -0.4903
+-1.992 0.5979 -0.7695 0.2875 -0.4461
+-2.05 0.6153 -0.7998 0.2875 -0.4008
+-2.115 0.6348 -0.8288 0.2875 -0.3545
+-2.187 0.6563 -0.8565 0.2875 -0.3073
+-2.264 0.6796 -0.8827 0.2875 -0.2594
+-2.347 0.7044 -0.9073 0.2875 -0.2108
+-2.434 0.7305 -0.93 0.2875 -0.1617
+-2.524 0.7575 -0.9508 0.2875 -0.1122
+-2.617 0.7854 -0.9694 0.2875 -0.06235
+-2.711 0.8136 -0.9857 0.2875 -0.01239
+-2.806 0.8421 -0.9996 0.2875 0.0376
+-2.9 0.8704 -1.011 0.2875 0.0875
+-2.993 0.8984 -1.02 0.2875 0.1372
+-3.084 0.9256 -1.025 0.2875 0.1865
+-3.172 0.952 -1.028 0.2875 0.2354
+-3.255 0.9771 -1.028 0.2875 0.2837
+-3.334 1.001 -1.024 0.2875 0.3312
+-3.408 1.023 -1.018 0.2875 0.378
+-3.475 1.043 -1.008 0.2875 0.4238
+-3.535 1.061 -0.9943 0.2875 0.4685
+-3.587 1.077 -0.9776 0.2875 0.5121
+-3.632 1.09 -0.9575 0.2875 0.5544
+-3.668 1.101 -0.934 0.2875 0.5953
+-3.695 1.109 -0.9071 0.2875 0.6347
+-3.714 1.115 -0.8768 0.2875 0.6725
+-3.723 1.117 -0.8433 0.2875 0.7087
+-3.723 1.117 -0.8066 0.2875 0.743
+-3.713 1.115 -0.7668 0.2875 0.7756
+-3.695 1.109 -0.724 0.2875 0.8061
+-3.668 1.101 -0.6784 0.2875 0.8347
+-3.632 1.09 -0.6301 0.2875 0.8612
+-3.588 1.077 -0.5792 0.2875 0.8855
+-3.537 1.062 -0.526 0.2875 0.9076
+-3.479 1.044 -0.4707 0.2875 0.9275
+-3.414 1.025 -0.4134 0.2875 0.945
+-3.343 1.003 -0.3544 0.2875 0.9602
+-3.267 0.9807 -0.294 0.2875 0.9729
+-3.187 0.9567 -0.2323 0.2875 0.9833
+-3.104 0.9318 -0.1696 0.2875 0.9911
+-3.019 0.9061 -0.1063 0.2875 0.9965
+-2.932 0.8799 -0.04246 0.2875 0.9994
+-2.913 0.7177 0 0.2392 1
+-2.822 0.6955 0.06165 0.2392 0.9988
+-2.733 0.6734 0.123 0.2392 0.995
+-2.646 0.6519 0.184 0.2392 0.9888
+-2.561 0.631 0.2441 0.2392 0.9801
+-2.48 0.611 0.3034 0.2392 0.9689
+-2.403 0.5922 0.3614 0.2392 0.9553
+-2.332 0.5746 0.418 0.2392 0.9394
+-2.267 0.5586 0.473 0.2392 0.9211
+-2.209 0.5442 0.5262 0.2392 0.9004
+-2.158 0.5317 0.5773 0.2392 0.8776
+-2.115 0.5212 0.6263 0.2392 0.8525
+-2.081 0.5127 0.6728 0.2392 0.8253
+-2.055 0.5063 0.7169 0.2392 0.7961
+-2.038 0.5023 0.7583 0.2392 0.7648
+-2.031 0.5005 0.7969 0.2392 0.7317
+-2.033 0.501 0.8326 0.2392 0.6967
+-2.045 0.5039 0.8653 0.2392 0.66
+-2.066 0.509 0.895 0.2392 0.6216
+-2.096 0.5164 0.9215 0.2392 0.5817
+-2.135 0.526 0.9449 0.2392 0.5403
+-2.182 0.5377 0.9651 0.2392 0.4976
+-2.238 0.5514 0.9821 0.2392 0.4536
+-2.301 0.567 0.996 0.2392 0.4085
+-2.371 0.5842 1.007 0.2392 0.3624
+-2.447 0.603 1.014 0.2392 0.3153
+-2.529 0.6231 1.019 0.2392 0.2675
+-2.615 0.6444 1.02 0.2392 0.219
+-2.705 0.6666 1.019 0.2392 0.17
+-2.798 0.6895 1.014 0.2392 0.1205
+-2.894 0.713 1.007 0.2392 0.07074
+-2.99 0.7367 0.9975 0.2392 0.02079
+-3.086 0.7604 0.9853 0.2392 -0.0292
+-3.182 0.784 0.9706 0.2392 -0.07912
+-3.275 0.807 0.9536 0.2392 -0.1288
+-3.366 0.8294 0.9345 0.2392 -0.1782
+-3.453 0.8509 0.9134 0.2392 -0.2272
+-3.536 0.8713 0.8904 0.2392 -0.2756
+-3.613 0.8903 0.8657 0.2392 -0.3233
+-3.684 0.9079 0.8393 0.2392 -0.3702
+-3.749 0.9237 0.8115 0.2392 -0.4161
+-3.805 0.9377 0.7823 0.2392 -0.4611
+-3.854 0.9496 0.7519 0.2392 -0.5048
+-3.894 0.9595 0.7204 0.2392 -0.5474
+-3.925 0.9671 0.6879 0.2392 -0.5885
+-3.946 0.9723 0.6546 0.2392 -0.6282
+-3.958 0.9753 0.6205 0.2392 -0.6663
+-3.96 0.9757 0.5858 0.2392 -0.7027
+-3.952 0.9738 0.5505 0.2392 -0.7374
+-3.934 0.9695 0.5147 0.2392 -0.7702
+-3.907 0.9628 0.4786 0.2392 -0.8011
+-3.871 0.9537 0.4421 0.2392 -0.8301
+-3.825 0.9424 0.4053 0.2392 -0.8569
+-3.77 0.929 0.3683 0.2392 -0.8816
+-3.708 0.9136 0.3311 0.2392 -0.9041
+-3.638 0.8963 0.2939 0.2392 -0.9243
+-3.561 0.8773 0.2565 0.2392 -0.9422
+-3.477 0.8568 0.219 0.2392 -0.9578
+-3.389 0.835 0.1815 0.2392 -0.971
+-3.296 0.812 0.144 0.2392 -0.9817
+-3.199 0.7882 0.1064 0.2392 -0.99
+-3.099 0.7636 0.06885 0.2392 -0.9958
+-2.998 0.7387 0.03127 0.2392 -0.9991
+-2.896 0.7135 -0.00632 0.2392 -1
+-2.794 0.6884 -0.0439 0.2392 -0.9983
+-2.693 0.6635 -0.08148 0.2392 -0.9941
+-2.594 0.6392 -0.1191 0.2392 -0.9875
+-2.498 0.6156 -0.1566 0.2392 -0.9784
+-2.407 0.593 -0.1941 0.2392 -0.9668
+-2.32 0.5716 -0.2316 0.2392 -0.9528
+-2.239 0.5516 -0.2691 0.2392 -0.9365
+-2.164 0.5332 -0.3064 0.2392 -0.9178
+-2.096 0.5165 -0.3437 0.2392 -0.8968
+-2.036 0.5017 -0.3808 0.2392 -0.8735
+-1.985 0.489 -0.4177 0.2392 -0.8481
+-1.942 0.4785 -0.4544 0.2392 -0.8206
+-1.908 0.4702 -0.4908 0.2392 -0.791
+-1.884 0.4643 -0.5268 0.2392 -0.7594
+-1.87 0.4608 -0.5624 0.2392 -0.7259
+-1.865 0.4596 -0.5975 0.2392 -0.6907
+-1.871 0.461 -0.6321 0.2392 -0.6536
+-1.886 0.4647 -0.6659 0.2392 -0.615
+-1.91 0.4707 -0.699 0.2392 -0.5748
+-1.944 0.4791 -0.7311 0.2392 -0.5332
+-1.987 0.4896 -0.7622 0.2392 -0.4903
+-2.039 0.5023 -0.7922 0.2392 -0.4461
+-2.098 0.5169 -0.821 0.2392 -0.4008
+-2.164 0.5333 -0.8483 0.2392 -0.3545
+-2.238 0.5514 -0.8742 0.2392 -0.3073
+-2.317 0.5709 -0.8984 0.2392 -0.2594
+-2.401 0.5917 -0.9207 0.2392 -0.2108
+-2.49 0.6135 -0.9412 0.2392 -0.1617
+-2.582 0.6362 -0.9596 0.2392 -0.1122
+-2.676 0.6594 -0.9758 0.2392 -0.06235
+-2.772 0.683 -0.9897 0.2392 -0.01239
+-2.868 0.7068 -1.001 0.2392 0.0376
+-2.964 0.7304 -1.01 0.2392 0.0875
+-3.059 0.7537 -1.016 0.2392 0.1372
+-3.151 0.7765 -1.019 0.2392 0.1865
+-3.24 0.7984 -1.02 0.2392 0.2354
+-3.325 0.8193 -1.017 0.2392 0.2837
+-3.405 0.839 -1.012 0.2392 0.3312
+-3.479 0.8573 -1.003 0.2392 0.378
+-3.547 0.874 -0.9917 0.2392 0.4238
+-3.607 0.8889 -0.9768 0.2392 0.4685
+-3.66 0.9019 -0.9587 0.2392 0.5121
+-3.705 0.9129 -0.9374 0.2392 0.5544
+-3.741 0.9218 -0.9129 0.2392 0.5953
+-3.768 0.9284 -0.8853 0.2392 0.6347
+-3.786 0.9328 -0.8546 0.2392 0.6725
+-3.794 0.9349 -0.8209 0.2392 0.7087
+-3.793 0.9347 -0.7842 0.2392 0.743
+-3.783 0.9321 -0.7447 0.2392 0.7756
+-3.763 0.9273 -0.7024 0.2392 0.8061
+-3.735 0.9202 -0.6575 0.2392 0.8347
+-3.697 0.911 -0.6101 0.2392 0.8612
+-3.652 0.8998 -0.5604 0.2392 0.8855
+-3.598 0.8866 -0.5085 0.2392 0.9076
+-3.538 0.8717 -0.4547 0.2392 0.9275
+-3.47 0.8551 -0.3992 0.2392 0.945
+-3.397 0.8371 -0.342 0.2392 0.9602
+-3.319 0.8179 -0.2836 0.2392 0.9729
+-3.237 0.7976 -0.224 0.2392 0.9833
+-3.151 0.7764 -0.1635 0.2392 0.9911
+-3.063 0.7547 -0.1024 0.2392 0.9965
+-2.973 0.7325 -0.04093 0.2392 0.9994
+-2.945 0.5713 0 0.1904 1
+-2.852 0.5533 0.0593 0.1904 0.9988
+-2.76 0.5354 0.1184 0.1904 0.995
+-2.67 0.518 0.177 0.1904 0.9888
+-2.583 0.5011 0.235 0.1904 0.9801
+-2.5 0.4849 0.2921 0.1904 0.9689
+-2.421 0.4696 0.3482 0.1904 0.9553
+-2.348 0.4554 0.4029 0.1904 0.9394
+-2.281 0.4424 0.4562 0.1904 0.9211
+-2.22 0.4307 0.5079 0.1904 0.9004
+-2.168 0.4205 0.5577 0.1904 0.8776
+-2.123 0.4119 0.6055 0.1904 0.8525
+-2.087 0.4049 0.6512 0.1904 0.8253
+-2.06 0.3996 0.6946 0.1904 0.7961
+-2.043 0.3962 0.7355 0.1904 0.7648
+-2.034 0.3946 0.7739 0.1904 0.7317
+-2.036 0.3949 0.8097 0.1904 0.6967
+-2.047 0.397 0.8427 0.1904 0.66
+-2.067 0.4009 0.8729 0.1904 0.6216
+-2.097 0.4067 0.9002 0.1904 0.5817
+-2.136 0.4142 0.9246 0.1904 0.5403
+-2.183 0.4234 0.946 0.1904 0.4976
+-2.239 0.4343 0.9645 0.1904 0.4536
+-2.302 0.4465 0.9799 0.1904 0.4085
+-2.373 0.4602 0.9924 0.1904 0.3624
+-2.449 0.4751 1.002 0.1904 0.3153
+-2.532 0.4911 1.008 0.1904 0.2675
+-2.619 0.508 1.012 0.1904 0.219
+-2.71 0.5257 1.013 0.1904 0.17
+-2.805 0.544 1.011 0.1904 0.1205
+-2.901 0.5627 1.006 0.1904 0.07074
+-2.998 0.5816 0.9992 0.1904 0.02079
+-3.096 0.6005 0.9894 0.1904 -0.0292
+-3.193 0.6193 0.9772 0.1904 -0.07912
+-3.288 0.6378 0.9627 0.1904 -0.1288
+-3.38 0.6557 0.9459 0.1904 -0.1782
+-3.469 0.6729 0.9271 0.1904 -0.2272
+-3.553 0.6892 0.9062 0.1904 -0.2756
+-3.632 0.7045 0.8834 0.1904 -0.3233
+-3.704 0.7186 0.8589 0.1904 -0.3702
+-3.77 0.7313 0.8327 0.1904 -0.4161
+-3.828 0.7425 0.805 0.1904 -0.4611
+-3.878 0.7522 0.7759 0.1904 -0.5048
+-3.919 0.7602 0.7454 0.1904 -0.5474
+-3.951 0.7664 0.7138 0.1904 -0.5885
+-3.973 0.7707 0.681 0.1904 -0.6282
+-3.986 0.7732 0.6472 0.1904 -0.6663
+-3.989 0.7738 0.6126 0.1904 -0.7027
+-3.982 0.7724 0.5771 0.1904 -0.7374
+-3.965 0.7691 0.5409 0.1904 -0.7702
+-3.938 0.7639 0.504 0.1904 -0.8011
+-3.902 0.7569 0.4666 0.1904 -0.8301
+-3.857 0.7481 0.4286 0.1904 -0.8569
+-3.803 0.7376 0.3903 0.1904 -0.8816
+-3.74 0.7255 0.3515 0.1904 -0.9041
+-3.67 0.712 0.3124 0.1904 -0.9243
+-3.593 0.697 0.2731 0.1904 -0.9422
+-3.51 0.6809 0.2335 0.1904 -0.9578
+-3.422 0.6637 0.1937 0.1904 -0.971
+-3.328 0.6456 0.1538 0.1904 -0.9817
+-3.231 0.6268 0.1137 0.1904 -0.99
+-3.132 0.6075 0.07362 0.1904 -0.9958
+-3.03 0.5878 0.03344 0.1904 -0.9991
+-2.928 0.5679 -0.00676 0.1904 -1
+-2.826 0.5481 -0.04696 0.1904 -0.9983
+-2.725 0.5285 -0.08712 0.1904 -0.9941
+-2.626 0.5093 -0.1272 0.1904 -0.9875
+-2.53 0.4908 -0.1672 0.1904 -0.9784
+-2.438 0.473 -0.2071 0.1904 -0.9668
+-2.351 0.4561 -0.2468 0.1904 -0.9528
+-2.27 0.4403 -0.2863 0.1904 -0.9365
+-2.195 0.4259 -0.3256 0.1904 -0.9178
+-2.128 0.4128 -0.3646 0.1904 -0.8968
+-2.068 0.4012 -0.4032 0.1904 -0.8735
+-2.017 0.3913 -0.4414 0.1904 -0.8481
+-1.975 0.3831 -0.4792 0.1904 -0.8206
+-1.942 0.3767 -0.5165 0.1904 -0.791
+-1.918 0.3721 -0.5531 0.1904 -0.7594
+-1.905 0.3695 -0.5891 0.1904 -0.7259
+-1.901 0.3687 -0.6243 0.1904 -0.6907
+-1.907 0.37 -0.6587 0.1904 -0.6536
+-1.923 0.3731 -0.6921 0.1904 -0.615
+-1.949 0.378 -0.7245 0.1904 -0.5748
+-1.984 0.3849 -0.7558 0.1904 -0.5332
+-2.028 0.3934 -0.7858 0.1904 -0.4903
+-2.081 0.4036 -0.8145 0.1904 -0.4461
+-2.141 0.4154 -0.8417 0.1904 -0.4008
+-2.209 0.4286 -0.8674 0.1904 -0.3545
+-2.284 0.4431 -0.8913 0.1904 -0.3073
+-2.365 0.4587 -0.9134 0.1904 -0.2594
+-2.451 0.4753 -0.9336 0.1904 -0.2108
+-2.541 0.4928 -0.9518 0.1904 -0.1617
+-2.634 0.5109 -0.9678 0.1904 -0.1122
+-2.73 0.5295 -0.9816 0.1904 -0.06235
+-2.827 0.5484 -0.993 0.1904 -0.01239
+-2.925 0.5673 -1.002 0.1904 0.0376
+-3.022 0.5862 -1.008 0.1904 0.0875
+-3.118 0.6047 -1.012 0.1904 0.1372
+-3.211 0.6228 -1.013 0.1904 0.1865
+-3.301 0.6403 -1.011 0.1904 0.2354
+-3.387 0.6569 -1.007 0.1904 0.2837
+-3.467 0.6726 -0.999 0.1904 0.3312
+-3.542 0.6871 -0.9885 0.1904 0.378
+-3.61 0.7003 -0.975 0.1904 0.4238
+-3.671 0.7121 -0.9586 0.1904 0.4685
+-3.724 0.7224 -0.9391 0.1904 0.5121
+-3.769 0.731 -0.9167 0.1904 0.5544
+-3.804 0.738 -0.8913 0.1904 0.5953
+-3.831 0.7431 -0.863 0.1904 0.6347
+-3.848 0.7465 -0.8319 0.1904 0.6725
+-3.856 0.748 -0.798 0.1904 0.7087
+-3.854 0.7476 -0.7613 0.1904 0.743
+-3.843 0.7454 -0.722 0.1904 0.7756
+-3.822 0.7413 -0.6803 0.1904 0.8061
+-3.792 0.7355 -0.6361 0.1904 0.8347
+-3.753 0.728 -0.5897 0.1904 0.8612
+-3.706 0.7188 -0.5412 0.1904 0.8855
+-3.65 0.7081 -0.4907 0.1904 0.9076
+-3.588 0.6959 -0.4385 0.1904 0.9275
+-3.518 0.6825 -0.3847 0.1904 0.945
+-3.443 0.6679 -0.3295 0.1904 0.9602
+-3.363 0.6523 -0.273 0.1904 0.9729
+-3.278 0.6359 -0.2156 0.1904 0.9833
+-3.19 0.6187 -0.1574 0.1904 0.9911
+-3.099 0.6011 -0.09855 0.1904 0.9965
+-3.007 0.5832 -0.03937 0.1904 0.9994
+-2.97 0.4234 0 0.1411 1
+-2.875 0.4098 0.05692 0.1411 0.9988
+-2.781 0.3964 0.1136 0.1411 0.995
+-2.689 0.3833 0.17 0.1411 0.9888
+-2.599 0.3705 0.2257 0.1411 0.9801
+-2.514 0.3583 0.2807 0.1411 0.9689
+-2.433 0.3468 0.3347 0.1411 0.9553
+-2.358 0.3361 0.3876 0.1411 0.9394
+-2.289 0.3263 0.4392 0.1411 0.9211
+-2.227 0.3174 0.4893 0.1411 0.9004
+-2.173 0.3097 0.5377 0.1411 0.8776
+-2.127 0.3031 0.5844 0.1411 0.8525
+-2.089 0.2978 0.6292 0.1411 0.8253
+-2.061 0.2938 0.6718 0.1411 0.7961
+-2.042 0.2911 0.7123 0.1411 0.7648
+-2.033 0.2898 0.7505 0.1411 0.7317
+-2.033 0.2898 0.7863 0.1411 0.6967
+-2.043 0.2913 0.8195 0.1411 0.66
+-2.063 0.2941 0.8503 0.1411 0.6216
+-2.092 0.2983 0.8783 0.1411 0.5817
+-2.131 0.3038 0.9037 0.1411 0.5403
+-2.178 0.3105 0.9263 0.1411 0.4976
+-2.234 0.3184 0.9462 0.1411 0.4536
+-2.298 0.3275 0.9632 0.1411 0.4085
+-2.368 0.3376 0.9775 0.1411 0.3624
+-2.445 0.3486 0.9889 0.1411 0.3153
+-2.528 0.3604 0.9976 0.1411 0.2675
+-2.616 0.3729 1.004 0.1411 0.219
+-2.708 0.386 1.007 0.1411 0.17
+-2.803 0.3996 1.007 0.1411 0.1205
+-2.9 0.4135 1.005 0.1411 0.07074
+-2.999 0.4275 1 0.1411 0.02079
+-3.098 0.4416 0.9929 0.1411 -0.0292
+-3.196 0.4555 0.9832 0.1411 -0.07912
+-3.292 0.4692 0.9711 0.1411 -0.1288
+-3.385 0.4826 0.9567 0.1411 -0.1782
+-3.475 0.4954 0.9401 0.1411 -0.2272
+-3.561 0.5075 0.9214 0.1411 -0.2756
+-3.64 0.5189 0.9006 0.1411 -0.3233
+-3.714 0.5294 0.878 0.1411 -0.3702
+-3.781 0.539 0.8535 0.1411 -0.4161
+-3.84 0.5474 0.8273 0.1411 -0.4611
+-3.891 0.5547 0.7994 0.1411 -0.5048
+-3.933 0.5607 0.77 0.1411 -0.5474
+-3.966 0.5654 0.7392 0.1411 -0.5885
+-3.99 0.5687 0.707 0.1411 -0.6282
+-4.003 0.5707 0.6735 0.1411 -0.6663
+-4.007 0.5712 0.639 0.1411 -0.7027
+-4.001 0.5703 0.6033 0.1411 -0.7374
+-3.985 0.568 0.5667 0.1411 -0.7702
+-3.959 0.5643 0.5291 0.1411 -0.8011
+-3.923 0.5593 0.4908 0.1411 -0.8301
+-3.879 0.5529 0.4517 0.1411 -0.8569
+-3.825 0.5452 0.412 0.1411 -0.8816
+-3.763 0.5364 0.3716 0.1411 -0.9041
+-3.693 0.5265 0.3308 0.1411 -0.9243
+-3.617 0.5156 0.2895 0.1411 -0.9422
+-3.534 0.5037 0.2478 0.1411 -0.9578
+-3.446 0.4911 0.2058 0.1411 -0.971
+-3.353 0.4779 0.1635 0.1411 -0.9817
+-3.256 0.4641 0.121 0.1411 -0.99
+-3.156 0.4499 0.07835 0.1411 -0.9958
+-3.055 0.4355 0.0356 0.1411 -0.9991
+-2.953 0.4209 -0.007197 0.1411 -1
+-2.851 0.4064 -0.04998 0.1411 -0.9983
+-2.75 0.392 -0.09271 0.1411 -0.9941
+-2.651 0.3779 -0.1353 0.1411 -0.9875
+-2.556 0.3643 -0.1777 0.1411 -0.9784
+-2.464 0.3513 -0.2199 0.1411 -0.9668
+-2.378 0.3389 -0.2619 0.1411 -0.9528
+-2.297 0.3274 -0.3034 0.1411 -0.9365
+-2.222 0.3168 -0.3446 0.1411 -0.9178
+-2.155 0.3072 -0.3853 0.1411 -0.8968
+-2.096 0.2988 -0.4254 0.1411 -0.8735
+-2.045 0.2916 -0.4649 0.1411 -0.8481
+-2.004 0.2856 -0.5038 0.1411 -0.8206
+-1.971 0.281 -0.5419 0.1411 -0.791
+-1.949 0.2778 -0.5791 0.1411 -0.7594
+-1.936 0.2759 -0.6154 0.1411 -0.7259
+-1.933 0.2755 -0.6507 0.1411 -0.6907
+-1.94 0.2765 -0.6849 0.1411 -0.6536
+-1.957 0.279 -0.7179 0.1411 -0.615
+-1.984 0.2828 -0.7497 0.1411 -0.5748
+-2.02 0.2879 -0.78 0.1411 -0.5332
+-2.065 0.2944 -0.8089 0.1411 -0.4903
+-2.119 0.302 -0.8363 0.1411 -0.4461
+-2.181 0.3108 -0.8619 0.1411 -0.4008
+-2.25 0.3207 -0.8858 0.1411 -0.3545
+-2.326 0.3315 -0.9078 0.1411 -0.3073
+-2.408 0.3432 -0.9279 0.1411 -0.2594
+-2.495 0.3556 -0.9459 0.1411 -0.2108
+-2.586 0.3686 -0.9618 0.1411 -0.1617
+-2.68 0.3821 -0.9754 0.1411 -0.1122
+-2.777 0.3959 -0.9868 0.1411 -0.06235
+-2.875 0.4099 -0.9957 0.1411 -0.01239
+-2.974 0.424 -1.002 0.1411 0.0376
+-3.072 0.438 -1.006 0.1411 0.0875
+-3.169 0.4517 -1.007 0.1411 0.1372
+-3.263 0.4651 -1.006 0.1411 0.1865
+-3.354 0.4781 -1.002 0.1411 0.2354
+-3.44 0.4904 -0.995 0.1411 0.2837
+-3.521 0.5019 -0.9854 0.1411 0.3312
+-3.596 0.5126 -0.973 0.1411 0.378
+-3.665 0.5224 -0.9578 0.1411 0.4238
+-3.726 0.5311 -0.9398 0.1411 0.4685
+-3.779 0.5386 -0.919 0.1411 0.5121
+-3.823 0.5449 -0.8955 0.1411 0.5544
+-3.858 0.55 -0.8692 0.1411 0.5953
+-3.885 0.5537 -0.8402 0.1411 0.6347
+-3.901 0.5561 -0.8086 0.1411 0.6725
+-3.908 0.5571 -0.7745 0.1411 0.7087
+-3.905 0.5567 -0.7379 0.1411 0.743
+-3.893 0.5549 -0.6989 0.1411 0.7756
+-3.871 0.5517 -0.6577 0.1411 0.8061
+-3.839 0.5473 -0.6143 0.1411 0.8347
+-3.799 0.5415 -0.5689 0.1411 0.8612
+-3.75 0.5345 -0.5216 0.1411 0.8855
+-3.693 0.5264 -0.4726 0.1411 0.9076
+-3.629 0.5173 -0.422 0.1411 0.9275
+-3.557 0.5071 -0.37 0.1411 0.945
+-3.48 0.4961 -0.3167 0.1411 0.9602
+-3.398 0.4843 -0.2623 0.1411 0.9729
+-3.311 0.472 -0.207 0.1411 0.9833
+-3.221 0.4591 -0.1511 0.1411 0.9911
+-3.128 0.4458 -0.0946 0.1411 0.9965
+-3.033 0.4324 -0.03779 0.1411 0.9994
+-2.987 0.2744 0 0.09146 1
+-2.89 0.2655 0.0545 0.09146 0.9988
+-2.794 0.2567 0.1088 0.09146 0.995
+-2.7 0.248 0.1628 0.09146 0.9888
+-2.609 0.2396 0.2163 0.09146 0.9801
+-2.522 0.2316 0.2691 0.09146 0.9689
+-2.439 0.224 0.3211 0.09146 0.9553
+-2.362 0.217 0.372 0.09146 0.9394
+-2.292 0.2105 0.4219 0.09146 0.9211
+-2.228 0.2046 0.4704 0.09146 0.9004
+-2.172 0.1995 0.5174 0.09146 0.8776
+-2.125 0.1952 0.5629 0.09146 0.8525
+-2.086 0.1916 0.6067 0.09146 0.8253
+-2.057 0.1889 0.6487 0.09146 0.7961
+-2.037 0.1871 0.6887 0.09146 0.7648
+-2.026 0.1861 0.7266 0.09146 0.7317
+-2.026 0.1861 0.7624 0.09146 0.6967
+-2.035 0.1869 0.7959 0.09146 0.66
+-2.054 0.1887 0.8271 0.09146 0.6216
+-2.083 0.1913 0.8559 0.09146 0.5817
+-2.121 0.1948 0.8822 0.09146 0.5403
+-2.168 0.1992 0.906 0.09146 0.4976
+-2.224 0.2043 0.9273 0.09146 0.4536
+-2.287 0.2101 0.9459 0.09146 0.4085
+-2.358 0.2166 0.962 0.09146 0.3624
+-2.435 0.2237 0.9754 0.09146 0.3153
+-2.519 0.2313 0.9861 0.09146 0.2675
+-2.607 0.2394 0.9943 0.09146 0.219
+-2.699 0.2479 0.9998 0.09146 0.17
+-2.795 0.2567 1.003 0.09146 0.1205
+-2.893 0.2657 1.003 0.09146 0.07074
+-2.992 0.2748 1.001 0.09146 0.02079
+-3.091 0.2839 0.9959 0.09146 -0.0292
+-3.19 0.293 0.9886 0.09146 -0.07912
+-3.287 0.3019 0.9789 0.09146 -0.1288
+-3.381 0.3106 0.9669 0.09146 -0.1782
+-3.472 0.3189 0.9526 0.09146 -0.2272
+-3.558 0.3268 0.936 0.09146 -0.2756
+-3.639 0.3343 0.9173 0.09146 -0.3233
+-3.714 0.3411 0.8965 0.09146 -0.3702
+-3.782 0.3473 0.8737 0.09146 -0.4161
+-3.842 0.3529 0.849 0.09146 -0.4611
+-3.894 0.3576 0.8224 0.09146 -0.5048
+-3.937 0.3616 0.7941 0.09146 -0.5474
+-3.971 0.3647 0.7641 0.09146 -0.5885
+-3.995 0.367 0.7325 0.09146 -0.6282
+-4.01 0.3683 0.6994 0.09146 -0.6663
+-4.015 0.3687 0.665 0.09146 -0.7027
+-4.009 0.3682 0.6292 0.09146 -0.7374
+-3.994 0.3668 0.5921 0.09146 -0.7702
+-3.969 0.3645 0.5539 0.09146 -0.8011
+-3.934 0.3613 0.5147 0.09146 -0.8301
+-3.89 0.3573 0.4745 0.09146 -0.8569
+-3.837 0.3524 0.4334 0.09146 -0.8816
+-3.776 0.3468 0.3916 0.09146 -0.9041
+-3.707 0.3405 0.349 0.09146 -0.9243
+-3.631 0.3335 0.3057 0.09146 -0.9422
+-3.548 0.3259 0.262 0.09146 -0.9578
+-3.461 0.3178 0.2177 0.09146 -0.971
+-3.368 0.3094 0.1731 0.09146 -0.9817
+-3.272 0.3005 0.1282 0.09146 -0.99
+-3.173 0.2914 0.08303 0.09146 -0.9958
+-3.072 0.2822 0.03773 0.09146 -0.9991
+-2.97 0.2728 -0.007629 0.09146 -1
+-2.869 0.2635 -0.05298 0.09146 -0.9983
+-2.768 0.2543 -0.09823 0.09146 -0.9941
+-2.67 0.2453 -0.1433 0.09146 -0.9875
+-2.575 0.2365 -0.1882 0.09146 -0.9784
+-2.484 0.2282 -0.2327 0.09146 -0.9668
+-2.398 0.2203 -0.2767 0.09146 -0.9528
+-2.318 0.2129 -0.3203 0.09146 -0.9365
+-2.244 0.2061 -0.3634 0.09146 -0.9178
+-2.178 0.2 -0.4057 0.09146 -0.8968
+-2.119 0.1947 -0.4473 0.09146 -0.8735
+-2.069 0.1901 -0.4881 0.09146 -0.8481
+-2.028 0.1863 -0.528 0.09146 -0.8206
+-1.997 0.1834 -0.5669 0.09146 -0.791
+-1.975 0.1814 -0.6047 0.09146 -0.7594
+-1.963 0.1803 -0.6413 0.09146 -0.7259
+-1.961 0.1801 -0.6767 0.09146 -0.6907
+-1.969 0.1808 -0.7107 0.09146 -0.6536
+-1.987 0.1825 -0.7433 0.09146 -0.615
+-2.014 0.185 -0.7744 0.09146 -0.5748
+-2.051 0.1884 -0.8038 0.09146 -0.5332
+-2.098 0.1927 -0.8315 0.09146 -0.4903
+-2.152 0.1977 -0.8575 0.09146 -0.4461
+-2.215 0.2035 -0.8816 0.09146 -0.4008
+-2.285 0.2099 -0.9037 0.09146 -0.3545
+-2.362 0.217 -0.9238 0.09146 -0.3073
+-2.445 0.2246 -0.9418 0.09146 -0.2594
+-2.533 0.2326 -0.9576 0.09146 -0.2108
+-2.625 0.2411 -0.9712 0.09146 -0.1617
+-2.72 0.2499 -0.9824 0.09146 -0.1122
+-2.818 0.2588 -0.9913 0.09146 -0.06235
+-2.917 0.2679 -0.9977 0.09146 -0.01239
+-3.017 0.2771 -1.002 0.09146 0.0376
+-3.115 0.2862 -1.003 0.09146 0.0875
+-3.213 0.2951 -1.002 0.09146 0.1372
+-3.307 0.3038 -0.9982 0.09146 0.1865
+-3.398 0.3121 -0.9918 0.09146 0.2354
+-3.485 0.3201 -0.9828 0.09146 0.2837
+-3.566 0.3276 -0.9712 0.09146 0.3312
+-3.641 0.3345 -0.9569 0.09146 0.378
+-3.71 0.3407 -0.94 0.09146 0.4238
+-3.771 0.3463 -0.9204 0.09146 0.4685
+-3.823 0.3512 -0.8983 0.09146 0.5121
+-3.867 0.3552 -0.8736 0.09146 0.5544
+-3.902 0.3584 -0.8465 0.09146 0.5953
+-3.928 0.3608 -0.8169 0.09146 0.6347
+-3.944 0.3622 -0.7849 0.09146 0.6725
+-3.95 0.3628 -0.7506 0.09146 0.7087
+-3.946 0.3625 -0.7141 0.09146 0.743
+-3.933 0.3612 -0.6754 0.09146 0.7756
+-3.909 0.3591 -0.6348 0.09146 0.8061
+-3.877 0.3561 -0.5922 0.09146 0.8347
+-3.835 0.3523 -0.5478 0.09146 0.8612
+-3.785 0.3476 -0.5018 0.09146 0.8855
+-3.726 0.3423 -0.4542 0.09146 0.9076
+-3.66 0.3362 -0.4052 0.09146 0.9275
+-3.587 0.3295 -0.355 0.09146 0.945
+-3.508 0.3222 -0.3037 0.09146 0.9602
+-3.424 0.3145 -0.2514 0.09146 0.9729
+-3.335 0.3064 -0.1984 0.09146 0.9833
+-3.243 0.2979 -0.1447 0.09146 0.9911
+-3.148 0.2892 -0.09058 0.09146 0.9965
+-3.052 0.2803 -0.03618 0.09146 0.9994
+-2.997 0.1247 0 0.04158 1
+-2.899 0.1206 0.05204 0.04158 0.9988
+-2.801 0.1166 0.1039 0.04158 0.995
+-2.705 0.1126 0.1556 0.04158 0.9888
+-2.613 0.1087 0.2067 0.04158 0.9801
+-2.524 0.105 0.2573 0.04158 0.9689
+-2.44 0.1015 0.3072 0.04158 0.9553
+-2.361 0.09826 0.3562 0.04158 0.9394
+-2.289 0.09526 0.4043 0.04158 0.9211
+-2.224 0.09255 0.4512 0.04158 0.9004
+-2.167 0.09018 0.4968 0.04158 0.8776
+-2.118 0.08814 0.5411 0.04158 0.8525
+-2.078 0.08648 0.5839 0.04158 0.8253
+-2.047 0.08521 0.6251 0.04158 0.7961
+-2.026 0.08433 0.6646 0.04158 0.7648
+-2.015 0.08386 0.7022 0.04158 0.7317
+-2.014 0.08381 0.738 0.04158 0.6967
+-2.022 0.08417 0.7717 0.04158 0.66
+-2.041 0.08493 0.8034 0.04158 0.6216
+-2.069 0.08611 0.8329 0.04158 0.5817
+-2.107 0.08767 0.8602 0.04158 0.5403
+-2.153 0.08961 0.8852 0.04158 0.4976
+-2.208 0.0919 0.9078 0.04158 0.4536
+-2.271 0.09453 0.9281 0.04158 0.4085
+-2.342 0.09747 0.9459 0.04158 0.3624
+-2.419 0.1007 0.9612 0.04158 0.3153
+-2.502 0.1041 0.9741 0.04158 0.2675
+-2.591 0.1078 0.9844 0.04158 0.219
+-2.683 0.1117 0.9922 0.04158 0.17
+-2.779 0.1157 0.9975 0.04158 0.1205
+-2.877 0.1197 1 0.04158 0.07074
+-2.977 0.1239 1 0.04158 0.02079
+-3.076 0.128 0.9981 0.04158 -0.0292
+-3.176 0.1322 0.9934 0.04158 -0.07912
+-3.273 0.1362 0.9861 0.04158 -0.1288
+-3.368 0.1402 0.9765 0.04158 -0.1782
+-3.46 0.144 0.9644 0.04158 -0.2272
+-3.547 0.1476 0.95 0.04158 -0.2756
+-3.628 0.151 0.9334 0.04158 -0.3233
+-3.704 0.1541 0.9145 0.04158 -0.3702
+-3.772 0.157 0.8934 0.04158 -0.4161
+-3.833 0.1595 0.8702 0.04158 -0.4611
+-3.886 0.1617 0.8449 0.04158 -0.5048
+-3.93 0.1636 0.8177 0.04158 -0.5474
+-3.965 0.165 0.7885 0.04158 -0.5885
+-3.99 0.1661 0.7576 0.04158 -0.6282
+-4.006 0.1667 0.7249 0.04158 -0.6663
+-4.011 0.1669 0.6905 0.04158 -0.7027
+-4.007 0.1667 0.6546 0.04158 -0.7374
+-3.992 0.1661 0.6172 0.04158 -0.7702
+-3.968 0.1651 0.5784 0.04158 -0.8011
+-3.934 0.1637 0.5383 0.04158 -0.8301
+-3.891 0.1619 0.497 0.04158 -0.8569
+-3.839 0.1597 0.4546 0.04158 -0.8816
+-3.778 0.1572 0.4112 0.04158 -0.9041
+-3.71 0.1544 0.3669 0.04158 -0.9243
+-3.635 0.1513 0.3218 0.04158 -0.9422
+-3.553 0.1479 0.276 0.04158 -0.9578
+-3.466 0.1443 0.2295 0.04158 -0.971
+-3.375 0.1404 0.1826 0.04158 -0.9817
+-3.279 0.1365 0.1353 0.04158 -0.99
+-3.181 0.1324 0.08766 0.04158 -0.9958
+-3.081 0.1282 0.03984 0.04158 -0.9991
+-2.98 0.124 -0.008056 0.04158 -1
+-2.88 0.1198 -0.05594 0.04158 -0.9983
+-2.78 0.1157 -0.1037 0.04158 -0.9941
+-2.683 0.1117 -0.1512 0.04158 -0.9875
+-2.589 0.1077 -0.1984 0.04158 -0.9784
+-2.499 0.104 -0.2452 0.04158 -0.9668
+-2.413 0.1004 -0.2914 0.04158 -0.9528
+-2.334 0.09713 -0.337 0.04158 -0.9365
+-2.261 0.09409 -0.3819 0.04158 -0.9178
+-2.195 0.09137 -0.4259 0.04158 -0.8968
+-2.138 0.08897 -0.469 0.04158 -0.8735
+-2.089 0.08692 -0.511 0.04158 -0.8481
+-2.049 0.08525 -0.5519 0.04158 -0.8206
+-2.018 0.08397 -0.5916 0.04158 -0.791
+-1.997 0.0831 -0.6299 0.04158 -0.7594
+-1.986 0.08264 -0.6669 0.04158 -0.7259
+-1.985 0.08259 -0.7023 0.04158 -0.6907
+-1.993 0.08296 -0.7361 0.04158 -0.6536
+-2.012 0.08374 -0.7682 0.04158 -0.615
+-2.041 0.08493 -0.7985 0.04158 -0.5748
+-2.079 0.08651 -0.827 0.04158 -0.5332
+-2.126 0.08846 -0.8536 0.04158 -0.4903
+-2.181 0.09077 -0.8782 0.04158 -0.4461
+-2.245 0.09342 -0.9007 0.04158 -0.4008
+-2.316 0.09637 -0.9211 0.04158 -0.3545
+-2.393 0.0996 -0.9392 0.04158 -0.3073
+-2.477 0.1031 -0.9551 0.04158 -0.2594
+-2.565 0.1068 -0.9687 0.04158 -0.2108
+-2.658 0.1106 -0.98 0.04158 -0.1617
+-2.754 0.1146 -0.9888 0.04158 -0.1122
+-2.852 0.1187 -0.9953 0.04158 -0.06235
+-2.952 0.1228 -0.9992 0.04158 -0.01239
+-3.052 0.127 -1.001 0.04158 0.0376
+-3.151 0.1311 -0.9996 0.04158 0.0875
+-3.248 0.1352 -0.996 0.04158 0.1372
+-3.343 0.1391 -0.9899 0.04158 0.1865
+-3.434 0.1429 -0.9812 0.04158 0.2354
+-3.521 0.1465 -0.97 0.04158 0.2837
+-3.602 0.1499 -0.9563 0.04158 0.3312
+-3.677 0.153 -0.9402 0.04158 0.378
+-3.745 0.1559 -0.9215 0.04158 0.4238
+-3.806 0.1584 -0.9005 0.04158 0.4685
+-3.858 0.1606 -0.877 0.04158 0.5121
+-3.902 0.1624 -0.8513 0.04158 0.5544
+-3.936 0.1638 -0.8232 0.04158 0.5953
+-3.961 0.1649 -0.793 0.04158 0.6347
+-3.976 0.1655 -0.7606 0.04158 0.6725
+-3.982 0.1657 -0.7262 0.04158 0.7087
+-3.977 0.1655 -0.6898 0.04158 0.743
+-3.962 0.1649 -0.6515 0.04158 0.7756
+-3.938 0.1639 -0.6114 0.04158 0.8061
+-3.904 0.1625 -0.5697 0.04158 0.8347
+-3.861 0.1607 -0.5264 0.04158 0.8612
+-3.81 0.1585 -0.4816 0.04158 0.8855
+-3.75 0.1561 -0.4355 0.04158 0.9076
+-3.682 0.1532 -0.3882 0.04158 0.9275
+-3.608 0.1502 -0.3398 0.04158 0.945
+-3.528 0.1468 -0.2905 0.04158 0.9602
+-3.442 0.1432 -0.2404 0.04158 0.9729
+-3.351 0.1395 -0.1896 0.04158 0.9833
+-3.258 0.1356 -0.1382 0.04158 0.9911
+-3.161 0.1316 -0.08652 0.04158 0.9965
+-3.063 0.1275 -0.03455 0.04158 0.9994
+-3 -0.02522 0 -0.008407 1
+-2.9 -0.02438 0.04956 -0.008407 0.9988
+-2.801 -0.02355 0.099 -0.008407 0.995
+-2.704 -0.02273 0.1482 -0.008407 0.9888
+-2.61 -0.02194 0.197 -0.008407 0.9801
+-2.519 -0.02118 0.2454 -0.008407 0.9689
+-2.434 -0.02046 0.2931 -0.008407 0.9553
+-2.354 -0.01979 0.3402 -0.008407 0.9394
+-2.281 -0.01918 0.3864 -0.008407 0.9211
+-2.215 -0.01862 0.4317 -0.008407 0.9004
+-2.156 -0.01813 0.4759 -0.008407 0.8776
+-2.107 -0.01771 0.5189 -0.008407 0.8525
+-2.066 -0.01737 0.5607 -0.008407 0.8253
+-2.034 -0.0171 0.6011 -0.008407 0.7961
+-2.012 -0.01691 0.6401 -0.008407 0.7648
+-2 -0.01681 0.6774 -0.008407 0.7317
+-1.997 -0.01679 0.7131 -0.008407 0.6967
+-2.005 -0.01686 0.7471 -0.008407 0.66
+-2.023 -0.01701 0.7792 -0.008407 0.6216
+-2.05 -0.01724 0.8094 -0.008407 0.5817
+-2.087 -0.01755 0.8376 -0.008407 0.5403
+-2.133 -0.01793 0.8638 -0.008407 0.4976
+-2.188 -0.01839 0.8878 -0.008407 0.4536
+-2.25 -0.01892 0.9096 -0.008407 0.4085
+-2.321 -0.01951 0.9292 -0.008407 0.3624
+-2.397 -0.02016 0.9465 -0.008407 0.3153
+-2.48 -0.02085 0.9614 -0.008407 0.2675
+-2.568 -0.02159 0.9739 -0.008407 0.219
+-2.661 -0.02237 0.984 -0.008407 0.17
+-2.756 -0.02318 0.9917 -0.008407 0.1205
+-2.855 -0.024 0.9969 -0.008407 0.07074
+-2.954 -0.02484 0.9996 -0.008407 0.02079
+-3.054 -0.02568 0.9998 -0.008407 -0.0292
+-3.153 -0.02651 0.9975 -0.008407 -0.07912
+-3.251 -0.02734 0.9927 -0.008407 -0.1288
+-3.347 -0.02814 0.9855 -0.008407 -0.1782
+-3.438 -0.02891 0.9757 -0.008407 -0.2272
+-3.526 -0.02964 0.9635 -0.008407 -0.2756
+-3.608 -0.03033 0.9489 -0.008407 -0.3233
+-3.684 -0.03097 0.9318 -0.008407 -0.3702
+-3.753 -0.03155 0.9125 -0.008407 -0.4161
+-3.814 -0.03207 0.8908 -0.008407 -0.4611
+-3.868 -0.03252 0.8669 -0.008407 -0.5048
+-3.913 -0.03289 0.8407 -0.008407 -0.5474
+-3.948 -0.03319 0.8125 -0.008407 -0.5885
+-3.974 -0.03341 0.7822 -0.008407 -0.6282
+-3.99 -0.03355 0.7499 -0.008407 -0.6663
+-3.997 -0.0336 0.7157 -0.008407 -0.7027
+-3.993 -0.03357 0.6796 -0.008407 -0.7374
+-3.98 -0.03346 0.6419 -0.008407 -0.7702
+-3.956 -0.03326 0.6025 -0.008407 -0.8011
+-3.923 -0.03299 0.5616 -0.008407 -0.8301
+-3.881 -0.03263 0.5192 -0.008407 -0.8569
+-3.83 -0.0322 0.4755 -0.008407 -0.8816
+-3.771 -0.0317 0.4306 -0.008407 -0.9041
+-3.704 -0.03114 0.3846 -0.008407 -0.9243
+-3.63 -0.03052 0.3376 -0.008407 -0.9422
+-3.549 -0.02984 0.2898 -0.008407 -0.9578
+-3.463 -0.02912 0.2412 -0.008407 -0.971
+-3.373 -0.02836 0.192 -0.008407 -0.9817
+-3.279 -0.02757 0.1423 -0.008407 -0.99
+-3.182 -0.02675 0.09223 -0.008407 -0.9958
+-3.083 -0.02592 0.04193 -0.008407 -0.9991
+-2.983 -0.02508 -0.008478 -0.008407 -1
+-2.884 -0.02424 -0.05886 -0.008407 -0.9983
+-2.785 -0.02342 -0.1091 -0.008407 -0.9941
+-2.689 -0.02261 -0.1591 -0.008407 -0.9875
+-2.596 -0.02183 -0.2086 -0.008407 -0.9784
+-2.507 -0.02108 -0.2576 -0.008407 -0.9668
+-2.423 -0.02037 -0.306 -0.008407 -0.9528
+-2.344 -0.01971 -0.3535 -0.008407 -0.9365
+-2.273 -0.01911 -0.4002 -0.008407 -0.9178
+-2.208 -0.01856 -0.4459 -0.008407 -0.8968
+-2.152 -0.01809 -0.4904 -0.008407 -0.8735
+-2.103 -0.01768 -0.5336 -0.008407 -0.8481
+-2.064 -0.01736 -0.5755 -0.008407 -0.8206
+-2.035 -0.01711 -0.6159 -0.008407 -0.791
+-2.015 -0.01694 -0.6548 -0.008407 -0.7594
+-2.004 -0.01685 -0.692 -0.008407 -0.7259
+-2.004 -0.01685 -0.7274 -0.008407 -0.6907
+-2.014 -0.01693 -0.761 -0.008407 -0.6536
+-2.033 -0.0171 -0.7926 -0.008407 -0.615
+-2.063 -0.01734 -0.8222 -0.008407 -0.5748
+-2.101 -0.01767 -0.8498 -0.008407 -0.5332
+-2.149 -0.01807 -0.8752 -0.008407 -0.4903
+-2.205 -0.01854 -0.8983 -0.008407 -0.4461
+-2.269 -0.01908 -0.9192 -0.008407 -0.4008
+-2.341 -0.01968 -0.9378 -0.008407 -0.3545
+-2.419 -0.02034 -0.9541 -0.008407 -0.3073
+-2.503 -0.02104 -0.9679 -0.008407 -0.2594
+-2.592 -0.02179 -0.9793 -0.008407 -0.2108
+-2.685 -0.02257 -0.9882 -0.008407 -0.1617
+-2.781 -0.02338 -0.9946 -0.008407 -0.1122
+-2.88 -0.02421 -0.9986 -0.008407 -0.06235
+-2.979 -0.02505 -1 -0.008407 -0.01239
+-3.079 -0.02589 -0.999 -0.008407 0.0376
+-3.178 -0.02672 -0.9954 -0.008407 0.0875
+-3.276 -0.02754 -0.9894 -0.008407 0.1372
+-3.37 -0.02834 -0.9809 -0.008407 0.1865
+-3.461 -0.0291 -0.97 -0.008407 0.2354
+-3.548 -0.02983 -0.9566 -0.008407 0.2837
+-3.629 -0.03051 -0.9409 -0.008407 0.3312
+-3.704 -0.03114 -0.9229 -0.008407 0.378
+-3.771 -0.03171 -0.9025 -0.008407 0.4238
+-3.831 -0.03221 -0.88 -0.008407 0.4685
+-3.883 -0.03265 -0.8552 -0.008407 0.5121
+-3.926 -0.03301 -0.8284 -0.008407 0.5544
+-3.96 -0.03329 -0.7995 -0.008407 0.5953
+-3.984 -0.0335 -0.7686 -0.008407 0.6347
+-3.998 -0.03362 -0.7359 -0.008407 0.6725
+-4.003 -0.03365 -0.7013 -0.008407 0.7087
+-3.997 -0.03361 -0.6651 -0.008407 0.743
+-3.982 -0.03348 -0.6271 -0.008407 0.7756
+-3.956 -0.03326 -0.5877 -0.008407 0.8061
+-3.921 -0.03297 -0.5468 -0.008407 0.8347
+-3.877 -0.0326 -0.5046 -0.008407 0.8612
+-3.825 -0.03216 -0.4611 -0.008407 0.8855
+-3.764 -0.03164 -0.4166 -0.008407 0.9076
+-3.695 -0.03107 -0.371 -0.008407 0.9275
+-3.619 -0.03043 -0.3245 -0.008407 0.945
+-3.538 -0.02974 -0.2772 -0.008407 0.9602
+-3.45 -0.02901 -0.2292 -0.008407 0.9729
+-3.359 -0.02824 -0.1807 -0.008407 0.9833
+-3.264 -0.02744 -0.1317 -0.008407 0.9911
+-3.166 -0.02662 -0.08239 -0.008407 0.9965
+-3.066 -0.02578 -0.0329 -0.008407 0.9994
+-2.995 -0.1751 0 -0.05837 1
+-2.894 -0.1692 0.04704 -0.05837 0.9988
+-2.794 -0.1634 0.09399 -0.05837 0.995
+-2.696 -0.1576 0.1407 -0.05837 0.9888
+-2.601 -0.1521 0.1872 -0.05837 0.9801
+-2.509 -0.1467 0.2333 -0.05837 0.9689
+-2.423 -0.1417 0.2789 -0.05837 0.9553
+-2.342 -0.1369 0.3239 -0.05837 0.9394
+-2.268 -0.1326 0.3683 -0.05837 0.9211
+-2.201 -0.1287 0.4119 -0.05837 0.9004
+-2.141 -0.1252 0.4547 -0.05837 0.8776
+-2.09 -0.1222 0.4964 -0.05837 0.8525
+-2.048 -0.1198 0.5372 -0.05837 0.8253
+-2.016 -0.1179 0.5768 -0.05837 0.7961
+-1.993 -0.1165 0.6152 -0.05837 0.7648
+-1.98 -0.1158 0.6522 -0.05837 0.7317
+-1.977 -0.1156 0.6879 -0.05837 0.6967
+-1.983 -0.116 0.722 -0.05837 0.66
+-2 -0.117 0.7546 -0.05837 0.6216
+-2.027 -0.1185 0.7854 -0.05837 0.5817
+-2.063 -0.1206 0.8146 -0.05837 0.5403
+-2.108 -0.1233 0.8418 -0.05837 0.4976
+-2.162 -0.1264 0.8672 -0.05837 0.4536
+-2.224 -0.1301 0.8906 -0.05837 0.4085
+-2.294 -0.1341 0.9119 -0.05837 0.3624
+-2.37 -0.1386 0.9311 -0.05837 0.3153
+-2.452 -0.1434 0.9481 -0.05837 0.2675
+-2.54 -0.1485 0.9628 -0.05837 0.219
+-2.632 -0.1539 0.9752 -0.05837 0.17
+-2.727 -0.1595 0.9853 -0.05837 0.1205
+-2.825 -0.1652 0.9929 -0.05837 0.07074
+-2.924 -0.171 0.9981 -0.05837 0.02079
+-3.024 -0.1768 1.001 -0.05837 -0.0292
+-3.123 -0.1826 1.001 -0.05837 -0.07912
+-3.221 -0.1883 0.9987 -0.05837 -0.1288
+-3.316 -0.1939 0.9938 -0.05837 -0.1782
+-3.408 -0.1993 0.9864 -0.05837 -0.2272
+-3.496 -0.2044 0.9763 -0.05837 -0.2756
+-3.578 -0.2092 0.9638 -0.05837 -0.3233
+-3.654 -0.2137 0.9486 -0.05837 -0.3702
+-3.724 -0.2177 0.931 -0.05837 -0.4161
+-3.786 -0.2214 0.9109 -0.05837 -0.4611
+-3.839 -0.2245 0.8883 -0.05837 -0.5048
+-3.885 -0.2272 0.8633 -0.05837 -0.5474
+-3.921 -0.2293 0.8359 -0.05837 -0.5885
+-3.948 -0.2308 0.8063 -0.05837 -0.6282
+-3.965 -0.2318 0.7744 -0.05837 -0.6663
+-3.972 -0.2323 0.7404 -0.05837 -0.7027
+-3.969 -0.2321 0.7043 -0.05837 -0.7374
+-3.957 -0.2314 0.6662 -0.05837 -0.7702
+-3.934 -0.2301 0.6262 -0.05837 -0.8011
+-3.902 -0.2282 0.5845 -0.05837 -0.8301
+-3.861 -0.2258 0.5411 -0.05837 -0.8569
+-3.812 -0.2229 0.4961 -0.05837 -0.8816
+-3.754 -0.2195 0.4498 -0.05837 -0.9041
+-3.688 -0.2156 0.4021 -0.05837 -0.9243
+-3.615 -0.2114 0.3533 -0.05837 -0.9422
+-3.536 -0.2068 0.3034 -0.05837 -0.9578
+-3.452 -0.2018 0.2527 -0.05837 -0.971
+-3.362 -0.1966 0.2013 -0.05837 -0.9817
+-3.27 -0.1912 0.1492 -0.05837 -0.99
+-3.174 -0.1856 0.09674 -0.05837 -0.9958
+-3.077 -0.1799 0.04399 -0.05837 -0.9991
+-2.978 -0.1742 -0.008895 -0.05837 -1
+-2.88 -0.1684 -0.06175 -0.05837 -0.9983
+-2.783 -0.1628 -0.1144 -0.05837 -0.9941
+-2.689 -0.1572 -0.1668 -0.05837 -0.9875
+-2.597 -0.1519 -0.2186 -0.05837 -0.9784
+-2.509 -0.1467 -0.2699 -0.05837 -0.9668
+-2.427 -0.1419 -0.3203 -0.05837 -0.9528
+-2.35 -0.1374 -0.3698 -0.05837 -0.9365
+-2.279 -0.1333 -0.4183 -0.05837 -0.9178
+-2.216 -0.1296 -0.4655 -0.05837 -0.8968
+-2.16 -0.1263 -0.5114 -0.05837 -0.8735
+-2.114 -0.1236 -0.5559 -0.05837 -0.8481
+-2.076 -0.1214 -0.5987 -0.05837 -0.8206
+-2.047 -0.1197 -0.6399 -0.05837 -0.791
+-2.028 -0.1186 -0.6792 -0.05837 -0.7594
+-2.019 -0.118 -0.7166 -0.05837 -0.7259
+-2.019 -0.1181 -0.752 -0.05837 -0.6907
+-2.03 -0.1187 -0.7854 -0.05837 -0.6536
+-2.05 -0.1199 -0.8165 -0.05837 -0.615
+-2.08 -0.1216 -0.8454 -0.05837 -0.5748
+-2.119 -0.1239 -0.872 -0.05837 -0.5332
+-2.168 -0.1267 -0.8962 -0.05837 -0.4903
+-2.224 -0.1301 -0.9179 -0.05837 -0.4461
+-2.289 -0.1338 -0.9372 -0.05837 -0.4008
+-2.361 -0.138 -0.954 -0.05837 -0.3545
+-2.439 -0.1426 -0.9683 -0.05837 -0.3073
+-2.523 -0.1475 -0.98 -0.05837 -0.2594
+-2.612 -0.1527 -0.9891 -0.05837 -0.2108
+-2.705 -0.1582 -0.9957 -0.05837 -0.1617
+-2.801 -0.1638 -0.9998 -0.05837 -0.1122
+-2.9 -0.1696 -1.001 -0.05837 -0.06235
+-2.999 -0.1754 -1 -0.05837 -0.01239
+-3.099 -0.1812 -0.9967 -0.05837 0.0376
+-3.198 -0.187 -0.9906 -0.05837 0.0875
+-3.295 -0.1927 -0.9822 -0.05837 0.1372
+-3.389 -0.1982 -0.9713 -0.05837 0.1865
+-3.48 -0.2035 -0.9581 -0.05837 0.2354
+-3.566 -0.2085 -0.9426 -0.05837 0.2837
+-3.646 -0.2132 -0.9249 -0.05837 0.3312
+-3.72 -0.2175 -0.905 -0.05837 0.378
+-3.787 -0.2215 -0.883 -0.05837 0.4238
+-3.847 -0.2249 -0.8589 -0.05837 0.4685
+-3.898 -0.2279 -0.8329 -0.05837 0.5121
+-3.94 -0.2304 -0.805 -0.05837 0.5544
+-3.973 -0.2323 -0.7752 -0.05837 0.5953
+-3.996 -0.2337 -0.7438 -0.05837 0.6347
+-4.01 -0.2345 -0.7107 -0.05837 0.6725
+-4.013 -0.2347 -0.676 -0.05837 0.7087
+-4.007 -0.2343 -0.6399 -0.05837 0.743
+-3.99 -0.2333 -0.6024 -0.05837 0.7756
+-3.964 -0.2318 -0.5636 -0.05837 0.8061
+-3.928 -0.2297 -0.5236 -0.05837 0.8347
+-3.883 -0.2271 -0.4825 -0.05837 0.8612
+-3.83 -0.2239 -0.4404 -0.05837 0.8855
+-3.767 -0.2203 -0.3973 -0.05837 0.9076
+-3.698 -0.2162 -0.3535 -0.05837 0.9275
+-3.621 -0.2117 -0.3089 -0.05837 0.945
+-3.538 -0.2069 -0.2636 -0.05837 0.9602
+-3.45 -0.2018 -0.2178 -0.05837 0.9729
+-3.358 -0.1963 -0.1716 -0.05837 0.9833
+-3.261 -0.1907 -0.125 -0.05837 0.9911
+-3.163 -0.1849 -0.07822 -0.05837 0.9965
+-3.062 -0.179 -0.03123 -0.05837 0.9994
+-2.982 -0.3246 0 -0.1082 1
+-2.881 -0.3135 0.0445 -0.1082 0.9988
+-2.78 -0.3025 0.08892 -0.1082 0.995
+-2.681 -0.2918 0.1332 -0.1082 0.9888
+-2.585 -0.2813 0.1773 -0.1082 0.9801
+-2.493 -0.2713 0.2211 -0.1082 0.9689
+-2.406 -0.2619 0.2645 -0.1082 0.9553
+-2.324 -0.253 0.3075 -0.1082 0.9394
+-2.249 -0.2448 0.35 -0.1082 0.9211
+-2.181 -0.2374 0.3919 -0.1082 0.9004
+-2.121 -0.2309 0.4331 -0.1082 0.8776
+-2.07 -0.2252 0.4736 -0.1082 0.8525
+-2.027 -0.2206 0.5133 -0.1082 0.8253
+-1.993 -0.2169 0.5521 -0.1082 0.7961
+-1.969 -0.2143 0.5899 -0.1082 0.7648
+-1.955 -0.2128 0.6266 -0.1082 0.7317
+-1.952 -0.2124 0.6621 -0.1082 0.6967
+-1.958 -0.213 0.6965 -0.1082 0.66
+-1.973 -0.2148 0.7294 -0.1082 0.6216
+-1.999 -0.2176 0.761 -0.1082 0.5817
+-2.034 -0.2214 0.791 -0.1082 0.5403
+-2.079 -0.2262 0.8194 -0.1082 0.4976
+-2.132 -0.232 0.8461 -0.1082 0.4536
+-2.193 -0.2387 0.871 -0.1082 0.4085
+-2.262 -0.2461 0.8941 -0.1082 0.3624
+-2.337 -0.2544 0.9152 -0.1082 0.3153
+-2.419 -0.2632 0.9342 -0.1082 0.2675
+-2.506 -0.2727 0.9511 -0.1082 0.219
+-2.597 -0.2826 0.9659 -0.1082 0.17
+-2.691 -0.2929 0.9783 -0.1082 0.1205
+-2.789 -0.3035 0.9884 -0.1082 0.07074
+-2.887 -0.3142 0.9961 -0.1082 0.02079
+-2.986 -0.325 1.001 -0.1082 -0.0292
+-3.085 -0.3358 1.004 -0.1082 -0.07912
+-3.183 -0.3464 1.004 -0.1082 -0.1288
+-3.278 -0.3567 1.002 -0.1082 -0.1782
+-3.369 -0.3667 0.9964 -0.1082 -0.2272
+-3.457 -0.3762 0.9886 -0.1082 -0.2756
+-3.539 -0.3851 0.9781 -0.1082 -0.3233
+-3.615 -0.3934 0.9649 -0.1082 -0.3702
+-3.685 -0.401 0.949 -0.1082 -0.4161
+-3.747 -0.4078 0.9304 -0.1082 -0.4611
+-3.801 -0.4137 0.9092 -0.1082 -0.5048
+-3.847 -0.4187 0.8853 -0.1082 -0.5474
+-3.883 -0.4227 0.8589 -0.1082 -0.5885
+-3.911 -0.4256 0.8299 -0.1082 -0.6282
+-3.929 -0.4276 0.7984 -0.1082 -0.6663
+-3.937 -0.4284 0.7646 -0.1082 -0.7027
+-3.935 -0.4282 0.7284 -0.1082 -0.7374
+-3.923 -0.427 0.6901 -0.1082 -0.7702
+-3.902 -0.4247 0.6495 -0.1082 -0.8011
+-3.871 -0.4213 0.607 -0.1082 -0.8301
+-3.832 -0.417 0.5626 -0.1082 -0.8569
+-3.783 -0.4117 0.5164 -0.1082 -0.8816
+-3.726 -0.4056 0.4686 -0.1082 -0.9041
+-3.662 -0.3986 0.4193 -0.1082 -0.9243
+-3.591 -0.3908 0.3687 -0.1082 -0.9422
+-3.514 -0.3824 0.3169 -0.1082 -0.9578
+-3.431 -0.3734 0.2641 -0.1082 -0.971
+-3.343 -0.3639 0.2104 -0.1082 -0.9817
+-3.252 -0.3539 0.1561 -0.1082 -0.99
+-3.158 -0.3437 0.1012 -0.1082 -0.9958
+-3.063 -0.3333 0.04602 -0.1082 -0.9991
+-2.966 -0.3228 -0.009306 -0.1082 -1
+-2.87 -0.3123 -0.0646 -0.1082 -0.9983
+-2.775 -0.302 -0.1197 -0.1082 -0.9941
+-2.682 -0.2919 -0.1744 -0.1082 -0.9875
+-2.592 -0.2821 -0.2285 -0.1082 -0.9784
+-2.506 -0.2727 -0.2819 -0.1082 -0.9668
+-2.425 -0.2639 -0.3344 -0.1082 -0.9528
+-2.349 -0.2557 -0.3859 -0.1082 -0.9365
+-2.28 -0.2482 -0.4361 -0.1082 -0.9178
+-2.218 -0.2414 -0.4849 -0.1082 -0.8968
+-2.164 -0.2356 -0.5321 -0.1082 -0.8735
+-2.119 -0.2306 -0.5777 -0.1082 -0.8481
+-2.082 -0.2266 -0.6215 -0.1082 -0.8206
+-2.055 -0.2236 -0.6634 -0.1082 -0.791
+-2.037 -0.2216 -0.7032 -0.1082 -0.7594
+-2.028 -0.2207 -0.7409 -0.1082 -0.7259
+-2.03 -0.2209 -0.7762 -0.1082 -0.6907
+-2.041 -0.2221 -0.8093 -0.1082 -0.6536
+-2.062 -0.2244 -0.8399 -0.1082 -0.615
+-2.093 -0.2277 -0.868 -0.1082 -0.5748
+-2.132 -0.2321 -0.8936 -0.1082 -0.5332
+-2.181 -0.2374 -0.9166 -0.1082 -0.4903
+-2.238 -0.2436 -0.9369 -0.1082 -0.4461
+-2.303 -0.2506 -0.9546 -0.1082 -0.4008
+-2.375 -0.2584 -0.9696 -0.1082 -0.3545
+-2.453 -0.267 -0.9819 -0.1082 -0.3073
+-2.537 -0.2761 -0.9915 -0.1082 -0.2594
+-2.626 -0.2858 -0.9984 -0.1082 -0.2108
+-2.719 -0.2959 -1.003 -0.1082 -0.1617
+-2.815 -0.3063 -1.004 -0.1082 -0.1122
+-2.913 -0.317 -1.003 -0.1082 -0.06235
+-3.012 -0.3278 -0.9998 -0.1082 -0.01239
+-3.111 -0.3386 -0.9938 -0.1082 0.0376
+-3.209 -0.3493 -0.9853 -0.1082 0.0875
+-3.306 -0.3598 -0.9744 -0.1082 0.1372
+-3.399 -0.3699 -0.9612 -0.1082 0.1865
+-3.489 -0.3797 -0.9457 -0.1082 0.2354
+-3.574 -0.389 -0.928 -0.1082 0.2837
+-3.654 -0.3976 -0.9083 -0.1082 0.3312
+-3.727 -0.4056 -0.8865 -0.1082 0.378
+-3.793 -0.4128 -0.8628 -0.1082 0.4238
+-3.852 -0.4192 -0.8373 -0.1082 0.4685
+-3.902 -0.4247 -0.81 -0.1082 0.5121
+-3.943 -0.4292 -0.7811 -0.1082 0.5544
+-3.975 -0.4326 -0.7505 -0.1082 0.5953
+-3.998 -0.4351 -0.7185 -0.1082 0.6347
+-4.01 -0.4365 -0.6851 -0.1082 0.6725
+-4.013 -0.4368 -0.6503 -0.1082 0.7087
+-4.006 -0.436 -0.6144 -0.1082 0.743
+-3.988 -0.4341 -0.5773 -0.1082 0.7756
+-3.961 -0.4311 -0.5392 -0.1082 0.8061
+-3.925 -0.4271 -0.5001 -0.1082 0.8347
+-3.879 -0.4221 -0.4601 -0.1082 0.8612
+-3.824 -0.4162 -0.4193 -0.1082 0.8855
+-3.761 -0.4094 -0.3779 -0.1082 0.9076
+-3.691 -0.4017 -0.3358 -0.1082 0.9275
+-3.614 -0.3933 -0.2931 -0.1082 0.945
+-3.53 -0.3842 -0.2499 -0.1082 0.9602
+-3.441 -0.3745 -0.2064 -0.1082 0.9729
+-3.348 -0.3644 -0.1625 -0.1082 0.9833
+-3.251 -0.3538 -0.1183 -0.1082 0.9911
+-3.151 -0.343 -0.074 -0.1082 0.9965
+-3.05 -0.3319 -0.02954 -0.1082 0.9994
+-2.962 -0.4732 0 -0.1577 1
+-2.86 -0.4569 0.04192 -0.1577 0.9988
+-2.759 -0.4408 0.0838 -0.1577 0.995
+-2.66 -0.4249 0.1256 -0.1577 0.9888
+-2.564 -0.4095 0.1672 -0.1577 0.9801
+-2.471 -0.3948 0.2087 -0.1577 0.9689
+-2.384 -0.3808 0.2499 -0.1577 0.9553
+-2.301 -0.3677 0.2909 -0.1577 0.9394
+-2.226 -0.3556 0.3314 -0.1577 0.9211
+-2.157 -0.3446 0.3716 -0.1577 0.9004
+-2.097 -0.3349 0.4113 -0.1577 0.8776
+-2.044 -0.3266 0.4505 -0.1577 0.8525
+-2.001 -0.3196 0.4891 -0.1577 0.8253
+-1.967 -0.3142 0.5271 -0.1577 0.7961
+-1.942 -0.3102 0.5642 -0.1577 0.7648
+-1.927 -0.3079 0.6006 -0.1577 0.7317
+-1.922 -0.3071 0.636 -0.1577 0.6967
+-1.928 -0.3079 0.6705 -0.1577 0.66
+-1.943 -0.3103 0.7038 -0.1577 0.6216
+-1.967 -0.3143 0.736 -0.1577 0.5817
+-2.002 -0.3197 0.7669 -0.1577 0.5403
+-2.045 -0.3267 0.7964 -0.1577 0.4976
+-2.097 -0.335 0.8244 -0.1577 0.4536
+-2.157 -0.3446 0.8509 -0.1577 0.4085
+-2.225 -0.3554 0.8757 -0.1577 0.3624
+-2.299 -0.3673 0.8987 -0.1577 0.3153
+-2.38 -0.3801 0.9198 -0.1577 0.2675
+-2.465 -0.3939 0.9388 -0.1577 0.219
+-2.556 -0.4083 0.9559 -0.1577 0.17
+-2.649 -0.4232 0.9707 -0.1577 0.1205
+-2.746 -0.4386 0.9832 -0.1577 0.07074
+-2.843 -0.4542 0.9934 -0.1577 0.02079
+-2.942 -0.4699 1.001 -0.1577 -0.0292
+-3.04 -0.4856 1.006 -0.1577 -0.07912
+-3.137 -0.501 1.009 -0.1577 -0.1288
+-3.231 -0.5161 1.009 -0.1577 -0.1782
+-3.322 -0.5307 1.006 -0.1577 -0.2272
+-3.409 -0.5446 1 -0.1577 -0.2756
+-3.491 -0.5576 0.9917 -0.1577 -0.3233
+-3.567 -0.5698 0.9805 -0.1577 -0.3702
+-3.636 -0.5809 0.9663 -0.1577 -0.4161
+-3.699 -0.5908 0.9493 -0.1577 -0.4611
+-3.753 -0.5995 0.9295 -0.1577 -0.5048
+-3.799 -0.6069 0.9068 -0.1577 -0.5474
+-3.836 -0.6128 0.8813 -0.1577 -0.5885
+-3.864 -0.6172 0.853 -0.1577 -0.6282
+-3.882 -0.6202 0.822 -0.1577 -0.6663
+-3.891 -0.6216 0.7884 -0.1577 -0.7027
+-3.89 -0.6215 0.7522 -0.1577 -0.7374
+-3.88 -0.6198 0.7135 -0.1577 -0.7702
+-3.86 -0.6166 0.6725 -0.1577 -0.8011
+-3.83 -0.6119 0.6292 -0.1577 -0.8301
+-3.792 -0.6057 0.5838 -0.1577 -0.8569
+-3.745 -0.5982 0.5364 -0.1577 -0.8816
+-3.69 -0.5894 0.4872 -0.1577 -0.9041
+-3.627 -0.5794 0.4363 -0.1577 -0.9243
+-3.558 -0.5683 0.3839 -0.1577 -0.9422
+-3.482 -0.5562 0.3301 -0.1577 -0.9578
+-3.401 -0.5433 0.2753 -0.1577 -0.971
+-3.316 -0.5297 0.2194 -0.1577 -0.9817
+-3.226 -0.5154 0.1628 -0.1577 -0.99
+-3.135 -0.5007 0.1056 -0.1577 -0.9958
+-3.041 -0.4858 0.04802 -0.1577 -0.9991
+-2.947 -0.4707 -0.009711 -0.1577 -1
+-2.852 -0.4556 -0.06741 -0.1577 -0.9983
+-2.759 -0.4408 -0.1249 -0.1577 -0.9941
+-2.668 -0.4262 -0.1819 -0.1577 -0.9875
+-2.58 -0.4122 -0.2383 -0.1577 -0.9784
+-2.496 -0.3987 -0.2938 -0.1577 -0.9668
+-2.417 -0.3861 -0.3484 -0.1577 -0.9528
+-2.343 -0.3743 -0.4017 -0.1577 -0.9365
+-2.276 -0.3636 -0.4536 -0.1577 -0.9178
+-2.216 -0.354 -0.5039 -0.1577 -0.8968
+-2.163 -0.3456 -0.5525 -0.1577 -0.8735
+-2.119 -0.3385 -0.5993 -0.1577 -0.8481
+-2.084 -0.3329 -0.644 -0.1577 -0.8206
+-2.057 -0.3287 -0.6865 -0.1577 -0.791
+-2.041 -0.326 -0.7268 -0.1577 -0.7594
+-2.033 -0.3248 -0.7646 -0.1577 -0.7259
+-2.036 -0.3252 -0.8 -0.1577 -0.6907
+-2.048 -0.3271 -0.8327 -0.1577 -0.6536
+-2.069 -0.3306 -0.8628 -0.1577 -0.615
+-2.1 -0.3355 -0.8901 -0.1577 -0.5748
+-2.14 -0.3419 -0.9147 -0.1577 -0.5332
+-2.189 -0.3497 -0.9365 -0.1577 -0.4903
+-2.246 -0.3588 -0.9554 -0.1577 -0.4461
+-2.311 -0.3692 -0.9714 -0.1577 -0.4008
+-2.383 -0.3807 -0.9846 -0.1577 -0.3545
+-2.461 -0.3931 -0.9949 -0.1577 -0.3073
+-2.545 -0.4065 -1.002 -0.1577 -0.2594
+-2.633 -0.4206 -1.007 -0.1577 -0.2108
+-2.725 -0.4354 -1.009 -0.1577 -0.1617
+-2.821 -0.4506 -1.008 -0.1577 -0.1122
+-2.918 -0.4661 -1.005 -0.1577 -0.06235
+-3.016 -0.4818 -0.9987 -0.1577 -0.01239
+-3.114 -0.4975 -0.9902 -0.1577 0.0376
+-3.212 -0.5131 -0.9792 -0.1577 0.0875
+-3.307 -0.5283 -0.9659 -0.1577 0.1372
+-3.4 -0.5431 -0.9504 -0.1577 0.1865
+-3.489 -0.5573 -0.9327 -0.1577 0.2354
+-3.573 -0.5708 -0.9129 -0.1577 0.2837
+-3.651 -0.5833 -0.8911 -0.1577 0.3312
+-3.724 -0.5948 -0.8675 -0.1577 0.378
+-3.789 -0.6053 -0.8422 -0.1577 0.4238
+-3.846 -0.6144 -0.8152 -0.1577 0.4685
+-3.896 -0.6223 -0.7866 -0.1577 0.5121
+-3.936 -0.6287 -0.7566 -0.1577 0.5544
+-3.967 -0.6337 -0.7253 -0.1577 0.5953
+-3.988 -0.6371 -0.6927 -0.1577 0.6347
+-4 -0.639 -0.659 -0.1577 0.6725
+-4.002 -0.6393 -0.6242 -0.1577 0.7087
+-3.994 -0.638 -0.5885 -0.1577 0.743
+-3.976 -0.6351 -0.5518 -0.1577 0.7756
+-3.948 -0.6306 -0.5144 -0.1577 0.8061
+-3.91 -0.6247 -0.4762 -0.1577 0.8347
+-3.864 -0.6172 -0.4374 -0.1577 0.8612
+-3.809 -0.6084 -0.398 -0.1577 0.8855
+-3.745 -0.5983 -0.3582 -0.1577 0.9076
+-3.674 -0.587 -0.3178 -0.1577 0.9275
+-3.596 -0.5745 -0.2771 -0.1577 0.945
+-3.512 -0.5611 -0.2361 -0.1577 0.9602
+-3.423 -0.5468 -0.1948 -0.1577 0.9729
+-3.329 -0.5318 -0.1532 -0.1577 0.9833
+-3.232 -0.5163 -0.1115 -0.1577 0.9911
+-3.132 -0.5003 -0.06973 -0.1577 0.9965
+-3.03 -0.4841 -0.02783 -0.1577 0.9994
+-2.935 -0.6207 0 -0.2069 1
+-2.833 -0.5991 0.03932 -0.2069 0.9988
+-2.732 -0.5777 0.07863 -0.2069 0.995
+-2.632 -0.5567 0.1179 -0.2069 0.9888
+-2.536 -0.5363 0.1571 -0.2069 0.9801
+-2.443 -0.5167 0.1962 -0.2069 0.9689
+-2.356 -0.4982 0.2352 -0.2069 0.9553
+-2.273 -0.4808 0.274 -0.2069 0.9394
+-2.197 -0.4647 0.3127 -0.2069 0.9211
+-2.129 -0.4502 0.3511 -0.2069 0.9004
+-2.067 -0.4372 0.3893 -0.2069 0.8776
+-2.015 -0.4261 0.4272 -0.2069 0.8525
+-1.971 -0.4168 0.4646 -0.2069 0.8253
+-1.936 -0.4094 0.5017 -0.2069 0.7961
+-1.911 -0.4041 0.5382 -0.2069 0.7648
+-1.895 -0.4008 0.5742 -0.2069 0.7317
+-1.889 -0.3996 0.6095 -0.2069 0.6967
+-1.894 -0.4005 0.6441 -0.2069 0.66
+-1.908 -0.4034 0.6778 -0.2069 0.6216
+-1.932 -0.4085 0.7106 -0.2069 0.5817
+-1.965 -0.4155 0.7423 -0.2069 0.5403
+-2.007 -0.4244 0.7729 -0.2069 0.4976
+-2.058 -0.4352 0.8023 -0.2069 0.4536
+-2.117 -0.4476 0.8302 -0.2069 0.4085
+-2.183 -0.4617 0.8567 -0.2069 0.3624
+-2.256 -0.4771 0.8816 -0.2069 0.3153
+-2.335 -0.4939 0.9047 -0.2069 0.2675
+-2.42 -0.5118 0.926 -0.2069 0.219
+-2.509 -0.5306 0.9453 -0.2069 0.17
+-2.601 -0.5501 0.9624 -0.2069 0.1205
+-2.696 -0.5702 0.9774 -0.2069 0.07074
+-2.793 -0.5906 0.99 -0.2069 0.02079
+-2.89 -0.6112 1 -0.2069 -0.0292
+-2.987 -0.6317 1.008 -0.2069 -0.07912
+-3.083 -0.6519 1.013 -0.2069 -0.1288
+-3.176 -0.6717 1.015 -0.2069 -0.1782
+-3.267 -0.6908 1.015 -0.2069 -0.2272
+-3.353 -0.709 1.011 -0.2069 -0.2756
+-3.434 -0.7262 1.005 -0.2069 -0.3233
+-3.51 -0.7422 0.9955 -0.2069 -0.3702
+-3.579 -0.7569 0.9831 -0.2069 -0.4161
+-3.641 -0.77 0.9677 -0.2069 -0.4611
+-3.695 -0.7815 0.9492 -0.2069 -0.5048
+-3.741 -0.7912 0.9277 -0.2069 -0.5474
+-3.779 -0.7991 0.9031 -0.2069 -0.5885
+-3.807 -0.8051 0.8755 -0.2069 -0.6282
+-3.826 -0.8091 0.845 -0.2069 -0.6663
+-3.836 -0.8112 0.8116 -0.2069 -0.7027
+-3.836 -0.8112 0.7754 -0.2069 -0.7374
+-3.826 -0.8091 0.7365 -0.2069 -0.7702
+-3.807 -0.8052 0.695 -0.2069 -0.8011
+-3.779 -0.7992 0.651 -0.2069 -0.8301
+-3.742 -0.7914 0.6046 -0.2069 -0.8569
+-3.697 -0.7818 0.556 -0.2069 -0.8816
+-3.644 -0.7705 0.5054 -0.2069 -0.9041
+-3.583 -0.7577 0.453 -0.2069 -0.9243
+-3.515 -0.7434 0.3988 -0.2069 -0.9422
+-3.442 -0.7278 0.3432 -0.2069 -0.9578
+-3.363 -0.7112 0.2863 -0.2069 -0.971
+-3.28 -0.6935 0.2283 -0.2069 -0.9817
+-3.193 -0.6752 0.1694 -0.2069 -0.99
+-3.103 -0.6562 0.1099 -0.2069 -0.9958
+-3.012 -0.6369 0.05 -0.2069 -0.9991
+-2.92 -0.6174 -0.01011 -0.2069 -1
+-2.828 -0.598 -0.07018 -0.2069 -0.9983
+-2.737 -0.5788 -0.13 -0.2069 -0.9941
+-2.648 -0.56 -0.1893 -0.2069 -0.9875
+-2.562 -0.5418 -0.2479 -0.2069 -0.9784
+-2.48 -0.5245 -0.3056 -0.2069 -0.9668
+-2.403 -0.5082 -0.3621 -0.2069 -0.9528
+-2.331 -0.4931 -0.4172 -0.2069 -0.9365
+-2.266 -0.4792 -0.4708 -0.2069 -0.9178
+-2.208 -0.4669 -0.5227 -0.2069 -0.8968
+-2.157 -0.4562 -0.5726 -0.2069 -0.8735
+-2.115 -0.4472 -0.6204 -0.2069 -0.8481
+-2.081 -0.44 -0.666 -0.2069 -0.8206
+-2.056 -0.4347 -0.7092 -0.2069 -0.791
+-2.04 -0.4314 -0.7499 -0.2069 -0.7594
+-2.033 -0.43 -0.7879 -0.2069 -0.7259
+-2.037 -0.4307 -0.8232 -0.2069 -0.6907
+-2.049 -0.4334 -0.8556 -0.2069 -0.6536
+-2.072 -0.4381 -0.8851 -0.2069 -0.615
+-2.103 -0.4447 -0.9117 -0.2069 -0.5748
+-2.143 -0.4533 -0.9352 -0.2069 -0.5332
+-2.192 -0.4636 -0.9557 -0.2069 -0.4903
+-2.249 -0.4757 -0.9732 -0.2069 -0.4461
+-2.314 -0.4893 -0.9876 -0.2069 -0.4008
+-2.385 -0.5044 -0.9989 -0.2069 -0.3545
+-2.463 -0.5208 -1.007 -0.2069 -0.3073
+-2.546 -0.5384 -1.013 -0.2069 -0.2594
+-2.634 -0.5569 -1.015 -0.2069 -0.2108
+-2.725 -0.5763 -1.015 -0.2069 -0.1617
+-2.819 -0.5962 -1.011 -0.2069 -0.1122
+-2.916 -0.6166 -1.006 -0.2069 -0.06235
+-3.013 -0.6371 -0.9971 -0.2069 -0.01239
+-3.11 -0.6577 -0.9861 -0.2069 0.0376
+-3.206 -0.678 -0.9726 -0.2069 0.0875
+-3.3 -0.6979 -0.9569 -0.2069 0.1372
+-3.392 -0.7173 -0.939 -0.2069 0.1865
+-3.479 -0.7358 -0.919 -0.2069 0.2354
+-3.562 -0.7533 -0.8971 -0.2069 0.2837
+-3.639 -0.7696 -0.8734 -0.2069 0.3312
+-3.71 -0.7847 -0.848 -0.2069 0.378
+-3.774 -0.7982 -0.821 -0.2069 0.4238
+-3.831 -0.8101 -0.7926 -0.2069 0.4685
+-3.878 -0.8202 -0.7628 -0.2069 0.5121
+-3.918 -0.8285 -0.7318 -0.2069 0.5544
+-3.948 -0.8349 -0.6997 -0.2069 0.5953
+-3.968 -0.8392 -0.6665 -0.2069 0.6347
+-3.979 -0.8415 -0.6325 -0.2069 0.6725
+-3.98 -0.8417 -0.5977 -0.2069 0.7087
+-3.971 -0.8398 -0.5622 -0.2069 0.743
+-3.952 -0.8358 -0.526 -0.2069 0.7756
+-3.924 -0.8298 -0.4893 -0.2069 0.8061
+-3.886 -0.8217 -0.4521 -0.2069 0.8347
+-3.839 -0.8118 -0.4145 -0.2069 0.8612
+-3.783 -0.8 -0.3765 -0.2069 0.8855
+-3.719 -0.7865 -0.3382 -0.2069 0.9076
+-3.648 -0.7715 -0.2997 -0.2069 0.9275
+-3.57 -0.7549 -0.261 -0.2069 0.945
+-3.486 -0.7371 -0.2221 -0.2069 0.9602
+-3.396 -0.7182 -0.1831 -0.2069 0.9729
+-3.302 -0.6983 -0.1439 -0.2069 0.9833
+-3.205 -0.6777 -0.1047 -0.2069 0.9911
+-3.105 -0.6566 -0.06541 -0.2069 0.9965
+-3.003 -0.6351 -0.0261 -0.2069 0.9994
+-2.9 -0.7666 0 -0.2555 1
+-2.798 -0.7397 0.0367 -0.2555 0.9988
+-2.697 -0.713 0.0734 -0.2555 0.995
+-2.598 -0.6868 0.1101 -0.2555 0.9888
+-2.502 -0.6614 0.1468 -0.2555 0.9801
+-2.41 -0.637 0.1836 -0.2555 0.9689
+-2.322 -0.6138 0.2203 -0.2555 0.9553
+-2.24 -0.5921 0.257 -0.2555 0.9394
+-2.164 -0.572 0.2937 -0.2555 0.9211
+-2.095 -0.5538 0.3304 -0.2555 0.9004
+-2.034 -0.5376 0.367 -0.2555 0.8776
+-1.981 -0.5236 0.4035 -0.2555 0.8525
+-1.936 -0.5118 0.4398 -0.2555 0.8253
+-1.901 -0.5025 0.476 -0.2555 0.7961
+-1.875 -0.4957 0.5119 -0.2555 0.7648
+-1.859 -0.4914 0.5474 -0.2555 0.7317
+-1.853 -0.4897 0.5826 -0.2555 0.6967
+-1.856 -0.4906 0.6172 -0.2555 0.66
+-1.869 -0.494 0.6513 -0.2555 0.6216
+-1.892 -0.5 0.6847 -0.2555 0.5817
+-1.924 -0.5085 0.7173 -0.2555 0.5403
+-1.965 -0.5193 0.749 -0.2555 0.4976
+-2.014 -0.5324 0.7796 -0.2555 0.4536
+-2.072 -0.5476 0.8091 -0.2555 0.4085
+-2.137 -0.5648 0.8372 -0.2555 0.3624
+-2.208 -0.5837 0.864 -0.2555 0.3153
+-2.286 -0.6043 0.8891 -0.2555 0.2675
+-2.369 -0.6262 0.9125 -0.2555 0.219
+-2.456 -0.6493 0.9341 -0.2555 0.17
+-2.547 -0.6733 0.9536 -0.2555 0.1205
+-2.641 -0.698 0.971 -0.2555 0.07074
+-2.736 -0.7232 0.9861 -0.2555 0.02079
+-2.832 -0.7485 0.9988 -0.2555 -0.0292
+-2.927 -0.7738 1.009 -0.2555 -0.07912
+-3.022 -0.7987 1.016 -0.2555 -0.1288
+-3.114 -0.8231 1.021 -0.2555 -0.1782
+-3.203 -0.8467 1.023 -0.2555 -0.2272
+-3.289 -0.8692 1.022 -0.2555 -0.2756
+-3.369 -0.8905 1.017 -0.2555 -0.3233
+-3.444 -0.9103 1.01 -0.2555 -0.3702
+-3.513 -0.9285 0.9992 -0.2555 -0.4161
+-3.574 -0.9448 0.9854 -0.2555 -0.4611
+-3.628 -0.9591 0.9683 -0.2555 -0.5048
+-3.675 -0.9712 0.948 -0.2555 -0.5474
+-3.712 -0.9812 0.9244 -0.2555 -0.5885
+-3.741 -0.9887 0.8975 -0.2555 -0.6282
+-3.76 -0.9939 0.8675 -0.2555 -0.6663
+-3.77 -0.9966 0.8344 -0.2555 -0.7027
+-3.771 -0.9968 0.7982 -0.2555 -0.7374
+-3.763 -0.9946 0.759 -0.2555 -0.7702
+-3.745 -0.9899 0.717 -0.2555 -0.8011
+-3.719 -0.9829 0.6723 -0.2555 -0.8301
+-3.683 -0.9735 0.625 -0.2555 -0.8569
+-3.64 -0.962 0.5753 -0.2555 -0.8816
+-3.588 -0.9484 0.5234 -0.2555 -0.9041
+-3.529 -0.9328 0.4694 -0.2555 -0.9243
+-3.464 -0.9156 0.4135 -0.2555 -0.9422
+-3.393 -0.8967 0.356 -0.2555 -0.9578
+-3.316 -0.8765 0.2971 -0.2555 -0.971
+-3.235 -0.8551 0.237 -0.2555 -0.9817
+-3.151 -0.8328 0.1759 -0.2555 -0.99
+-3.064 -0.8098 0.1142 -0.2555 -0.9958
+-2.975 -0.7863 0.05194 -0.2555 -0.9991
+-2.885 -0.7626 -0.0105 -0.2555 -1
+-2.796 -0.739 -0.0729 -0.2555 -0.9983
+-2.708 -0.7157 -0.135 -0.2555 -0.9941
+-2.621 -0.6929 -0.1966 -0.2555 -0.9875
+-2.538 -0.6708 -0.2573 -0.2555 -0.9784
+-2.459 -0.6498 -0.3171 -0.2555 -0.9668
+-2.384 -0.63 -0.3755 -0.2555 -0.9528
+-2.314 -0.6117 -0.4325 -0.2555 -0.9365
+-2.251 -0.595 -0.4878 -0.2555 -0.9178
+-2.195 -0.5801 -0.5411 -0.2555 -0.8968
+-2.146 -0.5671 -0.5923 -0.2555 -0.8735
+-2.105 -0.5563 -0.6412 -0.2555 -0.8481
+-2.072 -0.5477 -0.6877 -0.2555 -0.8206
+-2.049 -0.5415 -0.7315 -0.2555 -0.791
+-2.034 -0.5376 -0.7725 -0.2555 -0.7594
+-2.029 -0.5362 -0.8107 -0.2555 -0.7259
+-2.033 -0.5373 -0.8459 -0.2555 -0.6907
+-2.046 -0.5408 -0.878 -0.2555 -0.6536
+-2.069 -0.5468 -0.9069 -0.2555 -0.615
+-2.1 -0.5552 -0.9327 -0.2555 -0.5748
+-2.141 -0.5659 -0.9552 -0.2555 -0.5332
+-2.19 -0.5788 -0.9744 -0.2555 -0.4903
+-2.246 -0.5937 -0.9904 -0.2555 -0.4461
+-2.31 -0.6107 -1.003 -0.2555 -0.4008
+-2.381 -0.6294 -1.013 -0.2555 -0.3545
+-2.458 -0.6497 -1.019 -0.2555 -0.3073
+-2.54 -0.6715 -1.022 -0.2555 -0.2594
+-2.627 -0.6944 -1.022 -0.2555 -0.2108
+-2.717 -0.7183 -1.02 -0.2555 -0.1617
+-2.81 -0.7429 -1.014 -0.2555 -0.1122
+-2.905 -0.7679 -1.006 -0.2555 -0.06235
+-3.001 -0.7933 -0.9948 -0.2555 -0.01239
+-3.097 -0.8186 -0.9813 -0.2555 0.0376
+-3.192 -0.8436 -0.9654 -0.2555 0.0875
+-3.284 -0.8681 -0.9473 -0.2555 0.1372
+-3.374 -0.8918 -0.927 -0.2555 0.1865
+-3.46 -0.9146 -0.9049 -0.2555 0.2354
+-3.541 -0.9361 -0.8808 -0.2555 0.2837
+-3.617 -0.9561 -0.8551 -0.2555 0.3312
+-3.687 -0.9745 -0.8279 -0.2555 0.378
+-3.749 -0.991 -0.7993 -0.2555 0.4238
+-3.804 -1.005 -0.7694 -0.2555 0.4685
+-3.851 -1.018 -0.7384 -0.2555 0.5121
+-3.889 -1.028 -0.7064 -0.2555 0.5544
+-3.918 -1.036 -0.6736 -0.2555 0.5953
+-3.937 -1.041 -0.6399 -0.2555 0.6347
+-3.947 -1.043 -0.6057 -0.2555 0.6725
+-3.947 -1.043 -0.5708 -0.2555 0.7087
+-3.937 -1.041 -0.5355 -0.2555 0.743
+-3.918 -1.036 -0.4998 -0.2555 0.7756
+-3.889 -1.028 -0.4639 -0.2555 0.8061
+-3.85 -1.018 -0.4276 -0.2555 0.8347
+-3.803 -1.005 -0.3912 -0.2555 0.8612
+-3.747 -0.9904 -0.3547 -0.2555 0.8855
+-3.683 -0.9735 -0.3181 -0.2555 0.9076
+-3.612 -0.9547 -0.2814 -0.2555 0.9275
+-3.534 -0.934 -0.2447 -0.2555 0.945
+-3.45 -0.9118 -0.208 -0.2555 0.9602
+-3.36 -0.8882 -0.1712 -0.2555 0.9729
+-3.267 -0.8634 -0.1345 -0.2555 0.9833
+-3.169 -0.8377 -0.09777 -0.2555 0.9911
+-3.07 -0.8113 -0.06106 -0.2555 0.9965
+-2.968 -0.7845 -0.02436 -0.2555 0.9994
+-2.858 -0.9106 0 -0.3035 1
+-2.757 -0.8784 0.03405 -0.3035 0.9988
+-2.657 -0.8464 0.06813 -0.3035 0.995
+-2.558 -0.815 0.1023 -0.3035 0.9888
+-2.463 -0.7846 0.1365 -0.3035 0.9801
+-2.371 -0.7553 0.1708 -0.3035 0.9689
+-2.284 -0.7275 0.2053 -0.3035 0.9553
+-2.202 -0.7014 0.2399 -0.3035 0.9394
+-2.126 -0.6773 0.2746 -0.3035 0.9211
+-2.057 -0.6554 0.3095 -0.3035 0.9004
+-1.996 -0.6359 0.3445 -0.3035 0.8776
+-1.943 -0.6189 0.3796 -0.3035 0.8525
+-1.898 -0.6047 0.4148 -0.3035 0.8253
+-1.863 -0.5934 0.45 -0.3035 0.7961
+-1.836 -0.585 0.4852 -0.3035 0.7648
+-1.82 -0.5797 0.5203 -0.3035 0.7317
+-1.812 -0.5774 0.5553 -0.3035 0.6967
+-1.815 -0.5782 0.5901 -0.3035 0.66
+-1.827 -0.582 0.6245 -0.3035 0.6216
+-1.848 -0.5889 0.6584 -0.3035 0.5817
+-1.879 -0.5987 0.6918 -0.3035 0.5403
+-1.919 -0.6113 0.7245 -0.3035 0.4976
+-1.967 -0.6266 0.7565 -0.3035 0.4536
+-2.023 -0.6444 0.7874 -0.3035 0.4085
+-2.086 -0.6646 0.8172 -0.3035 0.3624
+-2.156 -0.6869 0.8458 -0.3035 0.3153
+-2.232 -0.7111 0.8729 -0.3035 0.2675
+-2.313 -0.7369 0.8985 -0.3035 0.219
+-2.399 -0.7642 0.9223 -0.3035 0.17
+-2.488 -0.7926 0.9442 -0.3035 0.1205
+-2.58 -0.8218 0.964 -0.3035 0.07074
+-2.673 -0.8515 0.9815 -0.3035 0.02079
+-2.767 -0.8815 0.9967 -0.3035 -0.0292
+-2.861 -0.9115 1.009 -0.3035 -0.07912
+-2.954 -0.941 1.019 -0.3035 -0.1288
+-3.045 -0.97 1.026 -0.3035 -0.1782
+-3.133 -0.998 1.03 -0.3035 -0.2272
+-3.217 -1.025 1.031 -0.3035 -0.2756
+-3.296 -1.05 1.029 -0.3035 -0.3233
+-3.37 -1.074 1.024 -0.3035 -0.3702
+-3.438 -1.095 1.015 -0.3035 -0.4161
+-3.499 -1.115 1.003 -0.3035 -0.4611
+-3.553 -1.132 0.9868 -0.3035 -0.5048
+-3.599 -1.146 0.9677 -0.3035 -0.5474
+-3.636 -1.158 0.9451 -0.3035 -0.5885
+-3.665 -1.168 0.919 -0.3035 -0.6282
+-3.685 -1.174 0.8895 -0.3035 -0.6663
+-3.696 -1.177 0.8566 -0.3035 -0.7027
+-3.698 -1.178 0.8205 -0.3035 -0.7374
+-3.69 -1.176 0.7811 -0.3035 -0.7702
+-3.674 -1.17 0.7387 -0.3035 -0.8011
+-3.649 -1.162 0.6933 -0.3035 -0.8301
+-3.615 -1.152 0.6451 -0.3035 -0.8569
+-3.573 -1.138 0.5943 -0.3035 -0.8816
+-3.523 -1.122 0.541 -0.3035 -0.9041
+-3.467 -1.104 0.4855 -0.3035 -0.9243
+-3.404 -1.084 0.428 -0.3035 -0.9422
+-3.335 -1.062 0.3686 -0.3035 -0.9578
+-3.261 -1.039 0.3078 -0.3035 -0.971
+-3.183 -1.014 0.2456 -0.3035 -0.9817
+-3.101 -0.9879 0.1824 -0.3035 -0.99
+-3.017 -0.961 0.1184 -0.3035 -0.9958
+-2.931 -0.9336 0.05385 -0.3035 -0.9991
+-2.844 -0.906 -0.01089 -0.3035 -1
+-2.757 -0.8784 -0.07558 -0.3035 -0.9983
+-2.672 -0.8511 -0.14 -0.3035 -0.9941
+-2.588 -0.8245 -0.2037 -0.3035 -0.9875
+-2.508 -0.7988 -0.2666 -0.3035 -0.9784
+-2.431 -0.7743 -0.3284 -0.3035 -0.9668
+-2.358 -0.7513 -0.3888 -0.3035 -0.9528
+-2.291 -0.7299 -0.4475 -0.3035 -0.9365
+-2.23 -0.7105 -0.5044 -0.3035 -0.9178
+-2.176 -0.6932 -0.5592 -0.3035 -0.8968
+-2.129 -0.6782 -0.6116 -0.3035 -0.8735
+-2.09 -0.6658 -0.6616 -0.3035 -0.8481
+-2.059 -0.6559 -0.7088 -0.3035 -0.8206
+-2.037 -0.6488 -0.7533 -0.3035 -0.791
+-2.023 -0.6446 -0.7947 -0.3035 -0.7594
+-2.019 -0.6432 -0.833 -0.3035 -0.7259
+-2.024 -0.6447 -0.868 -0.3035 -0.6907
+-2.038 -0.6492 -0.8998 -0.3035 -0.6536
+-2.061 -0.6565 -0.9281 -0.3035 -0.615
+-2.092 -0.6666 -0.9531 -0.3035 -0.5748
+-2.133 -0.6795 -0.9745 -0.3035 -0.5332
+-2.181 -0.6949 -0.9925 -0.3035 -0.4903
+-2.238 -0.7129 -1.007 -0.3035 -0.4461
+-2.301 -0.7331 -1.018 -0.3035 -0.4008
+-2.371 -0.7554 -1.026 -0.3035 -0.3545
+-2.447 -0.7796 -1.03 -0.3035 -0.3073
+-2.528 -0.8054 -1.031 -0.3035 -0.2594
+-2.613 -0.8326 -1.029 -0.3035 -0.2108
+-2.702 -0.8609 -1.024 -0.3035 -0.1617
+-2.794 -0.8901 -1.016 -0.3035 -0.1122
+-2.887 -0.9198 -1.005 -0.3035 -0.06235
+-2.981 -0.9498 -0.9919 -0.3035 -0.01239
+-3.075 -0.9798 -0.9759 -0.3035 0.0376
+-3.168 -1.009 -0.9576 -0.3035 0.0875
+-3.259 -1.038 -0.9371 -0.3035 0.1372
+-3.347 -1.066 -0.9145 -0.3035 0.1865
+-3.431 -1.093 -0.8901 -0.3035 0.2354
+-3.511 -1.119 -0.864 -0.3035 0.2837
+-3.585 -1.142 -0.8363 -0.3035 0.3312
+-3.653 -1.164 -0.8073 -0.3035 0.378
+-3.714 -1.183 -0.7771 -0.3035 0.4238
+-3.767 -1.2 -0.7458 -0.3035 0.4685
+-3.812 -1.215 -0.7136 -0.3035 0.5121
+-3.849 -1.226 -0.6807 -0.3035 0.5544
+-3.877 -1.235 -0.6471 -0.3035 0.5953
+-3.895 -1.241 -0.6129 -0.3035 0.6347
+-3.904 -1.244 -0.5784 -0.3035 0.6725
+-3.903 -1.243 -0.5436 -0.3035 0.7087
+-3.893 -1.24 -0.5085 -0.3035 0.743
+-3.873 -1.234 -0.4734 -0.3035 0.7756
+-3.843 -1.224 -0.4382 -0.3035 0.8061
+-3.805 -1.212 -0.4029 -0.3035 0.8347
+-3.757 -1.197 -0.3678 -0.3035 0.8612
+-3.701 -1.179 -0.3327 -0.3035 0.8855
+-3.637 -1.159 -0.2977 -0.3035 0.9076
+-3.566 -1.136 -0.2629 -0.3035 0.9275
+-3.488 -1.111 -0.2282 -0.3035 0.945
+-3.405 -1.085 -0.1937 -0.3035 0.9602
+-3.316 -1.056 -0.1593 -0.3035 0.9729
+-3.222 -1.027 -0.125 -0.3035 0.9833
+-3.126 -0.9958 -0.09079 -0.3035 0.9911
+-3.027 -0.9642 -0.05667 -0.3035 0.9965
+-2.926 -0.9321 -0.0226 -0.3035 0.9994
+-2.809 -1.052 0 -0.3508 1
+-2.709 -1.015 0.03138 -0.3508 0.9988
+-2.61 -0.9775 0.06282 -0.3508 0.995
+-2.512 -0.941 0.09437 -0.3508 0.9888
+-2.417 -0.9055 0.1261 -0.3508 0.9801
+-2.326 -0.8714 0.158 -0.3508 0.9689
+-2.24 -0.839 0.1901 -0.3508 0.9553
+-2.159 -0.8085 0.2226 -0.3508 0.9394
+-2.083 -0.7804 0.2553 -0.3508 0.9211
+-2.015 -0.7548 0.2884 -0.3508 0.9004
+-1.954 -0.7319 0.3218 -0.3508 0.8776
+-1.901 -0.7121 0.3555 -0.3508 0.8525
+-1.856 -0.6953 0.3895 -0.3508 0.8253
+-1.82 -0.6819 0.4237 -0.3508 0.7961
+-1.794 -0.6719 0.4582 -0.3508 0.7648
+-1.776 -0.6654 0.4929 -0.3508 0.7317
+-1.769 -0.6625 0.5277 -0.3508 0.6967
+-1.77 -0.6631 0.5625 -0.3508 0.66
+-1.781 -0.6672 0.5972 -0.3508 0.6216
+-1.802 -0.6749 0.6317 -0.3508 0.5817
+-1.831 -0.6859 0.6659 -0.3508 0.5403
+-1.869 -0.7002 0.6997 -0.3508 0.4976
+-1.916 -0.7176 0.7328 -0.3508 0.4536
+-1.97 -0.7379 0.7652 -0.3508 0.4085
+-2.031 -0.7609 0.7967 -0.3508 0.3624
+-2.099 -0.7864 0.8271 -0.3508 0.3153
+-2.174 -0.8142 0.8562 -0.3508 0.2675
+-2.253 -0.8438 0.8839 -0.3508 0.219
+-2.336 -0.8751 0.91 -0.3508 0.17
+-2.423 -0.9077 0.9342 -0.3508 0.1205
+-2.513 -0.9413 0.9564 -0.3508 0.07074
+-2.604 -0.9755 0.9764 -0.3508 0.02079
+-2.696 -1.01 0.994 -0.3508 -0.0292
+-2.788 -1.044 1.009 -0.3508 -0.07912
+-2.879 -1.079 1.021 -0.3508 -0.1288
+-2.968 -1.112 1.031 -0.3508 -0.1782
+-3.055 -1.144 1.037 -0.3508 -0.2272
+-3.137 -1.175 1.04 -0.3508 -0.2756
+-3.215 -1.204 1.04 -0.3508 -0.3233
+-3.288 -1.232 1.037 -0.3508 -0.3702
+-3.355 -1.257 1.03 -0.3508 -0.4161
+-3.415 -1.279 1.019 -0.3508 -0.4611
+-3.468 -1.299 1.005 -0.3508 -0.5048
+-3.514 -1.316 0.9868 -0.3508 -0.5474
+-3.551 -1.33 0.9652 -0.3508 -0.5885
+-3.58 -1.341 0.9399 -0.3508 -0.6282
+-3.601 -1.349 0.9109 -0.3508 -0.6663
+-3.612 -1.353 0.8783 -0.3508 -0.7027
+-3.615 -1.354 0.8422 -0.3508 -0.7374
+-3.608 -1.352 0.8027 -0.3508 -0.7702
+-3.593 -1.346 0.7598 -0.3508 -0.8011
+-3.569 -1.337 0.7138 -0.3508 -0.8301
+-3.537 -1.325 0.6647 -0.3508 -0.8569
+-3.497 -1.31 0.6128 -0.3508 -0.8816
+-3.45 -1.292 0.5583 -0.3508 -0.9041
+-3.396 -1.272 0.5013 -0.3508 -0.9243
+-3.335 -1.249 0.4421 -0.3508 -0.9422
+-3.269 -1.224 0.381 -0.3508 -0.9578
+-3.198 -1.198 0.3182 -0.3508 -0.971
+-3.122 -1.169 0.254 -0.3508 -0.9817
+-3.043 -1.14 0.1887 -0.3508 -0.99
+-2.962 -1.11 0.1225 -0.3508 -0.9958
+-2.879 -1.078 0.05573 -0.3508 -0.9991
+-2.795 -1.047 -0.01127 -0.3508 -1
+-2.712 -1.016 -0.07821 -0.3508 -0.9983
+-2.629 -0.9849 -0.1448 -0.3508 -0.9941
+-2.549 -0.9547 -0.2108 -0.3508 -0.9875
+-2.471 -0.9255 -0.2758 -0.3508 -0.9784
+-2.397 -0.8978 -0.3395 -0.3508 -0.9668
+-2.327 -0.8717 -0.4018 -0.3508 -0.9528
+-2.263 -0.8475 -0.4623 -0.3508 -0.9365
+-2.204 -0.8256 -0.5207 -0.3508 -0.9178
+-2.152 -0.8061 -0.5769 -0.3508 -0.8968
+-2.107 -0.7892 -0.6306 -0.3508 -0.8735
+-2.07 -0.7753 -0.6815 -0.3508 -0.8481
+-2.04 -0.7643 -0.7296 -0.3508 -0.8206
+-2.02 -0.7565 -0.7746 -0.3508 -0.791
+-2.007 -0.7519 -0.8163 -0.3508 -0.7594
+-2.004 -0.7507 -0.8547 -0.3508 -0.7259
+-2.01 -0.7528 -0.8897 -0.3508 -0.6907
+-2.024 -0.7582 -0.921 -0.3508 -0.6536
+-2.047 -0.7669 -0.9488 -0.3508 -0.615
+-2.079 -0.7788 -0.9729 -0.3508 -0.5748
+-2.119 -0.7938 -0.9932 -0.3508 -0.5332
+-2.167 -0.8119 -1.01 -0.3508 -0.4903
+-2.223 -0.8327 -1.023 -0.3508 -0.4461
+-2.286 -0.8561 -1.032 -0.3508 -0.4008
+-2.355 -0.882 -1.038 -0.3508 -0.3545
+-2.429 -0.91 -1.041 -0.3508 -0.3073
+-2.509 -0.9398 -1.04 -0.3508 -0.2594
+-2.593 -0.9712 -1.035 -0.3508 -0.2108
+-2.68 -1.004 -1.028 -0.3508 -0.1617
+-2.77 -1.038 -1.018 -0.3508 -0.1122
+-2.861 -1.072 -1.004 -0.3508 -0.06235
+-2.953 -1.106 -0.9883 -0.3508 -0.01239
+-3.045 -1.141 -0.9699 -0.3508 0.0376
+-3.136 -1.175 -0.9491 -0.3508 0.0875
+-3.225 -1.208 -0.9262 -0.3508 0.1372
+-3.311 -1.24 -0.9014 -0.3508 0.1865
+-3.393 -1.271 -0.8748 -0.3508 0.2354
+-3.471 -1.3 -0.8466 -0.3508 0.2837
+-3.543 -1.327 -0.817 -0.3508 0.3312
+-3.609 -1.352 -0.7862 -0.3508 0.378
+-3.668 -1.374 -0.7544 -0.3508 0.4238
+-3.72 -1.393 -0.7218 -0.3508 0.4685
+-3.763 -1.41 -0.6884 -0.3508 0.5121
+-3.799 -1.423 -0.6545 -0.3508 0.5544
+-3.825 -1.433 -0.6201 -0.3508 0.5953
+-3.842 -1.439 -0.5855 -0.3508 0.6347
+-3.85 -1.442 -0.5508 -0.3508 0.6725
+-3.849 -1.442 -0.516 -0.3508 0.7087
+-3.838 -1.437 -0.4812 -0.3508 0.743
+-3.817 -1.43 -0.4466 -0.3508 0.7756
+-3.787 -1.419 -0.4122 -0.3508 0.8061
+-3.748 -1.404 -0.378 -0.3508 0.8347
+-3.701 -1.386 -0.3441 -0.3508 0.8612
+-3.645 -1.365 -0.3105 -0.3508 0.8855
+-3.582 -1.342 -0.2772 -0.3508 0.9076
+-3.511 -1.315 -0.2443 -0.3508 0.9275
+-3.434 -1.286 -0.2116 -0.3508 0.945
+-3.35 -1.255 -0.1793 -0.3508 0.9602
+-3.262 -1.222 -0.1472 -0.3508 0.9729
+-3.17 -1.187 -0.1154 -0.3508 0.9833
+-3.074 -1.152 -0.08375 -0.3508 0.9911
+-2.976 -1.115 -0.05224 -0.3508 0.9965
+-2.876 -1.077 -0.02083 -0.3508 0.9994
+-2.753 -1.191 0 -0.3971 1
+-2.654 -1.149 0.0287 -0.3971 0.9988
+-2.556 -1.106 0.05747 -0.3971 0.995
+-2.46 -1.064 0.08641 -0.3971 0.9888
+-2.366 -1.024 0.1156 -0.3971 0.9801
+-2.276 -0.9851 0.145 -0.3971 0.9689
+-2.191 -0.9481 0.1749 -0.3971 0.9553
+-2.11 -0.9133 0.2051 -0.3971 0.9394
+-2.036 -0.8811 0.2359 -0.3971 0.9211
+-1.968 -0.8518 0.2671 -0.3971 0.9004
+-1.908 -0.8256 0.2988 -0.3971 0.8776
+-1.855 -0.8028 0.3311 -0.3971 0.8525
+-1.811 -0.7835 0.3639 -0.3971 0.8253
+-1.775 -0.768 0.3972 -0.3971 0.7961
+-1.748 -0.7563 0.431 -0.3971 0.7648
+-1.73 -0.7486 0.4652 -0.3971 0.7317
+-1.721 -0.7449 0.4998 -0.3971 0.6967
+-1.722 -0.7453 0.5346 -0.3971 0.66
+-1.732 -0.7496 0.5696 -0.3971 0.6216
+-1.751 -0.7579 0.6046 -0.3971 0.5817
+-1.779 -0.7701 0.6396 -0.3971 0.5403
+-1.816 -0.7859 0.6744 -0.3971 0.4976
+-1.861 -0.8052 0.7087 -0.3971 0.4536
+-1.913 -0.8279 0.7426 -0.3971 0.4085
+-1.973 -0.8537 0.7757 -0.3971 0.3624
+-2.039 -0.8823 0.8079 -0.3971 0.3153
+-2.111 -0.9134 0.839 -0.3971 0.2675
+-2.188 -0.9467 0.8688 -0.3971 0.219
+-2.269 -0.9818 0.897 -0.3971 0.17
+-2.354 -1.018 0.9236 -0.3971 0.1205
+-2.441 -1.056 0.9482 -0.3971 0.07074
+-2.53 -1.095 0.9706 -0.3971 0.02079
+-2.62 -1.134 0.9906 -0.3971 -0.0292
+-2.71 -1.173 1.008 -0.3971 -0.07912
+-2.798 -1.211 1.023 -0.3971 -0.1288
+-2.885 -1.249 1.035 -0.3971 -0.1782
+-2.97 -1.285 1.043 -0.3971 -0.2272
+-3.051 -1.32 1.049 -0.3971 -0.2756
+-3.127 -1.353 1.051 -0.3971 -0.3233
+-3.198 -1.384 1.049 -0.3971 -0.3702
+-3.264 -1.413 1.044 -0.3971 -0.4161
+-3.323 -1.438 1.035 -0.3971 -0.4611
+-3.376 -1.461 1.022 -0.3971 -0.5048
+-3.421 -1.48 1.005 -0.3971 -0.5474
+-3.458 -1.496 0.9847 -0.3971 -0.5885
+-3.487 -1.509 0.9601 -0.3971 -0.6282
+-3.507 -1.518 0.9317 -0.3971 -0.6663
+-3.519 -1.523 0.8995 -0.3971 -0.7027
+-3.523 -1.524 0.8634 -0.3971 -0.7374
+-3.517 -1.522 0.8237 -0.3971 -0.7702
+-3.504 -1.516 0.7805 -0.3971 -0.8011
+-3.481 -1.507 0.7338 -0.3971 -0.8301
+-3.451 -1.494 0.6839 -0.3971 -0.8569
+-3.413 -1.477 0.631 -0.3971 -0.8816
+-3.368 -1.458 0.5752 -0.3971 -0.9041
+-3.316 -1.435 0.5168 -0.3971 -0.9243
+-3.258 -1.41 0.456 -0.3971 -0.9422
+-3.195 -1.382 0.3932 -0.3971 -0.9578
+-3.126 -1.353 0.3285 -0.3971 -0.971
+-3.054 -1.322 0.2623 -0.3971 -0.9817
+-2.978 -1.289 0.1948 -0.3971 -0.99
+-2.9 -1.255 0.1265 -0.3971 -0.9958
+-2.82 -1.22 0.05757 -0.3971 -0.9991
+-2.74 -1.186 -0.01164 -0.3971 -1
+-2.659 -1.151 -0.0808 -0.3971 -0.9983
+-2.58 -1.116 -0.1496 -0.3971 -0.9941
+-2.503 -1.083 -0.2176 -0.3971 -0.9875
+-2.428 -1.051 -0.2847 -0.3971 -0.9784
+-2.357 -1.02 -0.3504 -0.3971 -0.9668
+-2.29 -0.9909 -0.4145 -0.3971 -0.9528
+-2.228 -0.9642 -0.4767 -0.3971 -0.9365
+-2.172 -0.9399 -0.5367 -0.3971 -0.9178
+-2.122 -0.9184 -0.5943 -0.3971 -0.8968
+-2.08 -0.8999 -0.6491 -0.3971 -0.8735
+-2.044 -0.8846 -0.7011 -0.3971 -0.8481
+-2.017 -0.8727 -0.7499 -0.3971 -0.8206
+-1.997 -0.8643 -0.7954 -0.3971 -0.791
+-1.986 -0.8595 -0.8375 -0.3971 -0.7594
+-1.984 -0.8585 -0.876 -0.3971 -0.7259
+-1.99 -0.8612 -0.9107 -0.3971 -0.6907
+-2.005 -0.8676 -0.9417 -0.3971 -0.6536
+-2.028 -0.8778 -0.9688 -0.3971 -0.615
+-2.06 -0.8915 -0.992 -0.3971 -0.5748
+-2.1 -0.9087 -1.011 -0.3971 -0.5332
+-2.147 -0.9293 -1.027 -0.3971 -0.4903
+-2.202 -0.953 -1.038 -0.3971 -0.4461
+-2.264 -0.9796 -1.046 -0.3971 -0.4008
+-2.331 -1.009 -1.05 -0.3971 -0.3545
+-2.405 -1.041 -1.05 -0.3971 -0.3073
+-2.483 -1.074 -1.047 -0.3971 -0.2594
+-2.565 -1.11 -1.041 -0.3971 -0.2108
+-2.65 -1.147 -1.031 -0.3971 -0.1617
+-2.738 -1.185 -1.018 -0.3971 -0.1122
+-2.827 -1.223 -1.003 -0.3971 -0.06235
+-2.917 -1.262 -0.9842 -0.3971 -0.01239
+-3.007 -1.301 -0.9633 -0.3971 0.0376
+-3.095 -1.339 -0.9401 -0.3971 0.0875
+-3.182 -1.377 -0.9149 -0.3971 0.1372
+-3.265 -1.413 -0.8877 -0.3971 0.1865
+-3.345 -1.448 -0.8589 -0.3971 0.2354
+-3.421 -1.48 -0.8287 -0.3971 0.2837
+-3.491 -1.511 -0.7972 -0.3971 0.3312
+-3.555 -1.538 -0.7647 -0.3971 0.378
+-3.612 -1.563 -0.7313 -0.3971 0.4238
+-3.662 -1.585 -0.6972 -0.3971 0.4685
+-3.704 -1.603 -0.6627 -0.3971 0.5121
+-3.737 -1.617 -0.6278 -0.3971 0.5544
+-3.763 -1.628 -0.5928 -0.3971 0.5953
+-3.779 -1.635 -0.5578 -0.3971 0.6347
+-3.786 -1.638 -0.5228 -0.3971 0.6725
+-3.783 -1.637 -0.4881 -0.3971 0.7087
+-3.772 -1.632 -0.4537 -0.3971 0.743
+-3.751 -1.623 -0.4196 -0.3971 0.7756
+-3.721 -1.61 -0.386 -0.3971 0.8061
+-3.682 -1.593 -0.3528 -0.3971 0.8347
+-3.635 -1.573 -0.3202 -0.3971 0.8612
+-3.579 -1.549 -0.2881 -0.3971 0.8855
+-3.516 -1.522 -0.2565 -0.3971 0.9076
+-3.446 -1.491 -0.2255 -0.3971 0.9275
+-3.37 -1.458 -0.1949 -0.3971 0.945
+-3.287 -1.423 -0.1648 -0.3971 0.9602
+-3.2 -1.385 -0.1351 -0.3971 0.9729
+-3.109 -1.345 -0.1057 -0.3971 0.9833
+-3.015 -1.305 -0.07665 -0.3971 0.9911
+-2.918 -1.263 -0.04778 -0.3971 0.9965
+-2.819 -1.22 -0.01904 -0.3971 0.9994
+-2.69 -1.328 0 -0.4425 1
+-2.593 -1.28 0.02599 -0.4425 0.9988
+-2.496 -1.232 0.05208 -0.4425 0.995
+-2.402 -1.185 0.07839 -0.4425 0.9888
+-2.31 -1.14 0.105 -0.4425 0.9801
+-2.221 -1.096 0.132 -0.4425 0.9689
+-2.137 -1.055 0.1595 -0.4425 0.9553
+-2.058 -1.015 0.1876 -0.4425 0.9394
+-1.984 -0.9793 0.2162 -0.4425 0.9211
+-1.918 -0.9463 0.2456 -0.4425 0.9004
+-1.858 -0.9167 0.2757 -0.4425 0.8776
+-1.805 -0.8909 0.3065 -0.4425 0.8525
+-1.761 -0.8691 0.3381 -0.4425 0.8253
+-1.725 -0.8515 0.3704 -0.4425 0.7961
+-1.698 -0.8381 0.4035 -0.4425 0.7648
+-1.68 -0.8292 0.4372 -0.4425 0.7317
+-1.671 -0.8247 0.4715 -0.4425 0.6967
+-1.671 -0.8247 0.5063 -0.4425 0.66
+-1.68 -0.8291 0.5416 -0.4425 0.6216
+-1.698 -0.838 0.5771 -0.4425 0.5817
+-1.725 -0.8511 0.6129 -0.4425 0.5403
+-1.76 -0.8684 0.6486 -0.4425 0.4976
+-1.803 -0.8895 0.6842 -0.4425 0.4536
+-1.853 -0.9144 0.7195 -0.4425 0.4085
+-1.91 -0.9428 0.7542 -0.4425 0.3624
+-1.974 -0.9742 0.7882 -0.4425 0.3153
+-2.044 -1.009 0.8212 -0.4425 0.2675
+-2.118 -1.045 0.8531 -0.4425 0.219
+-2.197 -1.084 0.8836 -0.4425 0.17
+-2.279 -1.125 0.9124 -0.4425 0.1205
+-2.364 -1.166 0.9393 -0.4425 0.07074
+-2.45 -1.209 0.9642 -0.4425 0.02079
+-2.538 -1.252 0.9867 -0.4425 -0.0292
+-2.625 -1.295 1.007 -0.4425 -0.07912
+-2.711 -1.338 1.024 -0.4425 -0.1288
+-2.796 -1.38 1.038 -0.4425 -0.1782
+-2.878 -1.42 1.049 -0.4425 -0.2272
+-2.957 -1.459 1.057 -0.4425 -0.2756
+-3.032 -1.496 1.061 -0.4425 -0.3233
+-3.102 -1.531 1.061 -0.4425 -0.3702
+-3.166 -1.562 1.057 -0.4425 -0.4161
+-3.224 -1.591 1.05 -0.4425 -0.4611
+-3.276 -1.616 1.039 -0.4425 -0.5048
+-3.32 -1.638 1.023 -0.4425 -0.5474
+-3.357 -1.656 1.004 -0.4425 -0.5885
+-3.385 -1.671 0.9798 -0.4425 -0.6282
+-3.406 -1.681 0.952 -0.4425 -0.6663
+-3.419 -1.687 0.9201 -0.4425 -0.7027
+-3.423 -1.689 0.8841 -0.4425 -0.7374
+-3.418 -1.687 0.8443 -0.4425 -0.7702
+-3.406 -1.681 0.8007 -0.4425 -0.8011
+-3.385 -1.67 0.7534 -0.4425 -0.8301
+-3.357 -1.656 0.7027 -0.4425 -0.8569
+-3.321 -1.639 0.6488 -0.4425 -0.8816
+-3.278 -1.618 0.5918 -0.4425 -0.9041
+-3.229 -1.593 0.532 -0.4425 -0.9243
+-3.173 -1.566 0.4697 -0.4425 -0.9422
+-3.113 -1.536 0.4051 -0.4425 -0.9578
+-3.047 -1.504 0.3386 -0.4425 -0.971
+-2.978 -1.47 0.2704 -0.4425 -0.9817
+-2.906 -1.434 0.2009 -0.4425 -0.99
+-2.831 -1.397 0.1305 -0.4425 -0.9958
+-2.754 -1.359 0.05937 -0.4425 -0.9991
+-2.677 -1.321 -0.01201 -0.4425 -1
+-2.6 -1.283 -0.08333 -0.4425 -0.9983
+-2.524 -1.246 -0.1542 -0.4425 -0.9941
+-2.45 -1.209 -0.2244 -0.4425 -0.9875
+-2.379 -1.174 -0.2935 -0.4425 -0.9784
+-2.311 -1.14 -0.3611 -0.4425 -0.9668
+-2.247 -1.109 -0.427 -0.4425 -0.9528
+-2.188 -1.08 -0.4909 -0.4425 -0.9365
+-2.135 -1.053 -0.5524 -0.4425 -0.9178
+-2.087 -1.03 -0.6113 -0.4425 -0.8968
+-2.047 -1.01 -0.6673 -0.4425 -0.8735
+-2.013 -0.9935 -0.7202 -0.4425 -0.8481
+-1.988 -0.9808 -0.7697 -0.4425 -0.8206
+-1.97 -0.972 -0.8158 -0.4425 -0.791
+-1.96 -0.9671 -0.8581 -0.4425 -0.7594
+-1.958 -0.9664 -0.8967 -0.4425 -0.7259
+-1.965 -0.9698 -0.9312 -0.4425 -0.6907
+-1.98 -0.9773 -0.9618 -0.4425 -0.6536
+-2.004 -0.9889 -0.9883 -0.4425 -0.615
+-2.035 -1.004 -1.011 -0.4425 -0.5748
+-2.075 -1.024 -1.029 -0.4425 -0.5332
+-2.122 -1.047 -1.043 -0.4425 -0.4903
+-2.175 -1.073 -1.053 -0.4425 -0.4461
+-2.236 -1.103 -1.059 -0.4425 -0.4008
+-2.302 -1.136 -1.061 -0.4425 -0.3545
+-2.373 -1.171 -1.06 -0.4425 -0.3073
+-2.45 -1.209 -1.054 -0.4425 -0.2594
+-2.53 -1.248 -1.046 -0.4425 -0.2108
+-2.613 -1.289 -1.034 -0.4425 -0.1617
+-2.698 -1.331 -1.018 -0.4425 -0.1122
+-2.785 -1.374 -1 -0.4425 -0.06235
+-2.872 -1.417 -0.9794 -0.4425 -0.01239
+-2.96 -1.46 -0.9561 -0.4425 0.0376
+-3.045 -1.503 -0.9305 -0.4425 0.0875
+-3.129 -1.544 -0.9029 -0.4425 0.1372
+-3.21 -1.584 -0.8735 -0.4425 0.1865
+-3.288 -1.622 -0.8425 -0.4425 0.2354
+-3.361 -1.658 -0.8102 -0.4425 0.2837
+-3.428 -1.692 -0.7769 -0.4425 0.3312
+-3.49 -1.722 -0.7426 -0.4425 0.378
+-3.545 -1.749 -0.7077 -0.4425 0.4238
+-3.593 -1.773 -0.6723 -0.4425 0.4685
+-3.634 -1.793 -0.6366 -0.4425 0.5121
+-3.666 -1.809 -0.6008 -0.4425 0.5544
+-3.689 -1.821 -0.5652 -0.4425 0.5953
+-3.704 -1.828 -0.5297 -0.4425 0.6347
+-3.71 -1.831 -0.4946 -0.4425 0.6725
+-3.707 -1.829 -0.4599 -0.4425 0.7087
+-3.695 -1.823 -0.4258 -0.4425 0.743
+-3.674 -1.813 -0.3923 -0.4425 0.7756
+-3.644 -1.798 -0.3595 -0.4425 0.8061
+-3.605 -1.779 -0.3274 -0.4425 0.8347
+-3.558 -1.756 -0.2961 -0.4425 0.8612
+-3.504 -1.729 -0.2655 -0.4425 0.8855
+-3.441 -1.698 -0.2357 -0.4425 0.9076
+-3.372 -1.664 -0.2065 -0.4425 0.9275
+-3.297 -1.627 -0.1781 -0.4425 0.945
+-3.216 -1.587 -0.1502 -0.4425 0.9602
+-3.13 -1.545 -0.1229 -0.4425 0.9729
+-3.04 -1.5 -0.09601 -0.4425 0.9833
+-2.947 -1.454 -0.06951 -0.4425 0.9911
+-2.852 -1.407 -0.04329 -0.4425 0.9965
+-2.755 -1.359 -0.01724 -0.4425 0.9994
+-2.621 -1.46 0 -0.4868 1
+-2.525 -1.407 0.02327 -0.4868 0.9988
+-2.431 -1.355 0.04666 -0.4868 0.995
+-2.338 -1.303 0.07032 -0.4868 0.9888
+-2.248 -1.253 0.09436 -0.4868 0.9801
+-2.161 -1.204 0.1189 -0.4868 0.9689
+-2.078 -1.158 0.144 -0.4868 0.9553
+-2.001 -1.115 0.1699 -0.4868 0.9394
+-1.929 -1.075 0.1965 -0.4868 0.9211
+-1.863 -1.038 0.224 -0.4868 0.9004
+-1.804 -1.005 0.2524 -0.4868 0.8776
+-1.752 -0.9765 0.2818 -0.4868 0.8525
+-1.709 -0.9521 0.3121 -0.4868 0.8253
+-1.673 -0.9323 0.3434 -0.4868 0.7961
+-1.646 -0.9172 0.3757 -0.4868 0.7648
+-1.627 -0.907 0.4089 -0.4868 0.7317
+-1.618 -0.9016 0.4429 -0.4868 0.6967
+-1.617 -0.9012 0.4778 -0.4868 0.66
+-1.625 -0.9056 0.5133 -0.4868 0.6216
+-1.642 -0.9149 0.5493 -0.4868 0.5817
+-1.667 -0.9289 0.5858 -0.4868 0.5403
+-1.7 -0.9475 0.6225 -0.4868 0.4976
+-1.741 -0.9703 0.6593 -0.4868 0.4536
+-1.79 -0.9973 0.6959 -0.4868 0.4085
+-1.845 -1.028 0.7322 -0.4868 0.3624
+-1.906 -1.062 0.768 -0.4868 0.3153
+-1.973 -1.1 0.803 -0.4868 0.2675
+-2.045 -1.14 0.8369 -0.4868 0.219
+-2.121 -1.182 0.8695 -0.4868 0.17
+-2.2 -1.226 0.9006 -0.4868 0.1205
+-2.282 -1.272 0.93 -0.4868 0.07074
+-2.366 -1.318 0.9572 -0.4868 0.02079
+-2.45 -1.366 0.9821 -0.4868 -0.0292
+-2.535 -1.413 1.004 -0.4868 -0.07912
+-2.619 -1.459 1.024 -0.4868 -0.1288
+-2.701 -1.505 1.041 -0.4868 -0.1782
+-2.781 -1.55 1.054 -0.4868 -0.2272
+-2.857 -1.592 1.064 -0.4868 -0.2756
+-2.93 -1.633 1.07 -0.4868 -0.3233
+-2.998 -1.671 1.072 -0.4868 -0.3702
+-3.061 -1.706 1.07 -0.4868 -0.4161
+-3.117 -1.737 1.065 -0.4868 -0.4611
+-3.168 -1.765 1.055 -0.4868 -0.5048
+-3.211 -1.79 1.04 -0.4868 -0.5474
+-3.247 -1.81 1.022 -0.4868 -0.5885
+-3.276 -1.826 0.9989 -0.4868 -0.6282
+-3.297 -1.837 0.9716 -0.4868 -0.6663
+-3.31 -1.844 0.9401 -0.4868 -0.7027
+-3.314 -1.847 0.9043 -0.4868 -0.7374
+-3.311 -1.845 0.8643 -0.4868 -0.7702
+-3.3 -1.839 0.8204 -0.4868 -0.8011
+-3.281 -1.828 0.7726 -0.4868 -0.8301
+-3.254 -1.813 0.7211 -0.4868 -0.8569
+-3.221 -1.795 0.6662 -0.4868 -0.8816
+-3.18 -1.772 0.608 -0.4868 -0.9041
+-3.133 -1.746 0.5468 -0.4868 -0.9243
+-3.081 -1.717 0.483 -0.4868 -0.9422
+-3.023 -1.685 0.4167 -0.4868 -0.9578
+-2.961 -1.65 0.3484 -0.4868 -0.971
+-2.895 -1.613 0.2783 -0.4868 -0.9817
+-2.826 -1.575 0.2069 -0.4868 -0.99
+-2.754 -1.535 0.1343 -0.4868 -0.9958
+-2.682 -1.494 0.06114 -0.4868 -0.9991
+-2.608 -1.453 -0.01237 -0.4868 -1
+-2.535 -1.413 -0.08581 -0.4868 -0.9983
+-2.462 -1.372 -0.1588 -0.4868 -0.9941
+-2.392 -1.333 -0.231 -0.4868 -0.9875
+-2.324 -1.295 -0.3021 -0.4868 -0.9784
+-2.259 -1.259 -0.3716 -0.4868 -0.9668
+-2.198 -1.225 -0.4392 -0.4868 -0.9528
+-2.142 -1.194 -0.5047 -0.4868 -0.9365
+-2.091 -1.166 -0.5677 -0.4868 -0.9178
+-2.047 -1.141 -0.6279 -0.4868 -0.8968
+-2.008 -1.119 -0.685 -0.4868 -0.8735
+-1.977 -1.102 -0.7388 -0.4868 -0.8481
+-1.953 -1.088 -0.7891 -0.4868 -0.8206
+-1.937 -1.079 -0.8356 -0.4868 -0.791
+-1.928 -1.074 -0.8782 -0.4868 -0.7594
+-1.927 -1.074 -0.9168 -0.4868 -0.7259
+-1.935 -1.078 -0.9512 -0.4868 -0.6907
+-1.95 -1.087 -0.9813 -0.4868 -0.6536
+-1.974 -1.1 -1.007 -0.4868 -0.615
+-2.005 -1.117 -1.029 -0.4868 -0.5748
+-2.044 -1.139 -1.046 -0.4868 -0.5332
+-2.09 -1.164 -1.058 -0.4868 -0.4903
+-2.142 -1.194 -1.067 -0.4868 -0.4461
+-2.201 -1.227 -1.071 -0.4868 -0.4008
+-2.265 -1.262 -1.072 -0.4868 -0.3545
+-2.335 -1.301 -1.068 -0.4868 -0.3073
+-2.409 -1.343 -1.061 -0.4868 -0.2594
+-2.487 -1.386 -1.05 -0.4868 -0.2108
+-2.568 -1.431 -1.035 -0.4868 -0.1617
+-2.65 -1.477 -1.018 -0.4868 -0.1122
+-2.735 -1.524 -0.9973 -0.4868 -0.06235
+-2.819 -1.571 -0.974 -0.4868 -0.01239
+-2.904 -1.618 -0.9483 -0.4868 0.0376
+-2.987 -1.664 -0.9203 -0.4868 0.0875
+-3.068 -1.71 -0.8904 -0.4868 0.1372
+-3.146 -1.753 -0.8587 -0.4868 0.1865
+-3.221 -1.795 -0.8256 -0.4868 0.2354
+-3.291 -1.834 -0.7913 -0.4868 0.2837
+-3.356 -1.87 -0.756 -0.4868 0.3312
+-3.416 -1.903 -0.7201 -0.4868 0.378
+-3.469 -1.933 -0.6836 -0.4868 0.4238
+-3.515 -1.959 -0.6469 -0.4868 0.4685
+-3.553 -1.98 -0.6101 -0.4868 0.5121
+-3.584 -1.997 -0.5735 -0.4868 0.5544
+-3.606 -2.009 -0.5371 -0.4868 0.5953
+-3.62 -2.017 -0.5013 -0.4868 0.6347
+-3.625 -2.02 -0.466 -0.4868 0.6725
+-3.621 -2.018 -0.4314 -0.4868 0.7087
+-3.608 -2.011 -0.3976 -0.4868 0.743
+-3.587 -1.999 -0.3647 -0.4868 0.7756
+-3.557 -1.982 -0.3328 -0.4868 0.8061
+-3.519 -1.961 -0.3018 -0.4868 0.8347
+-3.472 -1.935 -0.2718 -0.4868 0.8612
+-3.418 -1.905 -0.2428 -0.4868 0.8855
+-3.357 -1.871 -0.2147 -0.4868 0.9076
+-3.289 -1.833 -0.1875 -0.4868 0.9275
+-3.215 -1.792 -0.1611 -0.4868 0.945
+-3.136 -1.747 -0.1355 -0.4868 0.9602
+-3.051 -1.7 -0.1106 -0.4868 0.9729
+-2.963 -1.651 -0.08622 -0.4868 0.9833
+-2.872 -1.601 -0.06233 -0.4868 0.9911
+-2.779 -1.549 -0.03877 -0.4868 0.9965
+-2.684 -1.496 -0.01543 -0.4868 0.9994
+-2.544 -1.59 0 -0.5298 1
+-2.451 -1.531 0.02053 -0.5298 0.9988
+-2.359 -1.474 0.04122 -0.5298 0.995
+-2.268 -1.417 0.06221 -0.5298 0.9888
+-2.18 -1.362 0.08366 -0.5298 0.9801
+-2.096 -1.309 0.1057 -0.5298 0.9689
+-2.015 -1.259 0.1285 -0.5298 0.9553
+-1.939 -1.211 0.1521 -0.5298 0.9394
+-1.868 -1.167 0.1766 -0.5298 0.9211
+-1.804 -1.127 0.2022 -0.5298 0.9004
+-1.746 -1.091 0.229 -0.5298 0.8776
+-1.696 -1.059 0.2568 -0.5298 0.8525
+-1.652 -1.032 0.2859 -0.5298 0.8253
+-1.617 -1.01 0.3162 -0.5298 0.7961
+-1.59 -0.9935 0.3477 -0.5298 0.7648
+-1.572 -0.9819 0.3803 -0.5298 0.7317
+-1.562 -0.9757 0.4141 -0.5298 0.6967
+-1.56 -0.9747 0.4489 -0.5298 0.66
+-1.567 -0.9791 0.4846 -0.5298 0.6216
+-1.583 -0.9888 0.5211 -0.5298 0.5817
+-1.606 -1.004 0.5583 -0.5298 0.5403
+-1.638 -1.023 0.5959 -0.5298 0.4976
+-1.677 -1.048 0.6339 -0.5298 0.4536
+-1.723 -1.076 0.6719 -0.5298 0.4085
+-1.776 -1.109 0.7098 -0.5298 0.3624
+-1.835 -1.146 0.7473 -0.5298 0.3153
+-1.899 -1.186 0.7842 -0.5298 0.2675
+-1.968 -1.229 0.8202 -0.5298 0.219
+-2.041 -1.275 0.855 -0.5298 0.17
+-2.117 -1.323 0.8883 -0.5298 0.1205
+-2.196 -1.372 0.92 -0.5298 0.07074
+-2.277 -1.422 0.9496 -0.5298 0.02079
+-2.358 -1.473 0.977 -0.5298 -0.0292
+-2.44 -1.524 1.002 -0.5298 -0.07912
+-2.521 -1.575 1.024 -0.5298 -0.1288
+-2.6 -1.624 1.043 -0.5298 -0.1782
+-2.677 -1.673 1.058 -0.5298 -0.2272
+-2.752 -1.719 1.07 -0.5298 -0.2756
+-2.822 -1.763 1.078 -0.5298 -0.3233
+-2.888 -1.804 1.083 -0.5298 -0.3702
+-2.949 -1.842 1.083 -0.5298 -0.4161
+-3.004 -1.877 1.079 -0.5298 -0.4611
+-3.053 -1.907 1.07 -0.5298 -0.5048
+-3.096 -1.934 1.057 -0.5298 -0.5474
+-3.131 -1.956 1.039 -0.5298 -0.5885
+-3.159 -1.974 1.017 -0.5298 -0.6282
+-3.18 -1.987 0.9907 -0.5298 -0.6663
+-3.193 -1.995 0.9595 -0.5298 -0.7027
+-3.199 -1.998 0.9238 -0.5298 -0.7374
+-3.196 -1.997 0.8838 -0.5298 -0.7702
+-3.186 -1.991 0.8396 -0.5298 -0.8011
+-3.169 -1.98 0.7912 -0.5298 -0.8301
+-3.144 -1.964 0.739 -0.5298 -0.8569
+-3.112 -1.944 0.6831 -0.5298 -0.8816
+-3.074 -1.921 0.6238 -0.5298 -0.9041
+-3.03 -1.893 0.5613 -0.5298 -0.9243
+-2.981 -1.862 0.496 -0.5298 -0.9422
+-2.926 -1.828 0.4281 -0.5298 -0.9578
+-2.867 -1.791 0.358 -0.5298 -0.971
+-2.805 -1.752 0.2861 -0.5298 -0.9817
+-2.739 -1.711 0.2127 -0.5298 -0.99
+-2.671 -1.669 0.1381 -0.5298 -0.9958
+-2.602 -1.626 0.06287 -0.5298 -0.9991
+-2.533 -1.582 -0.01272 -0.5298 -1
+-2.463 -1.539 -0.08823 -0.5298 -0.9983
+-2.394 -1.496 -0.1633 -0.5298 -0.9941
+-2.327 -1.454 -0.2375 -0.5298 -0.9875
+-2.263 -1.414 -0.3105 -0.5298 -0.9784
+-2.201 -1.375 -0.3818 -0.5298 -0.9668
+-2.144 -1.339 -0.4512 -0.5298 -0.9528
+-2.091 -1.306 -0.5183 -0.5298 -0.9365
+-2.043 -1.276 -0.5827 -0.5298 -0.9178
+-2.001 -1.25 -0.6441 -0.5298 -0.8968
+-1.965 -1.227 -0.7023 -0.5298 -0.8735
+-1.935 -1.209 -0.757 -0.5298 -0.8481
+-1.913 -1.195 -0.8079 -0.5298 -0.8206
+-1.898 -1.186 -0.8549 -0.5298 -0.791
+-1.891 -1.181 -0.8978 -0.5298 -0.7594
+-1.891 -1.181 -0.9363 -0.5298 -0.7259
+-1.899 -1.186 -0.9705 -0.5298 -0.6907
+-1.915 -1.196 -1 -0.5298 -0.6536
+-1.938 -1.211 -1.025 -0.5298 -0.615
+-1.969 -1.23 -1.046 -0.5298 -0.5748
+-2.007 -1.254 -1.062 -0.5298 -0.5332
+-2.051 -1.282 -1.073 -0.5298 -0.4903
+-2.103 -1.314 -1.08 -0.5298 -0.4461
+-2.16 -1.349 -1.083 -0.5298 -0.4008
+-2.222 -1.388 -1.082 -0.5298 -0.3545
+-2.29 -1.431 -1.076 -0.5298 -0.3073
+-2.362 -1.475 -1.066 -0.5298 -0.2594
+-2.437 -1.522 -1.053 -0.5298 -0.2108
+-2.515 -1.571 -1.037 -0.5298 -0.1617
+-2.595 -1.621 -1.017 -0.5298 -0.1122
+-2.676 -1.672 -0.9937 -0.5298 -0.06235
+-2.758 -1.723 -0.968 -0.5298 -0.01239
+-2.839 -1.774 -0.9399 -0.5298 0.0376
+-2.919 -1.824 -0.9095 -0.5298 0.0875
+-2.997 -1.873 -0.8773 -0.5298 0.1372
+-3.073 -1.92 -0.8434 -0.5298 0.1865
+-3.144 -1.964 -0.8082 -0.5298 0.2354
+-3.212 -2.007 -0.7719 -0.5298 0.2837
+-3.274 -2.046 -0.7347 -0.5298 0.3312
+-3.331 -2.081 -0.6971 -0.5298 0.378
+-3.382 -2.113 -0.6591 -0.5298 0.4238
+-3.426 -2.14 -0.6211 -0.5298 0.4685
+-3.462 -2.163 -0.5832 -0.5298 0.5121
+-3.491 -2.181 -0.5457 -0.5298 0.5544
+-3.512 -2.194 -0.5088 -0.5298 0.5953
+-3.525 -2.202 -0.4725 -0.5298 0.6347
+-3.529 -2.205 -0.4371 -0.5298 0.6725
+-3.524 -2.202 -0.4026 -0.5298 0.7087
+-3.512 -2.194 -0.3692 -0.5298 0.743
+-3.49 -2.18 -0.337 -0.5298 0.7756
+-3.46 -2.162 -0.3059 -0.5298 0.8061
+-3.423 -2.138 -0.276 -0.5298 0.8347
+-3.377 -2.11 -0.2473 -0.5298 0.8612
+-3.324 -2.076 -0.2198 -0.5298 0.8855
+-3.264 -2.039 -0.1935 -0.5298 0.9076
+-3.197 -1.997 -0.1683 -0.5298 0.9275
+-3.125 -1.952 -0.144 -0.5298 0.945
+-3.047 -1.904 -0.1207 -0.5298 0.9602
+-2.965 -1.852 -0.09821 -0.5298 0.9729
+-2.879 -1.799 -0.07638 -0.5298 0.9833
+-2.79 -1.743 -0.05511 -0.5298 0.9911
+-2.699 -1.686 -0.03423 -0.5298 0.9965
+-2.606 -1.628 -0.01362 -0.5298 0.9994
+-2.462 -1.715 0 -0.5716 1
+-2.371 -1.652 0.01778 -0.5716 0.9988
+-2.282 -1.589 0.03574 -0.5716 0.995
+-2.194 -1.528 0.05406 -0.5716 0.9888
+-2.108 -1.468 0.0729 -0.5716 0.9801
+-2.026 -1.411 0.09244 -0.5716 0.9689
+-1.947 -1.356 0.1128 -0.5716 0.9553
+-1.873 -1.305 0.1342 -0.5716 0.9394
+-1.804 -1.257 0.1567 -0.5716 0.9211
+-1.742 -1.213 0.1804 -0.5716 0.9004
+-1.685 -1.174 0.2054 -0.5716 0.8776
+-1.635 -1.139 0.2317 -0.5716 0.8525
+-1.593 -1.11 0.2595 -0.5716 0.8253
+-1.559 -1.086 0.2888 -0.5716 0.7961
+-1.532 -1.067 0.3195 -0.5716 0.7648
+-1.513 -1.054 0.3516 -0.5716 0.7317
+-1.503 -1.047 0.385 -0.5716 0.6967
+-1.501 -1.045 0.4197 -0.5716 0.66
+-1.507 -1.05 0.4557 -0.5716 0.6216
+-1.521 -1.059 0.4926 -0.5716 0.5817
+-1.543 -1.075 0.5305 -0.5716 0.5403
+-1.573 -1.095 0.569 -0.5716 0.4976
+-1.61 -1.121 0.6081 -0.5716 0.4536
+-1.654 -1.152 0.6475 -0.5716 0.4085
+-1.704 -1.187 0.6869 -0.5716 0.3624
+-1.76 -1.226 0.7262 -0.5716 0.3153
+-1.821 -1.269 0.7649 -0.5716 0.2675
+-1.887 -1.315 0.8029 -0.5716 0.219
+-1.957 -1.363 0.8399 -0.5716 0.17
+-2.03 -1.414 0.8755 -0.5716 0.1205
+-2.106 -1.467 0.9094 -0.5716 0.07074
+-2.183 -1.521 0.9414 -0.5716 0.02079
+-2.262 -1.575 0.9712 -0.5716 -0.0292
+-2.34 -1.63 0.9983 -0.5716 -0.07912
+-2.418 -1.684 1.023 -0.5716 -0.1288
+-2.494 -1.738 1.044 -0.5716 -0.1782
+-2.569 -1.789 1.062 -0.5716 -0.2272
+-2.64 -1.839 1.076 -0.5716 -0.2756
+-2.708 -1.886 1.086 -0.5716 -0.3233
+-2.772 -1.931 1.092 -0.5716 -0.3702
+-2.831 -1.972 1.094 -0.5716 -0.4161
+-2.884 -2.009 1.092 -0.5716 -0.4611
+-2.932 -2.042 1.085 -0.5716 -0.5048
+-2.973 -2.071 1.073 -0.5716 -0.5474
+-3.008 -2.095 1.056 -0.5716 -0.5885
+-3.036 -2.115 1.035 -0.5716 -0.6282
+-3.056 -2.129 1.009 -0.5716 -0.6663
+-3.07 -2.138 0.9783 -0.5716 -0.7027
+-3.076 -2.142 0.9428 -0.5716 -0.7374
+-3.074 -2.141 0.9028 -0.5716 -0.7702
+-3.065 -2.135 0.8582 -0.5716 -0.8011
+-3.049 -2.124 0.8094 -0.5716 -0.8301
+-3.027 -2.108 0.7565 -0.5716 -0.8569
+-2.997 -2.088 0.6996 -0.5716 -0.8816
+-2.962 -2.063 0.6392 -0.5716 -0.9041
+-2.92 -2.034 0.5755 -0.5716 -0.9243
+-2.874 -2.002 0.5087 -0.5716 -0.9422
+-2.822 -1.966 0.4392 -0.5716 -0.9578
+-2.767 -1.927 0.3674 -0.5716 -0.971
+-2.708 -1.886 0.2937 -0.5716 -0.9817
+-2.646 -1.843 0.2183 -0.5716 -0.99
+-2.582 -1.798 0.1418 -0.5716 -0.9958
+-2.517 -1.753 0.06456 -0.5716 -0.9991
+-2.451 -1.707 -0.01306 -0.5716 -1
+-2.385 -1.661 -0.0906 -0.5716 -0.9983
+-2.32 -1.616 -0.1677 -0.5716 -0.9941
+-2.257 -1.572 -0.2438 -0.5716 -0.9875
+-2.196 -1.529 -0.3187 -0.5716 -0.9784
+-2.138 -1.489 -0.3918 -0.5716 -0.9668
+-2.083 -1.451 -0.4629 -0.5716 -0.9528
+-2.034 -1.416 -0.5315 -0.5716 -0.9365
+-1.989 -1.385 -0.5973 -0.5716 -0.9178
+-1.949 -1.358 -0.6599 -0.5716 -0.8968
+-1.916 -1.334 -0.7192 -0.5716 -0.8735
+-1.888 -1.315 -0.7747 -0.5716 -0.8481
+-1.868 -1.301 -0.8263 -0.5716 -0.8206
+-1.854 -1.292 -0.8737 -0.5716 -0.791
+-1.848 -1.287 -0.9167 -0.5716 -0.7594
+-1.849 -1.288 -0.9553 -0.5716 -0.7259
+-1.857 -1.294 -0.9892 -0.5716 -0.6907
+-1.873 -1.305 -1.018 -0.5716 -0.6536
+-1.896 -1.321 -1.043 -0.5716 -0.615
+-1.926 -1.342 -1.062 -0.5716 -0.5748
+-1.963 -1.368 -1.077 -0.5716 -0.5332
+-2.007 -1.398 -1.088 -0.5716 -0.4903
+-2.057 -1.432 -1.093 -0.5716 -0.4461
+-2.112 -1.471 -1.094 -0.5716 -0.4008
+-2.172 -1.513 -1.091 -0.5716 -0.3545
+-2.238 -1.559 -1.083 -0.5716 -0.3073
+-2.307 -1.607 -1.072 -0.5716 -0.2594
+-2.379 -1.657 -1.056 -0.5716 -0.2108
+-2.454 -1.71 -1.037 -0.5716 -0.1617
+-2.531 -1.763 -1.015 -0.5716 -0.1122
+-2.61 -1.818 -0.9895 -0.5716 -0.06235
+-2.688 -1.872 -0.9614 -0.5716 -0.01239
+-2.766 -1.927 -0.9309 -0.5716 0.0376
+-2.843 -1.98 -0.8982 -0.5716 0.0875
+-2.918 -2.032 -0.8637 -0.5716 0.1372
+-2.99 -2.083 -0.8276 -0.5716 0.1865
+-3.059 -2.131 -0.7902 -0.5716 0.2354
+-3.123 -2.176 -0.7519 -0.5716 0.2837
+-3.183 -2.217 -0.713 -0.5716 0.3312
+-3.237 -2.255 -0.6737 -0.5716 0.378
+-3.285 -2.288 -0.6342 -0.5716 0.4238
+-3.327 -2.317 -0.5949 -0.5716 0.4685
+-3.361 -2.341 -0.556 -0.5716 0.5121
+-3.389 -2.36 -0.5177 -0.5716 0.5544
+-3.408 -2.374 -0.4801 -0.5716 0.5953
+-3.42 -2.382 -0.4435 -0.5716 0.6347
+-3.423 -2.384 -0.4079 -0.5716 0.6725
+-3.418 -2.381 -0.3736 -0.5716 0.7087
+-3.405 -2.372 -0.3406 -0.5716 0.743
+-3.383 -2.357 -0.309 -0.5716 0.7756
+-3.354 -2.336 -0.2788 -0.5716 0.8061
+-3.317 -2.31 -0.25 -0.5716 0.8347
+-3.272 -2.279 -0.2227 -0.5716 0.8612
+-3.22 -2.243 -0.1968 -0.5716 0.8855
+-3.161 -2.202 -0.1723 -0.5716 0.9076
+-3.097 -2.157 -0.149 -0.5716 0.9275
+-3.026 -2.108 -0.1269 -0.5716 0.945
+-2.95 -2.055 -0.1059 -0.5716 0.9602
+-2.87 -1.999 -0.08578 -0.5716 0.9729
+-2.787 -1.941 -0.0665 -0.5716 0.9833
+-2.7 -1.881 -0.04785 -0.5716 0.9911
+-2.612 -1.819 -0.02967 -0.5716 0.9965
+-2.522 -1.757 -0.01179 -0.5716 0.9994
+-2.373 -1.836 0 -0.6119 1
+-2.285 -1.768 0.01502 -0.6119 0.9988
+-2.199 -1.701 0.03024 -0.6119 0.995
+-2.113 -1.635 0.04587 -0.6119 0.9888
+-2.031 -1.571 0.06211 -0.6119 0.9801
+-1.951 -1.509 0.07913 -0.6119 0.9689
+-1.875 -1.45 0.09711 -0.6119 0.9553
+-1.803 -1.395 0.1162 -0.6119 0.9394
+-1.736 -1.343 0.1366 -0.6119 0.9211
+-1.675 -1.296 0.1584 -0.6119 0.9004
+-1.62 -1.254 0.1816 -0.6119 0.8776
+-1.572 -1.216 0.2065 -0.6119 0.8525
+-1.531 -1.184 0.233 -0.6119 0.8253
+-1.497 -1.158 0.2612 -0.6119 0.7961
+-1.471 -1.138 0.291 -0.6119 0.7648
+-1.452 -1.123 0.3226 -0.6119 0.7317
+-1.441 -1.115 0.3557 -0.6119 0.6967
+-1.439 -1.113 0.3903 -0.6119 0.66
+-1.444 -1.117 0.4264 -0.6119 0.6216
+-1.457 -1.127 0.4638 -0.6119 0.5817
+-1.477 -1.143 0.5023 -0.6119 0.5403
+-1.505 -1.164 0.5418 -0.6119 0.4976
+-1.54 -1.191 0.582 -0.6119 0.4536
+-1.581 -1.223 0.6227 -0.6119 0.4085
+-1.629 -1.26 0.6636 -0.6119 0.3624
+-1.682 -1.301 0.7045 -0.6119 0.3153
+-1.741 -1.346 0.7452 -0.6119 0.2675
+-1.804 -1.395 0.7852 -0.6119 0.219
+-1.87 -1.447 0.8242 -0.6119 0.17
+-1.94 -1.501 0.8621 -0.6119 0.1205
+-2.012 -1.557 0.8983 -0.6119 0.07074
+-2.086 -1.614 0.9327 -0.6119 0.02079
+-2.161 -1.672 0.9648 -0.6119 -0.0292
+-2.236 -1.73 0.9943 -0.6119 -0.07912
+-2.311 -1.787 1.021 -0.6119 -0.1288
+-2.384 -1.844 1.045 -0.6119 -0.1782
+-2.455 -1.899 1.065 -0.6119 -0.2272
+-2.524 -1.952 1.081 -0.6119 -0.2756
+-2.589 -2.003 1.093 -0.6119 -0.3233
+-2.65 -2.05 1.101 -0.6119 -0.3702
+-2.707 -2.094 1.105 -0.6119 -0.4161
+-2.758 -2.134 1.104 -0.6119 -0.4611
+-2.805 -2.169 1.099 -0.6119 -0.5048
+-2.845 -2.2 1.088 -0.6119 -0.5474
+-2.878 -2.227 1.073 -0.6119 -0.5885
+-2.906 -2.248 1.052 -0.6119 -0.6282
+-2.926 -2.263 1.027 -0.6119 -0.6663
+-2.939 -2.274 0.9965 -0.6119 -0.7027
+-2.946 -2.279 0.9612 -0.6119 -0.7374
+-2.945 -2.278 0.9211 -0.6119 -0.7702
+-2.938 -2.272 0.8763 -0.6119 -0.8011
+-2.923 -2.261 0.827 -0.6119 -0.8301
+-2.902 -2.245 0.7734 -0.6119 -0.8569
+-2.875 -2.224 0.7157 -0.6119 -0.8816
+-2.842 -2.198 0.6543 -0.6119 -0.9041
+-2.803 -2.169 0.5893 -0.6119 -0.9243
+-2.76 -2.135 0.5211 -0.6119 -0.9422
+-2.712 -2.098 0.4501 -0.6119 -0.9578
+-2.659 -2.057 0.3766 -0.6119 -0.971
+-2.604 -2.014 0.3011 -0.6119 -0.9817
+-2.546 -1.969 0.2239 -0.6119 -0.99
+-2.486 -1.923 0.1454 -0.6119 -0.9958
+-2.424 -1.875 0.06621 -0.6119 -0.9991
+-2.362 -1.828 -0.01339 -0.6119 -1
+-2.301 -1.78 -0.09292 -0.6119 -0.9983
+-2.24 -1.732 -0.1719 -0.6119 -0.9941
+-2.18 -1.686 -0.25 -0.6119 -0.9875
+-2.123 -1.642 -0.3267 -0.6119 -0.9784
+-2.068 -1.6 -0.4016 -0.6119 -0.9668
+-2.018 -1.561 -0.4742 -0.6119 -0.9528
+-1.971 -1.525 -0.5443 -0.6119 -0.9365
+-1.929 -1.492 -0.6115 -0.6119 -0.9178
+-1.892 -1.464 -0.6753 -0.6119 -0.8968
+-1.861 -1.439 -0.7356 -0.6119 -0.8735
+-1.836 -1.42 -0.7919 -0.6119 -0.8481
+-1.817 -1.406 -0.8441 -0.6119 -0.8206
+-1.805 -1.396 -0.8919 -0.6119 -0.791
+-1.8 -1.392 -0.9352 -0.6119 -0.7594
+-1.801 -1.393 -0.9737 -0.6119 -0.7259
+-1.81 -1.4 -1.007 -0.6119 -0.6907
+-1.826 -1.412 -1.036 -0.6119 -0.6536
+-1.849 -1.43 -1.06 -0.6119 -0.615
+-1.878 -1.453 -1.078 -0.6119 -0.5748
+-1.914 -1.481 -1.092 -0.6119 -0.5332
+-1.956 -1.513 -1.101 -0.6119 -0.4903
+-2.004 -1.55 -1.105 -0.6119 -0.4461
+-2.057 -1.592 -1.104 -0.6119 -0.4008
+-2.116 -1.637 -1.099 -0.6119 -0.3545
+-2.178 -1.685 -1.09 -0.6119 -0.3073
+-2.245 -1.737 -1.076 -0.6119 -0.2594
+-2.314 -1.79 -1.058 -0.6119 -0.2108
+-2.386 -1.846 -1.037 -0.6119 -0.1617
+-2.46 -1.903 -1.012 -0.6119 -0.1122
+-2.535 -1.961 -0.9847 -0.6119 -0.06235
+-2.61 -2.019 -0.9542 -0.6119 -0.01239
+-2.685 -2.077 -0.9213 -0.6119 0.0376
+-2.758 -2.134 -0.8863 -0.6119 0.0875
+-2.83 -2.189 -0.8495 -0.6119 0.1372
+-2.898 -2.242 -0.8112 -0.6119 0.1865
+-2.964 -2.293 -0.7718 -0.6119 0.2354
+-3.025 -2.34 -0.7316 -0.6119 0.2837
+-3.082 -2.384 -0.6908 -0.6119 0.3312
+-3.133 -2.424 -0.6498 -0.6119 0.378
+-3.179 -2.459 -0.6089 -0.6119 0.4238
+-3.218 -2.49 -0.5684 -0.6119 0.4685
+-3.251 -2.515 -0.5284 -0.6119 0.5121
+-3.276 -2.534 -0.4893 -0.6119 0.5544
+-3.294 -2.548 -0.4511 -0.6119 0.5953
+-3.305 -2.556 -0.4141 -0.6119 0.6347
+-3.307 -2.558 -0.3785 -0.6119 0.6725
+-3.302 -2.554 -0.3444 -0.6119 0.7087
+-3.288 -2.544 -0.3118 -0.6119 0.743
+-3.267 -2.527 -0.2808 -0.6119 0.7756
+-3.238 -2.505 -0.2515 -0.6119 0.8061
+-3.202 -2.477 -0.2239 -0.6119 0.8347
+-3.158 -2.443 -0.198 -0.6119 0.8612
+-3.108 -2.404 -0.1736 -0.6119 0.8855
+-3.051 -2.36 -0.1509 -0.6119 0.9076
+-2.988 -2.311 -0.1296 -0.6119 0.9275
+-2.919 -2.258 -0.1097 -0.6119 0.945
+-2.846 -2.202 -0.09094 -0.6119 0.9602
+-2.769 -2.142 -0.0733 -0.6119 0.9729
+-2.688 -2.079 -0.05657 -0.6119 0.9833
+-2.604 -2.014 -0.04056 -0.6119 0.9911
+-2.518 -1.948 -0.02509 -0.6119 0.9965
+-2.431 -1.881 -0.009956 -0.6119 0.9994
+-2.278 -1.952 0 -0.6506 1
+-2.194 -1.88 0.01225 -0.6506 0.9988
+-2.11 -1.808 0.02473 -0.6506 0.995
+-2.028 -1.738 0.03766 -0.6506 0.9888
+-1.949 -1.669 0.05127 -0.6506 0.9801
+-1.872 -1.603 0.06576 -0.6506 0.9689
+-1.798 -1.541 0.08133 -0.6506 0.9553
+-1.729 -1.481 0.09817 -0.6506 0.9394
+-1.665 -1.426 0.1164 -0.6506 0.9211
+-1.606 -1.376 0.1363 -0.6506 0.9004
+-1.553 -1.33 0.1578 -0.6506 0.8776
+-1.506 -1.29 0.1811 -0.6506 0.8525
+-1.466 -1.256 0.2063 -0.6506 0.8253
+-1.432 -1.227 0.2334 -0.6506 0.7961
+-1.407 -1.205 0.2624 -0.6506 0.7648
+-1.388 -1.189 0.2933 -0.6506 0.7317
+-1.377 -1.18 0.3261 -0.6506 0.6967
+-1.374 -1.177 0.3607 -0.6506 0.66
+-1.378 -1.181 0.3969 -0.6506 0.6216
+-1.39 -1.191 0.4347 -0.6506 0.5817
+-1.409 -1.207 0.4739 -0.6506 0.5403
+-1.435 -1.229 0.5142 -0.6506 0.4976
+-1.468 -1.257 0.5555 -0.6506 0.4536
+-1.507 -1.291 0.5975 -0.6506 0.4085
+-1.552 -1.329 0.6399 -0.6506 0.3624
+-1.602 -1.373 0.6825 -0.6506 0.3153
+-1.657 -1.42 0.7249 -0.6506 0.2675
+-1.717 -1.471 0.7669 -0.6506 0.219
+-1.78 -1.525 0.8081 -0.6506 0.17
+-1.846 -1.582 0.8481 -0.6506 0.1205
+-1.915 -1.641 0.8866 -0.6506 0.07074
+-1.985 -1.701 0.9233 -0.6506 0.02079
+-2.056 -1.762 0.9578 -0.6506 -0.0292
+-2.128 -1.823 0.9897 -0.6506 -0.07912
+-2.199 -1.884 1.019 -0.6506 -0.1288
+-2.269 -1.944 1.045 -0.6506 -0.1782
+-2.337 -2.002 1.067 -0.6506 -0.2272
+-2.402 -2.058 1.085 -0.6506 -0.2756
+-2.465 -2.112 1.1 -0.6506 -0.3233
+-2.523 -2.162 1.11 -0.6506 -0.3702
+-2.578 -2.209 1.115 -0.6506 -0.4161
+-2.627 -2.251 1.116 -0.6506 -0.4611
+-2.672 -2.289 1.112 -0.6506 -0.5048
+-2.71 -2.322 1.103 -0.6506 -0.5474
+-2.743 -2.35 1.088 -0.6506 -0.5885
+-2.77 -2.373 1.069 -0.6506 -0.6282
+-2.79 -2.39 1.044 -0.6506 -0.6663
+-2.803 -2.402 1.014 -0.6506 -0.7027
+-2.81 -2.407 0.979 -0.6506 -0.7374
+-2.81 -2.407 0.9389 -0.6506 -0.7702
+-2.804 -2.402 0.8939 -0.6506 -0.8011
+-2.791 -2.391 0.8442 -0.6506 -0.8301
+-2.772 -2.375 0.7899 -0.6506 -0.8569
+-2.747 -2.353 0.7314 -0.6506 -0.8816
+-2.716 -2.327 0.6689 -0.6506 -0.9041
+-2.68 -2.296 0.6027 -0.6506 -0.9243
+-2.64 -2.262 0.5331 -0.6506 -0.9422
+-2.595 -2.223 0.4606 -0.6506 -0.9578
+-2.546 -2.181 0.3855 -0.6506 -0.971
+-2.494 -2.137 0.3083 -0.6506 -0.9817
+-2.44 -2.091 0.2293 -0.6506 -0.99
+-2.384 -2.042 0.149 -0.6506 -0.9958
+-2.326 -1.993 0.06782 -0.6506 -0.9991
+-2.268 -1.944 -0.01372 -0.6506 -1
+-2.211 -1.894 -0.09517 -0.6506 -0.9983
+-2.153 -1.845 -0.1761 -0.6506 -0.9941
+-2.098 -1.797 -0.256 -0.6506 -0.9875
+-2.044 -1.752 -0.3345 -0.6506 -0.9784
+-1.994 -1.708 -0.4111 -0.6506 -0.9668
+-1.946 -1.667 -0.4853 -0.6506 -0.9528
+-1.903 -1.63 -0.5569 -0.6506 -0.9365
+-1.864 -1.597 -0.6253 -0.6506 -0.9178
+-1.829 -1.567 -0.6903 -0.6506 -0.8968
+-1.801 -1.543 -0.7515 -0.6506 -0.8735
+-1.778 -1.523 -0.8087 -0.6506 -0.8481
+-1.761 -1.508 -0.8614 -0.6506 -0.8206
+-1.75 -1.499 -0.9096 -0.6506 -0.791
+-1.746 -1.496 -0.953 -0.6506 -0.7594
+-1.748 -1.498 -0.9914 -0.6506 -0.7259
+-1.757 -1.505 -1.025 -0.6506 -0.6907
+-1.773 -1.519 -1.053 -0.6506 -0.6536
+-1.795 -1.538 -1.076 -0.6506 -0.615
+-1.824 -1.562 -1.094 -0.6506 -0.5748
+-1.858 -1.592 -1.106 -0.6506 -0.5332
+-1.899 -1.627 -1.114 -0.6506 -0.4903
+-1.945 -1.667 -1.116 -0.6506 -0.4461
+-1.996 -1.71 -1.114 -0.6506 -0.4008
+-2.052 -1.758 -1.107 -0.6506 -0.3545
+-2.112 -1.81 -1.095 -0.6506 -0.3073
+-2.176 -1.864 -1.08 -0.6506 -0.2594
+-2.242 -1.921 -1.06 -0.6506 -0.2108
+-2.311 -1.98 -1.036 -0.6506 -0.1617
+-2.381 -2.04 -1.009 -0.6506 -0.1122
+-2.452 -2.101 -0.9793 -0.6506 -0.06235
+-2.524 -2.162 -0.9464 -0.6506 -0.01239
+-2.595 -2.223 -0.9112 -0.6506 0.0376
+-2.665 -2.283 -0.8739 -0.6506 0.0875
+-2.733 -2.341 -0.8348 -0.6506 0.1372
+-2.798 -2.397 -0.7944 -0.6506 0.1865
+-2.86 -2.45 -0.7529 -0.6506 0.2354
+-2.918 -2.5 -0.7107 -0.6506 0.2837
+-2.972 -2.546 -0.6682 -0.6506 0.3312
+-3.021 -2.588 -0.6256 -0.6506 0.378
+-3.064 -2.625 -0.5833 -0.6506 0.4238
+-3.101 -2.656 -0.5415 -0.6506 0.4685
+-3.131 -2.683 -0.5005 -0.6506 0.5121
+-3.155 -2.703 -0.4605 -0.6506 0.5544
+-3.171 -2.717 -0.4218 -0.6506 0.5953
+-3.18 -2.725 -0.3846 -0.6506 0.6347
+-3.182 -2.726 -0.3489 -0.6506 0.6725
+-3.176 -2.721 -0.3149 -0.6506 0.7087
+-3.163 -2.71 -0.2827 -0.6506 0.743
+-3.142 -2.692 -0.2525 -0.6506 0.7756
+-3.114 -2.668 -0.2241 -0.6506 0.8061
+-3.078 -2.637 -0.1976 -0.6506 0.8347
+-3.036 -2.601 -0.1731 -0.6506 0.8612
+-2.987 -2.559 -0.1504 -0.6506 0.8855
+-2.931 -2.512 -0.1294 -0.6506 0.9076
+-2.871 -2.459 -0.1101 -0.6506 0.9275
+-2.805 -2.403 -0.09236 -0.6506 0.945
+-2.734 -2.342 -0.07596 -0.6506 0.9602
+-2.659 -2.278 -0.06078 -0.6506 0.9729
+-2.581 -2.212 -0.0466 -0.6506 0.9833
+-2.501 -2.142 -0.03325 -0.6506 0.9911
+-2.418 -2.072 -0.02049 -0.6506 0.9965
+-2.334 -2 -0.008116 -0.6506 0.9994
+-2.178 -2.063 0 -0.6878 1
+-2.097 -1.987 0.009472 -0.6878 0.9988
+-2.017 -1.911 0.0192 -0.6878 0.995
+-1.938 -1.836 0.02943 -0.6878 0.9888
+-1.862 -1.764 0.0404 -0.6878 0.9801
+-1.788 -1.694 0.05235 -0.6878 0.9689
+-1.718 -1.627 0.06551 -0.6878 0.9553
+-1.651 -1.564 0.08006 -0.6878 0.9394
+-1.589 -1.506 0.0962 -0.6878 0.9211
+-1.533 -1.452 0.1141 -0.6878 0.9004
+-1.482 -1.404 0.1339 -0.6878 0.8776
+-1.436 -1.361 0.1556 -0.6878 0.8525
+-1.398 -1.324 0.1795 -0.6878 0.8253
+-1.365 -1.294 0.2055 -0.6878 0.7961
+-1.34 -1.27 0.2337 -0.6878 0.7648
+-1.322 -1.252 0.264 -0.6878 0.7317
+-1.311 -1.242 0.2964 -0.6878 0.6967
+-1.307 -1.238 0.3308 -0.6878 0.66
+-1.311 -1.242 0.3672 -0.6878 0.6216
+-1.321 -1.252 0.4053 -0.6878 0.5817
+-1.338 -1.268 0.4451 -0.6878 0.5403
+-1.363 -1.291 0.4863 -0.6878 0.4976
+-1.393 -1.32 0.5286 -0.6878 0.4536
+-1.43 -1.354 0.5719 -0.6878 0.4085
+-1.472 -1.394 0.6158 -0.6878 0.3624
+-1.519 -1.439 0.66 -0.6878 0.3153
+-1.571 -1.489 0.7043 -0.6878 0.2675
+-1.627 -1.542 0.7482 -0.6878 0.219
+-1.687 -1.598 0.7914 -0.6878 0.17
+-1.75 -1.658 0.8336 -0.6878 0.1205
+-1.815 -1.719 0.8744 -0.6878 0.07074
+-1.881 -1.782 0.9134 -0.6878 0.02079
+-1.949 -1.846 0.9502 -0.6878 -0.0292
+-2.016 -1.91 0.9844 -0.6878 -0.07912
+-2.084 -1.974 1.016 -0.6878 -0.1288
+-2.15 -2.037 1.044 -0.6878 -0.1782
+-2.215 -2.098 1.068 -0.6878 -0.2272
+-2.277 -2.157 1.089 -0.6878 -0.2756
+-2.336 -2.213 1.106 -0.6878 -0.3233
+-2.392 -2.266 1.118 -0.6878 -0.3702
+-2.444 -2.315 1.125 -0.6878 -0.4161
+-2.491 -2.36 1.127 -0.6878 -0.4611
+-2.534 -2.4 1.125 -0.6878 -0.5048
+-2.571 -2.436 1.117 -0.6878 -0.5474
+-2.602 -2.465 1.103 -0.6878 -0.5885
+-2.628 -2.49 1.085 -0.6878 -0.6282
+-2.648 -2.508 1.061 -0.6878 -0.6663
+-2.661 -2.521 1.031 -0.6878 -0.7027
+-2.668 -2.528 0.9962 -0.6878 -0.7374
+-2.669 -2.529 0.9561 -0.6878 -0.7702
+-2.664 -2.524 0.9109 -0.6878 -0.8011
+-2.652 -2.513 0.8608 -0.6878 -0.8301
+-2.635 -2.496 0.8059 -0.6878 -0.8569
+-2.612 -2.475 0.7466 -0.6878 -0.8816
+-2.584 -2.448 0.6831 -0.6878 -0.9041
+-2.551 -2.417 0.6157 -0.6878 -0.9243
+-2.513 -2.381 0.5449 -0.6878 -0.9422
+-2.472 -2.342 0.4709 -0.6878 -0.9578
+-2.427 -2.299 0.3942 -0.6878 -0.971
+-2.379 -2.254 0.3153 -0.6878 -0.9817
+-2.328 -2.206 0.2345 -0.6878 -0.99
+-2.276 -2.156 0.1524 -0.6878 -0.9958
+-2.223 -2.106 0.06938 -0.6878 -0.9991
+-2.169 -2.055 -0.01403 -0.6878 -1
+-2.115 -2.004 -0.09737 -0.6878 -0.9983
+-2.062 -1.953 -0.1801 -0.6878 -0.9941
+-2.01 -1.904 -0.2619 -0.6878 -0.9875
+-1.96 -1.857 -0.3421 -0.6878 -0.9784
+-1.913 -1.813 -0.4203 -0.6878 -0.9668
+-1.869 -1.771 -0.4961 -0.6878 -0.9528
+-1.829 -1.733 -0.5691 -0.6878 -0.9365
+-1.793 -1.699 -0.6388 -0.6878 -0.9178
+-1.761 -1.669 -0.7049 -0.6878 -0.8968
+-1.735 -1.644 -0.767 -0.6878 -0.8735
+-1.714 -1.624 -0.8249 -0.6878 -0.8481
+-1.699 -1.61 -0.8782 -0.6878 -0.8206
+-1.689 -1.601 -0.9267 -0.6878 -0.791
+-1.686 -1.598 -0.9702 -0.6878 -0.7594
+-1.689 -1.6 -1.009 -0.6878 -0.7259
+-1.698 -1.609 -1.042 -0.6878 -0.6907
+-1.714 -1.624 -1.069 -0.6878 -0.6536
+-1.736 -1.644 -1.092 -0.6878 -0.615
+-1.763 -1.671 -1.108 -0.6878 -0.5748
+-1.797 -1.702 -1.12 -0.6878 -0.5332
+-1.836 -1.739 -1.126 -0.6878 -0.4903
+-1.88 -1.781 -1.127 -0.6878 -0.4461
+-1.929 -1.827 -1.123 -0.6878 -0.4008
+-1.982 -1.878 -1.114 -0.6878 -0.3545
+-2.039 -1.932 -1.101 -0.6878 -0.3073
+-2.099 -1.989 -1.083 -0.6878 -0.2594
+-2.163 -2.049 -1.061 -0.6878 -0.2108
+-2.228 -2.111 -1.035 -0.6878 -0.1617
+-2.295 -2.174 -1.006 -0.6878 -0.1122
+-2.362 -2.238 -0.9732 -0.6878 -0.06235
+-2.43 -2.302 -0.9381 -0.6878 -0.01239
+-2.497 -2.366 -0.9005 -0.6878 0.0376
+-2.563 -2.428 -0.8609 -0.6878 0.0875
+-2.627 -2.489 -0.8196 -0.6878 0.1372
+-2.689 -2.548 -0.777 -0.6878 0.1865
+-2.748 -2.603 -0.7335 -0.6878 0.2354
+-2.802 -2.655 -0.6894 -0.6878 0.2837
+-2.853 -2.703 -0.6451 -0.6878 0.3312
+-2.899 -2.746 -0.601 -0.6878 0.378
+-2.939 -2.784 -0.5572 -0.6878 0.4238
+-2.973 -2.817 -0.5142 -0.6878 0.4685
+-3.002 -2.844 -0.4723 -0.6878 0.5121
+-3.024 -2.865 -0.4315 -0.6878 0.5544
+-3.039 -2.879 -0.3923 -0.6878 0.5953
+-3.047 -2.887 -0.3547 -0.6878 0.6347
+-3.048 -2.888 -0.319 -0.6878 0.6725
+-3.042 -2.882 -0.2852 -0.6878 0.7087
+-3.028 -2.869 -0.2535 -0.6878 0.743
+-3.008 -2.85 -0.2239 -0.6878 0.7756
+-2.98 -2.823 -0.1965 -0.6878 0.8061
+-2.946 -2.791 -0.1712 -0.6878 0.8347
+-2.905 -2.752 -0.1481 -0.6878 0.8612
+-2.858 -2.707 -0.127 -0.6878 0.8855
+-2.804 -2.657 -0.1079 -0.6878 0.9076
+-2.746 -2.602 -0.09059 -0.6878 0.9275
+-2.683 -2.541 -0.075 -0.6878 0.945
+-2.615 -2.477 -0.06094 -0.6878 0.9602
+-2.543 -2.409 -0.04821 -0.6878 0.9729
+-2.468 -2.339 -0.03661 -0.6878 0.9833
+-2.391 -2.265 -0.02591 -0.6878 0.9911
+-2.312 -2.19 -0.01588 -0.6878 0.9965
+-2.231 -2.114 -0.006271 -0.6878 0.9994
+-2.072 -2.17 0 -0.7232 1
+-1.995 -2.089 0.006688 -0.7232 0.9988
+-1.919 -2.009 0.01365 -0.7232 0.995
+-1.844 -1.931 0.02117 -0.7232 0.9888
+-1.771 -1.854 0.02951 -0.7232 0.9801
+-1.7 -1.78 0.03892 -0.7232 0.9689
+-1.633 -1.71 0.04964 -0.7232 0.9553
+-1.57 -1.644 0.0619 -0.7232 0.9394
+-1.511 -1.582 0.07591 -0.7232 0.9211
+-1.456 -1.525 0.09184 -0.7232 0.9004
+-1.407 -1.474 0.1099 -0.7232 0.8776
+-1.364 -1.428 0.1301 -0.7232 0.8525
+-1.327 -1.389 0.1526 -0.7232 0.8253
+-1.296 -1.357 0.1775 -0.7232 0.7961
+-1.271 -1.331 0.2047 -0.7232 0.7648
+-1.253 -1.312 0.2344 -0.7232 0.7317
+-1.242 -1.301 0.2664 -0.7232 0.6967
+-1.238 -1.297 0.3007 -0.7232 0.66
+-1.241 -1.299 0.3372 -0.7232 0.6216
+-1.25 -1.309 0.3757 -0.7232 0.5817
+-1.266 -1.326 0.416 -0.7232 0.5403
+-1.288 -1.349 0.458 -0.7232 0.4976
+-1.316 -1.379 0.5014 -0.7232 0.4536
+-1.351 -1.414 0.5459 -0.7232 0.4085
+-1.39 -1.455 0.5913 -0.7232 0.3624
+-1.434 -1.502 0.6371 -0.7232 0.3153
+-1.483 -1.553 0.6832 -0.7232 0.2675
+-1.536 -1.608 0.729 -0.7232 0.219
+-1.592 -1.667 0.7743 -0.7232 0.17
+-1.65 -1.728 0.8186 -0.7232 0.1205
+-1.711 -1.792 0.8616 -0.7232 0.07074
+-1.774 -1.858 0.9029 -0.7232 0.02079
+-1.838 -1.924 0.942 -0.7232 -0.0292
+-1.901 -1.991 0.9786 -0.7232 -0.07912
+-1.965 -2.057 1.012 -0.7232 -0.1288
+-2.027 -2.123 1.043 -0.7232 -0.1782
+-2.088 -2.187 1.069 -0.7232 -0.2272
+-2.147 -2.248 1.092 -0.7232 -0.2756
+-2.203 -2.307 1.111 -0.7232 -0.3233
+-2.256 -2.363 1.125 -0.7232 -0.3702
+-2.306 -2.414 1.134 -0.7232 -0.4161
+-2.351 -2.461 1.138 -0.7232 -0.4611
+-2.391 -2.504 1.136 -0.7232 -0.5048
+-2.426 -2.541 1.13 -0.7232 -0.5474
+-2.457 -2.572 1.118 -0.7232 -0.5885
+-2.481 -2.598 1.1 -0.7232 -0.6282
+-2.5 -2.618 1.076 -0.7232 -0.6663
+-2.514 -2.632 1.047 -0.7232 -0.7027
+-2.521 -2.64 1.013 -0.7232 -0.7374
+-2.523 -2.641 0.9728 -0.7232 -0.7702
+-2.518 -2.637 0.9274 -0.7232 -0.8011
+-2.508 -2.627 0.8769 -0.7232 -0.8301
+-2.493 -2.61 0.8214 -0.7232 -0.8569
+-2.472 -2.589 0.7613 -0.7232 -0.8816
+-2.447 -2.562 0.6969 -0.7232 -0.9041
+-2.416 -2.53 0.6284 -0.7232 -0.9243
+-2.382 -2.494 0.5563 -0.7232 -0.9422
+-2.344 -2.454 0.4809 -0.7232 -0.9578
+-2.302 -2.41 0.4027 -0.7232 -0.971
+-2.258 -2.364 0.3221 -0.7232 -0.9817
+-2.211 -2.315 0.2396 -0.7232 -0.99
+-2.163 -2.265 0.1557 -0.7232 -0.9958
+-2.113 -2.213 0.07091 -0.7232 -0.9991
+-2.064 -2.161 -0.01434 -0.7232 -1
+-2.014 -2.109 -0.09951 -0.7232 -0.9983
+-1.965 -2.057 -0.1841 -0.7232 -0.9941
+-1.917 -2.007 -0.2676 -0.7232 -0.9875
+-1.871 -1.959 -0.3495 -0.7232 -0.9784
+-1.828 -1.914 -0.4293 -0.7232 -0.9668
+-1.787 -1.871 -0.5066 -0.7232 -0.9528
+-1.75 -1.832 -0.5809 -0.7232 -0.9365
+-1.717 -1.798 -0.6518 -0.7232 -0.9178
+-1.688 -1.768 -0.719 -0.7232 -0.8968
+-1.664 -1.743 -0.782 -0.7232 -0.8735
+-1.645 -1.723 -0.8406 -0.7232 -0.8481
+-1.632 -1.708 -0.8944 -0.7232 -0.8206
+-1.624 -1.7 -0.9432 -0.7232 -0.791
+-1.621 -1.698 -0.9868 -0.7232 -0.7594
+-1.625 -1.701 -1.025 -0.7232 -0.7259
+-1.634 -1.711 -1.058 -0.7232 -0.6907
+-1.649 -1.727 -1.085 -0.7232 -0.6536
+-1.67 -1.749 -1.106 -0.7232 -0.615
+-1.697 -1.777 -1.122 -0.7232 -0.5748
+-1.729 -1.81 -1.133 -0.7232 -0.5332
+-1.766 -1.849 -1.137 -0.7232 -0.4903
+-1.808 -1.893 -1.137 -0.7232 -0.4461
+-1.854 -1.942 -1.131 -0.7232 -0.4008
+-1.905 -1.995 -1.12 -0.7232 -0.3545
+-1.959 -2.051 -1.105 -0.7232 -0.3073
+-2.016 -2.111 -1.085 -0.7232 -0.2594
+-2.076 -2.174 -1.061 -0.7232 -0.2108
+-2.137 -2.238 -1.033 -0.7232 -0.1617
+-2.2 -2.304 -1.001 -0.7232 -0.1122
+-2.264 -2.371 -0.9666 -0.7232 -0.06235
+-2.328 -2.437 -0.9291 -0.7232 -0.01239
+-2.391 -2.504 -0.8892 -0.7232 0.0376
+-2.453 -2.569 -0.8473 -0.7232 0.0875
+-2.514 -2.632 -0.8038 -0.7232 0.1372
+-2.572 -2.693 -0.7592 -0.7232 0.1865
+-2.626 -2.75 -0.7136 -0.7232 0.2354
+-2.678 -2.804 -0.6677 -0.7232 0.2837
+-2.725 -2.854 -0.6217 -0.7232 0.3312
+-2.768 -2.898 -0.576 -0.7232 0.378
+-2.805 -2.938 -0.5309 -0.7232 0.4238
+-2.838 -2.971 -0.4867 -0.7232 0.4685
+-2.864 -2.999 -0.4437 -0.7232 0.5121
+-2.884 -3.02 -0.4023 -0.7232 0.5544
+-2.898 -3.034 -0.3625 -0.7232 0.5953
+-2.905 -3.042 -0.3247 -0.7232 0.6347
+-2.905 -3.042 -0.2889 -0.7232 0.6725
+-2.899 -3.035 -0.2554 -0.7232 0.7087
+-2.885 -3.021 -0.2242 -0.7232 0.743
+-2.865 -3 -0.1953 -0.7232 0.7756
+-2.838 -2.972 -0.1688 -0.7232 0.8061
+-2.805 -2.937 -0.1447 -0.7232 0.8347
+-2.766 -2.896 -0.123 -0.7232 0.8612
+-2.721 -2.849 -0.1036 -0.7232 0.8855
+-2.67 -2.796 -0.08626 -0.7232 0.9076
+-2.614 -2.737 -0.07099 -0.7232 0.9275
+-2.553 -2.674 -0.05759 -0.7232 0.945
+-2.489 -2.606 -0.04587 -0.7232 0.9602
+-2.42 -2.534 -0.03562 -0.7232 0.9729
+-2.349 -2.46 -0.0266 -0.7232 0.9833
+-2.275 -2.382 -0.01857 -0.7232 0.9911
+-2.2 -2.303 -0.01126 -0.7232 0.9965
+-2.123 -2.223 -0.004422 -0.7232 0.9994
+-1.961 -2.27 0 -0.7568 1
+-1.888 -2.186 0.003901 -0.7568 0.9988
+-1.816 -2.102 0.008103 -0.7568 0.995
+-1.745 -2.02 0.0129 -0.7568 0.9888
+-1.675 -1.94 0.01859 -0.7568 0.9801
+-1.609 -1.863 0.02545 -0.7568 0.9689
+-1.545 -1.789 0.03374 -0.7568 0.9553
+-1.485 -1.719 0.04371 -0.7568 0.9394
+-1.429 -1.654 0.05557 -0.7568 0.9211
+-1.377 -1.594 0.06953 -0.7568 0.9004
+-1.33 -1.54 0.08576 -0.7568 0.8776
+-1.289 -1.492 0.1044 -0.7568 0.8525
+-1.253 -1.451 0.1256 -0.7568 0.8253
+-1.224 -1.417 0.1493 -0.7568 0.7961
+-1.2 -1.389 0.1757 -0.7568 0.7648
+-1.183 -1.369 0.2047 -0.7568 0.7317
+-1.172 -1.357 0.2363 -0.7568 0.6967
+-1.167 -1.351 0.2705 -0.7568 0.66
+-1.169 -1.354 0.307 -0.7568 0.6216
+-1.177 -1.363 0.3458 -0.7568 0.5817
+-1.192 -1.38 0.3867 -0.7568 0.5403
+-1.212 -1.403 0.4295 -0.7568 0.4976
+-1.238 -1.433 0.4739 -0.7568 0.4536
+-1.269 -1.47 0.5197 -0.7568 0.4085
+-1.306 -1.512 0.5664 -0.7568 0.3624
+-1.347 -1.56 0.6139 -0.7568 0.3153
+-1.392 -1.612 0.6616 -0.7568 0.2675
+-1.442 -1.669 0.7094 -0.7568 0.219
+-1.494 -1.73 0.7567 -0.7568 0.17
+-1.549 -1.793 0.8031 -0.7568 0.1205
+-1.606 -1.859 0.8483 -0.7568 0.07074
+-1.664 -1.927 0.8918 -0.7568 0.02079
+-1.724 -1.996 0.9332 -0.7568 -0.0292
+-1.784 -2.065 0.9721 -0.7568 -0.07912
+-1.843 -2.134 1.008 -0.7568 -0.1288
+-1.902 -2.202 1.041 -0.7568 -0.1782
+-1.959 -2.268 1.07 -0.7568 -0.2272
+-2.014 -2.332 1.095 -0.7568 -0.2756
+-2.067 -2.393 1.115 -0.7568 -0.3233
+-2.117 -2.451 1.131 -0.7568 -0.3702
+-2.163 -2.505 1.142 -0.7568 -0.4161
+-2.206 -2.554 1.147 -0.7568 -0.4611
+-2.244 -2.598 1.148 -0.7568 -0.5048
+-2.278 -2.637 1.142 -0.7568 -0.5474
+-2.307 -2.671 1.131 -0.7568 -0.5885
+-2.33 -2.698 1.114 -0.7568 -0.6282
+-2.349 -2.719 1.092 -0.7568 -0.6663
+-2.362 -2.734 1.063 -0.7568 -0.7027
+-2.369 -2.743 1.029 -0.7568 -0.7374
+-2.371 -2.746 0.9888 -0.7568 -0.7702
+-2.368 -2.742 0.9432 -0.7568 -0.8011
+-2.359 -2.732 0.8924 -0.7568 -0.8301
+-2.346 -2.716 0.8364 -0.7568 -0.8569
+-2.327 -2.694 0.7756 -0.7568 -0.8816
+-2.304 -2.668 0.7102 -0.7568 -0.9041
+-2.276 -2.636 0.6407 -0.7568 -0.9243
+-2.245 -2.599 0.5673 -0.7568 -0.9422
+-2.21 -2.559 0.4906 -0.7568 -0.9578
+-2.172 -2.515 0.4109 -0.7568 -0.971
+-2.131 -2.468 0.3287 -0.7568 -0.9817
+-2.089 -2.418 0.2446 -0.7568 -0.99
+-2.044 -2.367 0.159 -0.7568 -0.9958
+-1.999 -2.314 0.07239 -0.7568 -0.9991
+-1.953 -2.261 -0.01464 -0.7568 -1
+-1.908 -2.209 -0.1016 -0.7568 -0.9983
+-1.863 -2.156 -0.1879 -0.7568 -0.9941
+-1.819 -2.106 -0.2731 -0.7568 -0.9875
+-1.777 -2.057 -0.3566 -0.7568 -0.9784
+-1.737 -2.011 -0.438 -0.7568 -0.9668
+-1.7 -1.968 -0.5167 -0.7568 -0.9528
+-1.666 -1.929 -0.5924 -0.7568 -0.9365
+-1.636 -1.894 -0.6645 -0.7568 -0.9178
+-1.61 -1.864 -0.7327 -0.7568 -0.8968
+-1.588 -1.838 -0.7965 -0.7568 -0.8735
+-1.571 -1.819 -0.8558 -0.7568 -0.8481
+-1.559 -1.805 -0.9101 -0.7568 -0.8206
+-1.552 -1.797 -0.9592 -0.7568 -0.791
+-1.551 -1.795 -1.003 -0.7568 -0.7594
+-1.555 -1.8 -1.041 -0.7568 -0.7259
+-1.564 -1.811 -1.073 -0.7568 -0.6907
+-1.579 -1.828 -1.1 -0.7568 -0.6536
+-1.599 -1.851 -1.121 -0.7568 -0.615
+-1.624 -1.881 -1.136 -0.7568 -0.5748
+-1.655 -1.916 -1.145 -0.7568 -0.5332
+-1.69 -1.957 -1.148 -0.7568 -0.4903
+-1.73 -2.003 -1.146 -0.7568 -0.4461
+-1.774 -2.054 -1.139 -0.7568 -0.4008
+-1.821 -2.109 -1.126 -0.7568 -0.3545
+-1.872 -2.168 -1.109 -0.7568 -0.3073
+-1.926 -2.23 -1.087 -0.7568 -0.2594
+-1.982 -2.295 -1.06 -0.7568 -0.2108
+-2.04 -2.362 -1.03 -0.7568 -0.1617
+-2.099 -2.43 -0.9963 -0.7568 -0.1122
+-2.158 -2.499 -0.9593 -0.7568 -0.06235
+-2.218 -2.568 -0.9195 -0.7568 -0.01239
+-2.277 -2.637 -0.8774 -0.7568 0.0376
+-2.336 -2.704 -0.8333 -0.7568 0.0875
+-2.392 -2.769 -0.7876 -0.7568 0.1372
+-2.446 -2.832 -0.7408 -0.7568 0.1865
+-2.497 -2.891 -0.6933 -0.7568 0.2354
+-2.545 -2.947 -0.6456 -0.7568 0.2837
+-2.589 -2.998 -0.5978 -0.7568 0.3312
+-2.629 -3.044 -0.5506 -0.7568 0.378
+-2.664 -3.084 -0.5041 -0.7568 0.4238
+-2.693 -3.118 -0.4588 -0.7568 0.4685
+-2.717 -3.146 -0.4149 -0.7568 0.5121
+-2.736 -3.168 -0.3728 -0.7568 0.5544
+-2.748 -3.182 -0.3325 -0.7568 0.5953
+-2.754 -3.189 -0.2945 -0.7568 0.6347
+-2.754 -3.189 -0.2587 -0.7568 0.6725
+-2.747 -3.181 -0.2254 -0.7568 0.7087
+-2.734 -3.166 -0.1947 -0.7568 0.743
+-2.715 -3.143 -0.1665 -0.7568 0.7756
+-2.689 -3.113 -0.141 -0.7568 0.8061
+-2.657 -3.076 -0.1182 -0.7568 0.8347
+-2.62 -3.033 -0.09786 -0.7568 0.8612
+-2.576 -2.983 -0.08004 -0.7568 0.8855
+-2.528 -2.927 -0.06459 -0.7568 0.9076
+-2.475 -2.865 -0.05136 -0.7568 0.9275
+-2.417 -2.799 -0.04015 -0.7568 0.945
+-2.356 -2.728 -0.03078 -0.7568 0.9602
+-2.291 -2.653 -0.023 -0.7568 0.9729
+-2.223 -2.574 -0.01656 -0.7568 0.9833
+-2.154 -2.493 -0.0112 -0.7568 0.9911
+-2.082 -2.411 -0.006637 -0.7568 0.9965
+-2.009 -2.326 -0.00257 -0.7568 0.9994
+-1.845 -2.366 0 -0.7885 1
+-1.776 -2.278 0.00111 -0.7885 0.9988
+-1.708 -2.19 0.002546 -0.7885 0.995
+-1.641 -2.104 0.004628 -0.7885 0.9888
+-1.576 -2.021 0.00767 -0.7885 0.9801
+-1.513 -1.94 0.01197 -0.7885 0.9689
+-1.453 -1.863 0.01782 -0.7885 0.9553
+-1.396 -1.79 0.02548 -0.7885 0.9394
+-1.343 -1.723 0.0352 -0.7885 0.9211
+-1.295 -1.66 0.04718 -0.7885 0.9004
+-1.251 -1.603 0.06162 -0.7885 0.8776
+-1.211 -1.553 0.07868 -0.7885 0.8525
+-1.178 -1.51 0.09846 -0.7885 0.8253
+-1.149 -1.473 0.1211 -0.7885 0.7961
+-1.127 -1.444 0.1465 -0.7885 0.7648
+-1.11 -1.423 0.1749 -0.7885 0.7317
+-1.099 -1.409 0.2061 -0.7885 0.6967
+-1.094 -1.403 0.24 -0.7885 0.66
+-1.095 -1.405 0.2766 -0.7885 0.6216
+-1.103 -1.414 0.3158 -0.7885 0.5817
+-1.115 -1.43 0.3572 -0.7885 0.5403
+-1.134 -1.454 0.4007 -0.7885 0.4976
+-1.158 -1.484 0.4461 -0.7885 0.4536
+-1.187 -1.521 0.493 -0.7885 0.4085
+-1.22 -1.565 0.5412 -0.7885 0.3624
+-1.258 -1.613 0.5902 -0.7885 0.3153
+-1.3 -1.667 0.6397 -0.7885 0.2675
+-1.346 -1.725 0.6893 -0.7885 0.219
+-1.394 -1.787 0.7386 -0.7885 0.17
+-1.445 -1.853 0.7871 -0.7885 0.1205
+-1.498 -1.92 0.8344 -0.7885 0.07074
+-1.552 -1.99 0.8802 -0.7885 0.02079
+-1.608 -2.061 0.9238 -0.7885 -0.0292
+-1.663 -2.132 0.965 -0.7885 -0.07912
+-1.719 -2.204 1.003 -0.7885 -0.1288
+-1.773 -2.274 1.038 -0.7885 -0.1782
+-1.827 -2.342 1.069 -0.7885 -0.2272
+-1.878 -2.408 1.096 -0.7885 -0.2756
+-1.928 -2.472 1.119 -0.7885 -0.3233
+-1.974 -2.532 1.137 -0.7885 -0.3702
+-2.018 -2.587 1.149 -0.7885 -0.4161
+-2.058 -2.638 1.156 -0.7885 -0.4611
+-2.094 -2.685 1.158 -0.7885 -0.5048
+-2.126 -2.725 1.154 -0.7885 -0.5474
+-2.153 -2.76 1.144 -0.7885 -0.5885
+-2.175 -2.789 1.128 -0.7885 -0.6282
+-2.193 -2.812 1.106 -0.7885 -0.6663
+-2.206 -2.828 1.078 -0.7885 -0.7027
+-2.213 -2.838 1.044 -0.7885 -0.7374
+-2.216 -2.841 1.004 -0.7885 -0.7702
+-2.213 -2.838 0.9585 -0.7885 -0.8011
+-2.206 -2.829 0.9073 -0.7885 -0.8301
+-2.194 -2.813 0.8508 -0.7885 -0.8569
+-2.178 -2.792 0.7893 -0.7885 -0.8816
+-2.157 -2.765 0.7231 -0.7885 -0.9041
+-2.132 -2.733 0.6525 -0.7885 -0.9243
+-2.103 -2.697 0.578 -0.7885 -0.9422
+-2.072 -2.656 0.4999 -0.7885 -0.9578
+-2.037 -2.612 0.4188 -0.7885 -0.971
+-2 -2.565 0.3352 -0.7885 -0.9817
+-1.961 -2.515 0.2494 -0.7885 -0.99
+-1.921 -2.463 0.1621 -0.7885 -0.9958
+-1.88 -2.41 0.07382 -0.7885 -0.9991
+-1.838 -2.357 -0.01493 -0.7885 -1
+-1.796 -2.303 -0.1036 -0.7885 -0.9983
+-1.755 -2.251 -0.1916 -0.7885 -0.9941
+-1.715 -2.199 -0.2784 -0.7885 -0.9875
+-1.677 -2.15 -0.3636 -0.7885 -0.9784
+-1.641 -2.104 -0.4464 -0.7885 -0.9668
+-1.607 -2.061 -0.5266 -0.7885 -0.9528
+-1.577 -2.021 -0.6035 -0.7885 -0.9365
+-1.549 -1.986 -0.6767 -0.7885 -0.9178
+-1.526 -1.956 -0.7459 -0.7885 -0.8968
+-1.506 -1.931 -0.8106 -0.7885 -0.8735
+-1.491 -1.912 -0.8704 -0.7885 -0.8481
+-1.481 -1.899 -0.9252 -0.7885 -0.8206
+-1.475 -1.891 -0.9745 -0.7885 -0.791
+-1.474 -1.89 -1.018 -0.7885 -0.7594
+-1.479 -1.896 -1.056 -0.7885 -0.7259
+-1.488 -1.908 -1.088 -0.7885 -0.6907
+-1.502 -1.926 -1.114 -0.7885 -0.6536
+-1.522 -1.951 -1.134 -0.7885 -0.615
+-1.546 -1.982 -1.148 -0.7885 -0.5748
+-1.575 -2.019 -1.156 -0.7885 -0.5332
+-1.608 -2.062 -1.158 -0.7885 -0.4903
+-1.645 -2.109 -1.155 -0.7885 -0.4461
+-1.686 -2.162 -1.145 -0.7885 -0.4008
+-1.731 -2.219 -1.131 -0.7885 -0.3545
+-1.779 -2.28 -1.112 -0.7885 -0.3073
+-1.829 -2.345 -1.088 -0.7885 -0.2594
+-1.881 -2.412 -1.059 -0.7885 -0.2108
+-1.935 -2.481 -1.027 -0.7885 -0.1617
+-1.99 -2.551 -0.9907 -0.7885 -0.1122
+-2.046 -2.623 -0.9515 -0.7885 -0.06235
+-2.101 -2.694 -0.9094 -0.7885 -0.01239
+-2.156 -2.765 -0.865 -0.7885 0.0376
+-2.21 -2.834 -0.8187 -0.7885 0.0875
+-2.262 -2.901 -0.7709 -0.7885 0.1372
+-2.313 -2.965 -0.7221 -0.7885 0.1865
+-2.36 -3.026 -0.6726 -0.7885 0.2354
+-2.404 -3.083 -0.623 -0.7885 0.2837
+-2.445 -3.135 -0.5736 -0.7885 0.3312
+-2.482 -3.182 -0.5249 -0.7885 0.378
+-2.514 -3.223 -0.4771 -0.7885 0.4238
+-2.541 -3.258 -0.4307 -0.7885 0.4685
+-2.563 -3.286 -0.3859 -0.7885 0.5121
+-2.58 -3.307 -0.343 -0.7885 0.5544
+-2.591 -3.321 -0.3023 -0.7885 0.5953
+-2.596 -3.328 -0.264 -0.7885 0.6347
+-2.595 -3.327 -0.2283 -0.7885 0.6725
+-2.588 -3.318 -0.1953 -0.7885 0.7087
+-2.575 -3.302 -0.165 -0.7885 0.743
+-2.556 -3.278 -0.1377 -0.7885 0.7756
+-2.532 -3.246 -0.1131 -0.7885 0.8061
+-2.502 -3.208 -0.0915 -0.7885 0.8347
+-2.466 -3.162 -0.07264 -0.7885 0.8612
+-2.425 -3.109 -0.05648 -0.7885 0.8855
+-2.379 -3.051 -0.04289 -0.7885 0.9076
+-2.329 -2.986 -0.03169 -0.7885 0.9275
+-2.275 -2.917 -0.02269 -0.7885 0.945
+-2.217 -2.842 -0.01567 -0.7885 0.9602
+-2.156 -2.764 -0.01037 -0.7885 0.9729
+-2.092 -2.682 -0.006521 -0.7885 0.9833
+-2.026 -2.598 -0.003836 -0.7885 0.9911
+-1.959 -2.512 -0.002007 -0.7885 0.9965
+-1.891 -2.424 -0.0007167 -0.7885 0.9994
+-1.724 -2.455 0 -0.8183 1
+-1.66 -2.363 -0.001681 -0.8183 0.9988
+-1.597 -2.273 -0.003013 -0.8183 0.995
+-1.534 -2.184 -0.003651 -0.8183 0.9888
+-1.473 -2.097 -0.003258 -0.8183 0.9801
+-1.414 -2.013 -0.001513 -0.8183 0.9689
+-1.358 -1.933 0.001892 -0.8183 0.9553
+-1.305 -1.858 0.007243 -0.8183 0.9394
+-1.255 -1.787 0.0148 -0.8183 0.9211
+-1.21 -1.722 0.0248 -0.8183 0.9004
+-1.168 -1.663 0.03744 -0.8183 0.8776
+-1.131 -1.611 0.0529 -0.8183 0.8525
+-1.099 -1.565 0.0713 -0.8183 0.8253
+-1.073 -1.527 0.09275 -0.8183 0.7961
+-1.051 -1.496 0.1173 -0.8183 0.7648
+-1.035 -1.473 0.1449 -0.8183 0.7317
+-1.024 -1.458 0.1757 -0.8183 0.6967
+-1.02 -1.451 0.2094 -0.8183 0.66
+-1.02 -1.452 0.2461 -0.8183 0.6216
+-1.026 -1.461 0.2855 -0.8183 0.5817
+-1.038 -1.477 0.3274 -0.8183 0.5403
+-1.054 -1.501 0.3717 -0.8183 0.4976
+-1.076 -1.532 0.418 -0.8183 0.4536
+-1.102 -1.569 0.4661 -0.8183 0.4085
+-1.133 -1.613 0.5156 -0.8183 0.3624
+-1.168 -1.662 0.5662 -0.8183 0.3153
+-1.206 -1.717 0.6173 -0.8183 0.2675
+-1.248 -1.776 0.6688 -0.8183 0.219
+-1.292 -1.84 0.72 -0.8183 0.17
+-1.339 -1.907 0.7706 -0.8183 0.1205
+-1.388 -1.976 0.8201 -0.8183 0.07074
+-1.438 -2.047 0.868 -0.8183 0.02079
+-1.489 -2.12 0.9139 -0.8183 -0.0292
+-1.541 -2.193 0.9573 -0.8183 -0.07912
+-1.592 -2.266 0.9978 -0.8183 -0.1288
+-1.643 -2.338 1.035 -0.8183 -0.1782
+-1.692 -2.409 1.068 -0.8183 -0.2272
+-1.74 -2.477 1.097 -0.8183 -0.2756
+-1.786 -2.542 1.122 -0.8183 -0.3233
+-1.829 -2.604 1.141 -0.8183 -0.3702
+-1.87 -2.661 1.156 -0.8183 -0.4161
+-1.907 -2.714 1.165 -0.8183 -0.4611
+-1.94 -2.762 1.168 -0.8183 -0.5048
+-1.97 -2.804 1.165 -0.8183 -0.5474
+-1.996 -2.841 1.156 -0.8183 -0.5885
+-2.017 -2.871 1.141 -0.8183 -0.6282
+-2.034 -2.895 1.12 -0.8183 -0.6663
+-2.046 -2.912 1.092 -0.8183 -0.7027
+-2.054 -2.923 1.059 -0.8183 -0.7374
+-2.057 -2.928 1.019 -0.8183 -0.7702
+-2.055 -2.925 0.9732 -0.8183 -0.8011
+-2.049 -2.917 0.9217 -0.8183 -0.8301
+-2.038 -2.902 0.8648 -0.8183 -0.8569
+-2.024 -2.881 0.8026 -0.8183 -0.8816
+-2.005 -2.855 0.7355 -0.8183 -0.9041
+-1.983 -2.823 0.664 -0.8183 -0.9243
+-1.958 -2.787 0.5883 -0.8183 -0.9422
+-1.929 -2.746 0.509 -0.8183 -0.9578
+-1.898 -2.702 0.4265 -0.8183 -0.971
+-1.865 -2.654 0.3414 -0.8183 -0.9817
+-1.83 -2.604 0.2541 -0.8183 -0.99
+-1.793 -2.553 0.1652 -0.8183 -0.9958
+-1.756 -2.499 0.07521 -0.8183 -0.9991
+-1.718 -2.446 -0.01521 -0.8183 -1
+-1.68 -2.392 -0.1055 -0.8183 -0.9983
+-1.643 -2.339 -0.1952 -0.8183 -0.9941
+-1.607 -2.288 -0.2836 -0.8183 -0.9875
+-1.573 -2.239 -0.3703 -0.8183 -0.9784
+-1.54 -2.192 -0.4546 -0.8183 -0.9668
+-1.51 -2.149 -0.5361 -0.8183 -0.9528
+-1.482 -2.11 -0.6142 -0.8183 -0.9365
+-1.458 -2.075 -0.6885 -0.8183 -0.9178
+-1.437 -2.045 -0.7586 -0.8183 -0.8968
+-1.42 -2.021 -0.8241 -0.8183 -0.8735
+-1.406 -2.002 -0.8845 -0.8183 -0.8481
+-1.398 -1.989 -0.9397 -0.8183 -0.8206
+-1.393 -1.983 -0.9892 -0.8183 -0.791
+-1.393 -1.983 -1.033 -0.8183 -0.7594
+-1.397 -1.989 -1.071 -0.8183 -0.7259
+-1.407 -2.002 -1.102 -0.8183 -0.6907
+-1.42 -2.022 -1.128 -0.8183 -0.6536
+-1.439 -2.048 -1.147 -0.8183 -0.615
+-1.461 -2.08 -1.16 -0.8183 -0.5748
+-1.489 -2.119 -1.167 -0.8183 -0.5332
+-1.52 -2.163 -1.167 -0.8183 -0.4903
+-1.554 -2.213 -1.162 -0.8183 -0.4461
+-1.593 -2.267 -1.152 -0.8183 -0.4008
+-1.634 -2.326 -1.135 -0.8183 -0.3545
+-1.678 -2.389 -1.114 -0.8183 -0.3073
+-1.725 -2.455 -1.088 -0.8183 -0.2594
+-1.773 -2.524 -1.057 -0.8183 -0.2108
+-1.823 -2.595 -1.023 -0.8183 -0.1617
+-1.874 -2.668 -0.9845 -0.8183 -0.1122
+-1.926 -2.741 -0.943 -0.8183 -0.06235
+-1.977 -2.814 -0.8987 -0.8183 -0.01239
+-2.028 -2.886 -0.8521 -0.8183 0.0376
+-2.077 -2.957 -0.8036 -0.8183 0.0875
+-2.126 -3.026 -0.7537 -0.8183 0.1372
+-2.172 -3.092 -0.7028 -0.8183 0.1865
+-2.215 -3.154 -0.6515 -0.8183 0.2354
+-2.256 -3.212 -0.6001 -0.8183 0.2837
+-2.293 -3.265 -0.5491 -0.8183 0.3312
+-2.327 -3.312 -0.4988 -0.8183 0.378
+-2.356 -3.354 -0.4498 -0.8183 0.4238
+-2.381 -3.389 -0.4023 -0.8183 0.4685
+-2.401 -3.418 -0.3566 -0.8183 0.5121
+-2.416 -3.439 -0.3131 -0.8183 0.5544
+-2.425 -3.453 -0.2719 -0.8183 0.5953
+-2.43 -3.459 -0.2334 -0.8183 0.6347
+-2.428 -3.457 -0.1977 -0.8183 0.6725
+-2.422 -3.447 -0.165 -0.8183 0.7087
+-2.409 -3.429 -0.1353 -0.8183 0.743
+-2.391 -3.404 -0.1087 -0.8183 0.7756
+-2.368 -3.371 -0.08519 -0.8183 0.8061
+-2.339 -3.33 -0.06478 -0.8183 0.8347
+-2.306 -3.282 -0.04738 -0.8183 0.8612
+-2.267 -3.228 -0.03289 -0.8183 0.8855
+-2.224 -3.166 -0.02115 -0.8183 0.9076
+-2.177 -3.099 -0.012 -0.8183 0.9275
+-2.126 -3.027 -0.00521 -0.8183 0.945
+-2.072 -2.95 -0.0005437 -0.8183 0.9602
+-2.015 -2.869 0.00227 -0.8183 0.9729
+-1.955 -2.784 0.003526 -0.8183 0.9833
+-1.894 -2.696 0.003534 -0.8183 0.9911
+-1.831 -2.606 0.002625 -0.8183 0.9965
+-1.767 -2.516 0.001137 -0.8183 0.9994
+-1.6 -2.538 0 -0.846 1
+-1.54 -2.444 -0.004471 -0.846 0.9988
+-1.481 -2.35 -0.008569 -0.846 0.995
+-1.423 -2.258 -0.01193 -0.846 0.9888
+-1.367 -2.168 -0.01419 -0.846 0.9801
+-1.312 -2.082 -0.015 -0.846 0.9689
+-1.26 -1.999 -0.01404 -0.846 0.9553
+-1.211 -1.921 -0.011 -0.846 0.9394
+-1.164 -1.847 -0.005603 -0.846 0.9211
+-1.122 -1.78 0.002405 -0.846 0.9004
+-1.083 -1.719 0.01324 -0.846 0.8776
+-1.049 -1.664 0.02709 -0.846 0.8525
+-1.019 -1.617 0.0441 -0.846 0.8253
+-0.9939 -1.577 0.06437 -0.846 0.7961
+-0.9736 -1.545 0.08797 -0.846 0.7648
+-0.9584 -1.521 0.1149 -0.846 0.7317
+-0.9482 -1.504 0.1452 -0.846 0.6967
+-0.9431 -1.496 0.1787 -0.846 0.66
+-0.9432 -1.496 0.2154 -0.846 0.6216
+-0.9483 -1.505 0.255 -0.846 0.5817
+-0.9584 -1.521 0.2975 -0.846 0.5403
+-0.9732 -1.544 0.3425 -0.846 0.4976
+-0.9926 -1.575 0.3897 -0.846 0.4536
+-1.016 -1.613 0.4389 -0.846 0.4085
+-1.044 -1.657 0.4897 -0.846 0.3624
+-1.076 -1.707 0.5418 -0.846 0.3153
+-1.111 -1.762 0.5946 -0.846 0.2675
+-1.149 -1.823 0.6478 -0.846 0.219
+-1.189 -1.887 0.701 -0.846 0.17
+-1.232 -1.955 0.7536 -0.846 0.1205
+-1.277 -2.026 0.8052 -0.846 0.07074
+-1.323 -2.099 0.8553 -0.846 0.02079
+-1.369 -2.173 0.9034 -0.846 -0.0292
+-1.416 -2.247 0.949 -0.846 -0.07912
+-1.463 -2.322 0.9917 -0.846 -0.1288
+-1.51 -2.396 1.031 -0.846 -0.1782
+-1.555 -2.468 1.066 -0.846 -0.2272
+-1.599 -2.538 1.098 -0.846 -0.2756
+-1.642 -2.604 1.124 -0.846 -0.3233
+-1.681 -2.668 1.146 -0.846 -0.3702
+-1.719 -2.727 1.162 -0.846 -0.4161
+-1.753 -2.781 1.172 -0.846 -0.4611
+-1.784 -2.831 1.177 -0.846 -0.5048
+-1.812 -2.875 1.175 -0.846 -0.5474
+-1.836 -2.912 1.168 -0.846 -0.5885
+-1.856 -2.944 1.154 -0.846 -0.6282
+-1.871 -2.969 1.133 -0.846 -0.6663
+-1.883 -2.988 1.106 -0.846 -0.7027
+-1.891 -3 1.073 -0.846 -0.7374
+-1.894 -3.005 1.033 -0.846 -0.7702
+-1.893 -3.004 0.9873 -0.846 -0.8011
+-1.888 -2.996 0.9356 -0.846 -0.8301
+-1.879 -2.982 0.8782 -0.846 -0.8569
+-1.867 -2.961 0.8154 -0.846 -0.8816
+-1.85 -2.936 0.7475 -0.846 -0.9041
+-1.831 -2.905 0.675 -0.846 -0.9243
+-1.808 -2.869 0.5983 -0.846 -0.9422
+-1.783 -2.828 0.5177 -0.846 -0.9578
+-1.755 -2.784 0.4339 -0.846 -0.971
+-1.725 -2.737 0.3474 -0.846 -0.9817
+-1.694 -2.687 0.2585 -0.846 -0.99
+-1.661 -2.635 0.1681 -0.846 -0.9958
+-1.628 -2.583 0.07655 -0.846 -0.9991
+-1.594 -2.529 -0.01548 -0.846 -1
+-1.56 -2.475 -0.1074 -0.846 -0.9983
+-1.527 -2.423 -0.1987 -0.846 -0.9941
+-1.495 -2.372 -0.2886 -0.846 -0.9875
+-1.464 -2.323 -0.3767 -0.846 -0.9784
+-1.435 -2.276 -0.4625 -0.846 -0.9668
+-1.408 -2.234 -0.5452 -0.846 -0.9528
+-1.383 -2.195 -0.6245 -0.846 -0.9365
+-1.362 -2.16 -0.6999 -0.846 -0.9178
+-1.343 -2.131 -0.7709 -0.846 -0.8968
+-1.328 -2.107 -0.8371 -0.846 -0.8735
+-1.317 -2.089 -0.8981 -0.846 -0.8481
+-1.309 -2.077 -0.9536 -0.846 -0.8206
+-1.305 -2.071 -1.003 -0.846 -0.791
+-1.306 -2.072 -1.047 -0.846 -0.7594
+-1.311 -2.079 -1.085 -0.846 -0.7259
+-1.32 -2.094 -1.116 -0.846 -0.6907
+-1.333 -2.114 -1.141 -0.846 -0.6536
+-1.35 -2.142 -1.159 -0.846 -0.615
+-1.371 -2.176 -1.171 -0.846 -0.5748
+-1.396 -2.215 -1.177 -0.846 -0.5332
+-1.425 -2.261 -1.176 -0.846 -0.4903
+-1.457 -2.312 -1.169 -0.846 -0.4461
+-1.493 -2.368 -1.157 -0.846 -0.4008
+-1.531 -2.429 -1.139 -0.846 -0.3545
+-1.572 -2.494 -1.116 -0.846 -0.3073
+-1.615 -2.562 -1.088 -0.846 -0.2594
+-1.659 -2.632 -1.055 -0.846 -0.2108
+-1.705 -2.705 -1.018 -0.846 -0.1617
+-1.752 -2.779 -0.9777 -0.846 -0.1122
+-1.799 -2.854 -0.934 -0.846 -0.06235
+-1.846 -2.928 -0.8875 -0.846 -0.01239
+-1.892 -3.002 -0.8386 -0.846 0.0376
+-1.938 -3.074 -0.788 -0.846 0.0875
+-1.982 -3.144 -0.736 -0.846 0.1372
+-2.024 -3.211 -0.6831 -0.846 0.1865
+-2.064 -3.274 -0.6299 -0.846 0.2354
+-2.101 -3.333 -0.5768 -0.846 0.2837
+-2.135 -3.387 -0.5242 -0.846 0.3312
+-2.165 -3.435 -0.4725 -0.846 0.378
+-2.191 -3.477 -0.4222 -0.846 0.4238
+-2.214 -3.512 -0.3736 -0.846 0.4685
+-2.232 -3.541 -0.3271 -0.846 0.5121
+-2.245 -3.562 -0.2829 -0.846 0.5544
+-2.253 -3.575 -0.2414 -0.846 0.5953
+-2.257 -3.58 -0.2027 -0.846 0.6347
+-2.255 -3.578 -0.1671 -0.846 0.6725
+-2.248 -3.567 -0.1346 -0.846 0.7087
+-2.236 -3.548 -0.1055 -0.846 0.743
+-2.219 -3.521 -0.07966 -0.846 0.7756
+-2.197 -3.486 -0.05719 -0.846 0.8061
+-2.171 -3.444 -0.03802 -0.846 0.8347
+-2.139 -3.394 -0.02209 -0.846 0.8612
+-2.103 -3.337 -0.00927 -0.846 0.8855
+-2.063 -3.274 0.0005938 -0.846 0.9076
+-2.02 -3.204 0.007698 -0.846 0.9275
+-1.972 -3.129 0.01227 -0.846 0.945
+-1.922 -3.05 0.01458 -0.846 0.9602
+-1.869 -2.965 0.01491 -0.846 0.9729
+-1.814 -2.878 0.01357 -0.846 0.9833
+-1.757 -2.787 0.0109 -0.846 0.9911
+-1.698 -2.695 0.007255 -0.846 0.9965
+-1.639 -2.601 0.00299 -0.846 0.9994
+-1.471 -2.615 0 -0.8716 1
+-1.416 -2.518 -0.007258 -0.8716 0.9988
+-1.362 -2.421 -0.01412 -0.8716 0.995
+-1.309 -2.327 -0.0202 -0.8716 0.9888
+-1.257 -2.234 -0.0251 -0.8716 0.9801
+-1.207 -2.145 -0.02847 -0.8716 0.9689
+-1.159 -2.06 -0.02996 -0.8716 0.9553
+-1.113 -1.979 -0.02924 -0.8716 0.9394
+-1.071 -1.904 -0.026 -0.8716 0.9211
+-1.032 -1.834 -0.01999 -0.8716 0.9004
+-0.996 -1.771 -0.01097 -0.8716 0.8776
+-0.9643 -1.714 0.001266 -0.8716 0.8525
+-0.9366 -1.665 0.01687 -0.8716 0.8253
+-0.9132 -1.624 0.03595 -0.8716 0.7961
+-0.8943 -1.59 0.05859 -0.8716 0.7648
+-0.8799 -1.564 0.08482 -0.8716 0.7317
+-0.8702 -1.547 0.1146 -0.8716 0.6967
+-0.8652 -1.538 0.1479 -0.8716 0.66
+-0.8648 -1.537 0.1845 -0.8716 0.6216
+-0.869 -1.545 0.2244 -0.8716 0.5817
+-0.8777 -1.56 0.2673 -0.8716 0.5403
+-0.8908 -1.584 0.313 -0.8716 0.4976
+-0.908 -1.614 0.3611 -0.8716 0.4536
+-0.9293 -1.652 0.4114 -0.8716 0.4085
+-0.9542 -1.696 0.4635 -0.8716 0.3624
+-0.9826 -1.747 0.517 -0.8716 0.3153
+-1.014 -1.803 0.5715 -0.8716 0.2675
+-1.048 -1.864 0.6265 -0.8716 0.219
+-1.085 -1.929 0.6815 -0.8716 0.17
+-1.124 -1.998 0.7361 -0.8716 0.1205
+-1.164 -2.07 0.7898 -0.8716 0.07074
+-1.206 -2.144 0.842 -0.8716 0.02079
+-1.248 -2.219 0.8923 -0.8716 -0.0292
+-1.291 -2.295 0.9401 -0.8716 -0.07912
+-1.333 -2.371 0.985 -0.8716 -0.1288
+-1.376 -2.446 1.026 -0.8716 -0.1782
+-1.417 -2.519 1.064 -0.8716 -0.2272
+-1.457 -2.59 1.097 -0.8716 -0.2756
+-1.496 -2.659 1.126 -0.8716 -0.3233
+-1.532 -2.723 1.149 -0.8716 -0.3702
+-1.566 -2.784 1.167 -0.8716 -0.4161
+-1.597 -2.84 1.179 -0.8716 -0.4611
+-1.626 -2.891 1.185 -0.8716 -0.5048
+-1.651 -2.936 1.185 -0.8716 -0.5474
+-1.673 -2.975 1.178 -0.8716 -0.5885
+-1.692 -3.008 1.165 -0.8716 -0.6282
+-1.707 -3.034 1.145 -0.8716 -0.6663
+-1.718 -3.054 1.119 -0.8716 -0.7027
+-1.725 -3.067 1.086 -0.8716 -0.7374
+-1.729 -3.073 1.047 -0.8716 -0.7702
+-1.728 -3.073 1.001 -0.8716 -0.8011
+-1.725 -3.066 0.9488 -0.8716 -0.8301
+-1.717 -3.053 0.891 -0.8716 -0.8569
+-1.706 -3.033 0.8276 -0.8716 -0.8816
+-1.692 -3.008 0.759 -0.8716 -0.9041
+-1.675 -2.978 0.6856 -0.8716 -0.9243
+-1.655 -2.942 0.6079 -0.8716 -0.9422
+-1.633 -2.903 0.5262 -0.8716 -0.9578
+-1.608 -2.859 0.4411 -0.8716 -0.971
+-1.582 -2.812 0.3531 -0.8716 -0.9817
+-1.554 -2.763 0.2629 -0.8716 -0.99
+-1.525 -2.712 0.1709 -0.8716 -0.9958
+-1.496 -2.659 0.07784 -0.8716 -0.9991
+-1.466 -2.606 -0.01575 -0.8716 -1
+-1.436 -2.553 -0.1092 -0.8716 -0.9983
+-1.407 -2.5 -0.202 -0.8716 -0.9941
+-1.378 -2.45 -0.2934 -0.8716 -0.9875
+-1.351 -2.401 -0.383 -0.8716 -0.9784
+-1.325 -2.355 -0.47 -0.8716 -0.9668
+-1.301 -2.313 -0.554 -0.8716 -0.9528
+-1.28 -2.275 -0.6345 -0.8716 -0.9365
+-1.261 -2.241 -0.7108 -0.8716 -0.9178
+-1.244 -2.212 -0.7827 -0.8716 -0.8968
+-1.231 -2.189 -0.8495 -0.8716 -0.8735
+-1.222 -2.172 -0.9111 -0.8716 -0.8481
+-1.215 -2.161 -0.9669 -0.8716 -0.8206
+-1.213 -2.156 -1.017 -0.8716 -0.791
+-1.214 -2.158 -1.06 -0.8716 -0.7594
+-1.218 -2.166 -1.098 -0.8716 -0.7259
+-1.227 -2.181 -1.129 -0.8716 -0.6907
+-1.239 -2.203 -1.153 -0.8716 -0.6536
+-1.255 -2.232 -1.17 -0.8716 -0.615
+-1.275 -2.267 -1.181 -0.8716 -0.5748
+-1.298 -2.308 -1.186 -0.8716 -0.5332
+-1.325 -2.355 -1.184 -0.8716 -0.4903
+-1.354 -2.408 -1.176 -0.8716 -0.4461
+-1.387 -2.465 -1.162 -0.8716 -0.4008
+-1.422 -2.527 -1.142 -0.8716 -0.3545
+-1.459 -2.593 -1.117 -0.8716 -0.3073
+-1.498 -2.663 -1.087 -0.8716 -0.2594
+-1.538 -2.735 -1.052 -0.8716 -0.2108
+-1.58 -2.809 -1.013 -0.8716 -0.1617
+-1.622 -2.884 -0.9703 -0.8716 -0.1122
+-1.665 -2.96 -0.9244 -0.8716 -0.06235
+-1.708 -3.036 -0.8757 -0.8716 -0.01239
+-1.75 -3.111 -0.8247 -0.8716 0.0376
+-1.791 -3.184 -0.7719 -0.8716 0.0875
+-1.831 -3.255 -0.7179 -0.8716 0.1372
+-1.869 -3.323 -0.663 -0.8716 0.1865
+-1.905 -3.387 -0.608 -0.8716 0.2354
+-1.938 -3.446 -0.5531 -0.8716 0.2837
+-1.969 -3.5 -0.4989 -0.8716 0.3312
+-1.996 -3.549 -0.4458 -0.8716 0.378
+-2.02 -3.591 -0.3943 -0.8716 0.4238
+-2.04 -3.626 -0.3447 -0.8716 0.4685
+-2.056 -3.655 -0.2973 -0.8716 0.5121
+-2.067 -3.675 -0.2526 -0.8716 0.5544
+-2.075 -3.688 -0.2107 -0.8716 0.5953
+-2.077 -3.693 -0.1718 -0.8716 0.6347
+-2.075 -3.689 -0.1363 -0.8716 0.6725
+-2.069 -3.678 -0.1042 -0.8716 0.7087
+-2.057 -3.657 -0.0756 -0.8716 0.743
+-2.041 -3.629 -0.05058 -0.8716 0.7756
+-2.021 -3.593 -0.02914 -0.8716 0.8061
+-1.996 -3.549 -0.01124 -0.8716 0.8347
+-1.967 -3.497 0.003217 -0.8716 0.8612
+-1.934 -3.438 0.01435 -0.8716 0.8855
+-1.897 -3.373 0.02234 -0.8716 0.9076
+-1.857 -3.301 0.02739 -0.8716 0.9275
+-1.813 -3.224 0.02975 -0.8716 0.945
+-1.767 -3.141 0.02969 -0.8716 0.9602
+-1.718 -3.055 0.02753 -0.8716 0.9729
+-1.667 -2.964 0.02361 -0.8716 0.9833
+-1.615 -2.871 0.01826 -0.8716 0.9911
+-1.561 -2.776 0.01188 -0.8716 0.9965
+-1.507 -2.679 0.004842 -0.8716 0.9994
+-1.338 -2.685 0 -0.895 1
+-1.289 -2.585 -0.01004 -0.895 0.9988
+-1.239 -2.487 -0.01966 -0.895 0.995
+-1.191 -2.39 -0.02845 -0.895 0.9888
+-1.144 -2.295 -0.03601 -0.895 0.9801
+-1.098 -2.204 -0.04193 -0.895 0.9689
+-1.055 -2.116 -0.04587 -0.895 0.9553
+-1.013 -2.033 -0.04746 -0.895 0.9394
+-0.9747 -1.956 -0.04639 -0.895 0.9211
+-0.939 -1.884 -0.04238 -0.895 0.9004
+-0.9065 -1.819 -0.03517 -0.895 0.8776
+-0.8775 -1.761 -0.02456 -0.895 0.8525
+-0.8522 -1.71 -0.01037 -0.895 0.8253
+-0.8307 -1.667 0.007514 -0.895 0.7961
+-0.8132 -1.632 0.02918 -0.895 0.7648
+-0.7999 -1.605 0.05466 -0.895 0.7317
+-0.7907 -1.586 0.08394 -0.895 0.6967
+-0.7857 -1.576 0.1169 -0.895 0.66
+-0.785 -1.575 0.1536 -0.895 0.6216
+-0.7884 -1.582 0.1937 -0.895 0.5817
+-0.7958 -1.597 0.237 -0.895 0.5403
+-0.8072 -1.619 0.2833 -0.895 0.4976
+-0.8224 -1.65 0.3323 -0.895 0.4536
+-0.8411 -1.688 0.3837 -0.895 0.4085
+-0.8632 -1.732 0.4371 -0.895 0.3624
+-0.8885 -1.783 0.492 -0.895 0.3153
+-0.9165 -1.839 0.548 -0.895 0.2675
+-0.9471 -1.9 0.6048 -0.895 0.219
+-0.9799 -1.966 0.6617 -0.895 0.17
+-1.014 -2.035 0.7182 -0.895 0.1205
+-1.051 -2.108 0.7739 -0.895 0.07074
+-1.088 -2.182 0.8283 -0.895 0.02079
+-1.126 -2.259 0.8807 -0.895 -0.0292
+-1.164 -2.335 0.9307 -0.895 -0.07912
+-1.202 -2.412 0.9777 -0.895 -0.1288
+-1.24 -2.488 1.021 -0.895 -0.1782
+-1.277 -2.563 1.061 -0.895 -0.2272
+-1.314 -2.635 1.096 -0.895 -0.2756
+-1.348 -2.705 1.127 -0.895 -0.3233
+-1.381 -2.771 1.152 -0.895 -0.3702
+-1.412 -2.833 1.171 -0.895 -0.4161
+-1.44 -2.89 1.185 -0.895 -0.4611
+-1.466 -2.942 1.193 -0.895 -0.5048
+-1.489 -2.988 1.194 -0.895 -0.5474
+-1.509 -3.028 1.188 -0.895 -0.5885
+-1.526 -3.062 1.176 -0.895 -0.6282
+-1.54 -3.09 1.157 -0.895 -0.6663
+-1.551 -3.111 1.131 -0.895 -0.7027
+-1.558 -3.125 1.099 -0.895 -0.7374
+-1.561 -3.132 1.059 -0.895 -0.7702
+-1.562 -3.133 1.014 -0.895 -0.8011
+-1.559 -3.127 0.9614 -0.895 -0.8301
+-1.552 -3.114 0.9033 -0.895 -0.8569
+-1.543 -3.096 0.8394 -0.895 -0.8816
+-1.531 -3.072 0.7701 -0.895 -0.9041
+-1.516 -3.042 0.6958 -0.895 -0.9243
+-1.499 -3.008 0.6171 -0.895 -0.9422
+-1.48 -2.969 0.5343 -0.895 -0.9578
+-1.458 -2.926 0.4479 -0.895 -0.971
+-1.435 -2.88 0.3587 -0.895 -0.9817
+-1.411 -2.831 0.267 -0.895 -0.99
+-1.386 -2.781 0.1736 -0.895 -0.9958
+-1.36 -2.729 0.07908 -0.895 -0.9991
+-1.334 -2.676 -0.016 -0.895 -1
+-1.308 -2.624 -0.111 -0.895 -0.9983
+-1.282 -2.572 -0.2052 -0.895 -0.9941
+-1.257 -2.522 -0.2981 -0.895 -0.9875
+-1.233 -2.474 -0.389 -0.895 -0.9784
+-1.211 -2.429 -0.4773 -0.895 -0.9668
+-1.19 -2.388 -0.5625 -0.895 -0.9528
+-1.171 -2.35 -0.644 -0.895 -0.9365
+-1.155 -2.317 -0.7213 -0.895 -0.9178
+-1.141 -2.289 -0.794 -0.895 -0.8968
+-1.13 -2.267 -0.8615 -0.895 -0.8735
+-1.122 -2.251 -0.9235 -0.895 -0.8481
+-1.117 -2.24 -0.9796 -0.895 -0.8206
+-1.115 -2.237 -1.03 -0.895 -0.791
+-1.116 -2.239 -1.073 -0.895 -0.7594
+-1.121 -2.249 -1.11 -0.895 -0.7259
+-1.129 -2.265 -1.141 -0.895 -0.6907
+-1.141 -2.288 -1.164 -0.895 -0.6536
+-1.155 -2.318 -1.181 -0.895 -0.615
+-1.174 -2.354 -1.191 -0.895 -0.5748
+-1.195 -2.397 -1.194 -0.895 -0.5332
+-1.219 -2.445 -1.191 -0.895 -0.4903
+-1.245 -2.499 -1.181 -0.895 -0.4461
+-1.275 -2.558 -1.166 -0.895 -0.4008
+-1.306 -2.621 -1.144 -0.895 -0.3545
+-1.34 -2.688 -1.117 -0.895 -0.3073
+-1.375 -2.759 -1.085 -0.895 -0.2594
+-1.411 -2.832 -1.048 -0.895 -0.2108
+-1.449 -2.907 -1.007 -0.895 -0.1617
+-1.487 -2.983 -0.9623 -0.895 -0.1122
+-1.525 -3.06 -0.9142 -0.895 -0.06235
+-1.564 -3.137 -0.8633 -0.895 -0.01239
+-1.601 -3.213 -0.8102 -0.895 0.0376
+-1.638 -3.287 -0.7553 -0.895 0.0875
+-1.674 -3.358 -0.6993 -0.895 0.1372
+-1.708 -3.427 -0.6425 -0.895 0.1865
+-1.74 -3.491 -0.5856 -0.895 0.2354
+-1.77 -3.551 -0.5291 -0.895 0.2837
+-1.797 -3.605 -0.4734 -0.895 0.3312
+-1.821 -3.654 -0.4189 -0.895 0.378
+-1.842 -3.696 -0.3662 -0.895 0.4238
+-1.86 -3.731 -0.3156 -0.895 0.4685
+-1.874 -3.759 -0.2674 -0.895 0.5121
+-1.884 -3.779 -0.2221 -0.895 0.5544
+-1.89 -3.791 -0.1798 -0.895 0.5953
+-1.892 -3.795 -0.1409 -0.895 0.6347
+-1.89 -3.791 -0.1054 -0.895 0.6725
+-1.883 -3.778 -0.07367 -0.895 0.7087
+-1.873 -3.757 -0.04567 -0.895 0.743
+-1.858 -3.727 -0.02147 -0.895 0.7756
+-1.839 -3.69 -0.001079 -0.895 0.8061
+-1.816 -3.644 0.01555 -0.895 0.8347
+-1.79 -3.591 0.02852 -0.895 0.8612
+-1.759 -3.53 0.03797 -0.895 0.8855
+-1.726 -3.463 0.04407 -0.895 0.9076
+-1.689 -3.389 0.04706 -0.895 0.9275
+-1.65 -3.309 0.0472 -0.895 0.945
+-1.607 -3.225 0.04479 -0.895 0.9602
+-1.563 -3.136 0.04014 -0.895 0.9729
+-1.517 -3.043 0.03363 -0.895 0.9833
+-1.469 -2.948 0.02561 -0.895 0.9911
+-1.421 -2.85 0.0165 -0.895 0.9965
+-1.371 -2.751 0.00669 -0.895 0.9994
+-1.202 -2.748 0 -0.9162 1
+-1.158 -2.647 -0.01282 -0.9162 0.9988
+-1.114 -2.546 -0.02519 -0.9162 0.995
+-1.07 -2.447 -0.03669 -0.9162 0.9888
+-1.028 -2.35 -0.04688 -0.9162 0.9801
+-0.9873 -2.257 -0.05537 -0.9162 0.9689
+-0.9482 -2.167 -0.06174 -0.9162 0.9553
+-0.9111 -2.083 -0.06565 -0.9162 0.9394
+-0.8763 -2.003 -0.06675 -0.9162 0.9211
+-0.8442 -1.93 -0.06474 -0.9162 0.9004
+-0.815 -1.863 -0.05935 -0.9162 0.8776
+-0.7888 -1.803 -0.05037 -0.9162 0.8525
+-0.7659 -1.751 -0.03761 -0.9162 0.8253
+-0.7464 -1.706 -0.02093 -0.9162 0.7961
+-0.7305 -1.67 -0.0002485 -0.9162 0.7648
+-0.7183 -1.642 0.02448 -0.9162 0.7317
+-0.7097 -1.622 0.05323 -0.9162 0.6967
+-0.7049 -1.611 0.08595 -0.9162 0.66
+-0.7039 -1.609 0.1225 -0.9162 0.6216
+-0.7065 -1.615 0.1628 -0.9162 0.5817
+-0.7128 -1.629 0.2065 -0.9162 0.5403
+-0.7226 -1.652 0.2535 -0.9162 0.4976
+-0.7357 -1.682 0.3033 -0.9162 0.4536
+-0.752 -1.719 0.3557 -0.9162 0.4085
+-0.7714 -1.763 0.4103 -0.9162 0.3624
+-0.7935 -1.814 0.4666 -0.9162 0.3153
+-0.8181 -1.87 0.5242 -0.9162 0.2675
+-0.845 -1.932 0.5827 -0.9162 0.219
+-0.8738 -1.997 0.6414 -0.9162 0.17
+-0.9044 -2.067 0.6998 -0.9162 0.1205
+-0.9362 -2.14 0.7576 -0.9162 0.07074
+-0.9691 -2.215 0.814 -0.9162 0.02079
+-1.003 -2.292 0.8685 -0.9162 -0.0292
+-1.037 -2.37 0.9206 -0.9162 -0.07912
+-1.071 -2.447 0.9698 -0.9162 -0.1288
+-1.104 -2.524 1.016 -0.9162 -0.1782
+-1.137 -2.599 1.057 -0.9162 -0.2272
+-1.169 -2.673 1.094 -0.9162 -0.2756
+-1.2 -2.743 1.127 -0.9162 -0.3233
+-1.229 -2.81 1.154 -0.9162 -0.3702
+-1.257 -2.873 1.175 -0.9162 -0.4161
+-1.282 -2.931 1.191 -0.9162 -0.4611
+-1.305 -2.984 1.199 -0.9162 -0.5048
+-1.326 -3.031 1.202 -0.9162 -0.5474
+-1.344 -3.073 1.197 -0.9162 -0.5885
+-1.36 -3.108 1.186 -0.9162 -0.6282
+-1.372 -3.136 1.168 -0.9162 -0.6663
+-1.382 -3.158 1.143 -0.9162 -0.7027
+-1.388 -3.174 1.111 -0.9162 -0.7374
+-1.392 -3.182 1.071 -0.9162 -0.7702
+-1.393 -3.184 1.026 -0.9162 -0.8011
+-1.391 -3.179 0.9735 -0.9162 -0.8301
+-1.386 -3.167 0.915 -0.9162 -0.8569
+-1.378 -3.15 0.8506 -0.9162 -0.8816
+-1.368 -3.127 0.7807 -0.9162 -0.9041
+-1.355 -3.098 0.7056 -0.9162 -0.9243
+-1.341 -3.065 0.6259 -0.9162 -0.9422
+-1.324 -3.027 0.542 -0.9162 -0.9578
+-1.306 -2.985 0.4545 -0.9162 -0.971
+-1.286 -2.94 0.364 -0.9162 -0.9817
+-1.265 -2.892 0.271 -0.9162 -0.99
+-1.243 -2.842 0.1763 -0.9162 -0.9958
+-1.221 -2.791 0.08028 -0.9162 -0.9991
+-1.199 -2.74 -0.01624 -0.9162 -1
+-1.176 -2.688 -0.1126 -0.9162 -0.9983
+-1.154 -2.638 -0.2083 -0.9162 -0.9941
+-1.133 -2.589 -0.3025 -0.9162 -0.9875
+-1.112 -2.542 -0.3948 -0.9162 -0.9784
+-1.093 -2.498 -0.4843 -0.9162 -0.9668
+-1.075 -2.457 -0.5706 -0.9162 -0.9528
+-1.059 -2.421 -0.6532 -0.9162 -0.9365
+-1.045 -2.389 -0.7314 -0.9162 -0.9178
+-1.033 -2.362 -0.8048 -0.9162 -0.8968
+-1.024 -2.341 -0.8729 -0.9162 -0.8735
+-1.017 -2.325 -0.9353 -0.9162 -0.8481
+-1.013 -2.316 -0.9918 -0.9162 -0.8206
+-1.012 -2.313 -1.042 -0.9162 -0.791
+-1.014 -2.317 -1.085 -0.9162 -0.7594
+-1.018 -2.328 -1.122 -0.9162 -0.7259
+-1.026 -2.345 -1.152 -0.9162 -0.6907
+-1.037 -2.369 -1.175 -0.9162 -0.6536
+-1.05 -2.4 -1.191 -0.9162 -0.615
+-1.066 -2.438 -1.2 -0.9162 -0.5748
+-1.085 -2.481 -1.202 -0.9162 -0.5332
+-1.107 -2.53 -1.197 -0.9162 -0.4903
+-1.131 -2.585 -1.186 -0.9162 -0.4461
+-1.157 -2.645 -1.169 -0.9162 -0.4008
+-1.185 -2.709 -1.145 -0.9162 -0.3545
+-1.215 -2.777 -1.117 -0.9162 -0.3073
+-1.246 -2.849 -1.082 -0.9162 -0.2594
+-1.279 -2.923 -1.044 -0.9162 -0.2108
+-1.312 -2.999 -1.001 -0.9162 -0.1617
+-1.346 -3.076 -0.9536 -0.9162 -0.1122
+-1.38 -3.154 -0.9034 -0.9162 -0.06235
+-1.413 -3.231 -0.8504 -0.9162 -0.01239
+-1.447 -3.307 -0.7952 -0.9162 0.0376
+-1.479 -3.382 -0.7383 -0.9162 0.0875
+-1.511 -3.454 -0.6802 -0.9162 0.1372
+-1.541 -3.522 -0.6216 -0.9162 0.1865
+-1.569 -3.587 -0.5629 -0.9162 0.2354
+-1.595 -3.646 -0.5047 -0.9162 0.2837
+-1.619 -3.701 -0.4475 -0.9162 0.3312
+-1.64 -3.749 -0.3917 -0.9162 0.378
+-1.659 -3.791 -0.3378 -0.9162 0.4238
+-1.674 -3.826 -0.2862 -0.9162 0.4685
+-1.686 -3.854 -0.2373 -0.9162 0.5121
+-1.695 -3.873 -0.1914 -0.9162 0.5544
+-1.7 -3.885 -0.1488 -0.9162 0.5953
+-1.701 -3.888 -0.1098 -0.9162 0.6347
+-1.699 -3.883 -0.07451 -0.9162 0.6725
+-1.693 -3.869 -0.04311 -0.9162 0.7087
+-1.683 -3.847 -0.01571 -0.9162 0.743
+-1.669 -3.816 0.007654 -0.9162 0.7756
+-1.652 -3.777 0.02698 -0.9162 0.8061
+-1.632 -3.73 0.04233 -0.9162 0.8347
+-1.608 -3.675 0.05381 -0.9162 0.8612
+-1.58 -3.612 0.06156 -0.9162 0.8855
+-1.55 -3.543 0.06578 -0.9162 0.9076
+-1.517 -3.468 0.06671 -0.9162 0.9275
+-1.481 -3.386 0.06463 -0.9162 0.945
+-1.444 -3.3 0.05985 -0.9162 0.9602
+-1.404 -3.209 0.05273 -0.9162 0.9729
+-1.363 -3.115 0.04363 -0.9162 0.9833
+-1.32 -3.017 0.03295 -0.9162 0.9911
+-1.276 -2.917 0.02111 -0.9162 0.9965
+-1.232 -2.816 0.008534 -0.9162 0.9994
+-1.064 -2.805 0 -0.9351 1
+-1.024 -2.702 -0.01559 -0.9351 0.9988
+-0.9855 -2.599 -0.03071 -0.9351 0.995
+-0.9472 -2.498 -0.04491 -0.9351 0.9888
+-0.9099 -2.4 -0.05774 -0.9351 0.9801
+-0.8738 -2.305 -0.06876 -0.9351 0.9689
+-0.8393 -2.214 -0.07758 -0.9351 0.9553
+-0.8065 -2.127 -0.0838 -0.9351 0.9394
+-0.7758 -2.046 -0.08706 -0.9351 0.9211
+-0.7474 -1.971 -0.08706 -0.9351 0.9004
+-0.7215 -1.903 -0.0835 -0.9351 0.8776
+-0.6983 -1.842 -0.07615 -0.9351 0.8525
+-0.6779 -1.788 -0.06482 -0.9351 0.8253
+-0.6605 -1.742 -0.04936 -0.9351 0.7961
+-0.6463 -1.705 -0.02968 -0.9351 0.7648
+-0.6352 -1.675 -0.005726 -0.9351 0.7317
+-0.6274 -1.655 0.02249 -0.9351 0.6967
+-0.6229 -1.643 0.0549 -0.9351 0.66
+-0.6217 -1.64 0.09139 -0.9351 0.6216
+-0.6236 -1.645 0.1318 -0.9351 0.5817
+-0.6288 -1.658 0.1759 -0.9351 0.5403
+-0.637 -1.68 0.2235 -0.9351 0.4976
+-0.6482 -1.71 0.2741 -0.9351 0.4536
+-0.6621 -1.746 0.3275 -0.9351 0.4085
+-0.6788 -1.79 0.3833 -0.9351 0.3624
+-0.6978 -1.841 0.441 -0.9351 0.3153
+-0.7191 -1.897 0.5001 -0.9351 0.2675
+-0.7423 -1.958 0.5602 -0.9351 0.219
+-0.7673 -2.024 0.6207 -0.9351 0.17
+-0.7938 -2.094 0.681 -0.9351 0.1205
+-0.8215 -2.167 0.7407 -0.9351 0.07074
+-0.85 -2.242 0.7992 -0.9351 0.02079
+-0.8792 -2.319 0.8558 -0.9351 -0.0292
+-0.9088 -2.397 0.91 -0.9351 -0.07912
+-0.9384 -2.475 0.9613 -0.9351 -0.1288
+-0.9677 -2.552 1.009 -0.9351 -0.1782
+-0.9965 -2.628 1.053 -0.9351 -0.2272
+-1.025 -2.702 1.092 -0.9351 -0.2756
+-1.051 -2.773 1.126 -0.9351 -0.3233
+-1.077 -2.841 1.155 -0.9351 -0.3702
+-1.101 -2.904 1.178 -0.9351 -0.4161
+-1.124 -2.963 1.195 -0.9351 -0.4611
+-1.144 -3.017 1.206 -0.9351 -0.5048
+-1.162 -3.066 1.209 -0.9351 -0.5474
+-1.178 -3.108 1.206 -0.9351 -0.5885
+-1.192 -3.144 1.196 -0.9351 -0.6282
+-1.203 -3.174 1.178 -0.9351 -0.6663
+-1.212 -3.197 1.154 -0.9351 -0.7027
+-1.218 -3.213 1.122 -0.9351 -0.7374
+-1.222 -3.222 1.083 -0.9351 -0.7702
+-1.223 -3.225 1.037 -0.9351 -0.8011
+-1.221 -3.221 0.9849 -0.9351 -0.8301
+-1.217 -3.211 0.9261 -0.9351 -0.8569
+-1.211 -3.195 0.8613 -0.9351 -0.8816
+-1.203 -3.173 0.7907 -0.9351 -0.9041
+-1.192 -3.145 0.7149 -0.9351 -0.9243
+-1.18 -3.113 0.6343 -0.9351 -0.9422
+-1.166 -3.076 0.5494 -0.9351 -0.9578
+-1.151 -3.036 0.4608 -0.9351 -0.971
+-1.134 -2.992 0.3691 -0.9351 -0.9817
+-1.117 -2.945 0.2749 -0.9351 -0.99
+-1.098 -2.897 0.1788 -0.9351 -0.9958
+-1.079 -2.847 0.08142 -0.9351 -0.9991
+-1.06 -2.797 -0.01647 -0.9351 -1
+-1.041 -2.746 -0.1143 -0.9351 -0.9983
+-1.023 -2.697 -0.2113 -0.9351 -0.9941
+-1.004 -2.649 -0.3068 -0.9351 -0.9875
+-0.9871 -2.604 -0.4003 -0.9351 -0.9784
+-0.9708 -2.561 -0.491 -0.9351 -0.9668
+-0.9559 -2.521 -0.5784 -0.9351 -0.9528
+-0.9425 -2.486 -0.6619 -0.9351 -0.9365
+-0.9308 -2.455 -0.741 -0.9351 -0.9178
+-0.9211 -2.429 -0.8151 -0.9351 -0.8968
+-0.9135 -2.409 -0.8837 -0.9351 -0.8735
+-0.908 -2.395 -0.9466 -0.9351 -0.8481
+-0.905 -2.387 -1.003 -0.9351 -0.8206
+-0.9044 -2.385 -1.053 -0.9351 -0.791
+-0.9063 -2.39 -1.097 -0.9351 -0.7594
+-0.9107 -2.402 -1.133 -0.9351 -0.7259
+-0.9177 -2.421 -1.163 -0.9351 -0.6907
+-0.9273 -2.446 -1.185 -0.9351 -0.6536
+-0.9394 -2.478 -1.2 -0.9351 -0.615
+-0.9539 -2.516 -1.208 -0.9351 -0.5748
+-0.9707 -2.56 -1.209 -0.9351 -0.5332
+-0.9897 -2.611 -1.203 -0.9351 -0.4903
+-1.011 -2.666 -1.19 -0.9351 -0.4461
+-1.034 -2.727 -1.171 -0.9351 -0.4008
+-1.058 -2.792 -1.146 -0.9351 -0.3545
+-1.085 -2.861 -1.115 -0.9351 -0.3073
+-1.112 -2.933 -1.079 -0.9351 -0.2594
+-1.14 -3.007 -1.039 -0.9351 -0.2108
+-1.169 -3.084 -0.9934 -0.9351 -0.1617
+-1.199 -3.162 -0.9444 -0.9351 -0.1122
+-1.228 -3.24 -0.8921 -0.9351 -0.06235
+-1.258 -3.317 -0.837 -0.9351 -0.01239
+-1.287 -3.394 -0.7797 -0.9351 0.0376
+-1.315 -3.468 -0.7208 -0.9351 0.0875
+-1.342 -3.54 -0.6608 -0.9351 0.1372
+-1.368 -3.609 -0.6003 -0.9351 0.1865
+-1.393 -3.674 -0.5399 -0.9351 0.2354
+-1.415 -3.733 -0.4801 -0.9351 0.2837
+-1.436 -3.787 -0.4214 -0.9351 0.3312
+-1.454 -3.836 -0.3643 -0.9351 0.378
+-1.47 -3.877 -0.3093 -0.9351 0.4238
+-1.483 -3.911 -0.2567 -0.9351 0.4685
+-1.493 -3.938 -0.2071 -0.9351 0.5121
+-1.5 -3.957 -0.1607 -0.9351 0.5544
+-1.504 -3.968 -0.1178 -0.9351 0.5953
+-1.505 -3.97 -0.07867 -0.9351 0.6347
+-1.503 -3.964 -0.04354 -0.9351 0.6725
+-1.497 -3.949 -0.01253 -0.9351 0.7087
+-1.488 -3.926 0.01426 -0.9351 0.743
+-1.476 -3.894 0.03677 -0.9351 0.7756
+-1.461 -3.854 0.05503 -0.9351 0.8061
+-1.443 -3.805 0.06909 -0.9351 0.8347
+-1.421 -3.749 0.07906 -0.9351 0.8612
+-1.397 -3.685 0.08511 -0.9351 0.8855
+-1.37 -3.614 0.08744 -0.9351 0.9076
+-1.341 -3.537 0.08631 -0.9351 0.9275
+-1.31 -3.455 0.08202 -0.9351 0.945
+-1.276 -3.366 0.07488 -0.9351 0.9602
+-1.241 -3.274 0.06528 -0.9351 0.9729
+-1.205 -3.178 0.0536 -0.9351 0.9833
+-1.167 -3.078 0.04026 -0.9351 0.9911
+-1.129 -2.977 0.0257 -0.9351 0.9965
+-1.09 -2.874 0.01037 -0.9351 0.9994
+-0.922 -2.855 0 -0.9516 1
+-0.8882 -2.75 -0.01834 -0.9516 0.9988
+-0.8546 -2.646 -0.0362 -0.9516 0.995
+-0.8215 -2.544 -0.05309 -0.9516 0.9888
+-0.7893 -2.444 -0.06855 -0.9516 0.9801
+-0.7581 -2.347 -0.08212 -0.9516 0.9689
+-0.7282 -2.255 -0.09337 -0.9516 0.9553
+-0.6999 -2.167 -0.1019 -0.9516 0.9394
+-0.6733 -2.085 -0.1073 -0.9516 0.9211
+-0.6487 -2.009 -0.1093 -0.9516 0.9004
+-0.6262 -1.939 -0.1076 -0.9516 0.8776
+-0.606 -1.876 -0.1019 -0.9516 0.8525
+-0.5883 -1.822 -0.09199 -0.9516 0.8253
+-0.5731 -1.775 -0.07776 -0.9516 0.7961
+-0.5606 -1.736 -0.05909 -0.9516 0.7648
+-0.5509 -1.706 -0.03592 -0.9516 0.7317
+-0.5439 -1.684 -0.00827 -0.9516 0.6967
+-0.5397 -1.671 0.02381 -0.9516 0.66
+-0.5383 -1.667 0.06021 -0.9516 0.6216
+-0.5397 -1.671 0.1007 -0.9516 0.5817
+-0.5439 -1.684 0.1452 -0.9516 0.5403
+-0.5506 -1.705 0.1933 -0.9516 0.4976
+-0.5599 -1.734 0.2447 -0.9516 0.4536
+-0.5716 -1.77 0.2991 -0.9516 0.4085
+-0.5856 -1.813 0.356 -0.9516 0.3624
+-0.6017 -1.863 0.415 -0.9516 0.3153
+-0.6196 -1.919 0.4757 -0.9516 0.2675
+-0.6393 -1.98 0.5374 -0.9516 0.219
+-0.6605 -2.045 0.5996 -0.9516 0.17
+-0.683 -2.115 0.6618 -0.9516 0.1205
+-0.7065 -2.188 0.7234 -0.9516 0.07074
+-0.7308 -2.263 0.7839 -0.9516 0.02079
+-0.7557 -2.34 0.8425 -0.9516 -0.0292
+-0.7809 -2.418 0.8988 -0.9516 -0.07912
+-0.8061 -2.496 0.9521 -0.9516 -0.1288
+-0.8312 -2.574 1.002 -0.9516 -0.1782
+-0.8558 -2.65 1.048 -0.9516 -0.2272
+-0.8798 -2.724 1.089 -0.9516 -0.2756
+-0.9029 -2.796 1.125 -0.9516 -0.3233
+-0.9249 -2.864 1.156 -0.9516 -0.3702
+-0.9456 -2.928 1.181 -0.9516 -0.4161
+-0.9648 -2.987 1.199 -0.9516 -0.4611
+-0.9824 -3.042 1.211 -0.9516 -0.5048
+-0.9983 -3.091 1.216 -0.9516 -0.5474
+-1.012 -3.134 1.214 -0.9516 -0.5885
+-1.024 -3.171 1.204 -0.9516 -0.6282
+-1.034 -3.202 1.188 -0.9516 -0.6663
+-1.042 -3.226 1.164 -0.9516 -0.7027
+-1.047 -3.243 1.132 -0.9516 -0.7374
+-1.051 -3.254 1.094 -0.9516 -0.7702
+-1.052 -3.257 1.048 -0.9516 -0.8011
+-1.051 -3.255 0.9957 -0.9516 -0.8301
+-1.048 -3.246 0.9367 -0.9516 -0.8569
+-1.043 -3.231 0.8714 -0.9516 -0.8816
+-1.037 -3.21 0.8003 -0.9516 -0.9041
+-1.028 -3.184 0.7238 -0.9516 -0.9243
+-1.018 -3.153 0.6423 -0.9516 -0.9422
+-1.007 -3.117 0.5565 -0.9516 -0.9578
+-0.9942 -3.078 0.4669 -0.9516 -0.971
+-0.9805 -3.036 0.374 -0.9516 -0.9817
+-0.9659 -2.991 0.2785 -0.9516 -0.99
+-0.9507 -2.944 0.1812 -0.9516 -0.9958
+-0.9351 -2.895 0.08252 -0.9516 -0.9991
+-0.9193 -2.847 -0.01669 -0.9516 -1
+-0.9036 -2.798 -0.1158 -0.9516 -0.9983
+-0.8881 -2.75 -0.2141 -0.9516 -0.9941
+-0.8731 -2.703 -0.3109 -0.9516 -0.9875
+-0.8588 -2.659 -0.4055 -0.9516 -0.9784
+-0.8454 -2.618 -0.4974 -0.9516 -0.9668
+-0.8332 -2.58 -0.5858 -0.9516 -0.9528
+-0.8222 -2.546 -0.6702 -0.9516 -0.9365
+-0.8127 -2.516 -0.7501 -0.9516 -0.9178
+-0.8048 -2.492 -0.8249 -0.9516 -0.8968
+-0.7987 -2.473 -0.894 -0.9516 -0.8735
+-0.7945 -2.46 -0.9573 -0.9516 -0.8481
+-0.7923 -2.453 -1.014 -0.9516 -0.8206
+-0.7922 -2.453 -1.064 -0.9516 -0.791
+-0.7941 -2.459 -1.108 -0.9516 -0.7594
+-0.7983 -2.472 -1.144 -0.9516 -0.7259
+-0.8046 -2.491 -1.173 -0.9516 -0.6907
+-0.813 -2.517 -1.194 -0.9516 -0.6536
+-0.8236 -2.55 -1.208 -0.9516 -0.615
+-0.8362 -2.589 -1.215 -0.9516 -0.5748
+-0.8508 -2.634 -1.215 -0.9516 -0.5332
+-0.8673 -2.685 -1.208 -0.9516 -0.4903
+-0.8855 -2.742 -1.194 -0.9516 -0.4461
+-0.9052 -2.803 -1.173 -0.9516 -0.4008
+-0.9264 -2.868 -1.146 -0.9516 -0.3545
+-0.9488 -2.938 -1.114 -0.9516 -0.3073
+-0.9722 -3.01 -1.076 -0.9516 -0.2594
+-0.9964 -3.085 -1.033 -0.9516 -0.2108
+-1.021 -3.162 -0.9856 -0.9516 -0.1617
+-1.046 -3.24 -0.9346 -0.9516 -0.1122
+-1.072 -3.318 -0.8802 -0.9516 -0.06235
+-1.097 -3.396 -0.823 -0.9516 -0.01239
+-1.121 -3.472 -0.7637 -0.9516 0.0376
+-1.145 -3.547 -0.7028 -0.9516 0.0875
+-1.169 -3.619 -0.6409 -0.9516 0.1372
+-1.191 -3.687 -0.5786 -0.9516 0.1865
+-1.211 -3.751 -0.5165 -0.9516 0.2354
+-1.231 -3.81 -0.4551 -0.9516 0.2837
+-1.248 -3.864 -0.395 -0.9516 0.3312
+-1.263 -3.912 -0.3366 -0.9516 0.378
+-1.277 -3.953 -0.2805 -0.9516 0.4238
+-1.287 -3.986 -0.2271 -0.9516 0.4685
+-1.296 -4.013 -0.1767 -0.9516 0.5121
+-1.302 -4.031 -0.1298 -0.9516 0.5544
+-1.305 -4.041 -0.08666 -0.9516 0.5953
+-1.306 -4.042 -0.0475 -0.9516 0.6347
+-1.303 -4.035 -0.01253 -0.9516 0.6725
+-1.298 -4.019 0.01807 -0.9516 0.7087
+-1.29 -3.995 0.04422 -0.9516 0.743
+-1.279 -3.962 0.06587 -0.9516 0.7756
+-1.266 -3.92 0.08304 -0.9516 0.8061
+-1.25 -3.871 0.0958 -0.9516 0.8347
+-1.231 -3.813 0.1043 -0.9516 0.8612
+-1.21 -3.748 0.1086 -0.9516 0.8855
+-1.187 -3.676 0.1091 -0.9516 0.9076
+-1.162 -3.598 0.1059 -0.9516 0.9275
+-1.135 -3.514 0.09935 -0.9516 0.945
+-1.106 -3.424 0.08987 -0.9516 0.9602
+-1.076 -3.33 0.07779 -0.9516 0.9729
+-1.044 -3.232 0.06354 -0.9516 0.9833
+-1.011 -3.132 0.04755 -0.9516 0.9911
+-0.9782 -3.029 0.03028 -0.9516 0.9965
+-0.9445 -2.924 0.01221 -0.9516 0.9994
+-0.7782 -2.897 0 -0.9658 1
+-0.7497 -2.791 -0.02109 -0.9658 0.9988
+-0.7215 -2.686 -0.04167 -0.9658 0.995
+-0.6937 -2.583 -0.06125 -0.9658 0.9888
+-0.6667 -2.482 -0.07932 -0.9658 0.9801
+-0.6404 -2.385 -0.09542 -0.9658 0.9689
+-0.6153 -2.291 -0.1091 -0.9658 0.9553
+-0.5914 -2.202 -0.1199 -0.9658 0.9394
+-0.569 -2.119 -0.1275 -0.9658 0.9211
+-0.5483 -2.041 -0.1315 -0.9658 0.9004
+-0.5293 -1.971 -0.1316 -0.9658 0.8776
+-0.5122 -1.907 -0.1276 -0.9658 0.8525
+-0.4972 -1.851 -0.1191 -0.9658 0.8253
+-0.4843 -1.803 -0.1061 -0.9658 0.7961
+-0.4736 -1.763 -0.08847 -0.9658 0.7648
+-0.4653 -1.732 -0.0661 -0.9658 0.7317
+-0.4592 -1.71 -0.03902 -0.9658 0.6967
+-0.4555 -1.696 -0.00729 -0.9658 0.66
+-0.4541 -1.691 0.02898 -0.9658 0.6216
+-0.455 -1.694 0.06962 -0.9658 0.5817
+-0.4582 -1.706 0.1144 -0.9658 0.5403
+-0.4636 -1.726 0.163 -0.9658 0.4976
+-0.4711 -1.754 0.2152 -0.9658 0.4536
+-0.4806 -1.789 0.2705 -0.9658 0.4085
+-0.492 -1.832 0.3286 -0.9658 0.3624
+-0.5052 -1.881 0.3889 -0.9658 0.3153
+-0.52 -1.936 0.4509 -0.9658 0.2675
+-0.5362 -1.996 0.5142 -0.9658 0.219
+-0.5537 -2.061 0.5781 -0.9658 0.17
+-0.5722 -2.131 0.6422 -0.9658 0.1205
+-0.5917 -2.203 0.7057 -0.9658 0.07074
+-0.6118 -2.278 0.7681 -0.9658 0.02079
+-0.6324 -2.355 0.8287 -0.9658 -0.0292
+-0.6533 -2.432 0.887 -0.9658 -0.07912
+-0.6742 -2.51 0.9424 -0.9658 -0.1288
+-0.6951 -2.588 0.9943 -0.9658 -0.1782
+-0.7155 -2.664 1.042 -0.9658 -0.2272
+-0.7355 -2.738 1.085 -0.9658 -0.2756
+-0.7547 -2.81 1.123 -0.9658 -0.3233
+-0.7731 -2.878 1.156 -0.9658 -0.3702
+-0.7904 -2.943 1.182 -0.9658 -0.4161
+-0.8065 -3.003 1.202 -0.9658 -0.4611
+-0.8213 -3.058 1.215 -0.9658 -0.5048
+-0.8346 -3.108 1.222 -0.9658 -0.5474
+-0.8464 -3.151 1.221 -0.9658 -0.5885
+-0.8566 -3.189 1.212 -0.9658 -0.6282
+-0.865 -3.221 1.196 -0.9658 -0.6663
+-0.8717 -3.246 1.173 -0.9658 -0.7027
+-0.8766 -3.264 1.142 -0.9658 -0.7374
+-0.8797 -3.275 1.104 -0.9658 -0.7702
+-0.8811 -3.28 1.058 -0.9658 -0.8011
+-0.8807 -3.279 1.006 -0.9658 -0.8301
+-0.8786 -3.271 0.9467 -0.9658 -0.8569
+-0.875 -3.258 0.881 -0.9658 -0.8816
+-0.8698 -3.238 0.8094 -0.9658 -0.9041
+-0.8631 -3.214 0.7322 -0.9658 -0.9243
+-0.8552 -3.184 0.65 -0.9658 -0.9422
+-0.8461 -3.15 0.5632 -0.9658 -0.9578
+-0.836 -3.113 0.4726 -0.9658 -0.971
+-0.8251 -3.072 0.3786 -0.9658 -0.9817
+-0.8134 -3.029 0.282 -0.9658 -0.99
+-0.8012 -2.983 0.1834 -0.9658 -0.9958
+-0.7887 -2.937 0.08356 -0.9658 -0.9991
+-0.776 -2.889 -0.0169 -0.9658 -1
+-0.7634 -2.842 -0.1172 -0.9658 -0.9983
+-0.751 -2.796 -0.2168 -0.9658 -0.9941
+-0.7389 -2.751 -0.3148 -0.9658 -0.9875
+-0.7275 -2.709 -0.4105 -0.9658 -0.9784
+-0.7168 -2.669 -0.5035 -0.9658 -0.9668
+-0.707 -2.632 -0.5929 -0.9658 -0.9528
+-0.6983 -2.6 -0.6782 -0.9658 -0.9365
+-0.6908 -2.572 -0.7587 -0.9658 -0.9178
+-0.6847 -2.549 -0.8341 -0.9658 -0.8968
+-0.68 -2.532 -0.9038 -0.9658 -0.8735
+-0.6768 -2.52 -0.9673 -0.9658 -0.8481
+-0.6753 -2.514 -1.024 -0.9658 -0.8206
+-0.6755 -2.515 -1.075 -0.9658 -0.791
+-0.6775 -2.522 -1.118 -0.9658 -0.7594
+-0.6812 -2.536 -1.153 -0.9658 -0.7259
+-0.6867 -2.557 -1.182 -0.9658 -0.6907
+-0.694 -2.584 -1.203 -0.9658 -0.6536
+-0.703 -2.617 -1.216 -0.9658 -0.615
+-0.7137 -2.657 -1.222 -0.9658 -0.5748
+-0.726 -2.703 -1.22 -0.9658 -0.5332
+-0.7398 -2.755 -1.212 -0.9658 -0.4903
+-0.7551 -2.811 -1.196 -0.9658 -0.4461
+-0.7716 -2.873 -1.174 -0.9658 -0.4008
+-0.7893 -2.939 -1.145 -0.9658 -0.3545
+-0.808 -3.008 -1.111 -0.9658 -0.3073
+-0.8275 -3.081 -1.071 -0.9658 -0.2594
+-0.8476 -3.156 -1.026 -0.9658 -0.2108
+-0.8683 -3.233 -0.9773 -0.9658 -0.1617
+-0.8891 -3.31 -0.9242 -0.9658 -0.1122
+-0.9101 -3.388 -0.8677 -0.9658 -0.06235
+-0.9309 -3.466 -0.8085 -0.9658 -0.01239
+-0.9514 -3.542 -0.7472 -0.9658 0.0376
+-0.9713 -3.616 -0.6844 -0.9658 0.0875
+-0.9905 -3.688 -0.6207 -0.9658 0.1372
+-1.009 -3.756 -0.5566 -0.9658 0.1865
+-1.026 -3.819 -0.4928 -0.9658 0.2354
+-1.042 -3.878 -0.4299 -0.9658 0.2837
+-1.056 -3.931 -0.3684 -0.9658 0.3312
+-1.068 -3.978 -0.3088 -0.9658 0.378
+-1.079 -4.018 -0.2516 -0.9658 0.4238
+-1.088 -4.051 -0.1973 -0.9658 0.4685
+-1.095 -4.076 -0.1463 -0.9658 0.5121
+-1.099 -4.094 -0.0989 -0.9658 0.5544
+-1.102 -4.103 -0.05548 -0.9658 0.5953
+-1.102 -4.103 -0.01629 -0.9658 0.6347
+-1.1 -4.095 0.01847 -0.9658 0.6725
+-1.095 -4.078 0.04865 -0.9658 0.7087
+-1.089 -4.053 0.07415 -0.9658 0.743
+-1.079 -4.019 0.09493 -0.9658 0.7756
+-1.068 -3.976 0.111 -0.9658 0.8061
+-1.054 -3.926 0.1224 -0.9658 0.8347
+-1.039 -3.867 0.1294 -0.9658 0.8612
+-1.021 -3.801 0.132 -0.9658 0.8855
+-1.001 -3.728 0.1306 -0.9658 0.9076
+-0.9799 -3.649 0.1253 -0.9658 0.9275
+-0.957 -3.563 0.1166 -0.9658 0.945
+-0.9327 -3.473 0.1048 -0.9658 0.9602
+-0.9072 -3.378 0.09026 -0.9658 0.9729
+-0.8807 -3.279 0.07344 -0.9658 0.9833
+-0.8533 -3.177 0.05481 -0.9658 0.9911
+-0.8254 -3.073 0.03484 -0.9658 0.9965
+-0.7971 -2.968 0.01403 -0.9658 0.9994
+-0.6324 -2.933 0 -0.9775 1
+-0.6094 -2.826 -0.02383 -0.9775 0.9988
+-0.5866 -2.72 -0.04712 -0.9775 0.995
+-0.5641 -2.616 -0.06936 -0.9775 0.9888
+-0.5422 -2.514 -0.09004 -0.9775 0.9801
+-0.521 -2.416 -0.1087 -0.9775 0.9689
+-0.5006 -2.322 -0.1248 -0.9775 0.9553
+-0.4813 -2.232 -0.1379 -0.9775 0.9394
+-0.4632 -2.148 -0.1476 -0.9775 0.9211
+-0.4463 -2.07 -0.1536 -0.9775 0.9004
+-0.4309 -1.998 -0.1556 -0.9775 0.8776
+-0.417 -1.934 -0.1531 -0.9775 0.8525
+-0.4048 -1.877 -0.1461 -0.9775 0.8253
+-0.3942 -1.828 -0.1344 -0.9775 0.7961
+-0.3855 -1.787 -0.1178 -0.9775 0.7648
+-0.3785 -1.755 -0.09624 -0.9775 0.7317
+-0.3735 -1.732 -0.06975 -0.9775 0.6967
+-0.3703 -1.717 -0.03839 -0.9775 0.66
+-0.3689 -1.711 -0.00226 -0.9775 0.6216
+-0.3695 -1.713 0.03846 -0.9775 0.5817
+-0.3718 -1.724 0.08353 -0.9775 0.5403
+-0.3759 -1.743 0.1327 -0.9775 0.4976
+-0.3818 -1.77 0.1855 -0.9775 0.4536
+-0.3892 -1.805 0.2418 -0.9775 0.4085
+-0.3982 -1.847 0.3009 -0.9775 0.3624
+-0.4086 -1.895 0.3624 -0.9775 0.3153
+-0.4202 -1.949 0.4259 -0.9775 0.2675
+-0.4331 -2.008 0.4907 -0.9775 0.219
+-0.447 -2.073 0.5563 -0.9775 0.17
+-0.4617 -2.141 0.6221 -0.9775 0.1205
+-0.4772 -2.213 0.6875 -0.9775 0.07074
+-0.4932 -2.287 0.7518 -0.9775 0.02079
+-0.5096 -2.363 0.8144 -0.9775 -0.0292
+-0.5263 -2.44 0.8747 -0.9775 -0.07912
+-0.543 -2.518 0.9321 -0.9775 -0.1288
+-0.5596 -2.595 0.986 -0.9775 -0.1782
+-0.576 -2.671 1.036 -0.9775 -0.2272
+-0.592 -2.745 1.081 -0.9775 -0.2756
+-0.6074 -2.817 1.121 -0.9775 -0.3233
+-0.6222 -2.885 1.155 -0.9775 -0.3702
+-0.6361 -2.95 1.183 -0.9775 -0.4161
+-0.6491 -3.01 1.204 -0.9775 -0.4611
+-0.661 -3.065 1.219 -0.9775 -0.5048
+-0.6718 -3.116 1.227 -0.9775 -0.5474
+-0.6814 -3.16 1.227 -0.9775 -0.5885
+-0.6897 -3.198 1.219 -0.9775 -0.6282
+-0.6966 -3.23 1.204 -0.9775 -0.6663
+-0.7022 -3.256 1.182 -0.9775 -0.7027
+-0.7063 -3.275 1.151 -0.9775 -0.7374
+-0.7091 -3.288 1.113 -0.9775 -0.7702
+-0.7104 -3.294 1.068 -0.9775 -0.8011
+-0.7104 -3.294 1.015 -0.9775 -0.8301
+-0.709 -3.288 0.9561 -0.9775 -0.8569
+-0.7064 -3.276 0.8901 -0.9775 -0.8816
+-0.7025 -3.258 0.818 -0.9775 -0.9041
+-0.6976 -3.235 0.7402 -0.9775 -0.9243
+-0.6916 -3.207 0.6572 -0.9775 -0.9422
+-0.6846 -3.175 0.5696 -0.9775 -0.9578
+-0.6769 -3.139 0.478 -0.9775 -0.971
+-0.6685 -3.1 0.383 -0.9775 -0.9817
+-0.6595 -3.058 0.2853 -0.9775 -0.99
+-0.6502 -3.015 0.1856 -0.9775 -0.9958
+-0.6405 -2.97 0.08455 -0.9775 -0.9991
+-0.6307 -2.925 -0.0171 -0.9775 -1
+-0.621 -2.88 -0.1186 -0.9775 -0.9983
+-0.6114 -2.835 -0.2193 -0.9775 -0.9941
+-0.6022 -2.793 -0.3184 -0.9775 -0.9875
+-0.5934 -2.752 -0.4153 -0.9775 -0.9784
+-0.5852 -2.714 -0.5092 -0.9775 -0.9668
+-0.5777 -2.679 -0.5995 -0.9775 -0.9528
+-0.5711 -2.648 -0.6856 -0.9775 -0.9365
+-0.5654 -2.622 -0.7669 -0.9775 -0.9178
+-0.5608 -2.601 -0.8429 -0.9775 -0.8968
+-0.5574 -2.585 -0.913 -0.9775 -0.8735
+-0.5551 -2.574 -0.9768 -0.9775 -0.8481
+-0.5542 -2.57 -1.034 -0.9775 -0.8206
+-0.5547 -2.572 -1.084 -0.9775 -0.791
+-0.5565 -2.581 -1.127 -0.9775 -0.7594
+-0.5597 -2.595 -1.162 -0.9775 -0.7259
+-0.5643 -2.617 -1.19 -0.9775 -0.6907
+-0.5703 -2.645 -1.21 -0.9775 -0.6536
+-0.5777 -2.679 -1.223 -0.9775 -0.615
+-0.5864 -2.72 -1.228 -0.9775 -0.5748
+-0.5964 -2.766 -1.225 -0.9775 -0.5332
+-0.6076 -2.818 -1.215 -0.9775 -0.4903
+-0.6199 -2.875 -1.198 -0.9775 -0.4461
+-0.6333 -2.937 -1.174 -0.9775 -0.4008
+-0.6475 -3.003 -1.144 -0.9775 -0.3545
+-0.6625 -3.072 -1.108 -0.9775 -0.3073
+-0.6781 -3.145 -1.066 -0.9775 -0.2594
+-0.6942 -3.219 -1.019 -0.9775 -0.2108
+-0.7107 -3.296 -0.9683 -0.9775 -0.1617
+-0.7274 -3.373 -0.9132 -0.9775 -0.1122
+-0.7441 -3.451 -0.8547 -0.9775 -0.06235
+-0.7607 -3.528 -0.7936 -0.9775 -0.01239
+-0.777 -3.603 -0.7303 -0.9775 0.0376
+-0.7929 -3.677 -0.6656 -0.9775 0.0875
+-0.8081 -3.748 -0.6 -0.9775 0.1372
+-0.8226 -3.815 -0.5342 -0.9775 0.1865
+-0.8361 -3.877 -0.4688 -0.9775 0.2354
+-0.8486 -3.935 -0.4044 -0.9775 0.2837
+-0.8598 -3.987 -0.3415 -0.9775 0.3312
+-0.8698 -4.033 -0.2807 -0.9775 0.378
+-0.8782 -4.073 -0.2225 -0.9775 0.4238
+-0.8851 -4.105 -0.1674 -0.9775 0.4685
+-0.8904 -4.129 -0.1157 -0.9775 0.5121
+-0.8939 -4.146 -0.0679 -0.9775 0.5544
+-0.8957 -4.154 -0.02426 -0.9775 0.5953
+-0.8956 -4.153 0.01493 -0.9775 0.6347
+-0.8937 -4.144 0.04947 -0.9775 0.6725
+-0.8898 -4.126 0.07921 -0.9775 0.7087
+-0.8841 -4.1 0.104 -0.9775 0.743
+-0.8766 -4.065 0.1239 -0.9775 0.7756
+-0.8672 -4.022 0.1389 -0.9775 0.8061
+-0.8561 -3.97 0.149 -0.9775 0.8347
+-0.8433 -3.911 0.1545 -0.9775 0.8612
+-0.8289 -3.844 0.1554 -0.9775 0.8855
+-0.8129 -3.77 0.1521 -0.9775 0.9076
+-0.7956 -3.69 0.1448 -0.9775 0.9275
+-0.7771 -3.604 0.1338 -0.9775 0.945
+-0.7574 -3.512 0.1197 -0.9775 0.9602
+-0.7367 -3.416 0.1027 -0.9775 0.9729
+-0.7153 -3.317 0.08329 -0.9775 0.9833
+-0.6931 -3.214 0.06203 -0.9775 0.9911
+-0.6706 -3.11 0.03938 -0.9775 0.9965
+-0.6477 -3.003 0.01585 -0.9775 0.9994
+-0.485 -2.961 0 -0.9868 1
+-0.4675 -2.854 -0.02654 -0.9868 0.9988
+-0.4501 -2.747 -0.05254 -0.9868 0.995
+-0.433 -2.643 -0.07744 -0.9868 0.9888
+-0.4162 -2.541 -0.1007 -0.9868 0.9801
+-0.4001 -2.442 -0.1218 -0.9868 0.9689
+-0.3845 -2.347 -0.1403 -0.9868 0.9553
+-0.3698 -2.257 -0.1558 -0.9868 0.9394
+-0.3559 -2.172 -0.1676 -0.9868 0.9211
+-0.343 -2.093 -0.1756 -0.9868 0.9004
+-0.3312 -2.021 -0.1794 -0.9868 0.8776
+-0.3205 -1.956 -0.1786 -0.9868 0.8525
+-0.3111 -1.899 -0.1731 -0.9868 0.8253
+-0.303 -1.849 -0.1626 -0.9868 0.7961
+-0.2962 -1.808 -0.147 -0.9868 0.7648
+-0.2908 -1.775 -0.1263 -0.9868 0.7317
+-0.2868 -1.75 -0.1004 -0.9868 0.6967
+-0.2842 -1.735 -0.06946 -0.9868 0.66
+-0.283 -1.728 -0.0335 -0.9868 0.6216
+-0.2833 -1.729 0.007266 -0.9868 0.5817
+-0.2849 -1.739 0.0526 -0.9868 0.5403
+-0.2879 -1.757 0.1022 -0.9868 0.4976
+-0.2921 -1.783 0.1558 -0.9868 0.4536
+-0.2976 -1.817 0.2129 -0.9868 0.4085
+-0.3042 -1.857 0.273 -0.9868 0.3624
+-0.312 -1.904 0.3358 -0.9868 0.3153
+-0.3207 -1.957 0.4006 -0.9868 0.2675
+-0.3302 -2.016 0.4669 -0.9868 0.219
+-0.3406 -2.079 0.5342 -0.9868 0.17
+-0.3516 -2.146 0.6017 -0.9868 0.1205
+-0.3632 -2.217 0.6689 -0.9868 0.07074
+-0.3753 -2.29 0.735 -0.9868 0.02079
+-0.3876 -2.366 0.7996 -0.9868 -0.0292
+-0.4001 -2.442 0.8619 -0.9868 -0.07912
+-0.4127 -2.519 0.9212 -0.9868 -0.1288
+-0.4253 -2.596 0.977 -0.9868 -0.1782
+-0.4376 -2.671 1.029 -0.9868 -0.2272
+-0.4497 -2.745 1.076 -0.9868 -0.2756
+-0.4614 -2.816 1.117 -0.9868 -0.3233
+-0.4725 -2.884 1.153 -0.9868 -0.3702
+-0.4831 -2.949 1.183 -0.9868 -0.4161
+-0.493 -3.009 1.206 -0.9868 -0.4611
+-0.5021 -3.065 1.222 -0.9868 -0.5048
+-0.5103 -3.115 1.231 -0.9868 -0.5474
+-0.5177 -3.16 1.232 -0.9868 -0.5885
+-0.524 -3.199 1.226 -0.9868 -0.6282
+-0.5294 -3.231 1.212 -0.9868 -0.6663
+-0.5338 -3.258 1.19 -0.9868 -0.7027
+-0.5371 -3.278 1.16 -0.9868 -0.7374
+-0.5393 -3.292 1.122 -0.9868 -0.7702
+-0.5405 -3.299 1.077 -0.9868 -0.8011
+-0.5407 -3.301 1.024 -0.9868 -0.8301
+-0.5399 -3.296 0.9649 -0.9868 -0.8569
+-0.5382 -3.285 0.8986 -0.9868 -0.8816
+-0.5355 -3.269 0.826 -0.9868 -0.9041
+-0.532 -3.247 0.7477 -0.9868 -0.9243
+-0.5277 -3.221 0.664 -0.9868 -0.9422
+-0.5228 -3.191 0.5756 -0.9868 -0.9578
+-0.5172 -3.157 0.4831 -0.9868 -0.971
+-0.5112 -3.12 0.3872 -0.9868 -0.9817
+-0.5047 -3.081 0.2885 -0.9868 -0.99
+-0.4979 -3.039 0.1876 -0.9868 -0.9958
+-0.4909 -2.996 0.08548 -0.9868 -0.9991
+-0.4838 -2.953 -0.01729 -0.9868 -1
+-0.4768 -2.91 -0.1199 -0.9868 -0.9983
+-0.4698 -2.868 -0.2217 -0.9868 -0.9941
+-0.4632 -2.827 -0.3219 -0.9868 -0.9875
+-0.4568 -2.788 -0.4198 -0.9868 -0.9784
+-0.4509 -2.752 -0.5147 -0.9868 -0.9668
+-0.4455 -2.719 -0.6058 -0.9868 -0.9528
+-0.4408 -2.691 -0.6927 -0.9868 -0.9365
+-0.4368 -2.666 -0.7746 -0.9868 -0.9178
+-0.4336 -2.646 -0.8511 -0.9868 -0.8968
+-0.4312 -2.632 -0.9216 -0.9868 -0.8735
+-0.4298 -2.623 -0.9857 -0.9868 -0.8481
+-0.4293 -2.62 -1.043 -0.9868 -0.8206
+-0.4298 -2.623 -1.093 -0.9868 -0.791
+-0.4314 -2.633 -1.136 -0.9868 -0.7594
+-0.434 -2.649 -1.171 -0.9868 -0.7259
+-0.4376 -2.671 -1.198 -0.9868 -0.6907
+-0.4423 -2.7 -1.217 -0.9868 -0.6536
+-0.4481 -2.735 -1.229 -0.9868 -0.615
+-0.4548 -2.776 -1.233 -0.9868 -0.5748
+-0.4624 -2.823 -1.229 -0.9868 -0.5332
+-0.471 -2.875 -1.218 -0.9868 -0.4903
+-0.4803 -2.932 -1.199 -0.9868 -0.4461
+-0.4904 -2.994 -1.174 -0.9868 -0.4008
+-0.5012 -3.059 -1.142 -0.9868 -0.3545
+-0.5126 -3.129 -1.104 -0.9868 -0.3073
+-0.5244 -3.201 -1.06 -0.9868 -0.2594
+-0.5366 -3.275 -1.012 -0.9868 -0.2108
+-0.549 -3.351 -0.9587 -0.9868 -0.1617
+-0.5616 -3.428 -0.9016 -0.9868 -0.1122
+-0.5742 -3.505 -0.8412 -0.9868 -0.06235
+-0.5866 -3.581 -0.7781 -0.9868 -0.01239
+-0.5989 -3.656 -0.7129 -0.9868 0.0376
+-0.6108 -3.728 -0.6463 -0.9868 0.0875
+-0.6222 -3.798 -0.579 -0.9868 0.1372
+-0.633 -3.864 -0.5115 -0.9868 0.1865
+-0.6431 -3.926 -0.4445 -0.9868 0.2354
+-0.6524 -3.982 -0.3786 -0.9868 0.2837
+-0.6608 -4.033 -0.3144 -0.9868 0.3312
+-0.6682 -4.078 -0.2525 -0.9868 0.378
+-0.6744 -4.117 -0.1933 -0.9868 0.4238
+-0.6795 -4.148 -0.1373 -0.9868 0.4685
+-0.6833 -4.171 -0.08508 -0.9868 0.5121
+-0.6858 -4.186 -0.03686 -0.9868 0.5544
+-0.687 -4.193 0.006967 -0.9868 0.5953
+-0.6868 -4.192 0.04614 -0.9868 0.6347
+-0.6852 -4.182 0.08044 -0.9868 0.6725
+-0.6821 -4.163 0.1097 -0.9868 0.7087
+-0.6776 -4.136 0.1339 -0.9868 0.743
+-0.6718 -4.1 0.1528 -0.9868 0.7756
+-0.6645 -4.056 0.1667 -0.9868 0.8061
+-0.6559 -4.004 0.1755 -0.9868 0.8347
+-0.6461 -3.944 0.1794 -0.9868 0.8612
+-0.635 -3.876 0.1786 -0.9868 0.8855
+-0.6229 -3.802 0.1734 -0.9868 0.9076
+-0.6096 -3.721 0.1641 -0.9868 0.9275
+-0.5954 -3.634 0.1509 -0.9868 0.945
+-0.5804 -3.543 0.1344 -0.9868 0.9602
+-0.5646 -3.446 0.115 -0.9868 0.9729
+-0.5482 -3.346 0.0931 -0.9868 0.9833
+-0.5314 -3.243 0.06922 -0.9868 0.9911
+-0.5141 -3.138 0.04389 -0.9868 0.9965
+-0.4967 -3.032 0.01765 -0.9868 0.9994
+-0.3365 -2.981 0 -0.9937 1
+-0.3244 -2.874 -0.02925 -0.9937 0.9988
+-0.3124 -2.768 -0.05792 -0.9937 0.995
+-0.3006 -2.663 -0.08546 -0.9937 0.9888
+-0.289 -2.561 -0.1113 -0.9937 0.9801
+-0.2779 -2.462 -0.1349 -0.9937 0.9689
+-0.2672 -2.367 -0.1558 -0.9937 0.9553
+-0.257 -2.277 -0.1735 -0.9937 0.9394
+-0.2474 -2.192 -0.1876 -0.9937 0.9211
+-0.2384 -2.113 -0.1976 -0.9937 0.9004
+-0.2303 -2.04 -0.2031 -0.9937 0.8776
+-0.2229 -1.975 -0.204 -0.9937 0.8525
+-0.2163 -1.917 -0.1999 -0.9937 0.8253
+-0.2107 -1.866 -0.1907 -0.9937 0.7961
+-0.2059 -1.824 -0.1762 -0.9937 0.7648
+-0.2021 -1.791 -0.1563 -0.9937 0.7317
+-0.1993 -1.765 -0.1311 -0.9937 0.6967
+-0.1974 -1.749 -0.1005 -0.9937 0.66
+-0.1965 -1.741 -0.06472 -0.9937 0.6216
+-0.1965 -1.741 -0.02393 -0.9937 0.5817
+-0.1975 -1.75 0.02165 -0.9937 0.5403
+-0.1994 -1.767 0.07171 -0.9937 0.4976
+-0.2022 -1.792 0.1259 -0.9937 0.4536
+-0.2059 -1.824 0.1838 -0.9937 0.4085
+-0.2103 -1.863 0.245 -0.9937 0.3624
+-0.2155 -1.909 0.3089 -0.9937 0.3153
+-0.2213 -1.961 0.3751 -0.9937 0.2675
+-0.2278 -2.018 0.4428 -0.9937 0.219
+-0.2348 -2.08 0.5117 -0.9937 0.17
+-0.2423 -2.147 0.5809 -0.9937 0.1205
+-0.2501 -2.216 0.6498 -0.9937 0.07074
+-0.2583 -2.288 0.7178 -0.9937 0.02079
+-0.2666 -2.363 0.7843 -0.9937 -0.0292
+-0.2752 -2.438 0.8485 -0.9937 -0.07912
+-0.2837 -2.514 0.9098 -0.9937 -0.1288
+-0.2923 -2.59 0.9675 -0.9937 -0.1782
+-0.3007 -2.664 1.021 -0.9937 -0.2272
+-0.3089 -2.737 1.07 -0.9937 -0.2756
+-0.3169 -2.808 1.113 -0.9937 -0.3233
+-0.3246 -2.876 1.151 -0.9937 -0.3702
+-0.3318 -2.94 1.182 -0.9937 -0.4161
+-0.3386 -3 1.207 -0.9937 -0.4611
+-0.3448 -3.055 1.224 -0.9937 -0.5048
+-0.3505 -3.106 1.234 -0.9937 -0.5474
+-0.3556 -3.151 1.237 -0.9937 -0.5885
+-0.3601 -3.19 1.232 -0.9937 -0.6282
+-0.3638 -3.224 1.218 -0.9937 -0.6663
+-0.3669 -3.251 1.197 -0.9937 -0.7027
+-0.3693 -3.272 1.167 -0.9937 -0.7374
+-0.371 -3.287 1.13 -0.9937 -0.7702
+-0.3719 -3.295 1.085 -0.9937 -0.8011
+-0.3722 -3.298 1.033 -0.9937 -0.8301
+-0.3718 -3.294 0.973 -0.9937 -0.8569
+-0.3708 -3.285 0.9065 -0.9937 -0.8816
+-0.3692 -3.271 0.8336 -0.9937 -0.9041
+-0.3669 -3.251 0.7547 -0.9937 -0.9243
+-0.3642 -3.227 0.6704 -0.9937 -0.9422
+-0.361 -3.199 0.5813 -0.9937 -0.9578
+-0.3574 -3.167 0.488 -0.9937 -0.971
+-0.3535 -3.132 0.3911 -0.9937 -0.9817
+-0.3493 -3.095 0.2914 -0.9937 -0.99
+-0.3449 -3.055 0.1896 -0.9937 -0.9958
+-0.3403 -3.015 0.08637 -0.9937 -0.9991
+-0.3357 -2.974 -0.01747 -0.9937 -1
+-0.3311 -2.933 -0.1212 -0.9937 -0.9983
+-0.3266 -2.893 -0.224 -0.9937 -0.9941
+-0.3222 -2.855 -0.3252 -0.9937 -0.9875
+-0.3181 -2.818 -0.424 -0.9937 -0.9784
+-0.3142 -2.784 -0.5198 -0.9937 -0.9668
+-0.3108 -2.753 -0.6118 -0.9937 -0.9528
+-0.3077 -2.726 -0.6993 -0.9937 -0.9365
+-0.3052 -2.704 -0.7819 -0.9937 -0.9178
+-0.3031 -2.686 -0.8588 -0.9937 -0.8968
+-0.3017 -2.673 -0.9296 -0.9937 -0.8735
+-0.3009 -2.666 -0.9939 -0.9937 -0.8481
+-0.3007 -2.664 -1.051 -0.9937 -0.8206
+-0.3012 -2.669 -1.101 -0.9937 -0.791
+-0.3024 -2.68 -1.144 -0.9937 -0.7594
+-0.3043 -2.697 -1.178 -0.9937 -0.7259
+-0.307 -2.72 -1.205 -0.9937 -0.6907
+-0.3103 -2.749 -1.224 -0.9937 -0.6536
+-0.3143 -2.784 -1.234 -0.9937 -0.615
+-0.3189 -2.826 -1.237 -0.9937 -0.5748
+-0.3242 -2.873 -1.232 -0.9937 -0.5332
+-0.3301 -2.925 -1.219 -0.9937 -0.4903
+-0.3366 -2.982 -1.199 -0.9937 -0.4461
+-0.3435 -3.043 -1.173 -0.9937 -0.4008
+-0.3509 -3.109 -1.139 -0.9937 -0.3545
+-0.3586 -3.178 -1.099 -0.9937 -0.3073
+-0.3667 -3.249 -1.054 -0.9937 -0.2594
+-0.375 -3.323 -1.004 -0.9937 -0.2108
+-0.3835 -3.398 -0.9485 -0.9937 -0.1617
+-0.3921 -3.474 -0.8895 -0.9937 -0.1122
+-0.4006 -3.55 -0.8272 -0.9937 -0.06235
+-0.4091 -3.625 -0.7622 -0.9937 -0.01239
+-0.4174 -3.698 -0.6951 -0.9937 0.0376
+-0.4255 -3.77 -0.6267 -0.9937 0.0875
+-0.4332 -3.838 -0.5576 -0.9937 0.1372
+-0.4405 -3.903 -0.4884 -0.9937 0.1865
+-0.4473 -3.964 -0.4199 -0.9937 0.2354
+-0.4536 -4.019 -0.3526 -0.9937 0.2837
+-0.4592 -4.069 -0.2871 -0.9937 0.3312
+-0.4642 -4.113 -0.2241 -0.9937 0.378
+-0.4683 -4.15 -0.1639 -0.9937 0.4238
+-0.4717 -4.179 -0.1072 -0.9937 0.4685
+-0.4742 -4.202 -0.05439 -0.9937 0.5121
+-0.4758 -4.216 -0.005803 -0.9937 0.5544
+-0.4765 -4.222 0.03819 -0.9937 0.5953
+-0.4762 -4.22 0.07732 -0.9937 0.6347
+-0.475 -4.209 0.1114 -0.9937 0.6725
+-0.4728 -4.189 0.1401 -0.9937 0.7087
+-0.4696 -4.161 0.1636 -0.9937 0.743
+-0.4655 -4.125 0.1817 -0.9937 0.7756
+-0.4605 -4.08 0.1944 -0.9937 0.8061
+-0.4545 -4.027 0.2019 -0.9937 0.8347
+-0.4477 -3.966 0.2043 -0.9937 0.8612
+-0.44 -3.898 0.2018 -0.9937 0.8855
+-0.4316 -3.824 0.1947 -0.9937 0.9076
+-0.4224 -3.743 0.1833 -0.9937 0.9275
+-0.4126 -3.656 0.168 -0.9937 0.945
+-0.4022 -3.564 0.1491 -0.9937 0.9602
+-0.3913 -3.467 0.1273 -0.9937 0.9729
+-0.38 -3.367 0.1028 -0.9937 0.9833
+-0.3684 -3.264 0.07636 -0.9937 0.9911
+-0.3565 -3.159 0.04838 -0.9937 0.9965
+-0.3445 -3.052 0.01945 -0.9937 0.9994
+-0.187 -2.994 0 -0.9981 1
+-0.1804 -2.887 -0.03193 -0.9981 0.9988
+-0.1738 -2.781 -0.06327 -0.9981 0.995
+-0.1672 -2.677 -0.09343 -0.9981 0.9888
+-0.1609 -2.575 -0.1218 -0.9981 0.9801
+-0.1547 -2.476 -0.148 -0.9981 0.9689
+-0.1488 -2.381 -0.1712 -0.9981 0.9553
+-0.1431 -2.291 -0.1912 -0.9981 0.9394
+-0.1378 -2.206 -0.2074 -0.9981 0.9211
+-0.1329 -2.127 -0.2193 -0.9981 0.9004
+-0.1283 -2.054 -0.2267 -0.9981 0.8776
+-0.1242 -1.989 -0.2293 -0.9981 0.8525
+-0.1206 -1.93 -0.2267 -0.9981 0.8253
+-0.1174 -1.88 -0.2187 -0.9981 0.7961
+-0.1148 -1.837 -0.2052 -0.9981 0.7648
+-0.1126 -1.803 -0.1862 -0.9981 0.7317
+-0.111 -1.777 -0.1616 -0.9981 0.6967
+-0.1099 -1.759 -0.1315 -0.9981 0.66
+-0.1094 -1.75 -0.0959 -0.9981 0.6216
+-0.1093 -1.75 -0.05511 -0.9981 0.5817
+-0.1098 -1.758 -0.009325 -0.9981 0.5403
+-0.1108 -1.773 0.04115 -0.9981 0.4976
+-0.1123 -1.797 0.09594 -0.9981 0.4536
+-0.1142 -1.828 0.1546 -0.9981 0.4085
+-0.1166 -1.866 0.2168 -0.9981 0.3624
+-0.1193 -1.91 0.2819 -0.9981 0.3153
+-0.1225 -1.961 0.3493 -0.9981 0.2675
+-0.126 -2.017 0.4185 -0.9981 0.219
+-0.1298 -2.077 0.4888 -0.9981 0.17
+-0.1338 -2.142 0.5597 -0.9981 0.1205
+-0.138 -2.21 0.6304 -0.9981 0.07074
+-0.1425 -2.281 0.7002 -0.9981 0.02079
+-0.147 -2.354 0.7685 -0.9981 -0.0292
+-0.1517 -2.428 0.8345 -0.9981 -0.07912
+-0.1563 -2.502 0.8977 -0.9981 -0.1288
+-0.161 -2.577 0.9573 -0.9981 -0.1782
+-0.1656 -2.651 1.013 -0.9981 -0.2272
+-0.1701 -2.723 1.063 -0.9981 -0.2756
+-0.1745 -2.793 1.109 -0.9981 -0.3233
+-0.1786 -2.86 1.148 -0.9981 -0.3702
+-0.1826 -2.923 1.181 -0.9981 -0.4161
+-0.1863 -2.983 1.207 -0.9981 -0.4611
+-0.1898 -3.038 1.226 -0.9981 -0.5048
+-0.1929 -3.089 1.237 -0.9981 -0.5474
+-0.1958 -3.134 1.241 -0.9981 -0.5885
+-0.1982 -3.174 1.236 -0.9981 -0.6282
+-0.2004 -3.207 1.224 -0.9981 -0.6663
+-0.2021 -3.235 1.203 -0.9981 -0.7027
+-0.2035 -3.257 1.174 -0.9981 -0.7374
+-0.2045 -3.273 1.138 -0.9981 -0.7702
+-0.2051 -3.283 1.093 -0.9981 -0.8011
+-0.2053 -3.286 1.04 -0.9981 -0.8301
+-0.2052 -3.285 0.9806 -0.9981 -0.8569
+-0.2047 -3.277 0.9139 -0.9981 -0.8816
+-0.2039 -3.264 0.8406 -0.9981 -0.9041
+-0.2028 -3.247 0.7613 -0.9981 -0.9243
+-0.2014 -3.224 0.6764 -0.9981 -0.9422
+-0.1998 -3.198 0.5866 -0.9981 -0.9578
+-0.1979 -3.169 0.4925 -0.9981 -0.971
+-0.1959 -3.136 0.3948 -0.9981 -0.9817
+-0.1937 -3.101 0.2942 -0.9981 -0.99
+-0.1914 -3.064 0.1914 -0.9981 -0.9958
+-0.189 -3.026 0.0872 -0.9981 -0.9991
+-0.1866 -2.988 -0.01764 -0.9981 -1
+-0.1842 -2.949 -0.1223 -0.9981 -0.9983
+-0.1819 -2.912 -0.2261 -0.9981 -0.9941
+-0.1796 -2.875 -0.3283 -0.9981 -0.9875
+-0.1775 -2.841 -0.428 -0.9981 -0.9784
+-0.1755 -2.809 -0.5246 -0.9981 -0.9668
+-0.1737 -2.781 -0.6173 -0.9981 -0.9528
+-0.1722 -2.756 -0.7055 -0.9981 -0.9365
+-0.1709 -2.735 -0.7886 -0.9981 -0.9178
+-0.1699 -2.719 -0.8659 -0.9981 -0.8968
+-0.1692 -2.708 -0.9371 -0.9981 -0.8735
+-0.1688 -2.703 -1.002 -0.9981 -0.8481
+-0.1688 -2.702 -1.059 -0.9981 -0.8206
+-0.1692 -2.708 -1.109 -0.9981 -0.791
+-0.1699 -2.72 -1.151 -0.9981 -0.7594
+-0.171 -2.738 -1.185 -0.9981 -0.7259
+-0.1725 -2.762 -1.211 -0.9981 -0.6907
+-0.1744 -2.792 -1.229 -0.9981 -0.6536
+-0.1766 -2.828 -1.239 -0.9981 -0.615
+-0.1792 -2.869 -1.241 -0.9981 -0.5748
+-0.1822 -2.916 -1.234 -0.9981 -0.5332
+-0.1854 -2.968 -1.22 -0.9981 -0.4903
+-0.189 -3.025 -1.199 -0.9981 -0.4461
+-0.1928 -3.086 -1.171 -0.9981 -0.4008
+-0.1968 -3.151 -1.135 -0.9981 -0.3545
+-0.2011 -3.219 -1.094 -0.9981 -0.3073
+-0.2055 -3.29 -1.047 -0.9981 -0.2594
+-0.21 -3.362 -0.9946 -0.9981 -0.2108
+-0.2147 -3.436 -0.9377 -0.9981 -0.1617
+-0.2193 -3.511 -0.8768 -0.9981 -0.1122
+-0.224 -3.586 -0.8126 -0.9981 -0.06235
+-0.2286 -3.659 -0.7457 -0.9981 -0.01239
+-0.2331 -3.732 -0.6768 -0.9981 0.0376
+-0.2375 -3.802 -0.6067 -0.9981 0.0875
+-0.2417 -3.869 -0.5359 -0.9981 0.1372
+-0.2456 -3.932 -0.4651 -0.9981 0.1865
+-0.2493 -3.991 -0.3951 -0.9981 0.2354
+-0.2527 -4.045 -0.3264 -0.9981 0.2837
+-0.2557 -4.094 -0.2597 -0.9981 0.3312
+-0.2584 -4.136 -0.1955 -0.9981 0.378
+-0.2606 -4.172 -0.1345 -0.9981 0.4238
+-0.2624 -4.2 -0.07706 -0.9981 0.4685
+-0.2637 -4.221 -0.02367 -0.9981 0.5121
+-0.2645 -4.234 0.02526 -0.9981 0.5544
+-0.2648 -4.239 0.0694 -0.9981 0.5953
+-0.2646 -4.236 0.1085 -0.9981 0.6347
+-0.2639 -4.224 0.1422 -0.9981 0.6725
+-0.2626 -4.204 0.1705 -0.9981 0.7087
+-0.2608 -4.175 0.1932 -0.9981 0.743
+-0.2585 -4.138 0.2104 -0.9981 0.7756
+-0.2557 -4.092 0.222 -0.9981 0.8061
+-0.2523 -4.039 0.2281 -0.9981 0.8347
+-0.2485 -3.978 0.229 -0.9981 0.8612
+-0.2443 -3.91 0.2248 -0.9981 0.8855
+-0.2396 -3.835 0.2158 -0.9981 0.9076
+-0.2345 -3.754 0.2024 -0.9981 0.9275
+-0.2291 -3.667 0.1849 -0.9981 0.945
+-0.2234 -3.575 0.1638 -0.9981 0.9602
+-0.2173 -3.479 0.1395 -0.9981 0.9729
+-0.2111 -3.379 0.1125 -0.9981 0.9833
+-0.2047 -3.276 0.08346 -0.9981 0.9911
+-0.1981 -3.171 0.05283 -0.9981 0.9965
+-0.1915 -3.065 0.02123 -0.9981 0.9994
+-0.03717 -3 0 -0.9999 1
+-0.03585 -2.894 -0.0346 -0.9999 0.9988
+-0.03455 -2.788 -0.06858 -0.9999 0.995
+-0.03326 -2.685 -0.1013 -0.9999 0.9888
+-0.032 -2.583 -0.1323 -0.9999 0.9801
+-0.03079 -2.485 -0.1609 -0.9999 0.9689
+-0.02962 -2.39 -0.1865 -0.9999 0.9553
+-0.0285 -2.301 -0.2087 -0.9999 0.9394
+-0.02745 -2.216 -0.227 -0.9999 0.9211
+-0.02647 -2.137 -0.241 -0.9999 0.9004
+-0.02558 -2.064 -0.2502 -0.9999 0.8776
+-0.02476 -1.998 -0.2544 -0.9999 0.8525
+-0.02404 -1.94 -0.2532 -0.9999 0.8253
+-0.0234 -1.889 -0.2465 -0.9999 0.7961
+-0.02287 -1.846 -0.2341 -0.9999 0.7648
+-0.02244 -1.811 -0.216 -0.9999 0.7317
+-0.02211 -1.785 -0.192 -0.9999 0.6967
+-0.02188 -1.766 -0.1623 -0.9999 0.66
+-0.02176 -1.757 -0.127 -0.9999 0.6216
+-0.02174 -1.755 -0.08625 -0.9999 0.5817
+-0.02183 -1.762 -0.04029 -0.9999 0.5403
+-0.02201 -1.776 0.01056 -0.9999 0.4976
+-0.02228 -1.798 0.06593 -0.9999 0.4536
+-0.02265 -1.828 0.1254 -0.9999 0.4085
+-0.0231 -1.864 0.1885 -0.9999 0.3624
+-0.02363 -1.907 0.2546 -0.9999 0.3153
+-0.02423 -1.956 0.3233 -0.9999 0.2675
+-0.0249 -2.01 0.3939 -0.9999 0.219
+-0.02563 -2.069 0.4657 -0.9999 0.17
+-0.02641 -2.132 0.5382 -0.9999 0.1205
+-0.02724 -2.198 0.6105 -0.9999 0.07074
+-0.0281 -2.268 0.6821 -0.9999 0.02079
+-0.02898 -2.339 0.7522 -0.9999 -0.0292
+-0.02988 -2.412 0.8201 -0.9999 -0.07912
+-0.03079 -2.485 0.8851 -0.9999 -0.1288
+-0.03169 -2.558 0.9466 -0.9999 -0.1782
+-0.03259 -2.63 1.004 -0.9999 -0.2272
+-0.03347 -2.701 1.056 -0.9999 -0.2756
+-0.03432 -2.77 1.103 -0.9999 -0.3233
+-0.03514 -2.836 1.144 -0.9999 -0.3702
+-0.03592 -2.899 1.179 -0.9999 -0.4161
+-0.03665 -2.958 1.206 -0.9999 -0.4611
+-0.03733 -3.013 1.227 -0.9999 -0.5048
+-0.03796 -3.063 1.239 -0.9999 -0.5474
+-0.03852 -3.109 1.244 -0.9999 -0.5885
+-0.03901 -3.148 1.241 -0.9999 -0.6282
+-0.03943 -3.183 1.229 -0.9999 -0.6663
+-0.03979 -3.211 1.209 -0.9999 -0.7027
+-0.04007 -3.234 1.181 -0.9999 -0.7374
+-0.04027 -3.251 1.144 -0.9999 -0.7702
+-0.04041 -3.261 1.1 -0.9999 -0.8011
+-0.04047 -3.267 1.047 -0.9999 -0.8301
+-0.04047 -3.266 0.9876 -0.9999 -0.8569
+-0.04039 -3.26 0.9207 -0.9999 -0.8816
+-0.04026 -3.249 0.8471 -0.9999 -0.9041
+-0.04006 -3.234 0.7673 -0.9999 -0.9243
+-0.03981 -3.213 0.6819 -0.9999 -0.9422
+-0.03952 -3.19 0.5915 -0.9999 -0.9578
+-0.03918 -3.162 0.4967 -0.9999 -0.971
+-0.0388 -3.132 0.3982 -0.9999 -0.9817
+-0.0384 -3.099 0.2968 -0.9999 -0.99
+-0.03798 -3.065 0.1931 -0.9999 -0.9958
+-0.03754 -3.03 0.08797 -0.9999 -0.9991
+-0.03709 -2.994 -0.0178 -0.9999 -1
+-0.03665 -2.958 -0.1234 -0.9999 -0.9983
+-0.03621 -2.923 -0.2281 -0.9999 -0.9941
+-0.03579 -2.889 -0.3312 -0.9999 -0.9875
+-0.0354 -2.857 -0.4317 -0.9999 -0.9784
+-0.03504 -2.828 -0.529 -0.9999 -0.9668
+-0.03471 -2.802 -0.6224 -0.9999 -0.9528
+-0.03443 -2.779 -0.7112 -0.9999 -0.9365
+-0.0342 -2.76 -0.7948 -0.9999 -0.9178
+-0.03402 -2.746 -0.8726 -0.9999 -0.8968
+-0.03391 -2.737 -0.9439 -0.9999 -0.8735
+-0.03386 -2.733 -1.008 -0.9999 -0.8481
+-0.03387 -2.734 -1.066 -0.9999 -0.8206
+-0.03396 -2.741 -1.115 -0.9999 -0.791
+-0.03412 -2.754 -1.157 -0.9999 -0.7594
+-0.03435 -2.773 -1.191 -0.9999 -0.7259
+-0.03466 -2.797 -1.216 -0.9999 -0.6907
+-0.03503 -2.828 -1.234 -0.9999 -0.6536
+-0.03548 -2.864 -1.243 -0.9999 -0.615
+-0.036 -2.905 -1.243 -0.9999 -0.5748
+-0.03658 -2.952 -1.236 -0.9999 -0.5332
+-0.03722 -3.004 -1.221 -0.9999 -0.4903
+-0.03792 -3.061 -1.198 -0.9999 -0.4461
+-0.03867 -3.121 -1.168 -0.9999 -0.4008
+-0.03946 -3.185 -1.131 -0.9999 -0.3545
+-0.04029 -3.252 -1.088 -0.9999 -0.3073
+-0.04116 -3.322 -1.039 -0.9999 -0.2594
+-0.04204 -3.393 -0.9851 -0.9999 -0.2108
+-0.04294 -3.466 -0.9263 -0.9999 -0.1617
+-0.04385 -3.539 -0.8636 -0.9999 -0.1122
+-0.04476 -3.613 -0.7975 -0.9999 -0.06235
+-0.04565 -3.685 -0.7288 -0.9999 -0.01239
+-0.04653 -3.755 -0.6582 -0.9999 0.0376
+-0.04737 -3.824 -0.5862 -0.9999 0.0875
+-0.04818 -3.889 -0.5138 -0.9999 0.1372
+-0.04895 -3.951 -0.4415 -0.9999 0.1865
+-0.04966 -4.008 -0.37 -0.9999 0.2354
+-0.05031 -4.061 -0.3 -0.9999 0.2837
+-0.05089 -4.107 -0.2321 -0.9999 0.3312
+-0.05139 -4.148 -0.1669 -0.9999 0.378
+-0.05182 -4.182 -0.105 -0.9999 0.4238
+-0.05215 -4.209 -0.04683 -0.9999 0.4685
+-0.0524 -4.229 0.007065 -0.9999 0.5121
+-0.05254 -4.241 0.05631 -0.9999 0.5544
+-0.05259 -4.245 0.1006 -0.9999 0.5953
+-0.05254 -4.241 0.1395 -0.9999 0.6347
+-0.05238 -4.228 0.173 -0.9999 0.6725
+-0.05212 -4.207 0.2007 -0.9999 0.7087
+-0.05176 -4.178 0.2227 -0.9999 0.743
+-0.05129 -4.14 0.239 -0.9999 0.7756
+-0.05073 -4.094 0.2494 -0.9999 0.8061
+-0.05006 -4.041 0.2542 -0.9999 0.8347
+-0.04931 -3.98 0.2536 -0.9999 0.8612
+-0.04846 -3.912 0.2477 -0.9999 0.8855
+-0.04754 -3.837 0.2368 -0.9999 0.9076
+-0.04653 -3.756 0.2213 -0.9999 0.9275
+-0.04546 -3.669 0.2017 -0.9999 0.945
+-0.04433 -3.578 0.1783 -0.9999 0.9602
+-0.04314 -3.482 0.1516 -0.9999 0.9729
+-0.04191 -3.383 0.1221 -0.9999 0.9833
+-0.04064 -3.28 0.0905 -0.9999 0.9911
+-0.03935 -3.176 0.05726 -0.9999 0.9965
+-0.03804 -3.07 0.023 -0.9999 0.9994
+0.1128 -2.998 0 -0.9993 1
+0.1088 -2.893 -0.03724 -0.9993 0.9988
+0.1049 -2.788 -0.07384 -0.9993 0.995
+0.1011 -2.685 -0.1092 -0.9993 0.9888
+0.09727 -2.585 -0.1427 -0.9993 0.9801
+0.0936 -2.487 -0.1737 -0.9993 0.9689
+0.09007 -2.394 -0.2017 -0.9993 0.9553
+0.08672 -2.305 -0.2262 -0.9993 0.9394
+0.08355 -2.22 -0.2466 -0.9993 0.9211
+0.08059 -2.142 -0.2625 -0.9993 0.9004
+0.07787 -2.069 -0.2735 -0.9993 0.8776
+0.0754 -2.004 -0.2793 -0.9993 0.8525
+0.0732 -1.945 -0.2796 -0.9993 0.8253
+0.07128 -1.894 -0.2742 -0.9993 0.7961
+0.06965 -1.851 -0.2629 -0.9993 0.7648
+0.06833 -1.816 -0.2456 -0.9993 0.7317
+0.0673 -1.789 -0.2224 -0.9993 0.6967
+0.06659 -1.77 -0.1931 -0.9993 0.66
+0.06619 -1.759 -0.1581 -0.9993 0.6216
+0.06609 -1.756 -0.1173 -0.9993 0.5817
+0.0663 -1.762 -0.07123 -0.9993 0.5403
+0.0668 -1.775 -0.02003 -0.9993 0.4976
+0.06758 -1.796 0.03587 -0.9993 0.4536
+0.06863 -1.824 0.09606 -0.9993 0.4085
+0.06994 -1.859 0.16 -0.9993 0.3624
+0.07149 -1.9 0.2272 -0.9993 0.3153
+0.07326 -1.947 0.2971 -0.9993 0.2675
+0.07523 -1.999 0.369 -0.9993 0.219
+0.07738 -2.056 0.4423 -0.9993 0.17
+0.07968 -2.118 0.5163 -0.9993 0.1205
+0.08211 -2.182 0.5903 -0.9993 0.07074
+0.08464 -2.249 0.6636 -0.9993 0.02079
+0.08726 -2.319 0.7354 -0.9993 -0.0292
+0.08992 -2.39 0.8051 -0.9993 -0.07912
+0.09261 -2.461 0.872 -0.9993 -0.1288
+0.09531 -2.533 0.9352 -0.9993 -0.1782
+0.09797 -2.604 0.9943 -0.9993 -0.2272
+0.1006 -2.673 1.048 -0.9993 -0.2756
+0.1031 -2.741 1.097 -0.9993 -0.3233
+0.1056 -2.806 1.14 -0.9993 -0.3702
+0.1079 -2.868 1.176 -0.9993 -0.4161
+0.1101 -2.926 1.205 -0.9993 -0.4611
+0.1122 -2.981 1.227 -0.9993 -0.5048
+0.114 -3.031 1.24 -0.9993 -0.5474
+0.1157 -3.076 1.246 -0.9993 -0.5885
+0.1172 -3.115 1.244 -0.9993 -0.6282
+0.1185 -3.15 1.233 -0.9993 -0.6663
+0.1196 -3.179 1.214 -0.9993 -0.7027
+0.1205 -3.202 1.186 -0.9993 -0.7374
+0.1212 -3.22 1.15 -0.9993 -0.7702
+0.1216 -3.232 1.106 -0.9993 -0.8011
+0.1219 -3.238 1.054 -0.9993 -0.8301
+0.1219 -3.239 0.9939 -0.9993 -0.8569
+0.1217 -3.235 0.9269 -0.9993 -0.8816
+0.1214 -3.226 0.8531 -0.9993 -0.9041
+0.1209 -3.212 0.7729 -0.9993 -0.9243
+0.1202 -3.194 0.6871 -0.9993 -0.9422
+0.1194 -3.173 0.5961 -0.9993 -0.9578
+0.1184 -3.148 0.5006 -0.9993 -0.971
+0.1174 -3.12 0.4014 -0.9993 -0.9817
+0.1163 -3.09 0.2991 -0.9993 -0.99
+0.1151 -3.058 0.1947 -0.9993 -0.9958
+0.1138 -3.026 0.08869 -0.9993 -0.9991
+0.1126 -2.992 -0.01794 -0.9993 -1
+0.1113 -2.959 -0.1244 -0.9993 -0.9983
+0.1101 -2.927 -0.23 -0.9993 -0.9941
+0.109 -2.895 -0.3338 -0.9993 -0.9875
+0.1079 -2.866 -0.4351 -0.9993 -0.9784
+0.1068 -2.839 -0.5332 -0.9993 -0.9668
+0.1059 -2.815 -0.6272 -0.9993 -0.9528
+0.1052 -2.795 -0.7165 -0.9993 -0.9365
+0.1045 -2.778 -0.8006 -0.9993 -0.9178
+0.1041 -2.766 -0.8786 -0.9993 -0.8968
+0.1038 -2.759 -0.9502 -0.9993 -0.8735
+0.1037 -2.756 -1.015 -0.9993 -0.8481
+0.1038 -2.759 -1.072 -0.9993 -0.8206
+0.1041 -2.767 -1.122 -0.9993 -0.791
+0.1047 -2.781 -1.163 -0.9993 -0.7594
+0.1054 -2.801 -1.196 -0.9993 -0.7259
+0.1063 -2.826 -1.221 -0.9993 -0.6907
+0.1075 -2.857 -1.238 -0.9993 -0.6536
+0.1089 -2.893 -1.246 -0.9993 -0.615
+0.1104 -2.935 -1.245 -0.9993 -0.5748
+0.1122 -2.981 -1.237 -0.9993 -0.5332
+0.1141 -3.033 -1.22 -0.9993 -0.4903
+0.1162 -3.089 -1.196 -0.9993 -0.4461
+0.1185 -3.148 -1.165 -0.9993 -0.4008
+0.1208 -3.211 -1.126 -0.9993 -0.3545
+0.1233 -3.277 -1.081 -0.9993 -0.3073
+0.1259 -3.346 -1.031 -0.9993 -0.2594
+0.1285 -3.416 -0.9749 -0.9993 -0.2108
+0.1312 -3.487 -0.9144 -0.9993 -0.1617
+0.1339 -3.559 -0.8499 -0.9993 -0.1122
+0.1366 -3.63 -0.782 -0.9993 -0.06235
+0.1392 -3.7 -0.7115 -0.9993 -0.01239
+0.1418 -3.769 -0.6391 -0.9993 0.0376
+0.1443 -3.836 -0.5655 -0.9993 0.0875
+0.1467 -3.899 -0.4914 -0.9993 0.1372
+0.149 -3.959 -0.4175 -0.9993 0.1865
+0.1511 -4.015 -0.3446 -0.9993 0.2354
+0.153 -4.065 -0.2733 -0.9993 0.2837
+0.1547 -4.11 -0.2043 -0.9993 0.3312
+0.1561 -4.149 -0.1381 -0.9993 0.378
+0.1574 -4.182 -0.07537 -0.9993 0.4238
+0.1583 -4.208 -0.01657 -0.9993 0.4685
+0.159 -4.226 0.0378 -0.9993 0.5121
+0.1594 -4.237 0.08732 -0.9993 0.5544
+0.1595 -4.239 0.1317 -0.9993 0.5953
+0.1593 -4.234 0.1705 -0.9993 0.6347
+0.1588 -4.221 0.2036 -0.9993 0.6725
+0.158 -4.199 0.2308 -0.9993 0.7087
+0.1569 -4.169 0.2521 -0.9993 0.743
+0.1554 -4.131 0.2674 -0.9993 0.7756
+0.1537 -4.085 0.2767 -0.9993 0.8061
+0.1517 -4.032 0.2802 -0.9993 0.8347
+0.1494 -3.971 0.278 -0.9993 0.8612
+0.1469 -3.903 0.2704 -0.9993 0.8855
+0.1441 -3.828 0.2577 -0.9993 0.9076
+0.141 -3.748 0.2402 -0.9993 0.9275
+0.1378 -3.662 0.2184 -0.9993 0.945
+0.1344 -3.571 0.1927 -0.9993 0.9602
+0.1308 -3.476 0.1636 -0.9993 0.9729
+0.1271 -3.377 0.1317 -0.9993 0.9833
+0.1233 -3.276 0.09748 -0.9993 0.9911
+0.1194 -3.172 0.06164 -0.9993 0.9965
+0.1154 -3.068 0.02475 -0.9993 0.9994
+0.2625 -2.988 0 -0.9962 1
+0.2534 -2.885 -0.03986 -0.9962 0.9988
+0.2443 -2.781 -0.07906 -0.9962 0.995
+0.2354 -2.68 -0.117 -0.9962 0.9888
+0.2267 -2.581 -0.153 -0.9962 0.9801
+0.2182 -2.484 -0.1864 -0.9962 0.9689
+0.2101 -2.391 -0.2168 -0.9962 0.9553
+0.2023 -2.303 -0.2434 -0.9962 0.9394
+0.195 -2.22 -0.2659 -0.9962 0.9211
+0.1881 -2.142 -0.2838 -0.9962 0.9004
+0.1818 -2.07 -0.2967 -0.9962 0.8776
+0.1761 -2.005 -0.3041 -0.9962 0.8525
+0.171 -1.947 -0.3059 -0.9962 0.8253
+0.1665 -1.896 -0.3017 -0.9962 0.7961
+0.1627 -1.852 -0.2915 -0.9962 0.7648
+0.1596 -1.817 -0.2751 -0.9962 0.7317
+0.1571 -1.789 -0.2525 -0.9962 0.6967
+0.1554 -1.769 -0.2238 -0.9962 0.66
+0.1544 -1.758 -0.189 -0.9962 0.6216
+0.1541 -1.754 -0.1484 -0.9962 0.5817
+0.1545 -1.759 -0.1021 -0.9962 0.5403
+0.1555 -1.77 -0.05061 -0.9962 0.4976
+0.1572 -1.79 0.005798 -0.9962 0.4536
+0.1595 -1.816 0.06666 -0.9962 0.4085
+0.1624 -1.849 0.1315 -0.9962 0.3624
+0.1659 -1.889 0.1997 -0.9962 0.3153
+0.1699 -1.934 0.2707 -0.9962 0.2675
+0.1743 -1.984 0.3439 -0.9962 0.219
+0.1791 -2.039 0.4186 -0.9962 0.17
+0.1843 -2.098 0.4941 -0.9962 0.1205
+0.1898 -2.161 0.5697 -0.9962 0.07074
+0.1955 -2.226 0.6447 -0.9962 0.02079
+0.2015 -2.294 0.7182 -0.9962 -0.0292
+0.2075 -2.362 0.7897 -0.9962 -0.07912
+0.2136 -2.432 0.8583 -0.9962 -0.1288
+0.2197 -2.502 0.9233 -0.9962 -0.1782
+0.2258 -2.571 0.9841 -0.9962 -0.2272
+0.2318 -2.639 1.04 -0.9962 -0.2756
+0.2376 -2.705 1.09 -0.9962 -0.3233
+0.2432 -2.769 1.135 -0.9962 -0.3702
+0.2486 -2.83 1.172 -0.9962 -0.4161
+0.2536 -2.887 1.203 -0.9962 -0.4611
+0.2583 -2.941 1.226 -0.9962 -0.5048
+0.2626 -2.99 1.241 -0.9962 -0.5474
+0.2666 -3.035 1.248 -0.9962 -0.5885
+0.2701 -3.075 1.246 -0.9962 -0.6282
+0.2731 -3.109 1.236 -0.9962 -0.6663
+0.2757 -3.139 1.218 -0.9962 -0.7027
+0.2778 -3.163 1.191 -0.9962 -0.7374
+0.2794 -3.181 1.155 -0.9962 -0.7702
+0.2806 -3.194 1.111 -0.9962 -0.8011
+0.2812 -3.202 1.059 -0.9962 -0.8301
+0.2815 -3.204 0.9997 -0.9962 -0.8569
+0.2812 -3.202 0.9325 -0.9962 -0.8816
+0.2806 -3.195 0.8585 -0.9962 -0.9041
+0.2796 -3.183 0.7781 -0.9962 -0.9243
+0.2782 -3.167 0.6918 -0.9962 -0.9422
+0.2765 -3.148 0.6003 -0.9962 -0.9578
+0.2745 -3.125 0.5042 -0.9962 -0.971
+0.2723 -3.1 0.4043 -0.9962 -0.9817
+0.2699 -3.073 0.3014 -0.9962 -0.99
+0.2674 -3.044 0.1961 -0.9962 -0.9958
+0.2647 -3.014 0.08936 -0.9962 -0.9991
+0.262 -2.983 -0.01808 -0.9962 -1
+0.2594 -2.953 -0.1254 -0.9962 -0.9983
+0.2568 -2.923 -0.2317 -0.9962 -0.9941
+0.2543 -2.895 -0.3363 -0.9962 -0.9875
+0.2519 -2.868 -0.4383 -0.9962 -0.9784
+0.2498 -2.844 -0.537 -0.9962 -0.9668
+0.2479 -2.822 -0.6316 -0.9962 -0.9528
+0.2463 -2.804 -0.7214 -0.9962 -0.9365
+0.245 -2.79 -0.8058 -0.9962 -0.9178
+0.2441 -2.78 -0.8842 -0.9962 -0.8968
+0.2436 -2.774 -0.9559 -0.9962 -0.8735
+0.2436 -2.773 -1.021 -0.9962 -0.8481
+0.2439 -2.777 -1.078 -0.9962 -0.8206
+0.2448 -2.787 -1.127 -0.9962 -0.791
+0.2461 -2.802 -1.168 -0.9962 -0.7594
+0.2479 -2.822 -1.201 -0.9962 -0.7259
+0.2501 -2.848 -1.225 -0.9962 -0.6907
+0.2529 -2.879 -1.241 -0.9962 -0.6536
+0.2561 -2.915 -1.248 -0.9962 -0.615
+0.2597 -2.957 -1.246 -0.9962 -0.5748
+0.2638 -3.003 -1.237 -0.9962 -0.5332
+0.2682 -3.054 -1.219 -0.9962 -0.4903
+0.2731 -3.109 -1.193 -0.9962 -0.4461
+0.2782 -3.167 -1.16 -0.9962 -0.4008
+0.2836 -3.229 -1.12 -0.9962 -0.3545
+0.2893 -3.294 -1.074 -0.9962 -0.3073
+0.2952 -3.361 -1.022 -0.9962 -0.2594
+0.3012 -3.429 -0.9642 -0.9962 -0.2108
+0.3073 -3.499 -0.9019 -0.9962 -0.1617
+0.3134 -3.568 -0.8356 -0.9962 -0.1122
+0.3195 -3.638 -0.7659 -0.9962 -0.06235
+0.3255 -3.706 -0.6937 -0.9962 -0.01239
+0.3314 -3.773 -0.6196 -0.9962 0.0376
+0.3371 -3.838 -0.5443 -0.9962 0.0875
+0.3425 -3.899 -0.4687 -0.9962 0.1372
+0.3475 -3.957 -0.3934 -0.9962 0.1865
+0.3522 -4.01 -0.3191 -0.9962 0.2354
+0.3565 -4.059 -0.2466 -0.9962 0.2837
+0.3603 -4.102 -0.1764 -0.9962 0.3312
+0.3636 -4.139 -0.1093 -0.9962 0.378
+0.3663 -4.17 -0.04573 -0.9962 0.4238
+0.3684 -4.194 0.01369 -0.9962 0.4685
+0.3699 -4.211 0.0685 -0.9962 0.5121
+0.3707 -4.221 0.1183 -0.9962 0.5544
+0.3709 -4.222 0.1627 -0.9962 0.5953
+0.3703 -4.216 0.2014 -0.9962 0.6347
+0.3691 -4.202 0.2341 -0.9962 0.6725
+0.3671 -4.18 0.2608 -0.9962 0.7087
+0.3645 -4.149 0.2813 -0.9962 0.743
+0.3611 -4.111 0.2956 -0.9962 0.7756
+0.3571 -4.065 0.3038 -0.9962 0.8061
+0.3524 -4.012 0.3059 -0.9962 0.8347
+0.347 -3.951 0.3022 -0.9962 0.8612
+0.3411 -3.883 0.2929 -0.9962 0.8855
+0.3346 -3.81 0.2783 -0.9962 0.9076
+0.3276 -3.73 0.2589 -0.9962 0.9275
+0.3201 -3.645 0.2349 -0.9962 0.945
+0.3122 -3.555 0.2069 -0.9962 0.9602
+0.304 -3.461 0.1755 -0.9962 0.9729
+0.2954 -3.363 0.1411 -0.9962 0.9833
+0.2866 -3.263 0.1044 -0.9962 0.9911
+0.2776 -3.161 0.06599 -0.9962 0.9965
+0.2686 -3.057 0.02649 -0.9962 0.9994
+0.4115 -2.972 0 -0.9905 1
+0.3974 -2.869 -0.04245 -0.9905 0.9988
+0.3833 -2.768 -0.08423 -0.9905 0.995
+0.3694 -2.668 -0.1247 -0.9905 0.9888
+0.3559 -2.57 -0.1632 -0.9905 0.9801
+0.3427 -2.475 -0.199 -0.9905 0.9689
+0.3301 -2.384 -0.2317 -0.9905 0.9553
+0.318 -2.296 -0.2605 -0.9905 0.9394
+0.3066 -2.214 -0.2851 -0.9905 0.9211
+0.296 -2.137 -0.305 -0.9905 0.9004
+0.2861 -2.066 -0.3196 -0.9905 0.8776
+0.2772 -2.001 -0.3287 -0.9905 0.8525
+0.2691 -1.944 -0.3319 -0.9905 0.8253
+0.2621 -1.893 -0.3291 -0.9905 0.7961
+0.2561 -1.849 -0.3199 -0.9905 0.7648
+0.2511 -1.814 -0.3044 -0.9905 0.7317
+0.2473 -1.785 -0.2826 -0.9905 0.6967
+0.2445 -1.765 -0.2543 -0.9905 0.66
+0.2428 -1.753 -0.2198 -0.9905 0.6216
+0.2421 -1.748 -0.1793 -0.9905 0.5817
+0.2426 -1.752 -0.133 -0.9905 0.5403
+0.244 -1.762 -0.08116 -0.9905 0.4976
+0.2465 -1.78 -0.02428 -0.9905 0.4536
+0.2499 -1.805 0.03722 -0.9905 0.4085
+0.2543 -1.836 0.1028 -0.9905 0.3624
+0.2594 -1.873 0.172 -0.9905 0.3153
+0.2654 -1.917 0.2442 -0.9905 0.2675
+0.2721 -1.965 0.3186 -0.9905 0.219
+0.2794 -2.018 0.3947 -0.9905 0.17
+0.2873 -2.075 0.4716 -0.9905 0.1205
+0.2956 -2.135 0.5488 -0.9905 0.07074
+0.3044 -2.198 0.6253 -0.9905 0.02079
+0.3134 -2.263 0.7006 -0.9905 -0.0292
+0.3226 -2.33 0.7737 -0.9905 -0.07912
+0.332 -2.397 0.844 -0.9905 -0.1288
+0.3414 -2.465 0.9108 -0.9905 -0.1782
+0.3507 -2.532 0.9733 -0.9905 -0.2272
+0.3598 -2.598 1.031 -0.9905 -0.2756
+0.3688 -2.663 1.083 -0.9905 -0.3233
+0.3774 -2.725 1.129 -0.9905 -0.3702
+0.3857 -2.785 1.168 -0.9905 -0.4161
+0.3935 -2.841 1.2 -0.9905 -0.4611
+0.4008 -2.894 1.224 -0.9905 -0.5048
+0.4075 -2.943 1.241 -0.9905 -0.5474
+0.4136 -2.987 1.249 -0.9905 -0.5885
+0.4191 -3.026 1.248 -0.9905 -0.6282
+0.4239 -3.061 1.239 -0.9905 -0.6663
+0.428 -3.091 1.221 -0.9905 -0.7027
+0.4314 -3.115 1.195 -0.9905 -0.7374
+0.4341 -3.134 1.16 -0.9905 -0.7702
+0.436 -3.149 1.116 -0.9905 -0.8011
+0.4373 -3.157 1.064 -0.9905 -0.8301
+0.4378 -3.161 1.005 -0.9905 -0.8569
+0.4377 -3.161 0.9376 -0.9905 -0.8816
+0.437 -3.155 0.8634 -0.9905 -0.9041
+0.4356 -3.146 0.7827 -0.9905 -0.9243
+0.4338 -3.132 0.696 -0.9905 -0.9422
+0.4314 -3.115 0.6041 -0.9905 -0.9578
+0.4286 -3.095 0.5075 -0.9905 -0.971
+0.4255 -3.073 0.407 -0.9905 -0.9817
+0.4221 -3.048 0.3034 -0.9905 -0.99
+0.4185 -3.022 0.1974 -0.9905 -0.9958
+0.4147 -2.995 0.08996 -0.9905 -0.9991
+0.4109 -2.967 -0.0182 -0.9905 -1
+0.4071 -2.939 -0.1262 -0.9905 -0.9983
+0.4033 -2.912 -0.2333 -0.9905 -0.9941
+0.3998 -2.887 -0.3385 -0.9905 -0.9875
+0.3965 -2.863 -0.4412 -0.9905 -0.9784
+0.3934 -2.841 -0.5404 -0.9905 -0.9668
+0.3908 -2.822 -0.6355 -0.9905 -0.9528
+0.3886 -2.806 -0.7258 -0.9905 -0.9365
+0.3869 -2.794 -0.8105 -0.9905 -0.9178
+0.3858 -2.786 -0.8891 -0.9905 -0.8968
+0.3853 -2.782 -0.961 -0.9905 -0.8735
+0.3854 -2.783 -1.026 -0.9905 -0.8481
+0.3861 -2.788 -1.083 -0.9905 -0.8206
+0.3876 -2.799 -1.132 -0.9905 -0.791
+0.3898 -2.815 -1.172 -0.9905 -0.7594
+0.3927 -2.836 -1.205 -0.9905 -0.7259
+0.3963 -2.862 -1.228 -0.9905 -0.6907
+0.4007 -2.893 -1.243 -0.9905 -0.6536
+0.4057 -2.93 -1.249 -0.9905 -0.615
+0.4114 -2.971 -1.247 -0.9905 -0.5748
+0.4178 -3.017 -1.236 -0.9905 -0.5332
+0.4247 -3.067 -1.217 -0.9905 -0.4903
+0.4322 -3.121 -1.19 -0.9905 -0.4461
+0.4401 -3.178 -1.156 -0.9905 -0.4008
+0.4485 -3.239 -1.114 -0.9905 -0.3545
+0.4573 -3.302 -1.066 -0.9905 -0.3073
+0.4663 -3.367 -1.012 -0.9905 -0.2594
+0.4755 -3.434 -0.9528 -0.9905 -0.2108
+0.4849 -3.501 -0.8888 -0.9905 -0.1617
+0.4942 -3.569 -0.8207 -0.9905 -0.1122
+0.5036 -3.636 -0.7494 -0.9905 -0.06235
+0.5127 -3.702 -0.6755 -0.9905 -0.01239
+0.5217 -3.767 -0.5997 -0.9905 0.0376
+0.5303 -3.829 -0.5228 -0.9905 0.0875
+0.5385 -3.888 -0.4457 -0.9905 0.1372
+0.5462 -3.944 -0.369 -0.9905 0.1865
+0.5533 -3.995 -0.2934 -0.9905 0.2354
+0.5597 -4.042 -0.2196 -0.9905 0.2837
+0.5654 -4.083 -0.1484 -0.9905 0.3312
+0.5704 -4.118 -0.08035 -0.9905 0.378
+0.5744 -4.148 -0.01605 -0.9905 0.4238
+0.5775 -4.17 0.04395 -0.9905 0.4685
+0.5796 -4.186 0.09917 -0.9905 0.5121
+0.5808 -4.194 0.1492 -0.9905 0.5544
+0.5808 -4.194 0.1936 -0.9905 0.5953
+0.5798 -4.187 0.2321 -0.9905 0.6347
+0.5778 -4.172 0.2645 -0.9905 0.6725
+0.5746 -4.149 0.2906 -0.9905 0.7087
+0.5704 -4.119 0.3104 -0.9905 0.743
+0.5651 -4.08 0.3237 -0.9905 0.7756
+0.5587 -4.034 0.3307 -0.9905 0.8061
+0.5513 -3.981 0.3315 -0.9905 0.8347
+0.543 -3.921 0.3263 -0.9905 0.8612
+0.5337 -3.854 0.3153 -0.9905 0.8855
+0.5236 -3.781 0.2989 -0.9905 0.9076
+0.5127 -3.702 0.2774 -0.9905 0.9275
+0.5011 -3.618 0.2513 -0.9905 0.945
+0.4888 -3.529 0.2211 -0.9905 0.9602
+0.4759 -3.437 0.1873 -0.9905 0.9729
+0.4627 -3.341 0.1505 -0.9905 0.9833
+0.449 -3.242 0.1113 -0.9905 0.9911
+0.435 -3.141 0.0703 -0.9905 0.9965
+0.4209 -3.04 0.02822 -0.9905 0.9994
+0.5595 -2.947 0 -0.9825 1
+0.5405 -2.847 -0.04502 -0.9825 0.9988
+0.5216 -2.747 -0.08935 -0.9825 0.995
+0.5029 -2.649 -0.1323 -0.9825 0.9888
+0.4847 -2.553 -0.1732 -0.9825 0.9801
+0.467 -2.46 -0.2115 -0.9825 0.9689
+0.4499 -2.37 -0.2464 -0.9825 0.9553
+0.4336 -2.284 -0.2775 -0.9825 0.9394
+0.4183 -2.203 -0.3042 -0.9825 0.9211
+0.4039 -2.127 -0.3259 -0.9825 0.9004
+0.3906 -2.057 -0.3424 -0.9825 0.8776
+0.3784 -1.993 -0.3531 -0.9825 0.8525
+0.3676 -1.936 -0.3578 -0.9825 0.8253
+0.358 -1.886 -0.3562 -0.9825 0.7961
+0.3498 -1.842 -0.3482 -0.9825 0.7648
+0.343 -1.807 -0.3336 -0.9825 0.7317
+0.3376 -1.778 -0.3124 -0.9825 0.6967
+0.3337 -1.758 -0.2847 -0.9825 0.66
+0.3312 -1.744 -0.2505 -0.9825 0.6216
+0.3301 -1.739 -0.2101 -0.9825 0.5817
+0.3305 -1.741 -0.1637 -0.9825 0.5403
+0.3322 -1.75 -0.1117 -0.9825 0.4976
+0.3353 -1.766 -0.05435 -0.9825 0.4536
+0.3397 -1.789 0.007763 -0.9825 0.4085
+0.3453 -1.819 0.07416 -0.9825 0.3624
+0.352 -1.854 0.1443 -0.9825 0.3153
+0.3598 -1.895 0.2175 -0.9825 0.2675
+0.3685 -1.941 0.2931 -0.9825 0.219
+0.3781 -1.992 0.3705 -0.9825 0.17
+0.3885 -2.046 0.4488 -0.9825 0.1205
+0.3995 -2.104 0.5275 -0.9825 0.07074
+0.411 -2.165 0.6056 -0.9825 0.02079
+0.4229 -2.228 0.6825 -0.9825 -0.0292
+0.4351 -2.292 0.7573 -0.9825 -0.07912
+0.4475 -2.357 0.8293 -0.9825 -0.1288
+0.4599 -2.423 0.8977 -0.9825 -0.1782
+0.4723 -2.488 0.9619 -0.9825 -0.2272
+0.4845 -2.552 1.021 -0.9825 -0.2756
+0.4964 -2.615 1.075 -0.9825 -0.3233
+0.5079 -2.675 1.122 -0.9825 -0.3702
+0.5189 -2.733 1.163 -0.9825 -0.4161
+0.5294 -2.789 1.196 -0.9825 -0.4611
+0.5392 -2.84 1.222 -0.9825 -0.5048
+0.5483 -2.888 1.239 -0.9825 -0.5474
+0.5566 -2.932 1.249 -0.9825 -0.5885
+0.564 -2.971 1.249 -0.9825 -0.6282
+0.5706 -3.006 1.241 -0.9825 -0.6663
+0.5763 -3.036 1.224 -0.9825 -0.7027
+0.581 -3.06 1.198 -0.9825 -0.7374
+0.5848 -3.08 1.163 -0.9825 -0.7702
+0.5876 -3.095 1.12 -0.9825 -0.8011
+0.5895 -3.105 1.069 -0.9825 -0.8301
+0.5906 -3.111 1.009 -0.9825 -0.8569
+0.5907 -3.112 0.9421 -0.9825 -0.8816
+0.5901 -3.108 0.8678 -0.9825 -0.9041
+0.5886 -3.101 0.7868 -0.9825 -0.9243
+0.5865 -3.089 0.6999 -0.9825 -0.9422
+0.5837 -3.075 0.6075 -0.9825 -0.9578
+0.5804 -3.057 0.5104 -0.9825 -0.971
+0.5767 -3.038 0.4094 -0.9825 -0.9817
+0.5725 -3.016 0.3052 -0.9825 -0.99
+0.5681 -2.992 0.1986 -0.9825 -0.9958
+0.5634 -2.968 0.09052 -0.9825 -0.9991
+0.5587 -2.943 -0.01831 -0.9825 -1
+0.5541 -2.919 -0.127 -0.9825 -0.9983
+0.5495 -2.894 -0.2347 -0.9825 -0.9941
+0.5451 -2.872 -0.3406 -0.9825 -0.9875
+0.5411 -2.85 -0.4438 -0.9825 -0.9784
+0.5375 -2.831 -0.5436 -0.9825 -0.9668
+0.5343 -2.815 -0.6391 -0.9825 -0.9528
+0.5318 -2.801 -0.7297 -0.9825 -0.9365
+0.5299 -2.791 -0.8148 -0.9825 -0.9178
+0.5287 -2.785 -0.8935 -0.9825 -0.8968
+0.5283 -2.783 -0.9655 -0.9825 -0.8735
+0.5287 -2.785 -1.03 -0.9825 -0.8481
+0.5301 -2.792 -1.087 -0.9825 -0.8206
+0.5323 -2.804 -1.136 -0.9825 -0.791
+0.5355 -2.821 -1.176 -0.9825 -0.7594
+0.5396 -2.842 -1.208 -0.9825 -0.7259
+0.5446 -2.869 -1.231 -0.9825 -0.6907
+0.5506 -2.9 -1.245 -0.9825 -0.6536
+0.5574 -2.936 -1.25 -0.9825 -0.615
+0.5652 -2.977 -1.246 -0.9825 -0.5748
+0.5738 -3.022 -1.234 -0.9825 -0.5332
+0.5831 -3.071 -1.214 -0.9825 -0.4903
+0.5931 -3.124 -1.186 -0.9825 -0.4461
+0.6038 -3.18 -1.15 -0.9825 -0.4008
+0.615 -3.24 -1.107 -0.9825 -0.3545
+0.6267 -3.301 -1.057 -0.9825 -0.3073
+0.6387 -3.364 -1.002 -0.9825 -0.2594
+0.6509 -3.429 -0.9409 -0.9825 -0.2108
+0.6633 -3.494 -0.8752 -0.9825 -0.1617
+0.6758 -3.56 -0.8054 -0.9825 -0.1122
+0.6881 -3.625 -0.7324 -0.9825 -0.06235
+0.7002 -3.688 -0.6568 -0.9825 -0.01239
+0.712 -3.751 -0.5794 -0.9825 0.0376
+0.7234 -3.81 -0.501 -0.9825 0.0875
+0.7342 -3.867 -0.4224 -0.9825 0.1372
+0.7443 -3.92 -0.3443 -0.9825 0.1865
+0.7536 -3.969 -0.2674 -0.9825 0.2354
+0.762 -4.014 -0.1925 -0.9825 0.2837
+0.7694 -4.053 -0.1203 -0.9825 0.3312
+0.7758 -4.086 -0.05139 -0.9825 0.378
+0.781 -4.114 0.01363 -0.9825 0.4238
+0.7849 -4.135 0.07418 -0.9825 0.4685
+0.7876 -4.149 0.1298 -0.9825 0.5121
+0.7889 -4.155 0.18 -0.9825 0.5544
+0.7888 -4.155 0.2244 -0.9825 0.5953
+0.7872 -4.147 0.2627 -0.9825 0.6347
+0.7843 -4.131 0.2947 -0.9825 0.6725
+0.7798 -4.108 0.3203 -0.9825 0.7087
+0.774 -4.077 0.3392 -0.9825 0.743
+0.7667 -4.039 0.3516 -0.9825 0.7756
+0.758 -3.993 0.3574 -0.9825 0.8061
+0.748 -3.94 0.3569 -0.9825 0.8347
+0.7367 -3.881 0.3501 -0.9825 0.8612
+0.7242 -3.814 0.3375 -0.9825 0.8855
+0.7105 -3.742 0.3192 -0.9825 0.9076
+0.6957 -3.665 0.2957 -0.9825 0.9275
+0.68 -3.582 0.2675 -0.9825 0.945
+0.6635 -3.495 0.2351 -0.9825 0.9602
+0.6462 -3.404 0.199 -0.9825 0.9729
+0.6283 -3.31 0.1597 -0.9825 0.9833
+0.6099 -3.213 0.1181 -0.9825 0.9911
+0.5912 -3.114 0.07456 -0.9825 0.9965
+0.5722 -3.014 0.02992 -0.9825 0.9994
+0.7061 -2.916 0 -0.9719 1
+0.6824 -2.818 -0.04756 -0.9719 0.9988
+0.6588 -2.72 -0.09441 -0.9719 0.995
+0.6355 -2.624 -0.1399 -0.9719 0.9888
+0.6127 -2.53 -0.1832 -0.9719 0.9801
+0.5906 -2.439 -0.2238 -0.9719 0.9689
+0.5693 -2.351 -0.261 -0.9719 0.9553
+0.549 -2.267 -0.2943 -0.9719 0.9394
+0.5297 -2.187 -0.323 -0.9719 0.9211
+0.5117 -2.113 -0.3467 -0.9719 0.9004
+0.495 -2.044 -0.3649 -0.9719 0.8776
+0.4797 -1.981 -0.3772 -0.9719 0.8525
+0.466 -1.924 -0.3834 -0.9719 0.8253
+0.454 -1.874 -0.3831 -0.9719 0.7961
+0.4435 -1.831 -0.3762 -0.9719 0.7648
+0.4349 -1.796 -0.3625 -0.9719 0.7317
+0.428 -1.767 -0.342 -0.9719 0.6967
+0.4228 -1.746 -0.3149 -0.9719 0.66
+0.4195 -1.732 -0.281 -0.9719 0.6216
+0.4179 -1.726 -0.2408 -0.9719 0.5817
+0.4181 -1.727 -0.1944 -0.9719 0.5403
+0.42 -1.734 -0.1421 -0.9719 0.4976
+0.4236 -1.749 -0.08438 -0.9719 0.4536
+0.4288 -1.77 -0.0217 -0.9719 0.4085
+0.4354 -1.798 0.04542 -0.9719 0.3624
+0.4435 -1.831 0.1164 -0.9719 0.3153
+0.4529 -1.87 0.1906 -0.9719 0.2675
+0.4634 -1.914 0.2674 -0.9719 0.219
+0.4751 -1.962 0.346 -0.9719 0.17
+0.4877 -2.014 0.4258 -0.9719 0.1205
+0.5011 -2.069 0.5059 -0.9719 0.07074
+0.5151 -2.127 0.5855 -0.9719 0.02079
+0.5297 -2.187 0.6639 -0.9719 -0.0292
+0.5447 -2.249 0.7404 -0.9719 -0.07912
+0.5599 -2.312 0.814 -0.9719 -0.1288
+0.5752 -2.375 0.8841 -0.9719 -0.1782
+0.5904 -2.438 0.9499 -0.9719 -0.2272
+0.6054 -2.5 1.011 -0.9719 -0.2756
+0.6201 -2.561 1.066 -0.9719 -0.3233
+0.6344 -2.619 1.115 -0.9719 -0.3702
+0.6481 -2.676 1.157 -0.9719 -0.4161
+0.6611 -2.73 1.192 -0.9719 -0.4611
+0.6733 -2.78 1.219 -0.9719 -0.5048
+0.6847 -2.827 1.238 -0.9719 -0.5474
+0.6951 -2.87 1.248 -0.9719 -0.5885
+0.7045 -2.909 1.249 -0.9719 -0.6282
+0.7128 -2.943 1.242 -0.9719 -0.6663
+0.7201 -2.973 1.226 -0.9719 -0.7027
+0.7262 -2.998 1.201 -0.9719 -0.7374
+0.7311 -3.019 1.166 -0.9719 -0.7702
+0.735 -3.035 1.124 -0.9719 -0.8011
+0.7377 -3.046 1.072 -0.9719 -0.8301
+0.7394 -3.053 1.013 -0.9719 -0.8569
+0.7399 -3.055 0.946 -0.9719 -0.8816
+0.7395 -3.054 0.8716 -0.9719 -0.9041
+0.7382 -3.048 0.7905 -0.9719 -0.9243
+0.736 -3.039 0.7033 -0.9719 -0.9422
+0.7331 -3.027 0.6106 -0.9719 -0.9578
+0.7295 -3.012 0.5131 -0.9719 -0.971
+0.7253 -2.995 0.4116 -0.9719 -0.9817
+0.7207 -2.976 0.3069 -0.9719 -0.99
+0.7157 -2.955 0.1997 -0.9719 -0.9958
+0.7105 -2.934 0.09101 -0.9719 -0.9991
+0.7053 -2.912 -0.01841 -0.9719 -1
+0.7 -2.89 -0.1277 -0.9719 -0.9983
+0.6949 -2.869 -0.236 -0.9719 -0.9941
+0.69 -2.849 -0.3424 -0.9719 -0.9875
+0.6855 -2.83 -0.4461 -0.9719 -0.9784
+0.6815 -2.814 -0.5463 -0.9719 -0.9668
+0.6781 -2.8 -0.6423 -0.9719 -0.9528
+0.6754 -2.789 -0.7332 -0.9719 -0.9365
+0.6735 -2.781 -0.8185 -0.9719 -0.9178
+0.6725 -2.777 -0.8974 -0.9719 -0.8968
+0.6724 -2.776 -0.9694 -0.9719 -0.8735
+0.6734 -2.78 -1.034 -0.9719 -0.8481
+0.6754 -2.789 -1.091 -0.9719 -0.8206
+0.6785 -2.801 -1.139 -0.9719 -0.791
+0.6827 -2.819 -1.179 -0.9719 -0.7594
+0.688 -2.841 -1.21 -0.9719 -0.7259
+0.6945 -2.868 -1.232 -0.9719 -0.6907
+0.7022 -2.899 -1.246 -0.9719 -0.6536
+0.7109 -2.935 -1.25 -0.9719 -0.615
+0.7206 -2.975 -1.245 -0.9719 -0.5748
+0.7313 -3.02 -1.232 -0.9719 -0.5332
+0.743 -3.068 -1.211 -0.9719 -0.4903
+0.7555 -3.12 -1.181 -0.9719 -0.4461
+0.7687 -3.174 -1.144 -0.9719 -0.4008
+0.7826 -3.232 -1.099 -0.9719 -0.3545
+0.7971 -3.291 -1.048 -0.9719 -0.3073
+0.8119 -3.352 -0.9909 -0.9719 -0.2594
+0.827 -3.415 -0.9283 -0.9719 -0.2108
+0.8423 -3.478 -0.861 -0.9719 -0.1617
+0.8575 -3.541 -0.7896 -0.9719 -0.1122
+0.8727 -3.603 -0.7149 -0.9719 -0.06235
+0.8875 -3.665 -0.6377 -0.9719 -0.01239
+0.9019 -3.724 -0.5588 -0.9719 0.0376
+0.9158 -3.781 -0.4789 -0.9719 0.0875
+0.9289 -3.836 -0.3989 -0.9719 0.1372
+0.9412 -3.886 -0.3194 -0.9719 0.1865
+0.9525 -3.933 -0.2413 -0.9719 0.2354
+0.9627 -3.975 -0.1653 -0.9719 0.2837
+0.9717 -4.012 -0.09214 -0.9719 0.3312
+0.9793 -4.043 -0.02239 -0.9719 0.378
+0.9854 -4.069 0.0433 -0.9719 0.4238
+0.9901 -4.088 0.1044 -0.9719 0.4685
+0.9931 -4.1 0.1603 -0.9719 0.5121
+0.9944 -4.106 0.2106 -0.9719 0.5544
+0.994 -4.104 0.255 -0.9719 0.5953
+0.9919 -4.095 0.2931 -0.9719 0.6347
+0.9879 -4.079 0.3247 -0.9719 0.6725
+0.9822 -4.056 0.3497 -0.9719 0.7087
+0.9747 -4.025 0.3679 -0.9719 0.743
+0.9654 -3.986 0.3792 -0.9719 0.7756
+0.9545 -3.941 0.3839 -0.9719 0.8061
+0.9418 -3.889 0.382 -0.9719 0.8347
+0.9276 -3.83 0.3738 -0.9719 0.8612
+0.9118 -3.765 0.3594 -0.9719 0.8855
+0.8947 -3.694 0.3393 -0.9719 0.9076
+0.8762 -3.618 0.3139 -0.9719 0.9275
+0.8566 -3.537 0.2836 -0.9719 0.945
+0.8359 -3.452 0.2489 -0.9719 0.9602
+0.8143 -3.362 0.2105 -0.9719 0.9729
+0.792 -3.27 0.1689 -0.9719 0.9833
+0.769 -3.175 0.1248 -0.9719 0.9911
+0.7456 -3.079 0.07878 -0.9719 0.9965
+0.7219 -2.981 0.03161 -0.9719 0.9994
+0.851 -2.877 0 -0.9589 1
+0.8227 -2.781 -0.05007 -0.9589 0.9988
+0.7946 -2.686 -0.09942 -0.9589 0.995
+0.7669 -2.592 -0.1473 -0.9589 0.9888
+0.7397 -2.501 -0.1931 -0.9589 0.9801
+0.7134 -2.412 -0.236 -0.9589 0.9689
+0.688 -2.326 -0.2755 -0.9589 0.9553
+0.6637 -2.244 -0.3109 -0.9589 0.9394
+0.6407 -2.166 -0.3416 -0.9589 0.9211
+0.6192 -2.093 -0.3672 -0.9589 0.9004
+0.5992 -2.026 -0.3872 -0.9589 0.8776
+0.5809 -1.964 -0.4012 -0.9589 0.8525
+0.5644 -1.908 -0.4088 -0.9589 0.8253
+0.5499 -1.859 -0.4098 -0.9589 0.7961
+0.5373 -1.816 -0.4039 -0.9589 0.7648
+0.5267 -1.781 -0.3912 -0.9589 0.7317
+0.5183 -1.752 -0.3715 -0.9589 0.6967
+0.5119 -1.731 -0.3448 -0.9589 0.66
+0.5076 -1.716 -0.3114 -0.9589 0.6216
+0.5055 -1.709 -0.2713 -0.9589 0.5817
+0.5054 -1.708 -0.2249 -0.9589 0.5403
+0.5073 -1.715 -0.1724 -0.9589 0.4976
+0.5112 -1.728 -0.1144 -0.9589 0.4536
+0.517 -1.748 -0.05115 -0.9589 0.4085
+0.5245 -1.773 0.01666 -0.9589 0.3624
+0.5337 -1.804 0.08848 -0.9589 0.3153
+0.5445 -1.841 0.1637 -0.9589 0.2675
+0.5567 -1.882 0.2416 -0.9589 0.219
+0.5702 -1.927 0.3214 -0.9589 0.17
+0.5848 -1.977 0.4024 -0.9589 0.1205
+0.6003 -2.029 0.4839 -0.9589 0.07074
+0.6167 -2.085 0.565 -0.9589 0.02079
+0.6337 -2.142 0.645 -0.9589 -0.0292
+0.6512 -2.201 0.723 -0.9589 -0.07912
+0.669 -2.262 0.7982 -0.9589 -0.1288
+0.6869 -2.322 0.8699 -0.9589 -0.1782
+0.7048 -2.383 0.9373 -0.9589 -0.2272
+0.7225 -2.442 0.9998 -0.9589 -0.2756
+0.7398 -2.501 1.057 -0.9589 -0.3233
+0.7566 -2.558 1.107 -0.9589 -0.3702
+0.7728 -2.613 1.15 -0.9589 -0.4161
+0.7882 -2.665 1.187 -0.9589 -0.4611
+0.8028 -2.714 1.215 -0.9589 -0.5048
+0.8163 -2.76 1.235 -0.9589 -0.5474
+0.8288 -2.802 1.246 -0.9589 -0.5885
+0.8401 -2.84 1.249 -0.9589 -0.6282
+0.8502 -2.874 1.242 -0.9589 -0.6663
+0.8591 -2.904 1.227 -0.9589 -0.7027
+0.8666 -2.93 1.202 -0.9589 -0.7374
+0.8728 -2.951 1.169 -0.9589 -0.7702
+0.8778 -2.967 1.126 -0.9589 -0.8011
+0.8814 -2.98 1.075 -0.9589 -0.8301
+0.8838 -2.988 1.016 -0.9589 -0.8569
+0.885 -2.992 0.9493 -0.9589 -0.8816
+0.8851 -2.992 0.8749 -0.9589 -0.9041
+0.884 -2.988 0.7937 -0.9589 -0.9243
+0.882 -2.982 0.7062 -0.9589 -0.9422
+0.8791 -2.972 0.6132 -0.9589 -0.9578
+0.8755 -2.96 0.5154 -0.9589 -0.971
+0.8712 -2.945 0.4135 -0.9589 -0.9817
+0.8664 -2.929 0.3083 -0.9589 -0.99
+0.8611 -2.911 0.2007 -0.9589 -0.9958
+0.8556 -2.893 0.09145 -0.9589 -0.9991
+0.85 -2.874 -0.0185 -0.9589 -1
+0.8445 -2.855 -0.1283 -0.9589 -0.9983
+0.8391 -2.836 -0.2371 -0.9589 -0.9941
+0.8339 -2.819 -0.344 -0.9589 -0.9875
+0.8293 -2.803 -0.4482 -0.9589 -0.9784
+0.8252 -2.79 -0.5488 -0.9589 -0.9668
+0.8218 -2.778 -0.6451 -0.9589 -0.9528
+0.8192 -2.769 -0.7363 -0.9589 -0.9365
+0.8175 -2.764 -0.8217 -0.9589 -0.9178
+0.8168 -2.761 -0.9007 -0.9589 -0.8968
+0.8172 -2.763 -0.9727 -0.9589 -0.8735
+0.8188 -2.768 -1.037 -0.9589 -0.8481
+0.8216 -2.778 -1.094 -0.9589 -0.8206
+0.8257 -2.791 -1.142 -0.9589 -0.791
+0.8311 -2.81 -1.181 -0.9589 -0.7594
+0.8378 -2.832 -1.212 -0.9589 -0.7259
+0.8457 -2.859 -1.233 -0.9589 -0.6907
+0.855 -2.89 -1.246 -0.9589 -0.6536
+0.8655 -2.926 -1.249 -0.9589 -0.615
+0.8772 -2.966 -1.243 -0.9589 -0.5748
+0.8901 -3.009 -1.229 -0.9589 -0.5332
+0.904 -3.056 -1.206 -0.9589 -0.4903
+0.9188 -3.106 -1.175 -0.9589 -0.4461
+0.9345 -3.159 -1.137 -0.9589 -0.4008
+0.9509 -3.215 -1.091 -0.9589 -0.3545
+0.9679 -3.272 -1.038 -0.9589 -0.3073
+0.9854 -3.331 -0.9794 -0.9589 -0.2594
+1.003 -3.391 -0.9152 -0.9589 -0.2108
+1.021 -3.452 -0.8462 -0.9589 -0.1617
+1.039 -3.512 -0.7733 -0.9589 -0.1122
+1.057 -3.572 -0.697 -0.9589 -0.06235
+1.074 -3.631 -0.6183 -0.9589 -0.01239
+1.091 -3.688 -0.5378 -0.9589 0.0376
+1.107 -3.742 -0.4565 -0.9589 0.0875
+1.122 -3.794 -0.3751 -0.9589 0.1372
+1.136 -3.842 -0.2944 -0.9589 0.1865
+1.15 -3.886 -0.2151 -0.9589 0.2354
+1.161 -3.926 -0.1381 -0.9589 0.2837
+1.172 -3.96 -0.06392 -0.9589 0.3312
+1.18 -3.99 0.006626 -0.9589 0.378
+1.187 -4.013 0.07295 -0.9589 0.4238
+1.192 -4.031 0.1345 -0.9589 0.4685
+1.196 -4.041 0.1907 -0.9589 0.5121
+1.197 -4.046 0.2412 -0.9589 0.5544
+1.196 -4.043 0.2855 -0.9589 0.5953
+1.193 -4.033 0.3234 -0.9589 0.6347
+1.188 -4.017 0.3546 -0.9589 0.6725
+1.181 -3.993 0.3789 -0.9589 0.7087
+1.172 -3.962 0.3963 -0.9589 0.743
+1.161 -3.924 0.4067 -0.9589 0.7756
+1.147 -3.879 0.4102 -0.9589 0.8061
+1.132 -3.827 0.4069 -0.9589 0.8347
+1.115 -3.77 0.3972 -0.9589 0.8612
+1.096 -3.706 0.3812 -0.9589 0.8855
+1.076 -3.637 0.3592 -0.9589 0.9076
+1.054 -3.562 0.3319 -0.9589 0.9275
+1.03 -3.483 0.2995 -0.9589 0.945
+1.006 -3.399 0.2626 -0.9589 0.9602
+0.9798 -3.312 0.2219 -0.9589 0.9729
+0.9532 -3.222 0.178 -0.9589 0.9833
+0.9259 -3.13 0.1314 -0.9589 0.9911
+0.898 -3.036 0.08295 -0.9589 0.9965
+0.8698 -2.94 0.03328 -0.9589 0.9994
+0.9937 -2.831 0 -0.9435 1
+0.9611 -2.738 -0.05255 -0.9435 0.9988
+0.9287 -2.645 -0.1044 -0.9435 0.995
+0.8967 -2.554 -0.1547 -0.9435 0.9888
+0.8654 -2.465 -0.2028 -0.9435 0.9801
+0.835 -2.379 -0.2481 -0.9435 0.9689
+0.8057 -2.295 -0.2898 -0.9435 0.9553
+0.7776 -2.215 -0.3273 -0.9435 0.9394
+0.7511 -2.139 -0.3601 -0.9435 0.9211
+0.7261 -2.068 -0.3876 -0.9435 0.9004
+0.703 -2.002 -0.4093 -0.9435 0.8776
+0.6818 -1.942 -0.4248 -0.9435 0.8525
+0.6626 -1.887 -0.4339 -0.9435 0.8253
+0.6456 -1.839 -0.4362 -0.9435 0.7961
+0.6309 -1.797 -0.4315 -0.9435 0.7648
+0.6184 -1.762 -0.4196 -0.9435 0.7317
+0.6084 -1.733 -0.4007 -0.9435 0.6967
+0.6007 -1.711 -0.3746 -0.9435 0.66
+0.5955 -1.696 -0.3416 -0.9435 0.6216
+0.5926 -1.688 -0.3017 -0.9435 0.5817
+0.5921 -1.687 -0.2553 -0.9435 0.5403
+0.594 -1.692 -0.2027 -0.9435 0.4976
+0.598 -1.703 -0.1443 -0.9435 0.4536
+0.6042 -1.721 -0.08057 -0.9435 0.4085
+0.6125 -1.745 -0.01212 -0.9435 0.3624
+0.6226 -1.774 0.06049 -0.9435 0.3153
+0.6346 -1.808 0.1366 -0.9435 0.2675
+0.6482 -1.846 0.2155 -0.9435 0.219
+0.6632 -1.889 0.2965 -0.9435 0.17
+0.6796 -1.936 0.3789 -0.9435 0.1205
+0.6971 -1.986 0.4617 -0.9435 0.07074
+0.7156 -2.038 0.5442 -0.9435 0.02079
+0.7348 -2.093 0.6256 -0.9435 -0.0292
+0.7545 -2.149 0.7051 -0.9435 -0.07912
+0.7747 -2.207 0.7819 -0.9435 -0.1288
+0.795 -2.265 0.8552 -0.9435 -0.1782
+0.8153 -2.322 0.9242 -0.9435 -0.2272
+0.8354 -2.38 0.9881 -0.9435 -0.2756
+0.8552 -2.436 1.046 -0.9435 -0.3233
+0.8744 -2.491 1.098 -0.9435 -0.3702
+0.8929 -2.544 1.143 -0.9435 -0.4161
+0.9106 -2.594 1.181 -0.9435 -0.4611
+0.9274 -2.642 1.21 -0.9435 -0.5048
+0.943 -2.686 1.231 -0.9435 -0.5474
+0.9575 -2.727 1.244 -0.9435 -0.5885
+0.9707 -2.765 1.247 -0.9435 -0.6282
+0.9825 -2.799 1.242 -0.9435 -0.6663
+0.993 -2.829 1.227 -0.9435 -0.7027
+1.002 -2.854 1.203 -0.9435 -0.7374
+1.01 -2.876 1.17 -0.9435 -0.7702
+1.016 -2.893 1.128 -0.9435 -0.8011
+1.02 -2.906 1.078 -0.9435 -0.8301
+1.024 -2.916 1.019 -0.9435 -0.8569
+1.026 -2.921 0.952 -0.9435 -0.8816
+1.026 -2.923 0.8776 -0.9435 -0.9041
+1.026 -2.922 0.7963 -0.9435 -0.9243
+1.024 -2.917 0.7087 -0.9435 -0.9422
+1.021 -2.91 0.6155 -0.9435 -0.9578
+1.018 -2.9 0.5174 -0.9435 -0.971
+1.014 -2.888 0.4151 -0.9435 -0.9817
+1.009 -2.874 0.3096 -0.9435 -0.99
+1.004 -2.86 0.2015 -0.9435 -0.9958
+0.9984 -2.844 0.09183 -0.9435 -0.9991
+0.9928 -2.828 -0.01858 -0.9435 -1
+0.9872 -2.812 -0.1288 -0.9435 -0.9983
+0.9817 -2.797 -0.2381 -0.9435 -0.9941
+0.9767 -2.782 -0.3454 -0.9435 -0.9875
+0.9721 -2.769 -0.4499 -0.9435 -0.9784
+0.9681 -2.758 -0.5509 -0.9435 -0.9668
+0.9649 -2.749 -0.6474 -0.9435 -0.9528
+0.9627 -2.742 -0.7388 -0.9435 -0.9365
+0.9614 -2.739 -0.8244 -0.9435 -0.9178
+0.9613 -2.738 -0.9034 -0.9435 -0.8968
+0.9624 -2.741 -0.9753 -0.9435 -0.8735
+0.9647 -2.748 -1.04 -0.9435 -0.8481
+0.9685 -2.759 -1.096 -0.9435 -0.8206
+0.9737 -2.774 -1.143 -0.9435 -0.791
+0.9803 -2.792 -1.182 -0.9435 -0.7594
+0.9883 -2.815 -1.212 -0.9435 -0.7259
+0.9978 -2.842 -1.233 -0.9435 -0.6907
+1.009 -2.873 -1.245 -0.9435 -0.6536
+1.021 -2.908 -1.247 -0.9435 -0.615
+1.035 -2.947 -1.241 -0.9435 -0.5748
+1.05 -2.99 -1.225 -0.9435 -0.5332
+1.066 -3.035 -1.201 -0.9435 -0.4903
+1.083 -3.084 -1.169 -0.9435 -0.4461
+1.101 -3.135 -1.129 -0.9435 -0.4008
+1.119 -3.189 -1.082 -0.9435 -0.3545
+1.139 -3.244 -1.027 -0.9435 -0.3073
+1.159 -3.301 -0.9672 -0.9435 -0.2594
+1.179 -3.358 -0.9015 -0.9435 -0.2108
+1.199 -3.416 -0.831 -0.9435 -0.1617
+1.22 -3.474 -0.7565 -0.9435 -0.1122
+1.24 -3.531 -0.6787 -0.9435 -0.06235
+1.259 -3.587 -0.5984 -0.9435 -0.01239
+1.278 -3.641 -0.5165 -0.9435 0.0376
+1.296 -3.693 -0.4338 -0.9435 0.0875
+1.313 -3.741 -0.3511 -0.9435 0.1372
+1.329 -3.787 -0.2691 -0.9435 0.1865
+1.344 -3.828 -0.1887 -0.9435 0.2354
+1.357 -3.866 -0.1107 -0.9435 0.2837
+1.368 -3.898 -0.03565 -0.9435 0.3312
+1.378 -3.925 0.03563 -0.9435 0.378
+1.386 -3.947 0.1026 -0.9435 0.4238
+1.391 -3.962 0.1645 -0.9435 0.4685
+1.394 -3.972 0.221 -0.9435 0.5121
+1.395 -3.975 0.2716 -0.9435 0.5544
+1.394 -3.971 0.3158 -0.9435 0.5953
+1.39 -3.961 0.3534 -0.9435 0.6347
+1.384 -3.943 0.3842 -0.9435 0.6725
+1.376 -3.919 0.4079 -0.9435 0.7087
+1.365 -3.888 0.4244 -0.9435 0.743
+1.352 -3.851 0.4338 -0.9435 0.7756
+1.336 -3.807 0.4362 -0.9435 0.8061
+1.319 -3.756 0.4316 -0.9435 0.8347
+1.299 -3.7 0.4203 -0.9435 0.8612
+1.277 -3.637 0.4026 -0.9435 0.8855
+1.253 -3.57 0.3789 -0.9435 0.9076
+1.228 -3.497 0.3496 -0.9435 0.9275
+1.2 -3.42 0.3152 -0.9435 0.945
+1.172 -3.339 0.2762 -0.9435 0.9602
+1.142 -3.254 0.2332 -0.9435 0.9729
+1.112 -3.166 0.1869 -0.9435 0.9833
+1.08 -3.076 0.138 -0.9435 0.9911
+1.048 -2.985 0.08706 -0.9435 0.9965
+1.015 -2.892 0.03492 -0.9435 0.9994
+1.134 -2.777 0 -0.9258 1
+1.097 -2.687 -0.05499 -0.9258 0.9988
+1.061 -2.598 -0.1092 -0.9258 0.995
+1.025 -2.51 -0.162 -0.9258 0.9888
+0.9895 -2.424 -0.2124 -0.9258 0.9801
+0.9553 -2.34 -0.26 -0.9258 0.9689
+0.9222 -2.259 -0.3039 -0.9258 0.9553
+0.8906 -2.181 -0.3435 -0.9258 0.9394
+0.8605 -2.108 -0.3783 -0.9258 0.9211
+0.8323 -2.039 -0.4076 -0.9258 0.9004
+0.8061 -1.975 -0.4311 -0.9258 0.8776
+0.7821 -1.916 -0.4483 -0.9258 0.8525
+0.7603 -1.862 -0.4588 -0.9258 0.8253
+0.741 -1.815 -0.4623 -0.9258 0.7961
+0.7241 -1.774 -0.4587 -0.9258 0.7648
+0.7098 -1.739 -0.4478 -0.9258 0.7317
+0.6982 -1.71 -0.4296 -0.9258 0.6967
+0.6892 -1.688 -0.4042 -0.9258 0.66
+0.6829 -1.673 -0.3715 -0.9258 0.6216
+0.6793 -1.664 -0.3319 -0.9258 0.5817
+0.6783 -1.661 -0.2855 -0.9258 0.5403
+0.6798 -1.665 -0.2328 -0.9258 0.4976
+0.6839 -1.675 -0.1741 -0.9258 0.4536
+0.6904 -1.691 -0.1099 -0.9258 0.4085
+0.6991 -1.712 -0.04089 -0.9258 0.3624
+0.71 -1.739 0.03247 -0.9258 0.3153
+0.723 -1.771 0.1095 -0.9258 0.2675
+0.7377 -1.807 0.1894 -0.9258 0.219
+0.7541 -1.847 0.2715 -0.9258 0.17
+0.772 -1.891 0.355 -0.9258 0.1205
+0.7912 -1.938 0.4391 -0.9258 0.07074
+0.8115 -1.988 0.523 -0.9258 0.02079
+0.8326 -2.039 0.6059 -0.9258 -0.0292
+0.8544 -2.093 0.6869 -0.9258 -0.07912
+0.8767 -2.147 0.7651 -0.9258 -0.1288
+0.8992 -2.202 0.8399 -0.9258 -0.1782
+0.9217 -2.258 0.9104 -0.9258 -0.2272
+0.944 -2.312 0.9759 -0.9258 -0.2756
+0.966 -2.366 1.036 -0.9258 -0.3233
+0.9875 -2.419 1.089 -0.9258 -0.3702
+1.008 -2.469 1.135 -0.9258 -0.4161
+1.028 -2.518 1.174 -0.9258 -0.4611
+1.047 -2.564 1.205 -0.9258 -0.5048
+1.064 -2.607 1.227 -0.9258 -0.5474
+1.081 -2.647 1.241 -0.9258 -0.5885
+1.096 -2.684 1.245 -0.9258 -0.6282
+1.109 -2.717 1.241 -0.9258 -0.6663
+1.121 -2.747 1.227 -0.9258 -0.7027
+1.132 -2.773 1.204 -0.9258 -0.7374
+1.141 -2.795 1.171 -0.9258 -0.7702
+1.148 -2.813 1.13 -0.9258 -0.8011
+1.154 -2.827 1.079 -0.9258 -0.8301
+1.158 -2.837 1.021 -0.9258 -0.8569
+1.161 -2.844 0.9541 -0.9258 -0.8816
+1.163 -2.848 0.8798 -0.9258 -0.9041
+1.163 -2.848 0.7985 -0.9258 -0.9243
+1.162 -2.846 0.7108 -0.9258 -0.9422
+1.16 -2.841 0.6174 -0.9258 -0.9578
+1.157 -2.833 0.5191 -0.9258 -0.971
+1.153 -2.824 0.4165 -0.9258 -0.9817
+1.149 -2.813 0.3106 -0.9258 -0.99
+1.144 -2.801 0.2022 -0.9258 -0.9958
+1.138 -2.788 0.09216 -0.9258 -0.9991
+1.133 -2.775 -0.01865 -0.9258 -1
+1.128 -2.762 -0.1293 -0.9258 -0.9983
+1.123 -2.75 -0.2389 -0.9258 -0.9941
+1.118 -2.738 -0.3466 -0.9258 -0.9875
+1.114 -2.727 -0.4514 -0.9258 -0.9784
+1.11 -2.719 -0.5527 -0.9258 -0.9668
+1.107 -2.712 -0.6494 -0.9258 -0.9528
+1.106 -2.708 -0.741 -0.9258 -0.9365
+1.105 -2.706 -0.8266 -0.9258 -0.9178
+1.105 -2.708 -0.9056 -0.9258 -0.8968
+1.107 -2.712 -0.9774 -0.9258 -0.8735
+1.111 -2.721 -1.041 -0.9258 -0.8481
+1.116 -2.732 -1.097 -0.9258 -0.8206
+1.122 -2.748 -1.145 -0.9258 -0.791
+1.13 -2.767 -1.183 -0.9258 -0.7594
+1.139 -2.79 -1.212 -0.9258 -0.7259
+1.15 -2.817 -1.232 -0.9258 -0.6907
+1.163 -2.848 -1.243 -0.9258 -0.6536
+1.177 -2.883 -1.245 -0.9258 -0.615
+1.192 -2.921 -1.237 -0.9258 -0.5748
+1.209 -2.962 -1.221 -0.9258 -0.5332
+1.227 -3.006 -1.195 -0.9258 -0.4903
+1.246 -3.053 -1.162 -0.9258 -0.4461
+1.267 -3.102 -1.121 -0.9258 -0.4008
+1.288 -3.154 -1.072 -0.9258 -0.3545
+1.309 -3.207 -1.016 -0.9258 -0.3073
+1.331 -3.261 -0.9545 -0.9258 -0.2594
+1.354 -3.316 -0.8872 -0.9258 -0.2108
+1.376 -3.371 -0.8152 -0.9258 -0.1617
+1.399 -3.426 -0.7392 -0.9258 -0.1122
+1.421 -3.48 -0.6599 -0.9258 -0.06235
+1.442 -3.533 -0.5782 -0.9258 -0.01239
+1.463 -3.584 -0.4949 -0.9258 0.0376
+1.483 -3.633 -0.4108 -0.9258 0.0875
+1.502 -3.679 -0.3268 -0.9258 0.1372
+1.519 -3.722 -0.2437 -0.9258 0.1865
+1.535 -3.761 -0.1622 -0.9258 0.2354
+1.549 -3.795 -0.08321 -0.9258 0.2837
+1.562 -3.825 -0.00736 -0.9258 0.3312
+1.572 -3.85 0.06462 -0.9258 0.378
+1.58 -3.87 0.1321 -0.9258 0.4238
+1.586 -3.884 0.1945 -0.9258 0.4685
+1.589 -3.892 0.2512 -0.9258 0.5121
+1.59 -3.893 0.3018 -0.9258 0.5544
+1.588 -3.889 0.3459 -0.9258 0.5953
+1.583 -3.878 0.3833 -0.9258 0.6347
+1.576 -3.86 0.4135 -0.9258 0.6725
+1.566 -3.836 0.4366 -0.9258 0.7087
+1.554 -3.805 0.4523 -0.9258 0.743
+1.538 -3.768 0.4607 -0.9258 0.7756
+1.521 -3.725 0.4619 -0.9258 0.8061
+1.5 -3.675 0.456 -0.9258 0.8347
+1.478 -3.62 0.4432 -0.9258 0.8612
+1.453 -3.559 0.4239 -0.9258 0.8855
+1.426 -3.493 0.3984 -0.9258 0.9076
+1.397 -3.423 0.3672 -0.9258 0.9275
+1.367 -3.348 0.3307 -0.9258 0.945
+1.335 -3.269 0.2896 -0.9258 0.9602
+1.301 -3.187 0.2444 -0.9258 0.9729
+1.267 -3.102 0.1958 -0.9258 0.9833
+1.231 -3.015 0.1444 -0.9258 0.9911
+1.195 -2.927 0.09112 -0.9258 0.9965
+1.158 -2.837 0.03655 -0.9258 0.9994
+1.271 -2.717 0 -0.9058 1
+1.231 -2.631 -0.05741 -0.9058 0.9988
+1.19 -2.544 -0.114 -0.9058 0.995
+1.151 -2.459 -0.1691 -0.9058 0.9888
+1.112 -2.376 -0.2219 -0.9058 0.9801
+1.074 -2.295 -0.2717 -0.9058 0.9689
+1.037 -2.217 -0.3178 -0.9058 0.9553
+1.002 -2.142 -0.3595 -0.9058 0.9394
+0.9689 -2.071 -0.3962 -0.9058 0.9211
+0.9376 -2.004 -0.4274 -0.9058 0.9004
+0.9085 -1.942 -0.4526 -0.9058 0.8776
+0.8817 -1.885 -0.4714 -0.9058 0.8525
+0.8574 -1.833 -0.4833 -0.9058 0.8253
+0.8358 -1.786 -0.4881 -0.9058 0.7961
+0.8168 -1.746 -0.4857 -0.9058 0.7648
+0.8007 -1.711 -0.4757 -0.9058 0.7317
+0.7875 -1.683 -0.4583 -0.9058 0.6967
+0.7771 -1.661 -0.4334 -0.9058 0.66
+0.7697 -1.645 -0.4012 -0.9058 0.6216
+0.7652 -1.636 -0.3618 -0.9058 0.5817
+0.7636 -1.632 -0.3155 -0.9058 0.5403
+0.7648 -1.635 -0.2627 -0.9058 0.4976
+0.7688 -1.643 -0.2038 -0.9058 0.4536
+0.7753 -1.657 -0.1392 -0.9058 0.4085
+0.7844 -1.677 -0.06963 -0.9058 0.3624
+0.7959 -1.701 0.004425 -0.9058 0.3153
+0.8095 -1.73 0.08225 -0.9058 0.2675
+0.8252 -1.764 0.1631 -0.9058 0.219
+0.8428 -1.801 0.2463 -0.9058 0.17
+0.862 -1.842 0.331 -0.9058 0.1205
+0.8826 -1.886 0.4163 -0.9058 0.07074
+0.9044 -1.933 0.5016 -0.9058 0.02079
+0.9272 -1.982 0.5858 -0.9058 -0.0292
+0.9508 -2.032 0.6682 -0.9058 -0.07912
+0.9749 -2.084 0.7479 -0.9058 -0.1288
+0.9993 -2.136 0.8241 -0.9058 -0.1782
+1.024 -2.188 0.8961 -0.9058 -0.2272
+1.048 -2.24 0.963 -0.9058 -0.2756
+1.072 -2.292 1.024 -0.9058 -0.3233
+1.096 -2.342 1.079 -0.9058 -0.3702
+1.118 -2.39 1.127 -0.9058 -0.4161
+1.14 -2.437 1.167 -0.9058 -0.4611
+1.161 -2.481 1.199 -0.9058 -0.5048
+1.18 -2.523 1.222 -0.9058 -0.5474
+1.199 -2.562 1.237 -0.9058 -0.5885
+1.215 -2.598 1.242 -0.9058 -0.6282
+1.231 -2.631 1.239 -0.9058 -0.6663
+1.244 -2.66 1.226 -0.9058 -0.7027
+1.256 -2.685 1.203 -0.9058 -0.7374
+1.267 -2.708 1.171 -0.9058 -0.7702
+1.275 -2.726 1.13 -0.9058 -0.8011
+1.283 -2.741 1.08 -0.9058 -0.8301
+1.288 -2.753 1.022 -0.9058 -0.8569
+1.292 -2.761 0.9556 -0.9058 -0.8816
+1.294 -2.766 0.8814 -0.9058 -0.9041
+1.295 -2.769 0.8001 -0.9058 -0.9243
+1.295 -2.768 0.7124 -0.9058 -0.9422
+1.294 -2.765 0.6189 -0.9058 -0.9578
+1.291 -2.76 0.5204 -0.9058 -0.971
+1.288 -2.754 0.4177 -0.9058 -0.9817
+1.284 -2.745 0.3115 -0.9058 -0.99
+1.28 -2.736 0.2028 -0.9058 -0.9958
+1.275 -2.726 0.09242 -0.9058 -0.9991
+1.271 -2.716 -0.0187 -0.9058 -1
+1.266 -2.705 -0.1297 -0.9058 -0.9983
+1.261 -2.695 -0.2396 -0.9058 -0.9941
+1.257 -2.686 -0.3475 -0.9058 -0.9875
+1.253 -2.679 -0.4526 -0.9058 -0.9784
+1.25 -2.672 -0.5541 -0.9058 -0.9668
+1.248 -2.668 -0.651 -0.9058 -0.9528
+1.247 -2.666 -0.7426 -0.9058 -0.9365
+1.248 -2.666 -0.8282 -0.9058 -0.9178
+1.249 -2.67 -0.9072 -0.9058 -0.8968
+1.252 -2.676 -0.9788 -0.9058 -0.8735
+1.256 -2.685 -1.043 -0.9058 -0.8481
+1.262 -2.698 -1.098 -0.9058 -0.8206
+1.27 -2.714 -1.145 -0.9058 -0.791
+1.279 -2.734 -1.183 -0.9058 -0.7594
+1.29 -2.757 -1.212 -0.9058 -0.7259
+1.303 -2.784 -1.231 -0.9058 -0.6907
+1.317 -2.815 -1.241 -0.9058 -0.6536
+1.333 -2.848 -1.242 -0.9058 -0.615
+1.35 -2.885 -1.233 -0.9058 -0.5748
+1.369 -2.925 -1.215 -0.9058 -0.5332
+1.389 -2.968 -1.189 -0.9058 -0.4903
+1.41 -3.013 -1.154 -0.9058 -0.4461
+1.432 -3.06 -1.111 -0.9058 -0.4008
+1.455 -3.11 -1.061 -0.9058 -0.3545
+1.479 -3.16 -1.004 -0.9058 -0.3073
+1.503 -3.212 -0.9411 -0.9058 -0.2594
+1.527 -3.264 -0.8724 -0.9058 -0.2108
+1.552 -3.316 -0.7989 -0.9058 -0.1617
+1.576 -3.368 -0.7214 -0.9058 -0.1122
+1.6 -3.42 -0.6407 -0.9058 -0.06235
+1.623 -3.469 -0.5576 -0.9058 -0.01239
+1.646 -3.518 -0.473 -0.9058 0.0376
+1.667 -3.563 -0.3876 -0.9058 0.0875
+1.687 -3.606 -0.3024 -0.9058 0.1372
+1.706 -3.646 -0.2181 -0.9058 0.1865
+1.723 -3.682 -0.1356 -0.9058 0.2354
+1.738 -3.715 -0.0557 -0.9058 0.2837
+1.751 -3.742 0.02093 -0.9058 0.3312
+1.762 -3.765 0.09357 -0.9058 0.378
+1.77 -3.783 0.1615 -0.9058 0.4238
+1.776 -3.795 0.2243 -0.9058 0.4685
+1.779 -3.801 0.2812 -0.9058 0.5121
+1.779 -3.802 0.3318 -0.9058 0.5544
+1.776 -3.796 0.3758 -0.9058 0.5953
+1.771 -3.785 0.4129 -0.9058 0.6347
+1.762 -3.767 0.4426 -0.9058 0.6725
+1.751 -3.743 0.465 -0.9058 0.7087
+1.737 -3.712 0.4799 -0.9058 0.743
+1.72 -3.676 0.4873 -0.9058 0.7756
+1.7 -3.633 0.4873 -0.9058 0.8061
+1.677 -3.585 0.4801 -0.9058 0.8347
+1.652 -3.531 0.4658 -0.9058 0.8612
+1.625 -3.472 0.4449 -0.9058 0.8855
+1.595 -3.409 0.4176 -0.9058 0.9076
+1.563 -3.34 0.3845 -0.9058 0.9275
+1.529 -3.268 0.346 -0.9058 0.945
+1.493 -3.192 0.3027 -0.9058 0.9602
+1.456 -3.113 0.2553 -0.9058 0.9729
+1.418 -3.031 0.2045 -0.9058 0.9833
+1.379 -2.947 0.1508 -0.9058 0.9911
+1.339 -2.861 0.09513 -0.9058 0.9965
+1.298 -2.775 0.03815 -0.9058 0.9994
+1.406 -2.65 0 -0.8835 1
+1.361 -2.567 -0.05978 -0.8835 0.9988
+1.317 -2.484 -0.1188 -0.8835 0.995
+1.274 -2.403 -0.1762 -0.8835 0.9888
+1.232 -2.323 -0.2313 -0.8835 0.9801
+1.19 -2.245 -0.2833 -0.8835 0.9689
+1.151 -2.169 -0.3315 -0.8835 0.9553
+1.112 -2.097 -0.3753 -0.8835 0.9394
+1.076 -2.029 -0.4139 -0.8835 0.9211
+1.042 -1.964 -0.447 -0.8835 0.9004
+1.01 -1.904 -0.4739 -0.8835 0.8776
+0.9805 -1.849 -0.4942 -0.8835 0.8525
+0.9538 -1.798 -0.5076 -0.8835 0.8253
+0.9299 -1.753 -0.5137 -0.8835 0.7961
+0.9089 -1.714 -0.5123 -0.8835 0.7648
+0.891 -1.68 -0.5034 -0.8835 0.7317
+0.8761 -1.652 -0.4867 -0.8835 0.6967
+0.8644 -1.63 -0.4625 -0.8835 0.66
+0.8559 -1.614 -0.4307 -0.8835 0.6216
+0.8504 -1.604 -0.3916 -0.8835 0.5817
+0.8481 -1.599 -0.3454 -0.8835 0.5403
+0.8488 -1.601 -0.2925 -0.8835 0.4976
+0.8525 -1.607 -0.2334 -0.8835 0.4536
+0.859 -1.62 -0.1685 -0.8835 0.4085
+0.8682 -1.637 -0.09833 -0.8835 0.3624
+0.88 -1.659 -0.02362 -0.8835 0.3153
+0.8942 -1.686 0.05499 -0.8835 0.2675
+0.9106 -1.717 0.1368 -0.8835 0.219
+0.929 -1.752 0.221 -0.8835 0.17
+0.9492 -1.79 0.3067 -0.8835 0.1205
+0.971 -1.831 0.3933 -0.8835 0.07074
+0.9941 -1.875 0.4798 -0.8835 0.02079
+1.018 -1.92 0.5653 -0.8835 -0.0292
+1.043 -1.968 0.6491 -0.8835 -0.07912
+1.069 -2.016 0.7302 -0.8835 -0.1288
+1.095 -2.065 0.8078 -0.8835 -0.1782
+1.121 -2.115 0.8812 -0.8835 -0.2272
+1.148 -2.164 0.9495 -0.8835 -0.2756
+1.173 -2.213 1.012 -0.8835 -0.3233
+1.199 -2.26 1.068 -0.8835 -0.3702
+1.223 -2.307 1.117 -0.8835 -0.4161
+1.247 -2.351 1.159 -0.8835 -0.4611
+1.27 -2.394 1.192 -0.8835 -0.5048
+1.291 -2.434 1.216 -0.8835 -0.5474
+1.311 -2.472 1.232 -0.8835 -0.5885
+1.329 -2.507 1.239 -0.8835 -0.6282
+1.346 -2.538 1.236 -0.8835 -0.6663
+1.361 -2.567 1.224 -0.8835 -0.7027
+1.375 -2.593 1.202 -0.8835 -0.7374
+1.387 -2.615 1.171 -0.8835 -0.7702
+1.397 -2.634 1.13 -0.8835 -0.8011
+1.405 -2.65 1.081 -0.8835 -0.8301
+1.412 -2.662 1.023 -0.8835 -0.8569
+1.417 -2.672 0.9565 -0.8835 -0.8816
+1.421 -2.679 0.8825 -0.8835 -0.9041
+1.423 -2.683 0.8013 -0.8835 -0.9243
+1.424 -2.684 0.7136 -0.8835 -0.9422
+1.423 -2.684 0.6201 -0.8835 -0.9578
+1.422 -2.681 0.5214 -0.8835 -0.971
+1.419 -2.676 0.4185 -0.8835 -0.9817
+1.416 -2.671 0.3122 -0.8835 -0.99
+1.413 -2.664 0.2032 -0.8835 -0.9958
+1.409 -2.657 0.09263 -0.8835 -0.9991
+1.405 -2.649 -0.01874 -0.8835 -1
+1.401 -2.641 -0.13 -0.8835 -0.9983
+1.397 -2.634 -0.2401 -0.8835 -0.9941
+1.394 -2.628 -0.3483 -0.8835 -0.9875
+1.391 -2.623 -0.4536 -0.8835 -0.9784
+1.389 -2.619 -0.5551 -0.8835 -0.9668
+1.388 -2.617 -0.6521 -0.8835 -0.9528
+1.388 -2.617 -0.7438 -0.8835 -0.9365
+1.389 -2.619 -0.8294 -0.8835 -0.9178
+1.392 -2.624 -0.9082 -0.8835 -0.8968
+1.396 -2.632 -0.9797 -0.8835 -0.8735
+1.401 -2.642 -1.043 -0.8835 -0.8481
+1.408 -2.656 -1.098 -0.8835 -0.8206
+1.417 -2.673 -1.145 -0.8835 -0.791
+1.428 -2.693 -1.182 -0.8835 -0.7594
+1.44 -2.716 -1.21 -0.8835 -0.7259
+1.455 -2.743 -1.229 -0.8835 -0.6907
+1.47 -2.773 -1.238 -0.8835 -0.6536
+1.488 -2.806 -1.238 -0.8835 -0.615
+1.507 -2.841 -1.228 -0.8835 -0.5748
+1.527 -2.88 -1.209 -0.8835 -0.5332
+1.549 -2.921 -1.182 -0.8835 -0.4903
+1.572 -2.964 -1.146 -0.8835 -0.4461
+1.596 -3.009 -1.102 -0.8835 -0.4008
+1.621 -3.056 -1.05 -0.8835 -0.3545
+1.646 -3.104 -0.9918 -0.8835 -0.3073
+1.672 -3.153 -0.9272 -0.8835 -0.2594
+1.698 -3.203 -0.8571 -0.8835 -0.2108
+1.725 -3.252 -0.7822 -0.8835 -0.1617
+1.751 -3.301 -0.7032 -0.8835 -0.1122
+1.776 -3.349 -0.6211 -0.8835 -0.06235
+1.801 -3.396 -0.5367 -0.8835 -0.01239
+1.825 -3.441 -0.4507 -0.8835 0.0376
+1.848 -3.484 -0.3641 -0.8835 0.0875
+1.869 -3.524 -0.2778 -0.8835 0.1372
+1.888 -3.561 -0.1924 -0.8835 0.1865
+1.906 -3.594 -0.109 -0.8835 0.2354
+1.922 -3.624 -0.02816 -0.8835 0.2837
+1.935 -3.649 0.04922 -0.8835 0.3312
+1.946 -3.67 0.1225 -0.8835 0.378
+1.955 -3.686 0.1909 -0.8835 0.4238
+1.96 -3.696 0.2539 -0.8835 0.4685
+1.963 -3.701 0.311 -0.8835 0.5121
+1.963 -3.701 0.3617 -0.8835 0.5544
+1.959 -3.694 0.4055 -0.8835 0.5953
+1.953 -3.682 0.4422 -0.8835 0.6347
+1.943 -3.664 0.4715 -0.8835 0.6725
+1.93 -3.64 0.4932 -0.8835 0.7087
+1.914 -3.61 0.5072 -0.8835 0.743
+1.895 -3.574 0.5136 -0.8835 0.7756
+1.874 -3.533 0.5125 -0.8835 0.8061
+1.849 -3.486 0.5039 -0.8835 0.8347
+1.821 -3.434 0.4881 -0.8835 0.8612
+1.791 -3.377 0.4656 -0.8835 0.8855
+1.758 -3.315 0.4365 -0.8835 0.9076
+1.723 -3.249 0.4015 -0.8835 0.9275
+1.686 -3.179 0.3611 -0.8835 0.945
+1.647 -3.106 0.3157 -0.8835 0.9602
+1.607 -3.03 0.2662 -0.8835 0.9729
+1.565 -2.951 0.2131 -0.8835 0.9833
+1.522 -2.871 0.1571 -0.8835 0.9911
+1.479 -2.789 0.09907 -0.8835 0.9965
+1.435 -2.706 0.03973 -0.8835 0.9994
+1.536 -2.577 0 -0.8589 1
+1.489 -2.497 -0.06212 -0.8589 0.9988
+1.442 -2.418 -0.1234 -0.8589 0.995
+1.395 -2.34 -0.1831 -0.8589 0.9888
+1.349 -2.263 -0.2405 -0.8589 0.9801
+1.305 -2.189 -0.2947 -0.8589 0.9689
+1.262 -2.117 -0.345 -0.8589 0.9553
+1.221 -2.047 -0.3908 -0.8589 0.9394
+1.181 -1.982 -0.4314 -0.8589 0.9211
+1.144 -1.92 -0.4663 -0.8589 0.9004
+1.11 -1.862 -0.4949 -0.8589 0.8776
+1.078 -1.808 -0.5167 -0.8589 0.8525
+1.049 -1.76 -0.5315 -0.8589 0.8253
+1.023 -1.716 -0.5389 -0.8589 0.7961
+1 -1.678 -0.5387 -0.8589 0.7648
+0.9805 -1.645 -0.5307 -0.8589 0.7317
+0.964 -1.617 -0.5148 -0.8589 0.6967
+0.9509 -1.595 -0.4912 -0.8589 0.66
+0.9412 -1.579 -0.4599 -0.8589 0.6216
+0.9347 -1.568 -0.4211 -0.8589 0.5817
+0.9316 -1.563 -0.375 -0.8589 0.5403
+0.9317 -1.563 -0.3221 -0.8589 0.4976
+0.9349 -1.568 -0.2628 -0.8589 0.4536
+0.9412 -1.579 -0.1976 -0.8589 0.4085
+0.9504 -1.594 -0.127 -0.8589 0.3624
+0.9623 -1.614 -0.05165 -0.8589 0.3153
+0.9768 -1.638 0.02769 -0.8589 0.2675
+0.9937 -1.667 0.1103 -0.8589 0.219
+1.013 -1.699 0.1955 -0.8589 0.17
+1.034 -1.734 0.2823 -0.8589 0.1205
+1.056 -1.772 0.37 -0.8589 0.07074
+1.081 -1.812 0.4577 -0.8589 0.02079
+1.106 -1.855 0.5445 -0.8589 -0.0292
+1.132 -1.899 0.6295 -0.8589 -0.07912
+1.159 -1.945 0.712 -0.8589 -0.1288
+1.187 -1.991 0.791 -0.8589 -0.1782
+1.215 -2.037 0.8658 -0.8589 -0.2272
+1.242 -2.084 0.9355 -0.8589 -0.2756
+1.27 -2.13 0.9994 -0.8589 -0.3233
+1.297 -2.175 1.057 -0.8589 -0.3702
+1.323 -2.219 1.107 -0.8589 -0.4161
+1.348 -2.261 1.15 -0.8589 -0.4611
+1.372 -2.302 1.184 -0.8589 -0.5048
+1.395 -2.34 1.21 -0.8589 -0.5474
+1.417 -2.377 1.227 -0.8589 -0.5885
+1.437 -2.41 1.234 -0.8589 -0.6282
+1.456 -2.441 1.232 -0.8589 -0.6663
+1.472 -2.47 1.221 -0.8589 -0.7027
+1.487 -2.495 1.2 -0.8589 -0.7374
+1.501 -2.517 1.169 -0.8589 -0.7702
+1.512 -2.537 1.129 -0.8589 -0.8011
+1.522 -2.553 1.08 -0.8589 -0.8301
+1.53 -2.567 1.023 -0.8589 -0.8569
+1.537 -2.577 0.9568 -0.8589 -0.8816
+1.541 -2.585 0.883 -0.8589 -0.9041
+1.545 -2.591 0.802 -0.8589 -0.9243
+1.547 -2.594 0.7143 -0.8589 -0.9422
+1.548 -2.596 0.6208 -0.8589 -0.9578
+1.547 -2.595 0.5221 -0.8589 -0.971
+1.546 -2.593 0.4191 -0.8589 -0.9817
+1.544 -2.59 0.3127 -0.8589 -0.99
+1.542 -2.586 0.2036 -0.8589 -0.9958
+1.539 -2.581 0.09278 -0.8589 -0.9991
+1.536 -2.576 -0.01877 -0.8589 -1
+1.533 -2.571 -0.1302 -0.8589 -0.9983
+1.53 -2.566 -0.2405 -0.8589 -0.9941
+1.528 -2.562 -0.3488 -0.8589 -0.9875
+1.526 -2.56 -0.4542 -0.8589 -0.9784
+1.525 -2.558 -0.5559 -0.8589 -0.9668
+1.525 -2.558 -0.6529 -0.8589 -0.9528
+1.526 -2.56 -0.7445 -0.8589 -0.9365
+1.529 -2.564 -0.83 -0.8589 -0.9178
+1.533 -2.571 -0.9087 -0.8589 -0.8968
+1.538 -2.58 -0.9799 -0.8589 -0.8735
+1.545 -2.591 -1.043 -0.8589 -0.8481
+1.554 -2.606 -1.098 -0.8589 -0.8206
+1.564 -2.623 -1.144 -0.8589 -0.791
+1.576 -2.643 -1.181 -0.8589 -0.7594
+1.59 -2.667 -1.208 -0.8589 -0.7259
+1.606 -2.693 -1.226 -0.8589 -0.6907
+1.623 -2.722 -1.234 -0.8589 -0.6536
+1.642 -2.754 -1.233 -0.8589 -0.615
+1.663 -2.789 -1.222 -0.8589 -0.5748
+1.685 -2.826 -1.202 -0.8589 -0.5332
+1.708 -2.865 -1.174 -0.8589 -0.4903
+1.733 -2.906 -1.136 -0.8589 -0.4461
+1.758 -2.949 -1.091 -0.8589 -0.4008
+1.785 -2.994 -1.038 -0.8589 -0.3545
+1.812 -3.039 -0.9786 -0.8589 -0.3073
+1.84 -3.086 -0.9127 -0.8589 -0.2594
+1.867 -3.132 -0.8412 -0.8589 -0.2108
+1.895 -3.178 -0.7649 -0.8589 -0.1617
+1.922 -3.224 -0.6846 -0.8589 -0.1122
+1.949 -3.269 -0.6012 -0.8589 -0.06235
+1.975 -3.313 -0.5154 -0.8589 -0.01239
+2 -3.355 -0.4282 -0.8589 0.0376
+2.024 -3.395 -0.3404 -0.8589 0.0875
+2.046 -3.432 -0.253 -0.8589 0.1372
+2.066 -3.466 -0.1666 -0.8589 0.1865
+2.085 -3.497 -0.08221 -0.8589 0.2354
+2.101 -3.524 -0.0006019 -0.8589 0.2837
+2.114 -3.547 0.07747 -0.8589 0.3312
+2.126 -3.565 0.1513 -0.8589 0.378
+2.134 -3.579 0.2201 -0.8589 0.4238
+2.139 -3.588 0.2834 -0.8589 0.4685
+2.141 -3.592 0.3407 -0.8589 0.5121
+2.14 -3.59 0.3913 -0.8589 0.5544
+2.136 -3.583 0.4349 -0.8589 0.5953
+2.128 -3.57 0.4712 -0.8589 0.6347
+2.118 -3.552 0.5 -0.8589 0.6725
+2.103 -3.528 0.521 -0.8589 0.7087
+2.086 -3.499 0.5342 -0.8589 0.743
+2.065 -3.464 0.5396 -0.8589 0.7756
+2.041 -3.423 0.5373 -0.8589 0.8061
+2.014 -3.378 0.5274 -0.8589 0.8347
+1.984 -3.328 0.5102 -0.8589 0.8612
+1.951 -3.273 0.486 -0.8589 0.8855
+1.916 -3.214 0.4552 -0.8589 0.9076
+1.878 -3.15 0.4184 -0.8589 0.9275
+1.838 -3.083 0.3759 -0.8589 0.945
+1.796 -3.013 0.3285 -0.8589 0.9602
+1.753 -2.94 0.2768 -0.8589 0.9729
+1.708 -2.865 0.2215 -0.8589 0.9833
+1.662 -2.788 0.1633 -0.8589 0.9911
+1.615 -2.709 0.103 -0.8589 0.9965
+1.568 -2.63 0.04128 -0.8589 0.9994
+1.663 -2.497 0 -0.8323 1
+1.613 -2.421 -0.06442 -0.8323 0.9988
+1.562 -2.346 -0.128 -0.8323 0.995
+1.513 -2.271 -0.19 -0.8323 0.9888
+1.464 -2.198 -0.2495 -0.8323 0.9801
+1.417 -2.127 -0.3059 -0.8323 0.9689
+1.371 -2.058 -0.3583 -0.8323 0.9553
+1.327 -1.992 -0.4061 -0.8323 0.9394
+1.285 -1.929 -0.4486 -0.8323 0.9211
+1.246 -1.87 -0.4853 -0.8323 0.9004
+1.209 -1.814 -0.5155 -0.8323 0.8776
+1.174 -1.763 -0.5389 -0.8323 0.8525
+1.143 -1.716 -0.5551 -0.8323 0.8253
+1.115 -1.674 -0.5638 -0.8323 0.7961
+1.09 -1.637 -0.5647 -0.8323 0.7648
+1.069 -1.605 -0.5576 -0.8323 0.7317
+1.051 -1.578 -0.5426 -0.8323 0.6967
+1.036 -1.556 -0.5196 -0.8323 0.66
+1.025 -1.539 -0.4888 -0.8323 0.6216
+1.018 -1.528 -0.4503 -0.8323 0.5817
+1.014 -1.522 -0.4044 -0.8323 0.5403
+1.013 -1.521 -0.3515 -0.8323 0.4976
+1.016 -1.525 -0.2921 -0.8323 0.4536
+1.022 -1.534 -0.2265 -0.8323 0.4085
+1.031 -1.548 -0.1555 -0.8323 0.3624
+1.043 -1.565 -0.07965 -0.8323 0.3153
+1.057 -1.587 0.0003721 -0.8323 0.2675
+1.074 -1.613 0.0838 -0.8323 0.219
+1.094 -1.642 0.1698 -0.8323 0.17
+1.115 -1.674 0.2577 -0.8323 0.1205
+1.139 -1.709 0.3464 -0.8323 0.07074
+1.164 -1.747 0.4353 -0.8323 0.02079
+1.19 -1.786 0.5233 -0.8323 -0.0292
+1.217 -1.827 0.6096 -0.8323 -0.07912
+1.245 -1.87 0.6934 -0.8323 -0.1288
+1.274 -1.913 0.7737 -0.8323 -0.1782
+1.303 -1.956 0.8498 -0.8323 -0.2272
+1.332 -2 0.9208 -0.8323 -0.2756
+1.361 -2.043 0.9861 -0.8323 -0.3233
+1.389 -2.085 1.045 -0.8323 -0.3702
+1.417 -2.127 1.096 -0.8323 -0.4161
+1.444 -2.167 1.14 -0.8323 -0.4611
+1.469 -2.206 1.176 -0.8323 -0.5048
+1.494 -2.243 1.203 -0.8323 -0.5474
+1.517 -2.277 1.221 -0.8323 -0.5885
+1.539 -2.31 1.229 -0.8323 -0.6282
+1.559 -2.34 1.228 -0.8323 -0.6663
+1.577 -2.368 1.217 -0.8323 -0.7027
+1.594 -2.393 1.197 -0.8323 -0.7374
+1.609 -2.415 1.167 -0.8323 -0.7702
+1.622 -2.434 1.128 -0.8323 -0.8011
+1.633 -2.451 1.079 -0.8323 -0.8301
+1.642 -2.466 1.022 -0.8323 -0.8569
+1.65 -2.477 0.9565 -0.8323 -0.8816
+1.656 -2.487 0.883 -0.8323 -0.9041
+1.661 -2.494 0.8021 -0.8323 -0.9243
+1.665 -2.499 0.7146 -0.8323 -0.9422
+1.667 -2.502 0.6212 -0.8323 -0.9578
+1.668 -2.504 0.5225 -0.8323 -0.971
+1.668 -2.504 0.4195 -0.8323 -0.9817
+1.667 -2.503 0.3129 -0.8323 -0.99
+1.666 -2.501 0.2038 -0.8323 -0.9958
+1.665 -2.499 0.09288 -0.8323 -0.9991
+1.663 -2.496 -0.01879 -0.8323 -1
+1.661 -2.494 -0.1303 -0.8323 -0.9983
+1.66 -2.492 -0.2407 -0.8323 -0.9941
+1.659 -2.49 -0.3491 -0.8323 -0.9875
+1.658 -2.49 -0.4546 -0.8323 -0.9784
+1.659 -2.49 -0.5562 -0.8323 -0.9668
+1.66 -2.492 -0.6532 -0.8323 -0.9528
+1.663 -2.496 -0.7448 -0.8323 -0.9365
+1.666 -2.502 -0.8301 -0.8323 -0.9178
+1.672 -2.51 -0.9086 -0.8323 -0.8968
+1.678 -2.52 -0.9795 -0.8323 -0.8735
+1.687 -2.532 -1.042 -0.8323 -0.8481
+1.697 -2.548 -1.097 -0.8323 -0.8206
+1.709 -2.565 -1.142 -0.8323 -0.791
+1.723 -2.586 -1.178 -0.8323 -0.7594
+1.738 -2.609 -1.205 -0.8323 -0.7259
+1.755 -2.635 -1.222 -0.8323 -0.6907
+1.774 -2.663 -1.229 -0.8323 -0.6536
+1.795 -2.694 -1.227 -0.8323 -0.615
+1.817 -2.728 -1.216 -0.8323 -0.5748
+1.84 -2.763 -1.195 -0.8323 -0.5332
+1.865 -2.801 -1.165 -0.8323 -0.4903
+1.892 -2.84 -1.126 -0.8323 -0.4461
+1.919 -2.88 -1.08 -0.8323 -0.4008
+1.947 -2.922 -1.026 -0.8323 -0.3545
+1.975 -2.965 -0.9648 -0.8323 -0.3073
+2.004 -3.009 -0.8976 -0.8323 -0.2594
+2.033 -3.052 -0.8247 -0.8323 -0.2108
+2.062 -3.096 -0.7471 -0.8323 -0.1617
+2.09 -3.138 -0.6655 -0.8323 -0.1122
+2.118 -3.18 -0.5808 -0.8323 -0.06235
+2.145 -3.221 -0.4938 -0.8323 -0.01239
+2.171 -3.26 -0.4054 -0.8323 0.0376
+2.196 -3.296 -0.3165 -0.8323 0.0875
+2.218 -3.33 -0.228 -0.8323 0.1372
+2.239 -3.362 -0.1407 -0.8323 0.1865
+2.258 -3.39 -0.05541 -0.8323 0.2354
+2.274 -3.414 0.02696 -0.8323 0.2837
+2.288 -3.435 0.1057 -0.8323 0.3312
+2.299 -3.451 0.18 -0.8323 0.378
+2.307 -3.463 0.2492 -0.8323 0.4238
+2.312 -3.47 0.3128 -0.8323 0.4685
+2.313 -3.473 0.3701 -0.8323 0.5121
+2.311 -3.47 0.4206 -0.8323 0.5544
+2.306 -3.462 0.4641 -0.8323 0.5953
+2.297 -3.449 0.5 -0.8323 0.6347
+2.285 -3.431 0.5282 -0.8323 0.6725
+2.27 -3.407 0.5485 -0.8323 0.7087
+2.25 -3.379 0.5609 -0.8323 0.743
+2.228 -3.345 0.5652 -0.8323 0.7756
+2.202 -3.306 0.5617 -0.8323 0.8061
+2.173 -3.262 0.5505 -0.8323 0.8347
+2.141 -3.214 0.5319 -0.8323 0.8612
+2.106 -3.161 0.5061 -0.8323 0.8855
+2.068 -3.104 0.4736 -0.8323 0.9076
+2.027 -3.044 0.4349 -0.8323 0.9275
+1.985 -2.98 0.3906 -0.8323 0.945
+1.94 -2.913 0.3411 -0.8323 0.9602
+1.894 -2.843 0.2873 -0.8323 0.9729
+1.846 -2.771 0.2298 -0.8323 0.9833
+1.797 -2.698 0.1694 -0.8323 0.9911
+1.747 -2.623 0.1068 -0.8323 0.9965
+1.697 -2.547 0.04281 -0.8323 0.9994
+1.786 -2.411 0 -0.8035 1
+1.733 -2.339 -0.06668 -0.8035 0.9988
+1.68 -2.267 -0.1325 -0.8035 0.995
+1.627 -2.197 -0.1967 -0.8035 0.9888
+1.576 -2.127 -0.2584 -0.8035 0.9801
+1.526 -2.06 -0.3169 -0.8035 0.9689
+1.478 -1.994 -0.3713 -0.8035 0.9553
+1.431 -1.932 -0.4211 -0.8035 0.9394
+1.387 -1.872 -0.4655 -0.8035 0.9211
+1.345 -1.815 -0.5039 -0.8035 0.9004
+1.306 -1.762 -0.5359 -0.8035 0.8776
+1.269 -1.713 -0.5608 -0.8035 0.8525
+1.236 -1.668 -0.5784 -0.8035 0.8253
+1.206 -1.628 -0.5883 -0.8035 0.7961
+1.179 -1.592 -0.5903 -0.8035 0.7648
+1.156 -1.561 -0.5842 -0.8035 0.7317
+1.137 -1.534 -0.57 -0.8035 0.6967
+1.121 -1.513 -0.5477 -0.8035 0.66
+1.109 -1.496 -0.5174 -0.8035 0.6216
+1.1 -1.485 -0.4792 -0.8035 0.5817
+1.095 -1.478 -0.4336 -0.8035 0.5403
+1.094 -1.476 -0.3807 -0.8035 0.4976
+1.096 -1.479 -0.3212 -0.8035 0.4536
+1.101 -1.486 -0.2554 -0.8035 0.4085
+1.109 -1.498 -0.184 -0.8035 0.3624
+1.121 -1.513 -0.1076 -0.8035 0.3153
+1.136 -1.533 -0.02694 -0.8035 0.2675
+1.153 -1.556 0.05723 -0.8035 0.219
+1.172 -1.582 0.1441 -0.8035 0.17
+1.194 -1.612 0.2329 -0.8035 0.1205
+1.218 -1.644 0.3227 -0.8035 0.07074
+1.243 -1.678 0.4126 -0.8035 0.02079
+1.27 -1.714 0.5018 -0.8035 -0.0292
+1.298 -1.752 0.5893 -0.8035 -0.07912
+1.327 -1.791 0.6743 -0.8035 -0.1288
+1.357 -1.831 0.7559 -0.8035 -0.1782
+1.387 -1.872 0.8333 -0.8035 -0.2272
+1.417 -1.912 0.9056 -0.8035 -0.2756
+1.447 -1.953 0.9721 -0.8035 -0.3233
+1.476 -1.993 1.032 -0.8035 -0.3702
+1.505 -2.032 1.085 -0.8035 -0.4161
+1.533 -2.07 1.13 -0.8035 -0.4611
+1.56 -2.106 1.167 -0.8035 -0.5048
+1.586 -2.141 1.195 -0.8035 -0.5474
+1.611 -2.174 1.214 -0.8035 -0.5885
+1.634 -2.206 1.223 -0.8035 -0.6282
+1.655 -2.235 1.223 -0.8035 -0.6663
+1.675 -2.261 1.213 -0.8035 -0.7027
+1.693 -2.286 1.194 -0.8035 -0.7374
+1.71 -2.308 1.164 -0.8035 -0.7702
+1.724 -2.328 1.126 -0.8035 -0.8011
+1.737 -2.345 1.078 -0.8035 -0.8301
+1.748 -2.36 1.021 -0.8035 -0.8569
+1.758 -2.373 0.9556 -0.8035 -0.8816
+1.766 -2.383 0.8824 -0.8035 -0.9041
+1.772 -2.392 0.8018 -0.8035 -0.9243
+1.777 -2.398 0.7145 -0.8035 -0.9422
+1.78 -2.403 0.6211 -0.8035 -0.9578
+1.783 -2.407 0.5226 -0.8035 -0.971
+1.785 -2.409 0.4196 -0.8035 -0.9817
+1.786 -2.41 0.313 -0.8035 -0.99
+1.786 -2.411 0.2038 -0.8035 -0.9958
+1.786 -2.411 0.09291 -0.8035 -0.9991
+1.786 -2.411 -0.0188 -0.8035 -1
+1.786 -2.41 -0.1304 -0.8035 -0.9983
+1.786 -2.41 -0.2408 -0.8035 -0.9941
+1.786 -2.411 -0.3492 -0.8035 -0.9875
+1.787 -2.413 -0.4546 -0.8035 -0.9784
+1.789 -2.415 -0.5562 -0.8035 -0.9668
+1.792 -2.419 -0.6532 -0.8035 -0.9528
+1.796 -2.425 -0.7446 -0.8035 -0.9365
+1.802 -2.432 -0.8297 -0.8035 -0.9178
+1.809 -2.441 -0.9079 -0.8035 -0.8968
+1.817 -2.452 -0.9785 -0.8035 -0.8735
+1.827 -2.466 -1.041 -0.8035 -0.8481
+1.839 -2.482 -1.095 -0.8035 -0.8206
+1.852 -2.5 -1.14 -0.8035 -0.791
+1.867 -2.52 -1.175 -0.8035 -0.7594
+1.884 -2.543 -1.201 -0.8035 -0.7259
+1.903 -2.568 -1.217 -0.8035 -0.6907
+1.923 -2.596 -1.224 -0.8035 -0.6536
+1.945 -2.626 -1.221 -0.8035 -0.615
+1.969 -2.658 -1.208 -0.8035 -0.5748
+1.994 -2.692 -1.186 -0.8035 -0.5332
+2.02 -2.727 -1.155 -0.8035 -0.4903
+2.048 -2.764 -1.116 -0.8035 -0.4461
+2.076 -2.803 -1.068 -0.8035 -0.4008
+2.105 -2.842 -1.013 -0.8035 -0.3545
+2.135 -2.882 -0.9505 -0.8035 -0.3073
+2.165 -2.923 -0.8819 -0.8035 -0.2594
+2.195 -2.963 -0.8078 -0.8035 -0.2108
+2.225 -3.003 -0.7289 -0.8035 -0.1617
+2.254 -3.043 -0.6461 -0.8035 -0.1122
+2.283 -3.082 -0.5601 -0.8035 -0.06235
+2.311 -3.119 -0.4719 -0.8035 -0.01239
+2.337 -3.155 -0.3824 -0.8035 0.0376
+2.362 -3.188 -0.2924 -0.8035 0.0875
+2.385 -3.22 -0.2029 -0.8035 0.1372
+2.406 -3.248 -0.1146 -0.8035 0.1865
+2.425 -3.273 -0.02858 -0.8035 0.2354
+2.441 -3.295 0.0545 -0.8035 0.2837
+2.455 -3.314 0.1338 -0.8035 0.3312
+2.465 -3.328 0.2086 -0.8035 0.378
+2.473 -3.338 0.2782 -0.8035 0.4238
+2.477 -3.344 0.3419 -0.8035 0.4685
+2.478 -3.345 0.3993 -0.8035 0.5121
+2.475 -3.341 0.4497 -0.8035 0.5544
+2.469 -3.333 0.4929 -0.8035 0.5953
+2.459 -3.32 0.5285 -0.8035 0.6347
+2.446 -3.301 0.5561 -0.8035 0.6725
+2.429 -3.278 0.5757 -0.8035 0.7087
+2.408 -3.25 0.5872 -0.8035 0.743
+2.384 -3.218 0.5905 -0.8035 0.7756
+2.356 -3.18 0.5859 -0.8035 0.8061
+2.325 -3.138 0.5733 -0.8035 0.8347
+2.29 -3.092 0.5532 -0.8035 0.8612
+2.253 -3.041 0.5259 -0.8035 0.8855
+2.213 -2.987 0.4917 -0.8035 0.9076
+2.17 -2.93 0.4512 -0.8035 0.9275
+2.125 -2.869 0.4049 -0.8035 0.945
+2.078 -2.805 0.3535 -0.8035 0.9602
+2.029 -2.739 0.2976 -0.8035 0.9729
+1.979 -2.671 0.238 -0.8035 0.9833
+1.927 -2.601 0.1754 -0.8035 0.9911
+1.874 -2.53 0.1105 -0.8035 0.9965
+1.821 -2.458 0.04431 -0.8035 0.9994
+1.904 -2.318 0 -0.7728 1
+1.848 -2.25 -0.0689 -0.7728 0.9988
+1.793 -2.183 -0.1369 -0.7728 0.995
+1.738 -2.116 -0.2033 -0.7728 0.9888
+1.684 -2.051 -0.2672 -0.7728 0.9801
+1.632 -1.987 -0.3277 -0.7728 0.9689
+1.581 -1.925 -0.3842 -0.7728 0.9553
+1.533 -1.866 -0.4359 -0.7728 0.9394
+1.486 -1.809 -0.4821 -0.7728 0.9211
+1.442 -1.756 -0.5223 -0.7728 0.9004
+1.401 -1.705 -0.5559 -0.7728 0.8776
+1.362 -1.659 -0.5823 -0.7728 0.8525
+1.327 -1.616 -0.6013 -0.7728 0.8253
+1.295 -1.577 -0.6125 -0.7728 0.7961
+1.267 -1.543 -0.6156 -0.7728 0.7648
+1.242 -1.513 -0.6105 -0.7728 0.7317
+1.221 -1.487 -0.5971 -0.7728 0.6967
+1.204 -1.466 -0.5755 -0.7728 0.66
+1.19 -1.449 -0.5457 -0.7728 0.6216
+1.181 -1.437 -0.5079 -0.7728 0.5817
+1.175 -1.43 -0.4624 -0.7728 0.5403
+1.172 -1.427 -0.4097 -0.7728 0.4976
+1.173 -1.429 -0.3501 -0.7728 0.4536
+1.178 -1.434 -0.2841 -0.7728 0.4085
+1.186 -1.444 -0.2123 -0.7728 0.3624
+1.197 -1.458 -0.1355 -0.7728 0.3153
+1.211 -1.475 -0.05425 -0.7728 0.2675
+1.228 -1.495 0.03062 -0.7728 0.219
+1.248 -1.519 0.1183 -0.7728 0.17
+1.27 -1.546 0.208 -0.7728 0.1205
+1.293 -1.575 0.2987 -0.7728 0.07074
+1.319 -1.606 0.3897 -0.7728 0.02079
+1.346 -1.639 0.48 -0.7728 -0.0292
+1.375 -1.674 0.5687 -0.7728 -0.07912
+1.404 -1.71 0.6548 -0.7728 -0.1288
+1.435 -1.747 0.7377 -0.7728 -0.1782
+1.465 -1.784 0.8163 -0.7728 -0.2272
+1.496 -1.822 0.8898 -0.7728 -0.2756
+1.527 -1.859 0.9576 -0.7728 -0.3233
+1.558 -1.896 1.019 -0.7728 -0.3702
+1.588 -1.933 1.073 -0.7728 -0.4161
+1.617 -1.969 1.119 -0.7728 -0.4611
+1.645 -2.003 1.157 -0.7728 -0.5048
+1.672 -2.036 1.186 -0.7728 -0.5474
+1.698 -2.068 1.206 -0.7728 -0.5885
+1.723 -2.098 1.216 -0.7728 -0.6282
+1.746 -2.125 1.217 -0.7728 -0.6663
+1.767 -2.151 1.208 -0.7728 -0.7027
+1.787 -2.175 1.189 -0.7728 -0.7374
+1.805 -2.197 1.161 -0.7728 -0.7702
+1.821 -2.217 1.123 -0.7728 -0.8011
+1.835 -2.234 1.075 -0.7728 -0.8301
+1.848 -2.25 1.019 -0.7728 -0.8569
+1.859 -2.263 0.9542 -0.7728 -0.8816
+1.868 -2.275 0.8813 -0.7728 -0.9041
+1.876 -2.285 0.801 -0.7728 -0.9243
+1.883 -2.293 0.7139 -0.7728 -0.9422
+1.888 -2.299 0.6207 -0.7728 -0.9578
+1.893 -2.305 0.5223 -0.7728 -0.971
+1.896 -2.309 0.4194 -0.7728 -0.9817
+1.899 -2.312 0.3129 -0.7728 -0.99
+1.901 -2.315 0.2038 -0.7728 -0.9958
+1.903 -2.317 0.09289 -0.7728 -0.9991
+1.904 -2.319 -0.01879 -0.7728 -1
+1.906 -2.321 -0.1303 -0.7728 -0.9983
+1.908 -2.323 -0.2407 -0.7728 -0.9941
+1.91 -2.326 -0.3491 -0.7728 -0.9875
+1.913 -2.329 -0.4544 -0.7728 -0.9784
+1.917 -2.334 -0.5559 -0.7728 -0.9668
+1.921 -2.339 -0.6527 -0.7728 -0.9528
+1.927 -2.346 -0.7439 -0.7728 -0.9365
+1.934 -2.355 -0.8288 -0.7728 -0.9178
+1.943 -2.365 -0.9067 -0.7728 -0.8968
+1.953 -2.378 -0.9769 -0.7728 -0.8735
+1.964 -2.392 -1.039 -0.7728 -0.8481
+1.978 -2.408 -1.092 -0.7728 -0.8206
+1.993 -2.426 -1.137 -0.7728 -0.791
+2.009 -2.446 -1.171 -0.7728 -0.7594
+2.028 -2.469 -1.197 -0.7728 -0.7259
+2.048 -2.494 -1.212 -0.7728 -0.6907
+2.07 -2.52 -1.218 -0.7728 -0.6536
+2.093 -2.549 -1.214 -0.7728 -0.615
+2.118 -2.579 -1.2 -0.7728 -0.5748
+2.145 -2.611 -1.177 -0.7728 -0.5332
+2.172 -2.645 -1.145 -0.7728 -0.4903
+2.201 -2.68 -1.104 -0.7728 -0.4461
+2.231 -2.716 -1.055 -0.7728 -0.4008
+2.261 -2.753 -0.999 -0.7728 -0.3545
+2.291 -2.79 -0.9355 -0.7728 -0.3073
+2.322 -2.828 -0.8657 -0.7728 -0.2594
+2.353 -2.865 -0.7904 -0.7728 -0.2108
+2.384 -2.902 -0.7102 -0.7728 -0.1617
+2.414 -2.939 -0.6262 -0.7728 -0.1122
+2.443 -2.974 -0.5391 -0.7728 -0.06235
+2.471 -3.009 -0.4497 -0.7728 -0.01239
+2.498 -3.041 -0.3591 -0.7728 0.0376
+2.523 -3.072 -0.2681 -0.7728 0.0875
+2.546 -3.1 -0.1776 -0.7728 0.1372
+2.567 -3.126 -0.08856 -0.7728 0.1865
+2.586 -3.148 -0.001726 -0.7728 0.2354
+2.602 -3.168 0.08201 -0.7728 0.2837
+2.615 -3.184 0.1619 -0.7728 0.3312
+2.625 -3.196 0.2371 -0.7728 0.378
+2.632 -3.205 0.3069 -0.7728 0.4238
+2.636 -3.209 0.3708 -0.7728 0.4685
+2.636 -3.209 0.4282 -0.7728 0.5121
+2.632 -3.205 0.4786 -0.7728 0.5544
+2.625 -3.196 0.5215 -0.7728 0.5953
+2.614 -3.182 0.5566 -0.7728 0.6347
+2.599 -3.164 0.5837 -0.7728 0.6725
+2.58 -3.141 0.6025 -0.7728 0.7087
+2.558 -3.114 0.6131 -0.7728 0.743
+2.532 -3.083 0.6155 -0.7728 0.7756
+2.502 -3.047 0.6096 -0.7728 0.8061
+2.469 -3.007 0.5958 -0.7728 0.8347
+2.433 -2.963 0.5742 -0.7728 0.8612
+2.394 -2.915 0.5453 -0.7728 0.8855
+2.352 -2.863 0.5095 -0.7728 0.9076
+2.307 -2.809 0.4672 -0.7728 0.9275
+2.259 -2.751 0.4191 -0.7728 0.945
+2.21 -2.691 0.3657 -0.7728 0.9602
+2.159 -2.628 0.3078 -0.7728 0.9729
+2.106 -2.564 0.246 -0.7728 0.9833
+2.052 -2.498 0.1812 -0.7728 0.9911
+1.997 -2.431 0.1142 -0.7728 0.9965
+1.941 -2.363 0.04578 -0.7728 0.9994
+2.018 -2.22 0 -0.7401 1
+1.96 -2.157 -0.07107 -0.7401 0.9988
+1.902 -2.093 -0.1413 -0.7401 0.995
+1.845 -2.031 -0.2098 -0.7401 0.9888
+1.789 -1.969 -0.2757 -0.7401 0.9801
+1.735 -1.909 -0.3383 -0.7401 0.9689
+1.682 -1.851 -0.3968 -0.7401 0.9553
+1.631 -1.795 -0.4504 -0.7401 0.9394
+1.583 -1.742 -0.4984 -0.7401 0.9211
+1.537 -1.691 -0.5403 -0.7401 0.9004
+1.494 -1.644 -0.5755 -0.7401 0.8776
+1.454 -1.6 -0.6035 -0.7401 0.8525
+1.417 -1.559 -0.6238 -0.7401 0.8253
+1.383 -1.522 -0.6363 -0.7401 0.7961
+1.353 -1.489 -0.6405 -0.7401 0.7648
+1.327 -1.46 -0.6364 -0.7401 0.7317
+1.304 -1.435 -0.6238 -0.7401 0.6967
+1.286 -1.415 -0.6028 -0.7401 0.66
+1.271 -1.398 -0.5736 -0.7401 0.6216
+1.26 -1.386 -0.5362 -0.7401 0.5817
+1.253 -1.378 -0.491 -0.7401 0.5403
+1.249 -1.375 -0.4384 -0.7401 0.4976
+1.249 -1.375 -0.3787 -0.7401 0.4536
+1.253 -1.379 -0.3126 -0.7401 0.4085
+1.261 -1.387 -0.2405 -0.7401 0.3624
+1.271 -1.399 -0.1633 -0.7401 0.3153
+1.285 -1.414 -0.08151 -0.7401 0.2675
+1.301 -1.432 0.003996 -0.7401 0.219
+1.32 -1.453 0.09242 -0.7401 0.17
+1.342 -1.477 0.1829 -0.7401 0.1205
+1.366 -1.503 0.2746 -0.7401 0.07074
+1.391 -1.531 0.3665 -0.7401 0.02079
+1.419 -1.561 0.4579 -0.7401 -0.0292
+1.447 -1.593 0.5476 -0.7401 -0.07912
+1.477 -1.626 0.635 -0.7401 -0.1288
+1.508 -1.659 0.7189 -0.7401 -0.1782
+1.539 -1.694 0.7987 -0.7401 -0.2272
+1.571 -1.728 0.8735 -0.7401 -0.2756
+1.602 -1.763 0.9424 -0.7401 -0.3233
+1.633 -1.797 1.005 -0.7401 -0.3702
+1.664 -1.831 1.06 -0.7401 -0.4161
+1.695 -1.865 1.107 -0.7401 -0.4611
+1.724 -1.897 1.146 -0.7401 -0.5048
+1.752 -1.928 1.176 -0.7401 -0.5474
+1.779 -1.958 1.197 -0.7401 -0.5885
+1.805 -1.986 1.209 -0.7401 -0.6282
+1.829 -2.013 1.21 -0.7401 -0.6663
+1.852 -2.038 1.202 -0.7401 -0.7027
+1.873 -2.061 1.184 -0.7401 -0.7374
+1.893 -2.083 1.156 -0.7401 -0.7702
+1.91 -2.102 1.119 -0.7401 -0.8011
+1.927 -2.12 1.072 -0.7401 -0.8301
+1.941 -2.136 1.016 -0.7401 -0.8569
+1.954 -2.15 0.9521 -0.7401 -0.8816
+1.965 -2.162 0.8796 -0.7401 -0.9041
+1.975 -2.173 0.7996 -0.7401 -0.9243
+1.983 -2.183 0.7128 -0.7401 -0.9422
+1.991 -2.191 0.6199 -0.7401 -0.9578
+1.997 -2.197 0.5217 -0.7401 -0.971
+2.002 -2.203 0.419 -0.7401 -0.9817
+2.007 -2.208 0.3126 -0.7401 -0.99
+2.011 -2.213 0.2036 -0.7401 -0.9958
+2.015 -2.217 0.09281 -0.7401 -0.9991
+2.018 -2.221 -0.01878 -0.7401 -1
+2.022 -2.225 -0.1302 -0.7401 -0.9983
+2.026 -2.229 -0.2405 -0.7401 -0.9941
+2.03 -2.234 -0.3487 -0.7401 -0.9875
+2.035 -2.239 -0.4539 -0.7401 -0.9784
+2.04 -2.245 -0.5553 -0.7401 -0.9668
+2.047 -2.252 -0.6518 -0.7401 -0.9528
+2.055 -2.261 -0.7427 -0.7401 -0.9365
+2.063 -2.271 -0.8273 -0.7401 -0.9178
+2.074 -2.282 -0.9049 -0.7401 -0.8968
+2.086 -2.295 -0.9747 -0.7401 -0.8735
+2.099 -2.31 -1.036 -0.7401 -0.8481
+2.114 -2.326 -1.089 -0.7401 -0.8206
+2.13 -2.344 -1.133 -0.7401 -0.791
+2.149 -2.365 -1.167 -0.7401 -0.7594
+2.169 -2.387 -1.191 -0.7401 -0.7259
+2.19 -2.411 -1.206 -0.7401 -0.6907
+2.214 -2.436 -1.211 -0.7401 -0.6536
+2.239 -2.463 -1.206 -0.7401 -0.615
+2.265 -2.492 -1.191 -0.7401 -0.5748
+2.292 -2.523 -1.167 -0.7401 -0.5332
+2.321 -2.554 -1.134 -0.7401 -0.4903
+2.351 -2.587 -1.092 -0.7401 -0.4461
+2.381 -2.62 -1.042 -0.7401 -0.4008
+2.412 -2.655 -0.9846 -0.7401 -0.3545
+2.444 -2.689 -0.92 -0.7401 -0.3073
+2.475 -2.724 -0.849 -0.7401 -0.2594
+2.507 -2.758 -0.7724 -0.7401 -0.2108
+2.538 -2.793 -0.6911 -0.7401 -0.1617
+2.568 -2.826 -0.6059 -0.7401 -0.1122
+2.598 -2.858 -0.5177 -0.7401 -0.06235
+2.626 -2.89 -0.4273 -0.7401 -0.01239
+2.653 -2.919 -0.3356 -0.7401 0.0376
+2.678 -2.947 -0.2437 -0.7401 0.0875
+2.701 -2.972 -0.1523 -0.7401 0.1372
+2.722 -2.995 -0.06241 -0.7401 0.1865
+2.74 -3.015 0.02513 -0.7401 0.2354
+2.755 -3.032 0.1095 -0.7401 0.2837
+2.768 -3.046 0.1898 -0.7401 0.3312
+2.777 -3.056 0.2654 -0.7401 0.378
+2.784 -3.063 0.3355 -0.7401 0.4238
+2.786 -3.066 0.3995 -0.7401 0.4685
+2.785 -3.065 0.4569 -0.7401 0.5121
+2.781 -3.06 0.5071 -0.7401 0.5544
+2.772 -3.051 0.5497 -0.7401 0.5953
+2.76 -3.037 0.5843 -0.7401 0.6347
+2.744 -3.019 0.6108 -0.7401 0.6725
+2.724 -2.997 0.629 -0.7401 0.7087
+2.7 -2.971 0.6387 -0.7401 0.743
+2.672 -2.941 0.64 -0.7401 0.7756
+2.641 -2.906 0.633 -0.7401 0.8061
+2.606 -2.868 0.6179 -0.7401 0.8347
+2.568 -2.826 0.5949 -0.7401 0.8612
+2.527 -2.781 0.5645 -0.7401 0.8855
+2.483 -2.733 0.527 -0.7401 0.9076
+2.436 -2.681 0.4829 -0.7401 0.9275
+2.387 -2.627 0.4329 -0.7401 0.945
+2.335 -2.57 0.3776 -0.7401 0.9602
+2.282 -2.511 0.3177 -0.7401 0.9729
+2.227 -2.451 0.2539 -0.7401 0.9833
+2.171 -2.389 0.187 -0.7401 0.9911
+2.114 -2.326 0.1178 -0.7401 0.9965
+2.056 -2.263 0.04722 -0.7401 0.9994
+2.126 -2.117 0 -0.7055 1
+2.066 -2.057 -0.0732 -0.7055 0.9988
+2.007 -1.998 -0.1455 -0.7055 0.995
+1.948 -1.94 -0.2161 -0.7055 0.9888
+1.891 -1.882 -0.2841 -0.7055 0.9801
+1.834 -1.826 -0.3487 -0.7055 0.9689
+1.78 -1.772 -0.4091 -0.7055 0.9553
+1.727 -1.72 -0.4646 -0.7055 0.9394
+1.677 -1.67 -0.5144 -0.7055 0.9211
+1.629 -1.622 -0.558 -0.7055 0.9004
+1.584 -1.577 -0.5948 -0.7055 0.8776
+1.543 -1.536 -0.6243 -0.7055 0.8525
+1.504 -1.497 -0.646 -0.7055 0.8253
+1.469 -1.462 -0.6596 -0.7055 0.7961
+1.437 -1.431 -0.665 -0.7055 0.7648
+1.41 -1.403 -0.6618 -0.7055 0.7317
+1.386 -1.38 -0.6501 -0.7055 0.6967
+1.366 -1.36 -0.6299 -0.7055 0.66
+1.35 -1.344 -0.6012 -0.7055 0.6216
+1.337 -1.331 -0.5642 -0.7055 0.5817
+1.329 -1.323 -0.5193 -0.7055 0.5403
+1.324 -1.319 -0.4668 -0.7055 0.4976
+1.324 -1.318 -0.4072 -0.7055 0.4536
+1.326 -1.321 -0.3409 -0.7055 0.4085
+1.333 -1.327 -0.2686 -0.7055 0.3624
+1.343 -1.337 -0.191 -0.7055 0.3153
+1.355 -1.349 -0.1087 -0.7055 0.2675
+1.371 -1.365 -0.02263 -0.7055 0.219
+1.39 -1.384 0.06648 -0.7055 0.17
+1.411 -1.405 0.1577 -0.7055 0.1205
+1.434 -1.428 0.2503 -0.7055 0.07074
+1.46 -1.453 0.3431 -0.7055 0.02079
+1.487 -1.48 0.4355 -0.7055 -0.0292
+1.516 -1.509 0.5263 -0.7055 -0.07912
+1.546 -1.539 0.6147 -0.7055 -0.1288
+1.576 -1.569 0.6998 -0.7055 -0.1782
+1.608 -1.601 0.7807 -0.7055 -0.2272
+1.64 -1.632 0.8566 -0.7055 -0.2756
+1.672 -1.664 0.9267 -0.7055 -0.3233
+1.704 -1.696 0.9903 -0.7055 -0.3702
+1.735 -1.727 1.047 -0.7055 -0.4161
+1.766 -1.758 1.095 -0.7055 -0.4611
+1.796 -1.788 1.135 -0.7055 -0.5048
+1.826 -1.818 1.166 -0.7055 -0.5474
+1.854 -1.846 1.188 -0.7055 -0.5885
+1.881 -1.872 1.2 -0.7055 -0.6282
+1.906 -1.898 1.203 -0.7055 -0.6663
+1.93 -1.922 1.196 -0.7055 -0.7027
+1.953 -1.944 1.179 -0.7055 -0.7374
+1.974 -1.965 1.151 -0.7055 -0.7702
+1.993 -1.985 1.115 -0.7055 -0.8011
+2.011 -2.002 1.069 -0.7055 -0.8301
+2.027 -2.018 1.013 -0.7055 -0.8569
+2.042 -2.033 0.9494 -0.7055 -0.8816
+2.055 -2.046 0.8774 -0.7055 -0.9041
+2.067 -2.058 0.7978 -0.7055 -0.9243
+2.077 -2.068 0.7113 -0.7055 -0.9422
+2.087 -2.077 0.6187 -0.7055 -0.9578
+2.095 -2.086 0.5207 -0.7055 -0.971
+2.102 -2.093 0.4183 -0.7055 -0.9817
+2.109 -2.1 0.3121 -0.7055 -0.99
+2.115 -2.106 0.2033 -0.7055 -0.9958
+2.121 -2.112 0.09267 -0.7055 -0.9991
+2.127 -2.118 -0.01875 -0.7055 -1
+2.133 -2.123 -0.13 -0.7055 -0.9983
+2.139 -2.129 -0.2401 -0.7055 -0.9941
+2.145 -2.136 -0.3482 -0.7055 -0.9875
+2.152 -2.143 -0.4532 -0.7055 -0.9784
+2.16 -2.15 -0.5542 -0.7055 -0.9668
+2.168 -2.159 -0.6505 -0.7055 -0.9528
+2.178 -2.168 -0.7411 -0.7055 -0.9365
+2.189 -2.179 -0.8254 -0.7055 -0.9178
+2.201 -2.191 -0.9025 -0.7055 -0.8968
+2.215 -2.205 -0.9718 -0.7055 -0.8735
+2.23 -2.22 -1.033 -0.7055 -0.8481
+2.247 -2.237 -1.085 -0.7055 -0.8206
+2.265 -2.255 -1.128 -0.7055 -0.791
+2.285 -2.275 -1.162 -0.7055 -0.7594
+2.306 -2.296 -1.185 -0.7055 -0.7259
+2.33 -2.319 -1.199 -0.7055 -0.6907
+2.354 -2.344 -1.203 -0.7055 -0.6536
+2.38 -2.37 -1.197 -0.7055 -0.615
+2.408 -2.397 -1.182 -0.7055 -0.5748
+2.436 -2.425 -1.157 -0.7055 -0.5332
+2.466 -2.455 -1.123 -0.7055 -0.4903
+2.496 -2.485 -1.08 -0.7055 -0.4461
+2.527 -2.516 -1.028 -0.7055 -0.4008
+2.559 -2.548 -0.9697 -0.7055 -0.3545
+2.591 -2.58 -0.9038 -0.7055 -0.3073
+2.623 -2.612 -0.8317 -0.7055 -0.2594
+2.655 -2.643 -0.754 -0.7055 -0.2108
+2.686 -2.674 -0.6716 -0.7055 -0.1617
+2.717 -2.705 -0.5853 -0.7055 -0.1122
+2.746 -2.734 -0.496 -0.7055 -0.06235
+2.774 -2.762 -0.4045 -0.7055 -0.01239
+2.801 -2.789 -0.3119 -0.7055 0.0376
+2.826 -2.813 -0.2191 -0.7055 0.0875
+2.848 -2.836 -0.1269 -0.7055 0.1372
+2.869 -2.856 -0.03623 -0.7055 0.1865
+2.886 -2.874 0.05196 -0.7055 0.2354
+2.901 -2.888 0.1369 -0.7055 0.2837
+2.913 -2.9 0.2176 -0.7055 0.3312
+2.922 -2.909 0.2935 -0.7055 0.378
+2.927 -2.914 0.3639 -0.7055 0.4238
+2.929 -2.916 0.428 -0.7055 0.4685
+2.927 -2.914 0.4853 -0.7055 0.5121
+2.921 -2.908 0.5353 -0.7055 0.5544
+2.911 -2.898 0.5775 -0.7055 0.5953
+2.898 -2.885 0.6117 -0.7055 0.6347
+2.88 -2.867 0.6376 -0.7055 0.6725
+2.859 -2.846 0.655 -0.7055 0.7087
+2.833 -2.821 0.6638 -0.7055 0.743
+2.804 -2.792 0.6641 -0.7055 0.7756
+2.772 -2.759 0.656 -0.7055 0.8061
+2.735 -2.723 0.6396 -0.7055 0.8347
+2.696 -2.684 0.6152 -0.7055 0.8612
+2.653 -2.641 0.5832 -0.7055 0.8855
+2.607 -2.596 0.5441 -0.7055 0.9076
+2.558 -2.547 0.4983 -0.7055 0.9275
+2.507 -2.496 0.4465 -0.7055 0.945
+2.454 -2.443 0.3893 -0.7055 0.9602
+2.399 -2.388 0.3274 -0.7055 0.9729
+2.342 -2.332 0.2616 -0.7055 0.9833
+2.284 -2.274 0.1926 -0.7055 0.9911
+2.225 -2.215 0.1214 -0.7055 0.9965
+2.166 -2.156 0.04864 -0.7055 0.9994
+2.229 -2.008 0 -0.6692 1
+2.168 -1.953 -0.07529 -0.6692 0.9988
+2.107 -1.898 -0.1497 -0.6692 0.995
+2.047 -1.843 -0.2223 -0.6692 0.9888
+1.988 -1.79 -0.2923 -0.6692 0.9801
+1.93 -1.738 -0.3589 -0.6692 0.9689
+1.874 -1.688 -0.4212 -0.6692 0.9553
+1.82 -1.639 -0.4785 -0.6692 0.9394
+1.768 -1.592 -0.5301 -0.6692 0.9211
+1.719 -1.548 -0.5754 -0.6692 0.9004
+1.672 -1.506 -0.6137 -0.6692 0.8776
+1.629 -1.467 -0.6446 -0.6692 0.8525
+1.589 -1.431 -0.6677 -0.6692 0.8253
+1.553 -1.398 -0.6826 -0.6692 0.7961
+1.52 -1.369 -0.6891 -0.6692 0.7648
+1.491 -1.343 -0.6869 -0.6692 0.7317
+1.465 -1.32 -0.676 -0.6692 0.6967
+1.444 -1.3 -0.6565 -0.6692 0.66
+1.426 -1.285 -0.6284 -0.6692 0.6216
+1.413 -1.273 -0.5919 -0.6692 0.5817
+1.403 -1.264 -0.5473 -0.6692 0.5403
+1.398 -1.259 -0.4949 -0.6692 0.4976
+1.396 -1.257 -0.4353 -0.6692 0.4536
+1.397 -1.259 -0.369 -0.6692 0.4085
+1.403 -1.263 -0.2965 -0.6692 0.3624
+1.411 -1.271 -0.2186 -0.6692 0.3153
+1.423 -1.282 -0.1359 -0.6692 0.2675
+1.438 -1.296 -0.04925 -0.6692 0.219
+1.456 -1.312 0.04049 -0.6692 0.17
+1.477 -1.33 0.1325 -0.6692 0.1205
+1.5 -1.351 0.2258 -0.6692 0.07074
+1.525 -1.373 0.3195 -0.6692 0.02079
+1.551 -1.397 0.4128 -0.6692 -0.0292
+1.58 -1.423 0.5046 -0.6692 -0.07912
+1.609 -1.449 0.594 -0.6692 -0.1288
+1.64 -1.477 0.6802 -0.6692 -0.1782
+1.671 -1.505 0.7622 -0.6692 -0.2272
+1.703 -1.534 0.8392 -0.6692 -0.2756
+1.736 -1.563 0.9104 -0.6692 -0.3233
+1.768 -1.592 0.975 -0.6692 -0.3702
+1.8 -1.621 1.032 -0.6692 -0.4161
+1.832 -1.65 1.082 -0.6692 -0.4611
+1.862 -1.677 1.123 -0.6692 -0.5048
+1.893 -1.705 1.155 -0.6692 -0.5474
+1.922 -1.731 1.178 -0.6692 -0.5885
+1.95 -1.756 1.191 -0.6692 -0.6282
+1.977 -1.78 1.195 -0.6692 -0.6663
+2.002 -1.803 1.189 -0.6692 -0.7027
+2.026 -1.825 1.172 -0.6692 -0.7374
+2.048 -1.845 1.146 -0.6692 -0.7702
+2.069 -1.864 1.11 -0.6692 -0.8011
+2.089 -1.881 1.064 -0.6692 -0.8301
+2.107 -1.898 1.01 -0.6692 -0.8569
+2.123 -1.912 0.9462 -0.6692 -0.8816
+2.138 -1.926 0.8746 -0.6692 -0.9041
+2.152 -1.939 0.7955 -0.6692 -0.9243
+2.165 -1.95 0.7094 -0.6692 -0.9422
+2.176 -1.96 0.6171 -0.6692 -0.9578
+2.187 -1.97 0.5195 -0.6692 -0.971
+2.197 -1.978 0.4173 -0.6692 -0.9817
+2.206 -1.987 0.3114 -0.6692 -0.99
+2.214 -1.994 0.2028 -0.6692 -0.9958
+2.222 -2.002 0.09247 -0.6692 -0.9991
+2.23 -2.009 -0.01871 -0.6692 -1
+2.239 -2.016 -0.1297 -0.6692 -0.9983
+2.247 -2.024 -0.2396 -0.6692 -0.9941
+2.256 -2.032 -0.3474 -0.6692 -0.9875
+2.265 -2.04 -0.4521 -0.6692 -0.9784
+2.275 -2.049 -0.5529 -0.6692 -0.9668
+2.286 -2.059 -0.6488 -0.6692 -0.9528
+2.297 -2.069 -0.7391 -0.6692 -0.9365
+2.31 -2.081 -0.8229 -0.6692 -0.9178
+2.325 -2.094 -0.8995 -0.6692 -0.8968
+2.34 -2.108 -0.9684 -0.6692 -0.8735
+2.357 -2.123 -1.029 -0.6692 -0.8481
+2.376 -2.14 -1.081 -0.6692 -0.8206
+2.396 -2.158 -1.123 -0.6692 -0.791
+2.417 -2.177 -1.156 -0.6692 -0.7594
+2.44 -2.198 -1.179 -0.6692 -0.7259
+2.465 -2.22 -1.192 -0.6692 -0.6907
+2.491 -2.243 -1.195 -0.6692 -0.6536
+2.518 -2.268 -1.188 -0.6692 -0.615
+2.546 -2.293 -1.172 -0.6692 -0.5748
+2.576 -2.32 -1.145 -0.6692 -0.5332
+2.606 -2.347 -1.11 -0.6692 -0.4903
+2.637 -2.375 -1.066 -0.6692 -0.4461
+2.669 -2.404 -1.014 -0.6692 -0.4008
+2.701 -2.433 -0.9541 -0.6692 -0.3545
+2.733 -2.462 -0.8871 -0.6692 -0.3073
+2.766 -2.491 -0.8139 -0.6692 -0.2594
+2.797 -2.52 -0.7351 -0.6692 -0.2108
+2.829 -2.548 -0.6516 -0.6692 -0.1617
+2.859 -2.575 -0.5643 -0.6692 -0.1122
+2.888 -2.601 -0.4739 -0.6692 -0.06235
+2.916 -2.627 -0.3815 -0.6692 -0.01239
+2.942 -2.65 -0.288 -0.6692 0.0376
+2.967 -2.672 -0.1943 -0.6692 0.0875
+2.989 -2.692 -0.1013 -0.6692 0.1372
+3.008 -2.709 -0.01002 -0.6692 0.1865
+3.025 -2.725 0.07877 -0.6692 0.2354
+3.039 -2.737 0.1642 -0.6692 0.2837
+3.05 -2.747 0.2453 -0.6692 0.3312
+3.058 -2.754 0.3215 -0.6692 0.378
+3.062 -2.758 0.392 -0.6692 0.4238
+3.062 -2.758 0.4562 -0.6692 0.4685
+3.059 -2.755 0.5134 -0.6692 0.5121
+3.052 -2.749 0.5631 -0.6692 0.5544
+3.041 -2.739 0.6051 -0.6692 0.5953
+3.026 -2.726 0.6388 -0.6692 0.6347
+3.008 -2.709 0.664 -0.6692 0.6725
+2.985 -2.688 0.6807 -0.6692 0.7087
+2.958 -2.664 0.6886 -0.6692 0.743
+2.928 -2.637 0.6878 -0.6692 0.7756
+2.894 -2.606 0.6785 -0.6692 0.8061
+2.856 -2.572 0.6609 -0.6692 0.8347
+2.815 -2.535 0.6351 -0.6692 0.8612
+2.771 -2.495 0.6016 -0.6692 0.8855
+2.723 -2.453 0.5609 -0.6692 0.9076
+2.673 -2.408 0.5134 -0.6692 0.9275
+2.621 -2.36 0.4598 -0.6692 0.945
+2.566 -2.311 0.4008 -0.6692 0.9602
+2.509 -2.26 0.3369 -0.6692 0.9729
+2.451 -2.207 0.2691 -0.6692 0.9833
+2.391 -2.154 0.1981 -0.6692 0.9911
+2.331 -2.099 0.1248 -0.6692 0.9965
+2.27 -2.044 0.05002 -0.6692 0.9994
+2.327 -1.894 0 -0.6313 1
+2.264 -1.843 -0.07732 -0.6313 0.9988
+2.202 -1.792 -0.1537 -0.6313 0.995
+2.141 -1.742 -0.2284 -0.6313 0.9888
+2.08 -1.693 -0.3004 -0.6313 0.9801
+2.021 -1.645 -0.3688 -0.6313 0.9689
+1.964 -1.599 -0.433 -0.6313 0.9553
+1.909 -1.554 -0.4921 -0.6313 0.9394
+1.856 -1.51 -0.5455 -0.6313 0.9211
+1.805 -1.469 -0.5924 -0.6313 0.9004
+1.758 -1.431 -0.6323 -0.6313 0.8776
+1.713 -1.394 -0.6646 -0.6313 0.8525
+1.672 -1.361 -0.689 -0.6313 0.8253
+1.634 -1.33 -0.7052 -0.6313 0.7961
+1.6 -1.302 -0.7127 -0.6313 0.7648
+1.569 -1.277 -0.7115 -0.6313 0.7317
+1.543 -1.256 -0.7015 -0.6313 0.6967
+1.52 -1.237 -0.6827 -0.6313 0.66
+1.501 -1.222 -0.6552 -0.6313 0.6216
+1.486 -1.21 -0.6191 -0.6313 0.5817
+1.476 -1.201 -0.5749 -0.6313 0.5403
+1.469 -1.195 -0.5228 -0.6313 0.4976
+1.465 -1.193 -0.4632 -0.6313 0.4536
+1.466 -1.193 -0.3969 -0.6313 0.4085
+1.47 -1.197 -0.3242 -0.6313 0.3624
+1.478 -1.203 -0.246 -0.6313 0.3153
+1.489 -1.212 -0.1629 -0.6313 0.2675
+1.503 -1.223 -0.07583 -0.6313 0.219
+1.52 -1.237 0.01448 -0.6313 0.17
+1.539 -1.253 0.1071 -0.6313 0.1205
+1.561 -1.271 0.2012 -0.6313 0.07074
+1.585 -1.29 0.2957 -0.6313 0.02079
+1.611 -1.312 0.3898 -0.6313 -0.0292
+1.639 -1.334 0.4826 -0.6313 -0.07912
+1.668 -1.358 0.573 -0.6313 -0.1288
+1.699 -1.383 0.6601 -0.6313 -0.1782
+1.73 -1.408 0.7432 -0.6313 -0.2272
+1.762 -1.434 0.8212 -0.6313 -0.2756
+1.794 -1.46 0.8935 -0.6313 -0.3233
+1.827 -1.487 0.9592 -0.6313 -0.3702
+1.859 -1.513 1.018 -0.6313 -0.4161
+1.891 -1.539 1.068 -0.6313 -0.4611
+1.922 -1.565 1.11 -0.6313 -0.5048
+1.953 -1.59 1.144 -0.6313 -0.5474
+1.983 -1.614 1.167 -0.6313 -0.5885
+2.012 -1.638 1.182 -0.6313 -0.6282
+2.04 -1.66 1.186 -0.6313 -0.6663
+2.067 -1.682 1.18 -0.6313 -0.7027
+2.092 -1.703 1.165 -0.6313 -0.7374
+2.116 -1.722 1.139 -0.6313 -0.7702
+2.138 -1.741 1.104 -0.6313 -0.8011
+2.16 -1.758 1.059 -0.6313 -0.8301
+2.18 -1.774 1.005 -0.6313 -0.8569
+2.198 -1.789 0.9423 -0.6313 -0.8816
+2.215 -1.803 0.8713 -0.6313 -0.9041
+2.231 -1.816 0.7926 -0.6313 -0.9243
+2.246 -1.828 0.707 -0.6313 -0.9422
+2.26 -1.839 0.6152 -0.6313 -0.9578
+2.273 -1.85 0.5179 -0.6313 -0.971
+2.285 -1.86 0.4161 -0.6313 -0.9817
+2.296 -1.869 0.3105 -0.6313 -0.99
+2.307 -1.878 0.2023 -0.6313 -0.9958
+2.318 -1.887 0.09222 -0.6313 -0.9991
+2.328 -1.895 -0.01866 -0.6313 -1
+2.339 -1.904 -0.1294 -0.6313 -0.9983
+2.35 -1.913 -0.2389 -0.6313 -0.9941
+2.361 -1.922 -0.3464 -0.6313 -0.9875
+2.373 -1.931 -0.4508 -0.6313 -0.9784
+2.385 -1.941 -0.5512 -0.6313 -0.9668
+2.398 -1.952 -0.6467 -0.6313 -0.9528
+2.412 -1.964 -0.7365 -0.6313 -0.9365
+2.428 -1.976 -0.8199 -0.6313 -0.9178
+2.444 -1.989 -0.8961 -0.6313 -0.8968
+2.461 -2.003 -0.9644 -0.6313 -0.8735
+2.48 -2.019 -1.024 -0.6313 -0.8481
+2.501 -2.035 -1.075 -0.6313 -0.8206
+2.522 -2.053 -1.117 -0.6313 -0.791
+2.545 -2.072 -1.149 -0.6313 -0.7594
+2.57 -2.092 -1.171 -0.6313 -0.7259
+2.596 -2.113 -1.183 -0.6313 -0.6907
+2.623 -2.135 -1.186 -0.6313 -0.6536
+2.651 -2.158 -1.178 -0.6313 -0.615
+2.68 -2.182 -1.16 -0.6313 -0.5748
+2.711 -2.206 -1.133 -0.6313 -0.5332
+2.742 -2.231 -1.097 -0.6313 -0.4903
+2.773 -2.257 -1.052 -0.6313 -0.4461
+2.805 -2.283 -0.9989 -0.6313 -0.4008
+2.838 -2.31 -0.9379 -0.6313 -0.3545
+2.87 -2.336 -0.8699 -0.6313 -0.3073
+2.902 -2.362 -0.7956 -0.6313 -0.2594
+2.934 -2.388 -0.7158 -0.6313 -0.2108
+2.965 -2.413 -0.6312 -0.6313 -0.1617
+2.995 -2.438 -0.5429 -0.6313 -0.1122
+3.024 -2.461 -0.4516 -0.6313 -0.06235
+3.051 -2.483 -0.3583 -0.6313 -0.01239
+3.076 -2.504 -0.2639 -0.6313 0.0376
+3.1 -2.523 -0.1694 -0.6313 0.0875
+3.121 -2.54 -0.07576 -0.6313 0.1372
+3.14 -2.556 0.01619 -0.6313 0.1865
+3.156 -2.569 0.1055 -0.6313 0.2354
+3.169 -2.579 0.1914 -0.6313 0.2837
+3.179 -2.587 0.2729 -0.6313 0.3312
+3.185 -2.592 0.3493 -0.6313 0.378
+3.188 -2.595 0.4199 -0.6313 0.4238
+3.187 -2.594 0.484 -0.6313 0.4685
+3.183 -2.591 0.5411 -0.6313 0.5121
+3.175 -2.584 0.5907 -0.6313 0.5544
+3.162 -2.574 0.6322 -0.6313 0.5953
+3.146 -2.561 0.6654 -0.6313 0.6347
+3.126 -2.544 0.69 -0.6313 0.6725
+3.102 -2.525 0.7059 -0.6313 0.7087
+3.074 -2.502 0.7129 -0.6313 0.743
+3.042 -2.476 0.7111 -0.6313 0.7756
+3.007 -2.447 0.7007 -0.6313 0.8061
+2.968 -2.416 0.6817 -0.6313 0.8347
+2.926 -2.381 0.6546 -0.6313 0.8612
+2.88 -2.344 0.6197 -0.6313 0.8855
+2.831 -2.305 0.5773 -0.6313 0.9076
+2.78 -2.263 0.5282 -0.6313 0.9275
+2.726 -2.219 0.4729 -0.6313 0.945
+2.67 -2.173 0.412 -0.6313 0.9602
+2.612 -2.126 0.3463 -0.6313 0.9729
+2.553 -2.078 0.2765 -0.6313 0.9833
+2.492 -2.028 0.2035 -0.6313 0.9911
+2.43 -1.978 0.1282 -0.6313 0.9965
+2.368 -1.928 0.05138 -0.6313 0.9994
+2.418 -1.775 0 -0.5917 1
+2.355 -1.729 -0.07931 -0.5917 0.9988
+2.292 -1.682 -0.1577 -0.5917 0.995
+2.23 -1.637 -0.2343 -0.5917 0.9888
+2.169 -1.592 -0.3082 -0.5917 0.9801
+2.109 -1.548 -0.3786 -0.5917 0.9689
+2.05 -1.505 -0.4446 -0.5917 0.9553
+1.994 -1.464 -0.5054 -0.5917 0.9394
+1.94 -1.424 -0.5605 -0.5917 0.9211
+1.889 -1.386 -0.609 -0.5917 0.9004
+1.84 -1.351 -0.6504 -0.5917 0.8776
+1.794 -1.317 -0.6842 -0.5917 0.8525
+1.752 -1.286 -0.7099 -0.5917 0.8253
+1.713 -1.257 -0.7273 -0.5917 0.7961
+1.678 -1.231 -0.7359 -0.5917 0.7648
+1.646 -1.208 -0.7357 -0.5917 0.7317
+1.618 -1.188 -0.7266 -0.5917 0.6967
+1.594 -1.17 -0.7085 -0.5917 0.66
+1.574 -1.155 -0.6816 -0.5917 0.6216
+1.558 -1.143 -0.646 -0.5917 0.5817
+1.546 -1.134 -0.6021 -0.5917 0.5403
+1.537 -1.128 -0.5503 -0.5917 0.4976
+1.533 -1.125 -0.4909 -0.5917 0.4536
+1.532 -1.125 -0.4245 -0.5917 0.4085
+1.535 -1.127 -0.3517 -0.5917 0.3624
+1.541 -1.131 -0.2733 -0.5917 0.3153
+1.551 -1.138 -0.1899 -0.5917 0.2675
+1.564 -1.148 -0.1024 -0.5917 0.219
+1.579 -1.159 -0.01154 -0.5917 0.17
+1.598 -1.173 0.0817 -0.5917 0.1205
+1.619 -1.188 0.1764 -0.5917 0.07074
+1.642 -1.205 0.2717 -0.5917 0.02079
+1.667 -1.224 0.3667 -0.5917 -0.0292
+1.694 -1.244 0.4603 -0.5917 -0.07912
+1.723 -1.265 0.5516 -0.5917 -0.1288
+1.753 -1.286 0.6397 -0.5917 -0.1782
+1.783 -1.309 0.7237 -0.5917 -0.2272
+1.815 -1.332 0.8028 -0.5917 -0.2756
+1.847 -1.356 0.8761 -0.5917 -0.3233
+1.879 -1.379 0.9428 -0.5917 -0.3702
+1.912 -1.403 1.002 -0.5917 -0.4161
+1.944 -1.427 1.054 -0.5917 -0.4611
+1.976 -1.45 1.097 -0.5917 -0.5048
+2.007 -1.473 1.131 -0.5917 -0.5474
+2.038 -1.496 1.156 -0.5917 -0.5885
+2.068 -1.518 1.171 -0.5917 -0.6282
+2.097 -1.539 1.176 -0.5917 -0.6663
+2.124 -1.559 1.172 -0.5917 -0.7027
+2.151 -1.579 1.157 -0.5917 -0.7374
+2.176 -1.598 1.132 -0.5917 -0.7702
+2.201 -1.615 1.098 -0.5917 -0.8011
+2.224 -1.632 1.053 -0.5917 -0.8301
+2.245 -1.648 1 -0.5917 -0.8569
+2.266 -1.663 0.9379 -0.5917 -0.8816
+2.285 -1.677 0.8674 -0.5917 -0.9041
+2.303 -1.691 0.7893 -0.5917 -0.9243
+2.32 -1.703 0.7042 -0.5917 -0.9422
+2.336 -1.715 0.6128 -0.5917 -0.9578
+2.352 -1.726 0.516 -0.5917 -0.971
+2.366 -1.737 0.4146 -0.5917 -0.9817
+2.38 -1.747 0.3095 -0.5917 -0.99
+2.394 -1.757 0.2016 -0.5917 -0.9958
+2.407 -1.767 0.09191 -0.5917 -0.9991
+2.421 -1.777 -0.0186 -0.5917 -1
+2.434 -1.787 -0.1289 -0.5917 -0.9983
+2.447 -1.796 -0.2381 -0.5917 -0.9941
+2.461 -1.806 -0.3452 -0.5917 -0.9875
+2.475 -1.817 -0.4491 -0.5917 -0.9784
+2.49 -1.828 -0.5491 -0.5917 -0.9668
+2.506 -1.839 -0.6442 -0.5917 -0.9528
+2.522 -1.851 -0.7335 -0.5917 -0.9365
+2.54 -1.864 -0.8164 -0.5917 -0.9178
+2.558 -1.878 -0.892 -0.5917 -0.8968
+2.578 -1.892 -0.9597 -0.5917 -0.8735
+2.599 -1.908 -1.019 -0.5917 -0.8481
+2.621 -1.924 -1.069 -0.5917 -0.8206
+2.644 -1.941 -1.11 -0.5917 -0.791
+2.669 -1.959 -1.142 -0.5917 -0.7594
+2.695 -1.978 -1.163 -0.5917 -0.7259
+2.722 -1.998 -1.174 -0.5917 -0.6907
+2.75 -2.018 -1.176 -0.5917 -0.6536
+2.779 -2.04 -1.167 -0.5917 -0.615
+2.809 -2.062 -1.149 -0.5917 -0.5748
+2.84 -2.085 -1.121 -0.5917 -0.5332
+2.872 -2.108 -1.083 -0.5917 -0.4903
+2.904 -2.131 -1.037 -0.5917 -0.4461
+2.936 -2.155 -0.9831 -0.5917 -0.4008
+2.968 -2.179 -0.9211 -0.5917 -0.3545
+3.001 -2.202 -0.8521 -0.5917 -0.3073
+3.033 -2.226 -0.7768 -0.5917 -0.2594
+3.064 -2.249 -0.696 -0.5917 -0.2108
+3.094 -2.271 -0.6105 -0.5917 -0.1617
+3.124 -2.293 -0.5212 -0.5917 -0.1122
+3.152 -2.313 -0.429 -0.5917 -0.06235
+3.178 -2.333 -0.3349 -0.5917 -0.01239
+3.203 -2.351 -0.2397 -0.5917 0.0376
+3.225 -2.367 -0.1445 -0.5917 0.0875
+3.245 -2.382 -0.05013 -0.5917 0.1372
+3.263 -2.395 0.0424 -0.5917 0.1865
+3.278 -2.406 0.1322 -0.5917 0.2354
+3.29 -2.415 0.2184 -0.5917 0.2837
+3.298 -2.421 0.3003 -0.5917 0.3312
+3.303 -2.425 0.3769 -0.5917 0.378
+3.305 -2.426 0.4475 -0.5917 0.4238
+3.303 -2.424 0.5116 -0.5917 0.4685
+3.297 -2.42 0.5686 -0.5917 0.5121
+3.288 -2.413 0.6178 -0.5917 0.5544
+3.274 -2.403 0.6589 -0.5917 0.5953
+3.257 -2.39 0.6916 -0.5917 0.6347
+3.235 -2.375 0.7156 -0.5917 0.6725
+3.21 -2.356 0.7306 -0.5917 0.7087
+3.181 -2.335 0.7368 -0.5917 0.743
+3.148 -2.31 0.734 -0.5917 0.7756
+3.111 -2.284 0.7224 -0.5917 0.8061
+3.071 -2.254 0.7022 -0.5917 0.8347
+3.028 -2.222 0.6737 -0.5917 0.8612
+2.981 -2.188 0.6373 -0.5917 0.8855
+2.931 -2.152 0.5934 -0.5917 0.9076
+2.879 -2.113 0.5427 -0.5917 0.9275
+2.824 -2.073 0.4856 -0.5917 0.945
+2.767 -2.031 0.4229 -0.5917 0.9602
+2.708 -1.988 0.3554 -0.5917 0.9729
+2.648 -1.944 0.2837 -0.5917 0.9833
+2.586 -1.898 0.2088 -0.5917 0.9911
+2.524 -1.852 0.1315 -0.5917 0.9965
+2.461 -1.806 0.0527 -0.5917 0.9994
+2.504 -1.652 0 -0.5507 1
+2.44 -1.61 -0.08125 -0.5507 0.9988
+2.377 -1.568 -0.1616 -0.5507 0.995
+2.314 -1.526 -0.2401 -0.5507 0.9888
+2.252 -1.486 -0.3159 -0.5507 0.9801
+2.191 -1.446 -0.3881 -0.5507 0.9689
+2.132 -1.407 -0.4559 -0.5507 0.9553
+2.075 -1.369 -0.5184 -0.5507 0.9394
+2.021 -1.333 -0.5751 -0.5507 0.9211
+1.968 -1.299 -0.6252 -0.5507 0.9004
+1.919 -1.266 -0.6681 -0.5507 0.8776
+1.872 -1.235 -0.7033 -0.5507 0.8525
+1.829 -1.207 -0.7304 -0.5507 0.8253
+1.789 -1.18 -0.7489 -0.5507 0.7961
+1.753 -1.156 -0.7587 -0.5507 0.7648
+1.72 -1.135 -0.7594 -0.5507 0.7317
+1.691 -1.115 -0.7512 -0.5507 0.6967
+1.666 -1.099 -0.7338 -0.5507 0.66
+1.644 -1.085 -0.7075 -0.5507 0.6216
+1.627 -1.073 -0.6725 -0.5507 0.5817
+1.613 -1.064 -0.629 -0.5507 0.5403
+1.604 -1.058 -0.5774 -0.5507 0.4976
+1.598 -1.054 -0.5182 -0.5507 0.4536
+1.595 -1.053 -0.4518 -0.5507 0.4085
+1.597 -1.054 -0.379 -0.5507 0.3624
+1.602 -1.057 -0.3004 -0.5507 0.3153
+1.61 -1.062 -0.2167 -0.5507 0.2675
+1.622 -1.07 -0.1288 -0.5507 0.219
+1.636 -1.079 -0.03755 -0.5507 0.17
+1.653 -1.091 0.05623 -0.5507 0.1205
+1.673 -1.104 0.1516 -0.5507 0.07074
+1.695 -1.118 0.2476 -0.5507 0.02079
+1.719 -1.134 0.3433 -0.5507 -0.0292
+1.745 -1.151 0.4377 -0.5507 -0.07912
+1.773 -1.169 0.5298 -0.5507 -0.1288
+1.802 -1.189 0.6189 -0.5507 -0.1782
+1.832 -1.208 0.7038 -0.5507 -0.2272
+1.863 -1.229 0.7838 -0.5507 -0.2756
+1.894 -1.25 0.8581 -0.5507 -0.3233
+1.926 -1.271 0.9258 -0.5507 -0.3702
+1.959 -1.292 0.9863 -0.5507 -0.4161
+1.991 -1.314 1.039 -0.5507 -0.4611
+2.023 -1.335 1.083 -0.5507 -0.5048
+2.055 -1.356 1.118 -0.5507 -0.5474
+2.086 -1.376 1.144 -0.5507 -0.5885
+2.117 -1.396 1.16 -0.5507 -0.6282
+2.146 -1.416 1.166 -0.5507 -0.6663
+2.175 -1.435 1.162 -0.5507 -0.7027
+2.203 -1.453 1.148 -0.5507 -0.7374
+2.23 -1.471 1.124 -0.5507 -0.7702
+2.256 -1.488 1.09 -0.5507 -0.8011
+2.28 -1.504 1.047 -0.5507 -0.8301
+2.304 -1.52 0.9944 -0.5507 -0.8569
+2.326 -1.535 0.9328 -0.5507 -0.8816
+2.348 -1.549 0.863 -0.5507 -0.9041
+2.368 -1.562 0.7855 -0.5507 -0.9243
+2.388 -1.575 0.7009 -0.5507 -0.9422
+2.406 -1.588 0.6101 -0.5507 -0.9578
+2.424 -1.599 0.5138 -0.5507 -0.971
+2.442 -1.611 0.4128 -0.5507 -0.9817
+2.458 -1.622 0.3082 -0.5507 -0.99
+2.475 -1.633 0.2008 -0.5507 -0.9958
+2.491 -1.643 0.09154 -0.5507 -0.9991
+2.507 -1.654 -0.01852 -0.5507 -1
+2.523 -1.664 -0.1284 -0.5507 -0.9983
+2.539 -1.675 -0.2371 -0.5507 -0.9941
+2.555 -1.686 -0.3437 -0.5507 -0.9875
+2.572 -1.697 -0.4472 -0.5507 -0.9784
+2.59 -1.709 -0.5467 -0.5507 -0.9668
+2.608 -1.721 -0.6413 -0.5507 -0.9528
+2.627 -1.733 -0.7301 -0.5507 -0.9365
+2.647 -1.746 -0.8124 -0.5507 -0.9178
+2.667 -1.76 -0.8874 -0.5507 -0.8968
+2.689 -1.774 -0.9545 -0.5507 -0.8735
+2.712 -1.789 -1.013 -0.5507 -0.8481
+2.736 -1.805 -1.063 -0.5507 -0.8206
+2.761 -1.822 -1.103 -0.5507 -0.791
+2.787 -1.839 -1.133 -0.5507 -0.7594
+2.814 -1.857 -1.154 -0.5507 -0.7259
+2.843 -1.875 -1.165 -0.5507 -0.6907
+2.872 -1.895 -1.165 -0.5507 -0.6536
+2.902 -1.914 -1.156 -0.5507 -0.615
+2.933 -1.935 -1.136 -0.5507 -0.5748
+2.964 -1.955 -1.107 -0.5507 -0.5332
+2.996 -1.976 -1.069 -0.5507 -0.4903
+3.028 -1.998 -1.022 -0.5507 -0.4461
+3.06 -2.019 -0.9668 -0.5507 -0.4008
+3.093 -2.04 -0.9038 -0.5507 -0.3545
+3.125 -2.061 -0.8338 -0.5507 -0.3073
+3.156 -2.082 -0.7575 -0.5507 -0.2594
+3.187 -2.102 -0.6757 -0.5507 -0.2108
+3.217 -2.122 -0.5893 -0.5507 -0.1617
+3.245 -2.141 -0.4991 -0.5507 -0.1122
+3.272 -2.159 -0.4061 -0.5507 -0.06235
+3.298 -2.176 -0.3112 -0.5507 -0.01239
+3.321 -2.191 -0.2153 -0.5507 0.0376
+3.342 -2.205 -0.1194 -0.5507 0.0875
+3.361 -2.218 -0.02447 -0.5507 0.1372
+3.378 -2.228 0.06858 -0.5507 0.1865
+3.391 -2.237 0.1588 -0.5507 0.2354
+3.401 -2.244 0.2454 -0.5507 0.2837
+3.408 -2.249 0.3274 -0.5507 0.3312
+3.412 -2.251 0.4042 -0.5507 0.378
+3.412 -2.251 0.4749 -0.5507 0.4238
+3.409 -2.249 0.5389 -0.5507 0.4685
+3.402 -2.244 0.5956 -0.5507 0.5121
+3.391 -2.237 0.6446 -0.5507 0.5544
+3.376 -2.227 0.6853 -0.5507 0.5953
+3.357 -2.215 0.7174 -0.5507 0.6347
+3.335 -2.2 0.7407 -0.5507 0.6725
+3.308 -2.182 0.755 -0.5507 0.7087
+3.278 -2.162 0.7602 -0.5507 0.743
+3.244 -2.14 0.7564 -0.5507 0.7756
+3.206 -2.115 0.7436 -0.5507 0.8061
+3.165 -2.088 0.7222 -0.5507 0.8347
+3.121 -2.059 0.6924 -0.5507 0.8612
+3.073 -2.027 0.6545 -0.5507 0.8855
+3.023 -1.994 0.6091 -0.5507 0.9076
+2.969 -1.959 0.5568 -0.5507 0.9275
+2.914 -1.922 0.498 -0.5507 0.945
+2.856 -1.884 0.4336 -0.5507 0.9602
+2.797 -1.845 0.3642 -0.5507 0.9729
+2.736 -1.805 0.2907 -0.5507 0.9833
+2.673 -1.764 0.2139 -0.5507 0.9911
+2.61 -1.722 0.1347 -0.5507 0.9965
+2.547 -1.68 0.05398 -0.5507 0.9994
+2.584 -1.525 0 -0.5083 1
+2.519 -1.487 -0.08314 -0.5083 0.9988
+2.456 -1.449 -0.1654 -0.5083 0.995
+2.392 -1.412 -0.2457 -0.5083 0.9888
+2.33 -1.375 -0.3233 -0.5083 0.9801
+2.269 -1.339 -0.3973 -0.5083 0.9689
+2.21 -1.304 -0.4668 -0.5083 0.9553
+2.153 -1.27 -0.5311 -0.5083 0.9394
+2.097 -1.238 -0.5894 -0.5083 0.9211
+2.045 -1.207 -0.6411 -0.5083 0.9004
+1.994 -1.177 -0.6854 -0.5083 0.8776
+1.947 -1.149 -0.722 -0.5083 0.8525
+1.903 -1.123 -0.7504 -0.5083 0.8253
+1.862 -1.099 -0.7701 -0.5083 0.7961
+1.825 -1.077 -0.7809 -0.5083 0.7648
+1.791 -1.057 -0.7827 -0.5083 0.7317
+1.761 -1.039 -0.7753 -0.5083 0.6967
+1.734 -1.024 -0.7587 -0.5083 0.66
+1.712 -1.01 -0.7331 -0.5083 0.6216
+1.693 -0.9993 -0.6986 -0.5083 0.5817
+1.678 -0.9905 -0.6555 -0.5083 0.5403
+1.667 -0.9839 -0.6042 -0.5083 0.4976
+1.66 -0.9796 -0.5452 -0.5083 0.4536
+1.656 -0.9774 -0.4789 -0.5083 0.4085
+1.656 -0.9774 -0.4061 -0.5083 0.3624
+1.659 -0.9794 -0.3273 -0.5083 0.3153
+1.666 -0.9834 -0.2434 -0.5083 0.2675
+1.676 -0.9892 -0.1552 -0.5083 0.219
+1.689 -0.9968 -0.06354 -0.5083 0.17
+1.705 -1.006 0.03073 -0.5083 0.1205
+1.723 -1.017 0.1267 -0.5083 0.07074
+1.744 -1.029 0.2233 -0.5083 0.02079
+1.766 -1.043 0.3196 -0.5083 -0.0292
+1.791 -1.057 0.4148 -0.5083 -0.07912
+1.818 -1.073 0.5078 -0.5083 -0.1288
+1.846 -1.089 0.5976 -0.5083 -0.1782
+1.875 -1.107 0.6834 -0.5083 -0.2272
+1.905 -1.124 0.7644 -0.5083 -0.2756
+1.936 -1.143 0.8395 -0.5083 -0.3233
+1.968 -1.161 0.9082 -0.5083 -0.3702
+2 -1.18 0.9696 -0.5083 -0.4161
+2.032 -1.199 1.023 -0.5083 -0.4611
+2.064 -1.218 1.068 -0.5083 -0.5048
+2.096 -1.237 1.104 -0.5083 -0.5474
+2.128 -1.256 1.131 -0.5083 -0.5885
+2.159 -1.274 1.148 -0.5083 -0.6282
+2.19 -1.292 1.155 -0.5083 -0.6663
+2.219 -1.31 1.152 -0.5083 -0.7027
+2.248 -1.327 1.139 -0.5083 -0.7374
+2.277 -1.344 1.116 -0.5083 -0.7702
+2.304 -1.36 1.083 -0.5083 -0.8011
+2.33 -1.375 1.04 -0.5083 -0.8301
+2.356 -1.39 0.9881 -0.5083 -0.8569
+2.38 -1.405 0.9272 -0.5083 -0.8816
+2.404 -1.419 0.8581 -0.5083 -0.9041
+2.427 -1.432 0.7812 -0.5083 -0.9243
+2.448 -1.445 0.6972 -0.5083 -0.9422
+2.47 -1.458 0.607 -0.5083 -0.9578
+2.49 -1.47 0.5112 -0.5083 -0.971
+2.51 -1.482 0.4108 -0.5083 -0.9817
+2.53 -1.493 0.3067 -0.5083 -0.99
+2.549 -1.504 0.1998 -0.5083 -0.9958
+2.568 -1.516 0.09111 -0.5083 -0.9991
+2.587 -1.527 -0.01843 -0.5083 -1
+2.606 -1.538 -0.1278 -0.5083 -0.9983
+2.625 -1.549 -0.236 -0.5083 -0.9941
+2.644 -1.56 -0.3421 -0.5083 -0.9875
+2.664 -1.572 -0.4451 -0.5083 -0.9784
+2.684 -1.584 -0.544 -0.5083 -0.9668
+2.705 -1.596 -0.638 -0.5083 -0.9528
+2.726 -1.609 -0.7262 -0.5083 -0.9365
+2.748 -1.622 -0.8078 -0.5083 -0.9178
+2.771 -1.636 -0.8822 -0.5083 -0.8968
+2.795 -1.65 -0.9486 -0.5083 -0.8735
+2.82 -1.664 -1.007 -0.5083 -0.8481
+2.846 -1.679 -1.055 -0.5083 -0.8206
+2.872 -1.695 -1.095 -0.5083 -0.791
+2.9 -1.712 -1.125 -0.5083 -0.7594
+2.928 -1.728 -1.144 -0.5083 -0.7259
+2.958 -1.746 -1.154 -0.5083 -0.6907
+2.988 -1.763 -1.154 -0.5083 -0.6536
+3.019 -1.782 -1.143 -0.5083 -0.615
+3.05 -1.8 -1.123 -0.5083 -0.5748
+3.082 -1.819 -1.093 -0.5083 -0.5332
+3.114 -1.838 -1.054 -0.5083 -0.4903
+3.146 -1.857 -1.006 -0.5083 -0.4461
+3.178 -1.876 -0.9498 -0.5083 -0.4008
+3.21 -1.895 -0.8859 -0.5083 -0.3545
+3.241 -1.913 -0.815 -0.5083 -0.3073
+3.272 -1.931 -0.7378 -0.5083 -0.2594
+3.302 -1.949 -0.6551 -0.5083 -0.2108
+3.331 -1.966 -0.5678 -0.5083 -0.1617
+3.359 -1.982 -0.4768 -0.5083 -0.1122
+3.384 -1.998 -0.383 -0.5083 -0.06235
+3.409 -2.012 -0.2873 -0.5083 -0.01239
+3.431 -2.025 -0.1908 -0.5083 0.0376
+3.451 -2.037 -0.09427 -0.5083 0.0875
+3.468 -2.047 0.001205 -0.5083 0.1372
+3.483 -2.056 0.09471 -0.5083 0.1865
+3.495 -2.063 0.1853 -0.5083 0.2354
+3.504 -2.068 0.2722 -0.5083 0.2837
+3.509 -2.071 0.3544 -0.5083 0.3312
+3.512 -2.073 0.4312 -0.5083 0.378
+3.51 -2.072 0.5019 -0.5083 0.4238
+3.505 -2.069 0.5658 -0.5083 0.4685
+3.497 -2.064 0.6223 -0.5083 0.5121
+3.484 -2.056 0.6709 -0.5083 0.5544
+3.468 -2.047 0.7112 -0.5083 0.5953
+3.448 -2.035 0.7427 -0.5083 0.6347
+3.424 -2.021 0.7653 -0.5083 0.6725
+3.397 -2.005 0.7788 -0.5083 0.7087
+3.365 -1.986 0.7831 -0.5083 0.743
+3.33 -1.965 0.7783 -0.5083 0.7756
+3.292 -1.943 0.7644 -0.5083 0.8061
+3.25 -1.918 0.7418 -0.5083 0.8347
+3.204 -1.891 0.7106 -0.5083 0.8612
+3.156 -1.863 0.6714 -0.5083 0.8855
+3.105 -1.833 0.6245 -0.5083 0.9076
+3.052 -1.801 0.5705 -0.5083 0.9275
+2.996 -1.768 0.5101 -0.5083 0.945
+2.937 -1.734 0.444 -0.5083 0.9602
+2.878 -1.698 0.3729 -0.5083 0.9729
+2.816 -1.662 0.2976 -0.5083 0.9833
+2.754 -1.625 0.2189 -0.5083 0.9911
+2.69 -1.588 0.1379 -0.5083 0.9965
+2.626 -1.55 0.05524 -0.5083 0.9994
+2.657 -1.394 0 -0.4646 1
+2.592 -1.36 -0.08498 -0.4646 0.9988
+2.529 -1.327 -0.169 -0.4646 0.995
+2.465 -1.294 -0.2512 -0.4646 0.9888
+2.403 -1.261 -0.3306 -0.4646 0.9801
+2.342 -1.229 -0.4063 -0.4646 0.9689
+2.283 -1.198 -0.4775 -0.4646 0.9553
+2.225 -1.168 -0.5435 -0.4646 0.9394
+2.17 -1.138 -0.6034 -0.4646 0.9211
+2.117 -1.111 -0.6565 -0.4646 0.9004
+2.066 -1.084 -0.7023 -0.4646 0.8776
+2.018 -1.059 -0.7403 -0.4646 0.8525
+1.974 -1.035 -0.7699 -0.4646 0.8253
+1.932 -1.014 -0.7908 -0.4646 0.7961
+1.894 -0.9937 -0.8027 -0.4646 0.7648
+1.859 -0.9754 -0.8054 -0.4646 0.7317
+1.828 -0.9591 -0.7989 -0.4646 0.6967
+1.801 -0.9447 -0.7831 -0.4646 0.66
+1.777 -0.9322 -0.7582 -0.4646 0.6216
+1.757 -0.9217 -0.7242 -0.4646 0.5817
+1.74 -0.9131 -0.6816 -0.4646 0.5403
+1.728 -0.9066 -0.6306 -0.4646 0.4976
+1.719 -0.9019 -0.5718 -0.4646 0.4536
+1.714 -0.8992 -0.5057 -0.4646 0.4085
+1.712 -0.8983 -0.4329 -0.4646 0.3624
+1.714 -0.8992 -0.354 -0.4646 0.3153
+1.719 -0.9018 -0.27 -0.4646 0.2675
+1.727 -0.9061 -0.1815 -0.4646 0.219
+1.738 -0.912 -0.08949 -0.4646 0.17
+1.752 -0.9194 0.005205 -0.4646 0.1205
+1.769 -0.9281 0.1016 -0.4646 0.07074
+1.788 -0.9382 0.1988 -0.4646 0.02079
+1.809 -0.9494 0.2958 -0.4646 -0.0292
+1.833 -0.9616 0.3917 -0.4646 -0.07912
+1.858 -0.9749 0.4854 -0.4646 -0.1288
+1.885 -0.9889 0.576 -0.4646 -0.1782
+1.913 -1.004 0.6627 -0.4646 -0.2272
+1.942 -1.019 0.7444 -0.4646 -0.2756
+1.973 -1.035 0.8205 -0.4646 -0.3233
+2.004 -1.051 0.89 -0.4646 -0.3702
+2.035 -1.068 0.9524 -0.4646 -0.4161
+2.067 -1.084 1.007 -0.4646 -0.4611
+2.099 -1.101 1.053 -0.4646 -0.5048
+2.131 -1.118 1.09 -0.4646 -0.5474
+2.163 -1.135 1.117 -0.4646 -0.5885
+2.195 -1.151 1.135 -0.4646 -0.6282
+2.226 -1.168 1.143 -0.4646 -0.6663
+2.257 -1.184 1.141 -0.4646 -0.7027
+2.287 -1.2 1.129 -0.4646 -0.7374
+2.316 -1.215 1.107 -0.4646 -0.7702
+2.345 -1.23 1.074 -0.4646 -0.8011
+2.373 -1.245 1.032 -0.4646 -0.8301
+2.4 -1.259 0.9811 -0.4646 -0.8569
+2.427 -1.273 0.921 -0.4646 -0.8816
+2.453 -1.287 0.8526 -0.4646 -0.9041
+2.478 -1.3 0.7764 -0.4646 -0.9243
+2.502 -1.313 0.6931 -0.4646 -0.9422
+2.526 -1.325 0.6035 -0.4646 -0.9578
+2.549 -1.338 0.5083 -0.4646 -0.971
+2.572 -1.349 0.4086 -0.4646 -0.9817
+2.594 -1.361 0.3051 -0.4646 -0.99
+2.617 -1.373 0.1988 -0.4646 -0.9958
+2.638 -1.384 0.09062 -0.4646 -0.9991
+2.66 -1.396 -0.01834 -0.4646 -1
+2.682 -1.407 -0.1271 -0.4646 -0.9983
+2.704 -1.419 -0.2348 -0.4646 -0.9941
+2.726 -1.43 -0.3402 -0.4646 -0.9875
+2.749 -1.442 -0.4426 -0.4646 -0.9784
+2.772 -1.454 -0.5409 -0.4646 -0.9668
+2.795 -1.466 -0.6343 -0.4646 -0.9528
+2.819 -1.479 -0.7218 -0.4646 -0.9365
+2.844 -1.492 -0.8028 -0.4646 -0.9178
+2.869 -1.505 -0.8765 -0.4646 -0.8968
+2.895 -1.519 -0.9422 -0.4646 -0.8735
+2.922 -1.533 -0.9994 -0.4646 -0.8481
+2.949 -1.547 -1.048 -0.4646 -0.8206
+2.978 -1.562 -1.086 -0.4646 -0.791
+3.007 -1.577 -1.115 -0.4646 -0.7594
+3.036 -1.593 -1.134 -0.4646 -0.7259
+3.067 -1.609 -1.143 -0.4646 -0.6907
+3.098 -1.625 -1.142 -0.4646 -0.6536
+3.129 -1.642 -1.13 -0.4646 -0.615
+3.161 -1.658 -1.109 -0.4646 -0.5748
+3.193 -1.675 -1.078 -0.4646 -0.5332
+3.225 -1.692 -1.038 -0.4646 -0.4903
+3.257 -1.709 -0.9894 -0.4646 -0.4461
+3.289 -1.725 -0.9323 -0.4646 -0.4008
+3.32 -1.742 -0.8674 -0.4646 -0.3545
+3.351 -1.758 -0.7956 -0.4646 -0.3073
+3.381 -1.774 -0.7175 -0.4646 -0.2594
+3.41 -1.789 -0.634 -0.4646 -0.2108
+3.437 -1.804 -0.5459 -0.4646 -0.1617
+3.464 -1.817 -0.4542 -0.4646 -0.1122
+3.488 -1.83 -0.3596 -0.4646 -0.06235
+3.511 -1.842 -0.2633 -0.4646 -0.01239
+3.532 -1.853 -0.1661 -0.4646 0.0376
+3.55 -1.863 -0.06907 -0.4646 0.0875
+3.566 -1.871 0.02688 -0.4646 0.1372
+3.579 -1.878 0.1208 -0.4646 0.1865
+3.589 -1.883 0.2117 -0.4646 0.2354
+3.596 -1.887 0.2988 -0.4646 0.2837
+3.6 -1.889 0.3812 -0.4646 0.3312
+3.601 -1.889 0.458 -0.4646 0.378
+3.598 -1.888 0.5287 -0.4646 0.4238
+3.592 -1.884 0.5924 -0.4646 0.4685
+3.581 -1.879 0.6486 -0.4646 0.5121
+3.568 -1.872 0.6969 -0.4646 0.5544
+3.55 -1.863 0.7366 -0.4646 0.5953
+3.529 -1.851 0.7676 -0.4646 0.6347
+3.504 -1.838 0.7895 -0.4646 0.6725
+3.475 -1.823 0.8021 -0.4646 0.7087
+3.443 -1.806 0.8056 -0.4646 0.743
+3.407 -1.787 0.7997 -0.4646 0.7756
+3.367 -1.767 0.7847 -0.4646 0.8061
+3.325 -1.744 0.7609 -0.4646 0.8347
+3.279 -1.72 0.7284 -0.4646 0.8612
+3.23 -1.695 0.6878 -0.4646 0.8855
+3.179 -1.668 0.6394 -0.4646 0.9076
+3.125 -1.64 0.5839 -0.4646 0.9275
+3.069 -1.61 0.5219 -0.4646 0.945
+3.01 -1.579 0.4541 -0.4646 0.9602
+2.951 -1.548 0.3813 -0.4646 0.9729
+2.889 -1.516 0.3042 -0.4646 0.9833
+2.827 -1.483 0.2238 -0.4646 0.9911
+2.763 -1.45 0.1409 -0.4646 0.9965
+2.699 -1.416 0.05646 -0.4646 0.9994
+2.723 -1.259 0 -0.4198 1
+2.659 -1.23 -0.08676 -0.4198 0.9988
+2.596 -1.2 -0.1726 -0.4198 0.995
+2.533 -1.171 -0.2565 -0.4198 0.9888
+2.471 -1.143 -0.3376 -0.4198 0.9801
+2.41 -1.115 -0.4151 -0.4198 0.9689
+2.351 -1.087 -0.4879 -0.4198 0.9553
+2.293 -1.061 -0.5555 -0.4198 0.9394
+2.238 -1.035 -0.6169 -0.4198 0.9211
+2.185 -1.01 -0.6715 -0.4198 0.9004
+2.134 -0.9868 -0.7188 -0.4198 0.8776
+2.086 -0.9646 -0.7581 -0.4198 0.8525
+2.041 -0.9437 -0.7889 -0.4198 0.8253
+1.999 -0.9243 -0.811 -0.4198 0.7961
+1.96 -0.9063 -0.824 -0.4198 0.7648
+1.924 -0.8899 -0.8277 -0.4198 0.7317
+1.892 -0.875 -0.8221 -0.4198 0.6967
+1.864 -0.8618 -0.807 -0.4198 0.66
+1.839 -0.8503 -0.7828 -0.4198 0.6216
+1.817 -0.8405 -0.7494 -0.4198 0.5817
+1.8 -0.8323 -0.7072 -0.4198 0.5403
+1.786 -0.8258 -0.6566 -0.4198 0.4976
+1.775 -0.821 -0.5981 -0.4198 0.4536
+1.768 -0.8178 -0.5321 -0.4198 0.4085
+1.765 -0.8163 -0.4594 -0.4198 0.3624
+1.765 -0.8163 -0.3805 -0.4198 0.3153
+1.768 -0.8178 -0.2964 -0.4198 0.2675
+1.775 -0.8207 -0.2077 -0.4198 0.219
+1.784 -0.8251 -0.1154 -0.4198 0.17
+1.796 -0.8307 -0.02032 -0.4198 0.1205
+1.811 -0.8376 0.07654 -0.4198 0.07074
+1.829 -0.8457 0.1742 -0.4198 0.02079
+1.848 -0.8548 0.2718 -0.4198 -0.0292
+1.87 -0.8649 0.3683 -0.4198 -0.07912
+1.894 -0.8758 0.4627 -0.4198 -0.1288
+1.919 -0.8875 0.554 -0.4198 -0.1782
+1.946 -0.9 0.6415 -0.4198 -0.2272
+1.974 -0.913 0.724 -0.4198 -0.2756
+2.003 -0.9265 0.8009 -0.4198 -0.3233
+2.034 -0.9405 0.8713 -0.4198 -0.3702
+2.064 -0.9548 0.9345 -0.4198 -0.4161
+2.096 -0.9693 0.9899 -0.4198 -0.4611
+2.128 -0.984 1.037 -0.4198 -0.5048
+2.16 -0.9988 1.075 -0.4198 -0.5474
+2.192 -1.014 1.103 -0.4198 -0.5885
+2.224 -1.028 1.122 -0.4198 -0.6282
+2.256 -1.043 1.131 -0.4198 -0.6663
+2.287 -1.058 1.129 -0.4198 -0.7027
+2.318 -1.072 1.118 -0.4198 -0.7374
+2.349 -1.086 1.097 -0.4198 -0.7702
+2.379 -1.1 1.065 -0.4198 -0.8011
+2.409 -1.114 1.024 -0.4198 -0.8301
+2.438 -1.128 0.9736 -0.4198 -0.8569
+2.467 -1.141 0.9143 -0.4198 -0.8816
+2.495 -1.154 0.8466 -0.4198 -0.9041
+2.522 -1.166 0.7711 -0.4198 -0.9243
+2.549 -1.179 0.6885 -0.4198 -0.9422
+2.575 -1.191 0.5996 -0.4198 -0.9578
+2.601 -1.203 0.5052 -0.4198 -0.971
+2.627 -1.215 0.4061 -0.4198 -0.9817
+2.652 -1.227 0.3032 -0.4198 -0.99
+2.677 -1.238 0.1976 -0.4198 -0.9958
+2.702 -1.25 0.09008 -0.4198 -0.9991
+2.727 -1.261 -0.01823 -0.4198 -1
+2.752 -1.273 -0.1264 -0.4198 -0.9983
+2.777 -1.284 -0.2333 -0.4198 -0.9941
+2.802 -1.296 -0.3382 -0.4198 -0.9875
+2.827 -1.308 -0.4399 -0.4198 -0.9784
+2.853 -1.319 -0.5375 -0.4198 -0.9668
+2.879 -1.332 -0.6302 -0.4198 -0.9528
+2.906 -1.344 -0.717 -0.4198 -0.9365
+2.933 -1.356 -0.7973 -0.4198 -0.9178
+2.96 -1.369 -0.8702 -0.4198 -0.8968
+2.989 -1.382 -0.9352 -0.4198 -0.8735
+3.017 -1.395 -0.9916 -0.4198 -0.8481
+3.047 -1.409 -1.039 -0.4198 -0.8206
+3.076 -1.423 -1.077 -0.4198 -0.791
+3.107 -1.437 -1.105 -0.4198 -0.7594
+3.138 -1.451 -1.123 -0.4198 -0.7259
+3.169 -1.466 -1.131 -0.4198 -0.6907
+3.201 -1.48 -1.129 -0.4198 -0.6536
+3.233 -1.495 -1.117 -0.4198 -0.615
+3.265 -1.51 -1.095 -0.4198 -0.5748
+3.297 -1.525 -1.063 -0.4198 -0.5332
+3.329 -1.54 -1.022 -0.4198 -0.4903
+3.36 -1.554 -0.9722 -0.4198 -0.4461
+3.392 -1.569 -0.9141 -0.4198 -0.4008
+3.422 -1.583 -0.8484 -0.4198 -0.3545
+3.452 -1.597 -0.7758 -0.4198 -0.3073
+3.481 -1.61 -0.6969 -0.4198 -0.2594
+3.509 -1.623 -0.6126 -0.4198 -0.2108
+3.535 -1.635 -0.5237 -0.4198 -0.1617
+3.56 -1.647 -0.4312 -0.4198 -0.1122
+3.583 -1.657 -0.336 -0.4198 -0.06235
+3.604 -1.667 -0.2391 -0.4198 -0.01239
+3.623 -1.676 -0.1414 -0.4198 0.0376
+3.64 -1.683 -0.04383 -0.4198 0.0875
+3.654 -1.69 0.05254 -0.4198 0.1372
+3.665 -1.695 0.1468 -0.4198 0.1865
+3.674 -1.699 0.238 -0.4198 0.2354
+3.679 -1.701 0.3252 -0.4198 0.2837
+3.681 -1.702 0.4077 -0.4198 0.3312
+3.68 -1.702 0.4846 -0.4198 0.378
+3.676 -1.7 0.5551 -0.4198 0.4238
+3.667 -1.696 0.6186 -0.4198 0.4685
+3.656 -1.691 0.6746 -0.4198 0.5121
+3.641 -1.684 0.7224 -0.4198 0.5544
+3.622 -1.675 0.7616 -0.4198 0.5953
+3.599 -1.665 0.7919 -0.4198 0.6347
+3.573 -1.652 0.8131 -0.4198 0.6725
+3.543 -1.639 0.825 -0.4198 0.7087
+3.51 -1.623 0.8275 -0.4198 0.743
+3.473 -1.606 0.8206 -0.4198 0.7756
+3.433 -1.588 0.8046 -0.4198 0.8061
+3.39 -1.568 0.7795 -0.4198 0.8347
+3.344 -1.547 0.7458 -0.4198 0.8612
+3.295 -1.524 0.7038 -0.4198 0.8855
+3.244 -1.5 0.654 -0.4198 0.9076
+3.19 -1.475 0.597 -0.4198 0.9275
+3.133 -1.449 0.5334 -0.4198 0.945
+3.075 -1.422 0.464 -0.4198 0.9602
+3.015 -1.395 0.3895 -0.4198 0.9729
+2.954 -1.366 0.3107 -0.4198 0.9833
+2.892 -1.337 0.2285 -0.4198 0.9911
+2.829 -1.308 0.1439 -0.4198 0.9965
+2.765 -1.279 0.05764 -0.4198 0.9994
+2.782 -1.122 0 -0.3739 1
+2.719 -1.096 -0.08849 -0.3739 0.9988
+2.656 -1.071 -0.176 -0.3739 0.995
+2.594 -1.046 -0.2617 -0.3739 0.9888
+2.533 -1.021 -0.3445 -0.3739 0.9801
+2.472 -0.9967 -0.4235 -0.3739 0.9689
+2.414 -0.973 -0.498 -0.3739 0.9553
+2.356 -0.9499 -0.5671 -0.3739 0.9394
+2.301 -0.9276 -0.6301 -0.3739 0.9211
+2.248 -0.9062 -0.6862 -0.3739 0.9004
+2.197 -0.8858 -0.7348 -0.3739 0.8776
+2.149 -0.8663 -0.7754 -0.3739 0.8525
+2.104 -0.848 -0.8075 -0.3739 0.8253
+2.061 -0.8309 -0.8307 -0.3739 0.7961
+2.022 -0.815 -0.8447 -0.3739 0.7648
+1.986 -0.8004 -0.8494 -0.3739 0.7317
+1.953 -0.7872 -0.8447 -0.3739 0.6967
+1.923 -0.7753 -0.8305 -0.3739 0.66
+1.897 -0.7648 -0.8069 -0.3739 0.6216
+1.875 -0.7557 -0.7741 -0.3739 0.5817
+1.856 -0.748 -0.7324 -0.3739 0.5403
+1.84 -0.7418 -0.6822 -0.3739 0.4976
+1.828 -0.737 -0.624 -0.3739 0.4536
+1.82 -0.7335 -0.5582 -0.3739 0.4085
+1.815 -0.7314 -0.4856 -0.3739 0.3624
+1.813 -0.7307 -0.4068 -0.3739 0.3153
+1.814 -0.7313 -0.3226 -0.3739 0.2675
+1.819 -0.7331 -0.2338 -0.3739 0.219
+1.826 -0.7361 -0.1412 -0.3739 0.17
+1.836 -0.7402 -0.04584 -0.3739 0.1205
+1.849 -0.7455 0.05141 -0.3739 0.07074
+1.865 -0.7517 0.1496 -0.3739 0.02079
+1.883 -0.7589 0.2476 -0.3739 -0.0292
+1.903 -0.767 0.3447 -0.3739 -0.07912
+1.925 -0.7758 0.4397 -0.3739 -0.1288
+1.948 -0.7854 0.5317 -0.3739 -0.1782
+1.974 -0.7957 0.6199 -0.3739 -0.2272
+2.001 -0.8065 0.7032 -0.3739 -0.2756
+2.029 -0.8179 0.7809 -0.3739 -0.3233
+2.058 -0.8296 0.8521 -0.3739 -0.3702
+2.088 -0.8418 0.9161 -0.3739 -0.4161
+2.119 -0.8542 0.9723 -0.3739 -0.4611
+2.15 -0.8669 1.02 -0.3739 -0.5048
+2.182 -0.8797 1.059 -0.3739 -0.5474
+2.214 -0.8926 1.088 -0.3739 -0.5885
+2.247 -0.9056 1.108 -0.3739 -0.6282
+2.279 -0.9187 1.118 -0.3739 -0.6663
+2.311 -0.9317 1.117 -0.3739 -0.7027
+2.343 -0.9446 1.107 -0.3739 -0.7374
+2.375 -0.9575 1.086 -0.3739 -0.7702
+2.407 -0.9702 1.055 -0.3739 -0.8011
+2.438 -0.9829 1.015 -0.3739 -0.8301
+2.469 -0.9953 0.9655 -0.3739 -0.8569
+2.5 -1.008 0.9069 -0.3739 -0.8816
+2.53 -1.02 0.84 -0.3739 -0.9041
+2.56 -1.032 0.7653 -0.3739 -0.9243
+2.589 -1.044 0.6835 -0.3739 -0.9422
+2.618 -1.055 0.5954 -0.3739 -0.9578
+2.647 -1.067 0.5017 -0.3739 -0.971
+2.675 -1.078 0.4033 -0.3739 -0.9817
+2.703 -1.09 0.3012 -0.3739 -0.99
+2.731 -1.101 0.1962 -0.3739 -0.9958
+2.759 -1.112 0.08949 -0.3739 -0.9991
+2.787 -1.124 -0.01811 -0.3739 -1
+2.815 -1.135 -0.1255 -0.3739 -0.9983
+2.843 -1.146 -0.2318 -0.3739 -0.9941
+2.871 -1.157 -0.3359 -0.3739 -0.9875
+2.899 -1.169 -0.4368 -0.3739 -0.9784
+2.928 -1.18 -0.5337 -0.3739 -0.9668
+2.957 -1.192 -0.6257 -0.3739 -0.9528
+2.986 -1.204 -0.7118 -0.3739 -0.9365
+3.015 -1.215 -0.7913 -0.3739 -0.9178
+3.045 -1.228 -0.8634 -0.3739 -0.8968
+3.075 -1.24 -0.9276 -0.3739 -0.8735
+3.106 -1.252 -0.9832 -0.3739 -0.8481
+3.137 -1.265 -1.03 -0.3739 -0.8206
+3.169 -1.277 -1.067 -0.3739 -0.791
+3.2 -1.29 -1.094 -0.3739 -0.7594
+3.232 -1.303 -1.111 -0.3739 -0.7259
+3.264 -1.316 -1.118 -0.3739 -0.6907
+3.297 -1.329 -1.115 -0.3739 -0.6536
+3.329 -1.342 -1.102 -0.3739 -0.615
+3.361 -1.355 -1.079 -0.3739 -0.5748
+3.393 -1.368 -1.047 -0.3739 -0.5332
+3.425 -1.381 -1.005 -0.3739 -0.4903
+3.456 -1.393 -0.9543 -0.3739 -0.4461
+3.487 -1.406 -0.8954 -0.3739 -0.4008
+3.517 -1.418 -0.8289 -0.3739 -0.3545
+3.546 -1.429 -0.7554 -0.3739 -0.3073
+3.573 -1.44 -0.6758 -0.3739 -0.2594
+3.6 -1.451 -0.5907 -0.3739 -0.2108
+3.625 -1.461 -0.5012 -0.3739 -0.1617
+3.648 -1.47 -0.408 -0.3739 -0.1122
+3.669 -1.479 -0.3122 -0.3739 -0.06235
+3.688 -1.487 -0.2147 -0.3739 -0.01239
+3.706 -1.494 -0.1165 -0.3739 0.0376
+3.72 -1.5 -0.01856 -0.3739 0.0875
+3.732 -1.505 0.07817 -0.3739 0.1372
+3.742 -1.508 0.1727 -0.3739 0.1865
+3.748 -1.511 0.2641 -0.3739 0.2354
+3.752 -1.512 0.3515 -0.3739 0.2837
+3.752 -1.512 0.434 -0.3739 0.3312
+3.749 -1.511 0.5108 -0.3739 0.378
+3.743 -1.509 0.5812 -0.3739 0.4238
+3.733 -1.505 0.6444 -0.3739 0.4685
+3.72 -1.5 0.7 -0.3739 0.5121
+3.703 -1.493 0.7474 -0.3739 0.5544
+3.683 -1.485 0.7861 -0.3739 0.5953
+3.659 -1.475 0.8158 -0.3739 0.6347
+3.632 -1.464 0.8363 -0.3739 0.6725
+3.601 -1.452 0.8473 -0.3739 0.7087
+3.567 -1.438 0.8489 -0.3739 0.743
+3.53 -1.423 0.8411 -0.3739 0.7756
+3.49 -1.407 0.8239 -0.3739 0.8061
+3.446 -1.389 0.7976 -0.3739 0.8347
+3.4 -1.371 0.7626 -0.3739 0.8612
+3.351 -1.351 0.7193 -0.3739 0.8855
+3.299 -1.33 0.6681 -0.3739 0.9076
+3.245 -1.308 0.6096 -0.3739 0.9275
+3.189 -1.286 0.5445 -0.3739 0.945
+3.132 -1.262 0.4735 -0.3739 0.9602
+3.072 -1.238 0.3974 -0.3739 0.9729
+3.012 -1.214 0.317 -0.3739 0.9833
+2.95 -1.189 0.2331 -0.3739 0.9911
+2.887 -1.164 0.1468 -0.3739 0.9965
+2.824 -1.139 0.05879 -0.3739 0.9994
+2.835 -0.9812 0 -0.3271 1
+2.773 -0.9596 -0.09016 -0.3271 0.9988
+2.711 -0.9382 -0.1794 -0.3271 0.995
+2.649 -0.9169 -0.2666 -0.3271 0.9888
+2.589 -0.896 -0.3511 -0.3271 0.9801
+2.529 -0.8754 -0.4318 -0.3271 0.9689
+2.471 -0.8552 -0.5078 -0.3271 0.9553
+2.415 -0.8356 -0.5784 -0.3271 0.9394
+2.36 -0.8167 -0.6429 -0.3271 0.9211
+2.307 -0.7984 -0.7004 -0.3271 0.9004
+2.256 -0.7809 -0.7503 -0.3271 0.8776
+2.208 -0.7643 -0.7922 -0.3271 0.8525
+2.163 -0.7485 -0.8255 -0.3271 0.8253
+2.12 -0.7337 -0.8499 -0.3271 0.7961
+2.08 -0.7199 -0.865 -0.3271 0.7648
+2.043 -0.7072 -0.8707 -0.3271 0.7317
+2.01 -0.6956 -0.8668 -0.3271 0.6967
+1.979 -0.6851 -0.8534 -0.3271 0.66
+1.952 -0.6757 -0.8305 -0.3271 0.6216
+1.929 -0.6675 -0.7983 -0.3271 0.5817
+1.908 -0.6605 -0.7572 -0.3271 0.5403
+1.891 -0.6546 -0.7074 -0.3271 0.4976
+1.878 -0.6499 -0.6495 -0.3271 0.4536
+1.868 -0.6463 -0.584 -0.3271 0.4085
+1.861 -0.6439 -0.5116 -0.3271 0.3624
+1.857 -0.6426 -0.4328 -0.3271 0.3153
+1.856 -0.6424 -0.3486 -0.3271 0.2675
+1.859 -0.6433 -0.2597 -0.3271 0.219
+1.864 -0.6452 -0.1669 -0.3271 0.17
+1.872 -0.648 -0.07132 -0.3271 0.1205
+1.883 -0.6518 0.02624 -0.3271 0.07074
+1.897 -0.6565 0.1248 -0.3271 0.02079
+1.913 -0.6619 0.2233 -0.3271 -0.0292
+1.931 -0.6682 0.3209 -0.3271 -0.07912
+1.951 -0.6752 0.4164 -0.3271 -0.1288
+1.973 -0.6828 0.5091 -0.3271 -0.1782
+1.997 -0.6911 0.5979 -0.3271 -0.2272
+2.022 -0.6999 0.6819 -0.3271 -0.2756
+2.049 -0.7091 0.7603 -0.3271 -0.3233
+2.077 -0.7188 0.8323 -0.3271 -0.3702
+2.106 -0.7289 0.8971 -0.3271 -0.4161
+2.136 -0.7393 0.9541 -0.3271 -0.4611
+2.167 -0.75 1.003 -0.3271 -0.5048
+2.199 -0.7609 1.042 -0.3271 -0.5474
+2.231 -0.772 1.072 -0.3271 -0.5885
+2.263 -0.7832 1.093 -0.3271 -0.6282
+2.296 -0.7945 1.104 -0.3271 -0.6663
+2.329 -0.8059 1.104 -0.3271 -0.7027
+2.362 -0.8173 1.094 -0.3271 -0.7374
+2.395 -0.8287 1.075 -0.3271 -0.7702
+2.428 -0.8401 1.045 -0.3271 -0.8011
+2.46 -0.8515 1.005 -0.3271 -0.8301
+2.493 -0.8628 0.9567 -0.3271 -0.8569
+2.526 -0.8741 0.899 -0.3271 -0.8816
+2.558 -0.8852 0.8329 -0.3271 -0.9041
+2.59 -0.8963 0.7591 -0.3271 -0.9243
+2.622 -0.9074 0.6781 -0.3271 -0.9422
+2.653 -0.9183 0.5907 -0.3271 -0.9578
+2.685 -0.9292 0.4978 -0.3271 -0.971
+2.716 -0.94 0.4003 -0.3271 -0.9817
+2.747 -0.9508 0.2989 -0.3271 -0.99
+2.778 -0.9615 0.1948 -0.3271 -0.9958
+2.809 -0.9723 0.08883 -0.3271 -0.9991
+2.84 -0.983 -0.01798 -0.3271 -1
+2.871 -0.9937 -0.1246 -0.3271 -0.9983
+2.902 -1.004 -0.2301 -0.3271 -0.9941
+2.933 -1.015 -0.3334 -0.3271 -0.9875
+2.964 -1.026 -0.4336 -0.3271 -0.9784
+2.996 -1.037 -0.5296 -0.3271 -0.9668
+3.027 -1.048 -0.6208 -0.3271 -0.9528
+3.059 -1.059 -0.7061 -0.3271 -0.9365
+3.091 -1.07 -0.7847 -0.3271 -0.9178
+3.123 -1.081 -0.8561 -0.3271 -0.8968
+3.155 -1.092 -0.9194 -0.3271 -0.8735
+3.188 -1.103 -0.9741 -0.3271 -0.8481
+3.221 -1.115 -1.02 -0.3271 -0.8206
+3.254 -1.126 -1.056 -0.3271 -0.791
+3.286 -1.137 -1.082 -0.3271 -0.7594
+3.319 -1.149 -1.099 -0.3271 -0.7259
+3.352 -1.16 -1.105 -0.3271 -0.6907
+3.385 -1.172 -1.101 -0.3271 -0.6536
+3.418 -1.183 -1.087 -0.3271 -0.615
+3.45 -1.194 -1.063 -0.3271 -0.5748
+3.482 -1.205 -1.03 -0.3271 -0.5332
+3.513 -1.216 -0.9873 -0.3271 -0.4903
+3.544 -1.227 -0.9358 -0.3271 -0.4461
+3.574 -1.237 -0.8762 -0.3271 -0.4008
+3.603 -1.247 -0.8088 -0.3271 -0.3545
+3.63 -1.256 -0.7346 -0.3271 -0.3073
+3.657 -1.265 -0.6542 -0.3271 -0.2594
+3.681 -1.274 -0.5685 -0.3271 -0.2108
+3.705 -1.282 -0.4783 -0.3271 -0.1617
+3.726 -1.29 -0.3846 -0.3271 -0.1122
+3.746 -1.296 -0.2882 -0.3271 -0.06235
+3.763 -1.302 -0.1902 -0.3271 -0.01239
+3.778 -1.308 -0.0916 -0.3271 0.0376
+3.791 -1.312 0.006726 -0.3271 0.0875
+3.801 -1.315 0.1037 -0.3271 0.1372
+3.808 -1.318 0.1985 -0.3271 0.1865
+3.812 -1.319 0.29 -0.3271 0.2354
+3.814 -1.32 0.3775 -0.3271 0.2837
+3.812 -1.319 0.46 -0.3271 0.3312
+3.807 -1.318 0.5367 -0.3271 0.378
+3.799 -1.315 0.6069 -0.3271 0.4238
+3.788 -1.311 0.6699 -0.3271 0.4685
+3.773 -1.306 0.7251 -0.3271 0.5121
+3.755 -1.3 0.772 -0.3271 0.5544
+3.734 -1.292 0.8101 -0.3271 0.5953
+3.709 -1.284 0.8392 -0.3271 0.6347
+3.681 -1.274 0.8589 -0.3271 0.6725
+3.649 -1.263 0.8692 -0.3271 0.7087
+3.615 -1.251 0.8698 -0.3271 0.743
+3.577 -1.238 0.8609 -0.3271 0.7756
+3.536 -1.224 0.8427 -0.3271 0.8061
+3.492 -1.209 0.8153 -0.3271 0.8347
+3.446 -1.193 0.779 -0.3271 0.8612
+3.397 -1.176 0.7344 -0.3271 0.8855
+3.346 -1.158 0.6818 -0.3271 0.9076
+3.292 -1.139 0.6219 -0.3271 0.9275
+3.237 -1.12 0.5553 -0.3271 0.945
+3.179 -1.1 0.4828 -0.3271 0.9602
+3.121 -1.08 0.4051 -0.3271 0.9729
+3.061 -1.059 0.3231 -0.3271 0.9833
+3 -1.038 0.2376 -0.3271 0.9911
+2.938 -1.017 0.1495 -0.3271 0.9965
+2.876 -0.9955 0.0599 -0.3271 0.9994
+2.881 -0.8382 0 -0.2794 1
+2.819 -0.8205 -0.09178 -0.2794 0.9988
+2.759 -0.8028 -0.1826 -0.2794 0.995
+2.698 -0.7853 -0.2715 -0.2794 0.9888
+2.639 -0.7679 -0.3575 -0.2794 0.9801
+2.58 -0.7509 -0.4397 -0.2794 0.9689
+2.523 -0.7342 -0.5173 -0.2794 0.9553
+2.467 -0.718 -0.5894 -0.2794 0.9394
+2.413 -0.7022 -0.6552 -0.2794 0.9211
+2.361 -0.687 -0.7141 -0.2794 0.9004
+2.311 -0.6724 -0.7654 -0.2794 0.8776
+2.263 -0.6585 -0.8085 -0.2794 0.8525
+2.217 -0.6453 -0.843 -0.2794 0.8253
+2.175 -0.6328 -0.8685 -0.2794 0.7961
+2.135 -0.6212 -0.8847 -0.2794 0.7648
+2.097 -0.6104 -0.8913 -0.2794 0.7317
+2.063 -0.6004 -0.8883 -0.2794 0.6967
+2.032 -0.5913 -0.8757 -0.2794 0.66
+2.004 -0.5832 -0.8536 -0.2794 0.6216
+1.979 -0.5759 -0.822 -0.2794 0.5817
+1.957 -0.5696 -0.7814 -0.2794 0.5403
+1.939 -0.5643 -0.7322 -0.2794 0.4976
+1.924 -0.5598 -0.6746 -0.2794 0.4536
+1.912 -0.5564 -0.6094 -0.2794 0.4085
+1.903 -0.5538 -0.5372 -0.2794 0.3624
+1.897 -0.5521 -0.4586 -0.2794 0.3153
+1.895 -0.5514 -0.3744 -0.2794 0.2675
+1.895 -0.5515 -0.2854 -0.2794 0.219
+1.898 -0.5524 -0.1926 -0.2794 0.17
+1.904 -0.5542 -0.09676 -0.2794 0.1205
+1.913 -0.5568 0.001059 -0.2794 0.07074
+1.925 -0.56 0.09992 -0.2794 0.02079
+1.938 -0.564 0.1988 -0.2794 -0.0292
+1.954 -0.5687 0.2968 -0.2794 -0.07912
+1.972 -0.574 0.3929 -0.2794 -0.1288
+1.993 -0.5799 0.4861 -0.2794 -0.1782
+2.015 -0.5863 0.5755 -0.2794 -0.2272
+2.039 -0.5932 0.6602 -0.2794 -0.2756
+2.064 -0.6006 0.7393 -0.2794 -0.3233
+2.091 -0.6084 0.812 -0.2794 -0.3702
+2.119 -0.6166 0.8775 -0.2794 -0.4161
+2.148 -0.6251 0.9353 -0.2794 -0.4611
+2.178 -0.6338 0.9847 -0.2794 -0.5048
+2.209 -0.6429 1.025 -0.2794 -0.5474
+2.241 -0.6521 1.056 -0.2794 -0.5885
+2.273 -0.6616 1.078 -0.2794 -0.6282
+2.306 -0.6712 1.089 -0.2794 -0.6663
+2.34 -0.6809 1.09 -0.2794 -0.7027
+2.373 -0.6907 1.082 -0.2794 -0.7374
+2.407 -0.7006 1.063 -0.2794 -0.7702
+2.442 -0.7105 1.034 -0.2794 -0.8011
+2.476 -0.7205 0.9952 -0.2794 -0.8301
+2.51 -0.7305 0.9474 -0.2794 -0.8569
+2.545 -0.7405 0.8906 -0.2794 -0.8816
+2.579 -0.7505 0.8253 -0.2794 -0.9041
+2.613 -0.7605 0.7523 -0.2794 -0.9243
+2.648 -0.7705 0.6722 -0.2794 -0.9422
+2.682 -0.7804 0.5857 -0.2794 -0.9578
+2.716 -0.7904 0.4937 -0.2794 -0.971
+2.75 -0.8003 0.397 -0.2794 -0.9817
+2.784 -0.8102 0.2965 -0.2794 -0.99
+2.818 -0.8201 0.1932 -0.2794 -0.9958
+2.852 -0.83 0.08813 -0.2794 -0.9991
+2.886 -0.8399 -0.01783 -0.2794 -1
+2.92 -0.8498 -0.1236 -0.2794 -0.9983
+2.954 -0.8597 -0.2282 -0.2794 -0.9941
+2.988 -0.8696 -0.3307 -0.2794 -0.9875
+3.022 -0.8795 -0.43 -0.2794 -0.9784
+3.056 -0.8895 -0.5252 -0.2794 -0.9668
+3.091 -0.8994 -0.6155 -0.2794 -0.9528
+3.125 -0.9094 -0.6999 -0.2794 -0.9365
+3.159 -0.9194 -0.7777 -0.2794 -0.9178
+3.194 -0.9294 -0.8482 -0.2794 -0.8968
+3.228 -0.9394 -0.9106 -0.2794 -0.8735
+3.262 -0.9494 -0.9645 -0.2794 -0.8481
+3.297 -0.9594 -1.009 -0.2794 -0.8206
+3.331 -0.9693 -1.045 -0.2794 -0.791
+3.365 -0.9793 -1.07 -0.2794 -0.7594
+3.399 -0.9891 -1.086 -0.2794 -0.7259
+3.433 -0.9989 -1.091 -0.2794 -0.6907
+3.466 -1.009 -1.086 -0.2794 -0.6536
+3.499 -1.018 -1.071 -0.2794 -0.615
+3.531 -1.028 -1.047 -0.2794 -0.5748
+3.562 -1.037 -1.013 -0.2794 -0.5332
+3.593 -1.046 -0.969 -0.2794 -0.4903
+3.623 -1.054 -0.9168 -0.2794 -0.4461
+3.652 -1.063 -0.8563 -0.2794 -0.4008
+3.68 -1.071 -0.7883 -0.2794 -0.3545
+3.706 -1.078 -0.7134 -0.2794 -0.3073
+3.731 -1.086 -0.6323 -0.2794 -0.2594
+3.754 -1.092 -0.5459 -0.2794 -0.2108
+3.775 -1.099 -0.4552 -0.2794 -0.1617
+3.795 -1.104 -0.3609 -0.2794 -0.1122
+3.812 -1.109 -0.2641 -0.2794 -0.06235
+3.828 -1.114 -0.1656 -0.2794 -0.01239
+3.841 -1.118 -0.06662 -0.2794 0.0376
+3.851 -1.121 0.032 -0.2794 0.0875
+3.859 -1.123 0.1293 -0.2794 0.1372
+3.864 -1.124 0.2242 -0.2794 0.1865
+3.866 -1.125 0.3158 -0.2794 0.2354
+3.866 -1.125 0.4033 -0.2794 0.2837
+3.862 -1.124 0.4857 -0.2794 0.3312
+3.855 -1.122 0.5622 -0.2794 0.378
+3.846 -1.119 0.6322 -0.2794 0.4238
+3.832 -1.115 0.6949 -0.2794 0.4685
+3.816 -1.111 0.7497 -0.2794 0.5121
+3.797 -1.105 0.7961 -0.2794 0.5544
+3.774 -1.098 0.8337 -0.2794 0.5953
+3.748 -1.091 0.8621 -0.2794 0.6347
+3.719 -1.082 0.881 -0.2794 0.6725
+3.687 -1.073 0.8904 -0.2794 0.7087
+3.651 -1.063 0.8902 -0.2794 0.743
+3.613 -1.051 0.8803 -0.2794 0.7756
+3.572 -1.04 0.861 -0.2794 0.8061
+3.529 -1.027 0.8324 -0.2794 0.8347
+3.482 -1.013 0.795 -0.2794 0.8612
+3.434 -0.9992 0.749 -0.2794 0.8855
+3.383 -0.9844 0.6951 -0.2794 0.9076
+3.33 -0.969 0.6338 -0.2794 0.9275
+3.275 -0.9531 0.5658 -0.2794 0.945
+3.219 -0.9367 0.4918 -0.2794 0.9602
+3.161 -0.9199 0.4125 -0.2794 0.9729
+3.102 -0.9028 0.3289 -0.2794 0.9833
+3.042 -0.8854 0.2419 -0.2794 0.9911
+2.982 -0.8678 0.1522 -0.2794 0.9965
+2.921 -0.85 0.06098 -0.2794 0.9994
+2.919 -0.6932 0 -0.2311 1
+2.859 -0.6791 -0.09334 -0.2311 0.9988
+2.8 -0.665 -0.1857 -0.2311 0.995
+2.741 -0.651 -0.2761 -0.2311 0.9888
+2.683 -0.6372 -0.3637 -0.2311 0.9801
+2.625 -0.6236 -0.4474 -0.2311 0.9689
+2.569 -0.6102 -0.5264 -0.2311 0.9553
+2.515 -0.5972 -0.6 -0.2311 0.9394
+2.461 -0.5846 -0.6672 -0.2311 0.9211
+2.41 -0.5723 -0.7274 -0.2311 0.9004
+2.36 -0.5606 -0.78 -0.2311 0.8776
+2.313 -0.5493 -0.8244 -0.2311 0.8525
+2.268 -0.5386 -0.86 -0.2311 0.8253
+2.225 -0.5284 -0.8866 -0.2311 0.7961
+2.185 -0.5189 -0.9038 -0.2311 0.7648
+2.147 -0.51 -0.9114 -0.2311 0.7317
+2.112 -0.5017 -0.9093 -0.2311 0.6967
+2.081 -0.4942 -0.8975 -0.2311 0.66
+2.052 -0.4873 -0.8761 -0.2311 0.6216
+2.026 -0.4811 -0.8453 -0.2311 0.5817
+2.003 -0.4757 -0.8052 -0.2311 0.5403
+1.983 -0.4709 -0.7564 -0.2311 0.4976
+1.966 -0.467 -0.6993 -0.2311 0.4536
+1.952 -0.4637 -0.6345 -0.2311 0.4085
+1.942 -0.4612 -0.5625 -0.2311 0.3624
+1.934 -0.4593 -0.484 -0.2311 0.3153
+1.929 -0.4582 -0.3999 -0.2311 0.2675
+1.928 -0.4578 -0.311 -0.2311 0.219
+1.929 -0.4581 -0.2181 -0.2311 0.17
+1.932 -0.459 -0.1221 -0.2311 0.1205
+1.939 -0.4605 -0.02412 -0.2311 0.07074
+1.948 -0.4627 0.07501 -0.2311 0.02079
+1.959 -0.4654 0.1743 -0.2311 -0.0292
+1.973 -0.4687 0.2726 -0.2311 -0.07912
+1.989 -0.4725 0.3692 -0.2311 -0.1288
+2.008 -0.4768 0.4629 -0.2311 -0.1782
+2.028 -0.4816 0.5528 -0.2311 -0.2272
+2.05 -0.4869 0.6381 -0.2311 -0.2756
+2.074 -0.4925 0.7178 -0.2311 -0.3233
+2.099 -0.4985 0.7912 -0.2311 -0.3702
+2.126 -0.5049 0.8574 -0.2311 -0.4161
+2.154 -0.5116 0.9159 -0.2311 -0.4611
+2.183 -0.5185 0.9661 -0.2311 -0.5048
+2.214 -0.5258 1.007 -0.2311 -0.5474
+2.245 -0.5333 1.039 -0.2311 -0.5885
+2.278 -0.5409 1.061 -0.2311 -0.6282
+2.311 -0.5488 1.074 -0.2311 -0.6663
+2.344 -0.5568 1.076 -0.2311 -0.7027
+2.379 -0.565 1.068 -0.2311 -0.7374
+2.414 -0.5733 1.05 -0.2311 -0.7702
+2.449 -0.5817 1.022 -0.2311 -0.8011
+2.485 -0.5901 0.9844 -0.2311 -0.8301
+2.521 -0.5987 0.9374 -0.2311 -0.8569
+2.557 -0.6073 0.8815 -0.2311 -0.8816
+2.593 -0.6159 0.8172 -0.2311 -0.9041
+2.63 -0.6246 0.7451 -0.2311 -0.9243
+2.667 -0.6333 0.6659 -0.2311 -0.9422
+2.703 -0.6421 0.5804 -0.2311 -0.9578
+2.74 -0.6508 0.4893 -0.2311 -0.971
+2.777 -0.6596 0.3935 -0.2311 -0.9817
+2.814 -0.6684 0.2939 -0.2311 -0.99
+2.851 -0.6771 0.1916 -0.2311 -0.9958
+2.888 -0.6859 0.08736 -0.2311 -0.9991
+2.925 -0.6947 -0.01768 -0.2311 -1
+2.962 -0.7035 -0.1225 -0.2311 -0.9983
+2.999 -0.7123 -0.2262 -0.2311 -0.9941
+3.036 -0.7211 -0.3278 -0.2311 -0.9875
+3.073 -0.7298 -0.4262 -0.2311 -0.9784
+3.11 -0.7386 -0.5205 -0.2311 -0.9668
+3.147 -0.7473 -0.6098 -0.2311 -0.9528
+3.183 -0.7561 -0.6933 -0.2311 -0.9365
+3.22 -0.7648 -0.7702 -0.2311 -0.9178
+3.257 -0.7735 -0.8398 -0.2311 -0.8968
+3.293 -0.7821 -0.9013 -0.2311 -0.8735
+3.329 -0.7907 -0.9542 -0.2311 -0.8481
+3.365 -0.7992 -0.9981 -0.2311 -0.8206
+3.401 -0.8076 -1.033 -0.2311 -0.791
+3.436 -0.816 -1.057 -0.2311 -0.7594
+3.47 -0.8242 -1.072 -0.2311 -0.7259
+3.505 -0.8324 -1.076 -0.2311 -0.6907
+3.538 -0.8403 -1.071 -0.2311 -0.6536
+3.571 -0.8481 -1.055 -0.2311 -0.615
+3.603 -0.8557 -1.03 -0.2311 -0.5748
+3.634 -0.8631 -0.9945 -0.2311 -0.5332
+3.664 -0.8703 -0.9502 -0.2311 -0.4903
+3.693 -0.8772 -0.8972 -0.2311 -0.4461
+3.721 -0.8838 -0.836 -0.2311 -0.4008
+3.747 -0.89 -0.7672 -0.2311 -0.3545
+3.772 -0.8959 -0.6916 -0.2311 -0.3073
+3.795 -0.9014 -0.61 -0.2311 -0.2594
+3.817 -0.9065 -0.523 -0.2311 -0.2108
+3.836 -0.9111 -0.4317 -0.2311 -0.1617
+3.854 -0.9153 -0.337 -0.2311 -0.1122
+3.869 -0.919 -0.2397 -0.2311 -0.06235
+3.882 -0.9221 -0.1409 -0.2311 -0.01239
+3.893 -0.9246 -0.04161 -0.2311 0.0376
+3.901 -0.9265 0.05726 -0.2311 0.0875
+3.907 -0.9279 0.1547 -0.2311 0.1372
+3.91 -0.9286 0.2497 -0.2311 0.1865
+3.91 -0.9286 0.3414 -0.2311 0.2354
+3.907 -0.9279 0.4288 -0.2311 0.2837
+3.901 -0.9266 0.5111 -0.2311 0.3312
+3.893 -0.9245 0.5874 -0.2311 0.378
+3.881 -0.9218 0.6571 -0.2311 0.4238
+3.866 -0.9182 0.7194 -0.2311 0.4685
+3.848 -0.914 0.7738 -0.2311 0.5121
+3.827 -0.9091 0.8197 -0.2311 0.5544
+3.804 -0.9034 0.8567 -0.2311 0.5953
+3.777 -0.897 0.8844 -0.2311 0.6347
+3.747 -0.8898 0.9026 -0.2311 0.6725
+3.714 -0.882 0.9111 -0.2311 0.7087
+3.678 -0.8736 0.9099 -0.2311 0.743
+3.64 -0.8644 0.8991 -0.2311 0.7756
+3.599 -0.8547 0.8787 -0.2311 0.8061
+3.555 -0.8443 0.849 -0.2311 0.8347
+3.509 -0.8334 0.8104 -0.2311 0.8612
+3.461 -0.822 0.7632 -0.2311 0.8855
+3.411 -0.8101 0.708 -0.2311 0.9076
+3.359 -0.7977 0.6453 -0.2311 0.9275
+3.305 -0.7849 0.5759 -0.2311 0.945
+3.25 -0.7718 0.5004 -0.2311 0.9602
+3.193 -0.7584 0.4197 -0.2311 0.9729
+3.135 -0.7447 0.3346 -0.2311 0.9833
+3.077 -0.7308 0.246 -0.2311 0.9911
+3.018 -0.7168 0.1548 -0.2311 0.9965
+2.958 -0.7026 0.06201 -0.2311 0.9994
+2.95 -0.5465 0 -0.1822 1
+2.892 -0.5358 -0.09484 -0.1822 0.9988
+2.834 -0.5251 -0.1887 -0.1822 0.995
+2.777 -0.5145 -0.2806 -0.1822 0.9888
+2.72 -0.504 -0.3696 -0.1822 0.9801
+2.664 -0.4936 -0.4548 -0.1822 0.9689
+2.61 -0.4835 -0.5352 -0.1822 0.9553
+2.556 -0.4736 -0.6102 -0.1822 0.9394
+2.504 -0.4639 -0.6787 -0.1822 0.9211
+2.453 -0.4545 -0.7403 -0.1822 0.9004
+2.405 -0.4455 -0.7941 -0.1822 0.8776
+2.358 -0.4368 -0.8397 -0.1822 0.8525
+2.313 -0.4285 -0.8765 -0.1822 0.8253
+2.271 -0.4207 -0.9042 -0.1822 0.7961
+2.23 -0.4132 -0.9224 -0.1822 0.7648
+2.193 -0.4062 -0.931 -0.1822 0.7317
+2.158 -0.3997 -0.9298 -0.1822 0.6967
+2.125 -0.3937 -0.9188 -0.1822 0.66
+2.095 -0.3882 -0.8981 -0.1822 0.6216
+2.068 -0.3832 -0.8679 -0.1822 0.5817
+2.044 -0.3787 -0.8285 -0.1822 0.5403
+2.023 -0.3748 -0.7803 -0.1822 0.4976
+2.004 -0.3714 -0.7236 -0.1822 0.4536
+1.989 -0.3685 -0.6591 -0.1822 0.4085
+1.976 -0.3662 -0.5874 -0.1822 0.3624
+1.967 -0.3644 -0.5092 -0.1822 0.3153
+1.96 -0.3631 -0.4252 -0.1822 0.2675
+1.956 -0.3624 -0.3363 -0.1822 0.219
+1.955 -0.3621 -0.2435 -0.1822 0.17
+1.956 -0.3624 -0.1474 -0.1822 0.1205
+1.96 -0.3632 -0.04929 -0.1822 0.07074
+1.967 -0.3644 0.05004 -0.1822 0.02079
+1.976 -0.3661 0.1496 -0.1822 -0.0292
+1.988 -0.3683 0.2483 -0.1822 -0.07912
+2.002 -0.3709 0.3452 -0.1822 -0.1288
+2.018 -0.3738 0.4393 -0.1822 -0.1782
+2.036 -0.3772 0.5297 -0.1822 -0.2272
+2.056 -0.3809 0.6155 -0.1822 -0.2756
+2.078 -0.385 0.6958 -0.1822 -0.3233
+2.102 -0.3894 0.7699 -0.1822 -0.3702
+2.128 -0.3942 0.8368 -0.1822 -0.4161
+2.155 -0.3992 0.896 -0.1822 -0.4611
+2.183 -0.4044 0.9469 -0.1822 -0.5048
+2.213 -0.4099 0.9889 -0.1822 -0.5474
+2.244 -0.4157 1.022 -0.1822 -0.5885
+2.276 -0.4216 1.045 -0.1822 -0.6282
+2.309 -0.4278 1.058 -0.1822 -0.6663
+2.343 -0.4341 1.061 -0.1822 -0.7027
+2.378 -0.4406 1.054 -0.1822 -0.7374
+2.414 -0.4472 1.037 -0.1822 -0.7702
+2.45 -0.4539 1.01 -0.1822 -0.8011
+2.487 -0.4607 0.9729 -0.1822 -0.8301
+2.525 -0.4677 0.9269 -0.1822 -0.8569
+2.562 -0.4747 0.872 -0.1822 -0.8816
+2.601 -0.4818 0.8086 -0.1822 -0.9041
+2.64 -0.489 0.7375 -0.1822 -0.9243
+2.679 -0.4962 0.6593 -0.1822 -0.9422
+2.718 -0.5035 0.5747 -0.1822 -0.9578
+2.757 -0.5108 0.4845 -0.1822 -0.971
+2.797 -0.5182 0.3897 -0.1822 -0.9817
+2.837 -0.5255 0.2912 -0.1822 -0.99
+2.877 -0.5329 0.1898 -0.1822 -0.9958
+2.917 -0.5403 0.08654 -0.1822 -0.9991
+2.957 -0.5477 -0.01751 -0.1822 -1
+2.996 -0.5551 -0.1214 -0.1822 -0.9983
+3.036 -0.5625 -0.2241 -0.1822 -0.9941
+3.076 -0.5699 -0.3247 -0.1822 -0.9875
+3.116 -0.5773 -0.4221 -0.1822 -0.9784
+3.156 -0.5846 -0.5154 -0.1822 -0.9668
+3.195 -0.5919 -0.6038 -0.1822 -0.9528
+3.234 -0.5992 -0.6863 -0.1822 -0.9365
+3.273 -0.6064 -0.7622 -0.1822 -0.9178
+3.312 -0.6135 -0.8308 -0.1822 -0.8968
+3.35 -0.6206 -0.8914 -0.1822 -0.8735
+3.388 -0.6276 -0.9434 -0.1822 -0.8481
+3.425 -0.6345 -0.9863 -0.1822 -0.8206
+3.462 -0.6414 -1.02 -0.1822 -0.791
+3.498 -0.648 -1.044 -0.1822 -0.7594
+3.533 -0.6546 -1.057 -0.1822 -0.7259
+3.568 -0.661 -1.061 -0.1822 -0.6907
+3.602 -0.6673 -1.054 -0.1822 -0.6536
+3.635 -0.6734 -1.038 -0.1822 -0.615
+3.666 -0.6792 -1.012 -0.1822 -0.5748
+3.697 -0.6849 -0.9758 -0.1822 -0.5332
+3.726 -0.6904 -0.9307 -0.1822 -0.4903
+3.754 -0.6955 -0.877 -0.1822 -0.4461
+3.781 -0.7004 -0.8151 -0.1822 -0.4008
+3.806 -0.7051 -0.7457 -0.1822 -0.3545
+3.829 -0.7094 -0.6695 -0.1822 -0.3073
+3.85 -0.7133 -0.5873 -0.1822 -0.2594
+3.87 -0.7169 -0.4998 -0.1822 -0.2108
+3.887 -0.7202 -0.408 -0.1822 -0.1617
+3.903 -0.723 -0.3128 -0.1822 -0.1122
+3.916 -0.7255 -0.2152 -0.1822 -0.06235
+3.927 -0.7275 -0.1161 -0.1822 -0.01239
+3.935 -0.729 -0.01656 -0.1822 0.0376
+3.941 -0.7301 0.08248 -0.1822 0.0875
+3.944 -0.7307 0.18 -0.1822 0.1372
+3.945 -0.7308 0.2751 -0.1822 0.1865
+3.943 -0.7304 0.3667 -0.1822 0.2354
+3.938 -0.7295 0.454 -0.1822 0.2837
+3.93 -0.7281 0.5361 -0.1822 0.3312
+3.919 -0.7261 0.6123 -0.1822 0.378
+3.906 -0.7236 0.6816 -0.1822 0.4238
+3.889 -0.7205 0.7436 -0.1822 0.4685
+3.87 -0.717 0.7974 -0.1822 0.5121
+3.848 -0.7128 0.8428 -0.1822 0.5544
+3.823 -0.7082 0.8791 -0.1822 0.5953
+3.795 -0.703 0.9061 -0.1822 0.6347
+3.764 -0.6973 0.9236 -0.1822 0.6725
+3.731 -0.6911 0.9313 -0.1822 0.7087
+3.695 -0.6845 0.9292 -0.1822 0.743
+3.656 -0.6773 0.9173 -0.1822 0.7756
+3.615 -0.6697 0.8959 -0.1822 0.8061
+3.572 -0.6617 0.8651 -0.1822 0.8347
+3.526 -0.6533 0.8253 -0.1822 0.8612
+3.479 -0.6445 0.7769 -0.1822 0.8855
+3.429 -0.6353 0.7204 -0.1822 0.9076
+3.378 -0.6259 0.6564 -0.1822 0.9275
+3.326 -0.6161 0.5856 -0.1822 0.945
+3.272 -0.6061 0.5088 -0.1822 0.9602
+3.217 -0.5959 0.4266 -0.1822 0.9729
+3.16 -0.5855 0.3401 -0.1822 0.9833
+3.104 -0.575 0.25 -0.1822 0.9911
+3.046 -0.5643 0.1573 -0.1822 0.9965
+2.988 -0.5536 0.06301 -0.1822 0.9994
+2.973 -0.3984 0 -0.1328 1
+2.917 -0.3909 -0.09629 -0.1328 0.9988
+2.862 -0.3834 -0.1916 -0.1328 0.995
+2.806 -0.376 -0.2849 -0.1328 0.9888
+2.751 -0.3686 -0.3753 -0.1328 0.9801
+2.697 -0.3614 -0.4619 -0.1328 0.9689
+2.644 -0.3542 -0.5437 -0.1328 0.9553
+2.592 -0.3473 -0.62 -0.1328 0.9394
+2.541 -0.3404 -0.6899 -0.1328 0.9211
+2.492 -0.3338 -0.7526 -0.1328 0.9004
+2.444 -0.3274 -0.8077 -0.1328 0.8776
+2.398 -0.3212 -0.8545 -0.1328 0.8525
+2.354 -0.3153 -0.8924 -0.1328 0.8253
+2.311 -0.3097 -0.9212 -0.1328 0.7961
+2.271 -0.3043 -0.9404 -0.1328 0.7648
+2.234 -0.2992 -0.9499 -0.1328 0.7317
+2.198 -0.2945 -0.9496 -0.1328 0.6967
+2.165 -0.2901 -0.9395 -0.1328 0.66
+2.135 -0.286 -0.9196 -0.1328 0.6216
+2.107 -0.2822 -0.8901 -0.1328 0.5817
+2.081 -0.2788 -0.8513 -0.1328 0.5403
+2.059 -0.2758 -0.8036 -0.1328 0.4976
+2.039 -0.2731 -0.7474 -0.1328 0.4536
+2.022 -0.2708 -0.6833 -0.1328 0.4085
+2.007 -0.2689 -0.6119 -0.1328 0.3624
+1.995 -0.2673 -0.534 -0.1328 0.3153
+1.987 -0.2662 -0.4502 -0.1328 0.2675
+1.98 -0.2653 -0.3615 -0.1328 0.219
+1.977 -0.2648 -0.2687 -0.1328 0.17
+1.976 -0.2647 -0.1727 -0.1328 0.1205
+1.978 -0.265 -0.07443 -0.1328 0.07074
+1.982 -0.2655 0.02504 -0.1328 0.02079
+1.989 -0.2665 0.1248 -0.1328 -0.0292
+1.998 -0.2677 0.2237 -0.1328 -0.07912
+2.01 -0.2692 0.321 -0.1328 -0.1288
+2.023 -0.2711 0.4155 -0.1328 -0.1782
+2.04 -0.2733 0.5063 -0.1328 -0.2272
+2.058 -0.2757 0.5926 -0.1328 -0.2756
+2.078 -0.2784 0.6735 -0.1328 -0.3233
+2.1 -0.2814 0.7481 -0.1328 -0.3702
+2.124 -0.2846 0.8156 -0.1328 -0.4161
+2.15 -0.288 0.8755 -0.1328 -0.4611
+2.177 -0.2917 0.9271 -0.1328 -0.5048
+2.206 -0.2956 0.9698 -0.1328 -0.5474
+2.237 -0.2997 1.003 -0.1328 -0.5885
+2.268 -0.3039 1.027 -0.1328 -0.6282
+2.302 -0.3084 1.041 -0.1328 -0.6663
+2.336 -0.3129 1.045 -0.1328 -0.7027
+2.371 -0.3177 1.039 -0.1328 -0.7374
+2.408 -0.3226 1.023 -0.1328 -0.7702
+2.445 -0.3276 0.9966 -0.1328 -0.8011
+2.483 -0.3327 0.9609 -0.1328 -0.8301
+2.522 -0.3379 0.9158 -0.1328 -0.8569
+2.562 -0.3432 0.8618 -0.1328 -0.8816
+2.602 -0.3486 0.7995 -0.1328 -0.9041
+2.643 -0.354 0.7294 -0.1328 -0.9243
+2.684 -0.3596 0.6522 -0.1328 -0.9422
+2.725 -0.3652 0.5686 -0.1328 -0.9578
+2.767 -0.3708 0.4795 -0.1328 -0.971
+2.81 -0.3764 0.3857 -0.1328 -0.9817
+2.852 -0.3821 0.2882 -0.1328 -0.99
+2.895 -0.3879 0.1878 -0.1328 -0.9958
+2.938 -0.3936 0.08567 -0.1328 -0.9991
+2.981 -0.3993 -0.01734 -0.1328 -1
+3.023 -0.4051 -0.1202 -0.1328 -0.9983
+3.066 -0.4108 -0.2218 -0.1328 -0.9941
+3.109 -0.4165 -0.3213 -0.1328 -0.9875
+3.151 -0.4222 -0.4177 -0.1328 -0.9784
+3.194 -0.4279 -0.51 -0.1328 -0.9668
+3.235 -0.4335 -0.5974 -0.1328 -0.9528
+3.277 -0.439 -0.6789 -0.1328 -0.9365
+3.318 -0.4446 -0.7538 -0.1328 -0.9178
+3.359 -0.45 -0.8214 -0.1328 -0.8968
+3.399 -0.4554 -0.8809 -0.1328 -0.8735
+3.438 -0.4606 -0.932 -0.1328 -0.8481
+3.477 -0.4658 -0.974 -0.1328 -0.8206
+3.515 -0.4709 -1.006 -0.1328 -0.791
+3.552 -0.4759 -1.029 -0.1328 -0.7594
+3.588 -0.4807 -1.042 -0.1328 -0.7259
+3.623 -0.4854 -1.045 -0.1328 -0.6907
+3.657 -0.4899 -1.038 -0.1328 -0.6536
+3.689 -0.4943 -1.02 -0.1328 -0.615
+3.721 -0.4985 -0.9931 -0.1328 -0.5748
+3.751 -0.5025 -0.9565 -0.1328 -0.5332
+3.779 -0.5063 -0.9107 -0.1328 -0.4903
+3.806 -0.5099 -0.8563 -0.1328 -0.4461
+3.831 -0.5133 -0.7937 -0.1328 -0.4008
+3.854 -0.5164 -0.7237 -0.1328 -0.3545
+3.876 -0.5193 -0.6469 -0.1328 -0.3073
+3.895 -0.5219 -0.5642 -0.1328 -0.2594
+3.913 -0.5243 -0.4763 -0.1328 -0.2108
+3.928 -0.5263 -0.3841 -0.1328 -0.1617
+3.941 -0.5281 -0.2885 -0.1328 -0.1122
+3.952 -0.5295 -0.1906 -0.1328 -0.06235
+3.961 -0.5306 -0.09126 -0.1328 -0.01239
+3.967 -0.5314 0.008488 -0.1328 0.0376
+3.97 -0.5319 0.1077 -0.1328 0.0875
+3.971 -0.532 0.2052 -0.1328 0.1372
+3.969 -0.5318 0.3003 -0.1328 0.1865
+3.965 -0.5312 0.3918 -0.1328 0.2354
+3.958 -0.5302 0.479 -0.1328 0.2837
+3.948 -0.5289 0.5609 -0.1328 0.3312
+3.935 -0.5272 0.6367 -0.1328 0.378
+3.92 -0.5252 0.7057 -0.1328 0.4238
+3.902 -0.5227 0.7672 -0.1328 0.4685
+3.881 -0.52 0.8206 -0.1328 0.5121
+3.857 -0.5168 0.8653 -0.1328 0.5544
+3.831 -0.5133 0.901 -0.1328 0.5953
+3.802 -0.5094 0.9273 -0.1328 0.6347
+3.771 -0.5052 0.944 -0.1328 0.6725
+3.737 -0.5007 0.9508 -0.1328 0.7087
+3.701 -0.4958 0.9478 -0.1328 0.743
+3.662 -0.4907 0.935 -0.1328 0.7756
+3.622 -0.4852 0.9125 -0.1328 0.8061
+3.579 -0.4795 0.8806 -0.1328 0.8347
+3.534 -0.4735 0.8397 -0.1328 0.8612
+3.487 -0.4672 0.7901 -0.1328 0.8855
+3.439 -0.4607 0.7324 -0.1328 0.9076
+3.389 -0.454 0.6671 -0.1328 0.9275
+3.338 -0.4472 0.595 -0.1328 0.945
+3.285 -0.4401 0.5168 -0.1328 0.9602
+3.232 -0.433 0.4333 -0.1328 0.9729
+3.177 -0.4257 0.3453 -0.1328 0.9833
+3.122 -0.4183 0.2538 -0.1328 0.9911
+3.067 -0.4108 0.1597 -0.1328 0.9965
+3.011 -0.4034 0.06397 -0.1328 0.9994
+2.99 -0.2493 0 -0.08309 1
+2.936 -0.2448 -0.09767 -0.08309 0.9988
+2.882 -0.2403 -0.1943 -0.08309 0.995
+2.829 -0.2358 -0.2891 -0.08309 0.9888
+2.776 -0.2314 -0.3808 -0.08309 0.9801
+2.723 -0.2271 -0.4687 -0.08309 0.9689
+2.672 -0.2228 -0.5519 -0.08309 0.9553
+2.622 -0.2186 -0.6294 -0.08309 0.9394
+2.572 -0.2145 -0.7005 -0.08309 0.9211
+2.524 -0.2105 -0.7646 -0.08309 0.9004
+2.477 -0.2066 -0.8208 -0.08309 0.8776
+2.432 -0.2028 -0.8687 -0.08309 0.8525
+2.389 -0.1992 -0.9078 -0.08309 0.8253
+2.347 -0.1957 -0.9376 -0.08309 0.7961
+2.307 -0.1924 -0.9578 -0.08309 0.7648
+2.27 -0.1892 -0.9683 -0.08309 0.7317
+2.234 -0.1863 -0.9689 -0.08309 0.6967
+2.2 -0.1835 -0.9596 -0.08309 0.66
+2.169 -0.1809 -0.9404 -0.08309 0.6216
+2.141 -0.1785 -0.9117 -0.08309 0.5817
+2.114 -0.1763 -0.8735 -0.08309 0.5403
+2.09 -0.1743 -0.8264 -0.08309 0.4976
+2.069 -0.1725 -0.7707 -0.08309 0.4536
+2.05 -0.1709 -0.7071 -0.08309 0.4085
+2.034 -0.1696 -0.6361 -0.08309 0.3624
+2.02 -0.1684 -0.5585 -0.08309 0.3153
+2.009 -0.1675 -0.475 -0.08309 0.2675
+2 -0.1668 -0.3864 -0.08309 0.219
+1.995 -0.1663 -0.2937 -0.08309 0.17
+1.991 -0.166 -0.1978 -0.08309 0.1205
+1.991 -0.166 -0.09952 -0.08309 0.07074
+1.992 -0.1661 2.697e-05 -0.08309 0.02079
+1.997 -0.1665 0.09989 -0.08309 -0.0292
+2.004 -0.1671 0.1991 -0.08309 -0.07912
+2.013 -0.1678 0.2966 -0.08309 -0.1288
+2.024 -0.1688 0.3914 -0.08309 -0.1782
+2.038 -0.17 0.4826 -0.08309 -0.2272
+2.054 -0.1713 0.5693 -0.08309 -0.2756
+2.073 -0.1728 0.6507 -0.08309 -0.3233
+2.093 -0.1745 0.7258 -0.08309 -0.3702
+2.116 -0.1764 0.794 -0.08309 -0.4161
+2.14 -0.1784 0.8545 -0.08309 -0.4611
+2.166 -0.1806 0.9067 -0.08309 -0.5048
+2.194 -0.183 0.9502 -0.08309 -0.5474
+2.224 -0.1854 0.9844 -0.08309 -0.5885
+2.255 -0.1881 1.009 -0.08309 -0.6282
+2.288 -0.1908 1.024 -0.08309 -0.6663
+2.323 -0.1937 1.029 -0.08309 -0.7027
+2.358 -0.1966 1.023 -0.08309 -0.7374
+2.395 -0.1997 1.008 -0.08309 -0.7702
+2.433 -0.2029 0.983 -0.08309 -0.8011
+2.473 -0.2062 0.9482 -0.08309 -0.8301
+2.513 -0.2095 0.9041 -0.08309 -0.8569
+2.554 -0.213 0.8512 -0.08309 -0.8816
+2.596 -0.2165 0.7899 -0.08309 -0.9041
+2.639 -0.22 0.7208 -0.08309 -0.9243
+2.682 -0.2236 0.6446 -0.08309 -0.9422
+2.726 -0.2273 0.5622 -0.08309 -0.9578
+2.771 -0.231 0.4741 -0.08309 -0.971
+2.816 -0.2348 0.3815 -0.08309 -0.9817
+2.861 -0.2385 0.285 -0.08309 -0.99
+2.906 -0.2423 0.1858 -0.08309 -0.9958
+2.952 -0.2461 0.08475 -0.08309 -0.9991
+2.997 -0.2499 -0.01715 -0.08309 -1
+3.043 -0.2537 -0.1189 -0.08309 -0.9983
+3.088 -0.2575 -0.2194 -0.08309 -0.9941
+3.134 -0.2613 -0.3178 -0.08309 -0.9875
+3.179 -0.265 -0.4131 -0.08309 -0.9784
+3.224 -0.2688 -0.5043 -0.08309 -0.9668
+3.268 -0.2725 -0.5906 -0.08309 -0.9528
+3.312 -0.2761 -0.671 -0.08309 -0.9365
+3.355 -0.2797 -0.7449 -0.08309 -0.9178
+3.397 -0.2833 -0.8114 -0.08309 -0.8968
+3.439 -0.2867 -0.8699 -0.08309 -0.8735
+3.48 -0.2901 -0.92 -0.08309 -0.8481
+3.52 -0.2935 -0.961 -0.08309 -0.8206
+3.559 -0.2967 -0.9925 -0.08309 -0.791
+3.596 -0.2999 -1.014 -0.08309 -0.7594
+3.633 -0.3029 -1.026 -0.08309 -0.7259
+3.668 -0.3059 -1.028 -0.08309 -0.6907
+3.702 -0.3087 -1.02 -0.08309 -0.6536
+3.735 -0.3114 -1.002 -0.08309 -0.615
+3.765 -0.3139 -0.9739 -0.08309 -0.5748
+3.795 -0.3164 -0.9366 -0.08309 -0.5332
+3.822 -0.3187 -0.8901 -0.08309 -0.4903
+3.848 -0.3208 -0.835 -0.08309 -0.4461
+3.871 -0.3228 -0.7719 -0.08309 -0.4008
+3.893 -0.3246 -0.7013 -0.08309 -0.3545
+3.913 -0.3262 -0.624 -0.08309 -0.3073
+3.93 -0.3277 -0.5407 -0.08309 -0.2594
+3.946 -0.329 -0.4524 -0.08309 -0.2108
+3.959 -0.3301 -0.3599 -0.08309 -0.1617
+3.97 -0.331 -0.264 -0.08309 -0.1122
+3.978 -0.3317 -0.1658 -0.08309 -0.06235
+3.984 -0.3322 -0.06633 -0.08309 -0.01239
+3.988 -0.3325 0.03353 -0.08309 0.0376
+3.989 -0.3326 0.1328 -0.08309 0.0875
+3.987 -0.3324 0.2303 -0.08309 0.1372
+3.983 -0.3321 0.3253 -0.08309 0.1865
+3.976 -0.3315 0.4167 -0.08309 0.2354
+3.967 -0.3308 0.5037 -0.08309 0.2837
+3.955 -0.3298 0.5853 -0.08309 0.3312
+3.94 -0.3285 0.6608 -0.08309 0.378
+3.923 -0.3271 0.7294 -0.08309 0.4238
+3.904 -0.3255 0.7904 -0.08309 0.4685
+3.881 -0.3236 0.8432 -0.08309 0.5121
+3.857 -0.3215 0.8874 -0.08309 0.5544
+3.829 -0.3193 0.9224 -0.08309 0.5953
+3.8 -0.3168 0.948 -0.08309 0.6347
+3.768 -0.3141 0.9638 -0.08309 0.6725
+3.734 -0.3113 0.9698 -0.08309 0.7087
+3.697 -0.3083 0.9659 -0.08309 0.743
+3.659 -0.3051 0.9521 -0.08309 0.7756
+3.618 -0.3017 0.9286 -0.08309 0.8061
+3.576 -0.2982 0.8956 -0.08309 0.8347
+3.532 -0.2945 0.8536 -0.08309 0.8612
+3.486 -0.2907 0.8028 -0.08309 0.8855
+3.439 -0.2867 0.7439 -0.08309 0.9076
+3.391 -0.2827 0.6774 -0.08309 0.9275
+3.341 -0.2786 0.604 -0.08309 0.945
+3.29 -0.2743 0.5245 -0.08309 0.9602
+3.238 -0.27 0.4397 -0.08309 0.9729
+3.186 -0.2656 0.3503 -0.08309 0.9833
+3.133 -0.2612 0.2575 -0.08309 0.9911
+3.079 -0.2567 0.162 -0.08309 0.9965
+3.025 -0.2523 0.06488 -0.08309 0.9994
+2.998 -0.09954 0 -0.03318 1
+2.947 -0.09782 -0.09899 -0.03318 0.9988
+2.895 -0.09612 -0.197 -0.03318 0.995
+2.844 -0.09442 -0.293 -0.03318 0.9888
+2.793 -0.09273 -0.3861 -0.03318 0.9801
+2.743 -0.09107 -0.4753 -0.03318 0.9689
+2.694 -0.08942 -0.5597 -0.03318 0.9553
+2.645 -0.08781 -0.6384 -0.03318 0.9394
+2.597 -0.08622 -0.7108 -0.03318 0.9211
+2.551 -0.08468 -0.776 -0.03318 0.9004
+2.505 -0.08317 -0.8334 -0.03318 0.8776
+2.461 -0.08171 -0.8824 -0.03318 0.8525
+2.419 -0.08029 -0.9225 -0.03318 0.8253
+2.378 -0.07893 -0.9534 -0.03318 0.7961
+2.338 -0.07762 -0.9746 -0.03318 0.7648
+2.301 -0.07638 -0.986 -0.03318 0.7317
+2.265 -0.07519 -0.9875 -0.03318 0.6967
+2.231 -0.07407 -0.9791 -0.03318 0.66
+2.199 -0.07301 -0.9607 -0.03318 0.6216
+2.17 -0.07203 -0.9327 -0.03318 0.5817
+2.142 -0.07112 -0.8952 -0.03318 0.5403
+2.117 -0.07029 -0.8487 -0.03318 0.4976
+2.094 -0.06953 -0.7936 -0.03318 0.4536
+2.074 -0.06885 -0.7305 -0.03318 0.4085
+2.056 -0.06825 -0.6599 -0.03318 0.3624
+2.04 -0.06773 -0.5826 -0.03318 0.3153
+2.027 -0.06729 -0.4994 -0.03318 0.2675
+2.016 -0.06693 -0.4111 -0.03318 0.219
+2.008 -0.06666 -0.3186 -0.03318 0.17
+2.002 -0.06647 -0.2227 -0.03318 0.1205
+1.999 -0.06637 -0.1246 -0.03318 0.07074
+1.999 -0.06635 -0.02499 -0.03318 0.02079
+2 -0.06641 0.07495 -0.03318 -0.0292
+2.005 -0.06655 0.1743 -0.03318 -0.07912
+2.012 -0.06678 0.272 -0.03318 -0.1288
+2.021 -0.06709 0.3671 -0.03318 -0.1782
+2.033 -0.06747 0.4586 -0.03318 -0.2272
+2.047 -0.06794 0.5457 -0.03318 -0.2756
+2.063 -0.06848 0.6275 -0.03318 -0.3233
+2.081 -0.0691 0.7031 -0.03318 -0.3702
+2.102 -0.06979 0.7718 -0.03318 -0.4161
+2.125 -0.07055 0.8329 -0.03318 -0.4611
+2.15 -0.07138 0.8858 -0.03318 -0.5048
+2.177 -0.07228 0.9299 -0.03318 -0.5474
+2.206 -0.07324 0.9649 -0.03318 -0.5885
+2.237 -0.07426 0.9903 -0.03318 -0.6282
+2.27 -0.07535 1.006 -0.03318 -0.6663
+2.304 -0.07649 1.012 -0.03318 -0.7027
+2.34 -0.07768 1.007 -0.03318 -0.7374
+2.377 -0.07892 0.9929 -0.03318 -0.7702
+2.416 -0.08021 0.9687 -0.03318 -0.8011
+2.456 -0.08155 0.9349 -0.03318 -0.8301
+2.498 -0.08292 0.8919 -0.03318 -0.8569
+2.54 -0.08434 0.84 -0.03318 -0.8816
+2.584 -0.08578 0.7797 -0.03318 -0.9041
+2.629 -0.08726 0.7118 -0.03318 -0.9243
+2.674 -0.08877 0.6367 -0.03318 -0.9422
+2.72 -0.0903 0.5554 -0.03318 -0.9578
+2.767 -0.09186 0.4685 -0.03318 -0.971
+2.814 -0.09343 0.377 -0.03318 -0.9817
+2.862 -0.09501 0.2817 -0.03318 -0.99
+2.91 -0.0966 0.1837 -0.03318 -0.9958
+2.958 -0.0982 0.08377 -0.03318 -0.9991
+3.006 -0.09981 -0.01695 -0.03318 -1
+3.055 -0.1014 -0.1175 -0.03318 -0.9983
+3.103 -0.103 -0.2169 -0.03318 -0.9941
+3.151 -0.1046 -0.3141 -0.03318 -0.9875
+3.198 -0.1062 -0.4082 -0.03318 -0.9784
+3.246 -0.1077 -0.4983 -0.03318 -0.9668
+3.292 -0.1093 -0.5834 -0.03318 -0.9528
+3.338 -0.1108 -0.6627 -0.03318 -0.9365
+3.383 -0.1123 -0.7355 -0.03318 -0.9178
+3.427 -0.1138 -0.8009 -0.03318 -0.8968
+3.471 -0.1152 -0.8584 -0.03318 -0.8735
+3.513 -0.1166 -0.9074 -0.03318 -0.8481
+3.554 -0.118 -0.9474 -0.03318 -0.8206
+3.594 -0.1193 -0.9779 -0.03318 -0.791
+3.632 -0.1206 -0.9988 -0.03318 -0.7594
+3.669 -0.1218 -1.01 -0.03318 -0.7259
+3.704 -0.123 -1.011 -0.03318 -0.6907
+3.738 -0.1241 -1.002 -0.03318 -0.6536
+3.77 -0.1252 -0.9828 -0.03318 -0.615
+3.8 -0.1262 -0.9542 -0.03318 -0.5748
+3.829 -0.1271 -0.9161 -0.03318 -0.5332
+3.855 -0.128 -0.8689 -0.03318 -0.4903
+3.879 -0.1288 -0.8132 -0.03318 -0.4461
+3.902 -0.1295 -0.7495 -0.03318 -0.4008
+3.922 -0.1302 -0.6784 -0.03318 -0.3545
+3.94 -0.1308 -0.6006 -0.03318 -0.3073
+3.955 -0.1313 -0.517 -0.03318 -0.2594
+3.968 -0.1317 -0.4283 -0.03318 -0.2108
+3.979 -0.1321 -0.3354 -0.03318 -0.1617
+3.988 -0.1324 -0.2393 -0.03318 -0.1122
+3.994 -0.1326 -0.141 -0.03318 -0.06235
+3.997 -0.1327 -0.04136 -0.03318 -0.01239
+3.998 -0.1327 0.05856 -0.03318 0.0376
+3.997 -0.1327 0.1578 -0.03318 0.0875
+3.993 -0.1325 0.2553 -0.03318 0.1372
+3.986 -0.1323 0.3501 -0.03318 0.1865
+3.977 -0.132 0.4413 -0.03318 0.2354
+3.966 -0.1316 0.528 -0.03318 0.2837
+3.952 -0.1312 0.6093 -0.03318 0.3312
+3.935 -0.1306 0.6844 -0.03318 0.378
+3.916 -0.13 0.7526 -0.03318 0.4238
+3.895 -0.1293 0.8131 -0.03318 0.4685
+3.871 -0.1285 0.8653 -0.03318 0.5121
+3.845 -0.1277 0.9088 -0.03318 0.5544
+3.817 -0.1267 0.9432 -0.03318 0.5953
+3.787 -0.1257 0.968 -0.03318 0.6347
+3.754 -0.1246 0.983 -0.03318 0.6725
+3.72 -0.1235 0.9881 -0.03318 0.7087
+3.684 -0.1223 0.9833 -0.03318 0.743
+3.645 -0.121 0.9686 -0.03318 0.7756
+3.605 -0.1197 0.9441 -0.03318 0.8061
+3.564 -0.1183 0.9101 -0.03318 0.8347
+3.521 -0.1169 0.8669 -0.03318 0.8612
+3.476 -0.1154 0.815 -0.03318 0.8855
+3.43 -0.1139 0.7549 -0.03318 0.9076
+3.383 -0.1123 0.6872 -0.03318 0.9275
+3.335 -0.1107 0.6126 -0.03318 0.945
+3.286 -0.1091 0.5319 -0.03318 0.9602
+3.237 -0.1075 0.4458 -0.03318 0.9729
+3.186 -0.1058 0.3552 -0.03318 0.9833
+3.135 -0.1041 0.261 -0.03318 0.9911
+3.084 -0.1024 0.1642 -0.03318 0.9965
+3.033 -0.1007 0.06576 -0.03318 0.9994
diff --git a/data/points/grid_10_10_10_in_0_1.weights b/data/points/grid_10_10_10_in_0_1.weights
new file mode 100644
index 00000000..48926e09
--- /dev/null
+++ b/data/points/grid_10_10_10_in_0_1.weights
@@ -0,0 +1,1000 @@
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
+1e-6
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/doc/Alpha_complex/Intro_alpha_complex.h b/doc/Alpha_complex/Intro_alpha_complex.h
index cf1a946a..a08663ca 100644
--- a/doc/Alpha_complex/Intro_alpha_complex.h
+++ b/doc/Alpha_complex/Intro_alpha_complex.h
@@ -31,7 +31,7 @@ namespace alpha_complex {
/** \defgroup alpha_complex Alpha complex
*
* \author Vincent Rouvreau
- *
+ *
* @{
*
* \section definition Definition
@@ -195,8 +195,6 @@ namespace alpha_complex {
*
* \include Alpha_complex/alphaoffreader_for_doc_32.txt
*
- * \copyright GNU General Public License v3.
- * \verbatim Contact: gudhi-users@lists.gforge.inria.fr \endverbatim
*/
/** @} */ // end defgroup alpha_complex
diff --git a/doc/Bitmap_cubical_complex/Gudhi_Cubical_Complex_doc.h b/doc/Bitmap_cubical_complex/Gudhi_Cubical_Complex_doc.h
index 5963caa3..a5d7b60f 100644
--- a/doc/Bitmap_cubical_complex/Gudhi_Cubical_Complex_doc.h
+++ b/doc/Bitmap_cubical_complex/Gudhi_Cubical_Complex_doc.h
@@ -63,7 +63,7 @@ namespace cubical_complex {
* For further details and theory of cubical complexes, please consult \cite kaczynski2004computational as well as the
* following paper \cite peikert2012topological .
*
- * \section cubicalcomplexdatastructure Data structure.
+ * \section cubicalcomplexdatastructure Data structure
*
* The implementation of Cubical complex provides a representation of complexes that occupy a rectangular region in
* \f$\mathbb{R}^n\f$. This extra assumption allows for a memory efficient way of storing cubical complexes in a form
@@ -85,37 +85,14 @@ namespace cubical_complex {
* present in the product that gives the cube \f$C\f$. In a similar way, we can compute boundary and the coboundary of
* each cube. Further details can be found in the literature.
*
- * \section inputformat Input Format.
+ * \section inputformat Input Format
*
* In the current implantation, filtration is given at the maximal cubes, and it is then extended by the lower star
* filtration to all cubes. There are a number of constructors that can be used to construct cubical complex by users
* who want to use the code directly. They can be found in the \a Bitmap_cubical_complex class.
* Currently one input from a text file is used. It uses a format used already in Perseus software
- * (http://www.sas.upenn.edu/~vnanda/perseus/) by Vidit Nanda.
- * Below we are providing a description of the format. The first line contains a number d begin the dimension of the
- * bitmap (2 in the example below). Next d lines are the numbers of top dimensional cubes in each dimensions (3 and 3
- * in the example below). Next, in lexicographical order, the filtration of top dimensional cubes is given (1 4 6 8
- * 20 4 7 6 5 in the example below).
- *
- *
- * \image html "exampleBitmap.png" "Example of a input data."
- *
- * The input file for the following complex is:
- * \verbatim
-2
-3
-3
-1
-4
-6
-8
-20
-4
-7
-6
-5
-\endverbatim
-
+ * (http://www.sas.upenn.edu/~vnanda/perseus/) by Vidit Nanda. The file format is described here: \ref FileFormatsPerseus.
+ *
* \section PeriodicBoundaryConditions Periodic boundary conditions
* Often one would like to impose periodic boundary conditions to the cubical complex. Let \f$ I_1\times ... \times
* I_n \f$ be a box that is decomposed with a cubical complex \f$ \mathcal{K} \f$. Imposing periodic boundary
@@ -123,30 +100,11 @@ namespace cubical_complex {
* considered the same. In particular, if for a bitmap \f$ \mathcal{K} \f$ periodic boundary conditions are imposed
* in all directions, then complex \f$ \mathcal{K} \f$ became n-dimensional torus. One can use various constructors
* from the file Bitmap_cubical_complex_periodic_boundary_conditions_base.h to construct cubical complex with periodic
- * boundary conditions. One can also use Perseus style input files. To indicate periodic boundary conditions in a
- * given direction, then number of top dimensional cells in this direction have to be multiplied by -1. For instance:
-
- *\verbatim
-2
--3
-3
-1
-4
-6
-8
-20
-4
-7
-6
-5
-\endverbatim
-
- * Indicate that we have imposed periodic boundary conditions in the direction x, but not in the direction y.
-
+ * boundary conditions. One can also use Perseus style input files (see \ref FileFormatsPerseus).
+ *
* \section BitmapExamples Examples
- * End user programs are available in example/Bitmap_cubical_complex folder.
+ * End user programs are available in example/Bitmap_cubical_complex and utilities/Bitmap_cubical_complex folders.
*
- * \copyright GNU General Public License v3.
*/
/** @} */ // end defgroup cubical_complex
diff --git a/doc/Nerve_GIC/COPYRIGHT b/doc/Nerve_GIC/COPYRIGHT
new file mode 100644
index 00000000..0c36a526
--- /dev/null
+++ b/doc/Nerve_GIC/COPYRIGHT
@@ -0,0 +1,19 @@
+The files of this directory are part of the Gudhi Library. The Gudhi library
+(Geometric Understanding in Higher Dimensions) is a generic C++ library for
+computational topology.
+
+Author(s): Mathieu Carrière
+
+Copyright (C) 2017 INRIA
+
+This program is free software: you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free Software
+Foundation, either version 3 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/doc/Nerve_GIC/GIC.jpg b/doc/Nerve_GIC/GIC.jpg
new file mode 100644
index 00000000..cb1b9b7f
--- /dev/null
+++ b/doc/Nerve_GIC/GIC.jpg
Binary files differ
diff --git a/doc/Nerve_GIC/GIC.pdf b/doc/Nerve_GIC/GIC.pdf
new file mode 100644
index 00000000..30525745
--- /dev/null
+++ b/doc/Nerve_GIC/GIC.pdf
Binary files differ
diff --git a/doc/Nerve_GIC/Intro_graph_induced_complex.h b/doc/Nerve_GIC/Intro_graph_induced_complex.h
new file mode 100644
index 00000000..2b648425
--- /dev/null
+++ b/doc/Nerve_GIC/Intro_graph_induced_complex.h
@@ -0,0 +1,186 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Mathieu Carriere
+ *
+ * Copyright (C) 2017 INRIA
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef DOC_COVER_COMPLEX_INTRO_COVER_COMPLEX_H_
+#define DOC_COVER_COMPLEX_INTRO_COVER_COMPLEX_H_
+
+namespace Gudhi {
+
+namespace cover_complex {
+
+/** \defgroup cover_complex Cover complex
+ *
+ * \author Mathieu Carrière
+ *
+ * @{
+ *
+ * Visualizations of the simplicial complexes can be done with either
+ * neato (from <a target="_blank" href="http://www.graphviz.org/">graphviz</a>),
+ * <a target="_blank" href="http://www.geomview.org/">geomview</a>,
+ * <a target="_blank" href="https://github.com/MLWave/kepler-mapper">KeplerMapper</a>.
+ * Input point clouds are assumed to be
+ * <a target="_blank" href="http://www.geomview.org/docs/html/OFF.html">OFF files</a>.
+ *
+ * \section covers Covers
+ *
+ * Nerves and Graph Induced Complexes require a cover C of the input point cloud P,
+ * that is a set of subsets of P whose union is P itself.
+ * Very often, this cover is obtained from the preimage of a family of intervals covering
+ * the image of some scalar-valued function f defined on P. This family is parameterized
+ * by its resolution, which can be either the number or the length of the intervals,
+ * and its gain, which is the overlap percentage between consecutive intervals (ordered by their first values).
+ *
+ * \section nerves Nerves
+ *
+ * \subsection nervedefinition Nerve definition
+ *
+ * Assume you are given a cover C of your point cloud P. Then, the Nerve of this cover
+ * is the simplicial complex that has one k-simplex per k-fold intersection of cover elements.
+ * See also <a target="_blank" href="https://en.wikipedia.org/wiki/Nerve_of_a_covering"> Wikipedia </a>.
+ *
+ * \image html "nerve.png" "Nerve of a double torus"
+ *
+ * \subsection nerveexample Example
+ *
+ * This example builds the Nerve of a point cloud sampled on a 3D human shape (human.off).
+ * The cover C comes from the preimages of intervals (10 intervals with gain 0.3)
+ * covering the height function (coordinate 2),
+ * which are then refined into their connected components using the triangulation of the .OFF file.
+ *
+ * \include Nerve_GIC/Nerve.cpp
+ *
+ * When launching:
+ *
+ * \code $> ./Nerve ../../data/points/human.off 2 10 0.3 -v
+ * \endcode
+ *
+ * the program output is:
+ *
+ * \include Nerve_GIC/Nerve.txt
+ *
+ * The program also writes a file ../../data/points/human_sc.txt. The first three lines in this file are the location
+ * of the input point cloud and the function used to compute the cover.
+ * The fourth line contains the number of vertices nv and edges ne of the Nerve.
+ * The next nv lines represent the vertices. Each line contains the vertex ID,
+ * the number of data points it contains, and their average color function value.
+ * Finally, the next ne lines represent the edges, characterized by the ID of their vertices.
+ *
+ * Using KeplerMapper, one can obtain the following visualization:
+ *
+ * \image html "nervevisu.jpg" "Visualization with KeplerMapper"
+ *
+ * \section gic Graph Induced Complexes (GIC)
+ *
+ * \subsection gicdefinition GIC definition
+ *
+ * Again, assume you are given a cover C of your point cloud P. Moreover, assume
+ * you are also given a graph G built on top of P. Then, for any clique in G
+ * whose nodes all belong to different elements of C, the GIC includes a corresponding
+ * simplex, whose dimension is the number of nodes in the clique minus one.
+ * See \cite Dey13 for more details.
+ *
+ * \image html "GIC.jpg" "GIC of a point cloud."
+ *
+ * \subsection gicexamplevor Example with cover from Voronoï
+ *
+ * This example builds the GIC of a point cloud sampled on a 3D human shape (human.off).
+ * We randomly subsampled 100 points in the point cloud, which act as seeds of
+ * a geodesic Voronoï diagram. Each cell of the diagram is then an element of C.
+ * The graph G (used to compute both the geodesics for Voronoï and the GIC)
+ * comes from the triangulation of the human shape. Note that the resulting simplicial complex is in dimension 3
+ * in this example.
+ *
+ * \include Nerve_GIC/VoronoiGIC.cpp
+ *
+ * When launching:
+ *
+ * \code $> ./VoronoiGIC ../../data/points/human.off 700 -v
+ * \endcode
+ *
+ * the program outputs SC.off. Using e.g.
+ *
+ * \code $> geomview ../../data/points/human_sc.off
+ * \endcode
+ *
+ * one can obtain the following visualization:
+ *
+ * \image html "gicvoronoivisu.jpg" "Visualization with Geomview"
+ *
+ * \subsection functionalGICdefinition Functional GIC
+ *
+ * If one restricts to the cliques in G whose nodes all belong to preimages of consecutive
+ * intervals (assuming the cover of the height function is minimal, i.e. no more than
+ * two intervals can intersect at a time), the GIC is of dimension one, i.e. a graph.
+ * We call this graph the functional GIC. See \cite Carriere16 for more details.
+ *
+ * \subsection functionalGICexample Example
+ *
+ * Functional GIC comes with automatic selection of the Rips threshold,
+ * the resolution and the gain of the function cover. See \cite Carriere17c for more details. In this example,
+ * we compute the functional GIC of a Klein bottle embedded in R^5,
+ * where the graph G comes from a Rips complex with automatic threshold,
+ * and the cover C comes from the preimages of intervals covering the first coordinate,
+ * with automatic resolution and gain. Note that automatic threshold, resolution and gain
+ * can be computed as well for the Nerve.
+ *
+ * \include Nerve_GIC/CoordGIC.cpp
+ *
+ * When launching:
+ *
+ * \code $> ./CoordGIC ../../data/points/KleinBottle5D.off 0 -v
+ * \endcode
+ *
+ * the program outputs SC.dot. Using e.g.
+ *
+ * \code $> neato SC.dot -Tpdf -o SC.pdf
+ * \endcode
+ *
+ * one can obtain the following visualization:
+ *
+ * \image html "coordGICvisu2.jpg" "Visualization with Neato"
+ *
+ * where nodes are colored by the filter function values and, for each node, the first number is its ID
+ * and the second is the number of data points that its contain.
+ *
+ * We also provide an example on a set of 72 pictures taken around the same object (lucky_cat.off).
+ * The function is now the first eigenfunction given by PCA, whose values
+ * are written in a file (lucky_cat_PCA1). Threshold, resolution and gain are automatically selected as before.
+ *
+ * \include Nerve_GIC/FuncGIC.cpp
+ *
+ * When launching:
+ *
+ * \code $> ./FuncGIC ../../data/points/COIL_database/lucky_cat.off ../../data/points/COIL_database/lucky_cat_PCA1 -v
+ * \endcode
+ *
+ * the program outputs again SC.dot which gives the following visualization after using neato:
+ *
+ * \image html "funcGICvisu.jpg" "Visualization with neato"
+ *
+ */
+/** @} */ // end defgroup cover_complex
+
+} // namespace cover_complex
+
+} // namespace Gudhi
+
+#endif // DOC_COVER_COMPLEX_INTRO_COVER_COMPLEX_H_
diff --git a/doc/Nerve_GIC/coordGICvisu.pdf b/doc/Nerve_GIC/coordGICvisu.pdf
new file mode 100644
index 00000000..313aa1b5
--- /dev/null
+++ b/doc/Nerve_GIC/coordGICvisu.pdf
Binary files differ
diff --git a/doc/Nerve_GIC/coordGICvisu2.jpg b/doc/Nerve_GIC/coordGICvisu2.jpg
new file mode 100644
index 00000000..046feb2a
--- /dev/null
+++ b/doc/Nerve_GIC/coordGICvisu2.jpg
Binary files differ
diff --git a/doc/Nerve_GIC/funcGICvisu.jpg b/doc/Nerve_GIC/funcGICvisu.jpg
new file mode 100644
index 00000000..36b64dde
--- /dev/null
+++ b/doc/Nerve_GIC/funcGICvisu.jpg
Binary files differ
diff --git a/doc/Nerve_GIC/funcGICvisu.pdf b/doc/Nerve_GIC/funcGICvisu.pdf
new file mode 100644
index 00000000..d7456cd3
--- /dev/null
+++ b/doc/Nerve_GIC/funcGICvisu.pdf
Binary files differ
diff --git a/doc/Nerve_GIC/gicvisu.jpg b/doc/Nerve_GIC/gicvisu.jpg
new file mode 100644
index 00000000..576dae47
--- /dev/null
+++ b/doc/Nerve_GIC/gicvisu.jpg
Binary files differ
diff --git a/doc/Nerve_GIC/gicvoronoivisu.jpg b/doc/Nerve_GIC/gicvoronoivisu.jpg
new file mode 100644
index 00000000..cd86c411
--- /dev/null
+++ b/doc/Nerve_GIC/gicvoronoivisu.jpg
Binary files differ
diff --git a/doc/Nerve_GIC/nerve.png b/doc/Nerve_GIC/nerve.png
new file mode 100644
index 00000000..b66da4a4
--- /dev/null
+++ b/doc/Nerve_GIC/nerve.png
Binary files differ
diff --git a/doc/Nerve_GIC/nervevisu.jpg b/doc/Nerve_GIC/nervevisu.jpg
new file mode 100644
index 00000000..67ae1d7e
--- /dev/null
+++ b/doc/Nerve_GIC/nervevisu.jpg
Binary files differ
diff --git a/doc/Persistence_representations/Persistence_representations_doc.h b/doc/Persistence_representations/Persistence_representations_doc.h
new file mode 100644
index 00000000..38bd3a21
--- /dev/null
+++ b/doc/Persistence_representations/Persistence_representations_doc.h
@@ -0,0 +1,259 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA Sophia-Saclay (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef DOC_GUDHI_STAT_H_
+#define DOC_GUDHI_STAT_H_
+
+namespace Gudhi {
+
+namespace Persistence_representations {
+
+/** \defgroup Persistence_representations Persistence representations
+ *
+ * \author Pawel Dlotko
+ *
+ * @{
+ *\section Persistence_representations_idea Idea
+
+ In order to perform most of the statistical tests and machine learning algorithms on a data one need to be able to
+ perform only a very limited number of operations on them. Let us fix a representation of
+ data of a type A. To perform most of the statistical and machine learning operations one need to be able to compute
+ average of objects of type A (so that the averaged object is also of a type A), to
+ compute distance between objects of a type A, to vectorize object of a type A and to compute scalar product of a pair
+ objects of a type A.
+
+ To put this statement into a context, let us assume we have two collections \f$ c_1,\ldots,c_n\f$ and
+ \f$d_1,...,d_n\f$ of objects of a type A. We want to verify if the average of those two collections
+ are different by performing a permutation test.
+ First of all, we compute averages of those two collections: C average of \f$ c_1,\ldots,c_n \f$ and D average of
+ \f$d_1,\ldots,d_n\f$. Note that both C and D are of a type A. Then we compute \f$d(C,D)\f$,
+ a distance between C and D.
+ Later we put the two collections into one bin:
+ \f[B = \{ c_1,...,c_n,d_1,...,d_n \}\f]
+ Then we shuffle B, and we divide the shuffled version of B into two classes: \f$B_1\f$ and \f$B_2\f$ (in this case, of
+ the same cardinality). Then we compute averages \f$\hat{B_1}\f$ and \f$\hat{B_2}\f$
+ of elements in \f$B_1\f$ and \f$B_2\f$. Note that again, \f$\hat{B_1}\f$ and \f$\hat{B_2}\f$ are of a type A.
+ Then we compute their distance \f$d(\hat{B_1},\hat{B_2})\f$. The procedure of shuffling and dividing the set \f$B\f$
+ is repeated \f$N\f$ times (where \f$N\f$ is reasonably large number).
+ Then the p-value of a statement that the averages of \f$c_1,...,c_n\f$ and \f$d_1,...,d_n\f$ is approximated by the
+ number of times \f$d(\hat{B_1},\hat{B_2}) > d(C,D)\f$ divided by \f$N\f$.
+
+ The permutation test reminded above can be performed for any type A which can be averaged, and which allows for
+ computations of distances.
+
+ The Persistence\_representations contains a collection of various representations of persistent homology that
+ implements various concepts described below:
+
+ \li Concept of a representation of persistence that allows averaging (so that the average object is of the same type).
+ \li Concept of representation of persistence that allows computations of distances.
+ \li Concept of representation of persistence that allows computations of scalar products.
+ \li Concept of representation of persistence that allows vectorization.
+ \li Concept of representation of persistence that allows computations of real-valued characteristics of objects.
+
+
+ At the moment an implementation of the following representations of persistence are available (further details of
+ those representations will be discussed later):
+
+ \li Exact persistence landscapes (allow averaging, computation of distances, scalar products, vectorizations and real
+ value characteristics).
+ \li Persistence landscapes on a grid (allow averaging, computation of distances scalar products, vectorizations and
+ real value characteristics).
+ \li Persistence heat maps – various representations where one put some weighted or not Gaussian kernel for each point
+ of diagram (allow averaging, computation of distances, scalar products,
+ vectorizations and real value characteristics).
+ \li Persistence vectors (allow averaging, computation of distances, scalar products, vectorizations and real value
+ characteristics).
+ \li Persistence diagrams / barcodes (allow computation of distances, vectorizations and real value characteristics).
+
+
+ Note that at the while functionalities like averaging, distances and scalar products are fixed, there is no canonical
+ way of vectorizing and computing real valued characteristics of objects. Therefore the
+ vectorizations and computation of real value characteristics procedures are quite likely to evolve in the furthering
+ versions of the library.
+
+ The main aim of this implementation is to be able to implement various statistical methods, both on the level of C++
+ and on the level of python. The methods will operate on the functionalities offered
+ by concepts. That means that the statistical and ML methods will be able to operate on any representation that
+ implement the required concept (including the ones that are not in the library at the moment).
+ That gives provides a framework, that is very easy to extend, for topological statistics.
+
+ Below we are discussing the representations which are currently implemented in Persistence\_representations package:
+
+ \section sec_persistence_landscapes Persistence Landscapes
+ <b>Reference manual:</b> \ref Gudhi::Persistence_representations::Persistence_landscape <br>
+ Persistence landscapes were originally proposed by Bubenik in \cite bubenik_landscapes_2015. Efficient algorithms to
+ compute them rigorously were proposed by Bubenik and Dlotko in \cite bubenik_dlotko_landscapes_2016. The idea of
+ persistence landscapes is shortly summarized in below.
+
+ To begin with, suppose we are given a point \f$(b,d) \in \mathbb{R}^2\f$ in a
+ persistence diagram. With this point, we associate a piecewise
+ linear function \f$f_{(b,d)} : \mathbb{R} \rightarrow [0,\infty)\f$, which is
+ defined as
+
+ \f[f_{(b,d)}(x) =
+ \left\{ \begin{array}{ccl}
+ 0 & \mbox{ if } & x \not\in (b, d) \; , \\
+ x - b & \mbox{ if } & x \in \left( b, \frac{b+d}{2}
+ \right] \; , \\
+ d - x & \mbox{ if } & x \in \left(\frac{b+d}{2},
+ d \right) \; .
+ \end{array} \right.
+ \f]
+
+ A persistence landscape of the birth-death
+ pairs \f$(b_i , d_i)\f$, where \f$i = 1,\ldots,m\f$, which constitute the given
+ persistence diagram is the sequence of functions \f$\lambda_k : \mathbb{R} \rightarrow [0,\infty)\f$ for \f$k \in
+ \mathbb{N}\f$, where \f$\lambda_k(x)\f$
+ denotes the \f$k^{\rm th}\f$ largest value of the numbers \f$f_{(b_i,d_i)}(x)\f$,
+ for \f$i = 1, \ldots, m\f$, and we define \f$\lambda_k(x) = 0\f$ if \f$k > m\f$.
+ Equivalently, this sequence of functions can be combined into a single
+ function \f$L : \mathbb{N} \times \mathbb{R} \to [0,\infty)\f$ of two
+ variables, if we define \f$L(k,t) = \lambda_k(t)\f$.
+
+ The detailed description of algorithms used to compute persistence landscapes can be found in
+ \cite bubenik_dlotko_landscapes_2016.
+ Note that this implementation provides exact representation of landscapes. That have many advantages, but also a few
+ drawbacks. For instance, as discussed
+ in \cite bubenik_dlotko_landscapes_2016, the exact representation of landscape may be of quadratic size with respect
+ to the input persistence diagram. It may therefore happen
+ that, for very large diagrams, using this representation may be memory--prohibitive. In such a case, there are two
+ possible ways to proceed:
+
+ \li Use non exact representation on a grid described in the Section \ref sec_landscapes_on_grid.
+ \li Compute just a number of initial nonzero landscapes. This option is available from C++ level as a last parameter of
+ the constructor of persistence landscape (set by default to std::numeric_limits<size_t>::max()).
+
+
+
+ \section sec_landscapes_on_grid Persistence Landscapes on a grid
+ <b>Reference manual:</b> \ref Gudhi::Persistence_representations::Persistence_landscape_on_grid <br>
+ This is an alternative, not--exact, representation of persistence landscapes defined in the Section \ref
+ sec_persistence_landscapes. Unlike in the Section \ref sec_persistence_landscapes we build a
+ representation of persistence landscape by sampling its values on a finite, equally distributed grid of points.
+ Since, the persistence landscapes that originate from persistence diagrams have slope \f$1\f$ or \f$-1\f$, we have an
+ estimate of a region between the grid points where the landscape cab be located.
+ That allows to estimate an error make when performing various operations on landscape. Note that for average
+ landscapes the slope is in range \f$[-1,1]\f$ and similar estimate can be used.
+
+ Due to a lack of rigorous description of the algorithms to deal with this non--rigorous representation of persistence
+ landscapes in the literature, we are providing a short discussion of them in below.
+
+ Let us assume that we want to compute persistence landscape on a interval \f$[x,y]\f$. Let us assume that we want to
+ use \f$N\f$ grid points for that purpose.
+ Then we will sample the persistence landscape on points \f$x_1 = x , x_2 = x + \frac{y-x}{N}, \ldots , x_{N} = y\f$.
+ Persistence landscapes are represented as a vector of
+ vectors of real numbers. Assume that i-th vector consist of \f$n_i\f$ numbers sorted from larger to smaller. They
+ represent the values of the functions
+ \f$\lambda_1,\ldots,\lambda_{n_i}\f$ ,\f$\lambda_{n_i+1}\f$ and the functions with larger indices are then zero
+ functions) on the i-th point of a grid, i.e. \f$x + i \frac{y-x}{N}\f$.
+
+ When averaging two persistence landscapes represented by a grid we need to make sure that they are defined in a
+ compatible grids. I.e. the intervals \f$[x,y]\f$ on which they are defined are
+ the same, and the numbers of grid points \f$N\f$ are the same in both cases. If this is the case, we simply compute
+ point-wise averages of the entries of corresponding
+ vectors (In this whole section we assume that if one vector of numbers is shorter than another, we extend the shorter
+ one with zeros so that they have the same length.)
+
+ Computations of distances between two persistence landscapes on a grid is not much different than in the rigorous
+ case. In this case, we sum up the distances between the same levels of
+ corresponding landscapes. For fixed level, we approximate the landscapes between the corresponding constitutive
+ points of landscapes by linear functions, and compute the \f$L^p\f$ distance between them.
+
+ Similarly as in case of distance, when computing the scalar product of two persistence landscapes on a grid, we sum up
+ the scalar products of corresponding levels of landscapes. For each level,
+ we assume that the persistence landscape on a grid between two grid points is approximated by linear function.
+ Therefore to compute scalar product of two corresponding levels of landscapes,
+ we sum up the integrals of products of line segments for every pair of constitutive grid points.
+
+ Note that for this representation we need to specify a few parameters:
+
+ \li Begin and end point of a grid -- the interval \f$[x,y]\f$ (real numbers).
+ \li Number of points in a grid (positive integer \f$N\f$).
+
+
+ Note that the same representation is used in TDA R-package \cite Fasy_Kim_Lecci_Maria_tda.
+
+ \section sec_persistence_heat_maps Persistence heat maps
+ <b>Reference manual:</b> \ref Gudhi::Persistence_representations::Persistence_heat_maps <br>
+ This is a general class of discrete structures which are based on idea of placing a kernel in the points of
+ persistence diagrams.
+ This idea appeared in work by many authors over the last 15 years. As far as we know this idea was firstly described
+ in the work of Bologna group in \cite Ferri_Frosini_comparision_sheme_1 and \cite Ferri_Frosini_comparision_sheme_2.
+ Later it has been described by Colorado State University group in \cite Persistence_Images_2017. The presented paper
+ in the first time provide a discussion of stability of the representation.
+ Also, the same ideas are used in construction of two recent kernels used for machine learning:
+ \cite Kusano_Fukumizu_Hiraoka_PWGK and \cite Reininghaus_Huber_ALL_PSSK. Both the kernel's construction uses
+ interesting ideas to ensure stability of the representation with respect to Wasserstein metric. In the kernel
+ presented in \cite Kusano_Fukumizu_Hiraoka_PWGK, a scaling function is used to multiply the Gaussian kernel in the
+ way that the points close to diagonal got low weight and consequently do not have a big influence on the resulting
+ distribution. In \cite Reininghaus_Huber_ALL_PSSK for every point \f$(b,d)\f$ two Gaussian kernels
+ are added: first, with a weight 1 in a point \f$(b,d)\f$, and the second, with the weight -1 for a point \f$(b,d)\f$.
+ In both cases, the representations are stable with respect to 1-Wasserstein distance.
+
+ In Persistence\_representations package we currently implement a discretization of the distributions described above.
+ The base of this implementation is 2-dimensional array of pixels. Each pixel have assigned a real value which
+ is a sum of values of distributions induced by each point of the persistence diagram. At the moment we compute the
+ sum of values on a center of a pixels. It can be easily extended to any other function
+ (like for instance sum of integrals of the intermediate distribution on a pixel).
+
+ The parameters that determine the structure are the following:
+
+ \li A positive integer k determining the size of the kernel we used (we always assume that the kernels are square).
+ \li A filter: in practice a square matrix of a size \f$2k+1 \times 2k+1\f$. By default, this is a discretization of
+ N(0,1) kernel.
+ \li The box \f$[x_0,x_1]\times [y_0,y_1]\f$ bounding the domain of the persistence image.
+ \li Scaling function. Each Gaussian kernel at point \f$(p,q)\f$ gets multiplied by the value of this function at the
+ point \f$(p,q)\f$.
+ \li A boolean value determining if the space below diagonal should be erased or not. To be precise: when points close
+ to diagonal are given then sometimes the kernel have support that reaches the region
+ below the diagonal. If the value of this parameter is true, then the values below diagonal can be erased.
+
+
+ \section sec_persistence_vectors Persistence vectors
+ <b>Reference manual:</b> \ref Gudhi::Persistence_representations::Vector_distances_in_diagram <br>
+ This is a representation of persistent homology in a form of a vector which was designed for an application in 3d
+ graphic in \cite Carriere_Oudot_Ovsjanikov_top_signatures_3d. Below we provide a short description of this
+ representation.
+
+ Given a persistence diagram \f$D = \{ (b_i,d_i) \}\f$, for every pair of birth--death points \f$(b_1,d_1)\f$ and
+ \f$(b_2,d_2)\f$ we compute the following three distances:
+
+ \li \f$d( (b_1,d_1) , (b_2,d_2) )\f$.
+ \li \f$d( (b_1,d_1) , (\frac{b_1,d_1}{2},\frac{b_1,d_1}{2}) )\f$.
+ \li \f$d( (b_2,d_2) , (\frac{b_2,d_2}{2},\frac{b_2,d_2}{2}) )\f$.
+
+ We pick the smallest of those and add it to a vector. The obtained vector of numbers is then sorted in decreasing
+ order. This way we obtain a persistence vector representing the diagram.
+
+ Given two persistence vectors, the computation of distances, averages and scalar products is straightforward. Average
+ is simply a coordinate-wise average of a collection of vectors. In this section we
+ assume that the vectors are extended by zeros if they are of a different size. To compute distances we compute
+ absolute value of differences between coordinates. A scalar product is a sum of products of
+ values at the corresponding positions of two vectors.
+
+ */
+/** @} */ // end defgroup Persistence_representations
+
+} // namespace Persistence_representations
+} // namespace Gudhi
+
+#endif // Persistence_representations
diff --git a/doc/Persistence_representations/average_landscape.png b/doc/Persistence_representations/average_landscape.png
new file mode 100644
index 00000000..ea59926b
--- /dev/null
+++ b/doc/Persistence_representations/average_landscape.png
Binary files differ
diff --git a/doc/Persistent_cohomology/Intro_persistent_cohomology.h b/doc/Persistent_cohomology/Intro_persistent_cohomology.h
index 6400116b..4dbe82c7 100644
--- a/doc/Persistent_cohomology/Intro_persistent_cohomology.h
+++ b/doc/Persistent_cohomology/Intro_persistent_cohomology.h
@@ -143,8 +143,8 @@ namespace persistent_cohomology {
We provide several example files: run these examples with -h for details on their use, and read the README file.
-\li <a href="_persistent_cohomology_2rips_persistence_8cpp-example.html">
-Persistent_cohomology/rips_persistence.cpp</a> computes the Rips complex of a point cloud and outputs its persistence
+\li <a href="_rips_complex_2rips_persistence_8cpp-example.html">
+Rips_complex/rips_persistence.cpp</a> computes the Rips complex of a point cloud and outputs its persistence
diagram.
\code $> ./rips_persistence ../../data/points/tore3D_1307.off -r 0.25 -m 0.5 -d 3 -p 3 \endcode
\code The complex contains 177838 simplices
@@ -158,44 +158,44 @@ diagram.
Persistent_cohomology/rips_multifield_persistence.cpp</a> computes the Rips complex of a point cloud and outputs its
persistence diagram with a family of field coefficients.
-\li <a href="_persistent_cohomology_2rips_distance_matrix_persistence_8cpp-example.html">
-Persistent_cohomology/rips_distance_matrix_persistence.cpp</a> computes the Rips complex of a distance matrix and
+\li <a href="_rips_complex_2rips_distance_matrix_persistence_8cpp-example.html">
+Rips_complex/rips_distance_matrix_persistence.cpp</a> computes the Rips complex of a distance matrix and
outputs its persistence diagram.
-\li <a href="_persistent_cohomology_2alpha_complex_3d_persistence_8cpp-example.html">
-Persistent_cohomology/alpha_complex_3d_persistence.cpp</a> computes the persistent homology with
+\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
2 1 0.0934117 1.00003
2 2 0.56444 1.03938 \endcode
-\li <a href="_persistent_cohomology_2exact_alpha_complex_3d_persistence_8cpp-example.html">
-Persistent_cohomology/exact_alpha_complex_3d_persistence.cpp</a> computes the persistent homology with
+\li <a href="_alpha_complex_2exact_alpha_complex_3d_persistence_8cpp-example.html">
+Alpha_complex/exact_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.
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
-\li <a href="_persistent_cohomology_2weighted_alpha_complex_3d_persistence_8cpp-example.html">
-Persistent_cohomology/weighted_alpha_complex_3d_persistence.cpp</a> computes the persistent homology with
+\li <a href="_alpha_complex_2weighted_alpha_complex_3d_persistence_8cpp-example.html">
+Alpha_complex/weighted_alpha_complex_3d_persistence.cpp</a> computes the persistent homology with
\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
2 1 -0.906588 2.60165e-05
2 2 -0.43556 0.0393798 \endcode
-\li <a href="_persistent_cohomology_2alpha_complex_persistence_8cpp-example.html">
-Persistent_cohomology/alpha_complex_persistence.cpp</a> computes the persistent homology with
+\li <a href="_alpha_complex_2alpha_complex_persistence_8cpp-example.html">
+Alpha_complex/alpha_complex_persistence.cpp</a> computes the persistent homology with
\f$\mathbb{Z}/p\mathbb{Z}\f$ coefficients of the alpha complex on points sampling from an OFF file.
\code $> ./alpha_complex_persistence -r 32 -p 2 -m 0.45 ../../data/points/tore3D_300.off \endcode
\code Alpha complex is of dimension 3 - 9273 simplices - 300 vertices.
@@ -205,11 +205,13 @@ Simplex_tree dim: 3
2 1 0.0934117 1.00003
2 2 0.56444 1.03938 \endcode
-\li <a href="_persistent_cohomology_2periodic_alpha_complex_3d_persistence_8cpp-example.html">
-Persistent_cohomology/periodic_alpha_complex_3d_persistence.cpp</a> computes the persistent homology with
+\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,11 +223,31 @@ 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.
- \copyright GNU General Public License v3.
*/
} // namespace persistent_cohomology
diff --git a/doc/Rips_complex/Intro_rips_complex.h b/doc/Rips_complex/Intro_rips_complex.h
index 124dfec9..8c517516 100644
--- a/doc/Rips_complex/Intro_rips_complex.h
+++ b/doc/Rips_complex/Intro_rips_complex.h
@@ -146,8 +146,6 @@ namespace rips_complex {
*
* \include Rips_complex/full_skeleton_rips_for_doc.txt
*
- * \copyright GNU General Public License v3.
- * \verbatim Contact: gudhi-users@lists.gforge.inria.fr \endverbatim
*/
/** @} */ // end defgroup rips_complex
diff --git a/doc/Simplex_tree/Intro_simplex_tree.h b/doc/Simplex_tree/Intro_simplex_tree.h
index f5b72ff6..6b80d1c9 100644
--- a/doc/Simplex_tree/Intro_simplex_tree.h
+++ b/doc/Simplex_tree/Intro_simplex_tree.h
@@ -67,16 +67,18 @@ Information of the Simplex Tree:
Number of vertices = 10 Number of simplices = 98 \endcode
*
* \li <a href="_simplex_tree_2example_alpha_shapes_3_simplex_tree_from_off_file_8cpp-example.html">
- * Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp</a> - Simplex tree is computed and displayed from a 3D alpha
- * complex (Requires CGAL, GMP and GMPXX to be installed)
- *
+ * Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp</a> - Simplex tree is computed and displayed
+ * from a 3D alpha complex (Requires CGAL, GMP and GMPXX to be installed).
*
+ * \li <a href="_simplex_tree_2graph_expansion_with_blocker_8cpp-example.html">
+ * Simplex_tree/graph_expansion_with_blocker.cpp</a> - Simple simplex tree construction from a one-skeleton graph with
+ * a simple blocker expansion method.
+ *
* \subsection filteredcomplexeshassecomplex Hasse complex
* The second one is the Hasse_complex. The Hasse complex is a data structure representing explicitly all co-dimension
* 1 incidence relations in a complex. It is consequently faster when accessing the boundary of a simplex, but is less
* compact and harder to construct from scratch.
*
- * \copyright GNU General Public License v3.
* @}
*/
diff --git a/doc/Spatial_searching/Intro_spatial_searching.h b/doc/Spatial_searching/Intro_spatial_searching.h
index 1ee5e92e..52ed65e4 100644
--- a/doc/Spatial_searching/Intro_spatial_searching.h
+++ b/doc/Spatial_searching/Intro_spatial_searching.h
@@ -50,8 +50,6 @@ namespace spatial_searching {
*
* \include Spatial_searching/example_spatial_searching.cpp
*
- * \copyright GNU General Public License v3.
- * \verbatim Contact: gudhi-users@lists.gforge.inria.fr \endverbatim
*/
/** @} */ // end defgroup spatial_searching
diff --git a/doc/Subsampling/Intro_subsampling.h b/doc/Subsampling/Intro_subsampling.h
index c84616dd..ab9cdc37 100644
--- a/doc/Subsampling/Intro_subsampling.h
+++ b/doc/Subsampling/Intro_subsampling.h
@@ -58,8 +58,6 @@ namespace subsampling {
* This example outputs a subset of 100 points picked randomly.
*
* \include Subsampling/example_pick_n_random_points.cpp
- * \copyright GNU General Public License v3.
- * \verbatim Contact: gudhi-users@lists.gforge.inria.fr \endverbatim
*/
/** @} */ // end defgroup subsampling
diff --git a/doc/Tangential_complex/Intro_tangential_complex.h b/doc/Tangential_complex/Intro_tangential_complex.h
index 3d687c1d..00e00c52 100644
--- a/doc/Tangential_complex/Intro_tangential_complex.h
+++ b/doc/Tangential_complex/Intro_tangential_complex.h
@@ -107,8 +107,6 @@ dimensions are known at compile-time.
\include Tangential_complex/example_with_perturb.cpp
-\copyright GNU General Public License v3.
-\verbatim Contact: gudhi-users@lists.gforge.inria.fr \endverbatim
*/
/** @} */ // end defgroup tangential_complex
diff --git a/doc/Witness_complex/Witness_complex_doc.h b/doc/Witness_complex/Witness_complex_doc.h
index 171a185f..62203054 100644
--- a/doc/Witness_complex/Witness_complex_doc.h
+++ b/doc/Witness_complex/Witness_complex_doc.h
@@ -90,8 +90,9 @@ int main(int argc, char * const argv[]) {
Gudhi::Points_off_reader<Point_d> off_reader(file_name);
point_vector = Point_vector(off_reader.get_point_cloud());
- // Choose landmarks
- Gudhi::subsampling::pick_n_random_points(point_vector, nbL, std::back_inserter(landmarks));
+ // Choose landmarks (one can choose either of the two methods below)
+ // Gudhi::subsampling::pick_n_random_points(point_vector, nbL, std::back_inserter(landmarks));
+ Gudhi::subsampling::choose_n_farthest_points(K(), point_vector, nbL, Gudhi::subsampling::random_starting_point, std::back_inserter(landmarks));
// Compute witness complex
Witness_complex witness_complex(landmarks,
@@ -107,10 +108,14 @@ int main(int argc, char * const argv[]) {
Here is an example of constructing a strong witness complex filtration and computing persistence on it:
- \include Witness_complex/example_strong_witness_persistence.cpp
+ \include Witness_complex/strong_witness_persistence.cpp
- \copyright GNU General Public License v3.
+ \section witnessexample3 Example3: Computing relaxed witness complex persistence from a distance matrix
+ In this example we compute the relaxed witness complex persistence from a given matrix of closest landmarks to each witness.
+ Each landmark is given as the couple (index, distance).
+
+ \include Witness_complex/example_nearest_landmark_table.cpp
*/
diff --git a/doc/common/examples.h b/doc/common/examples.h
new file mode 100644
index 00000000..40f202c7
--- /dev/null
+++ b/doc/common/examples.h
@@ -0,0 +1,99 @@
+// List of GUDHI examples - Doxygen needs at least a file tag to analyse comments
+// In user_version, `find . -name "*.cpp"` in example and utilities folders
+/*! @file Examples
+ * @example Alpha_complex/Alpha_complex_from_off.cpp
+ * @example Alpha_complex/Alpha_complex_from_points.cpp
+ * @example Bottleneck_distance/bottleneck_basic_example.cpp
+ * @example Bottleneck_distance/alpha_rips_persistence_bottleneck_distance.cpp
+ * @example Witness_complex/example_nearest_landmark_table.cpp
+ * @example Witness_complex/example_witness_complex_off.cpp
+ * @example Witness_complex/example_witness_complex_sphere.cpp
+ * @example Witness_complex/example_strong_witness_complex_off.cpp
+ * @example Simplex_tree/mini_simplex_tree.cpp
+ * @example Simplex_tree/graph_expansion_with_blocker.cpp
+ * @example Simplex_tree/simple_simplex_tree.cpp
+ * @example Simplex_tree/simplex_tree_from_cliques_of_graph.cpp
+ * @example Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp
+ * @example Simplex_tree/cech_complex_cgal_mini_sphere_3d.cpp
+ * @example Persistent_cohomology/plain_homology.cpp
+ * @example Persistent_cohomology/persistence_from_file.cpp
+ * @example Persistent_cohomology/rips_persistence_step_by_step.cpp
+ * @example Persistent_cohomology/rips_persistence_via_boundary_matrix.cpp
+ * @example Persistent_cohomology/custom_persistence_sort.cpp
+ * @example Persistent_cohomology/persistence_from_simple_simplex_tree.cpp
+ * @example Persistent_cohomology/rips_multifield_persistence.cpp
+ * @example Skeleton_blocker/Skeleton_blocker_from_simplices.cpp
+ * @example Skeleton_blocker/Skeleton_blocker_iteration.cpp
+ * @example Skeleton_blocker/Skeleton_blocker_link.cpp
+ * @example Contraction/Garland_heckbert.cpp
+ * @example Contraction/Rips_contraction.cpp
+ * @example Bitmap_cubical_complex/Random_bitmap_cubical_complex.cpp
+ * @example common/example_CGAL_3D_points_off_reader.cpp
+ * @example common/example_vector_double_points_off_reader.cpp
+ * @example common/example_CGAL_points_off_reader.cpp
+ * @example Rips_complex/example_one_skeleton_rips_from_distance_matrix.cpp
+ * @example Rips_complex/example_one_skeleton_rips_from_points.cpp
+ * @example Rips_complex/example_rips_complex_from_csv_distance_matrix_file.cpp
+ * @example Rips_complex/example_rips_complex_from_off_file.cpp
+ * @example Persistence_representations/persistence_intervals.cpp
+ * @example Persistence_representations/persistence_vectors.cpp
+ * @example Persistence_representations/persistence_heat_maps.cpp
+ * @example Persistence_representations/persistence_landscape_on_grid.cpp
+ * @example Persistence_representations/persistence_landscape.cpp
+ * @example Tangential_complex/example_basic.cpp
+ * @example Tangential_complex/example_with_perturb.cpp
+ * @example Subsampling/example_custom_kernel.cpp
+ * @example Subsampling/example_choose_n_farthest_points.cpp
+ * @example Subsampling/example_sparsify_point_set.cpp
+ * @example Subsampling/example_pick_n_random_points.cpp
+ * @example Nerve_GIC/CoordGIC.cpp
+ * @example Nerve_GIC/Nerve.cpp
+ * @example Nerve_GIC/FuncGIC.cpp
+ * @example Nerve_GIC/VoronoiGIC.cpp
+ * @example Spatial_searching/example_spatial_searching.cpp
+ * @example Alpha_complex/alpha_complex_3d_persistence.cpp
+ * @example Alpha_complex/alpha_complex_persistence.cpp
+ * @example Alpha_complex/weighted_periodic_alpha_complex_3d_persistence.cpp
+ * @example Alpha_complex/weighted_alpha_complex_3d_persistence.cpp
+ * @example Alpha_complex/periodic_alpha_complex_3d_persistence.cpp
+ * @example Alpha_complex/exact_alpha_complex_3d_persistence.cpp
+ * @example Bottleneck_distance/bottleneck_distance.cpp
+ * @example Witness_complex/weak_witness_persistence.cpp
+ * @example Witness_complex/strong_witness_persistence.cpp
+ * @example Bitmap_cubical_complex/cubical_complex_persistence.cpp
+ * @example Bitmap_cubical_complex/periodic_cubical_complex_persistence.cpp
+ * @example common/off_file_from_shape_generator.cpp
+ * @example Rips_complex/rips_distance_matrix_persistence.cpp
+ * @example Rips_complex/rips_persistence.cpp
+ * @example Persistence_representations/persistence_landscapes_on_grid/create_landscapes_on_grid.cpp
+ * @example Persistence_representations/persistence_landscapes_on_grid/plot_landscapes_on_grid.cpp
+ * @example Persistence_representations/persistence_landscapes_on_grid/compute_scalar_product_of_landscapes_on_grid.cpp
+ * @example Persistence_representations/persistence_landscapes_on_grid/compute_distance_of_landscapes_on_grid.cpp
+ * @example Persistence_representations/persistence_landscapes_on_grid/average_landscapes_on_grid.cpp
+ * @example Persistence_representations/persistence_intervals/compute_birth_death_range_in_persistence_diagram.cpp
+ * @example Persistence_representations/persistence_intervals/compute_number_of_dominant_intervals.cpp
+ * @example Persistence_representations/persistence_intervals/plot_persistence_Betti_numbers.cpp
+ * @example Persistence_representations/persistence_intervals/plot_persistence_intervals.cpp
+ * @example Persistence_representations/persistence_intervals/plot_histogram_of_intervals_lengths.cpp
+ * @example Persistence_representations/persistence_intervals/compute_bottleneck_distance.cpp
+ * @example Persistence_representations/persistence_heat_maps/create_pssk.cpp
+ * @example Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_arctan_of_their_persistence.cpp
+ * @example Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_squared_diag_distance.cpp
+ * @example Persistence_representations/persistence_heat_maps/compute_distance_of_persistence_heat_maps.cpp
+ * @example Persistence_representations/persistence_heat_maps/compute_scalar_product_of_persistence_heat_maps.cpp
+ * @example Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_distance_from_diagonal.cpp
+ * @example Persistence_representations/persistence_heat_maps/average_persistence_heat_maps.cpp
+ * @example Persistence_representations/persistence_heat_maps/plot_persistence_heat_map.cpp
+ * @example Persistence_representations/persistence_heat_maps/create_persistence_heat_maps.cpp
+ * @example Persistence_representations/persistence_vectors/plot_persistence_vectors.cpp
+ * @example Persistence_representations/persistence_vectors/compute_distance_of_persistence_vectors.cpp
+ * @example Persistence_representations/persistence_vectors/average_persistence_vectors.cpp
+ * @example Persistence_representations/persistence_vectors/create_persistence_vectors.cpp
+ * @example Persistence_representations/persistence_vectors/compute_scalar_product_of_persistence_vectors.cpp
+ * @example Persistence_representations/persistence_landscapes/average_landscapes.cpp
+ * @example Persistence_representations/persistence_landscapes/compute_scalar_product_of_landscapes.cpp
+ * @example Persistence_representations/persistence_landscapes/create_landscapes.cpp
+ * @example Persistence_representations/persistence_landscapes/compute_distance_of_landscapes.cpp
+ * @example Persistence_representations/persistence_landscapes/plot_landscapes.cpp
+ */
+
diff --git a/doc/common/file_formats.h b/doc/common/file_formats.h
index d715aa4d..c60ed15a 100644
--- a/doc/common/file_formats.h
+++ b/doc/common/file_formats.h
@@ -53,6 +53,72 @@ namespace Gudhi {
Such files can be generated with `Gudhi::persistent_cohomology::Persistent_cohomology::output_diagram()` and read with
`Gudhi::read_persistence_intervals_and_dimension()`, `Gudhi::read_persistence_intervals_grouped_by_dimension()` or
`Gudhi::read_persistence_intervals_in_dimension()`.
+
+
+ \section FileFormatsIsoCuboid Iso-cuboid
+
+ Such a file describes an iso-oriented cuboid with diagonal opposite vertices (min_x, min_y, min_z,...) and (max_x, max_y, max_z, ...). The format is:<br>
+ \verbatim
+ min_x min_y [min_z ...]
+ max_x max_y [max_z ...]
+ \endverbatim
+
+ Here is a simple sample file in the 3D case:
+ \verbatim
+ -1. -1. -1.
+ 1. 1. 1.
+ \endverbatim
+
+
+ \section FileFormatsPerseus Perseus
+
+ This file format is the format used by the Perseus software
+ (http://www.sas.upenn.edu/~vnanda/perseus/) by Vidit Nanda.
+ The first line contains a number d begin the dimension of the
+ bitmap (2 in the example below). Next d lines are the numbers of top dimensional cubes in each dimensions (3 and 3
+ in the example below). Next, in lexicographical order, the filtration of top dimensional cubes is given (1 4 6 8
+ 20 4 7 6 5 in the example below).
+
+ \image html "exampleBitmap.png" "Example of a input data."
+
+ The input file for the following complex is:
+ \verbatim
+ 2
+ 3
+ 3
+ 1
+ 4
+ 6
+ 8
+ 20
+ 4
+ 7
+ 6
+ 5
+ \endverbatim
+
+ To indicate periodic boundary conditions in a
+ given direction, then number of top dimensional cells in this direction have to be multiplied by -1. For instance:
+
+ \verbatim
+ 2
+ -3
+ 3
+ 1
+ 4
+ 6
+ 8
+ 20
+ 4
+ 7
+ 6
+ 5
+ \endverbatim
+
+ Indicate that we have imposed periodic boundary conditions in the direction x, but not in the direction y.
+
+ Other sample files can be found in the `data/bitmap` folder.
+
*/
} // namespace Gudhi
diff --git a/doc/common/footer.html b/doc/common/footer.html
index 7b4cdc5c..a557922b 100644
--- a/doc/common/footer.html
+++ b/doc/common/footer.html
@@ -6,24 +6,18 @@
<!--BEGIN PROJECT_NAME--> $projectname
<!--BEGIN PROJECT_NUMBER-->&#160;Version $projectnumber<!--END PROJECT_NUMBER-->
<!--BEGIN PROJECT_BRIEF-->&#160;-&#160;$projectbrief<!--END PROJECT_BRIEF-->
+<!--BEGIN PROJECT_BRIEF-->&#160;-&#160;Copyright : GPL v3<!--END PROJECT_BRIEF-->
<!--END PROJECT_NAME-->
</td>
<td class="network-entypo">
<!--BEGIN GENERATE_TREEVIEW-->
$generatedby
<a href="http://www.doxygen.org/index.html">
- <img class="footer" src="$relpath^doxygen.png" alt="doxygen"/></a> $doxygenversion
+ Doxygen</a> $doxygenversion
<!--END GENERATE_TREEVIEW-->
</td>
</tr>
</table>
-<!--BEGIN !GENERATE_TREEVIEW-->
-<hr class="footer"/><address class="footer"><small> tralala
-$generatedby &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/>
-</a> $doxygenversion
-</small></address>
-<!--END !GENERATE_TREEVIEW-->
</body>
</html>
diff --git a/doc/common/header.html b/doc/common/header.html
index 53b5c0a2..9c514381 100644
--- a/doc/common/header.html
+++ b/doc/common/header.html
@@ -56,6 +56,8 @@ $extrastylesheet
<ul class="dropdown">
<li><a href="http://gudhi.gforge.inria.fr/licensing/">Licensing</a></li>
<li><a href="https://gforge.inria.fr/frs/?group_id=3865" target="_blank">Get the sources</a></li>
+ <li><a href="https://gforge.inria.fr/frs/download.php/file/37113/GUDHI_2.0.0_OSX_UTILS.beta.tar.gz" target="_blank">Utils for Mac OSx</a></li>
+ <li><a href="https://gforge.inria.fr/frs/download.php/file/37112/GUDHI_2.0.0_WIN64_UTILS.beta.zip" target="_blank">Utils for Win x64</a></li>
</ul>
</li>
<li class="divider"></li>
@@ -66,6 +68,8 @@ $extrastylesheet
<li><a href="http://gudhi.gforge.inria.fr/doc/latest/installation.html">C++ installation manual</a></li>
<li><a href="http://gudhi.gforge.inria.fr/python/latest/">Python documentation</a></li>
<li><a href="http://gudhi.gforge.inria.fr/python/latest/installation.html">Python installation manual</a></li>
+ <li><a href="http://gudhi.gforge.inria.fr/utils/">Utilities</a></li>
+ <li><a href="http://bertrand.michel.perso.math.cnrs.fr/Enseignements/TDA-Gudhi-Python.html" target="_blank">Tutorial</a></li>
</ul>
</li>
<li class="divider"></li>
diff --git a/doc/common/installation.h b/doc/common/installation.h
new file mode 100644
index 00000000..25675cc5
--- /dev/null
+++ b/doc/common/installation.h
@@ -0,0 +1,263 @@
+/*! \page installation GUDHI installation
+ * \tableofcontents
+ * As GUDHI is a header only library, there is no need to install the library.
+ *
+ * Examples of GUDHI headers inclusion can be found in \ref demos.
+ *
+ * \section compiling Compiling
+ * The library uses c++11 and requires <a target="_blank" href="http://www.boost.org/">Boost</a> with version 1.48.0 or
+ * more recent. It is a multi-platform library and compiles on Linux, Mac OSX and Visual Studio 2015.
+ *
+ * \subsection demos Demos and examples
+ * To build the demos and examples, run the following commands in a terminal:
+\verbatim cd /path-to-gudhi/
+mkdir build
+cd build/
+cmake ..
+make \endverbatim
+ * A list of examples is available <a href="examples.html">here</a>.
+ *
+ * \subsection testsuites Test suites
+ * To test your build, run the following command in a terminal:
+ * \verbatim make test \endverbatim
+ *
+ * \subsection documentationgeneration Documentation
+ * To generate the documentation, <a target="_blank" href="http://www.doxygen.org/">Doxygen</a> is required.
+ * Run the following command in a terminal:
+\verbatim
+make doxygen
+# Documentation will be generated in the folder YYYY-MM-DD-hh-mm-ss_GUDHI_X.Y.Z/doc/html/
+# You can customize the directory name by calling `cmake -DUSER_VERSION_DIR=/my/custom/folder`
+\endverbatim
+ *
+ * \section optionallibrary Optional third-party library
+ * \subsection gmp GMP
+ * The multi-field persistent homology algorithm requires GMP which is a free library for arbitrary-precision
+ * arithmetic, operating on signed integers, rational numbers, and floating point numbers.
+ *
+ * The following example requires the <a target="_blank" href="http://gmplib.org/">GNU Multiple Precision Arithmetic
+ * Library</a> (GMP) and will not be built if GMP is not installed:
+ * \li <a href="_persistent_cohomology_2rips_multifield_persistence_8cpp-example.html">
+ * Persistent_cohomology/rips_multifield_persistence.cpp</a>
+ *
+ * Having GMP version 4.2 or higher installed is recommended.
+ *
+ * \subsection cgal CGAL
+ * The \ref alpha_complex data structure, \ref bottleneck_distance, and few examples requires CGAL, which is a C++
+ * library which provides easy access to efficient and reliable geometric algorithms.
+ *
+ * \note There is no need to install CGAL, you can just <CODE>cmake . && make</CODE> CGAL (or even
+ * <CODE>cmake -DCGAL_HEADER_ONLY=ON .</CODE> for CGAL version &ge; 4.8.0), thereafter you will be able to compile
+ * GUDHI by calling <CODE>cmake -DCGAL_DIR=/your/path/to/CGAL-X.Y .. && make</CODE>
+ *
+ * Having CGAL version 4.4.0 or higher installed is recommended. The procedure to install this library according to
+ * your operating system is detailed here http://doc.cgal.org/latest/Manual/installation.html
+ *
+ * The following examples/utilities require the <a target="_blank" href="http://www.cgal.org/">Computational Geometry Algorithms
+ * Library</a> (CGAL \cite cgal:eb-15b) and will not be built if CGAL is not installed:
+ * \li <a href="_alpha_complex_2alpha_complex_3d_persistence_8cpp-example.html">
+ * Alpha_complex/alpha_complex_3d_persistence.cpp</a>
+ * \li <a href="_alpha_complex_2exact_alpha_complex_3d_persistence_8cpp-example.html">
+ * Alpha_complex/exact_alpha_complex_3d_persistence.cpp</a>
+ * \li <a href="_alpha_complex_2weighted_alpha_complex_3d_persistence_8cpp-example.html">
+ * Alpha_complex/weighted_alpha_complex_3d_persistence.cpp</a>
+ * \li <a href="_simplex_tree_2example_alpha_shapes_3_simplex_tree_from_off_file_8cpp-example.html">
+ * Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp</a>
+ *
+ * The following examples/utilities require CGAL version &ge; 4.6.0:
+ * \li <a href="_witness_complex_2strong_witness_persistence_8cpp-example.html">
+ * Witness_complex/strong_witness_persistence.cpp</a>
+ * \li <a href="_witness_complex_2weak_witness_persistence_8cpp-example.html">
+ * Witness_complex/weak_witness_persistence.cpp</a>
+ * \li <a href="_witness_complex_2example_strong_witness_complex_off_8cpp-example.html">
+ * Witness_complex/example_strong_witness_complex_off.cpp</a>
+ * \li <a href="_witness_complex_2example_witness_complex_off_8cpp-example.html">
+ * Witness_complex/example_witness_complex_off.cpp</a>
+ * \li <a href="_witness_complex_2example_witness_complex_sphere_8cpp-example.html">
+ * Witness_complex/example_witness_complex_sphere.cpp</a>
+ *
+ * The following example requires CGAL version &ge; 4.7.0:
+ * \li <a href="_alpha_complex_2_alpha_complex_from_off_8cpp-example.html">
+ * Alpha_complex/Alpha_complex_from_off.cpp</a>
+ * \li <a href="_alpha_complex_2_alpha_complex_from_points_8cpp-example.html">
+ * Alpha_complex/Alpha_complex_from_points.cpp</a>
+ * \li <a href="_alpha_complex_2alpha_complex_persistence_8cpp-example.html">
+ * Alpha_complex/alpha_complex_persistence.cpp</a>
+ * \li <a href="_alpha_complex_2periodic_alpha_complex_3d_persistence_8cpp-example.html">
+ * Alpha_complex/periodic_alpha_complex_3d_persistence.cpp</a>
+ * \li <a href="_persistent_cohomology_2custom_persistence_sort_8cpp-example.html">
+ * Persistent_cohomology/custom_persistence_sort.cpp</a>
+ *
+ * The following example requires CGAL version &ge; 4.8.1:
+ * \li <a href="_bottleneck_distance_2alpha_rips_persistence_bottleneck_distance_8cpp-example.html">
+ * Bottleneck_distance/alpha_rips_persistence_bottleneck_distance.cpp.cpp</a>
+ * \li <a href="_bottleneck_distance_2bottleneck_basic_example_8cpp-example.html">
+ * Bottleneck_distance/bottleneck_basic_example.cpp</a>
+ * \li <a href="_bottleneck_distance_2bottleneck_read_file_8cpp-example.html">
+ * Bottleneck_distance/bottleneck_distance.cpp</a>
+ * \li <a href="_nerve__g_i_c_2_coord_g_i_c_8cpp-example.html">
+ * Nerve_GIC/CoordGIC.cpp</a>
+ * \li <a href="_nerve__g_i_c_2_func_g_i_c_8cpp-example.html">
+ * Nerve_GIC/FuncGIC.cpp</a>
+ * \li <a href="_nerve__g_i_c_2_nerve_8cpp-example.html">
+ * Nerve_GIC/Nerve.cpp</a>
+ * \li <a href="_nerve__g_i_c_2_voronoi_g_i_c_8cpp-example.html">
+ * Nerve_GIC/VoronoiGIC.cpp</a>
+ * \li <a href="_spatial_searching_2example_spatial_searching_8cpp-example.html">
+ * Spatial_searching/example_spatial_searching.cpp</a>
+ * \li <a href="_subsampling_2example_choose_n_farthest_points_8cpp-example.html">
+ * Subsampling/example_choose_n_farthest_points.cpp</a>
+ * \li <a href="_subsampling_2example_custom_kernel_8cpp-example.html">
+ * Subsampling/example_custom_kernel.cpp</a>
+ * \li <a href="_subsampling_2example_pick_n_random_points_8cpp-example.html">
+ * Subsampling/example_pick_n_random_points.cpp</a>
+ * \li <a href="_subsampling_2example_sparsify_point_set_8cpp-example.html">
+ * Subsampling/example_sparsify_point_set.cpp</a>
+ * \li <a href="_tangential_complex_2example_basic_8cpp-example.html">
+ * Tangential_complex/example_basic.cpp</a>
+ * \li <a href="_tangential_complex_2example_with_perturb_8cpp-example.html">
+ * Tangential_complex/example_with_perturb.cpp</a>
+ *
+ * \subsection eigen3 Eigen3
+ * The \ref alpha_complex data structure and few examples requires
+ * <a target="_blank" href="http://eigen.tuxfamily.org/">Eigen3</a> is a C++ template library for linear algebra:
+ * matrices, vectors, numerical solvers, and related algorithms.
+ *
+ * The following examples/utilities require the <a target="_blank" href="http://eigen.tuxfamily.org/">Eigen3</a> and will not be
+ * built if Eigen3 is not installed:
+ * \li <a href="_alpha_complex_2_alpha_complex_from_off_8cpp-example.html">
+ * Alpha_complex/Alpha_complex_from_off.cpp</a>
+ * \li <a href="_alpha_complex_2_alpha_complex_from_points_8cpp-example.html">
+ * Alpha_complex/Alpha_complex_from_points.cpp</a>
+ * \li <a href="_alpha_complex_2alpha_complex_persistence_8cpp-example.html">
+ * Alpha_complex/alpha_complex_persistence.cpp</a>
+ * \li <a href="_alpha_complex_2periodic_alpha_complex_3d_persistence_8cpp-example.html">
+ * Alpha_complex/periodic_alpha_complex_3d_persistence.cpp</a>
+ * \li <a href="_bottleneck_distance_2alpha_rips_persistence_bottleneck_distance_8cpp-example.html">
+ * Bottleneck_distance/alpha_rips_persistence_bottleneck_distance.cpp.cpp</a>
+ * \li <a href="_persistent_cohomology_2custom_persistence_sort_8cpp-example.html">
+ * Persistent_cohomology/custom_persistence_sort.cpp</a>
+ * \li <a href="_spatial_searching_2example_spatial_searching_8cpp-example.html">
+ * Spatial_searching/example_spatial_searching.cpp</a>
+ * \li <a href="_subsampling_2example_choose_n_farthest_points_8cpp-example.html">
+ * Subsampling/example_choose_n_farthest_points.cpp</a>
+ * \li <a href="_subsampling_2example_custom_kernel_8cpp-example.html">
+ * Subsampling/example_custom_kernel.cpp</a>
+ * \li <a href="_subsampling_2example_pick_n_random_points_8cpp-example.html">
+ * Subsampling/example_pick_n_random_points.cpp</a>
+ * \li <a href="_subsampling_2example_sparsify_point_set_8cpp-example.html">
+ * Subsampling/example_sparsify_point_set.cpp</a>
+ * \li <a href="_tangential_complex_2example_basic_8cpp-example.html">
+ * Tangential_complex/example_basic.cpp</a>
+ * \li <a href="_tangential_complex_2example_with_perturb_8cpp-example.html">
+ * Tangential_complex/example_with_perturb.cpp</a>
+ * \li <a href="_witness_complex_2strong_witness_persistence_8cpp-example.html">
+ * Witness_complex/strong_witness_persistence.cpp</a>
+ * \li <a href="_witness_complex_2weak_witness_persistence_8cpp-example.html">
+ * Witness_complex/weak_witness_persistence.cpp</a>
+ * \li <a href="_witness_complex_2example_strong_witness_complex_off_8cpp-example.html">
+ * Witness_complex/example_strong_witness_complex_off.cpp</a>
+ * \li <a href="_witness_complex_2example_witness_complex_off_8cpp-example.html">
+ * Witness_complex/example_witness_complex_off.cpp</a>
+ * \li <a href="_witness_complex_2example_witness_complex_sphere_8cpp-example.html">
+ * Witness_complex/example_witness_complex_sphere.cpp</a>
+ *
+ * \subsection tbb Threading Building Blocks
+ * <a target="_blank" href="https://www.threadingbuildingblocks.org/">Intel&reg; TBB</a> lets you easily write parallel
+ * C++ programs that take full advantage of multicore performance, that are portable and composable, and that have
+ * future-proof scalability.
+ *
+ * Having Intel&reg; TBB installed is recommended to parallelize and accelerate some GUDHI computations.
+ *
+ * The following examples/utilities are using Intel&reg; TBB if installed:
+ * \li <a href="_alpha_complex_2_alpha_complex_from_off_8cpp-example.html">
+ * Alpha_complex/Alpha_complex_from_off.cpp</a>
+ * \li <a href="_alpha_complex_2_alpha_complex_from_points_8cpp-example.html">
+ * Alpha_complex/Alpha_complex_from_points.cpp</a>
+ * \li <a href="_alpha_complex_2alpha_complex_3d_persistence_8cpp-example.html">
+ * Alpha_complex/alpha_complex_3d_persistence.cpp</a>
+ * \li <a href="_alpha_complex_2alpha_complex_persistence_8cpp-example.html">
+ * Alpha_complex/alpha_complex_persistence.cpp</a>
+ * \li <a href="_alpha_complex_2exact_alpha_complex_3d_persistence_8cpp-example.html">
+ * Alpha_complex/exact_alpha_complex_3d_persistence.cpp</a>
+ * \li <a href="_alpha_complex_2periodic_alpha_complex_3d_persistence_8cpp-example.html">
+ * Alpha_complex/periodic_alpha_complex_3d_persistence.cpp</a>
+ * \li <a href="_alpha_complex_2weighted_alpha_complex_3d_persistence_8cpp-example.html">
+ * Alpha_complex/weighted_alpha_complex_3d_persistence.cpp</a>
+ * \li <a href="_bitmap_cubical_complex_2_bitmap_cubical_complex_8cpp-example.html">
+ * Bitmap_cubical_complex/cubical_complex_persistence.cpp</a>
+ * \li <a href="_bitmap_cubical_complex_2_bitmap_cubical_complex_periodic_boundary_conditions_8cpp-example.html">
+ * Bitmap_cubical_complex/periodic_cubical_complex_persistence.cpp</a>
+ * \li <a href="_bitmap_cubical_complex_2_random_bitmap_cubical_complex_8cpp-example.html">
+ * Bitmap_cubical_complex/Random_bitmap_cubical_complex.cpp</a>
+ * \li <a href="_nerve__g_i_c_2_coord_g_i_c_8cpp-example.html">
+ * Nerve_GIC/CoordGIC.cpp</a>
+ * \li <a href="_nerve__g_i_c_2_func_g_i_c_8cpp-example.html">
+ * Nerve_GIC/FuncGIC.cpp</a>
+ * \li <a href="_nerve__g_i_c_2_nerve_8cpp-example.html">
+ * Nerve_GIC/Nerve.cpp</a>
+ * \li <a href="_nerve__g_i_c_2_voronoi_g_i_c_8cpp-example.html">
+ * Nerve_GIC/VoronoiGIC.cpp</a>
+ * \li <a href="_simplex_tree_2simple_simplex_tree_8cpp-example.html">
+ * Simplex_tree/simple_simplex_tree.cpp</a>
+ * \li <a href="_simplex_tree_2example_alpha_shapes_3_simplex_tree_from_off_file_8cpp-example.html">
+ * Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp</a>
+ * \li <a href="_simplex_tree_2simplex_tree_from_cliques_of_graph_8cpp-example.html">
+ * Simplex_tree/simplex_tree_from_cliques_of_graph.cpp</a>
+ * \li <a href="_simplex_tree_2graph_expansion_with_blocker_8cpp-example.html">
+ * Simplex_tree/graph_expansion_with_blocker.cpp</a>
+ * \li <a href="_persistent_cohomology_2alpha_complex_3d_persistence_8cpp-example.html">
+ * Persistent_cohomology/alpha_complex_3d_persistence.cpp</a>
+ * \li <a href="_persistent_cohomology_2alpha_complex_persistence_8cpp-example.html">
+ * Persistent_cohomology/alpha_complex_persistence.cpp</a>
+ * \li <a href="_persistent_cohomology_2rips_persistence_via_boundary_matrix_8cpp-example.html">
+ * Persistent_cohomology/rips_persistence_via_boundary_matrix.cpp</a>
+ * \li <a href="_persistent_cohomology_2persistence_from_file_8cpp-example.html">
+ * Persistent_cohomology/persistence_from_file.cpp</a>
+ * \li <a href="_persistent_cohomology_2persistence_from_simple_simplex_tree_8cpp-example.html">
+ * Persistent_cohomology/persistence_from_simple_simplex_tree.cpp</a>
+ * \li <a href="_persistent_cohomology_2plain_homology_8cpp-example.html">
+ * Persistent_cohomology/plain_homology.cpp</a>
+ * \li <a href="_persistent_cohomology_2rips_multifield_persistence_8cpp-example.html">
+ * Persistent_cohomology/rips_multifield_persistence.cpp</a>
+ * \li <a href="_persistent_cohomology_2rips_persistence_step_by_step_8cpp-example.html">
+ * Persistent_cohomology/rips_persistence_step_by_step.cpp</a>
+ * \li <a href="_persistent_cohomology_2exact_alpha_complex_3d_persistence_8cpp-example.html">
+ * Persistent_cohomology/exact_alpha_complex_3d_persistence.cpp</a>
+ * \li <a href="_persistent_cohomology_2weighted_alpha_complex_3d_persistence_8cpp-example.html">
+ * Persistent_cohomology/weighted_alpha_complex_3d_persistence.cpp</a>
+ * \li <a href="_persistent_cohomology_2custom_persistence_sort_8cpp-example.html">
+ * Persistent_cohomology/custom_persistence_sort.cpp</a>
+ * \li <a href="_rips_complex_2example_one_skeleton_rips_from_points_8cpp-example.html">
+ * Rips_complex/example_one_skeleton_rips_from_points.cpp</a>
+ * \li <a href="_rips_complex_2example_rips_complex_from_off_file_8cpp-example.html">
+ * Rips_complex/example_rips_complex_from_off_file.cpp</a>
+ * \li <a href="_rips_complex_2rips_distance_matrix_persistence_8cpp-example.html">
+ * Rips_complex/rips_distance_matrix_persistence.cpp</a>
+ * \li <a href="_rips_complex_2rips_persistence_8cpp-example.html">
+ * Rips_complex/rips_persistence.cpp</a>
+ * \li <a href="_witness_complex_2strong_witness_persistence_8cpp-example.html">
+ * Witness_complex/strong_witness_persistence.cpp</a>
+ * \li <a href="_witness_complex_2weak_witness_persistence_8cpp-example.html">
+ * Witness_complex/weak_witness_persistence.cpp</a>
+ * \li <a href="_witness_complex_2example_nearest_landmark_table_8cpp-example.html">
+ * Witness_complex/example_nearest_landmark_table.cpp</a>
+ *
+ * \section Contributions Bug reports and contributions
+ * Please help us improving the quality of the GUDHI library. You may report bugs or suggestions to:
+ * \verbatim Contact: gudhi-users@lists.gforge.inria.fr \endverbatim
+ *
+ * GUDHI is open to external contributions. If you want to join our development team, please contact us.
+ *
+*/
+
+/*! \page Citation Acknowledging the GUDHI library
+ * We kindly ask users to cite the GUDHI library as appropriately as possible in their papers, and to mention the use
+ * of the GUDHI library on the web pages of their projects using GUDHI and provide us with links to these web pages.
+ * Feel free to contact us in case you have any question or remark on this topic.
+ *
+ * We provide \ref GudhiBibtex entries for the modules of the User and Reference Manual, as well as for publications
+ * directly related to the GUDHI library.
+ * \section GudhiBibtex GUDHI bibtex
+ * \verbinclude biblio/how_to_cite_gudhi.bib
+*/
diff --git a/doc/common/main_page.h b/doc/common/main_page.h
index 1a7994a5..b3e9ea03 100644
--- a/doc/common/main_page.h
+++ b/doc/common/main_page.h
@@ -93,6 +93,25 @@
</td>
</tr>
</table>
+ \subsection CoverComplexDataStructure Cover Complexes
+ \image html "gicvisu.jpg" "Graph Induced Complex of a point cloud."
+<table border="0">
+ <tr>
+ <td width="25%">
+ <b>Author:</b> Mathieu Carri&egrave;re<br>
+ <b>Introduced in:</b> GUDHI 2.1.0<br>
+ <b>Copyright:</b> GPL v3<br>
+ <b>Requires:</b> \ref cgal &ge; 4.8.1
+ </td>
+ <td width="75%">
+ Nerves and Graph Induced Complexes are cover complexes, i.e. simplicial complexes that provably contain
+ topological information about the input data. They can be computed with a cover of the
+ data, that comes i.e. from the preimage of a family of intervals covering the image
+ of a scalar-valued function defined on the data. <br>
+ <b>User manual:</b> \ref cover_complex - <b>Reference manual:</b> Gudhi::cover_complex::Cover_complex
+ </td>
+ </tr>
+</table>
\subsection SkeletonBlockerDataStructure Skeleton blocker
\image html "ds_representation.png" "Skeleton blocker representation"
<table border="0">
@@ -152,6 +171,7 @@
</table>
\section Toolbox Toolbox
+
\subsection BottleneckDistanceToolbox Bottleneck distance
\image html "perturb_pd.png" "Bottleneck distance is the length of the longest edge"
<table border="0">
@@ -211,276 +231,23 @@
<b>User manual:</b> \ref persistent_cohomology - <b>Reference manual:</b> Gudhi::persistent_cohomology::Persistent_cohomology
</td>
</tr>
+</table>
+ \subsection PersistenceRepresentationsToolbox Persistence representations
+ \image html "average_landscape.png" "Persistence representations"
+<table border="0">
+ <tr>
+ <td width="25%">
+ <b>Author:</b> Pawel Dlotko<br>
+ <b>Introduced in:</b> GUDHI 2.1.0<br>
+ <b>Copyright:</b> GPL v3<br>
+ </td>
+ <td width="75%">
+ It contains implementation of various representations of persistence diagrams; diagrams themselves, persistence
+ landscapes (rigorous and grid version), persistence heath maps, vectors and others. It implements basic
+ functionalities which are neccessary to use persistence in statistics and machine learning.<br>
+ <b>User manual:</b> \ref Persistence_representations
+ </td>
+ </tr>
</table>
+
*/
-
-/*! \page installation GUDHI installation
- * \tableofcontents
- * As GUDHI is a header only library, there is no need to install the library.
- *
- * Examples of GUDHI headers inclusion can be found in \ref demos.
- *
- * \section compiling Compiling
- * The library uses c++11 and requires <a target="_blank" href="http://www.boost.org/">Boost</a> with version 1.48.0 or
- * more recent. It is a multi-platform library and compiles on Linux, Mac OSX and Visual Studio 2015.
- *
- * \subsection demos Demos and examples
- * To build the demos and examples, run the following commands in a terminal:
-\verbatim cd /path-to-gudhi/
-mkdir build
-cd build/
-cmake ..
-make \endverbatim
- * A list of examples is available <a href="examples.html">here</a>.
- *
- * \subsection testsuites Test suites
- * To test your build, run the following command in a terminal:
- * \verbatim make test \endverbatim
- *
- * \subsection documentationgeneration Documentation
- * To generate the documentation, <a target="_blank" href="http://www.doxygen.org/">Doxygen</a> is required.
- * Run the following command in a terminal:
-\verbatim
-make doxygen
-# Documentation will be generated in the folder YYYY-MM-DD-hh-mm-ss_GUDHI_X.Y.Z/doc/html/
-# You can customize the directory name by calling `cmake -DUSER_VERSION_DIR=/my/custom/folder`
-\endverbatim
- *
- * \section optionallibrary Optional third-party library
- * \subsection gmp GMP
- * The multi-field persistent homology algorithm requires GMP which is a free library for arbitrary-precision
- * arithmetic, operating on signed integers, rational numbers, and floating point numbers.
- *
- * The following example requires the <a target="_blank" href="http://gmplib.org/">GNU Multiple Precision Arithmetic
- * Library</a> (GMP) and will not be built if GMP is not installed:
- * \li <a href="_persistent_cohomology_2rips_multifield_persistence_8cpp-example.html">
- * Persistent_cohomology/rips_multifield_persistence.cpp</a>
- *
- * Having GMP version 4.2 or higher installed is recommended.
- *
- * \subsection cgal CGAL
- * The \ref alpha_complex data structure, \ref bottleneck_distance, and few examples requires CGAL, which is a C++
- * library which provides easy access to efficient and reliable geometric algorithms.
- *
- * \note There is no need to install CGAL, you can just <CODE>cmake . && make</CODE> CGAL (or even
- * <CODE>cmake -DCGAL_HEADER_ONLY=ON .</CODE> for CGAL version &ge; 4.8.0), thereafter you will be able to compile
- * GUDHI by calling <CODE>cmake -DCGAL_DIR=/your/path/to/CGAL-X.Y .. && make</CODE>
- *
- * Having CGAL version 4.4.0 or higher installed is recommended. The procedure to install this library according to
- * your operating system is detailed here http://doc.cgal.org/latest/Manual/installation.html
- *
- * The following examples require the <a target="_blank" href="http://www.cgal.org/">Computational Geometry Algorithms
- * Library</a> (CGAL \cite cgal:eb-15b) and will not be built if CGAL is not installed:
- * \li <a href="_persistent_cohomology_2alpha_complex_3d_persistence_8cpp-example.html">
- * Persistent_cohomology/alpha_complex_3d_persistence.cpp</a>
- * \li <a href="_persistent_cohomology_2exact_alpha_complex_3d_persistence_8cpp-example.html">
- * Persistent_cohomology/exact_alpha_complex_3d_persistence.cpp</a>
- * \li <a href="_persistent_cohomology_2weighted_alpha_complex_3d_persistence_8cpp-example.html">
- * Persistent_cohomology/weighted_alpha_complex_3d_persistence.cpp</a>
- * \li <a href="_simplex_tree_2example_alpha_shapes_3_simplex_tree_from_off_file_8cpp-example.html">
- * Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp</a>
- *
- * The following example requires CGAL version &ge; 4.6.0:
- * \li <a href="_witness_complex_2witness_complex_sphere_8cpp-example.html">
- * Witness_complex/witness_complex_sphere.cpp</a>
- *
- * The following example requires CGAL version &ge; 4.7.0:
- * \li <a href="_alpha_complex_2_alpha_complex_from_off_8cpp-example.html">
- * Alpha_complex/Alpha_complex_from_off.cpp</a>
- * \li <a href="_alpha_complex_2_alpha_complex_from_points_8cpp-example.html">
- * Alpha_complex/Alpha_complex_from_points.cpp</a>
- * \li <a href="_persistent_cohomology_2alpha_complex_persistence_8cpp-example.html">
- * Persistent_cohomology/alpha_complex_persistence.cpp</a>
- * \li <a href="_persistent_cohomology_2periodic_alpha_complex_3d_persistence_8cpp-example.html">
- * Persistent_cohomology/periodic_alpha_complex_3d_persistence.cpp</a>
- * \li <a href="_persistent_cohomology_2custom_persistence_sort_8cpp-example.html">
- * Persistent_cohomology/custom_persistence_sort.cpp</a>
- *
- * The following example requires CGAL version &ge; 4.8.1:
- * \li <a href="_bottleneck_distance_2alpha_rips_persistence_bottleneck_distance_8cpp-example.html">
- * Bottleneck_distance/alpha_rips_persistence_bottleneck_distance.cpp.cpp</a>
- * \li <a href="_bottleneck_distance_2bottleneck_basic_example_8cpp-example.html">
- * Bottleneck_distance/bottleneck_basic_example.cpp</a>
- * \li <a href="_bottleneck_distance_2bottleneck_read_file_example_8cpp-example.html">
- * Bottleneck_distance/bottleneck_read_file_example.cpp</a>
- * \li <a href="_spatial_searching_2example_spatial_searching_8cpp-example.html">
- * Spatial_searching/example_spatial_searching.cpp</a>
- * \li <a href="_subsampling_2example_choose_n_farthest_points_8cpp-example.html">
- * Subsampling/example_choose_n_farthest_points.cpp</a>
- * \li <a href="_subsampling_2example_custom_kernel_8cpp-example.html">
- * Subsampling/example_custom_kernel.cpp</a>
- * \li <a href="_subsampling_2example_pick_n_random_points_8cpp-example.html">
- * Subsampling/example_pick_n_random_points.cpp</a>
- * \li <a href="_subsampling_2example_sparsify_point_set_8cpp-example.html">
- * Subsampling/example_sparsify_point_set.cpp</a>
- * \li <a href="_tangential_complex_2example_basic_8cpp-example.html">
- * Tangential_complex/example_basic.cpp</a>
- * \li <a href="_tangential_complex_2example_with_perturb_8cpp-example.html">
- * Tangential_complex/example_with_perturb.cpp</a>
- *
- * \subsection eigen3 Eigen3
- * The \ref alpha_complex data structure and few examples requires
- * <a target="_blank" href="http://eigen.tuxfamily.org/">Eigen3</a> is a C++ template library for linear algebra:
- * matrices, vectors, numerical solvers, and related algorithms.
- *
- * The following example requires the <a target="_blank" href="http://eigen.tuxfamily.org/">Eigen3</a> and will not be
- * built if Eigen3 is not installed:
- * \li <a href="_alpha_complex_2_alpha_complex_from_off_8cpp-example.html">
- * Alpha_complex/Alpha_complex_from_off.cpp</a>
- * \li <a href="_alpha_complex_2_alpha_complex_from_points_8cpp-example.html">
- * Alpha_complex/Alpha_complex_from_points.cpp</a>
- * \li <a href="_bottleneck_distance_2alpha_rips_persistence_bottleneck_distance_8cpp-example.html">
- * Bottleneck_distance/alpha_rips_persistence_bottleneck_distance.cpp.cpp</a>
- * \li <a href="_persistent_cohomology_2alpha_complex_persistence_8cpp-example.html">
- * Persistent_cohomology/alpha_complex_persistence.cpp</a>
- * \li <a href="_persistent_cohomology_2periodic_alpha_complex_3d_persistence_8cpp-example.html">
- * Persistent_cohomology/periodic_alpha_complex_3d_persistence.cpp</a>
- * \li <a href="_persistent_cohomology_2custom_persistence_sort_8cpp-example.html">
- * Persistent_cohomology/custom_persistence_sort.cpp</a>
- * \li <a href="_spatial_searching_2example_spatial_searching_8cpp-example.html">
- * Spatial_searching/example_spatial_searching.cpp</a>
- * \li <a href="_subsampling_2example_choose_n_farthest_points_8cpp-example.html">
- * Subsampling/example_choose_n_farthest_points.cpp</a>
- * \li <a href="_subsampling_2example_custom_kernel_8cpp-example.html">
- * Subsampling/example_custom_kernel.cpp</a>
- * \li <a href="_subsampling_2example_pick_n_random_points_8cpp-example.html">
- * Subsampling/example_pick_n_random_points.cpp</a>
- * \li <a href="_subsampling_2example_sparsify_point_set_8cpp-example.html">
- * Subsampling/example_sparsify_point_set.cpp</a>
- * \li <a href="_tangential_complex_2example_basic_8cpp-example.html">
- * Tangential_complex/example_basic.cpp</a>
- * \li <a href="_tangential_complex_2example_with_perturb_8cpp-example.html">
- * Tangential_complex/example_with_perturb.cpp</a>
- *
- * \subsection tbb Threading Building Blocks
- * <a target="_blank" href="https://www.threadingbuildingblocks.org/">Intel&reg; TBB</a> lets you easily write parallel
- * C++ programs that take full advantage of multicore performance, that are portable and composable, and that have
- * future-proof scalability.
- *
- * Having Intel&reg; TBB installed is recommended to parallelize and accelerate some GUDHI computations.
- *
- * The following examples are using Intel&reg; TBB if installed:
- * \li <a href="_alpha_complex_2_alpha_complex_from_off_8cpp-example.html">
- * Alpha_complex/Alpha_complex_from_off.cpp</a>
- * \li <a href="_alpha_complex_2_alpha_complex_from_points_8cpp-example.html">
- * Alpha_complex/Alpha_complex_from_points.cpp</a>
- * \li <a href="_bitmap_cubical_complex_2_bitmap_cubical_complex_8cpp-example.html">
- * Bitmap_cubical_complex/Bitmap_cubical_complex.cpp</a>
- * \li <a href="_bitmap_cubical_complex_2_bitmap_cubical_complex_periodic_boundary_conditions_8cpp-example.html">
- * Bitmap_cubical_complex/Bitmap_cubical_complex_periodic_boundary_conditions.cpp</a>
- * \li <a href="_bitmap_cubical_complex_2_random_bitmap_cubical_complex_8cpp-example.html">
- * Bitmap_cubical_complex/Random_bitmap_cubical_complex.cpp</a>
- * \li <a href="_persistent_cohomology_2alpha_complex_3d_persistence_8cpp-example.html">
- * Persistent_cohomology/alpha_complex_3d_persistence.cpp</a>
- * \li <a href="_persistent_cohomology_2alpha_complex_persistence_8cpp-example.html">
- * Persistent_cohomology/alpha_complex_persistence.cpp</a>
- * \li <a href="_simplex_tree_2simple_simplex_tree_8cpp-example.html">
- * Simplex_tree/simple_simplex_tree.cpp</a>
- * \li <a href="_simplex_tree_2example_alpha_shapes_3_simplex_tree_from_off_file_8cpp-example.html">
- * Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp</a>
- * \li <a href="_simplex_tree_2simplex_tree_from_cliques_of_graph_8cpp-example.html">
- * Simplex_tree/simplex_tree_from_cliques_of_graph.cpp</a>
- * \li <a href="_persistent_cohomology_2alpha_complex_3d_persistence_8cpp-example.html">
- * Persistent_cohomology/alpha_complex_3d_persistence.cpp</a>
- * \li <a href="_persistent_cohomology_2alpha_complex_persistence_8cpp-example.html">
- * Persistent_cohomology/alpha_complex_persistence.cpp</a>
- * \li <a href="_persistent_cohomology_2rips_persistence_via_boundary_matrix_8cpp-example.html">
- * Persistent_cohomology/rips_persistence_via_boundary_matrix.cpp</a>
- * \li <a href="_persistent_cohomology_2persistence_from_file_8cpp-example.html">
- * Persistent_cohomology/persistence_from_file.cpp</a>
- * \li <a href="_persistent_cohomology_2persistence_from_simple_simplex_tree_8cpp-example.html">
- * Persistent_cohomology/persistence_from_simple_simplex_tree.cpp</a>
- * \li <a href="_persistent_cohomology_2plain_homology_8cpp-example.html">
- * Persistent_cohomology/plain_homology.cpp</a>
- * \li <a href="_persistent_cohomology_2rips_distance_matrix_persistence_8cpp-example.html">
- * Persistent_cohomology/rips_distance_matrix_persistence.cpp</a>
- * \li <a href="_persistent_cohomology_2rips_multifield_persistence_8cpp-example.html">
- * Persistent_cohomology/rips_multifield_persistence.cpp</a>
- * \li <a href="_persistent_cohomology_2rips_persistence_8cpp-example.html">
- * Persistent_cohomology/rips_persistence.cpp</a>
- * \li <a href="_persistent_cohomology_2rips_persistence_step_by_step_8cpp-example.html">
- * Persistent_cohomology/rips_persistence_step_by_step.cpp</a>
- * \li <a href="_persistent_cohomology_2exact_alpha_complex_3d_persistence_8cpp-example.html">
- * Persistent_cohomology/exact_alpha_complex_3d_persistence.cpp</a>
- * \li <a href="_persistent_cohomology_2weighted_alpha_complex_3d_persistence_8cpp-example.html">
- * Persistent_cohomology/weighted_alpha_complex_3d_persistence.cpp</a>
- * \li <a href="_persistent_cohomology_2periodic_alpha_complex_3d_persistence_8cpp-example.html">
- * Persistent_cohomology/periodic_alpha_complex_3d_persistence.cpp</a>
- * \li <a href="_persistent_cohomology_2custom_persistence_sort_8cpp-example.html">
- * Persistent_cohomology/custom_persistence_sort.cpp</a>
- * \li <a href="_rips_complex_2example_one_skeleton_rips_from_points_8cpp-example.html">
- * Rips_complex/example_one_skeleton_rips_from_points.cpp</a>
- * \li <a href="_rips_complex_2example_rips_complex_from_off_file_8cpp-example.html">
- * Rips_complex/example_rips_complex_from_off_file.cpp</a>
- *
- * \section Contributions Bug reports and contributions
- * Please help us improving the quality of the GUDHI library. You may report bugs or suggestions to:
- * \verbatim Contact: gudhi-users@lists.gforge.inria.fr \endverbatim
- *
- * GUDHI is open to external contributions. If you want to join our development team, please contact us.
- *
-*/
-
-/*! \page Citation Acknowledging the GUDHI library
- * We kindly ask users to cite the GUDHI library as appropriately as possible in their papers, and to mention the use
- * of the GUDHI library on the web pages of their projects using GUDHI and provide us with links to these web pages.
- * Feel free to contact us in case you have any question or remark on this topic.
- *
- * We provide \ref GudhiBibtex entries for the modules of the User and Reference Manual, as well as for publications
- * directly related to the GUDHI library.
- * \section GudhiBibtex GUDHI bibtex
- * \verbinclude biblio/how_to_cite_gudhi.bib
-*/
-
-// List of GUDHI examples - Doxygen needs at least a file tag to analyse comments
-/*! @file Examples
- * @example Alpha_complex/Alpha_complex_from_off.cpp
- * @example Alpha_complex/Alpha_complex_from_points.cpp
- * @example Bottleneck_distance/alpha_rips_persistence_bottleneck_distance.cpp
- * @example Bottleneck_distance/bottleneck_basic_example.cpp
- * @example Bottleneck_distance/bottleneck_read_file_example.cpp
- * @example Bitmap_cubical_complex/Bitmap_cubical_complex.cpp
- * @example Bitmap_cubical_complex/Bitmap_cubical_complex_periodic_boundary_conditions.cpp
- * @example Bitmap_cubical_complex/Random_bitmap_cubical_complex.cpp
- * @example common/example_CGAL_3D_points_off_reader.cpp
- * @example common/example_CGAL_points_off_reader.cpp
- * @example Contraction/Garland_heckbert.cpp
- * @example Contraction/Rips_contraction.cpp
- * @example Persistent_cohomology/alpha_complex_3d_persistence.cpp
- * @example Persistent_cohomology/alpha_complex_persistence.cpp
- * @example Persistent_cohomology/rips_persistence_via_boundary_matrix.cpp
- * @example Persistent_cohomology/exact_alpha_complex_3d_persistence.cpp
- * @example Persistent_cohomology/weighted_alpha_complex_3d_persistence.cpp
- * @example Persistent_cohomology/periodic_alpha_complex_3d_persistence.cpp
- * @example Persistent_cohomology/persistence_from_file.cpp
- * @example Persistent_cohomology/persistence_from_simple_simplex_tree.cpp
- * @example Persistent_cohomology/plain_homology.cpp
- * @example Persistent_cohomology/rips_multifield_persistence.cpp
- * @example Persistent_cohomology/rips_distance_matrix_persistence.cpp
- * @example Persistent_cohomology/rips_persistence.cpp
- * @example Persistent_cohomology/custom_persistence_sort.cpp
- * @example Persistent_cohomology/rips_persistence_step_by_step.cpp
- * @example Rips_complex/example_one_skeleton_rips_from_points.cpp
- * @example Rips_complex/example_rips_complex_from_off_file.cpp
- * @example Simplex_tree/mini_simplex_tree.cpp
- * @example Simplex_tree/simple_simplex_tree.cpp
- * @example Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp
- * @example Simplex_tree/simplex_tree_from_cliques_of_graph.cpp
- * @example Skeleton_blocker/Skeleton_blocker_from_simplices.cpp
- * @example Skeleton_blocker/Skeleton_blocker_iteration.cpp
- * @example Skeleton_blocker/Skeleton_blocker_link.cpp
- * @example Spatial_searching/example_spatial_searching.cpp
- * @example Subsampling/example_choose_n_farthest_points.cpp
- * @example Subsampling/example_custom_kernel.cpp
- * @example Subsampling/example_pick_n_random_points.cpp
- * @example Subsampling/example_sparsify_point_set.cpp
- * @example Tangential_complex/example_basic.cpp
- * @example Tangential_complex/example_with_perturb.cpp
- * @example Witness_complex/example_nearest_landmark_table.cpp
- * @example Witness_complex/example_strong_witness_complex_off.cpp
- * @example Witness_complex/example_strong_witness_persistence.cpp
- * @example Witness_complex/example_witness_complex_off.cpp
- * @example Witness_complex/example_witness_complex_persistence.cpp
- * @example Witness_complex/example_witness_complex_sphere.cpp
- */
-
diff --git a/example/Bitmap_cubical_complex/CMakeLists.txt b/example/Bitmap_cubical_complex/CMakeLists.txt
index a0401619..99304aa4 100644
--- a/example/Bitmap_cubical_complex/CMakeLists.txt
+++ b/example/Bitmap_cubical_complex/CMakeLists.txt
@@ -1,17 +1,6 @@
cmake_minimum_required(VERSION 2.6)
project(Bitmap_cubical_complex_examples)
-add_executable ( Bitmap_cubical_complex Bitmap_cubical_complex.cpp )
-if (TBB_FOUND)
- target_link_libraries(Bitmap_cubical_complex ${TBB_LIBRARIES})
-endif()
-
-add_test(NAME Bitmap_cubical_complex_example_persistence_one_sphere COMMAND $<TARGET_FILE:Bitmap_cubical_complex>
- "${CMAKE_SOURCE_DIR}/data/bitmap/CubicalOneSphere.txt")
-
-add_test(NAME Bitmap_cubical_complex_example_persistence_two_sphere COMMAND $<TARGET_FILE:Bitmap_cubical_complex>
- "${CMAKE_SOURCE_DIR}/data/bitmap/CubicalTwoSphere.txt")
-
add_executable ( Random_bitmap_cubical_complex Random_bitmap_cubical_complex.cpp )
if (TBB_FOUND)
target_link_libraries(Random_bitmap_cubical_complex ${TBB_LIBRARIES})
@@ -19,19 +8,4 @@ endif()
add_test(NAME Bitmap_cubical_complex_example_random COMMAND $<TARGET_FILE:Random_bitmap_cubical_complex>
"2" "100" "100")
-add_executable ( Bitmap_cubical_complex_periodic_boundary_conditions Bitmap_cubical_complex_periodic_boundary_conditions.cpp )
-if (TBB_FOUND)
- target_link_libraries(Bitmap_cubical_complex_periodic_boundary_conditions ${TBB_LIBRARIES})
-endif()
-
-add_test(NAME Bitmap_cubical_complex_example_periodic_boundary_conditions_2d_torus
- COMMAND $<TARGET_FILE:Bitmap_cubical_complex_periodic_boundary_conditions>
- "${CMAKE_SOURCE_DIR}/data/bitmap/2d_torus.txt")
-
-add_test(NAME Bitmap_cubical_complex_example_periodic_boundary_conditions_3d_torus
- COMMAND $<TARGET_FILE:Bitmap_cubical_complex_periodic_boundary_conditions>
- "${CMAKE_SOURCE_DIR}/data/bitmap/3d_torus.txt")
-
-install(TARGETS Bitmap_cubical_complex DESTINATION bin)
install(TARGETS Random_bitmap_cubical_complex DESTINATION bin)
-install(TARGETS Bitmap_cubical_complex_periodic_boundary_conditions DESTINATION bin)
diff --git a/example/Bitmap_cubical_complex/Random_bitmap_cubical_complex.cpp b/example/Bitmap_cubical_complex/Random_bitmap_cubical_complex.cpp
index 16ad65a0..f70558f2 100644
--- a/example/Bitmap_cubical_complex/Random_bitmap_cubical_complex.cpp
+++ b/example/Bitmap_cubical_complex/Random_bitmap_cubical_complex.cpp
@@ -20,7 +20,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-
// for persistence algorithm
#include <gudhi/reader_utils.h>
#include <gudhi/Bitmap_cubical_complex.h>
@@ -34,10 +33,11 @@
int main(int argc, char** argv) {
srand(time(0));
- std::cout << "This program computes persistent homology, by using bitmap_cubical_complex class, of cubical " <<
- "complexes. The first parameter of the program is the dimension D of the bitmap. The next D parameters are " <<
- "number of top dimensional cubes in each dimension of the bitmap. The program will create random cubical " <<
- "complex of that sizes and compute persistent homology of it." << std::endl;
+ std::cout
+ << "This program computes persistent homology, by using bitmap_cubical_complex class, of cubical "
+ << "complexes. The first parameter of the program is the dimension D of the bitmap. The next D parameters are "
+ << "number of top dimensional cubes in each dimension of the bitmap. The program will create random cubical "
+ << "complex of that sizes and compute persistent homology of it." << std::endl;
int p = 2;
double min_persistence = 0;
@@ -47,16 +47,16 @@ int main(int argc, char** argv) {
return 1;
}
- size_t dimensionOfBitmap = (size_t) atoi(argv[1]);
- std::vector< unsigned > sizes;
+ size_t dimensionOfBitmap = (size_t)atoi(argv[1]);
+ std::vector<unsigned> sizes;
size_t multipliers = 1;
for (size_t dim = 0; dim != dimensionOfBitmap; ++dim) {
- unsigned sizeInThisDimension = (unsigned) atoi(argv[2 + dim]);
+ unsigned sizeInThisDimension = (unsigned)atoi(argv[2 + dim]);
sizes.push_back(sizeInThisDimension);
multipliers *= sizeInThisDimension;
}
- std::vector< double > data;
+ std::vector<double> data;
for (size_t i = 0; i != multipliers; ++i) {
data.push_back(rand() / static_cast<double>(RAND_MAX));
}
@@ -80,4 +80,3 @@ int main(int argc, char** argv) {
return 0;
}
-
diff --git a/example/Bottleneck_distance/CMakeLists.txt b/example/Bottleneck_distance/CMakeLists.txt
index eac617db..6095d6eb 100644
--- a/example/Bottleneck_distance/CMakeLists.txt
+++ b/example/Bottleneck_distance/CMakeLists.txt
@@ -2,37 +2,21 @@ cmake_minimum_required(VERSION 2.6)
project(Bottleneck_distance_examples)
if (NOT CGAL_VERSION VERSION_LESS 4.8.1)
- add_executable (bottleneck_read_file_example bottleneck_read_file_example.cpp)
add_executable (bottleneck_basic_example bottleneck_basic_example.cpp)
+ add_executable (alpha_rips_persistence_bottleneck_distance alpha_rips_persistence_bottleneck_distance.cpp)
+ target_link_libraries(alpha_rips_persistence_bottleneck_distance ${Boost_PROGRAM_OPTIONS_LIBRARY})
if (TBB_FOUND)
- target_link_libraries(bottleneck_read_file_example ${TBB_LIBRARIES})
+ target_link_libraries(alpha_rips_persistence_bottleneck_distance ${TBB_LIBRARIES})
target_link_libraries(bottleneck_basic_example ${TBB_LIBRARIES})
endif(TBB_FOUND)
-
+
add_test(NAME Bottleneck_distance_example_basic COMMAND $<TARGET_FILE:bottleneck_basic_example>)
-
- add_test(NAME Bottleneck_read_file_example
- COMMAND $<TARGET_FILE:bottleneck_read_file_example>
- "${CMAKE_SOURCE_DIR}/data/persistence_diagram/first.pers" "${CMAKE_SOURCE_DIR}/data/persistence_diagram/second.pers")
-
- install(TARGETS bottleneck_read_file_example DESTINATION bin)
- install(TARGETS bottleneck_basic_example DESTINATION bin)
-
-endif (NOT CGAL_VERSION VERSION_LESS 4.8.1)
-
-# Eigen3 and CGAL > 4.7.0 is required for alpha complex
-# CGAL > 4.8.1 is required for bottleneck distance =>
-if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1)
- add_executable (alpha_rips_persistence_bottleneck_distance alpha_rips_persistence_bottleneck_distance.cpp)
- target_link_libraries(alpha_rips_persistence_bottleneck_distance ${Boost_PROGRAM_OPTIONS_LIBRARY})
-
add_test(NAME Bottleneck_distance_example_alpha_rips_persistence_bottleneck
- COMMAND $<TARGET_FILE:alpha_rips_persistence_bottleneck_distance>
- "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-r" "0.15" "-m" "0.12" "-d" "3" "-p" "3")
+ COMMAND $<TARGET_FILE:alpha_rips_persistence_bottleneck_distance>
+ "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-r" "0.15" "-m" "0.12" "-d" "3" "-p" "3")
+ install(TARGETS bottleneck_basic_example DESTINATION bin)
install(TARGETS alpha_rips_persistence_bottleneck_distance DESTINATION bin)
- if (TBB_FOUND)
- target_link_libraries(alpha_rips_persistence_bottleneck_distance ${TBB_LIBRARIES})
- endif(TBB_FOUND)
-endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1)
+
+endif (NOT CGAL_VERSION VERSION_LESS 4.8.1)
diff --git a/example/Bottleneck_distance/README b/example/Bottleneck_distance/README
new file mode 100644
index 00000000..01bcd74a
--- /dev/null
+++ b/example/Bottleneck_distance/README
@@ -0,0 +1,19 @@
+# Bottleneck_distance #
+
+## `alpha_rips_persistence_bottleneck_distance` ##
+This program computes the persistent homology with coefficient field Z/pZ of a Rips complex defined on a set of input points. The output diagram contains one bar per line, written with the convention:
+
+`p dim birth death`
+
+where `dim` is the dimension of the homological feature, `birth` and `death` are respectively the birth and death of the feature, and `p` is the characteristic of the field *Z/pZ* used for homology coefficients.
+
+Usage:
+`alpha_rips_persistence_bottleneck_distance [options] <OFF input file>`
+
+Allowed options:
+
+* `-h [ --help ]` Produce help message
+* `-r [ --max-edge-length ]` (default = inf) Maximal length of an edge for the Rips complex construction.`
+* `-d [ --cpx-dimension ]` (default = 1) Maximal dimension of the Rips complex we want to compute.`
+* `-p [ --field-charac ]` (default = 11) Characteristic p of the coefficient field Z/pZ for computing homology.
+* `-m [ --min-persistence ]` (default = 0) Minimal lifetime of homology feature to be recorded. Enter a negative value to see zero length intervals.
diff --git a/example/Contraction/CMakeLists.txt b/example/Contraction/CMakeLists.txt
index 83594c0e..a92d1685 100644
--- a/example/Contraction/CMakeLists.txt
+++ b/example/Contraction/CMakeLists.txt
@@ -1,9 +1,10 @@
cmake_minimum_required(VERSION 2.6)
project(Contraction_examples)
-
add_executable(RipsContraction Rips_contraction.cpp)
+
add_executable(GarlandHeckbert Garland_heckbert.cpp)
+target_link_libraries(GarlandHeckbert ${Boost_TIMER_LIBRARY})
add_test(NAME Contraction_example_tore3D_0.2 COMMAND $<TARGET_FILE:RipsContraction>
"${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "0.2")
diff --git a/example/Contraction/Garland_heckbert.cpp b/example/Contraction/Garland_heckbert.cpp
index f0cde95e..2b0dc973 100644
--- a/example/Contraction/Garland_heckbert.cpp
+++ b/example/Contraction/Garland_heckbert.cpp
@@ -29,7 +29,6 @@
#include <gudhi/Edge_contraction.h>
#include <gudhi/Skeleton_blocker.h>
#include <gudhi/Off_reader.h>
-#include <gudhi/Clock.h>
#include <iostream>
@@ -165,8 +164,6 @@ int main(int argc, char *argv[]) {
int num_contractions = atoi(argv[3]);
- Gudhi::Clock contraction_chrono("Time to simplify and enumerate simplices");
-
// constructs the contractor object with Garland Heckbert policies.
Complex_contractor contractor(complex,
new GH_cost(complex),
@@ -182,8 +179,6 @@ int main(int argc, char *argv[]) {
complex.num_edges() << " edges and " <<
complex.num_triangles() << " triangles." << std::endl;
- std::cout << contraction_chrono;
-
// write simplified complex
Gudhi::skeleton_blocker::Skeleton_blocker_off_writer<Complex> off_writer(argv[2], complex);
diff --git a/example/Nerve_GIC/CMakeLists.txt b/example/Nerve_GIC/CMakeLists.txt
new file mode 100644
index 00000000..f2626927
--- /dev/null
+++ b/example/Nerve_GIC/CMakeLists.txt
@@ -0,0 +1,26 @@
+cmake_minimum_required(VERSION 2.6)
+project(Nerve_GIC_examples)
+
+if (NOT CGAL_VERSION VERSION_LESS 4.8.1)
+
+ add_executable ( CoordGIC CoordGIC.cpp )
+ add_executable ( FuncGIC FuncGIC.cpp )
+
+ if (TBB_FOUND)
+ target_link_libraries(CoordGIC ${TBB_LIBRARIES})
+ target_link_libraries(FuncGIC ${TBB_LIBRARIES})
+ endif()
+
+ # Copy files for not to pollute sources when testing
+ file(COPY "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
+ file(COPY "${CMAKE_SOURCE_DIR}/data/points/COIL_database/lucky_cat.off" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
+ file(COPY "${CMAKE_SOURCE_DIR}/data/points/COIL_database/lucky_cat_PCA1" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
+
+ add_test(NAME Nerve_GIC_example_CoordGIC COMMAND $<TARGET_FILE:CoordGIC>
+ "tore3D_1307.off" "0")
+
+ add_test(NAME Nerve_GIC_example_FuncGIC COMMAND $<TARGET_FILE:FuncGIC>
+ "lucky_cat.off"
+ "lucky_cat_PCA1")
+
+endif (NOT CGAL_VERSION VERSION_LESS 4.8.1)
diff --git a/example/Nerve_GIC/CoordGIC.cpp b/example/Nerve_GIC/CoordGIC.cpp
new file mode 100644
index 00000000..c92cf235
--- /dev/null
+++ b/example/Nerve_GIC/CoordGIC.cpp
@@ -0,0 +1,93 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Mathieu Carrière
+ *
+ * Copyright (C) 2017 INRIA
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/GIC.h>
+
+#include <string>
+#include <vector>
+
+void usage(int nbArgs, char *const progName) {
+ std::cerr << "Error: Number of arguments (" << nbArgs << ") is not correct\n";
+ std::cerr << "Usage: " << progName << " filename.off coordinate [-v] \n";
+ std::cerr << " i.e.: " << progName << " ../../data/points/human.off 2 -v \n";
+ exit(-1); // ----- >>
+}
+
+int main(int argc, char **argv) {
+ if ((argc != 3) && (argc != 4)) usage(argc, argv[0]);
+
+ using Point = std::vector<float>;
+
+ std::string off_file_name(argv[1]);
+ int coord = atoi(argv[2]);
+ bool verb = 0;
+ if (argc == 4) verb = 1;
+
+ // -----------------------------------------
+ // Init of a functional GIC from an OFF file
+ // -----------------------------------------
+
+ Gudhi::cover_complex::Cover_complex<Point> GIC;
+ GIC.set_verbose(verb);
+
+ bool check = GIC.read_point_cloud(off_file_name);
+
+ if (!check) {
+ std::cout << "Incorrect OFF file." << std::endl;
+ } else {
+ GIC.set_type("GIC");
+
+ GIC.set_color_from_coordinate(coord);
+ GIC.set_function_from_coordinate(coord);
+
+ GIC.set_graph_from_automatic_rips(Gudhi::Euclidean_distance());
+ GIC.set_automatic_resolution();
+ GIC.set_gain();
+ GIC.set_cover_from_function();
+
+ GIC.find_simplices();
+
+ GIC.plot_DOT();
+
+ Gudhi::Simplex_tree<> stree;
+ GIC.create_complex(stree);
+
+ // --------------------------------------------
+ // Display information about the functional GIC
+ // --------------------------------------------
+
+ if (verb) {
+ std::cout << "Functional GIC is of dimension " << stree.dimension() << " - " << stree.num_simplices()
+ << " simplices - " << stree.num_vertices() << " vertices." << std::endl;
+
+ std::cout << "Iterator on functional GIC simplices" << std::endl;
+ for (auto f_simplex : stree.filtration_simplex_range()) {
+ for (auto vertex : stree.simplex_vertex_range(f_simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << std::endl;
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/example/Nerve_GIC/FuncGIC.cpp b/example/Nerve_GIC/FuncGIC.cpp
new file mode 100644
index 00000000..cb0f0d63
--- /dev/null
+++ b/example/Nerve_GIC/FuncGIC.cpp
@@ -0,0 +1,94 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Mathieu Carrière
+ *
+ * Copyright (C) 2017 INRIA
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/GIC.h>
+
+#include <string>
+#include <vector>
+
+void usage(int nbArgs, char *const progName) {
+ std::cerr << "Error: Number of arguments (" << nbArgs << ") is not correct\n";
+ std::cerr << "Usage: " << progName << " filename.off function [-v] \n";
+ std::cerr << " i.e.: " << progName << " ../../data/points/COIL_database/lucky_cat.off "
+ "../../data/points/COIL_database/lucky_cat_PCA1 -v \n";
+ exit(-1); // ----- >>
+}
+
+int main(int argc, char **argv) {
+ if ((argc != 3) && (argc != 4)) usage(argc, argv[0]);
+
+ using Point = std::vector<float>;
+
+ std::string off_file_name(argv[1]);
+ std::string func_file_name = argv[2];
+ bool verb = 0;
+ if (argc == 4) verb = 1;
+
+ // -----------------------------------------
+ // Init of a functional GIC from an OFF file
+ // -----------------------------------------
+
+ Gudhi::cover_complex::Cover_complex<Point> GIC;
+ GIC.set_verbose(verb);
+
+ bool check = GIC.read_point_cloud(off_file_name);
+
+ if (!check) {
+ std::cout << "Incorrect OFF file." << std::endl;
+ } else {
+ GIC.set_type("GIC");
+
+ GIC.set_color_from_file(func_file_name);
+ GIC.set_function_from_file(func_file_name);
+
+ GIC.set_graph_from_automatic_rips(Gudhi::Euclidean_distance());
+ GIC.set_automatic_resolution();
+ GIC.set_gain();
+ GIC.set_cover_from_function();
+
+ GIC.find_simplices();
+
+ GIC.plot_DOT();
+
+ Gudhi::Simplex_tree<> stree;
+ GIC.create_complex(stree);
+
+ // --------------------------------------------
+ // Display information about the functional GIC
+ // --------------------------------------------
+
+ if (verb) {
+ std::cout << "Functional GIC is of dimension " << stree.dimension() << " - " << stree.num_simplices()
+ << " simplices - " << stree.num_vertices() << " vertices." << std::endl;
+
+ std::cout << "Iterator on functional GIC simplices" << std::endl;
+ for (auto f_simplex : stree.filtration_simplex_range()) {
+ for (auto vertex : stree.simplex_vertex_range(f_simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << std::endl;
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/example/Persistence_representations/CMakeLists.txt b/example/Persistence_representations/CMakeLists.txt
new file mode 100644
index 00000000..eb3258f8
--- /dev/null
+++ b/example/Persistence_representations/CMakeLists.txt
@@ -0,0 +1,27 @@
+cmake_minimum_required(VERSION 2.6)
+project(Persistence_representations_example)
+
+add_executable ( Persistence_representations_example_landscape_on_grid persistence_landscape_on_grid.cpp )
+add_test(NAME Persistence_representations_example_landscape_on_grid
+ COMMAND $<TARGET_FILE:Persistence_representations_example_landscape_on_grid>)
+
+add_executable ( Persistence_representations_example_landscape persistence_landscape.cpp )
+add_test(NAME Persistence_representations_example_landscape
+ COMMAND $<TARGET_FILE:Persistence_representations_example_landscape>)
+
+add_executable ( Persistence_representations_example_intervals persistence_intervals.cpp )
+add_test(NAME Persistence_representations_example_intervals
+ COMMAND $<TARGET_FILE:Persistence_representations_example_intervals>
+ "${CMAKE_SOURCE_DIR}/data/persistence_diagram/first.pers")
+
+add_executable ( Persistence_representations_example_vectors persistence_vectors.cpp )
+add_test(NAME Persistence_representations_example_vectors
+ COMMAND $<TARGET_FILE:Persistence_representations_example_vectors>)
+
+add_executable ( Persistence_representations_example_heat_maps persistence_heat_maps.cpp )
+add_test(NAME Persistence_representations_example_heat_maps
+ COMMAND $<TARGET_FILE:Persistence_representations_example_heat_maps>)
+
+
+
+
diff --git a/example/Persistence_representations/persistence_heat_maps.cpp b/example/Persistence_representations/persistence_heat_maps.cpp
new file mode 100644
index 00000000..2a472ac6
--- /dev/null
+++ b/example/Persistence_representations/persistence_heat_maps.cpp
@@ -0,0 +1,80 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_heat_maps.h>
+
+#include <iostream>
+#include <vector>
+#include <utility>
+
+using constant_scaling_function = Gudhi::Persistence_representations::constant_scaling_function;
+using Persistence_heat_maps = Gudhi::Persistence_representations::Persistence_heat_maps<constant_scaling_function>;
+
+int main(int argc, char** argv) {
+ // create two simple vectors with birth--death pairs:
+
+ std::vector<std::pair<double, double> > persistence1;
+ std::vector<std::pair<double, double> > persistence2;
+
+ persistence1.push_back(std::make_pair(1, 2));
+ persistence1.push_back(std::make_pair(6, 8));
+ persistence1.push_back(std::make_pair(0, 4));
+ persistence1.push_back(std::make_pair(3, 8));
+
+ persistence2.push_back(std::make_pair(2, 9));
+ persistence2.push_back(std::make_pair(1, 6));
+ persistence2.push_back(std::make_pair(3, 5));
+ persistence2.push_back(std::make_pair(6, 10));
+
+ // over here we define a function we sill put on a top on every birth--death pair in the persistence interval. It can
+ // be anything. Over here we will use standard Gaussian
+ std::vector<std::vector<double> > filter = Gudhi::Persistence_representations::create_Gaussian_filter(5, 1);
+
+ // creating two heat maps.
+ Persistence_heat_maps hm1(persistence1, filter, false, 20, 0, 11);
+ Persistence_heat_maps hm2(persistence2, filter, false, 20, 0, 11);
+
+ std::vector<Persistence_heat_maps*> vector_of_maps;
+ vector_of_maps.push_back(&hm1);
+ vector_of_maps.push_back(&hm2);
+
+ // compute median/mean of a vector of heat maps:
+ Persistence_heat_maps mean;
+ mean.compute_mean(vector_of_maps);
+ Persistence_heat_maps median;
+ median.compute_median(vector_of_maps);
+
+ // to compute L^1 distance between hm1 and hm2:
+ std::cout << "The L^1 distance is : " << hm1.distance(hm2, 1) << std::endl;
+
+ // to average of hm1 and hm2:
+ std::vector<Persistence_heat_maps*> to_average;
+ to_average.push_back(&hm1);
+ to_average.push_back(&hm2);
+ Persistence_heat_maps av;
+ av.compute_average(to_average);
+
+ // to compute scalar product of hm1 and hm2:
+ std::cout << "Scalar product is : " << hm1.compute_scalar_product(hm2) << std::endl;
+
+ return 0;
+}
diff --git a/example/Persistence_representations/persistence_intervals.cpp b/example/Persistence_representations/persistence_intervals.cpp
new file mode 100644
index 00000000..c1ceb458
--- /dev/null
+++ b/example/Persistence_representations/persistence_intervals.cpp
@@ -0,0 +1,89 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_intervals.h>
+
+#include <iostream>
+#include <utility>
+#include <vector>
+
+using Persistence_intervals = Gudhi::Persistence_representations::Persistence_intervals;
+
+int main(int argc, char** argv) {
+ if (argc != 2) {
+ std::cout << "To run this program, please provide the name of a file with persistence diagram \n";
+ return 1;
+ }
+
+ Persistence_intervals p(argv[1]);
+ std::pair<double, double> min_max_ = p.get_x_range();
+ std::cout << "Birth-death range : " << min_max_.first << " " << min_max_.second << std::endl;
+
+ std::vector<double> dominant_ten_intervals_length = p.length_of_dominant_intervals(10);
+ std::cout << "Length of ten dominant intervals : " << std::endl;
+ for (size_t i = 0; i != dominant_ten_intervals_length.size(); ++i) {
+ std::cout << dominant_ten_intervals_length[i] << std::endl;
+ }
+
+ std::vector<std::pair<double, double> > ten_dominant_intervals = p.dominant_intervals(10);
+ std::cout << "Here are the dominant intervals : " << std::endl;
+ for (size_t i = 0; i != ten_dominant_intervals.size(); ++i) {
+ std::cout << "( " << ten_dominant_intervals[i].first << "," << ten_dominant_intervals[i].second << std::endl;
+ }
+
+ std::vector<size_t> histogram = p.histogram_of_lengths(10);
+ std::cout << "Here is the histogram of barcode's length : " << std::endl;
+ for (size_t i = 0; i != histogram.size(); ++i) {
+ std::cout << histogram[i] << " ";
+ }
+ std::cout << std::endl;
+
+ std::vector<size_t> cumulative_histogram = p.cumulative_histogram_of_lengths(10);
+ std::cout << "Cumulative histogram : " << std::endl;
+ for (size_t i = 0; i != cumulative_histogram.size(); ++i) {
+ std::cout << cumulative_histogram[i] << " ";
+ }
+ std::cout << std::endl;
+
+ std::vector<double> char_funct_diag = p.characteristic_function_of_diagram(min_max_.first, min_max_.second);
+ std::cout << "Characteristic function of diagram : " << std::endl;
+ for (size_t i = 0; i != char_funct_diag.size(); ++i) {
+ std::cout << char_funct_diag[i] << " ";
+ }
+ std::cout << std::endl;
+
+ std::vector<double> cumul_char_funct_diag =
+ p.cumulative_characteristic_function_of_diagram(min_max_.first, min_max_.second);
+ std::cout << "Cumulative characteristic function of diagram : " << std::endl;
+ for (size_t i = 0; i != cumul_char_funct_diag.size(); ++i) {
+ std::cout << cumul_char_funct_diag[i] << " ";
+ }
+ std::cout << std::endl;
+
+ std::cout << "Persistence Betti numbers \n";
+ std::vector<std::pair<double, size_t> > pbns = p.compute_persistent_betti_numbers();
+ for (size_t i = 0; i != pbns.size(); ++i) {
+ std::cout << pbns[i].first << " " << pbns[i].second << std::endl;
+ }
+
+ return 0;
+}
diff --git a/example/Persistence_representations/persistence_landscape.cpp b/example/Persistence_representations/persistence_landscape.cpp
new file mode 100644
index 00000000..400a9ae1
--- /dev/null
+++ b/example/Persistence_representations/persistence_landscape.cpp
@@ -0,0 +1,86 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_landscape.h>
+
+#include <iostream>
+#include <vector>
+#include <utility>
+
+using Persistence_landscape = Gudhi::Persistence_representations::Persistence_landscape;
+
+int main(int argc, char** argv) {
+ // create two simple vectors with birth--death pairs:
+
+ std::vector<std::pair<double, double> > persistence1;
+ std::vector<std::pair<double, double> > persistence2;
+
+ persistence1.push_back(std::make_pair(1, 2));
+ persistence1.push_back(std::make_pair(6, 8));
+ persistence1.push_back(std::make_pair(0, 4));
+ persistence1.push_back(std::make_pair(3, 8));
+
+ persistence2.push_back(std::make_pair(2, 9));
+ persistence2.push_back(std::make_pair(1, 6));
+ persistence2.push_back(std::make_pair(3, 5));
+ persistence2.push_back(std::make_pair(6, 10));
+
+ // create two persistence landscapes based on persistence1 and persistence2:
+ Persistence_landscape l1(persistence1);
+ Persistence_landscape l2(persistence2);
+
+ // This is how to compute integral of landscapes:
+ std::cout << "Integral of the first landscape : " << l1.compute_integral_of_landscape() << std::endl;
+ std::cout << "Integral of the second landscape : " << l2.compute_integral_of_landscape() << std::endl;
+
+ // And here how to write landscapes to stream:
+ std::cout << "l1 : " << l1 << std::endl;
+ std::cout << "l2 : " << l2 << std::endl;
+
+ // Arithmetic operations on landscapes:
+ Persistence_landscape sum = l1 + l2;
+ std::cout << "sum : " << sum << std::endl;
+
+ // here are the maxima of the functions:
+ std::cout << "Maximum of l1 : " << l1.compute_maximum() << std::endl;
+ std::cout << "Maximum of l2 : " << l2.compute_maximum() << std::endl;
+
+ // here are the norms of landscapes:
+ std::cout << "L^1 Norm of l1 : " << l1.compute_norm_of_landscape(1.) << std::endl;
+ std::cout << "L^1 Norm of l2 : " << l2.compute_norm_of_landscape(1.) << std::endl;
+
+ // here is the average of landscapes:
+ Persistence_landscape average;
+ average.compute_average({&l1, &l2});
+ std::cout << "average : " << average << std::endl;
+
+ // here is the distance of landscapes:
+ std::cout << "Distance : " << l1.distance(l2) << std::endl;
+
+ // here is the scalar product of landscapes:
+ std::cout << "Scalar product : " << l1.compute_scalar_product(l2) << std::endl;
+
+ // here is how to create a file which is suitable for visualization via gnuplot:
+ average.plot("average_landscape");
+
+ return 0;
+}
diff --git a/example/Persistence_representations/persistence_landscape_on_grid.cpp b/example/Persistence_representations/persistence_landscape_on_grid.cpp
new file mode 100644
index 00000000..b201b397
--- /dev/null
+++ b/example/Persistence_representations/persistence_landscape_on_grid.cpp
@@ -0,0 +1,82 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_landscape_on_grid.h>
+
+#include <iostream>
+#include <utility>
+#include <vector>
+
+using Persistence_landscape_on_grid = Gudhi::Persistence_representations::Persistence_landscape_on_grid;
+
+int main(int argc, char** argv) {
+ // create two simple vectors with birth--death pairs:
+
+ std::vector<std::pair<double, double> > persistence1;
+ std::vector<std::pair<double, double> > persistence2;
+
+ persistence1.push_back(std::make_pair(1, 2));
+ persistence1.push_back(std::make_pair(6, 8));
+ persistence1.push_back(std::make_pair(0, 4));
+ persistence1.push_back(std::make_pair(3, 8));
+
+ persistence2.push_back(std::make_pair(2, 9));
+ persistence2.push_back(std::make_pair(1, 6));
+ persistence2.push_back(std::make_pair(3, 5));
+ persistence2.push_back(std::make_pair(6, 10));
+
+ // create two persistence landscapes based on persistence1 and persistence2:
+ Persistence_landscape_on_grid l1(persistence1, 0, 11, 20);
+ Persistence_landscape_on_grid l2(persistence2, 0, 11, 20);
+
+ // This is how to compute integral of landscapes:
+ std::cout << "Integral of the first landscape : " << l1.compute_integral_of_landscape() << std::endl;
+ std::cout << "Integral of the second landscape : " << l2.compute_integral_of_landscape() << std::endl;
+
+ // And here how to write landscapes to stream:
+ std::cout << "l1 : " << l1 << std::endl;
+ std::cout << "l2 : " << l2 << std::endl;
+
+ // here are the maxima of the functions:
+ std::cout << "Maximum of l1 : " << l1.compute_maximum() << std::endl;
+ std::cout << "Maximum of l2 : " << l2.compute_maximum() << std::endl;
+
+ // here are the norms of landscapes:
+ std::cout << "L^1 Norm of l1 : " << l1.compute_norm_of_landscape(1.) << std::endl;
+ std::cout << "L^1 Norm of l2 : " << l2.compute_norm_of_landscape(1.) << std::endl;
+
+ // here is the average of landscapes:
+ Persistence_landscape_on_grid average;
+ average.compute_average({&l1, &l2});
+ std::cout << "average : " << average << std::endl;
+
+ // here is the distance of landscapes:
+ std::cout << "Distance : " << l1.distance(l2) << std::endl;
+
+ // here is the scalar product of landscapes:
+ std::cout << "Scalar product : " << l1.compute_scalar_product(l2) << std::endl;
+
+ // here is how to create a file which is suitable for visualization via gnuplot:
+ average.plot("average_landscape");
+
+ return 0;
+}
diff --git a/example/Persistence_representations/persistence_vectors.cpp b/example/Persistence_representations/persistence_vectors.cpp
new file mode 100644
index 00000000..834ae644
--- /dev/null
+++ b/example/Persistence_representations/persistence_vectors.cpp
@@ -0,0 +1,74 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_vectors.h>
+
+#include <iostream>
+#include <vector>
+#include <cmath>
+#include <iomanip>
+#include <limits>
+#include <utility>
+
+using Vector_distances_in_diagram =
+ Gudhi::Persistence_representations::Vector_distances_in_diagram<Gudhi::Euclidean_distance>;
+
+int main(int argc, char** argv) {
+ // create two simple vectors with birth--death pairs:
+
+ std::vector<std::pair<double, double> > persistence1;
+ std::vector<std::pair<double, double> > persistence2;
+
+ persistence1.push_back(std::make_pair(1, 2));
+ persistence1.push_back(std::make_pair(6, 8));
+ persistence1.push_back(std::make_pair(0, 4));
+ persistence1.push_back(std::make_pair(3, 8));
+
+ persistence2.push_back(std::make_pair(2, 9));
+ persistence2.push_back(std::make_pair(1, 6));
+ persistence2.push_back(std::make_pair(3, 5));
+ persistence2.push_back(std::make_pair(6, 10));
+
+ // create two persistence vectors based on persistence1 and persistence2:
+ Vector_distances_in_diagram v1(persistence1, std::numeric_limits<size_t>::max());
+ Vector_distances_in_diagram v2(persistence2, std::numeric_limits<size_t>::max());
+
+ // writing to a stream:
+ std::cout << "v1 : " << v1 << std::endl;
+ std::cout << "v2 : " << v2 << std::endl;
+
+ // averages:
+ Vector_distances_in_diagram average;
+ average.compute_average({&v1, &v2});
+ std::cout << "Average : " << average << std::endl;
+
+ // computations of distances:
+ std::cout << "l^1 distance : " << v1.distance(v2) << std::endl;
+
+ // computations of scalar product:
+ std::cout << "Scalar product of l1 and l2 : " << v1.compute_scalar_product(v2) << std::endl;
+
+ // create a file with a gnuplot script:
+ v1.plot("plot_of_vector_representation");
+
+ return 0;
+}
diff --git a/example/Persistent_cohomology/CMakeLists.txt b/example/Persistent_cohomology/CMakeLists.txt
index f47de4c3..18e2913b 100644
--- a/example/Persistent_cohomology/CMakeLists.txt
+++ b/example/Persistent_cohomology/CMakeLists.txt
@@ -5,12 +5,6 @@ add_executable(plain_homology plain_homology.cpp)
add_executable(persistence_from_simple_simplex_tree persistence_from_simple_simplex_tree.cpp)
-add_executable(rips_distance_matrix_persistence rips_distance_matrix_persistence.cpp)
-target_link_libraries(rips_distance_matrix_persistence ${Boost_PROGRAM_OPTIONS_LIBRARY})
-
-add_executable(rips_persistence rips_persistence.cpp)
-target_link_libraries(rips_persistence ${Boost_PROGRAM_OPTIONS_LIBRARY})
-
add_executable(rips_persistence_step_by_step rips_persistence_step_by_step.cpp)
target_link_libraries(rips_persistence_step_by_step ${Boost_PROGRAM_OPTIONS_LIBRARY})
@@ -23,8 +17,6 @@ target_link_libraries(persistence_from_file ${Boost_PROGRAM_OPTIONS_LIBRARY})
if (TBB_FOUND)
target_link_libraries(plain_homology ${TBB_LIBRARIES})
target_link_libraries(persistence_from_simple_simplex_tree ${TBB_LIBRARIES})
- target_link_libraries(rips_distance_matrix_persistence ${TBB_LIBRARIES})
- target_link_libraries(rips_persistence ${TBB_LIBRARIES})
target_link_libraries(rips_persistence_step_by_step ${TBB_LIBRARIES})
target_link_libraries(rips_persistence_via_boundary_matrix ${TBB_LIBRARIES})
target_link_libraries(persistence_from_file ${TBB_LIBRARIES})
@@ -33,10 +25,6 @@ endif()
add_test(NAME Persistent_cohomology_example_plain_homology COMMAND $<TARGET_FILE:plain_homology>)
add_test(NAME Persistent_cohomology_example_from_simple_simplex_tree COMMAND $<TARGET_FILE:persistence_from_simple_simplex_tree>
"1" "0")
-add_test(NAME Persistent_cohomology_example_from_rips_distance_matrix COMMAND $<TARGET_FILE:rips_distance_matrix_persistence>
- "${CMAKE_SOURCE_DIR}/data/distance_matrix/full_square_distance_matrix.csv" "-r" "1.0" "-d" "3" "-p" "3" "-m" "0")
-add_test(NAME Persistent_cohomology_example_from_rips_on_tore_3D COMMAND $<TARGET_FILE:rips_persistence>
- "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "3")
add_test(NAME Persistent_cohomology_example_from_rips_step_by_step_on_tore_3D COMMAND $<TARGET_FILE:rips_persistence_step_by_step>
"${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "3")
add_test(NAME Persistent_cohomology_example_via_boundary_matrix COMMAND $<TARGET_FILE:rips_persistence_via_boundary_matrix>
@@ -48,8 +36,6 @@ add_test(NAME Persistent_cohomology_example_from_file_3_3_100 COMMAND $<TARGET_F
install(TARGETS plain_homology DESTINATION bin)
install(TARGETS persistence_from_simple_simplex_tree DESTINATION bin)
-install(TARGETS rips_distance_matrix_persistence DESTINATION bin)
-install(TARGETS rips_persistence DESTINATION bin)
install(TARGETS rips_persistence_step_by_step DESTINATION bin)
install(TARGETS rips_persistence_via_boundary_matrix DESTINATION bin)
install(TARGETS persistence_from_file DESTINATION bin)
@@ -69,53 +55,15 @@ if(GMP_FOUND)
endif(GMP_FOUND)
if(CGAL_FOUND)
- add_executable(alpha_complex_3d_persistence alpha_complex_3d_persistence.cpp)
- target_link_libraries(alpha_complex_3d_persistence ${CGAL_LIBRARY})
- add_executable(exact_alpha_complex_3d_persistence exact_alpha_complex_3d_persistence.cpp)
- target_link_libraries(exact_alpha_complex_3d_persistence ${CGAL_LIBRARY})
- add_executable(weighted_alpha_complex_3d_persistence weighted_alpha_complex_3d_persistence.cpp)
- target_link_libraries(weighted_alpha_complex_3d_persistence ${CGAL_LIBRARY})
-
- if (TBB_FOUND)
- target_link_libraries(alpha_complex_3d_persistence ${TBB_LIBRARIES})
- target_link_libraries(exact_alpha_complex_3d_persistence ${TBB_LIBRARIES})
- target_link_libraries(weighted_alpha_complex_3d_persistence ${TBB_LIBRARIES})
- endif(TBB_FOUND)
- add_test(NAME Persistent_cohomology_example_alpha_complex_3d COMMAND $<TARGET_FILE:alpha_complex_3d_persistence>
- "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "2" "0.45")
- add_test(NAME Persistent_cohomology_example_exact_alpha_complex_3d COMMAND $<TARGET_FILE:exact_alpha_complex_3d_persistence>
- "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "2" "0.45")
- add_test(NAME Persistent_cohomology_example_weighted_alpha_complex_3d COMMAND $<TARGET_FILE:weighted_alpha_complex_3d_persistence>
- "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.weights" "2" "0.45")
-
- install(TARGETS alpha_complex_3d_persistence DESTINATION bin)
- install(TARGETS exact_alpha_complex_3d_persistence DESTINATION bin)
- install(TARGETS weighted_alpha_complex_3d_persistence DESTINATION bin)
-
if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.7.0)
- add_executable (alpha_complex_persistence alpha_complex_persistence.cpp)
- target_link_libraries(alpha_complex_persistence
- ${CGAL_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY})
-
- add_executable(periodic_alpha_complex_3d_persistence periodic_alpha_complex_3d_persistence.cpp)
- target_link_libraries(periodic_alpha_complex_3d_persistence ${CGAL_LIBRARY})
-
add_executable(custom_persistence_sort custom_persistence_sort.cpp)
target_link_libraries(custom_persistence_sort ${CGAL_LIBRARY})
if (TBB_FOUND)
- target_link_libraries(alpha_complex_persistence ${TBB_LIBRARIES})
- target_link_libraries(periodic_alpha_complex_3d_persistence ${TBB_LIBRARIES})
target_link_libraries(custom_persistence_sort ${TBB_LIBRARIES})
endif(TBB_FOUND)
- add_test(NAME Persistent_cohomology_example_alpha_complex COMMAND $<TARGET_FILE:alpha_complex_persistence>
- "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-p" "2" "-m" "0.45")
- add_test(NAME Persistent_cohomology_example_periodic_alpha_complex_3d COMMAND $<TARGET_FILE:periodic_alpha_complex_3d_persistence>
- "${CMAKE_SOURCE_DIR}/data/points/grid_10_10_10_in_0_1.off" "${CMAKE_SOURCE_DIR}/data/points/iso_cuboid_3_in_0_1.txt" "2" "0")
add_test(NAME Persistent_cohomology_example_custom_persistence_sort COMMAND $<TARGET_FILE:custom_persistence_sort>)
- install(TARGETS alpha_complex_persistence DESTINATION bin)
- install(TARGETS periodic_alpha_complex_3d_persistence DESTINATION bin)
install(TARGETS custom_persistence_sort DESTINATION bin)
endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.7.0)
diff --git a/example/Persistent_cohomology/README b/example/Persistent_cohomology/README
index 794b94ae..f39d9584 100644
--- a/example/Persistent_cohomology/README
+++ b/example/Persistent_cohomology/README
@@ -1,43 +1,14 @@
-To build the example, run in a Terminal:
+To build the examples, run in a Terminal:
-cd /path-to-example/
+cd /path-to-examples/
cmake .
make
***********************************************************************************************************************
Example of use of RIPS:
-Computation of the persistent homology with Z/2Z coefficients of the Rips complex on points
-sampling a Klein bottle:
-
-./rips_persistence ../../data/points/tore3D_1307.off -r 0.25 -m 0.5 -d 3 -p 2
-
-output:
-2 0 0 inf
-2 1 0.0983494 inf
-2 1 0.104347 inf
-2 2 0.138335 inf
-
-
-Every line is of this format: p1*...*pr dim b d
-where
- p1*...*pr is the product of prime numbers pi such that the homology feature exists in homology with Z/piZ coefficients.
- dim is the dimension of the homological feature,
- b and d are respectively the birth and death of the feature and
-
-
-
-with Z/3Z coefficients:
-
-./rips_persistence ../../data/points/tore3D_1307.off -r 0.25 -m 0.5 -d 3 -p 3
-
-output:
-3 0 0 inf
-3 1 0.0983494 inf
-3 1 0.104347 inf
-3 2 0.138335 inf
-
-and the computation with Z/2Z and Z/3Z coefficients simultaneously:
+Computation of the persistent homology with Z/2Z and Z/3Z coefficients simultaneously of the Rips complex
+on points sampling a 3D torus:
./rips_multifield_persistence ../../data/points/tore3D_1307.off -r 0.25 -m 0.12 -d 3 -p 2 -q 3
@@ -53,7 +24,13 @@ output:
6 0 0 0.12047
6 0 0 0.120414
-and finally the computation with all Z/pZ for 2 <= p <= 71 (20 first prime numbers):
+Every line is of this format: p1*...*pr dim b d
+where
+ p1*...*pr is the product of prime numbers pi such that the homology feature exists in homology with Z/piZ coefficients.
+ dim is the dimension of the homological feature,
+ b and d are respectively the birth and death of the feature and
+
+and the computation with all Z/pZ for 2 <= p <= 71 (20 first prime numbers):
./rips_multifield_persistence ../../data/points/Kl.off -r 0.25 -m 0.5 -d 3 -p 2 -q 71
@@ -70,82 +47,6 @@ output:
557940830126698960967415390 0 0 0.120414
***********************************************************************************************************************
-Example of use of ALPHA:
-
-For a more verbose mode, please run cmake with option "DEBUG_TRACES=TRUE" and recompile the programs.
-
-1) 3D special case
-------------------
-Computation of the persistent homology with Z/2Z coefficients of the alpha complex on points
-sampling a torus 3D:
-
-./alpha_complex_3d_persistence ../../data/points/tore3D_300.off 2 0.45
-
-output:
-Simplex_tree dim: 3
-2 0 0 inf
-2 1 0.0682162 1.0001
-2 1 0.0934117 1.00003
-2 2 0.56444 1.03938
-
-Here we retrieve expected Betti numbers on a tore 3D:
-Betti numbers[0] = 1
-Betti numbers[1] = 2
-Betti numbers[2] = 1
-
-N.B.: - alpha_complex_3d_persistence accepts only OFF files in 3D dimension.
- - filtration values are alpha square values
-
-2) d-Dimension case
--------------------
-Computation of the persistent homology with Z/2Z coefficients of the alpha complex on points
-sampling a torus 3D:
-
-./alpha_complex_persistence -r 32 -p 2 -m 0.45 ../../data/points/tore3D_300.off
-
-output:
-Alpha complex is of dimension 3 - 9273 simplices - 300 vertices.
-Simplex_tree dim: 3
-2 0 0 inf
-2 1 0.0682162 1.0001
-2 1 0.0934117 1.00003
-2 2 0.56444 1.03938
-
-Here we retrieve expected Betti numbers on a tore 3D:
-Betti numbers[0] = 1
-Betti numbers[1] = 2
-Betti numbers[2] = 1
-
-N.B.: - alpha_complex_persistence accepts OFF files in d-Dimension.
- - filtration values are alpha square values
-
-3) 3D periodic special case
----------------------------
-./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
-
-output:
-Periodic Delaunay computed.
-Simplex_tree dim: 3
-3 0 0 inf
-3 1 0.0025 inf
-3 1 0.0025 inf
-3 1 0.0025 inf
-3 2 0.005 inf
-3 2 0.005 inf
-3 2 0.005 inf
-3 3 0.0075 inf
-
-Here we retrieve expected Betti numbers on a tore 3D:
-Betti numbers[0] = 1
-Betti numbers[1] = 3
-Betti numbers[2] = 3
-Betti numbers[3] = 1
-
-N.B.: - periodic_alpha_complex_3d_persistence accepts only OFF files in 3D dimension. In this example, the periodic cube
-is hard coded to { x = [0,1]; y = [0,1]; z = [0,1] }
- - filtration values are alpha square values
-
-***********************************************************************************************************************
Example of use of PLAIN HOMOLOGY:
This example computes the plain homology of the following simplicial complex without filtration values:
diff --git a/example/Persistent_cohomology/persistence_from_simple_simplex_tree.cpp b/example/Persistent_cohomology/persistence_from_simple_simplex_tree.cpp
index 8214d66a..8ef479d4 100644
--- a/example/Persistent_cohomology/persistence_from_simple_simplex_tree.cpp
+++ b/example/Persistent_cohomology/persistence_from_simple_simplex_tree.cpp
@@ -142,7 +142,6 @@ int main(int argc, char * const argv[]) {
/* An edge [11,6] */
/* An edge [10,12,2] */
- st.set_dimension(2);
std::cout << "The complex contains " << st.num_simplices() << " simplices - " << st.num_vertices() << " vertices "
<< std::endl;
diff --git a/example/Persistent_cohomology/plain_homology.cpp b/example/Persistent_cohomology/plain_homology.cpp
index 50f692f2..a5ae09c8 100644
--- a/example/Persistent_cohomology/plain_homology.cpp
+++ b/example/Persistent_cohomology/plain_homology.cpp
@@ -64,8 +64,6 @@ int main() {
st.insert_simplex_and_subfaces(edge03);
st.insert_simplex(edge13);
st.insert_simplex(vertex4);
- // FIXME: Remove this line
- st.set_dimension(2);
// Sort the simplices in the order of the filtration
st.initialize_filtration();
diff --git a/example/Persistent_cohomology/rips_persistence_step_by_step.cpp b/example/Persistent_cohomology/rips_persistence_step_by_step.cpp
index 554eeba6..c1de0ef8 100644
--- a/example/Persistent_cohomology/rips_persistence_step_by_step.cpp
+++ b/example/Persistent_cohomology/rips_persistence_step_by_step.cpp
@@ -45,14 +45,7 @@
using Simplex_tree = Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_fast_persistence>;
using Vertex_handle = Simplex_tree::Vertex_handle;
using Filtration_value = Simplex_tree::Filtration_value;
-using Graph_t = boost::adjacency_list < boost::vecS, boost::vecS, boost::undirectedS
-, boost::property < vertex_filtration_t, Filtration_value >
-, boost::property < edge_filtration_t, Filtration_value >
->;
-using Edge_t = std::pair< Vertex_handle, Vertex_handle >;
-
-template< typename InputPointRange, typename Distance >
-Graph_t compute_proximity_graph(InputPointRange &points, Filtration_value threshold, Distance distance);
+using Proximity_graph = Gudhi::Proximity_graph<Simplex_tree>;
using Field_Zp = Gudhi::persistent_cohomology::Field_Zp;
using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology<Simplex_tree, Field_Zp >;
@@ -81,8 +74,9 @@ int main(int argc, char * argv[]) {
Points_off_reader off_reader(off_file_points);
// Compute the proximity graph of the points
- Graph_t prox_graph = compute_proximity_graph(off_reader.get_point_cloud(), threshold
- , Gudhi::Euclidean_distance());
+ Proximity_graph prox_graph = Gudhi::compute_proximity_graph<Simplex_tree>(off_reader.get_point_cloud(),
+ threshold,
+ Gudhi::Euclidean_distance());
// Construct the Rips complex in a Simplex Tree
Simplex_tree st;
@@ -170,48 +164,3 @@ void program_options(int argc, char * argv[]
std::abort();
}
}
-
-/** Output the proximity graph of the points.
- *
- * If points contains n elements, the proximity graph is the graph
- * with n vertices, and an edge [u,v] iff the distance function between
- * points u and v is smaller than threshold.
- *
- * The type PointCloud furnishes .begin() and .end() methods, that return
- * iterators with value_type Point.
- */
-template< typename InputPointRange, typename Distance >
-Graph_t compute_proximity_graph(InputPointRange &points, Filtration_value threshold, Distance distance) {
- std::vector< Edge_t > edges;
- std::vector< Filtration_value > edges_fil;
-
- Vertex_handle idx_u, idx_v;
- Filtration_value fil;
- idx_u = 0;
- for (auto it_u = points.begin(); it_u != points.end(); ++it_u) {
- idx_v = idx_u + 1;
- for (auto it_v = it_u + 1; it_v != points.end(); ++it_v, ++idx_v) {
- fil = distance(*it_u, *it_v);
- if (fil <= threshold) {
- edges.emplace_back(idx_u, idx_v);
- edges_fil.push_back(fil);
- }
- }
- ++idx_u;
- }
-
- Graph_t skel_graph(edges.begin()
- , edges.end()
- , edges_fil.begin()
- , idx_u); // number of points labeled from 0 to idx_u-1
-
- auto vertex_prop = boost::get(vertex_filtration_t(), skel_graph);
-
- boost::graph_traits<Graph_t>::vertex_iterator vi, vi_end;
- for (std::tie(vi, vi_end) = boost::vertices(skel_graph);
- vi != vi_end; ++vi) {
- boost::put(vertex_prop, *vi, 0.);
- }
-
- return skel_graph;
-}
diff --git a/example/Simplex_tree/CMakeLists.txt b/example/Simplex_tree/CMakeLists.txt
index e22cc92c..b33b2d05 100644
--- a/example/Simplex_tree/CMakeLists.txt
+++ b/example/Simplex_tree/CMakeLists.txt
@@ -35,4 +35,21 @@ if(GMP_FOUND AND CGAL_FOUND)
install(TARGETS Simplex_tree_example_alpha_shapes_3_from_off DESTINATION bin)
+ add_executable ( Simplex_tree_example_cech_complex_cgal_mini_sphere_3d cech_complex_cgal_mini_sphere_3d.cpp )
+ target_link_libraries(Simplex_tree_example_cech_complex_cgal_mini_sphere_3d ${Boost_PROGRAM_OPTIONS_LIBRARY} ${CGAL_LIBRARY})
+ if (TBB_FOUND)
+ target_link_libraries(Simplex_tree_example_cech_complex_cgal_mini_sphere_3d ${TBB_LIBRARIES})
+ endif()
+ add_test(NAME Simplex_tree_example_cech_complex_cgal_mini_sphere_3d COMMAND $<TARGET_FILE:Simplex_tree_example_cech_complex_cgal_mini_sphere_3d>
+ "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" -r 0.3 -d 3)
+
+ install(TARGETS Simplex_tree_example_alpha_shapes_3_from_off DESTINATION bin)
endif()
+
+add_executable ( Simplex_tree_example_graph_expansion_with_blocker graph_expansion_with_blocker.cpp )
+if (TBB_FOUND)
+ target_link_libraries(Simplex_tree_example_graph_expansion_with_blocker ${TBB_LIBRARIES})
+endif()
+add_test(NAME Simplex_tree_example_graph_expansion_with_blocker COMMAND $<TARGET_FILE:Simplex_tree_example_graph_expansion_with_blocker>)
+
+install(TARGETS Simplex_tree_example_graph_expansion_with_blocker DESTINATION bin)
diff --git a/example/Simplex_tree/cech_complex_cgal_mini_sphere_3d.cpp b/example/Simplex_tree/cech_complex_cgal_mini_sphere_3d.cpp
new file mode 100644
index 00000000..9bd51106
--- /dev/null
+++ b/example/Simplex_tree/cech_complex_cgal_mini_sphere_3d.cpp
@@ -0,0 +1,221 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Clément Maria
+ *
+ * Copyright (C) 2014 INRIA Sophia Antipolis-Méditerranée (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/graph_simplicial_complex.h>
+#include <gudhi/distance_functions.h>
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Points_off_io.h>
+
+#include <CGAL/Epick_d.h>
+#include <CGAL/Min_sphere_of_spheres_d.h>
+#include <CGAL/Min_sphere_of_points_d_traits_d.h>
+
+#include <boost/program_options.hpp>
+
+#include <string>
+#include <vector>
+#include <limits> // infinity
+#include <utility> // for pair
+#include <map>
+
+// -------------------------------------------------------------------------------
+// cech_complex_cgal_mini_sphere_3d is an example of each step that is required to
+// build a Cech over a Simplex_tree. Please refer to cech_persistence to see
+// how to do the same thing with the Cech_complex wrapper for less detailed
+// steps.
+// -------------------------------------------------------------------------------
+
+// Types definition
+using Simplex_tree = Gudhi::Simplex_tree<>;
+using Vertex_handle = Simplex_tree::Vertex_handle;
+using Simplex_handle = Simplex_tree::Simplex_handle;
+using Filtration_value = Simplex_tree::Filtration_value;
+using Siblings = Simplex_tree::Siblings;
+using Graph_t = boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS,
+ boost::property<Gudhi::vertex_filtration_t, Filtration_value>,
+ boost::property<Gudhi::edge_filtration_t, Filtration_value> >;
+using Edge_t = std::pair<Vertex_handle, Vertex_handle>;
+
+using Kernel = CGAL::Epick_d<CGAL::Dimension_tag<3> >;
+using Point = Kernel::Point_d;
+using Traits = CGAL::Min_sphere_of_points_d_traits_d<Kernel, Filtration_value, 3>;
+using Min_sphere = CGAL::Min_sphere_of_spheres_d<Traits>;
+
+using Points_off_reader = Gudhi::Points_off_reader<Point>;
+
+class Cech_blocker {
+ public:
+ bool operator()(Simplex_handle sh) {
+ std::vector<Point> points;
+#if DEBUG_TRACES
+ std::cout << "Cech_blocker on [";
+#endif // DEBUG_TRACES
+ for (auto vertex : simplex_tree_.simplex_vertex_range(sh)) {
+ points.push_back(point_cloud_[vertex]);
+#if DEBUG_TRACES
+ std::cout << vertex << ", ";
+#endif // DEBUG_TRACES
+ }
+ Min_sphere ms(points.begin(), points.end());
+ Filtration_value radius = ms.radius();
+#if DEBUG_TRACES
+ std::cout << "] - radius = " << radius << " - returns " << (radius > threshold_) << std::endl;
+#endif // DEBUG_TRACES
+ simplex_tree_.assign_filtration(sh, radius);
+ return (radius > threshold_);
+ }
+ Cech_blocker(Simplex_tree& simplex_tree, Filtration_value threshold, const std::vector<Point>& point_cloud)
+ : simplex_tree_(simplex_tree), threshold_(threshold), point_cloud_(point_cloud) {}
+
+ private:
+ Simplex_tree simplex_tree_;
+ Filtration_value threshold_;
+ std::vector<Point> point_cloud_;
+};
+
+template <typename InputPointRange>
+Graph_t compute_proximity_graph(InputPointRange& points, Filtration_value threshold);
+
+void program_options(int argc, char* argv[], std::string& off_file_points, Filtration_value& threshold, int& dim_max);
+
+int main(int argc, char* argv[]) {
+ std::string off_file_points;
+ Filtration_value threshold;
+ int dim_max;
+
+ program_options(argc, argv, off_file_points, threshold, dim_max);
+
+ // Extract the points from the file filepoints
+ Points_off_reader off_reader(off_file_points);
+
+ // Compute the proximity graph of the points
+ Graph_t prox_graph = compute_proximity_graph(off_reader.get_point_cloud(), threshold);
+
+ // Min_sphere sph1(off_reader.get_point_cloud()[0], off_reader.get_point_cloud()[1], off_reader.get_point_cloud()[2]);
+ // Construct the Rips complex in a Simplex Tree
+ Simplex_tree st;
+ // insert the proximity graph in the simplex tree
+ st.insert_graph(prox_graph);
+ // expand the graph until dimension dim_max
+ st.expansion_with_blockers(dim_max, Cech_blocker(st, threshold, off_reader.get_point_cloud()));
+
+ std::cout << "The complex contains " << st.num_simplices() << " simplices \n";
+ std::cout << " and has dimension " << st.dimension() << " \n";
+
+ // Sort the simplices in the order of the filtration
+ st.initialize_filtration();
+
+#if DEBUG_TRACES
+ std::cout << "********************************************************************\n";
+ // Display the Simplex_tree - Can not be done in the middle of 2 inserts
+ std::cout << "* The complex contains " << st.num_simplices() << " simplices - dimension=" << st.dimension() << "\n";
+ std::cout << "* Iterator on Simplices in the filtration, with [filtration value]:\n";
+ for (auto f_simplex : st.filtration_simplex_range()) {
+ std::cout << " "
+ << "[" << st.filtration(f_simplex) << "] ";
+ for (auto vertex : st.simplex_vertex_range(f_simplex)) {
+ std::cout << static_cast<int>(vertex) << " ";
+ }
+ std::cout << std::endl;
+ }
+#endif // DEBUG_TRACES
+ return 0;
+}
+
+void program_options(int argc, char* argv[], std::string& off_file_points, Filtration_value& threshold, int& dim_max) {
+ namespace po = boost::program_options;
+ po::options_description hidden("Hidden options");
+ hidden.add_options()("input-file", po::value<std::string>(&off_file_points),
+ "Name of an OFF file containing a 3d point set.\n");
+
+ po::options_description visible("Allowed options", 100);
+ visible.add_options()("help,h", "produce help message")(
+ "max-edge-length,r",
+ po::value<Filtration_value>(&threshold)->default_value(std::numeric_limits<Filtration_value>::infinity()),
+ "Maximal length of an edge for the Cech complex construction.")(
+ "cpx-dimension,d", po::value<int>(&dim_max)->default_value(1),
+ "Maximal dimension of the Cech complex we want to compute.");
+
+ po::positional_options_description pos;
+ pos.add("input-file", 1);
+
+ po::options_description all;
+ all.add(visible).add(hidden);
+
+ po::variables_map vm;
+ po::store(po::command_line_parser(argc, argv).options(all).positional(pos).run(), vm);
+ po::notify(vm);
+
+ if (vm.count("help") || !vm.count("input-file")) {
+ std::cout << std::endl;
+ std::cout << "Construct a Cech complex defined on a set of input points.\n \n";
+
+ std::cout << "Usage: " << argv[0] << " [options] input-file" << std::endl << std::endl;
+ std::cout << visible << std::endl;
+ std::abort();
+ }
+}
+
+/** Output the proximity graph of the points.
+ *
+ * If points contains n elements, the proximity graph is the graph
+ * with n vertices, and an edge [u,v] iff the distance function between
+ * points u and v is smaller than threshold.
+ *
+ * The type PointCloud furnishes .begin() and .end() methods, that return
+ * iterators with value_type Point.
+ */
+template <typename InputPointRange>
+Graph_t compute_proximity_graph(InputPointRange& points, Filtration_value threshold) {
+ std::vector<Edge_t> edges;
+ std::vector<Filtration_value> edges_fil;
+
+ Kernel k;
+ Vertex_handle idx_u, idx_v;
+ Filtration_value fil;
+ idx_u = 0;
+ for (auto it_u = points.begin(); it_u != points.end(); ++it_u) {
+ idx_v = idx_u + 1;
+ for (auto it_v = it_u + 1; it_v != points.end(); ++it_v, ++idx_v) {
+ fil = k.squared_distance_d_object()(*it_u, *it_v);
+ // For Cech Complex, threshold is a radius (distance /2)
+ fil = std::sqrt(fil) / 2.;
+ if (fil <= threshold) {
+ edges.emplace_back(idx_u, idx_v);
+ edges_fil.push_back(fil);
+ }
+ }
+ ++idx_u;
+ }
+
+ Graph_t skel_graph(edges.begin(), edges.end(), edges_fil.begin(),
+ idx_u); // number of points labeled from 0 to idx_u-1
+
+ auto vertex_prop = boost::get(Gudhi::vertex_filtration_t(), skel_graph);
+
+ boost::graph_traits<Graph_t>::vertex_iterator vi, vi_end;
+ for (std::tie(vi, vi_end) = boost::vertices(skel_graph); vi != vi_end; ++vi) {
+ boost::put(vertex_prop, *vi, 0.);
+ }
+
+ return skel_graph;
+}
diff --git a/example/Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp b/example/Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp
index ff2eebcb..d8289ba9 100644
--- a/example/Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp
+++ b/example/Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp
@@ -28,6 +28,8 @@
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Delaunay_triangulation_3.h>
#include <CGAL/Alpha_shape_3.h>
+#include <CGAL/Alpha_shape_vertex_base_3.h>
+#include <CGAL/Alpha_shape_cell_base_3.h>
#include <CGAL/iterator.h>
#include <fstream>
diff --git a/example/Simplex_tree/graph_expansion_with_blocker.cpp b/example/Simplex_tree/graph_expansion_with_blocker.cpp
new file mode 100644
index 00000000..0d458cbd
--- /dev/null
+++ b/example/Simplex_tree/graph_expansion_with_blocker.cpp
@@ -0,0 +1,77 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Vincent Rouvreau
+ *
+ * Copyright (C) 2014
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Simplex_tree.h>
+
+#include <iostream>
+
+using Simplex_tree = Gudhi::Simplex_tree<>;
+using Simplex_handle = Simplex_tree::Simplex_handle;
+
+int main(int argc, char* const argv[]) {
+ // Construct the Simplex Tree with a 1-skeleton graph example
+ Simplex_tree simplexTree;
+
+ simplexTree.insert_simplex({0, 1}, 0.);
+ simplexTree.insert_simplex({0, 2}, 1.);
+ simplexTree.insert_simplex({0, 3}, 2.);
+ simplexTree.insert_simplex({1, 2}, 3.);
+ simplexTree.insert_simplex({1, 3}, 4.);
+ simplexTree.insert_simplex({2, 3}, 5.);
+ simplexTree.insert_simplex({2, 4}, 6.);
+ simplexTree.insert_simplex({3, 6}, 7.);
+ simplexTree.insert_simplex({4, 5}, 8.);
+ simplexTree.insert_simplex({4, 6}, 9.);
+ simplexTree.insert_simplex({5, 6}, 10.);
+ simplexTree.insert_simplex({6}, 10.);
+
+ simplexTree.expansion_with_blockers(3, [&](Simplex_handle sh) {
+ bool result = false;
+ std::cout << "Blocker on [";
+ // User can loop on the vertices from the given simplex_handle i.e.
+ for (auto vertex : simplexTree.simplex_vertex_range(sh)) {
+ // We block the expansion, if the vertex '6' is in the given list of vertices
+ if (vertex == 6) result = true;
+ std::cout << vertex << ", ";
+ }
+ std::cout << "] ( " << simplexTree.filtration(sh);
+ // User can re-assign a new filtration value directly in the blocker (default is the maximal value of boudaries)
+ simplexTree.assign_filtration(sh, simplexTree.filtration(sh) + 1.);
+
+ std::cout << " + 1. ) = " << result << std::endl;
+
+ return result;
+ });
+
+ std::cout << "********************************************************************\n";
+ std::cout << "* The complex contains " << simplexTree.num_simplices() << " simplices";
+ std::cout << " - dimension " << simplexTree.dimension() << "\n";
+ std::cout << "* Iterator on Simplices in the filtration, with [filtration value]:\n";
+ for (auto f_simplex : simplexTree.filtration_simplex_range()) {
+ std::cout << " "
+ << "[" << simplexTree.filtration(f_simplex) << "] ";
+ for (auto vertex : simplexTree.simplex_vertex_range(f_simplex)) std::cout << "(" << vertex << ")";
+ std::cout << std::endl;
+ }
+
+ return 0;
+}
diff --git a/example/Simplex_tree/mini_simplex_tree.cpp b/example/Simplex_tree/mini_simplex_tree.cpp
index ad99df23..19e45361 100644
--- a/example/Simplex_tree/mini_simplex_tree.cpp
+++ b/example/Simplex_tree/mini_simplex_tree.cpp
@@ -52,8 +52,6 @@ int main() {
auto edge03 = {0, 3};
st.insert_simplex_and_subfaces(triangle012);
st.insert_simplex_and_subfaces(edge03);
- // FIXME: Remove this line
- st.set_dimension(2);
auto edge02 = {0, 2};
ST::Simplex_handle e = st.find(edge02);
diff --git a/example/Simplex_tree/simple_simplex_tree.cpp b/example/Simplex_tree/simple_simplex_tree.cpp
index d8318f03..828977c2 100644
--- a/example/Simplex_tree/simple_simplex_tree.cpp
+++ b/example/Simplex_tree/simple_simplex_tree.cpp
@@ -30,10 +30,10 @@
using Simplex_tree = Gudhi::Simplex_tree<>;
using Vertex_handle = Simplex_tree::Vertex_handle;
using Filtration_value = Simplex_tree::Filtration_value;
-using typeVectorVertex = std::vector< Vertex_handle >;
-using typePairSimplexBool = std::pair< Simplex_tree::Simplex_handle, bool >;
+using typeVectorVertex = std::vector<Vertex_handle>;
+using typePairSimplexBool = std::pair<Simplex_tree::Simplex_handle, bool>;
-int main(int argc, char * const argv[]) {
+int main(int argc, char* const argv[]) {
const Filtration_value FIRST_FILTRATION_VALUE = 0.1;
const Filtration_value SECOND_FILTRATION_VALUE = 0.2;
const Filtration_value THIRD_FILTRATION_VALUE = 0.3;
@@ -54,7 +54,7 @@ int main(int argc, char * const argv[]) {
// ++ FIRST
std::cout << " * INSERT 0" << std::endl;
- typeVectorVertex firstSimplexVector = { 0 };
+ typeVectorVertex firstSimplexVector = {0};
typePairSimplexBool returnValue =
simplexTree.insert_simplex(firstSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
@@ -66,9 +66,8 @@ int main(int argc, char * const argv[]) {
// ++ SECOND
std::cout << " * INSERT 1" << std::endl;
- typeVectorVertex secondSimplexVector = { 1 };
- returnValue =
- simplexTree.insert_simplex(secondSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
+ typeVectorVertex secondSimplexVector = {1};
+ returnValue = simplexTree.insert_simplex(secondSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + 1 INSERTED" << std::endl;
@@ -78,9 +77,8 @@ int main(int argc, char * const argv[]) {
// ++ THIRD
std::cout << " * INSERT (0,1)" << std::endl;
- typeVectorVertex thirdSimplexVector = { 0, 1 };
- returnValue =
- simplexTree.insert_simplex(thirdSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
+ typeVectorVertex thirdSimplexVector = {0, 1};
+ returnValue = simplexTree.insert_simplex(thirdSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + (0,1) INSERTED" << std::endl;
@@ -90,9 +88,8 @@ int main(int argc, char * const argv[]) {
// ++ FOURTH
std::cout << " * INSERT 2" << std::endl;
- typeVectorVertex fourthSimplexVector = { 2 };
- returnValue =
- simplexTree.insert_simplex(fourthSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
+ typeVectorVertex fourthSimplexVector = {2};
+ returnValue = simplexTree.insert_simplex(fourthSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + 2 INSERTED" << std::endl;
@@ -102,9 +99,8 @@ int main(int argc, char * const argv[]) {
// ++ FIFTH
std::cout << " * INSERT (2,0)" << std::endl;
- typeVectorVertex fifthSimplexVector = { 2, 0 };
- returnValue =
- simplexTree.insert_simplex(fifthSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
+ typeVectorVertex fifthSimplexVector = {2, 0};
+ returnValue = simplexTree.insert_simplex(fifthSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + (2,0) INSERTED" << std::endl;
@@ -114,9 +110,8 @@ int main(int argc, char * const argv[]) {
// ++ SIXTH
std::cout << " * INSERT (2,1)" << std::endl;
- typeVectorVertex sixthSimplexVector = { 2, 1 };
- returnValue =
- simplexTree.insert_simplex(sixthSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
+ typeVectorVertex sixthSimplexVector = {2, 1};
+ returnValue = simplexTree.insert_simplex(sixthSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + (2,1) INSERTED" << std::endl;
@@ -126,9 +121,8 @@ int main(int argc, char * const argv[]) {
// ++ SEVENTH
std::cout << " * INSERT (2,1,0)" << std::endl;
- typeVectorVertex seventhSimplexVector = { 2, 1, 0 };
- returnValue =
- simplexTree.insert_simplex(seventhSimplexVector, Filtration_value(THIRD_FILTRATION_VALUE));
+ typeVectorVertex seventhSimplexVector = {2, 1, 0};
+ returnValue = simplexTree.insert_simplex(seventhSimplexVector, Filtration_value(THIRD_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + (2,1,0) INSERTED" << std::endl;
@@ -138,9 +132,8 @@ int main(int argc, char * const argv[]) {
// ++ EIGHTH
std::cout << " * INSERT 3" << std::endl;
- typeVectorVertex eighthSimplexVector = { 3 };
- returnValue =
- simplexTree.insert_simplex(eighthSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
+ typeVectorVertex eighthSimplexVector = {3};
+ returnValue = simplexTree.insert_simplex(eighthSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + 3 INSERTED" << std::endl;
@@ -150,9 +143,8 @@ int main(int argc, char * const argv[]) {
// ++ NINETH
std::cout << " * INSERT (3,0)" << std::endl;
- typeVectorVertex ninethSimplexVector = { 3, 0 };
- returnValue =
- simplexTree.insert_simplex(ninethSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
+ typeVectorVertex ninethSimplexVector = {3, 0};
+ returnValue = simplexTree.insert_simplex(ninethSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + (3,0) INSERTED" << std::endl;
@@ -162,7 +154,7 @@ int main(int argc, char * const argv[]) {
// ++ TENTH
std::cout << " * INSERT 0 (already inserted)" << std::endl;
- typeVectorVertex tenthSimplexVector = { 0 };
+ typeVectorVertex tenthSimplexVector = {0};
// With a different filtration value
returnValue = simplexTree.insert_simplex(tenthSimplexVector, Filtration_value(FOURTH_FILTRATION_VALUE));
@@ -174,9 +166,8 @@ int main(int argc, char * const argv[]) {
// ++ ELEVENTH
std::cout << " * INSERT (2,1,0) (already inserted)" << std::endl;
- typeVectorVertex eleventhSimplexVector = { 2, 1, 0 };
- returnValue =
- simplexTree.insert_simplex(eleventhSimplexVector, Filtration_value(FOURTH_FILTRATION_VALUE));
+ typeVectorVertex eleventhSimplexVector = {2, 1, 0};
+ returnValue = simplexTree.insert_simplex(eleventhSimplexVector, Filtration_value(FOURTH_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + (2,1,0) INSERTED" << std::endl;
@@ -185,7 +176,6 @@ int main(int argc, char * const argv[]) {
}
// ++ GENERAL VARIABLE SET
- simplexTree.set_dimension(2); // Max dimension = 2 -> (2,1,0)
std::cout << "********************************************************************\n";
// Display the Simplex_tree - Can not be done in the middle of 2 inserts
@@ -193,10 +183,9 @@ int main(int argc, char * const argv[]) {
std::cout << " - dimension " << simplexTree.dimension() << "\n";
std::cout << "* Iterator on Simplices in the filtration, with [filtration value]:\n";
for (auto f_simplex : simplexTree.filtration_simplex_range()) {
- std::cout << " " << "[" << simplexTree.filtration(f_simplex) << "] ";
- for (auto vertex : simplexTree.simplex_vertex_range(f_simplex)) {
- std::cout << static_cast<int>(vertex) << " ";
- }
+ std::cout << " "
+ << "[" << simplexTree.filtration(f_simplex) << "] ";
+ for (auto vertex : simplexTree.simplex_vertex_range(f_simplex)) std::cout << "(" << vertex << ")";
std::cout << std::endl;
}
// [0.1] 0
@@ -219,7 +208,7 @@ int main(int argc, char * const argv[]) {
else
std::cout << "***- NO IT ISN'T\n";
- typeVectorVertex unknownSimplexVector = { 15 };
+ typeVectorVertex unknownSimplexVector = {15};
simplexFound = simplexTree.find(unknownSimplexVector);
std::cout << "**************IS THE SIMPLEX {15} IN THE SIMPLEX TREE ?\n";
if (simplexFound != simplexTree.null_simplex())
@@ -234,7 +223,7 @@ int main(int argc, char * const argv[]) {
else
std::cout << "***- NO IT ISN'T\n";
- typeVectorVertex otherSimplexVector = { 1, 15 };
+ typeVectorVertex otherSimplexVector = {1, 15};
simplexFound = simplexTree.find(otherSimplexVector);
std::cout << "**************IS THE SIMPLEX {15,1} IN THE SIMPLEX TREE ?\n";
if (simplexFound != simplexTree.null_simplex())
@@ -242,12 +231,38 @@ int main(int argc, char * const argv[]) {
else
std::cout << "***- NO IT ISN'T\n";
- typeVectorVertex invSimplexVector = { 1, 2, 0 };
+ typeVectorVertex invSimplexVector = {1, 2, 0};
simplexFound = simplexTree.find(invSimplexVector);
std::cout << "**************IS THE SIMPLEX {1,2,0} IN THE SIMPLEX TREE ?\n";
if (simplexFound != simplexTree.null_simplex())
std::cout << "***+ YES IT IS!\n";
else
std::cout << "***- NO IT ISN'T\n";
+
+ simplexFound = simplexTree.find({0, 1});
+ std::cout << "**************IS THE SIMPLEX {0,1} IN THE SIMPLEX TREE ?\n";
+ if (simplexFound != simplexTree.null_simplex())
+ std::cout << "***+ YES IT IS!\n";
+ else
+ std::cout << "***- NO IT ISN'T\n";
+
+ std::cout << "**************COFACES OF {0,1} IN CODIMENSION 1 ARE\n";
+ for (auto& simplex : simplexTree.cofaces_simplex_range(simplexTree.find({0, 1}), 1)) {
+ for (auto vertex : simplexTree.simplex_vertex_range(simplex)) std::cout << "(" << vertex << ")";
+ std::cout << std::endl;
+ }
+
+ std::cout << "**************STARS OF {0,1} ARE\n";
+ for (auto& simplex : simplexTree.star_simplex_range(simplexTree.find({0, 1}))) {
+ for (auto vertex : simplexTree.simplex_vertex_range(simplex)) std::cout << "(" << vertex << ")";
+ std::cout << std::endl;
+ }
+
+ std::cout << "**************BOUNDARIES OF {0,1,2} ARE\n";
+ for (auto& simplex : simplexTree.boundary_simplex_range(simplexTree.find({0, 1, 2}))) {
+ for (auto vertex : simplexTree.simplex_vertex_range(simplex)) std::cout << "(" << vertex << ")";
+ std::cout << std::endl;
+ }
+
return 0;
}
diff --git a/example/Witness_complex/CMakeLists.txt b/example/Witness_complex/CMakeLists.txt
index cbc53902..a8231392 100644
--- a/example/Witness_complex/CMakeLists.txt
+++ b/example/Witness_complex/CMakeLists.txt
@@ -13,39 +13,23 @@ install(TARGETS Witness_complex_example_nearest_landmark_table DESTINATION bin)
# CGAL and Eigen3 are required for Euclidean version of Witness
if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.6.0)
add_executable( Witness_complex_example_off example_witness_complex_off.cpp )
- add_executable( Witness_complex_example_strong_off example_strong_witness_complex_off.cpp )
add_executable ( Witness_complex_example_sphere example_witness_complex_sphere.cpp )
-
- add_executable ( Witness_complex_example_witness_persistence example_witness_complex_persistence.cpp )
- target_link_libraries(Witness_complex_example_witness_persistence ${Boost_PROGRAM_OPTIONS_LIBRARY})
-
- add_executable ( Witness_complex_example_strong_witness_persistence example_strong_witness_persistence.cpp )
- target_link_libraries(Witness_complex_example_strong_witness_persistence ${Boost_PROGRAM_OPTIONS_LIBRARY})
-
- if (TBB_FOUND)
- target_link_libraries(Witness_complex_example_witness_persistence ${TBB_LIBRARIES})
- target_link_libraries(Witness_complex_example_strong_witness_persistence ${TBB_LIBRARIES})
- endif()
+
+ add_executable( Witness_complex_example_strong_off example_strong_witness_complex_off.cpp )
+ target_link_libraries(Witness_complex_example_strong_off)
add_test(NAME Witness_complex_example_off_test_torus
COMMAND $<TARGET_FILE:Witness_complex_example_off>
"${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "20" "1.0" "3")
+ add_test(NAME Witness_complex_example_test_sphere_10
+ COMMAND $<TARGET_FILE:Witness_complex_example_sphere> "10")
add_test(NAME Witness_complex_example_strong_off_test_torus
COMMAND $<TARGET_FILE:Witness_complex_example_strong_off>
"${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "20" "1.0" "3")
- add_test(NAME Witness_complex_example_test_sphere_10
- COMMAND $<TARGET_FILE:Witness_complex_example_sphere> "10")
- add_test(NAME Witness_complex_example_test_torus_persistence
- COMMAND $<TARGET_FILE:Witness_complex_example_witness_persistence>
- "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-l" "20" "-a" "0.5")
- add_test(NAME Witness_complex_example_strong_test_torus_persistence
- COMMAND $<TARGET_FILE:Witness_complex_example_strong_witness_persistence>
- "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-l" "20" "-a" "0.5")
-
+
install(TARGETS Witness_complex_example_off DESTINATION bin)
- install(TARGETS Witness_complex_example_strong_off DESTINATION bin)
install(TARGETS Witness_complex_example_sphere DESTINATION bin)
- install(TARGETS Witness_complex_example_witness_persistence DESTINATION bin)
- install(TARGETS Witness_complex_example_strong_witness_persistence DESTINATION bin)
+ install(TARGETS Witness_complex_example_strong_off DESTINATION bin)
+
endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.6.0)
diff --git a/example/Witness_complex/example_strong_witness_complex_off.cpp b/example/Witness_complex/example_strong_witness_complex_off.cpp
index 0ee9ee90..346bef6d 100644
--- a/example/Witness_complex/example_strong_witness_complex_off.cpp
+++ b/example/Witness_complex/example_strong_witness_complex_off.cpp
@@ -23,6 +23,7 @@
#include <gudhi/Simplex_tree.h>
#include <gudhi/Euclidean_strong_witness_complex.h>
#include <gudhi/pick_n_random_points.h>
+#include <gudhi/choose_n_farthest_points.h>
#include <gudhi/Points_off_io.h>
#include <CGAL/Epick_d.h>
@@ -38,10 +39,9 @@ using Point_d = typename K::Point_d;
using Witness_complex = Gudhi::witness_complex::Euclidean_strong_witness_complex<K>;
using Point_vector = std::vector<Point_d>;
-int main(int argc, char * const argv[]) {
+int main(int argc, char* const argv[]) {
if (argc != 5) {
- std::cerr << "Usage: " << argv[0]
- << " path_to_point_file number_of_landmarks max_squared_alpha limit_dimension\n";
+ std::cerr << "Usage: " << argv[0] << " path_to_point_file number_of_landmarks max_squared_alpha limit_dimension\n";
return 0;
}
@@ -55,25 +55,25 @@ int main(int argc, char * const argv[]) {
Point_vector point_vector, landmarks;
Gudhi::Points_off_reader<Point_d> off_reader(file_name);
if (!off_reader.is_valid()) {
- std::cerr << "Strong witness complex - Unable to read file " << file_name << "\n";
- exit(-1); // ----- >>
- }
+ std::cerr << "Strong witness complex - Unable to read file " << file_name << "\n";
+ exit(-1); // ----- >>
+ }
point_vector = Point_vector(off_reader.get_point_cloud());
std::cout << "Successfully read " << point_vector.size() << " points.\n";
std::cout << "Ambient dimension is " << point_vector[0].dimension() << ".\n";
- // Choose landmarks
- Gudhi::subsampling::pick_n_random_points(point_vector, nbL, std::back_inserter(landmarks));
+ // Choose landmarks (decomment one of the following two lines)
+ // Gudhi::subsampling::pick_n_random_points(point_vector, nbL, std::back_inserter(landmarks));
+ Gudhi::subsampling::choose_n_farthest_points(K(), point_vector, nbL, Gudhi::subsampling::random_starting_point,
+ std::back_inserter(landmarks));
// Compute witness complex
start = clock();
- Witness_complex witness_complex(landmarks,
- point_vector);
+ Witness_complex witness_complex(landmarks, point_vector);
witness_complex.create_complex(simplex_tree, alpha2, lim_dim);
end = clock();
- std::cout << "Strong witness complex took "
- << static_cast<double>(end - start) / CLOCKS_PER_SEC << " s. \n";
+ std::cout << "Strong witness complex took " << static_cast<double>(end - start) / CLOCKS_PER_SEC << " s. \n";
std::cout << "Number of simplices is: " << simplex_tree.num_simplices() << "\n";
}
diff --git a/example/Witness_complex/example_witness_complex_off.cpp b/example/Witness_complex/example_witness_complex_off.cpp
index b36dac0d..be11c955 100644
--- a/example/Witness_complex/example_witness_complex_off.cpp
+++ b/example/Witness_complex/example_witness_complex_off.cpp
@@ -4,6 +4,7 @@
#include <gudhi/Simplex_tree.h>
#include <gudhi/Euclidean_witness_complex.h>
#include <gudhi/pick_n_random_points.h>
+#include <gudhi/choose_n_farthest_points.h>
#include <gudhi/Points_off_io.h>
#include <CGAL/Epick_d.h>
@@ -44,8 +45,9 @@ int main(int argc, char * const argv[]) {
std::cout << "Successfully read " << point_vector.size() << " points.\n";
std::cout << "Ambient dimension is " << point_vector[0].dimension() << ".\n";
- // Choose landmarks
- Gudhi::subsampling::pick_n_random_points(point_vector, nbL, std::back_inserter(landmarks));
+ // Choose landmarks (decomment one of the following two lines)
+ // Gudhi::subsampling::pick_n_random_points(point_vector, nbL, std::back_inserter(landmarks));
+ Gudhi::subsampling::choose_n_farthest_points(K(), point_vector, nbL, Gudhi::subsampling::random_starting_point, std::back_inserter(landmarks));
// Compute witness complex
start = clock();
diff --git a/example/Witness_complex/example_witness_complex_sphere.cpp b/example/Witness_complex/example_witness_complex_sphere.cpp
index 124fd99b..a6e9b11a 100644
--- a/example/Witness_complex/example_witness_complex_sphere.cpp
+++ b/example/Witness_complex/example_witness_complex_sphere.cpp
@@ -25,6 +25,7 @@
#include <gudhi/Simplex_tree.h>
#include <gudhi/Euclidean_witness_complex.h>
#include <gudhi/pick_n_random_points.h>
+#include <gudhi/choose_n_farthest_points.h>
#include <gudhi/reader_utils.h>
#include <CGAL/Epick_d.h>
@@ -41,27 +42,25 @@
/** Write a gnuplot readable file.
* Data range is a random access range of pairs (arg, value)
*/
-template < typename Data_range >
-void write_data(Data_range & data, std::string filename) {
+template <typename Data_range>
+void write_data(Data_range& data, std::string filename) {
std::ofstream ofs(filename, std::ofstream::out);
- for (auto entry : data)
- ofs << entry.first << ", " << entry.second << "\n";
+ for (auto entry : data) ofs << entry.first << ", " << entry.second << "\n";
ofs.close();
}
-int main(int argc, char * const argv[]) {
+int main(int argc, char* const argv[]) {
using Kernel = CGAL::Epick_d<CGAL::Dynamic_dimension_tag>;
using Witness_complex = Gudhi::witness_complex::Euclidean_witness_complex<Kernel>;
if (argc != 2) {
- std::cerr << "Usage: " << argv[0]
- << " number_of_landmarks \n";
+ std::cerr << "Usage: " << argv[0] << " number_of_landmarks \n";
return 0;
}
int number_of_landmarks = atoi(argv[1]);
- std::vector< std::pair<int, double> > l_time;
+ std::vector<std::pair<int, double> > l_time;
// Generate points
for (int nbP = 500; nbP < 10000; nbP += 500) {
@@ -75,16 +74,17 @@ int main(int argc, char * const argv[]) {
// Choose landmarks
start = clock();
- Gudhi::subsampling::pick_n_random_points(point_vector, number_of_landmarks, std::back_inserter(landmarks));
+ // Gudhi::subsampling::pick_n_random_points(point_vector, number_of_landmarks, std::back_inserter(landmarks));
+ Gudhi::subsampling::choose_n_farthest_points(K(), point_vector, number_of_landmarks,
+ Gudhi::subsampling::random_starting_point,
+ std::back_inserter(landmarks));
// Compute witness complex
- Witness_complex witness_complex(landmarks,
- point_vector);
+ Witness_complex witness_complex(landmarks, point_vector);
witness_complex.create_complex(simplex_tree, 0);
end = clock();
double time = static_cast<double>(end - start) / CLOCKS_PER_SEC;
- std::cout << "Witness complex for " << number_of_landmarks << " landmarks took "
- << time << " s. \n";
+ std::cout << "Witness complex for " << number_of_landmarks << " landmarks took " << time << " s. \n";
std::cout << "Number of simplices is: " << simplex_tree.num_simplices() << "\n";
l_time.push_back(std::make_pair(nbP, time));
}
diff --git a/include/gudhi/Alpha_complex.h b/include/gudhi/Alpha_complex.h
index 1ff95c3d..63c6675c 100644
--- a/include/gudhi/Alpha_complex.h
+++ b/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();
}
@@ -268,8 +268,6 @@ class Alpha_complex {
return false; // ----- >>
}
- complex.set_dimension(triangulation_->maximal_dimension());
-
// --------------------------------------------------------------------------------------------
// Simplex_tree construction from loop on triangulation finite full cells list
if (triangulation_->number_of_vertices() > 0) {
diff --git a/include/gudhi/Bitmap_cubical_complex.h b/include/gudhi/Bitmap_cubical_complex.h
index f395de65..969daba6 100644
--- a/include/gudhi/Bitmap_cubical_complex.h
+++ b/include/gudhi/Bitmap_cubical_complex.h
@@ -31,10 +31,11 @@
#endif
#include <limits>
-#include <utility> // for pair<>
+#include <utility> // for pair<>
#include <algorithm> // for sort
#include <vector>
#include <numeric> // for iota
+#include <cstddef>
namespace Gudhi {
@@ -43,7 +44,8 @@ namespace cubical_complex {
// global variable, was used just for debugging.
const bool globalDbg = false;
-template <typename T> class is_before_in_filtration;
+template <typename T>
+class is_before_in_filtration;
/**
* @brief Cubical complex represented as a bitmap.
@@ -60,11 +62,10 @@ class Bitmap_cubical_complex : public T {
//*********************************************//
// Typedefs and typenames
//*********************************************//
- typedef size_t Simplex_key;
+ typedef std::size_t Simplex_key;
typedef typename T::filtration_type Filtration_value;
typedef Simplex_key Simplex_handle;
-
//*********************************************//
// Constructors
//*********************************************//
@@ -77,12 +78,12 @@ class Bitmap_cubical_complex : public T {
/**
* Constructor form a Perseus-style file.
**/
- Bitmap_cubical_complex(const char* perseus_style_file) :
- T(perseus_style_file), key_associated_to_simplex(this->total_number_of_cells + 1) {
+ Bitmap_cubical_complex(const char* perseus_style_file)
+ : T(perseus_style_file), key_associated_to_simplex(this->total_number_of_cells + 1) {
if (globalDbg) {
std::cerr << "Bitmap_cubical_complex( const char* perseus_style_file )\n";
}
- for (size_t i = 0; i != this->total_number_of_cells; ++i) {
+ for (std::size_t i = 0; i != this->total_number_of_cells; ++i) {
this->key_associated_to_simplex[i] = i;
}
// we initialize this only once, in each constructor, when the bitmap is constructed.
@@ -97,10 +98,9 @@ class Bitmap_cubical_complex : public T {
* with filtration on top dimensional cells.
**/
Bitmap_cubical_complex(const std::vector<unsigned>& dimensions,
- const std::vector<Filtration_value>& top_dimensional_cells) :
- T(dimensions, top_dimensional_cells),
- key_associated_to_simplex(this->total_number_of_cells + 1) {
- for (size_t i = 0; i != this->total_number_of_cells; ++i) {
+ const std::vector<Filtration_value>& top_dimensional_cells)
+ : T(dimensions, top_dimensional_cells), key_associated_to_simplex(this->total_number_of_cells + 1) {
+ for (std::size_t i = 0; i != this->total_number_of_cells; ++i) {
this->key_associated_to_simplex[i] = i;
}
// we initialize this only once, in each constructor, when the bitmap is constructed.
@@ -118,10 +118,10 @@ class Bitmap_cubical_complex : public T {
**/
Bitmap_cubical_complex(const std::vector<unsigned>& dimensions,
const std::vector<Filtration_value>& top_dimensional_cells,
- std::vector< bool > directions_in_which_periodic_b_cond_are_to_be_imposed) :
- T(dimensions, top_dimensional_cells, directions_in_which_periodic_b_cond_are_to_be_imposed),
- key_associated_to_simplex(this->total_number_of_cells + 1) {
- for (size_t i = 0; i != this->total_number_of_cells; ++i) {
+ std::vector<bool> directions_in_which_periodic_b_cond_are_to_be_imposed)
+ : T(dimensions, top_dimensional_cells, directions_in_which_periodic_b_cond_are_to_be_imposed),
+ key_associated_to_simplex(this->total_number_of_cells + 1) {
+ for (std::size_t i = 0; i != this->total_number_of_cells; ++i) {
this->key_associated_to_simplex[i] = i;
}
// we initialize this only once, in each constructor, when the bitmap is constructed.
@@ -142,9 +142,7 @@ class Bitmap_cubical_complex : public T {
/**
* Returns number of all cubes in the complex.
**/
- size_t num_simplices()const {
- return this->total_number_of_cells;
- }
+ std::size_t num_simplices() const { return this->total_number_of_cells; }
/**
* Returns a Simplex_handle to a cube that do not exist in this complex.
@@ -159,14 +157,12 @@ class Bitmap_cubical_complex : public T {
/**
* Returns dimension of the complex.
**/
- inline size_t dimension()const {
- return this->sizes.size();
- }
+ inline std::size_t dimension() const { return this->sizes.size(); }
/**
* Return dimension of a cell pointed by the Simplex_handle.
**/
- inline unsigned dimension(Simplex_handle sh)const {
+ inline unsigned dimension(Simplex_handle sh) const {
if (globalDbg) {
std::cerr << "unsigned dimension(const Simplex_handle& sh)\n";
}
@@ -199,7 +195,7 @@ class Bitmap_cubical_complex : public T {
/**
* Return the key of a cube pointed by the Simplex_handle.
**/
- Simplex_key key(Simplex_handle sh)const {
+ Simplex_key key(Simplex_handle sh) const {
if (globalDbg) {
std::cerr << "Simplex_key key(const Simplex_handle& sh)\n";
}
@@ -217,7 +213,7 @@ class Bitmap_cubical_complex : public T {
std::cerr << "Simplex_handle simplex(Simplex_key key)\n";
}
if (key != null_key()) {
- return this->simplex_associated_to_key[ key ];
+ return this->simplex_associated_to_key[key];
}
return null_simplex();
}
@@ -246,8 +242,8 @@ class Bitmap_cubical_complex : public T {
/**
* Boundary_simplex_range class provides ranges for boundary iterators.
**/
- typedef typename std::vector< Simplex_handle >::iterator Boundary_simplex_iterator;
- typedef typename std::vector< Simplex_handle > Boundary_simplex_range;
+ typedef typename std::vector<Simplex_handle>::iterator Boundary_simplex_iterator;
+ typedef typename std::vector<Simplex_handle> Boundary_simplex_range;
/**
* Filtration_simplex_iterator class provides an iterator though the whole structure in the order of filtration.
@@ -257,13 +253,13 @@ class Bitmap_cubical_complex : public T {
**/
class Filtration_simplex_range;
- class Filtration_simplex_iterator : std::iterator< std::input_iterator_tag, Simplex_handle > {
+ class Filtration_simplex_iterator : std::iterator<std::input_iterator_tag, Simplex_handle> {
// Iterator over all simplices of the complex in the order of the indexing scheme.
// 'value_type' must be 'Simplex_handle'.
public:
- Filtration_simplex_iterator(Bitmap_cubical_complex* b) : b(b), position(0) { }
+ Filtration_simplex_iterator(Bitmap_cubical_complex* b) : b(b), position(0) {}
- Filtration_simplex_iterator() : b(NULL), position(0) { }
+ Filtration_simplex_iterator() : b(NULL), position(0) {}
Filtration_simplex_iterator operator++() {
if (globalDbg) {
@@ -288,14 +284,14 @@ class Bitmap_cubical_complex : public T {
return (*this);
}
- bool operator==(const Filtration_simplex_iterator& rhs)const {
+ bool operator==(const Filtration_simplex_iterator& rhs) const {
if (globalDbg) {
std::cerr << "bool operator == ( const Filtration_simplex_iterator& rhs )\n";
}
- return ( this->position == rhs.position);
+ return (this->position == rhs.position);
}
- bool operator!=(const Filtration_simplex_iterator& rhs)const {
+ bool operator!=(const Filtration_simplex_iterator& rhs) const {
if (globalDbg) {
std::cerr << "bool operator != ( const Filtration_simplex_iterator& rhs )\n";
}
@@ -306,14 +302,14 @@ class Bitmap_cubical_complex : public T {
if (globalDbg) {
std::cerr << "Simplex_handle operator*()\n";
}
- return this->b->simplex_associated_to_key[ this->position ];
+ return this->b->simplex_associated_to_key[this->position];
}
friend class Filtration_simplex_range;
private:
Bitmap_cubical_complex<T>* b;
- size_t position;
+ std::size_t position;
};
/**
@@ -326,7 +322,7 @@ class Bitmap_cubical_complex : public T {
typedef Filtration_simplex_iterator const_iterator;
typedef Filtration_simplex_iterator iterator;
- Filtration_simplex_range(Bitmap_cubical_complex<T>* b) : b(b) { }
+ Filtration_simplex_range(Bitmap_cubical_complex<T>* b) : b(b) {}
Filtration_simplex_iterator begin() {
if (globalDbg) {
@@ -348,8 +344,6 @@ class Bitmap_cubical_complex : public T {
Bitmap_cubical_complex<T>* b;
};
-
-
//*********************************************//
// Methods to access iterators from the container:
@@ -357,9 +351,7 @@ class Bitmap_cubical_complex : public T {
* boundary_simplex_range creates an object of a Boundary_simplex_range class
* that provides ranges for the Boundary_simplex_iterator.
**/
- Boundary_simplex_range boundary_simplex_range(Simplex_handle sh) {
- return this->get_boundary_of_a_cell(sh);
- }
+ Boundary_simplex_range boundary_simplex_range(Simplex_handle sh) { return this->get_boundary_of_a_cell(sh); }
/**
* filtration_simplex_range creates an object of a Filtration_simplex_range class
@@ -374,8 +366,6 @@ class Bitmap_cubical_complex : public T {
}
//*********************************************//
-
-
//*********************************************//
// Elements which are in Gudhi now, but I (and in all the cases I asked also Marc) do not understand why they are
// there.
@@ -390,43 +380,41 @@ class Bitmap_cubical_complex : public T {
* Function needed for compatibility with Gudhi. Not useful for other purposes.
**/
std::pair<Simplex_handle, Simplex_handle> endpoints(Simplex_handle sh) {
- std::vector< size_t > bdry = this->get_boundary_of_a_cell(sh);
+ std::vector<std::size_t> bdry = this->get_boundary_of_a_cell(sh);
if (globalDbg) {
std::cerr << "std::pair<Simplex_handle, Simplex_handle> endpoints( Simplex_handle sh )\n";
std::cerr << "bdry.size() : " << bdry.size() << std::endl;
}
// this method returns two first elements from the boundary of sh.
if (bdry.size() < 2)
- throw("Error in endpoints in Bitmap_cubical_complex class. The cell have less than two elements in the "
- "boundary.");
+ throw(
+ "Error in endpoints in Bitmap_cubical_complex class. The cell have less than two elements in the "
+ "boundary.");
return std::make_pair(bdry[0], bdry[1]);
}
-
/**
* Class needed for compatibility with Gudhi. Not useful for other purposes.
**/
class Skeleton_simplex_range;
- class Skeleton_simplex_iterator : std::iterator< std::input_iterator_tag, Simplex_handle > {
+ class Skeleton_simplex_iterator : std::iterator<std::input_iterator_tag, Simplex_handle> {
// Iterator over all simplices of the complex in the order of the indexing scheme.
// 'value_type' must be 'Simplex_handle'.
public:
- Skeleton_simplex_iterator(Bitmap_cubical_complex* b, size_t d) : b(b), dimension(d) {
+ Skeleton_simplex_iterator(Bitmap_cubical_complex* b, std::size_t d) : b(b), dimension(d) {
if (globalDbg) {
- std::cerr << "Skeleton_simplex_iterator ( Bitmap_cubical_complex* b , size_t d )\n";
+ std::cerr << "Skeleton_simplex_iterator ( Bitmap_cubical_complex* b , std::size_t d )\n";
}
// find the position of the first simplex of a dimension d
this->position = 0;
- while (
- (this->position != b->data.size()) &&
- (this->b->get_dimension_of_a_cell(this->position) != this->dimension)
- ) {
+ while ((this->position != b->data.size()) &&
+ (this->b->get_dimension_of_a_cell(this->position) != this->dimension)) {
++this->position;
}
}
- Skeleton_simplex_iterator() : b(NULL), position(0), dimension(0) { }
+ Skeleton_simplex_iterator() : b(NULL), position(0), dimension(0) {}
Skeleton_simplex_iterator operator++() {
if (globalDbg) {
@@ -434,10 +422,8 @@ class Bitmap_cubical_complex : public T {
}
// increment the position as long as you did not get to the next element of the dimension dimension.
++this->position;
- while (
- (this->position != this->b->data.size()) &&
- (this->b->get_dimension_of_a_cell(this->position) != this->dimension)
- ) {
+ while ((this->position != this->b->data.size()) &&
+ (this->b->get_dimension_of_a_cell(this->position) != this->dimension)) {
++this->position;
}
return (*this);
@@ -459,14 +445,14 @@ class Bitmap_cubical_complex : public T {
return (*this);
}
- bool operator==(const Skeleton_simplex_iterator& rhs)const {
+ bool operator==(const Skeleton_simplex_iterator& rhs) const {
if (globalDbg) {
std::cerr << "bool operator ==\n";
}
- return ( this->position == rhs.position);
+ return (this->position == rhs.position);
}
- bool operator!=(const Skeleton_simplex_iterator& rhs)const {
+ bool operator!=(const Skeleton_simplex_iterator& rhs) const {
if (globalDbg) {
std::cerr << "bool operator != ( const Skeleton_simplex_iterator& rhs )\n";
}
@@ -481,9 +467,10 @@ class Bitmap_cubical_complex : public T {
}
friend class Skeleton_simplex_range;
+
private:
Bitmap_cubical_complex<T>* b;
- size_t position;
+ std::size_t position;
unsigned dimension;
};
@@ -497,7 +484,7 @@ class Bitmap_cubical_complex : public T {
typedef Skeleton_simplex_iterator const_iterator;
typedef Skeleton_simplex_iterator iterator;
- Skeleton_simplex_range(Bitmap_cubical_complex<T>* b, unsigned dimension) : b(b), dimension(dimension) { }
+ Skeleton_simplex_range(Bitmap_cubical_complex<T>* b, unsigned dimension) : b(b), dimension(dimension) {}
Skeleton_simplex_iterator begin() {
if (globalDbg) {
@@ -533,8 +520,8 @@ class Bitmap_cubical_complex : public T {
friend class is_before_in_filtration<T>;
protected:
- std::vector< size_t > key_associated_to_simplex;
- std::vector< size_t > simplex_associated_to_key;
+ std::vector<std::size_t> key_associated_to_simplex;
+ std::vector<std::size_t> simplex_associated_to_key;
}; // Bitmap_cubical_complex
template <typename T>
@@ -542,7 +529,7 @@ void Bitmap_cubical_complex<T>::initialize_simplex_associated_to_key() {
if (globalDbg) {
std::cerr << "void Bitmap_cubical_complex<T>::initialize_elements_ordered_according_to_filtration() \n";
}
- this->simplex_associated_to_key = std::vector<size_t>(this->data.size());
+ this->simplex_associated_to_key = std::vector<std::size_t>(this->data.size());
std::iota(std::begin(simplex_associated_to_key), std::end(simplex_associated_to_key), 0);
#ifdef GUDHI_USE_TBB
tbb::parallel_sort(simplex_associated_to_key.begin(), simplex_associated_to_key.end(),
@@ -552,16 +539,15 @@ void Bitmap_cubical_complex<T>::initialize_simplex_associated_to_key() {
#endif
// we still need to deal here with a key_associated_to_simplex:
- for ( size_t i = 0 ; i != simplex_associated_to_key.size() ; ++i ) {
- this->key_associated_to_simplex[ simplex_associated_to_key[i] ] = i;
+ for (std::size_t i = 0; i != simplex_associated_to_key.size(); ++i) {
+ this->key_associated_to_simplex[simplex_associated_to_key[i]] = i;
}
}
template <typename T>
class is_before_in_filtration {
public:
- explicit is_before_in_filtration(Bitmap_cubical_complex<T> * CC)
- : CC_(CC) { }
+ explicit is_before_in_filtration(Bitmap_cubical_complex<T>* CC) : CC_(CC) {}
bool operator()(const typename Bitmap_cubical_complex<T>::Simplex_handle& sh1,
const typename Bitmap_cubical_complex<T>::Simplex_handle& sh2) const {
@@ -573,8 +559,8 @@ class is_before_in_filtration {
return fil1 < fil2;
}
// in this case they are on the same filtration level, so the dimension decide.
- size_t dim1 = CC_->get_dimension_of_a_cell(sh1);
- size_t dim2 = CC_->get_dimension_of_a_cell(sh2);
+ std::size_t dim1 = CC_->get_dimension_of_a_cell(sh1);
+ std::size_t dim2 = CC_->get_dimension_of_a_cell(sh2);
if (dim1 != dim2) {
return dim1 < dim2;
}
diff --git a/include/gudhi/Bitmap_cubical_complex/counter.h b/include/gudhi/Bitmap_cubical_complex/counter.h
index 4b072f10..705b68a0 100644
--- a/include/gudhi/Bitmap_cubical_complex/counter.h
+++ b/include/gudhi/Bitmap_cubical_complex/counter.h
@@ -25,6 +25,7 @@
#include <iostream>
#include <vector>
+#include <cstddef>
namespace Gudhi {
@@ -63,14 +64,14 @@ class counter {
* If the value of the function is false, that means, that the counter have reached its end-value.
**/
bool increment() {
- size_t i = 0;
+ std::size_t i = 0;
while ((i != this->end.size()) && (this->current[i] == this->end[i])) {
++i;
}
if (i == this->end.size())return false;
++this->current[i];
- for (size_t j = 0; j != i; ++j) {
+ for (std::size_t j = 0; j != i; ++j) {
this->current[j] = this->begin[j];
}
return true;
@@ -80,7 +81,7 @@ class counter {
* Function to check if we are at the end of counter.
**/
bool isFinal() {
- for (size_t i = 0; i != this->current.size(); ++i) {
+ for (std::size_t i = 0; i != this->current.size(); ++i) {
if (this->current[i] == this->end[i])return true;
}
return false;
@@ -93,7 +94,7 @@ class counter {
**/
std::vector< unsigned > find_opposite(const std::vector< bool >& directionsForPeriodicBCond) {
std::vector< unsigned > result;
- for (size_t i = 0; i != this->current.size(); ++i) {
+ for (std::size_t i = 0; i != this->current.size(); ++i) {
if ((this->current[i] == this->end[i]) && (directionsForPeriodicBCond[i] == true)) {
result.push_back(this->begin[i]);
} else {
@@ -108,7 +109,7 @@ class counter {
**/
std::vector< bool > directions_of_finals() {
std::vector< bool > result;
- for (size_t i = 0; i != this->current.size(); ++i) {
+ for (std::size_t i = 0; i != this->current.size(); ++i) {
if (this->current[i] == this->end[i]) {
result.push_back(true);
} else {
@@ -123,7 +124,7 @@ class counter {
**/
friend std::ostream& operator<<(std::ostream& out, const counter& c) {
// std::cerr << "c.current.size() : " << c.current.size() << endl;
- for (size_t i = 0; i != c.current.size(); ++i) {
+ for (std::size_t i = 0; i != c.current.size(); ++i) {
out << c.current[i] << " ";
}
return out;
diff --git a/include/gudhi/Bitmap_cubical_complex_base.h b/include/gudhi/Bitmap_cubical_complex_base.h
index 0442ac34..bf257be1 100644
--- a/include/gudhi/Bitmap_cubical_complex_base.h
+++ b/include/gudhi/Bitmap_cubical_complex_base.h
@@ -32,7 +32,9 @@
#include <algorithm>
#include <iterator>
#include <limits>
-#include <utility> // for pair<>
+#include <utility>
+#include <stdexcept>
+#include <cstddef>
namespace Gudhi {
@@ -65,8 +67,7 @@ class Bitmap_cubical_complex_base {
/**
*Default constructor
**/
- Bitmap_cubical_complex_base() :
- total_number_of_cells(0) { }
+ Bitmap_cubical_complex_base() : total_number_of_cells(0) {}
/**
* There are a few constructors of a Bitmap_cubical_complex_base class.
* First one, that takes vector<unsigned>, creates an empty bitmap of a dimension equal
@@ -90,7 +91,7 @@ class Bitmap_cubical_complex_base {
/**
* Destructor of the Bitmap_cubical_complex_base class.
**/
- virtual ~Bitmap_cubical_complex_base() { }
+ virtual ~Bitmap_cubical_complex_base() {}
/**
* The functions get_boundary_of_a_cell, get_coboundary_of_a_cell, get_dimension_of_a_cell
@@ -100,8 +101,10 @@ class Bitmap_cubical_complex_base {
* non-negative integer, indicating a position of a cube in the data structure.
* In the case of functions that compute (co)boundary, the output is a vector if non-negative integers pointing to
* the positions of (co)boundary element of the input cell.
+ * The boundary elements are guaranteed to be returned so that the
+ * incidence coefficients of boundary elements are alternating.
*/
- virtual inline std::vector< size_t > get_boundary_of_a_cell(size_t cell)const;
+ virtual inline std::vector<std::size_t> get_boundary_of_a_cell(std::size_t cell) const;
/**
* The functions get_coboundary_of_a_cell, get_coboundary_of_a_cell,
* get_dimension_of_a_cell and get_cell_data are the basic
@@ -112,21 +115,81 @@ class Bitmap_cubical_complex_base {
* In the case of functions that compute (co)boundary, the output is a vector if
* non-negative integers pointing to the
* positions of (co)boundary element of the input cell.
+ * Note that unlike in the case of boundary, over here the elements are
+ * not guaranteed to be returned with alternating incidence numbers.
+ *
**/
- virtual inline std::vector< size_t > get_coboundary_of_a_cell(size_t cell)const;
+ virtual inline std::vector<std::size_t> get_coboundary_of_a_cell(std::size_t cell) const;
+
/**
- * In the case of get_dimension_of_a_cell function, the output is a non-negative integer
- * indicating the dimension of a cell.
- **/
- inline unsigned get_dimension_of_a_cell(size_t cell)const;
+ * This procedure compute incidence numbers between cubes. For a cube \f$A\f$ of
+ * dimension n and a cube \f$B \subset A\f$ of dimension n-1, an incidence
+ * between \f$A\f$ and \f$B\f$ is the integer with which \f$B\f$ appears in the boundary of \f$A\f$.
+ * Note that first parameter is a cube of dimension n,
+ * and the second parameter is an adjusted cube in dimension n-1.
+ * Given \f$A = [b_1,e_1] \times \ldots \ [b_{j-1},e_{j-1}] \times [b_{j},e_{j}] \times [b_{j+1},e_{j+1}] \times \ldots
+ *\times [b_{n},e_{n}] \f$
+ * such that \f$ b_{j} \neq e_{j} \f$
+ * and \f$B = [b_1,e_1] \times \ldots \ [b_{j-1},e_{j-1}] \times [a,a] \times [b_{j+1},e_{j+1}] \times \ldots \times
+ *[b_{n},e_{n}] \f$
+ * where \f$ a = b_{j}\f$ or \f$ a = e_{j}\f$, the incidence between \f$A\f$ and \f$B\f$
+ * computed by this procedure is given by formula:
+ * \f$ c\ (-1)^{\sum_{i=1}^{j-1} dim [b_{i},e_{i}]} \f$
+ * Where \f$ dim [b_{i},e_{i}] = 0 \f$ if \f$ b_{i}=e_{i} \f$ and 1 in other case.
+ * c is -1 if \f$ a = b_{j}\f$ and 1 if \f$ a = e_{j}\f$.
+ * @exception std::logic_error In case when the cube \f$B\f$ is not n-1
+ * dimensional face of a cube \f$A\f$.
+ **/
+ virtual int compute_incidence_between_cells(std::size_t coface, std::size_t face) const {
+ // first get the counters for coface and face:
+ std::vector<unsigned> coface_counter = this->compute_counter_for_given_cell(coface);
+ std::vector<unsigned> face_counter = this->compute_counter_for_given_cell(face);
+
+ // coface_counter and face_counter should agree at all positions except from one:
+ int number_of_position_in_which_counters_do_not_agree = -1;
+ std::size_t number_of_full_faces_that_comes_before = 0;
+ for (std::size_t i = 0; i != coface_counter.size(); ++i) {
+ if ((coface_counter[i] % 2 == 1) && (number_of_position_in_which_counters_do_not_agree == -1)) {
+ ++number_of_full_faces_that_comes_before;
+ }
+ if (coface_counter[i] != face_counter[i]) {
+ if (number_of_position_in_which_counters_do_not_agree != -1) {
+ std::cout << "Cells given to compute_incidence_between_cells procedure do not form a pair of coface-face.\n";
+ throw std::logic_error(
+ "Cells given to compute_incidence_between_cells procedure do not form a pair of coface-face.");
+ }
+ number_of_position_in_which_counters_do_not_agree = i;
+ }
+ }
+
+ int incidence = 1;
+ if (number_of_full_faces_that_comes_before % 2) incidence = -1;
+ // if the face cell is on the right from coface cell:
+ if (coface_counter[number_of_position_in_which_counters_do_not_agree] + 1 ==
+ face_counter[number_of_position_in_which_counters_do_not_agree]) {
+ incidence *= -1;
+ }
+
+ return incidence;
+ }
+
+ /**
+* In the case of get_dimension_of_a_cell function, the output is a non-negative integer
+* indicating the dimension of a cell.
+* Note that unlike in the case of boundary, over here the elements are
+* not guaranteed to be returned with alternating incidence numbers.
+* To compute incidence between cells use compute_incidence_between_cells
+* procedure
+**/
+ inline unsigned get_dimension_of_a_cell(std::size_t cell) const;
+
/**
* In the case of get_cell_data, the output parameter is a reference to the value of a cube in a given position.
* This allows reading and changing the value of filtration. Note that if the value of a filtration is changed, the
* code do not check if we have a filtration or not. i.e. it do not check if the value of a filtration of a cell is
* not smaller than the value of a filtration of its boundary and not greater than the value of its coboundary.
**/
- inline T& get_cell_data(size_t cell);
-
+ inline T& get_cell_data(std::size_t cell);
/**
* Typical input used to construct a baseBitmap class is a filtration given at the top dimensional cells.
@@ -141,33 +204,29 @@ class Bitmap_cubical_complex_base {
/**
* Returns dimension of a complex.
**/
- inline unsigned dimension()const {
- return sizes.size();
- }
+ inline unsigned dimension() const { return sizes.size(); }
/**
* Returns number of all cubes in the data structure.
**/
- inline unsigned size()const {
- return this->data.size();
- }
+ inline unsigned size() const { return this->data.size(); }
/**
* Writing to stream operator. By using it we get the values T of cells in order in which they are stored in the
* structure. This procedure is used for debugging purposes.
**/
template <typename K>
- friend std::ostream& operator<<(std::ostream & os, const Bitmap_cubical_complex_base<K>& b);
+ friend std::ostream& operator<<(std::ostream& os, const Bitmap_cubical_complex_base<K>& b);
/**
* Function that put the input data to bins. By putting data to bins we mean rounding them to a sequence of values
* equally distributed in the range of data.
* Sometimes if most of the cells have different birth-death times, the performance of the algorithms to compute
* persistence gets worst. When dealing with this type of data, one may want to put different values on cells to
- * some number of bins. The function put_data_to_bins( size_t number_of_bins ) is designed for that purpose.
+ * some number of bins. The function put_data_to_bins( std::size_t number_of_bins ) is designed for that purpose.
* The parameter of the function is the number of bins (distinct values) we want to have in the cubical complex.
**/
- void put_data_to_bins(size_t number_of_bins);
+ void put_data_to_bins(std::size_t number_of_bins);
/**
* Function that put the input data to bins. By putting data to bins we mean rounding them to a sequence of values
@@ -184,7 +243,7 @@ class Bitmap_cubical_complex_base {
/**
* Functions to find min and max values of filtration.
**/
- std::pair< T, T > min_max_filtration();
+ std::pair<T, T> min_max_filtration();
// ITERATORS
@@ -192,11 +251,9 @@ class Bitmap_cubical_complex_base {
* @brief Iterator through all cells in the complex (in order they appear in the structure -- i.e.
* in lexicographical order).
**/
- class All_cells_iterator : std::iterator< std::input_iterator_tag, T > {
+ class All_cells_iterator : std::iterator<std::input_iterator_tag, T> {
public:
- All_cells_iterator() {
- this->counter = 0;
- }
+ All_cells_iterator() { this->counter = 0; }
All_cells_iterator operator++() {
// first find first element of the counter that can be increased:
@@ -215,14 +272,12 @@ class Bitmap_cubical_complex_base {
return *this;
}
- bool operator==(const All_cells_iterator& rhs)const {
- if (this->counter != rhs.counter)return false;
+ bool operator==(const All_cells_iterator& rhs) const {
+ if (this->counter != rhs.counter) return false;
return true;
}
- bool operator!=(const All_cells_iterator& rhs)const {
- return !(*this == rhs);
- }
+ bool operator!=(const All_cells_iterator& rhs) const { return !(*this == rhs); }
/*
* The operator * returns position of a cube in the structure of cubical complex. This position can be then used as
@@ -231,12 +286,11 @@ class Bitmap_cubical_complex_base {
* boundary and coboundary and dimension
* and in function get_cell_data to get a filtration of a cell.
*/
- size_t operator*() {
- return this->counter;
- }
+ std::size_t operator*() { return this->counter; }
friend class Bitmap_cubical_complex_base;
+
protected:
- size_t counter;
+ std::size_t counter;
};
/**
@@ -261,71 +315,61 @@ class Bitmap_cubical_complex_base {
**/
class All_cells_range {
public:
- All_cells_range(Bitmap_cubical_complex_base* b) : b(b) { }
+ All_cells_range(Bitmap_cubical_complex_base* b) : b(b) {}
- All_cells_iterator begin() {
- return b->all_cells_iterator_begin();
- }
+ All_cells_iterator begin() { return b->all_cells_iterator_begin(); }
+
+ All_cells_iterator end() { return b->all_cells_iterator_end(); }
- All_cells_iterator end() {
- return b->all_cells_iterator_end();
- }
private:
Bitmap_cubical_complex_base<T>* b;
};
- All_cells_range all_cells_range() {
- return All_cells_range(this);
- }
-
+ All_cells_range all_cells_range() { return All_cells_range(this); }
/**
* Boundary_range class provides ranges for boundary iterators.
**/
- typedef typename std::vector< size_t >::const_iterator Boundary_iterator;
- typedef typename std::vector< size_t > Boundary_range;
+ typedef typename std::vector<std::size_t>::const_iterator Boundary_iterator;
+ typedef typename std::vector<std::size_t> Boundary_range;
/**
* boundary_simplex_range creates an object of a Boundary_simplex_range class
* that provides ranges for the Boundary_simplex_iterator.
**/
- Boundary_range boundary_range(size_t sh) {
- return this->get_boundary_of_a_cell(sh);
- }
+ Boundary_range boundary_range(std::size_t sh) { return this->get_boundary_of_a_cell(sh); }
/**
* Coboundary_range class provides ranges for boundary iterators.
**/
- typedef typename std::vector< size_t >::const_iterator Coboundary_iterator;
- typedef typename std::vector< size_t > Coboundary_range;
+ typedef typename std::vector<std::size_t>::const_iterator Coboundary_iterator;
+ typedef typename std::vector<std::size_t> Coboundary_range;
/**
* boundary_simplex_range creates an object of a Boundary_simplex_range class
* that provides ranges for the Boundary_simplex_iterator.
**/
- Coboundary_range coboundary_range(size_t sh) {
- return this->get_coboundary_of_a_cell(sh);
- }
+ Coboundary_range coboundary_range(std::size_t sh) { return this->get_coboundary_of_a_cell(sh); }
/**
* @brief Iterator through top dimensional cells of the complex. The cells appear in order they are stored
* in the structure (i.e. in lexicographical order)
**/
- class Top_dimensional_cells_iterator : std::iterator< std::input_iterator_tag, T > {
+ class Top_dimensional_cells_iterator : std::iterator<std::input_iterator_tag, T> {
public:
Top_dimensional_cells_iterator(Bitmap_cubical_complex_base& b) : b(b) {
- this->counter = std::vector<size_t>(b.dimension());
+ this->counter = std::vector<std::size_t>(b.dimension());
// std::fill( this->counter.begin() , this->counter.end() , 0 );
}
Top_dimensional_cells_iterator operator++() {
// first find first element of the counter that can be increased:
- size_t dim = 0;
- while ((dim != this->b.dimension()) && (this->counter[dim] == this->b.sizes[dim] - 1))++dim;
+ std::size_t dim = 0;
+ while ((dim != this->b.dimension()) && (this->counter[dim] == this->b.sizes[dim] - 1)) ++dim;
if (dim != this->b.dimension()) {
++this->counter[dim];
- for (size_t i = 0; i != dim; ++i) {
+ for (std::size_t i = 0; i != dim; ++i) {
this->counter[i] = 0;
}
} else {
@@ -346,18 +390,16 @@ class Bitmap_cubical_complex_base {
return *this;
}
- bool operator==(const Top_dimensional_cells_iterator& rhs)const {
- if (&this->b != &rhs.b)return false;
- if (this->counter.size() != rhs.counter.size())return false;
- for (size_t i = 0; i != this->counter.size(); ++i) {
- if (this->counter[i] != rhs.counter[i])return false;
+ bool operator==(const Top_dimensional_cells_iterator& rhs) const {
+ if (&this->b != &rhs.b) return false;
+ if (this->counter.size() != rhs.counter.size()) return false;
+ for (std::size_t i = 0; i != this->counter.size(); ++i) {
+ if (this->counter[i] != rhs.counter[i]) return false;
}
return true;
}
- bool operator!=(const Top_dimensional_cells_iterator& rhs)const {
- return !(*this == rhs);
- }
+ bool operator!=(const Top_dimensional_cells_iterator& rhs) const { return !(*this == rhs); }
/*
* The operator * returns position of a cube in the structure of cubical complex. This position can be then used as
@@ -366,26 +408,25 @@ class Bitmap_cubical_complex_base {
* boundary and coboundary and dimension
* and in function get_cell_data to get a filtration of a cell.
*/
- size_t operator*() {
- return this->compute_index_in_bitmap();
- }
+ std::size_t operator*() { return this->compute_index_in_bitmap(); }
- size_t compute_index_in_bitmap()const {
- size_t index = 0;
- for (size_t i = 0; i != this->counter.size(); ++i) {
+ std::size_t compute_index_in_bitmap() const {
+ std::size_t index = 0;
+ for (std::size_t i = 0; i != this->counter.size(); ++i) {
index += (2 * this->counter[i] + 1) * this->b.multipliers[i];
}
return index;
}
- void print_counter()const {
- for (size_t i = 0; i != this->counter.size(); ++i) {
+ void print_counter() const {
+ for (std::size_t i = 0; i != this->counter.size(); ++i) {
std::cout << this->counter[i] << " ";
}
}
friend class Bitmap_cubical_complex_base;
+
protected:
- std::vector< size_t > counter;
+ std::vector<std::size_t> counter;
Bitmap_cubical_complex_base& b;
};
@@ -402,7 +443,7 @@ class Bitmap_cubical_complex_base {
**/
Top_dimensional_cells_iterator top_dimensional_cells_iterator_end() {
Top_dimensional_cells_iterator a(*this);
- for (size_t i = 0; i != this->dimension(); ++i) {
+ for (std::size_t i = 0; i != this->dimension(); ++i) {
a.counter[i] = this->sizes[i] - 1;
}
a.counter[0]++;
@@ -414,32 +455,24 @@ class Bitmap_cubical_complex_base {
**/
class Top_dimensional_cells_range {
public:
- Top_dimensional_cells_range(Bitmap_cubical_complex_base* b) : b(b) { }
+ Top_dimensional_cells_range(Bitmap_cubical_complex_base* b) : b(b) {}
- Top_dimensional_cells_iterator begin() {
- return b->top_dimensional_cells_iterator_begin();
- }
+ Top_dimensional_cells_iterator begin() { return b->top_dimensional_cells_iterator_begin(); }
+
+ Top_dimensional_cells_iterator end() { return b->top_dimensional_cells_iterator_end(); }
- Top_dimensional_cells_iterator end() {
- return b->top_dimensional_cells_iterator_end();
- }
private:
Bitmap_cubical_complex_base<T>* b;
};
- Top_dimensional_cells_range top_dimensional_cells_range() {
- return Top_dimensional_cells_range(this);
- }
-
+ Top_dimensional_cells_range top_dimensional_cells_range() { return Top_dimensional_cells_range(this); }
//****************************************************************************************************************//
//****************************************************************************************************************//
//****************************************************************************************************************//
//****************************************************************************************************************//
- inline size_t number_cells()const {
- return this->total_number_of_cells;
- }
+ inline std::size_t number_cells() const { return this->total_number_of_cells; }
//****************************************************************************************************************//
//****************************************************************************************************************//
@@ -450,11 +483,11 @@ class Bitmap_cubical_complex_base {
std::vector<unsigned> sizes;
std::vector<unsigned> multipliers;
std::vector<T> data;
- size_t total_number_of_cells;
+ std::size_t total_number_of_cells;
void set_up_containers(const std::vector<unsigned>& sizes) {
unsigned multiplier = 1;
- for (size_t i = 0; i != sizes.size(); ++i) {
+ for (std::size_t i = 0; i != sizes.size(); ++i) {
this->sizes.push_back(sizes[i]);
this->multipliers.push_back(multiplier);
multiplier *= 2 * sizes[i] + 1;
@@ -463,18 +496,18 @@ class Bitmap_cubical_complex_base {
this->total_number_of_cells = multiplier;
}
- size_t compute_position_in_bitmap(const std::vector< unsigned >& counter) {
- size_t position = 0;
- for (size_t i = 0; i != this->multipliers.size(); ++i) {
+ std::size_t compute_position_in_bitmap(const std::vector<unsigned>& counter) {
+ std::size_t position = 0;
+ for (std::size_t i = 0; i != this->multipliers.size(); ++i) {
position += this->multipliers[i] * counter[i];
}
return position;
}
- std::vector<unsigned> compute_counter_for_given_cell(size_t cell)const {
+ std::vector<unsigned> compute_counter_for_given_cell(std::size_t cell) const {
std::vector<unsigned> counter;
counter.reserve(this->sizes.size());
- for (size_t dim = this->sizes.size(); dim != 0; --dim) {
+ for (std::size_t dim = this->sizes.size(); dim != 0; --dim) {
counter.push_back(cell / this->multipliers[dim - 1]);
cell = cell % this->multipliers[dim - 1];
}
@@ -486,96 +519,94 @@ class Bitmap_cubical_complex_base {
const std::vector<T>& top_dimensional_cells);
Bitmap_cubical_complex_base(const char* perseus_style_file, std::vector<bool> directions);
Bitmap_cubical_complex_base(const std::vector<unsigned>& sizes, std::vector<bool> directions);
- Bitmap_cubical_complex_base(const std::vector<unsigned>& dimensions,
- const std::vector<T>& top_dimensional_cells,
+ Bitmap_cubical_complex_base(const std::vector<unsigned>& dimensions, const std::vector<T>& top_dimensional_cells,
std::vector<bool> directions);
};
template <typename T>
-void Bitmap_cubical_complex_base<T>::put_data_to_bins(size_t number_of_bins) {
- bool bdg = false;
+void Bitmap_cubical_complex_base<T>::put_data_to_bins(std::size_t number_of_bins) {
+ bool dbg = false;
- std::pair< T, T > min_max = this->min_max_filtration();
- T dx = (min_max.second - min_max.first) / (T) number_of_bins;
+ std::pair<T, T> min_max = this->min_max_filtration();
+ T dx = (min_max.second - min_max.first) / (T)number_of_bins;
// now put the data into the appropriate bins:
- for (size_t i = 0; i != this->data.size(); ++i) {
- if (bdg) {
+ for (std::size_t i = 0; i != this->data.size(); ++i) {
+ if (dbg) {
std::cerr << "Before binning : " << this->data[i] << std::endl;
}
this->data[i] = min_max.first + dx * (this->data[i] - min_max.first) / number_of_bins;
- if (bdg) {
+ if (dbg) {
std::cerr << "After binning : " << this->data[i] << std::endl;
- getchar();
}
}
}
template <typename T>
void Bitmap_cubical_complex_base<T>::put_data_to_bins(T diameter_of_bin) {
- bool bdg = false;
- std::pair< T, T > min_max = this->min_max_filtration();
+ bool dbg = false;
+ std::pair<T, T> min_max = this->min_max_filtration();
- size_t number_of_bins = (min_max.second - min_max.first) / diameter_of_bin;
+ std::size_t number_of_bins = (min_max.second - min_max.first) / diameter_of_bin;
// now put the data into the appropriate bins:
- for (size_t i = 0; i != this->data.size(); ++i) {
- if (bdg) {
+ for (std::size_t i = 0; i != this->data.size(); ++i) {
+ if (dbg) {
std::cerr << "Before binning : " << this->data[i] << std::endl;
}
this->data[i] = min_max.first + diameter_of_bin * (this->data[i] - min_max.first) / number_of_bins;
- if (bdg) {
+ if (dbg) {
std::cerr << "After binning : " << this->data[i] << std::endl;
- getchar();
}
}
}
template <typename T>
-std::pair< T, T > Bitmap_cubical_complex_base<T>::min_max_filtration() {
- std::pair< T, T > min_max(std::numeric_limits<T>::max(), std::numeric_limits<T>::min());
- for (size_t i = 0; i != this->data.size(); ++i) {
- if (this->data[i] < min_max.first)min_max.first = this->data[i];
- if (this->data[i] > min_max.second)min_max.second = this->data[i];
+std::pair<T, T> Bitmap_cubical_complex_base<T>::min_max_filtration() {
+ std::pair<T, T> min_max(std::numeric_limits<T>::max(), std::numeric_limits<T>::min());
+ for (std::size_t i = 0; i != this->data.size(); ++i) {
+ if (this->data[i] < min_max.first) min_max.first = this->data[i];
+ if (this->data[i] > min_max.second) min_max.second = this->data[i];
}
return min_max;
}
template <typename K>
-std::ostream& operator<<(std::ostream & out, const Bitmap_cubical_complex_base<K>& b) {
- for (typename Bitmap_cubical_complex_base<K>::all_cells_const_iterator
- it = b.all_cells_const_begin(); it != b.all_cells_const_end(); ++it) {
+std::ostream& operator<<(std::ostream& out, const Bitmap_cubical_complex_base<K>& b) {
+ for (typename Bitmap_cubical_complex_base<K>::all_cells_const_iterator it = b.all_cells_const_begin();
+ it != b.all_cells_const_end(); ++it) {
out << *it << " ";
}
return out;
}
template <typename T>
-Bitmap_cubical_complex_base<T>::Bitmap_cubical_complex_base
-(const std::vector<unsigned>& sizes) {
+Bitmap_cubical_complex_base<T>::Bitmap_cubical_complex_base(const std::vector<unsigned>& sizes) {
this->set_up_containers(sizes);
}
template <typename T>
-void Bitmap_cubical_complex_base<T>::setup_bitmap_based_on_top_dimensional_cells_list(const std::vector<unsigned>& sizes_in_following_directions,
- const std::vector<T>& top_dimensional_cells) {
+void Bitmap_cubical_complex_base<T>::setup_bitmap_based_on_top_dimensional_cells_list(
+ const std::vector<unsigned>& sizes_in_following_directions, const std::vector<T>& top_dimensional_cells) {
this->set_up_containers(sizes_in_following_directions);
- size_t number_of_top_dimensional_elements = 1;
- for (size_t i = 0; i != sizes_in_following_directions.size(); ++i) {
+ std::size_t number_of_top_dimensional_elements = 1;
+ for (std::size_t i = 0; i != sizes_in_following_directions.size(); ++i) {
number_of_top_dimensional_elements *= sizes_in_following_directions[i];
}
if (number_of_top_dimensional_elements != top_dimensional_cells.size()) {
- std::cerr << "Error in constructor Bitmap_cubical_complex_base ( std::vector<size_t> sizes_in_following_directions"
- << ", std::vector<T> top_dimensional_cells ). Number of top dimensional elements that follow from "
- << "sizes_in_following_directions vector is different than the size of top_dimensional_cells vector."
- << std::endl;
- throw("Error in constructor Bitmap_cubical_complex_base( std::vector<size_t> sizes_in_following_directions,"
- "std::vector<T> top_dimensional_cells ). Number of top dimensional elements that follow from "
- "sizes_in_following_directions vector is different than the size of top_dimensional_cells vector.");
+ std::cerr << "Error in constructor Bitmap_cubical_complex_base ( std::vector<std::size_t> "
+ << "sizes_in_following_directions, std::vector<T> top_dimensional_cells ). Number of top dimensional "
+ << "elements that follow from sizes_in_following_directions vector is different than the size of "
+ << "top_dimensional_cells vector."
+ << std::endl;
+ throw(
+ "Error in constructor Bitmap_cubical_complex_base( std::vector<std::size_t> sizes_in_following_directions,"
+ "std::vector<T> top_dimensional_cells ). Number of top dimensional elements that follow from "
+ "sizes_in_following_directions vector is different than the size of top_dimensional_cells vector.");
}
Bitmap_cubical_complex_base<T>::Top_dimensional_cells_iterator it(*this);
- size_t index = 0;
+ std::size_t index = 0;
for (it = this->top_dimensional_cells_iterator_begin(); it != this->top_dimensional_cells_iterator_end(); ++it) {
this->get_cell_data(*it) = top_dimensional_cells[index];
++index;
@@ -584,8 +615,8 @@ void Bitmap_cubical_complex_base<T>::setup_bitmap_based_on_top_dimensional_cells
}
template <typename T>
-Bitmap_cubical_complex_base<T>::Bitmap_cubical_complex_base
-(const std::vector<unsigned>& sizes_in_following_directions, const std::vector<T>& top_dimensional_cells) {
+Bitmap_cubical_complex_base<T>::Bitmap_cubical_complex_base(const std::vector<unsigned>& sizes_in_following_directions,
+ const std::vector<T>& top_dimensional_cells) {
this->setup_bitmap_based_on_top_dimensional_cells_list(sizes_in_following_directions, top_dimensional_cells);
}
@@ -599,15 +630,17 @@ void Bitmap_cubical_complex_base<T>::read_perseus_style_file(const char* perseus
if (dbg) {
std::cerr << "dimensionOfData : " << dimensionOfData << std::endl;
- getchar();
}
std::vector<unsigned> sizes;
sizes.reserve(dimensionOfData);
- for (size_t i = 0; i != dimensionOfData; ++i) {
+ // all dimensions multiplied
+ std::size_t dimensions = 1;
+ for (std::size_t i = 0; i != dimensionOfData; ++i) {
unsigned size_in_this_dimension;
inFiltration >> size_in_this_dimension;
sizes.push_back(size_in_this_dimension);
+ dimensions *= size_in_this_dimension;
if (dbg) {
std::cerr << "size_in_this_dimension : " << size_in_this_dimension << std::endl;
}
@@ -617,19 +650,20 @@ void Bitmap_cubical_complex_base<T>::read_perseus_style_file(const char* perseus
Bitmap_cubical_complex_base<T>::Top_dimensional_cells_iterator it(*this);
it = this->top_dimensional_cells_iterator_begin();
- while (!inFiltration.eof()) {
- T filtrationLevel;
- inFiltration >> filtrationLevel;
+ T filtrationLevel;
+ for (std::size_t i = 0; i < dimensions; ++i) {
+ if (!(inFiltration >> filtrationLevel) || (inFiltration.eof())) {
+ throw std::ios_base::failure("Bad Perseus file format.");
+ }
if (dbg) {
- std::cerr << "Cell of an index : "
- << it.compute_index_in_bitmap()
- << " and dimension: "
- << this->get_dimension_of_a_cell(it.compute_index_in_bitmap())
- << " get the value : " << filtrationLevel << std::endl;
+ std::cerr << "Cell of an index : " << it.compute_index_in_bitmap()
+ << " and dimension: " << this->get_dimension_of_a_cell(it.compute_index_in_bitmap())
+ << " get the value : " << filtrationLevel << std::endl;
}
this->get_cell_data(*it) = filtrationLevel;
++it;
}
+
inFiltration.close();
this->impose_lower_star_filtration();
}
@@ -668,37 +702,44 @@ Bitmap_cubical_complex_base<T>::Bitmap_cubical_complex_base(const char* perseus_
}
template <typename T>
-std::vector< size_t > Bitmap_cubical_complex_base<T>::get_boundary_of_a_cell(size_t cell)const {
- std::vector< size_t > boundary_elements;
+std::vector<std::size_t> Bitmap_cubical_complex_base<T>::get_boundary_of_a_cell(std::size_t cell) const {
+ std::vector<std::size_t> boundary_elements;
// Speed traded of for memory. Check if it is better in practice.
- boundary_elements.reserve(this->dimension()*2);
+ boundary_elements.reserve(this->dimension() * 2);
- size_t cell1 = cell;
- for (size_t i = this->multipliers.size(); i != 0; --i) {
+ std::size_t sum_of_dimensions = 0;
+ std::size_t cell1 = cell;
+ for (std::size_t i = this->multipliers.size(); i != 0; --i) {
unsigned position = cell1 / this->multipliers[i - 1];
if (position % 2 == 1) {
- boundary_elements.push_back(cell - this->multipliers[ i - 1 ]);
- boundary_elements.push_back(cell + this->multipliers[ i - 1 ]);
+ if (sum_of_dimensions % 2) {
+ boundary_elements.push_back(cell + this->multipliers[i - 1]);
+ boundary_elements.push_back(cell - this->multipliers[i - 1]);
+ } else {
+ boundary_elements.push_back(cell - this->multipliers[i - 1]);
+ boundary_elements.push_back(cell + this->multipliers[i - 1]);
+ }
+ ++sum_of_dimensions;
}
cell1 = cell1 % this->multipliers[i - 1];
}
+
return boundary_elements;
}
template <typename T>
-std::vector< size_t > Bitmap_cubical_complex_base<T>::get_coboundary_of_a_cell(size_t cell)const {
+std::vector<std::size_t> Bitmap_cubical_complex_base<T>::get_coboundary_of_a_cell(std::size_t cell) const {
std::vector<unsigned> counter = this->compute_counter_for_given_cell(cell);
- std::vector< size_t > coboundary_elements;
- size_t cell1 = cell;
- for (size_t i = this->multipliers.size(); i != 0; --i) {
+ std::vector<std::size_t> coboundary_elements;
+ std::size_t cell1 = cell;
+ for (std::size_t i = this->multipliers.size(); i != 0; --i) {
unsigned position = cell1 / this->multipliers[i - 1];
if (position % 2 == 0) {
if ((cell > this->multipliers[i - 1]) && (counter[i - 1] != 0)) {
coboundary_elements.push_back(cell - this->multipliers[i - 1]);
}
- if (
- (cell + this->multipliers[i - 1] < this->data.size()) && (counter[i - 1] != 2 * this->sizes[i - 1])) {
+ if ((cell + this->multipliers[i - 1] < this->data.size()) && (counter[i - 1] != 2 * this->sizes[i - 1])) {
coboundary_elements.push_back(cell + this->multipliers[i - 1]);
}
}
@@ -708,11 +749,11 @@ std::vector< size_t > Bitmap_cubical_complex_base<T>::get_coboundary_of_a_cell(s
}
template <typename T>
-unsigned Bitmap_cubical_complex_base<T>::get_dimension_of_a_cell(size_t cell)const {
+unsigned Bitmap_cubical_complex_base<T>::get_dimension_of_a_cell(std::size_t cell) const {
bool dbg = false;
if (dbg) std::cerr << "\n\n\n Computing position o a cell of an index : " << cell << std::endl;
unsigned dimension = 0;
- for (size_t i = this->multipliers.size(); i != 0; --i) {
+ for (std::size_t i = this->multipliers.size(); i != 0; --i) {
unsigned position = cell / this->multipliers[i - 1];
if (dbg) {
@@ -720,7 +761,6 @@ unsigned Bitmap_cubical_complex_base<T>::get_dimension_of_a_cell(size_t cell)con
std::cerr << "cell : " << cell << std::endl;
std::cerr << "position : " << position << std::endl;
std::cerr << "multipliers[" << i - 1 << "] = " << this->multipliers[i - 1] << std::endl;
- getchar();
}
if (position % 2 == 1) {
@@ -733,7 +773,7 @@ unsigned Bitmap_cubical_complex_base<T>::get_dimension_of_a_cell(size_t cell)con
}
template <typename T>
-inline T& Bitmap_cubical_complex_base<T>::get_cell_data(size_t cell) {
+inline T& Bitmap_cubical_complex_base<T>::get_cell_data(std::size_t cell) {
return this->data[cell];
}
@@ -744,12 +784,12 @@ void Bitmap_cubical_complex_base<T>::impose_lower_star_filtration() {
// this vector will be used to check which elements have already been taken care of in imposing lower star filtration
std::vector<bool> is_this_cell_considered(this->data.size(), false);
- size_t size_to_reserve = 1;
- for (size_t i = 0; i != this->multipliers.size(); ++i) {
- size_to_reserve *= (size_t) ((this->multipliers[i] - 1) / 2);
+ std::size_t size_to_reserve = 1;
+ for (std::size_t i = 0; i != this->multipliers.size(); ++i) {
+ size_to_reserve *= (std::size_t)((this->multipliers[i] - 1) / 2);
}
- std::vector<size_t> indices_to_consider;
+ std::vector<std::size_t> indices_to_consider;
indices_to_consider.reserve(size_to_reserve);
// we assume here that we already have a filtration on the top dimensional cells and
// we have to extend it to lower ones.
@@ -761,32 +801,29 @@ void Bitmap_cubical_complex_base<T>::impose_lower_star_filtration() {
while (indices_to_consider.size()) {
if (dbg) {
std::cerr << "indices_to_consider in this iteration \n";
- for (size_t i = 0; i != indices_to_consider.size(); ++i) {
+ for (std::size_t i = 0; i != indices_to_consider.size(); ++i) {
std::cout << indices_to_consider[i] << " ";
}
- getchar();
}
- std::vector<size_t> new_indices_to_consider;
- for (size_t i = 0; i != indices_to_consider.size(); ++i) {
- std::vector<size_t> bd = this->get_boundary_of_a_cell(indices_to_consider[i]);
- for (size_t boundaryIt = 0; boundaryIt != bd.size(); ++boundaryIt) {
+ std::vector<std::size_t> new_indices_to_consider;
+ for (std::size_t i = 0; i != indices_to_consider.size(); ++i) {
+ std::vector<std::size_t> bd = this->get_boundary_of_a_cell(indices_to_consider[i]);
+ for (std::size_t boundaryIt = 0; boundaryIt != bd.size(); ++boundaryIt) {
if (dbg) {
- std::cerr << "filtration of a cell : " << bd[boundaryIt] << " is : " << this->data[ bd[boundaryIt] ]
- << " while of a cell: " << indices_to_consider[i] << " is: " << this->data[ indices_to_consider[i] ]
- << std::endl;
- getchar();
+ std::cerr << "filtration of a cell : " << bd[boundaryIt] << " is : " << this->data[bd[boundaryIt]]
+ << " while of a cell: " << indices_to_consider[i] << " is: " << this->data[indices_to_consider[i]]
+ << std::endl;
}
- if (this->data[ bd[boundaryIt] ] > this->data[ indices_to_consider[i] ]) {
- this->data[ bd[boundaryIt] ] = this->data[ indices_to_consider[i] ];
+ if (this->data[bd[boundaryIt]] > this->data[indices_to_consider[i]]) {
+ this->data[bd[boundaryIt]] = this->data[indices_to_consider[i]];
if (dbg) {
- std::cerr << "Setting the value of a cell : " << bd[boundaryIt] << " to : "
- << this->data[ indices_to_consider[i] ] << std::endl;
- getchar();
+ std::cerr << "Setting the value of a cell : " << bd[boundaryIt]
+ << " to : " << this->data[indices_to_consider[i]] << std::endl;
}
}
- if (is_this_cell_considered[ bd[boundaryIt] ] == false) {
+ if (is_this_cell_considered[bd[boundaryIt]] == false) {
new_indices_to_consider.push_back(bd[boundaryIt]);
- is_this_cell_considered[ bd[boundaryIt] ] = true;
+ is_this_cell_considered[bd[boundaryIt]] = true;
}
}
}
@@ -795,8 +832,8 @@ void Bitmap_cubical_complex_base<T>::impose_lower_star_filtration() {
}
template <typename T>
-bool compareFirstElementsOfTuples(const std::pair< std::pair< T, size_t >, char >& first,
- const std::pair< std::pair< T, size_t >, char >& second) {
+bool compareFirstElementsOfTuples(const std::pair<std::pair<T, std::size_t>, char>& first,
+ const std::pair<std::pair<T, std::size_t>, char>& second) {
if (first.first.first < second.first.first) {
return true;
} else {
diff --git a/include/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h b/include/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h
index c3cc93dd..4a0d1c74 100644
--- a/include/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h
+++ b/include/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h
@@ -28,6 +28,8 @@
#include <cmath>
#include <limits> // for numeric_limits<>
#include <vector>
+#include <stdexcept>
+#include <cstddef>
namespace Gudhi {
@@ -41,7 +43,8 @@ namespace cubical_complex {
/**
* @brief Cubical complex with periodic boundary conditions represented as a bitmap.
* @ingroup cubical_complex
- * @details This is a class implementing a bitmap data structure with periodic boundary conditions. Most of the functions are
+ * @details This is a class implementing a bitmap data structure with periodic boundary conditions. Most of the
+ * functions are
* identical to the functions from Bitmap_cubical_complex_base.
* The ones that needed to be updated are the constructors and get_boundary_of_a_cell and get_coboundary_of_a_cell.
*/
@@ -53,7 +56,7 @@ class Bitmap_cubical_complex_periodic_boundary_conditions_base : public Bitmap_c
/**
* Default constructor of Bitmap_cubical_complex_periodic_boundary_conditions_base class.
*/
- Bitmap_cubical_complex_periodic_boundary_conditions_base() { }
+ Bitmap_cubical_complex_periodic_boundary_conditions_base() {}
/**
* A constructor of Bitmap_cubical_complex_periodic_boundary_conditions_base class that takes the following
* parameters: (1) vector with numbers of top dimensional cells in all dimensions and (2) vector of booleans. If
@@ -61,8 +64,9 @@ class Bitmap_cubical_complex_periodic_boundary_conditions_base : public Bitmap_c
* imposed in this direction. In case of false, the periodic boundary conditions will not be imposed in the direction
* i.
*/
- Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsigned>& sizes,
- const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed);
+ Bitmap_cubical_complex_periodic_boundary_conditions_base(
+ const std::vector<unsigned>& sizes,
+ const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed);
/**
* A constructor of Bitmap_cubical_complex_periodic_boundary_conditions_base class that takes the name of Perseus
* style file as an input. Please consult the documentation about the specification of the file.
@@ -75,9 +79,9 @@ class Bitmap_cubical_complex_periodic_boundary_conditions_base : public Bitmap_c
* value, that means that periodic boundary conditions are to be imposed in this direction. In case of false, the
* periodic boundary conditions will not be imposed in the direction i.
*/
- Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsigned>& dimensions,
- const std::vector<T>& topDimensionalCells,
- const std::vector< bool >& directions_in_which_periodic_b_cond_are_to_be_imposed);
+ Bitmap_cubical_complex_periodic_boundary_conditions_base(
+ const std::vector<unsigned>& dimensions, const std::vector<T>& topDimensionalCells,
+ const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed);
/**
* Destructor of the Bitmap_cubical_complex_periodic_boundary_conditions_base class.
@@ -88,21 +92,81 @@ class Bitmap_cubical_complex_periodic_boundary_conditions_base : public Bitmap_c
/**
* A version of a function that return boundary of a given cell for an object of
* Bitmap_cubical_complex_periodic_boundary_conditions_base class.
+ * The boundary elements are guaranteed to be returned so that the
+ * incidence coefficients are alternating.
*/
- virtual std::vector< size_t > get_boundary_of_a_cell(size_t cell) const;
+ virtual std::vector<std::size_t> get_boundary_of_a_cell(std::size_t cell) const;
/**
* A version of a function that return coboundary of a given cell for an object of
* Bitmap_cubical_complex_periodic_boundary_conditions_base class.
+ * Note that unlike in the case of boundary, over here the elements are
+ * not guaranteed to be returned with alternating incidence numbers.
+ * To compute incidence between cells use compute_incidence_between_cells
+ * procedure
*/
- virtual std::vector< size_t > get_coboundary_of_a_cell(size_t cell) const;
+ virtual std::vector<std::size_t> get_coboundary_of_a_cell(std::size_t cell) const;
+
+ /**
+ * This procedure compute incidence numbers between cubes. For a cube \f$A\f$ of
+ * dimension n and a cube \f$B \subset A\f$ of dimension n-1, an incidence
+ * between \f$A\f$ and \f$B\f$ is the integer with which \f$B\f$ appears in the boundary of \f$A\f$.
+ * Note that first parameter is a cube of dimension n,
+ * and the second parameter is an adjusted cube in dimension n-1.
+ * Given \f$A = [b_1,e_1] \times \ldots \ [b_{j-1},e_{j-1}] \times [b_{j},e_{j}] \times [b_{j+1},e_{j+1}] \times \ldots
+ *\times [b_{n},e_{n}] \f$
+ * such that \f$ b_{j} \neq e_{j} \f$
+ * and \f$B = [b_1,e_1] \times \ldots \ [b_{j-1},e_{j-1}] \times [a,a] \times [b_{j+1},e_{j+1}] \times \ldots \times
+ *[b_{n},e_{n}]s \f$
+ * where \f$ a = b_{j}\f$ or \f$ a = e_{j}\f$, the incidence between \f$A\f$ and \f$B\f$
+ * computed by this procedure is given by formula:
+ * \f$ c\ (-1)^{\sum_{i=1}^{j-1} dim [b_{i},e_{i}]} \f$
+ * Where \f$ dim [b_{i},e_{i}] = 0 \f$ if \f$ b_{i}=e_{i} \f$ and 1 in other case.
+ * c is -1 if \f$ a = b_{j}\f$ and 1 if \f$ a = e_{j}\f$.
+ * @exception std::logic_error In case when the cube \f$B\f$ is not n-1
+ * dimensional face of a cube \f$A\f$.
+ **/
+ virtual int compute_incidence_between_cells(std::size_t coface, std::size_t face) {
+ // first get the counters for coface and face:
+ std::vector<unsigned> coface_counter = this->compute_counter_for_given_cell(coface);
+ std::vector<unsigned> face_counter = this->compute_counter_for_given_cell(face);
+
+ // coface_counter and face_counter should agree at all positions except from one:
+ int number_of_position_in_which_counters_do_not_agree = -1;
+ std::size_t number_of_full_faces_that_comes_before = 0;
+ for (std::size_t i = 0; i != coface_counter.size(); ++i) {
+ if ((coface_counter[i] % 2 == 1) && (number_of_position_in_which_counters_do_not_agree == -1)) {
+ ++number_of_full_faces_that_comes_before;
+ }
+ if (coface_counter[i] != face_counter[i]) {
+ if (number_of_position_in_which_counters_do_not_agree != -1) {
+ std::cout << "Cells given to compute_incidence_between_cells procedure do not form a pair of coface-face.\n";
+ throw std::logic_error(
+ "Cells given to compute_incidence_between_cells procedure do not form a pair of coface-face.");
+ }
+ number_of_position_in_which_counters_do_not_agree = i;
+ }
+ }
+
+ int incidence = 1;
+ if (number_of_full_faces_that_comes_before % 2) incidence = -1;
+ // if the face cell is on the right from coface cell:
+ if ((coface_counter[number_of_position_in_which_counters_do_not_agree] + 1 ==
+ face_counter[number_of_position_in_which_counters_do_not_agree]) ||
+ ((coface_counter[number_of_position_in_which_counters_do_not_agree] != 1) &&
+ (face_counter[number_of_position_in_which_counters_do_not_agree] == 0))) {
+ incidence *= -1;
+ }
+
+ return incidence;
+ }
protected:
- std::vector< bool > directions_in_which_periodic_b_cond_are_to_be_imposed;
+ std::vector<bool> directions_in_which_periodic_b_cond_are_to_be_imposed;
void set_up_containers(const std::vector<unsigned>& sizes) {
unsigned multiplier = 1;
- for (size_t i = 0; i != sizes.size(); ++i) {
+ for (std::size_t i = 0; i != sizes.size(); ++i) {
this->sizes.push_back(sizes[i]);
this->multipliers.push_back(multiplier);
@@ -119,19 +183,23 @@ class Bitmap_cubical_complex_periodic_boundary_conditions_base : public Bitmap_c
Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsigned>& sizes);
Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsigned>& dimensions,
const std::vector<T>& topDimensionalCells);
- void construct_complex_based_on_top_dimensional_cells(const std::vector<unsigned>& dimensions,
- const std::vector<T>& topDimensionalCells,
- const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed);
+
+ /**
+ * A procedure used to construct the data structures in the class.
+ **/
+ void construct_complex_based_on_top_dimensional_cells(
+ const std::vector<unsigned>& dimensions, const std::vector<T>& topDimensionalCells,
+ const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed);
};
template <typename T>
-void Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::construct_complex_based_on_top_dimensional_cells(const std::vector<unsigned>& dimensions,
- const std::vector<T>& topDimensionalCells,
- const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed) {
+void Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::construct_complex_based_on_top_dimensional_cells(
+ const std::vector<unsigned>& dimensions, const std::vector<T>& topDimensionalCells,
+ const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed) {
this->directions_in_which_periodic_b_cond_are_to_be_imposed = directions_in_which_periodic_b_cond_are_to_be_imposed;
this->set_up_containers(dimensions);
- size_t i = 0;
+ std::size_t i = 0;
for (auto it = this->top_dimensional_cells_iterator_begin(); it != this->top_dimensional_cells_iterator_end(); ++it) {
this->get_cell_data(*it) = topDimensionalCells[i];
++i;
@@ -140,14 +208,16 @@ void Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::construct_comp
}
template <typename T>
-Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsigned>& sizes,
- const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed) {
+Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Bitmap_cubical_complex_periodic_boundary_conditions_base(
+ const std::vector<unsigned>& sizes,
+ const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed) {
this->directions_in_which_periodic_b_cond_are_to_be_imposed(directions_in_which_periodic_b_cond_are_to_be_imposed);
this->set_up_containers(sizes);
}
template <typename T>
-Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Bitmap_cubical_complex_periodic_boundary_conditions_base(const char* perseus_style_file) {
+Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Bitmap_cubical_complex_periodic_boundary_conditions_base(
+ const char* perseus_style_file) {
// for Perseus style files:
bool dbg = false;
@@ -160,7 +230,7 @@ Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Bitmap_cubical_comp
std::vector<unsigned> sizes;
sizes.reserve(dimensionOfData);
- for (size_t i = 0; i != dimensionOfData; ++i) {
+ for (std::size_t i = 0; i != dimensionOfData; ++i) {
int size_in_this_dimension;
inFiltration >> size_in_this_dimension;
if (size_in_this_dimension < 0) {
@@ -176,14 +246,12 @@ Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Bitmap_cubical_comp
while (!inFiltration.eof()) {
double filtrationLevel;
inFiltration >> filtrationLevel;
- if (inFiltration.eof())break;
+ if (inFiltration.eof()) break;
if (dbg) {
- std::cerr << "Cell of an index : "
- << it.compute_index_in_bitmap()
- << " and dimension: "
- << this->get_dimension_of_a_cell(it.compute_index_in_bitmap())
- << " get the value : " << filtrationLevel << std::endl;
+ std::cerr << "Cell of an index : " << it.compute_index_in_bitmap()
+ << " and dimension: " << this->get_dimension_of_a_cell(it.compute_index_in_bitmap())
+ << " get the value : " << filtrationLevel << std::endl;
}
this->get_cell_data(*it) = filtrationLevel;
++it;
@@ -193,24 +261,24 @@ Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Bitmap_cubical_comp
}
template <typename T>
-Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsigned>& sizes) {
+Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Bitmap_cubical_complex_periodic_boundary_conditions_base(
+ const std::vector<unsigned>& sizes) {
this->directions_in_which_periodic_b_cond_are_to_be_imposed = std::vector<bool>(sizes.size(), false);
this->set_up_containers(sizes);
}
template <typename T>
-Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsigned>& dimensions,
- const std::vector<T>& topDimensionalCells) {
+Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Bitmap_cubical_complex_periodic_boundary_conditions_base(
+ const std::vector<unsigned>& dimensions, const std::vector<T>& topDimensionalCells) {
std::vector<bool> directions_in_which_periodic_b_cond_are_to_be_imposed = std::vector<bool>(dimensions.size(), false);
this->construct_complex_based_on_top_dimensional_cells(dimensions, topDimensionalCells,
directions_in_which_periodic_b_cond_are_to_be_imposed);
}
template <typename T>
-Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::
-Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsigned>& dimensions,
- const std::vector<T>& topDimensionalCells,
- const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed) {
+Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Bitmap_cubical_complex_periodic_boundary_conditions_base(
+ const std::vector<unsigned>& dimensions, const std::vector<T>& topDimensionalCells,
+ const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed) {
this->construct_complex_based_on_top_dimensional_cells(dimensions, topDimensionalCells,
directions_in_which_periodic_b_cond_are_to_be_imposed);
}
@@ -218,46 +286,65 @@ Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsig
// ***********************Methods************************ //
template <typename T>
-std::vector< size_t > Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::get_boundary_of_a_cell(size_t cell) const {
+std::vector<std::size_t> Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::get_boundary_of_a_cell(
+ std::size_t cell) const {
bool dbg = false;
if (dbg) {
std::cerr << "Computations of boundary of a cell : " << cell << std::endl;
}
- std::vector< size_t > boundary_elements;
- size_t cell1 = cell;
- for (size_t i = this->multipliers.size(); i != 0; --i) {
+ std::vector<std::size_t> boundary_elements;
+ boundary_elements.reserve(this->dimension() * 2);
+ std::size_t cell1 = cell;
+ std::size_t sum_of_dimensions = 0;
+
+ for (std::size_t i = this->multipliers.size(); i != 0; --i) {
unsigned position = cell1 / this->multipliers[i - 1];
// this cell have a nonzero length in this direction, therefore we can compute its boundary in this direction.
-
if (position % 2 == 1) {
// if there are no periodic boundary conditions in this direction, we do not have to do anything.
if (!directions_in_which_periodic_b_cond_are_to_be_imposed[i - 1]) {
// std::cerr << "A\n";
- boundary_elements.push_back(cell - this->multipliers[ i - 1 ]);
- boundary_elements.push_back(cell + this->multipliers[ i - 1 ]);
+ if (sum_of_dimensions % 2) {
+ boundary_elements.push_back(cell - this->multipliers[i - 1]);
+ boundary_elements.push_back(cell + this->multipliers[i - 1]);
+ } else {
+ boundary_elements.push_back(cell + this->multipliers[i - 1]);
+ boundary_elements.push_back(cell - this->multipliers[i - 1]);
+ }
if (dbg) {
- std::cerr << cell - this->multipliers[ i - 1 ] << " " << cell + this->multipliers[ i - 1 ] << " ";
+ std::cerr << cell - this->multipliers[i - 1] << " " << cell + this->multipliers[i - 1] << " ";
}
} else {
// in this direction we have to do boundary conditions. Therefore, we need to check if we are not at the end.
- if (position != 2 * this->sizes[ i - 1 ] - 1) {
+ if (position != 2 * this->sizes[i - 1] - 1) {
// std::cerr << "B\n";
- boundary_elements.push_back(cell - this->multipliers[ i - 1 ]);
- boundary_elements.push_back(cell + this->multipliers[ i - 1 ]);
+ if (sum_of_dimensions % 2) {
+ boundary_elements.push_back(cell - this->multipliers[i - 1]);
+ boundary_elements.push_back(cell + this->multipliers[i - 1]);
+ } else {
+ boundary_elements.push_back(cell + this->multipliers[i - 1]);
+ boundary_elements.push_back(cell - this->multipliers[i - 1]);
+ }
if (dbg) {
- std::cerr << cell - this->multipliers[ i - 1 ] << " " << cell + this->multipliers[ i - 1 ] << " ";
+ std::cerr << cell - this->multipliers[i - 1] << " " << cell + this->multipliers[i - 1] << " ";
}
} else {
// std::cerr << "C\n";
- boundary_elements.push_back(cell - this->multipliers[ i - 1 ]);
- boundary_elements.push_back(cell - (2 * this->sizes[ i - 1 ] - 1) * this->multipliers[ i - 1 ]);
+ if (sum_of_dimensions % 2) {
+ boundary_elements.push_back(cell - this->multipliers[i - 1]);
+ boundary_elements.push_back(cell - (2 * this->sizes[i - 1] - 1) * this->multipliers[i - 1]);
+ } else {
+ boundary_elements.push_back(cell - (2 * this->sizes[i - 1] - 1) * this->multipliers[i - 1]);
+ boundary_elements.push_back(cell - this->multipliers[i - 1]);
+ }
if (dbg) {
- std::cerr << cell - this->multipliers[ i - 1 ] << " " <<
- cell - (2 * this->sizes[ i - 1 ] - 1) * this->multipliers[ i - 1 ] << " ";
+ std::cerr << cell - this->multipliers[i - 1] << " "
+ << cell - (2 * this->sizes[i - 1] - 1) * this->multipliers[i - 1] << " ";
}
}
}
+ ++sum_of_dimensions;
}
cell1 = cell1 % this->multipliers[i - 1];
}
@@ -265,11 +352,12 @@ std::vector< size_t > Bitmap_cubical_complex_periodic_boundary_conditions_base<T
}
template <typename T>
-std::vector< size_t > Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::get_coboundary_of_a_cell(size_t cell) const {
+std::vector<std::size_t> Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::get_coboundary_of_a_cell(
+ std::size_t cell) const {
std::vector<unsigned> counter = this->compute_counter_for_given_cell(cell);
- std::vector< size_t > coboundary_elements;
- size_t cell1 = cell;
- for (size_t i = this->multipliers.size(); i != 0; --i) {
+ std::vector<std::size_t> coboundary_elements;
+ std::size_t cell1 = cell;
+ for (std::size_t i = this->multipliers.size(); i != 0; --i) {
unsigned position = cell1 / this->multipliers[i - 1];
// if the cell has zero length in this direction, then it will have cbd in this direction.
if (position % 2 == 0) {
@@ -289,7 +377,7 @@ std::vector< size_t > Bitmap_cubical_complex_periodic_boundary_conditions_base<T
} else {
// in this case counter[i-1] == 0.
coboundary_elements.push_back(cell + this->multipliers[i - 1]);
- coboundary_elements.push_back(cell + (2 * this->sizes[ i - 1 ] - 1) * this->multipliers[i - 1]);
+ coboundary_elements.push_back(cell + (2 * this->sizes[i - 1] - 1) * this->multipliers[i - 1]);
}
}
}
diff --git a/include/gudhi/Bottleneck.h b/include/gudhi/Bottleneck.h
index 8c97dce9..7aee07bb 100644
--- a/include/gudhi/Bottleneck.h
+++ b/include/gudhi/Bottleneck.h
@@ -46,7 +46,7 @@ double bottleneck_distance_approx(Persistence_graph& g, double e) {
if (step <= b_lower_bound || step >= b_upper_bound) // Avoid precision problem
break;
m.set_r(step);
- while (m.multi_augment()) {}; // compute a maximum matching (in the graph corresponding to the current r)
+ while (m.multi_augment()) {} // compute a maximum matching (in the graph corresponding to the current r)
if (m.perfect()) {
m = biggest_unperfect;
b_upper_bound = step;
@@ -68,7 +68,7 @@ double bottleneck_distance_exact(Persistence_graph& g) {
while (lower_bound_i != upper_bound_i) {
long step = lower_bound_i + static_cast<long> ((upper_bound_i - lower_bound_i - 1) / alpha);
m.set_r(sd.at(step));
- while (m.multi_augment()) {}; // compute a maximum matching (in the graph corresponding to the current r)
+ while (m.multi_augment()) {} // compute a maximum matching (in the graph corresponding to the current r)
if (m.perfect()) {
m = biggest_unperfect;
upper_bound_i = step;
diff --git a/include/gudhi/Debug_utils.h b/include/gudhi/Debug_utils.h
index 8ed3b7b3..90d3cf47 100644
--- a/include/gudhi/Debug_utils.h
+++ b/include/gudhi/Debug_utils.h
@@ -4,7 +4,7 @@
*
* Author(s): David Salinas
*
- * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (France)
+ * Copyright (C) 2014 INRIA
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -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/include/gudhi/Edge_contraction.h b/include/gudhi/Edge_contraction.h
index 61f2d945..cf9a2c27 100644
--- a/include/gudhi/Edge_contraction.h
+++ b/include/gudhi/Edge_contraction.h
@@ -210,7 +210,6 @@ int main (int argc, char *argv[])
}
\endcode
-
\verbatim
./example/Contraction/RipsContraction ../../data/SO3_10000.off 0.3
[ 50%] [100%] Built target SkeletonBlockerIteration
@@ -223,9 +222,6 @@ Time to simplify and enumerate simplices:
3.166621s wall, 3.150000s user + 0.010000s system = 3.160000s CPU (99.8%)
\endverbatim
-
-
-\copyright GNU General Public License v3.
*/
/** @} */ // end defgroup
} // namespace contraction
diff --git a/include/gudhi/GIC.h b/include/gudhi/GIC.h
new file mode 100644
index 00000000..40ff7a4a
--- /dev/null
+++ b/include/gudhi/GIC.h
@@ -0,0 +1,1298 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author: Mathieu Carriere
+ *
+ * Copyright (C) 2017 INRIA
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GIC_H_
+#define GIC_H_
+
+#include <gudhi/Debug_utils.h>
+#include <gudhi/graph_simplicial_complex.h>
+#include <gudhi/reader_utils.h>
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Rips_complex.h>
+#include <gudhi/Points_off_io.h>
+#include <gudhi/distance_functions.h>
+#include <gudhi/Persistent_cohomology.h>
+#include <gudhi/Bottleneck.h>
+
+#include <boost/config.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/connected_components.hpp>
+#include <boost/graph/dijkstra_shortest_paths.hpp>
+#include <boost/graph/subgraph.hpp>
+#include <boost/graph/graph_utility.hpp>
+
+#include <iostream>
+#include <vector>
+#include <map>
+#include <string>
+#include <limits> // for numeric_limits
+#include <utility> // for std::pair<>
+#include <algorithm> // for std::max
+#include <random>
+#include <cassert>
+#include <cmath>
+
+namespace Gudhi {
+
+namespace cover_complex {
+
+using Simplex_tree = Gudhi::Simplex_tree<>;
+using Filtration_value = Simplex_tree::Filtration_value;
+using Rips_complex = Gudhi::rips_complex::Rips_complex<Filtration_value>;
+using Persistence_diagram = std::vector<std::pair<double, double> >;
+using Graph = boost::subgraph<
+ boost::adjacency_list<boost::setS, boost::vecS, boost::undirectedS, boost::no_property,
+ boost::property<boost::edge_index_t, int, boost::property<boost::edge_weight_t, double> > > >;
+using Vertex_t = boost::graph_traits<Graph>::vertex_descriptor;
+using Index_map = boost::property_map<Graph, boost::vertex_index_t>::type;
+using Weight_map = boost::property_map<Graph, boost::edge_weight_t>::type;
+
+/**
+ * \class Cover_complex
+ * \brief Cover complex data structure.
+ *
+ * \ingroup cover_complex
+ *
+ * \details
+ * The data structure is a simplicial complex, representing a
+ * Graph Induced simplicial Complex (GIC) or a Nerve,
+ * and whose simplices are computed with a cover C of a point
+ * cloud P, which often comes from the preimages of intervals
+ * covering the image of a function f defined on P.
+ * These intervals are parameterized by their resolution
+ * (either their length or their number)
+ * and their gain (percentage of overlap).
+ * To compute a GIC, one also needs a graph G built on top of P,
+ * whose cliques with vertices belonging to different elements of C
+ * correspond to the simplices of the GIC.
+ *
+ */
+template <typename Point>
+class Cover_complex {
+ private:
+ bool verbose = false; // whether to display information.
+ std::string type; // Nerve or GIC
+
+ std::vector<Point> point_cloud; // input point cloud.
+ std::vector<std::vector<double> > distances; // all pairwise distances.
+ int maximal_dim; // maximal dimension of output simplicial complex.
+ int data_dimension; // dimension of input data.
+ int n; // number of points.
+
+ std::map<int, double> func; // function used to compute the output simplicial complex.
+ std::map<int, double>
+ func_color; // function used to compute the colors of the nodes of the output simplicial complex.
+ bool functional_cover = false; // whether we use a cover with preimages of a function or not.
+
+ Graph one_skeleton_OFF; // one-skeleton given by the input OFF file (if it exists).
+ Graph one_skeleton; // one-skeleton used to compute the connected components.
+ std::vector<Vertex_t> vertices; // vertices of one_skeleton.
+
+ std::vector<std::vector<int> > simplices; // simplices of output simplicial complex.
+ std::vector<int> voronoi_subsamples; // Voronoi germs (in case of Voronoi cover).
+
+ Persistence_diagram PD;
+ std::vector<double> distribution;
+
+ std::map<int, std::vector<int> >
+ cover; // function associating to each data point its vectors of cover elements to which it belongs.
+ std::map<int, std::vector<int> >
+ cover_back; // inverse of cover, in order to get the data points associated to a specific cover element.
+ std::map<int, double> cover_std; // standard function (induced by func) used to compute the extended persistence
+ // diagram of the output simplicial complex.
+ std::map<int, int>
+ cover_fct; // integer-valued function that allows to state if two elements of the cover are consecutive or not.
+ std::map<int, std::pair<int, double> >
+ cover_color; // size and coloring (induced by func_color) of the vertices of the output simplicial complex.
+
+ int resolution_int = -1;
+ double resolution_double = -1;
+ double gain = -1;
+ double rate_constant = 10; // Constant in the subsampling.
+ double rate_power = 0.001; // Power in the subsampling.
+ int mask = 0; // Ignore nodes containing less than mask points.
+
+ std::map<int, int> name2id, name2idinv;
+
+ std::string cover_name;
+ std::string point_cloud_name;
+ std::string color_name;
+
+ // Point comparator
+ struct Less {
+ Less(std::map<int, double> func) { Fct = func; }
+ std::map<int, double> Fct;
+ bool operator()(int a, int b) {
+ if (Fct[a] == Fct[b])
+ return a < b;
+ else
+ return Fct[a] < Fct[b];
+ }
+ };
+
+ // Remove all edges of a graph.
+ void remove_edges(Graph& G) {
+ boost::graph_traits<Graph>::edge_iterator ei, ei_end;
+ for (boost::tie(ei, ei_end) = boost::edges(G); ei != ei_end; ++ei) boost::remove_edge(*ei, G);
+ }
+
+ // Find random number in [0,1].
+ double GetUniform() {
+ thread_local std::default_random_engine re;
+ thread_local std::uniform_real_distribution<double> Dist(0, 1);
+ return Dist(re);
+ }
+
+ // Subsample points.
+ void SampleWithoutReplacement(int populationSize, int sampleSize, std::vector<int>& samples) {
+ int t = 0;
+ int m = 0;
+ double u;
+ while (m < sampleSize) {
+ u = GetUniform();
+ if ((populationSize - t) * u >= sampleSize - m) {
+ t++;
+ } else {
+ samples[m] = t;
+ t++;
+ m++;
+ }
+ }
+ }
+
+ // *******************************************************************************************************************
+ // Utils.
+ // *******************************************************************************************************************
+
+ public:
+ /** \brief Specifies whether the type of the output simplicial complex.
+ *
+ * @param[in] t std::string (either "GIC" or "Nerve").
+ *
+ */
+ void set_type(const std::string& t) { type = t; }
+
+ public:
+ /** \brief Specifies whether the program should display information or not.
+ *
+ * @param[in] verb boolean (true = display info, false = do not display info).
+ *
+ */
+ void set_verbose(bool verb = false) { verbose = verb; }
+
+ public:
+ /** \brief Sets the constants used to subsample the data set. These constants are
+ * explained in \cite Carriere17c.
+ *
+ * @param[in] constant double.
+ * @param[in] power double.
+ *
+ */
+ void set_subsampling(double constant, double power) {
+ rate_constant = constant;
+ rate_power = power;
+ }
+
+ public:
+ /** \brief Sets the mask, which is a threshold integer such that nodes in the complex that contain a number of data
+ * points which is less than or equal to
+ * this threshold are not displayed.
+ *
+ * @param[in] nodemask integer.
+ *
+ */
+ void set_mask(int nodemask) { mask = nodemask; }
+
+ public:
+ /** \brief Reads and stores the input point cloud.
+ *
+ * @param[in] off_file_name name of the input .OFF or .nOFF file.
+ *
+ */
+ bool read_point_cloud(const std::string& off_file_name) {
+ point_cloud_name = off_file_name;
+ std::ifstream input(off_file_name);
+ std::string line;
+
+ char comment = '#';
+ while (comment == '#') {
+ std::getline(input, line);
+ if (!line.empty() && !all_of(line.begin(), line.end(), (int (*)(int))isspace))
+ comment = line[line.find_first_not_of(' ')];
+ }
+ if (strcmp((char*)line.c_str(), "nOFF") == 0) {
+ comment = '#';
+ while (comment == '#') {
+ std::getline(input, line);
+ if (!line.empty() && !all_of(line.begin(), line.end(), (int (*)(int))isspace))
+ comment = line[line.find_first_not_of(' ')];
+ }
+ std::stringstream stream(line);
+ stream >> data_dimension;
+ } else {
+ data_dimension = 3;
+ }
+
+ comment = '#';
+ int numedges, numfaces, i, dim;
+ while (comment == '#') {
+ std::getline(input, line);
+ if (!line.empty() && !all_of(line.begin(), line.end(), (int (*)(int))isspace))
+ comment = line[line.find_first_not_of(' ')];
+ }
+ std::stringstream stream(line);
+ stream >> n;
+ stream >> numfaces;
+ stream >> numedges;
+
+ i = 0;
+ while (i < n) {
+ std::getline(input, line);
+ if (!line.empty() && line[line.find_first_not_of(' ')] != '#' &&
+ !all_of(line.begin(), line.end(), (int (*)(int))isspace)) {
+ std::stringstream iss(line);
+ std::vector<double> point;
+ point.assign(std::istream_iterator<double>(iss), std::istream_iterator<double>());
+ point_cloud.emplace_back(point.begin(), point.begin() + data_dimension);
+ boost::add_vertex(one_skeleton_OFF);
+ vertices.push_back(boost::add_vertex(one_skeleton));
+ i++;
+ }
+ }
+
+ i = 0;
+ while (i < numfaces) {
+ std::getline(input, line);
+ if (!line.empty() && line[line.find_first_not_of(' ')] != '#' &&
+ !all_of(line.begin(), line.end(), (int (*)(int))isspace)) {
+ std::vector<int> simplex;
+ std::stringstream iss(line);
+ simplex.assign(std::istream_iterator<int>(iss), std::istream_iterator<int>());
+ dim = simplex[0];
+ for (int j = 1; j <= dim; j++)
+ for (int k = j + 1; k <= dim; k++)
+ boost::add_edge(vertices[simplex[j]], vertices[simplex[k]], one_skeleton_OFF);
+ i++;
+ }
+ }
+
+ return input.is_open();
+ }
+
+ // *******************************************************************************************************************
+ // Graphs.
+ // *******************************************************************************************************************
+
+ public: // Set graph from file.
+ /** \brief Creates a graph G from a file containing the edges.
+ *
+ * @param[in] graph_file_name name of the input graph file.
+ * The graph file contains one edge per line,
+ * each edge being represented by the IDs of its two nodes.
+ *
+ */
+ void set_graph_from_file(const std::string& graph_file_name) {
+ remove_edges(one_skeleton);
+ int neighb;
+ std::ifstream input(graph_file_name);
+ std::string line;
+ int source;
+ while (std::getline(input, line)) {
+ std::stringstream stream(line);
+ stream >> source;
+ while (stream >> neighb) boost::add_edge(vertices[source], vertices[neighb], one_skeleton);
+ }
+ }
+
+ public: // Set graph from OFF file.
+ /** \brief Creates a graph G from the triangulation given by the input .OFF file.
+ *
+ */
+ void set_graph_from_OFF() {
+ remove_edges(one_skeleton);
+ if (num_edges(one_skeleton_OFF))
+ one_skeleton = one_skeleton_OFF;
+ else
+ std::cout << "No triangulation read in OFF file!" << std::endl;
+ }
+
+ public: // Set graph from Rips complex.
+ /** \brief Creates a graph G from a Rips complex.
+ *
+ * @param[in] threshold threshold value for the Rips complex.
+ * @param[in] distance distance used to compute the Rips complex.
+ *
+ */
+ template <typename Distance>
+ void set_graph_from_rips(double threshold, Distance distance) {
+ remove_edges(one_skeleton);
+ if (distances.size() == 0) compute_pairwise_distances(distance);
+ for (int i = 0; i < n; i++) {
+ for (int j = i + 1; j < n; j++) {
+ if (distances[i][j] <= threshold) {
+ boost::add_edge(vertices[i], vertices[j], one_skeleton);
+ boost::put(boost::edge_weight, one_skeleton, boost::edge(vertices[i], vertices[j], one_skeleton).first,
+ distances[i][j]);
+ }
+ }
+ }
+ }
+
+ public:
+ void set_graph_weights() {
+ Index_map index = boost::get(boost::vertex_index, one_skeleton);
+ Weight_map weight = boost::get(boost::edge_weight, one_skeleton);
+ boost::graph_traits<Graph>::edge_iterator ei, ei_end;
+ for (boost::tie(ei, ei_end) = boost::edges(one_skeleton); ei != ei_end; ++ei)
+ boost::put(weight, *ei,
+ distances[index[boost::source(*ei, one_skeleton)]][index[boost::target(*ei, one_skeleton)]]);
+ }
+
+ public: // Pairwise distances.
+ /** \private \brief Computes all pairwise distances.
+ */
+ template <typename Distance>
+ void compute_pairwise_distances(Distance ref_distance) {
+ double d;
+ std::vector<double> zeros(n);
+ for (int i = 0; i < n; i++) distances.push_back(zeros);
+ std::string distance = point_cloud_name + "_dist";
+ std::ifstream input(distance, std::ios::out | std::ios::binary);
+
+ if (input.good()) {
+ if (verbose) std::cout << "Reading distances..." << std::endl;
+ for (int i = 0; i < n; i++) {
+ for (int j = i; j < n; j++) {
+ input.read((char*)&d, 8);
+ distances[i][j] = d;
+ distances[j][i] = d;
+ }
+ }
+ input.close();
+ } else {
+ if (verbose) std::cout << "Computing distances..." << std::endl;
+ input.close();
+ std::ofstream output(distance, std::ios::out | std::ios::binary);
+ for (int i = 0; i < n; i++) {
+ int state = (int)floor(100 * (i * 1.0 + 1) / n) % 10;
+ if (state == 0 && verbose) std::cout << "\r" << state << "%" << std::flush;
+ for (int j = i; j < n; j++) {
+ double dis = ref_distance(point_cloud[i], point_cloud[j]);
+ distances[i][j] = dis;
+ distances[j][i] = dis;
+ output.write((char*)&dis, 8);
+ }
+ }
+ output.close();
+ if (verbose) std::cout << std::endl;
+ }
+ }
+
+ public: // Automatic tuning of Rips complex.
+ /** \brief Creates a graph G from a Rips complex whose threshold value is automatically tuned with subsampling---see
+ * \cite Carriere17c.
+ *
+ * @param[in] distance distance between data points.
+ * @param[in] N number of subsampling iteration (the default reasonable value is 100, but there is no guarantee on
+ * how to choose it).
+ * @result delta threshold used for computing the Rips complex.
+ *
+ */
+ template <typename Distance>
+ double set_graph_from_automatic_rips(Distance distance, int N = 100) {
+ int m = floor(n / std::exp((1 + rate_power) * std::log(std::log(n) / std::log(rate_constant))));
+ m = std::min(m, n - 1);
+ std::vector<int> samples(m);
+ double delta = 0;
+
+ if (verbose) std::cout << n << " points in R^" << data_dimension << std::endl;
+ if (verbose) std::cout << "Subsampling " << m << " points" << std::endl;
+
+ if (distances.size() == 0) compute_pairwise_distances(distance);
+
+ // #pragma omp parallel for
+ for (int i = 0; i < N; i++) {
+ SampleWithoutReplacement(n, m, samples);
+ double hausdorff_dist = 0;
+ for (int j = 0; j < n; j++) {
+ double mj = distances[j][samples[0]];
+ for (int k = 1; k < m; k++) mj = std::min(mj, distances[j][samples[k]]);
+ hausdorff_dist = std::max(hausdorff_dist, mj);
+ }
+ delta += hausdorff_dist / N;
+ }
+
+ if (verbose) std::cout << "delta = " << delta << std::endl;
+ set_graph_from_rips(delta, distance);
+ return delta;
+ }
+
+ // *******************************************************************************************************************
+ // Functions.
+ // *******************************************************************************************************************
+
+ public: // Set function from file.
+ /** \brief Creates the function f from a file containing the function values.
+ *
+ * @param[in] func_file_name name of the input function file.
+ *
+ */
+ void set_function_from_file(const std::string& func_file_name) {
+ int i = 0;
+ std::ifstream input(func_file_name);
+ std::string line;
+ double f;
+ while (std::getline(input, line)) {
+ std::stringstream stream(line);
+ stream >> f;
+ func.emplace(i, f);
+ i++;
+ }
+ functional_cover = true;
+ cover_name = func_file_name;
+ }
+
+ public: // Set function from kth coordinate
+ /** \brief Creates the function f from the k-th coordinate of the point cloud P.
+ *
+ * @param[in] k coordinate to use (start at 0).
+ *
+ */
+ void set_function_from_coordinate(int k) {
+ for (int i = 0; i < n; i++) func.emplace(i, point_cloud[i][k]);
+ functional_cover = true;
+ cover_name = "coordinate " + std::to_string(k);
+ }
+
+ public: // Set function from vector.
+ /** \brief Creates the function f from a vector stored in memory.
+ *
+ * @param[in] function input vector of values.
+ *
+ */
+ template <class InputRange>
+ void set_function_from_range(InputRange const& function) {
+ for (int i = 0; i < n; i++) func.emplace(i, function[i]);
+ functional_cover = true;
+ }
+
+ // *******************************************************************************************************************
+ // Covers.
+ // *******************************************************************************************************************
+
+ public: // Automatic tuning of resolution.
+ /** \brief Computes the optimal length of intervals
+ * (i.e. the smallest interval length avoiding discretization artifacts---see \cite Carriere17c) for a functional
+ * cover.
+ *
+ * @result reso interval length used to compute the cover.
+ *
+ */
+ double set_automatic_resolution() {
+ if (!functional_cover) {
+ std::cout << "Cover needs to come from the preimages of a function." << std::endl;
+ return 0;
+ }
+ if (type != "Nerve" && type != "GIC") {
+ std::cout << "Type of complex needs to be specified." << std::endl;
+ return 0;
+ }
+
+ double reso = 0;
+ Index_map index = boost::get(boost::vertex_index, one_skeleton);
+
+ if (type == "GIC") {
+ boost::graph_traits<Graph>::edge_iterator ei, ei_end;
+ for (boost::tie(ei, ei_end) = boost::edges(one_skeleton); ei != ei_end; ++ei)
+ reso = std::max(reso, std::abs(func[index[boost::source(*ei, one_skeleton)]] -
+ func[index[boost::target(*ei, one_skeleton)]]));
+ if (verbose) std::cout << "resolution = " << reso << std::endl;
+ resolution_double = reso;
+ }
+
+ if (type == "Nerve") {
+ boost::graph_traits<Graph>::edge_iterator ei, ei_end;
+ for (boost::tie(ei, ei_end) = boost::edges(one_skeleton); ei != ei_end; ++ei)
+ reso = std::max(reso, std::abs(func[index[boost::source(*ei, one_skeleton)]] -
+ func[index[boost::target(*ei, one_skeleton)]]) /
+ gain);
+ if (verbose) std::cout << "resolution = " << reso << std::endl;
+ resolution_double = reso;
+ }
+
+ return reso;
+ }
+
+ public:
+ /** \brief Sets a length of intervals from a value stored in memory.
+ *
+ * @param[in] reso length of intervals.
+ *
+ */
+ void set_resolution_with_interval_length(double reso) { resolution_double = reso; }
+ /** \brief Sets a number of intervals from a value stored in memory.
+ *
+ * @param[in] reso number of intervals.
+ *
+ */
+ void set_resolution_with_interval_number(int reso) { resolution_int = reso; }
+ /** \brief Sets a gain from a value stored in memory (default value 0.3).
+ *
+ * @param[in] g gain.
+ *
+ */
+ void set_gain(double g = 0.3) { gain = g; }
+
+ public: // Set cover with preimages of function.
+ /** \brief Creates a cover C from the preimages of the function f.
+ *
+ */
+ void set_cover_from_function() {
+ if (resolution_double == -1 && resolution_int == -1) {
+ std::cout << "Number and/or length of intervals not specified" << std::endl;
+ return;
+ }
+ if (gain == -1) {
+ std::cout << "Gain not specified" << std::endl;
+ return;
+ }
+
+ // Read function values and compute min and max
+ double minf = std::numeric_limits<float>::max();
+ double maxf = std::numeric_limits<float>::lowest();
+ for (int i = 0; i < n; i++) {
+ minf = std::min(minf, func[i]);
+ maxf = std::max(maxf, func[i]);
+ }
+ if (verbose) std::cout << "Min function value = " << minf << " and Max function value = " << maxf << std::endl;
+
+ // Compute cover of im(f)
+ std::vector<std::pair<double, double> > intervals;
+ int res;
+
+ if (resolution_double == -1) { // Case we use an integer for the number of intervals.
+ double incr = (maxf - minf) / resolution_int;
+ double x = minf;
+ double alpha = (incr * gain) / (2 - 2 * gain);
+ double y = minf + incr + alpha;
+ std::pair<double, double> interm(x, y);
+ intervals.push_back(interm);
+ for (int i = 1; i < resolution_int - 1; i++) {
+ x = minf + i * incr - alpha;
+ y = minf + (i + 1) * incr + alpha;
+ std::pair<double, double> inter(x, y);
+ intervals.push_back(inter);
+ }
+ x = minf + (resolution_int - 1) * incr - alpha;
+ y = maxf;
+ std::pair<double, double> interM(x, y);
+ intervals.push_back(interM);
+ res = intervals.size();
+ if (verbose) {
+ for (int i = 0; i < res; i++)
+ std::cout << "Interval " << i << " = [" << intervals[i].first << ", " << intervals[i].second << "]"
+ << std::endl;
+ }
+ } else {
+ if (resolution_int == -1) { // Case we use a double for the length of the intervals.
+ double x = minf;
+ double y = x + resolution_double;
+ while (y <= maxf && maxf - (y - gain * resolution_double) >= resolution_double) {
+ std::pair<double, double> inter(x, y);
+ intervals.push_back(inter);
+ x = y - gain * resolution_double;
+ y = x + resolution_double;
+ }
+ std::pair<double, double> interM(x, maxf);
+ intervals.push_back(interM);
+ res = intervals.size();
+ if (verbose) {
+ for (int i = 0; i < res; i++)
+ std::cout << "Interval " << i << " = [" << intervals[i].first << ", " << intervals[i].second << "]"
+ << std::endl;
+ }
+ } else { // Case we use an integer and a double for the length of the intervals.
+ double x = minf;
+ double y = x + resolution_double;
+ int count = 0;
+ while (count < resolution_int && y <= maxf && maxf - (y - gain * resolution_double) >= resolution_double) {
+ std::pair<double, double> inter(x, y);
+ intervals.push_back(inter);
+ count++;
+ x = y - gain * resolution_double;
+ y = x + resolution_double;
+ }
+ res = intervals.size();
+ if (verbose) {
+ for (int i = 0; i < res; i++)
+ std::cout << "Interval " << i << " = [" << intervals[i].first << ", " << intervals[i].second << "]"
+ << std::endl;
+ }
+ }
+ }
+
+ // Sort points according to function values
+ std::vector<int> points(n);
+ for (int i = 0; i < n; i++) points[i] = i;
+ std::sort(points.begin(), points.end(), Less(this->func));
+
+ int id = 0;
+ int pos = 0;
+ Index_map index = boost::get(boost::vertex_index, one_skeleton); // int maxc = -1;
+ std::map<int, std::vector<int> > preimages;
+ std::map<int, double> funcstd;
+
+ if (verbose) std::cout << "Computing preimages..." << std::endl;
+ for (int i = 0; i < res; i++) {
+ // Find points in the preimage
+ std::pair<double, double> inter1 = intervals[i];
+ int tmp = pos;
+ double u, v;
+
+ if (i != res - 1) {
+ if (i != 0) {
+ std::pair<double, double> inter3 = intervals[i - 1];
+ while (func[points[tmp]] < inter3.second && tmp != n) {
+ preimages[i].push_back(points[tmp]);
+ tmp++;
+ }
+ u = inter3.second;
+ } else {
+ u = inter1.first;
+ }
+
+ std::pair<double, double> inter2 = intervals[i + 1];
+ while (func[points[tmp]] < inter2.first && tmp != n) {
+ preimages[i].push_back(points[tmp]);
+ tmp++;
+ }
+ v = inter2.first;
+ pos = tmp;
+ while (func[points[tmp]] < inter1.second && tmp != n) {
+ preimages[i].push_back(points[tmp]);
+ tmp++;
+ }
+
+ } else {
+ std::pair<double, double> inter3 = intervals[i - 1];
+ while (func[points[tmp]] < inter3.second && tmp != n) {
+ preimages[i].push_back(points[tmp]);
+ tmp++;
+ }
+ while (tmp != n) {
+ preimages[i].push_back(points[tmp]);
+ tmp++;
+ }
+ u = inter3.second;
+ v = inter1.second;
+ }
+
+ funcstd[i] = 0.5 * (u + v);
+ }
+
+ if (verbose) std::cout << "Computing connected components..." << std::endl;
+ // #pragma omp parallel for
+ for (int i = 0; i < res; i++) {
+ // Compute connected components
+ Graph G = one_skeleton.create_subgraph();
+ int num = preimages[i].size();
+ std::vector<int> component(num);
+ for (int j = 0; j < num; j++) boost::add_vertex(index[vertices[preimages[i][j]]], G);
+ boost::connected_components(G, &component[0]);
+ int max = 0;
+
+ // For each point in preimage
+ for (int j = 0; j < num; j++) {
+ // Update number of components in preimage
+ if (component[j] > max) max = component[j];
+
+ // Identify component with Cantor polynomial N^2 -> N
+ int identifier = (std::pow(i + component[j], 2) + 3 * i + component[j]) / 2;
+
+ // Update covers
+ cover[preimages[i][j]].push_back(identifier);
+ cover_back[identifier].push_back(preimages[i][j]);
+ cover_fct[identifier] = i;
+ cover_std[identifier] = funcstd[i];
+ cover_color[identifier].second += func_color[preimages[i][j]];
+ cover_color[identifier].first += 1;
+ }
+
+ // Maximal dimension is total number of connected components
+ id += max + 1;
+ }
+
+ maximal_dim = id - 1;
+ for (std::map<int, std::pair<int, double> >::iterator iit = cover_color.begin(); iit != cover_color.end(); iit++)
+ iit->second.second /= iit->second.first;
+ }
+
+ public: // Set cover from file.
+ /** \brief Creates the cover C from a file containing the cover elements of each point (the order has to be the same
+ * as in the input file!).
+ *
+ * @param[in] cover_file_name name of the input cover file.
+ *
+ */
+ void set_cover_from_file(const std::string& cover_file_name) {
+ int i = 0;
+ int cov;
+ std::vector<int> cov_elts, cov_number;
+ std::ifstream input(cover_file_name);
+ std::string line;
+ while (std::getline(input, line)) {
+ cov_elts.clear();
+ std::stringstream stream(line);
+ while (stream >> cov) {
+ cov_elts.push_back(cov);
+ cov_number.push_back(cov);
+ cover_fct[cov] = cov;
+ cover_color[cov].second += func_color[i];
+ cover_color[cov].first++;
+ cover_back[cov].push_back(i);
+ }
+ cover[i] = cov_elts;
+ i++;
+ }
+
+ std::sort(cov_number.begin(), cov_number.end());
+ std::vector<int>::iterator it = std::unique(cov_number.begin(), cov_number.end());
+ cov_number.resize(std::distance(cov_number.begin(), it));
+
+ maximal_dim = cov_number.size() - 1;
+ for (int i = 0; i <= maximal_dim; i++) cover_color[i].second /= cover_color[i].first;
+ cover_name = cover_file_name;
+ }
+
+ public: // Set cover from Voronoi
+ /** \brief Creates the cover C from the Voronoï cells of a subsampling of the point cloud.
+ *
+ * @param[in] distance distance between the points.
+ * @param[in] m number of points in the subsample.
+ *
+ */
+ template <typename Distance>
+ void set_cover_from_Voronoi(Distance distance, int m = 100) {
+ voronoi_subsamples.resize(m);
+ SampleWithoutReplacement(n, m, voronoi_subsamples);
+ if (distances.size() == 0) compute_pairwise_distances(distance);
+ set_graph_weights();
+ Weight_map weight = boost::get(boost::edge_weight, one_skeleton);
+ Index_map index = boost::get(boost::vertex_index, one_skeleton);
+ std::vector<double> mindist(n);
+ for (int j = 0; j < n; j++) mindist[j] = std::numeric_limits<double>::max();
+
+ // Compute the geodesic distances to subsamples with Dijkstra
+ // #pragma omp parallel for
+ for (int i = 0; i < m; i++) {
+ if (verbose) std::cout << "Computing geodesic distances to seed " << i << "..." << std::endl;
+ int seed = voronoi_subsamples[i];
+ std::vector<double> dmap(n);
+ boost::dijkstra_shortest_paths(
+ one_skeleton, vertices[seed],
+ boost::weight_map(weight).distance_map(boost::make_iterator_property_map(dmap.begin(), index)));
+
+ for (int j = 0; j < n; j++)
+ if (mindist[j] > dmap[j]) {
+ mindist[j] = dmap[j];
+ if (cover[j].size() == 0)
+ cover[j].push_back(i);
+ else
+ cover[j][0] = i;
+ }
+ }
+
+ for (int i = 0; i < n; i++) {
+ cover_back[cover[i][0]].push_back(i);
+ cover_color[cover[i][0]].second += func_color[i];
+ cover_color[cover[i][0]].first++;
+ }
+ for (int i = 0; i < m; i++) cover_color[i].second /= cover_color[i].first;
+ maximal_dim = m - 1;
+ cover_name = "Voronoi";
+ }
+
+ public: // return subset of data corresponding to a node
+ /** \brief Returns the data subset corresponding to a specific node of the created complex.
+ *
+ * @param[in] c ID of the node.
+ * @result cover_back(c) vector of IDs of data points.
+ *
+ */
+ const std::vector<int>& subpopulation(int c) { return cover_back[name2idinv[c]]; }
+
+ // *******************************************************************************************************************
+ // Visualization.
+ // *******************************************************************************************************************
+
+ public: // Set color from file.
+ /** \brief Computes the function used to color the nodes of the simplicial complex from a file containing the function
+ * values.
+ *
+ * @param[in] color_file_name name of the input color file.
+ *
+ */
+ void set_color_from_file(const std::string& color_file_name) {
+ int i = 0;
+ std::ifstream input(color_file_name);
+ std::string line;
+ double f;
+ while (std::getline(input, line)) {
+ std::stringstream stream(line);
+ stream >> f;
+ func_color.emplace(i, f);
+ i++;
+ }
+ color_name = color_file_name;
+ }
+
+ public: // Set color from kth coordinate
+ /** \brief Computes the function used to color the nodes of the simplicial complex from the k-th coordinate.
+ *
+ * @param[in] k coordinate to use (start at 0).
+ *
+ */
+ void set_color_from_coordinate(int k = 0) {
+ for (int i = 0; i < n; i++) func_color[i] = point_cloud[i][k];
+ color_name = "coordinate ";
+ color_name.append(std::to_string(k));
+ }
+
+ public: // Set color from vector.
+ /** \brief Computes the function used to color the nodes of the simplicial complex from a vector stored in memory.
+ *
+ * @param[in] color input vector of values.
+ *
+ */
+ void set_color_from_vector(std::vector<double> color) {
+ for (unsigned int i = 0; i < color.size(); i++) func_color[i] = color[i];
+ }
+
+ public: // Create a .dot file that can be compiled with neato to produce a .pdf file.
+ /** \brief Creates a .dot file called SC.dot for neato (part of the graphviz package) once the simplicial complex is
+ * computed to get a visualization
+ * of its 1-skeleton in a .pdf file.
+ */
+ void plot_DOT() {
+ std::string mapp = point_cloud_name + "_sc.dot";
+ std::ofstream graphic(mapp);
+
+ double maxv = std::numeric_limits<double>::lowest();
+ double minv = std::numeric_limits<double>::max();
+ for (std::map<int, std::pair<int, double> >::iterator iit = cover_color.begin(); iit != cover_color.end(); iit++) {
+ maxv = std::max(maxv, iit->second.second);
+ minv = std::min(minv, iit->second.second);
+ }
+
+ int k = 0;
+ std::vector<int> nodes;
+ nodes.clear();
+
+ graphic << "graph GIC {" << std::endl;
+ int id = 0;
+ for (std::map<int, std::pair<int, double> >::iterator iit = cover_color.begin(); iit != cover_color.end(); iit++) {
+ if (iit->second.first > mask) {
+ nodes.push_back(iit->first);
+ name2id[iit->first] = id;
+ name2idinv[id] = iit->first;
+ id++;
+ graphic << name2id[iit->first] << "[shape=circle fontcolor=black color=black label=\"" << name2id[iit->first]
+ << ":" << iit->second.first << "\" style=filled fillcolor=\""
+ << (1 - (maxv - iit->second.second) / (maxv - minv)) * 0.6 << ", 1, 1\"]" << std::endl;
+ k++;
+ }
+ }
+ int ke = 0;
+ int num_simplices = simplices.size();
+ for (int i = 0; i < num_simplices; i++)
+ if (simplices[i].size() == 2) {
+ if (cover_color[simplices[i][0]].first > mask && cover_color[simplices[i][1]].first > mask) {
+ graphic << " " << name2id[simplices[i][0]] << " -- " << name2id[simplices[i][1]] << " [weight=15];"
+ << std::endl;
+ ke++;
+ }
+ }
+ graphic << "}";
+ graphic.close();
+ std::cout << mapp << " file generated. It can be visualized with e.g. neato." << std::endl;
+ }
+
+ public: // Create a .txt file that can be compiled with KeplerMapper.
+ /** \brief Creates a .txt file called SC.txt describing the 1-skeleton, which can then be plotted with e.g.
+ * KeplerMapper.
+ */
+ void write_info() {
+ int num_simplices = simplices.size();
+ int num_edges = 0;
+ std::string mapp = point_cloud_name + "_sc.txt";
+ std::ofstream graphic(mapp);
+
+ for (int i = 0; i < num_simplices; i++)
+ if (simplices[i].size() == 2)
+ if (cover_color[simplices[i][0]].first > mask && cover_color[simplices[i][1]].first > mask) num_edges++;
+
+ graphic << point_cloud_name << std::endl;
+ graphic << cover_name << std::endl;
+ graphic << color_name << std::endl;
+ graphic << resolution_double << " " << gain << std::endl;
+ graphic << cover_color.size() << " " << num_edges << std::endl;
+
+ int id = 0;
+ for (std::map<int, std::pair<int, double> >::iterator iit = cover_color.begin(); iit != cover_color.end(); iit++) {
+ graphic << id << " " << iit->second.second << " " << iit->second.first << std::endl;
+ name2id[iit->first] = id;
+ name2idinv[id] = iit->first;
+ id++;
+ }
+
+ for (int i = 0; i < num_simplices; i++)
+ if (simplices[i].size() == 2)
+ if (cover_color[simplices[i][0]].first > mask && cover_color[simplices[i][1]].first > mask)
+ graphic << name2id[simplices[i][0]] << " " << name2id[simplices[i][1]] << std::endl;
+ graphic.close();
+ std::cout << mapp
+ << " generated. It can be visualized with e.g. python KeplerMapperVisuFromTxtFile.py and firefox."
+ << std::endl;
+ }
+
+ public: // Create a .off file that can be visualized (e.g. with Geomview).
+ /** \brief Creates a .off file called SC.off for 3D visualization, which contains the 2-skeleton of the GIC.
+ * This function assumes that the cover has been computed with Voronoi. If data points are in 1D or 2D,
+ * the remaining coordinates of the points embedded in 3D are set to 0.
+ */
+ void plot_OFF() {
+ assert(cover_name == "Voronoi");
+
+ int m = voronoi_subsamples.size();
+ int numedges = 0;
+ int numfaces = 0;
+ std::vector<std::vector<int> > edges, faces;
+ int numsimplices = simplices.size();
+
+ std::string mapp = point_cloud_name + "_sc.off";
+ std::ofstream graphic(mapp);
+
+ graphic << "OFF" << std::endl;
+ for (int i = 0; i < numsimplices; i++) {
+ if (simplices[i].size() == 2) {
+ numedges++;
+ edges.push_back(simplices[i]);
+ }
+ if (simplices[i].size() == 3) {
+ numfaces++;
+ faces.push_back(simplices[i]);
+ }
+ }
+ graphic << m << " " << numedges + numfaces << std::endl;
+ for (int i = 0; i < m; i++) {
+ if (data_dimension <= 3) {
+ for (int j = 0; j < data_dimension; j++) graphic << point_cloud[voronoi_subsamples[i]][j] << " ";
+ for (int j = data_dimension; j < 3; j++) graphic << 0 << " ";
+ graphic << std::endl;
+ } else {
+ for (int j = 0; j < 3; j++) graphic << point_cloud[voronoi_subsamples[i]][j] << " ";
+ }
+ }
+ for (int i = 0; i < numedges; i++) graphic << 2 << " " << edges[i][0] << " " << edges[i][1] << std::endl;
+ for (int i = 0; i < numfaces; i++)
+ graphic << 3 << " " << faces[i][0] << " " << faces[i][1] << " " << faces[i][2] << std::endl;
+ graphic.close();
+ std::cout << mapp << " generated. It can be visualized with e.g. geomview." << std::endl;
+ }
+
+ // *******************************************************************************************************************
+ // Extended Persistence Diagrams.
+ // *******************************************************************************************************************
+
+ public:
+ /** \brief Computes the extended persistence diagram of the complex.
+ *
+ */
+ void compute_PD() {
+ Simplex_tree st;
+
+ // Compute max and min
+ double maxf = std::numeric_limits<double>::lowest();
+ double minf = std::numeric_limits<double>::max();
+ for (std::map<int, double>::iterator it = cover_std.begin(); it != cover_std.end(); it++) {
+ maxf = std::max(maxf, it->second);
+ minf = std::min(minf, it->second);
+ }
+
+ for (auto const& simplex : simplices) {
+ // Add a simplex and a cone on it
+ std::vector<int> splx = simplex;
+ splx.push_back(-2);
+ st.insert_simplex_and_subfaces(splx);
+ }
+
+ // Build filtration
+ for (auto simplex : st.complex_simplex_range()) {
+ double filta = std::numeric_limits<double>::lowest();
+ double filts = filta;
+ bool ascending = true;
+ for (auto vertex : st.simplex_vertex_range(simplex)) {
+ if (vertex == -2) {
+ ascending = false;
+ continue;
+ }
+ filta = std::max(-2 + (cover_std[vertex] - minf) / (maxf - minf), filta);
+ filts = std::max(2 - (cover_std[vertex] - minf) / (maxf - minf), filts);
+ }
+ if (ascending)
+ st.assign_filtration(simplex, filta);
+ else
+ st.assign_filtration(simplex, filts);
+ }
+ int magic[] = {-2};
+ st.assign_filtration(st.find(magic), -3);
+
+ // Compute PD
+ st.initialize_filtration();
+ Gudhi::persistent_cohomology::Persistent_cohomology<Simplex_tree, Gudhi::persistent_cohomology::Field_Zp> pcoh(st);
+ pcoh.init_coefficients(2);
+ pcoh.compute_persistent_cohomology();
+
+ // Output PD
+ int max_dim = st.dimension();
+ for (int i = 0; i < max_dim; i++) {
+ std::vector<std::pair<double, double> > bars = pcoh.intervals_in_dimension(i);
+ int num_bars = bars.size();
+ if(verbose) std::cout << num_bars << " interval(s) in dimension " << i << ":" << std::endl;
+ for (int j = 0; j < num_bars; j++) {
+ double birth = bars[j].first;
+ double death = bars[j].second;
+ if (i == 0 && std::isinf(death)) continue;
+ if (birth < 0)
+ birth = minf + (birth + 2) * (maxf - minf);
+ else
+ birth = minf + (2 - birth) * (maxf - minf);
+ if (death < 0)
+ death = minf + (death + 2) * (maxf - minf);
+ else
+ death = minf + (2 - death) * (maxf - minf);
+ PD.push_back(std::pair<double, double>(birth, death));
+ if (verbose) std::cout << " [" << birth << ", " << death << "]" << std::endl;
+ }
+ }
+ }
+
+ public:
+ /** \brief Computes bootstrapped distances distribution.
+ *
+ * @param[in] N number of bootstrap iterations.
+ *
+ */
+ template <typename SimplicialComplex>
+ void compute_distribution(int N = 100) {
+ if (distribution.size() >= N) {
+ std::cout << "Already done!" << std::endl;
+ } else {
+ for (int i = 0; i < N - distribution.size(); i++) {
+ Cover_complex Cboot;
+ Cboot.n = this->n;
+ std::vector<int> boot(this->n);
+ for (int j = 0; j < this->n; j++) {
+ double u = GetUniform();
+ int id = std::floor(u * (this->n));
+ boot[j] = id;
+ Cboot.point_cloud[j] = this->point_cloud[id];
+ Cboot.func.emplace(j, this->func[id]);
+ }
+ for (int j = 0; j < n; j++) {
+ std::vector<double> dist(n);
+ for (int k = 0; k < n; k++) dist[k] = distances[boot[j]][boot[k]];
+ Cboot.distances.push_back(dist);
+ }
+
+ Cboot.set_graph_from_automatic_rips(Gudhi::Euclidean_distance());
+ Cboot.set_automatic_resolution();
+ Cboot.set_gain();
+ Cboot.set_cover_from_function();
+ Cboot.find_simplices();
+ Cboot.compute_PD();
+
+ distribution.push_back(Gudhi::persistence_diagram::bottleneck_distance(this->PD, Cboot.PD));
+ }
+
+ std::sort(distribution.begin(), distribution.end());
+ }
+ }
+
+ public:
+ /** \brief Computes the bottleneck distance threshold corresponding to a specific confidence level.
+ *
+ * @param[in] alpha Confidence level.
+ *
+ */
+ double compute_distance_from_confidence_level(double alpha) {
+ int N = distribution.size();
+ return distribution[std::floor(alpha * N)];
+ }
+
+ public:
+ /** \brief Computes the confidence level of a specific bottleneck distance threshold.
+ *
+ * @param[in] d Bottleneck distance.
+ *
+ */
+ double compute_confidence_level_from_distance(double d) {
+ int N = distribution.size();
+ for (int i = 0; i < N; i++)
+ if (distribution[i] > d) return i * 1.0 / N;
+ }
+
+ public:
+ /** \brief Computes the p-value, i.e. the opposite of the confidence level of the largest bottleneck
+ * distance preserving the points in the persistence diagram of the output simplicial complex.
+ *
+ */
+ double compute_p_value() {
+ double distancemin = -std::numeric_limits<double>::lowest();
+ int N = PD.size();
+ for (int i = 0; i < N; i++) distancemin = std::min(distancemin, 0.5 * (PD[i].second - PD[i].first));
+ return 1 - compute_confidence_level_from_distance(distancemin);
+ }
+
+ // *******************************************************************************************************************
+ // Computation of simplices.
+ // *******************************************************************************************************************
+
+ public:
+ /** \brief Creates the simplicial complex.
+ *
+ * @param[in] complex SimplicialComplex to be created.
+ *
+ */
+ template <typename SimplicialComplex>
+ void create_complex(SimplicialComplex& complex) {
+ unsigned int dimension = 0;
+ for (auto const& simplex : simplices) {
+ int numvert = simplex.size();
+ double filt = std::numeric_limits<double>::lowest();
+ for (int i = 0; i < numvert; i++) filt = std::max(cover_color[simplex[i]].second, filt);
+ complex.insert_simplex_and_subfaces(simplex, filt);
+ if (dimension < simplex.size() - 1) dimension = simplex.size() - 1;
+ }
+ }
+
+ public:
+ /** \brief Computes the simplices of the simplicial complex.
+ */
+ void find_simplices() {
+ if (type != "Nerve" && type != "GIC") {
+ std::cout << "Type of complex needs to be specified." << std::endl;
+ return;
+ }
+
+ if (type == "Nerve") {
+ for(auto& simplex : cover)
+ simplices.push_back(simplex.second);
+ std::sort(simplices.begin(), simplices.end());
+ std::vector<std::vector<int> >::iterator it = std::unique(simplices.begin(), simplices.end());
+ simplices.resize(std::distance(simplices.begin(), it));
+ }
+
+ if (type == "GIC") {
+ Index_map index = boost::get(boost::vertex_index, one_skeleton);
+
+ if (functional_cover) {
+ // Computes the simplices in the GIC by looking at all the edges of the graph and adding the
+ // corresponding edges in the GIC if the images of the endpoints belong to consecutive intervals.
+
+ if (gain >= 0.5)
+ throw std::invalid_argument(
+ "the output of this function is correct ONLY if the cover is minimal, i.e. the gain is less than 0.5.");
+
+ // Loop on all edges.
+ boost::graph_traits<Graph>::edge_iterator ei, ei_end;
+ for (boost::tie(ei, ei_end) = boost::edges(one_skeleton); ei != ei_end; ++ei) {
+ int nums = cover[index[boost::source(*ei, one_skeleton)]].size();
+ for (int i = 0; i < nums; i++) {
+ int vs = cover[index[boost::source(*ei, one_skeleton)]][i];
+ int numt = cover[index[boost::target(*ei, one_skeleton)]].size();
+ for (int j = 0; j < numt; j++) {
+ int vt = cover[index[boost::target(*ei, one_skeleton)]][j];
+ if (cover_fct[vs] == cover_fct[vt] + 1 || cover_fct[vt] == cover_fct[vs] + 1) {
+ std::vector<int> edge(2);
+ edge[0] = std::min(vs, vt);
+ edge[1] = std::max(vs, vt);
+ simplices.push_back(edge);
+ goto afterLoop;
+ }
+ }
+ }
+ afterLoop:;
+ }
+ std::sort(simplices.begin(), simplices.end());
+ std::vector<std::vector<int> >::iterator it = std::unique(simplices.begin(), simplices.end());
+ simplices.resize(std::distance(simplices.begin(), it));
+
+ } else {
+ // Find edges to keep
+ Simplex_tree st;
+ boost::graph_traits<Graph>::edge_iterator ei, ei_end;
+ for (boost::tie(ei, ei_end) = boost::edges(one_skeleton); ei != ei_end; ++ei)
+ if (!(cover[index[boost::target(*ei, one_skeleton)]].size() == 1 &&
+ cover[index[boost::target(*ei, one_skeleton)]] == cover[index[boost::source(*ei, one_skeleton)]])) {
+ std::vector<int> edge(2);
+ edge[0] = index[boost::source(*ei, one_skeleton)];
+ edge[1] = index[boost::target(*ei, one_skeleton)];
+ st.insert_simplex_and_subfaces(edge);
+ }
+
+ // st.insert_graph(one_skeleton);
+
+ // Build the Simplex Tree corresponding to the graph
+ st.expansion(maximal_dim);
+
+ // Find simplices of GIC
+ simplices.clear();
+ for (auto simplex : st.complex_simplex_range()) {
+ if (!st.has_children(simplex)) {
+ std::vector<int> simplx;
+ for (auto vertex : st.simplex_vertex_range(simplex)) {
+ unsigned int sz = cover[vertex].size();
+ for (unsigned int i = 0; i < sz; i++) {
+ simplx.push_back(cover[vertex][i]);
+ }
+ }
+ std::sort(simplx.begin(), simplx.end());
+ std::vector<int>::iterator it = std::unique(simplx.begin(), simplx.end());
+ simplx.resize(std::distance(simplx.begin(), it));
+ simplices.push_back(simplx);
+ }
+ }
+ std::sort(simplices.begin(), simplices.end());
+ std::vector<std::vector<int> >::iterator it = std::unique(simplices.begin(), simplices.end());
+ simplices.resize(std::distance(simplices.begin(), it));
+ }
+ }
+ }
+};
+
+} // namespace cover_complex
+
+} // namespace Gudhi
+
+#endif // GIC_H_
diff --git a/include/gudhi/Kd_tree_search.h b/include/gudhi/Kd_tree_search.h
index ef428002..96bbeb36 100644
--- a/include/gudhi/Kd_tree_search.h
+++ b/include/gudhi/Kd_tree_search.h
@@ -271,8 +271,7 @@ class Kd_tree_search {
m_tree.search(it, Fuzzy_sphere(p, radius, eps, m_tree.traits()));
}
- int tree_depth() const
- {
+ int tree_depth() const {
return m_tree.root()->depth();
}
diff --git a/include/gudhi/Neighbors_finder.h b/include/gudhi/Neighbors_finder.h
index a6b9b021..87c7cee5 100644
--- a/include/gudhi/Neighbors_finder.h
+++ b/include/gudhi/Neighbors_finder.h
@@ -32,6 +32,7 @@
#include <unordered_set>
#include <vector>
+#include <algorithm> // for std::max
namespace Gudhi {
@@ -44,7 +45,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/include/gudhi/PSSK.h b/include/gudhi/PSSK.h
new file mode 100644
index 00000000..630f5623
--- /dev/null
+++ b/include/gudhi/PSSK.h
@@ -0,0 +1,168 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef PSSK_H_
+#define PSSK_H_
+
+// gudhi include
+#include <gudhi/Persistence_heat_maps.h>
+
+#include <limits>
+#include <utility>
+#include <vector>
+
+namespace Gudhi {
+namespace Persistence_representations {
+
+/**
+* This is a version of a representation presented in https://arxiv.org/abs/1412.6821
+* In that paper the authors are using the representation just to compute kernel. Over here, we extend the usability by
+*far.
+* Note that the version presented here is not exact, since we are discretizing the kernel.
+* The only difference with respect to the original class is the method of creation. We have full (square) image, and for
+*every point (p,q), we add a kernel at (p,q) and the negative kernel
+* at (q,p)
+**/
+
+class PSSK : public Persistence_heat_maps<constant_scaling_function> {
+ public:
+ PSSK() : Persistence_heat_maps() {}
+
+ PSSK(const std::vector<std::pair<double, double> >& interval,
+ std::vector<std::vector<double> > filter = create_Gaussian_filter(5, 1), size_t number_of_pixels = 1000,
+ double min_ = -1, double max_ = -1)
+ : Persistence_heat_maps() {
+ this->construct(interval, filter, number_of_pixels, min_, max_);
+ }
+
+ PSSK(const char* filename, std::vector<std::vector<double> > filter = create_Gaussian_filter(5, 1),
+ size_t number_of_pixels = 1000, double min_ = -1, double max_ = -1,
+ unsigned dimension = std::numeric_limits<unsigned>::max())
+ : Persistence_heat_maps() {
+ std::vector<std::pair<double, double> > intervals_;
+ if (dimension == std::numeric_limits<unsigned>::max()) {
+ intervals_ = read_persistence_intervals_in_one_dimension_from_file(filename);
+ } else {
+ intervals_ = read_persistence_intervals_in_one_dimension_from_file(filename, dimension);
+ }
+ this->construct(intervals_, filter, number_of_pixels, min_, max_);
+ }
+
+ protected:
+ void construct(const std::vector<std::pair<double, double> >& intervals_,
+ std::vector<std::vector<double> > filter = create_Gaussian_filter(5, 1),
+ size_t number_of_pixels = 1000, double min_ = -1, double max_ = -1);
+};
+
+// if min_ == max_, then the program is requested to set up the values itself based on persistence intervals
+void PSSK::construct(const std::vector<std::pair<double, double> >& intervals_,
+ std::vector<std::vector<double> > filter, size_t number_of_pixels, double min_, double max_) {
+ bool dbg = false;
+ if (dbg) {
+ std::cerr << "Entering construct procedure \n";
+ getchar();
+ }
+
+ if (min_ == max_) {
+ // in this case, we want the program to set up the min_ and max_ values by itself.
+ min_ = std::numeric_limits<int>::max();
+ max_ = -std::numeric_limits<int>::max();
+
+ for (size_t i = 0; i != intervals_.size(); ++i) {
+ if (intervals_[i].first < min_) min_ = intervals_[i].first;
+ if (intervals_[i].second > max_) max_ = intervals_[i].second;
+ }
+ // now we have the structure filled in, and moreover we know min_ and max_ values of the interval, so we know the
+ // range.
+
+ // add some more space:
+ min_ -= fabs(max_ - min_) / 100;
+ max_ += fabs(max_ - min_) / 100;
+ }
+
+ if (dbg) {
+ std::cerr << "min_ : " << min_ << std::endl;
+ std::cerr << "max_ : " << max_ << std::endl;
+ std::cerr << "number_of_pixels : " << number_of_pixels << std::endl;
+ getchar();
+ }
+
+ this->min_ = min_;
+ this->max_ = max_;
+
+ // initialization of the structure heat_map
+ std::vector<std::vector<double> > heat_map_;
+ for (size_t i = 0; i != number_of_pixels; ++i) {
+ std::vector<double> v(number_of_pixels, 0);
+ heat_map_.push_back(v);
+ }
+ this->heat_map = heat_map_;
+
+ if (dbg) std::cerr << "Done creating of the heat map, now we will fill in the structure \n";
+
+ 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);
+
+ if (dbg) {
+ std::cerr << "point : " << intervals_[pt_nr].first << " , " << intervals_[pt_nr].second << std::endl;
+ std::cerr << "x_grid : " << x_grid << std::endl;
+ std::cerr << "y_grid : " << y_grid << std::endl;
+ }
+
+ // x_grid and y_grid gives a center of the kernel. We want to have its lower left corner. To get this, we need to
+ // shift x_grid and y_grid by a grid diameter.
+ x_grid -= filter.size() / 2;
+ y_grid -= filter.size() / 2;
+ // note that the numbers x_grid and y_grid may be negative.
+
+ if (dbg) {
+ std::cerr << "After shift : \n";
+ std::cerr << "x_grid : " << x_grid << std::endl;
+ std::cerr << "y_grid : " << y_grid << std::endl;
+ std::cerr << "filter.size() : " << filter.size() << std::endl;
+ getchar();
+ }
+
+ for (size_t i = 0; i != filter.size(); ++i) {
+ for (size_t j = 0; j != filter.size(); ++j) {
+ // if the point (x_grid+i,y_grid+j) is the correct point in the grid.
+ if (((x_grid + i) >= 0) && (x_grid + i < this->heat_map.size()) && ((y_grid + j) >= 0) &&
+ (y_grid + j < this->heat_map.size())) {
+ if (dbg) {
+ std::cerr << y_grid + j << " " << x_grid + i << std::endl;
+ }
+ this->heat_map[y_grid + j][x_grid + i] += filter[i][j];
+ this->heat_map[x_grid + i][y_grid + j] += -filter[i][j];
+ }
+ }
+ }
+ }
+} // construct
+
+} // namespace Persistence_representations
+} // namespace Gudhi
+
+#endif // PSSK_H_
diff --git a/include/gudhi/Persistence_heat_maps.h b/include/gudhi/Persistence_heat_maps.h
new file mode 100644
index 00000000..a80c3c40
--- /dev/null
+++ b/include/gudhi/Persistence_heat_maps.h
@@ -0,0 +1,919 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef PERSISTENCE_HEAT_MAPS_H_
+#define PERSISTENCE_HEAT_MAPS_H_
+
+// gudhi include
+#include <gudhi/read_persistence_from_file.h>
+#include <gudhi/common_persistence_representations.h>
+
+// standard include
+#include <vector>
+#include <sstream>
+#include <iostream>
+#include <cmath>
+#include <limits>
+#include <algorithm>
+#include <utility>
+#include <string>
+#include <functional>
+
+namespace Gudhi {
+namespace Persistence_representations {
+
+/**
+ * This is a simple procedure to create n by n (or 2*pixel_radius times 2*pixel_radius cubical approximation of a
+ *Gaussian kernel.
+**/
+std::vector<std::vector<double> > create_Gaussian_filter(size_t pixel_radius, double sigma) {
+ bool dbg = false;
+ // we are computing the kernel mask to 2 standard deviations away from the center. We discretize it in a grid of a
+ // size 2*pixel_radius times 2*pixel_radius.
+
+ double r = 0;
+ double sigma_sqr = sigma * sigma;
+
+ // sum is for normalization
+ double sum = 0;
+
+ // initialization of a kernel:
+ std::vector<std::vector<double> > kernel(2 * pixel_radius + 1);
+ for (size_t i = 0; i != kernel.size(); ++i) {
+ std::vector<double> v(2 * pixel_radius + 1, 0);
+ kernel[i] = v;
+ }
+
+ if (dbg) {
+ std::cerr << "Kernel initialize \n";
+ std::cerr << "pixel_radius : " << pixel_radius << std::endl;
+ std::cerr << "kernel.size() : " << kernel.size() << std::endl;
+ getchar();
+ }
+
+ for (int x = -pixel_radius; x <= static_cast<int>(pixel_radius); x++) {
+ for (int y = -pixel_radius; y <= static_cast<int>(pixel_radius); y++) {
+ double real_x = 2 * sigma * x / pixel_radius;
+ double real_y = 2 * sigma * y / pixel_radius;
+ r = sqrt(real_x * real_x + real_y * real_y);
+ kernel[x + pixel_radius][y + pixel_radius] = (exp(-(r * r) / sigma_sqr)) / (3.141592 * sigma_sqr);
+ sum += kernel[x + pixel_radius][y + pixel_radius];
+ }
+ }
+
+ // normalize the kernel
+ for (size_t i = 0; i != kernel.size(); ++i) {
+ for (size_t j = 0; j != kernel[i].size(); ++j) {
+ kernel[i][j] /= sum;
+ }
+ }
+
+ if (dbg) {
+ std::cerr << "Here is the kernel : \n";
+ for (size_t i = 0; i != kernel.size(); ++i) {
+ for (size_t j = 0; j != kernel[i].size(); ++j) {
+ std::cerr << kernel[i][j] << " ";
+ }
+ std::cerr << std::endl;
+ }
+ }
+ return kernel;
+}
+
+/*
+* There are various options to scale the points depending on their location. One can for instance:
+* (1) do nothing (scale all of them with the weight 1), as in the function constant_function
+* (2) Scale them by the distance to the diagonal. This is implemented in function
+* (3) Scale them with the square of their distance to diagonal. This is implemented in function
+* (4) Scale them with
+*/
+
+/**
+ * This is one of a scaling functions used to weight points depending on their persistence and/or location in the
+ *diagram.
+ * This particular functionality is a function which always assign value 1 to a point in the diagram.
+**/
+class constant_scaling_function {
+ public:
+ double operator()(const std::pair<double, double>& point_in_diagram) { return 1; }
+};
+
+/**
+ * This is one of a scaling functions used to weight points depending on their persistence and/or location in the
+ *diagram.
+ * The scaling given by this function to a point (b,d) is Euclidean distance of (b,d) from diagonal.
+**/
+class distance_from_diagonal_scaling {
+ public:
+ double operator()(const std::pair<double, double>& point_in_diagram) {
+ // (point_in_diagram.first+point_in_diagram.second)/2.0
+ return sqrt(pow((point_in_diagram.first - (point_in_diagram.first + point_in_diagram.second) / 2.0), 2) +
+ pow((point_in_diagram.second - (point_in_diagram.first + point_in_diagram.second) / 2.0), 2));
+ }
+};
+
+/**
+ * This is one of a scaling functions used to weight points depending on their persistence and/or location in the
+ *diagram.
+ * The scaling given by this function to a point (b,d) is a square of Euclidean distance of (b,d) from diagonal.
+**/
+class squared_distance_from_diagonal_scaling {
+ public:
+ double operator()(const std::pair<double, double>& point_in_diagram) {
+ return pow((point_in_diagram.first - (point_in_diagram.first + point_in_diagram.second) / 2.0), 2) +
+ pow((point_in_diagram.second - (point_in_diagram.first + point_in_diagram.second) / 2.0), 2);
+ }
+};
+
+/**
+ * This is one of a scaling functions used to weight points depending on their persistence and/or location in the
+ *diagram.
+ * The scaling given by this function to a point (b,d) is an arctan of a persistence of a point (i.e. arctan( b-d ).
+**/
+class arc_tan_of_persistence_of_point {
+ public:
+ double operator()(const std::pair<double, double>& point_in_diagram) {
+ return atan(point_in_diagram.second - point_in_diagram.first);
+ }
+};
+
+/**
+ * This is one of a scaling functions used to weight points depending on their persistence and/or location in the
+ *diagram.
+ * This scaling function do not only depend on a point (p,d) in the diagram, but it depends on the whole diagram.
+ * The longest persistence pair get a scaling 1. Any other pair get a scaling belong to [0,1], which is proportional
+ * to the persistence of that pair.
+**/
+class weight_by_setting_maximal_interval_to_have_length_one {
+ public:
+ weight_by_setting_maximal_interval_to_have_length_one(double len) : letngth_of_maximal_interval(len) {}
+ double operator()(const std::pair<double, double>& point_in_diagram) {
+ return (point_in_diagram.second - point_in_diagram.first) / this->letngth_of_maximal_interval;
+ }
+
+ private:
+ double letngth_of_maximal_interval;
+};
+
+/**
+ * \class Persistence_heat_maps Persistence_heat_maps.h gudhi/Persistence_heat_maps.h
+ * \brief A class implementing persistence heat maps.
+ *
+ * \ingroup Persistence_representations
+**/
+
+// This class implements the following concepts: Vectorized_topological_data, Topological_data_with_distances,
+// Real_valued_topological_data, Topological_data_with_averages, Topological_data_with_scalar_product
+template <typename Scalling_of_kernels = constant_scaling_function>
+class Persistence_heat_maps {
+ public:
+ /**
+ * The default constructor. A scaling function from the diagonal is set up to a constant function. The image is not
+ *erased below the diagonal. The Gaussian have diameter 5.
+ **/
+ Persistence_heat_maps() {
+ Scalling_of_kernels f;
+ this->f = f;
+ this->erase_below_diagonal = false;
+ this->min_ = this->max_ = 0;
+ this->set_up_parameters_for_basic_classes();
+ }
+
+ /**
+ * Construction that takes at the input the following parameters:
+ * (1) A vector of pairs of doubles (representing persistence intervals). All other parameters are optional. They are:
+ * (2) a Gaussian filter generated by create_Gaussian_filter filter (the default value of this variable is a Gaussian
+ *filter of a radius 5),
+ * (3) a boolean value which determines if the area of image below diagonal should, or should not be erased (it will
+ *be erased by default).
+ * (4) a number of pixels in each direction (set to 1000 by default).
+ * (5) a min x and y value of points that are to be taken into account. By default it is set to
+ *std::numeric_limits<double>::max(), in which case the program compute the values based on the data,
+ * (6) a max x and y value of points that are to be taken into account. By default it is set to
+ *std::numeric_limits<double>::max(), in which case the program compute the values based on the data.
+ **/
+ Persistence_heat_maps(const std::vector<std::pair<double, double> >& interval,
+ std::vector<std::vector<double> > filter = create_Gaussian_filter(5, 1),
+ bool erase_below_diagonal = false, size_t number_of_pixels = 1000,
+ double min_ = std::numeric_limits<double>::max(),
+ double max_ = std::numeric_limits<double>::max());
+
+ /**
+ * Construction that takes at the input a name of a file with persistence intervals, a filter (radius 5 by
+ *default), a scaling function (constant by default), a boolean value which determines if the area of image below
+ *diagonal should, or should not be erased (should by default). The next parameter is the number of pixels in each
+ *direction (set to 1000 by default) and min and max values of images (both set to std::numeric_limits<double>::max()
+ *by default. If this is the case, the program will pick the right values based on the data).
+ **/
+ /**
+ * Construction that takes at the input the following parameters:
+ * (1) A name of a file with persistence intervals. The file should be readable by the function
+ *read_persistence_intervals_in_one_dimension_from_file. All other parameters are optional. They are:
+ * (2) a Gaussian filter generated by create_Gaussian_filter filter (the default value of this variable is a Gaussian
+ *filter of a radius 5),
+ * (3) a boolean value which determines if the area of image below diagonal should, or should not be erased (it will
+ *be erased by default).
+ * (4) a number of pixels in each direction (set to 1000 by default).
+ * (5) a min x and y value of points that are to be taken into account. By default it is set to
+ *std::numeric_limits<double>::max(), in which case the program compute the values based on the data,
+ * (6) a max x and y value of points that are to be taken into account. By default it is set to
+ *std::numeric_limits<double>::max(), in which case the program compute the values based on the data.
+ **/
+ Persistence_heat_maps(const char* filename, std::vector<std::vector<double> > filter = create_Gaussian_filter(5, 1),
+ bool erase_below_diagonal = false, size_t number_of_pixels = 1000,
+ double min_ = std::numeric_limits<double>::max(),
+ double max_ = std::numeric_limits<double>::max(),
+ unsigned dimension = std::numeric_limits<unsigned>::max());
+
+ /**
+ * Compute a mean value of a collection of heat maps and store it in the current object. Note that all the persistence
+ *maps send in a vector to this procedure need to have the same parameters.
+ * If this is not the case, the program will throw an exception.
+ **/
+ void compute_mean(const std::vector<Persistence_heat_maps*>& maps);
+
+ /**
+ * Compute a median value of a collection of heat maps and store it in the current object. Note that all the
+ *persistence maps send in a vector to this procedure need to have the same parameters.
+ * If this is not the case, the program will throw an exception.
+ **/
+ void compute_median(const std::vector<Persistence_heat_maps*>& maps);
+
+ /**
+ * Compute a percentage of active (i.e) values above the cutoff of a collection of heat maps.
+ **/
+ void compute_percentage_of_active(const std::vector<Persistence_heat_maps*>& maps, size_t cutoff = 1);
+
+ // put to file subroutine
+ /**
+ * The function outputs the persistence image to a text file. The format as follow:
+ * In the first line, the values min and max of the image are stored
+ * In the next lines, we have the persistence images in a form of a bitmap image.
+ **/
+ void print_to_file(const char* filename) const;
+
+ /**
+ * A function that load a heat map from file to the current object (and erase whatever was stored in the current
+ *object before).
+ **/
+ void load_from_file(const char* filename);
+
+ /**
+ * The procedure checks if min_, max_ and this->heat_maps sizes are the same.
+ **/
+ inline bool check_if_the_same(const Persistence_heat_maps& second) const {
+ bool dbg = false;
+ if (this->heat_map.size() != second.heat_map.size()) {
+ if (dbg)
+ std::cerr << "this->heat_map.size() : " << this->heat_map.size()
+ << " \n second.heat_map.size() : " << second.heat_map.size() << std::endl;
+ return false;
+ }
+ if (this->min_ != second.min_) {
+ if (dbg) std::cerr << "this->min_ : " << this->min_ << ", second.min_ : " << second.min_ << std::endl;
+ return false;
+ }
+ if (this->max_ != second.max_) {
+ if (dbg) std::cerr << "this->max_ : " << this->max_ << ", second.max_ : " << second.max_ << std::endl;
+ return false;
+ }
+ // in the other case we may assume that the persistence images are defined on the same domain.
+ return true;
+ }
+
+ /**
+ * Return minimal range value of persistent image.
+ **/
+ inline double get_min() const { return this->min_; }
+
+ /**
+ * Return maximal range value of persistent image.
+ **/
+ inline double get_max() const { return this->max_; }
+
+ /**
+ * Operator == to check if to persistence heat maps are the same.
+ **/
+ bool operator==(const Persistence_heat_maps& rhs) const {
+ bool dbg = false;
+ if (!this->check_if_the_same(rhs)) {
+ if (dbg) std::cerr << "The domains are not the same \n";
+ return false; // in this case, the domains are not the same, so the maps cannot be the same.
+ }
+ for (size_t i = 0; i != this->heat_map.size(); ++i) {
+ for (size_t j = 0; j != this->heat_map[i].size(); ++j) {
+ if (!almost_equal(this->heat_map[i][j], rhs.heat_map[i][j])) {
+ if (dbg) {
+ std::cerr << "this->heat_map[" << i << "][" << j << "] = " << this->heat_map[i][j] << std::endl;
+ std::cerr << "rhs.heat_map[" << i << "][" << j << "] = " << rhs.heat_map[i][j] << std::endl;
+ }
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Operator != to check if to persistence heat maps are different.
+ **/
+ bool operator!=(const Persistence_heat_maps& rhs) const { return !((*this) == rhs); }
+
+ /**
+ * A function to generate a gnuplot script to visualize the persistent image.
+ **/
+ void plot(const char* filename) const;
+
+ template <typename Operation_type>
+ friend Persistence_heat_maps operation_on_pair_of_heat_maps(const Persistence_heat_maps& first,
+ const Persistence_heat_maps& second,
+ Operation_type operation) {
+ // first check if the heat maps are compatible
+ if (!first.check_if_the_same(second)) {
+ std::cerr << "Sizes of the heat maps are not compatible. The program will now terminate \n";
+ throw "Sizes of the heat maps are not compatible. The program will now terminate \n";
+ }
+ Persistence_heat_maps result;
+ result.min_ = first.min_;
+ result.max_ = first.max_;
+ result.heat_map.reserve(first.heat_map.size());
+ for (size_t i = 0; i != first.heat_map.size(); ++i) {
+ std::vector<double> v;
+ v.reserve(first.heat_map[i].size());
+ for (size_t j = 0; j != first.heat_map[i].size(); ++j) {
+ v.push_back(operation(first.heat_map[i][j], second.heat_map[i][j]));
+ }
+ result.heat_map.push_back(v);
+ }
+ return result;
+ } // operation_on_pair_of_heat_maps
+
+ /**
+ * Multiplication of Persistence_heat_maps by scalar (so that all values of the heat map gets multiplied by that
+ *scalar).
+ **/
+ Persistence_heat_maps multiply_by_scalar(double scalar) const {
+ Persistence_heat_maps result;
+ result.min_ = this->min_;
+ result.max_ = this->max_;
+ result.heat_map.reserve(this->heat_map.size());
+ for (size_t i = 0; i != this->heat_map.size(); ++i) {
+ std::vector<double> v;
+ v.reserve(this->heat_map[i].size());
+ for (size_t j = 0; j != this->heat_map[i].size(); ++j) {
+ v.push_back(this->heat_map[i][j] * scalar);
+ }
+ result.heat_map.push_back(v);
+ }
+ return result;
+ }
+
+ /**
+ * This function computes a sum of two objects of a type Persistence_heat_maps.
+ **/
+ friend Persistence_heat_maps operator+(const Persistence_heat_maps& first, const Persistence_heat_maps& second) {
+ return operation_on_pair_of_heat_maps(first, second, std::plus<double>());
+ }
+ /**
+* This function computes a difference of two objects of a type Persistence_heat_maps.
+**/
+ friend Persistence_heat_maps operator-(const Persistence_heat_maps& first, const Persistence_heat_maps& second) {
+ return operation_on_pair_of_heat_maps(first, second, std::minus<double>());
+ }
+ /**
+* This function computes a product of an object of a type Persistence_heat_maps with real number.
+**/
+ friend Persistence_heat_maps operator*(double scalar, const Persistence_heat_maps& A) {
+ return A.multiply_by_scalar(scalar);
+ }
+ /**
+* This function computes a product of an object of a type Persistence_heat_maps with real number.
+**/
+ friend Persistence_heat_maps operator*(const Persistence_heat_maps& A, double scalar) {
+ return A.multiply_by_scalar(scalar);
+ }
+ /**
+* This function computes a product of an object of a type Persistence_heat_maps with real number.
+**/
+ Persistence_heat_maps operator*(double scalar) { return this->multiply_by_scalar(scalar); }
+ /**
+ * += operator for Persistence_heat_maps.
+ **/
+ Persistence_heat_maps operator+=(const Persistence_heat_maps& rhs) {
+ *this = *this + rhs;
+ return *this;
+ }
+ /**
+ * -= operator for Persistence_heat_maps.
+ **/
+ Persistence_heat_maps operator-=(const Persistence_heat_maps& rhs) {
+ *this = *this - rhs;
+ return *this;
+ }
+ /**
+ * *= operator for Persistence_heat_maps.
+ **/
+ Persistence_heat_maps operator*=(double x) {
+ *this = *this * x;
+ return *this;
+ }
+ /**
+ * /= operator for Persistence_heat_maps.
+ **/
+ Persistence_heat_maps operator/=(double x) {
+ if (x == 0) throw("In operator /=, division by 0. Program terminated.");
+ *this = *this * (1 / x);
+ return *this;
+ }
+
+ // Implementations of functions for various concepts.
+
+ /**
+ * This function produce a vector of doubles based on a persistence heat map. It is required in a concept
+ * Vectorized_topological_data
+ */
+ std::vector<double> vectorize(int number_of_function) const;
+ /**
+ * This function return the number of functions that allows vectorization of persistence heat map. It is required
+ *in a concept Vectorized_topological_data.
+ **/
+ size_t number_of_vectorize_functions() const { return this->number_of_functions_for_vectorization; }
+
+ /**
+ * This function is required by the Real_valued_topological_data concept. It returns various projections on the
+ *persistence heat map to a real line.
+ * At the moment this function is not tested, since it is quite likely to be changed in the future. Given this, when
+ *using it, keep in mind that it
+ * will be most likely changed in the next versions.
+ **/
+ double project_to_R(int number_of_function) const;
+ /**
+ * The function gives the number of possible projections to R. This function is required by the
+ *Real_valued_topological_data concept.
+ **/
+ size_t number_of_projections_to_R() const { return this->number_of_functions_for_projections_to_reals; }
+
+ /**
+ * A function to compute distance between persistence heat maps.
+ * The parameter of this function is a const reference to an object of a class Persistence_heat_maps.
+ * This function is required in Topological_data_with_distances concept.
+* For max norm distance, set power to std::numeric_limits<double>::max()
+ **/
+ double distance(const Persistence_heat_maps& second_, double power = 1) const;
+
+ /**
+ * A function to compute averaged persistence heat map, based on vector of persistence heat maps.
+ * This function is required by Topological_data_with_averages concept.
+ **/
+ void compute_average(const std::vector<Persistence_heat_maps*>& to_average);
+
+ /**
+ * A function to compute scalar product of persistence heat maps.
+ * The parameter of this function is a const reference to an object of a class Persistence_heat_maps.
+ * This function is required in Topological_data_with_scalar_product concept.
+ **/
+ double compute_scalar_product(const Persistence_heat_maps& second_) const;
+
+ // end of implementation of functions needed for concepts.
+
+ /**
+ * The x-range of the persistence heat map.
+ **/
+ std::pair<double, double> get_x_range() const { return std::make_pair(this->min_, this->max_); }
+
+ /**
+ * The y-range of the persistence heat map.
+ **/
+ std::pair<double, double> get_y_range() const { return this->get_x_range(); }
+
+ protected:
+ // private methods
+ std::vector<std::vector<double> > check_and_initialize_maps(const std::vector<Persistence_heat_maps*>& maps);
+ size_t number_of_functions_for_vectorization;
+ size_t number_of_functions_for_projections_to_reals;
+ void construct(const std::vector<std::pair<double, double> >& intervals_,
+ std::vector<std::vector<double> > filter = create_Gaussian_filter(5, 1),
+
+ bool erase_below_diagonal = false, size_t number_of_pixels = 1000,
+ double min_ = std::numeric_limits<double>::max(), double max_ = std::numeric_limits<double>::max());
+
+ void set_up_parameters_for_basic_classes() {
+ this->number_of_functions_for_vectorization = 1;
+ this->number_of_functions_for_projections_to_reals = 1;
+ }
+
+ // data
+ Scalling_of_kernels f;
+ bool erase_below_diagonal;
+ double min_;
+ double max_;
+ std::vector<std::vector<double> > heat_map;
+};
+
+// if min_ == max_, then the program is requested to set up the values itself based on persistence intervals
+template <typename Scalling_of_kernels>
+void Persistence_heat_maps<Scalling_of_kernels>::construct(const std::vector<std::pair<double, double> >& intervals_,
+ std::vector<std::vector<double> > filter,
+ bool erase_below_diagonal, size_t number_of_pixels,
+ double min_, double max_) {
+ bool dbg = false;
+ if (dbg) std::cerr << "Entering construct procedure \n";
+ Scalling_of_kernels f;
+ this->f = f;
+
+ if (dbg) std::cerr << "min and max passed to construct() procedure: " << min_ << " " << max_ << std::endl;
+
+ if (min_ == max_) {
+ if (dbg) std::cerr << "min and max parameters will be determined based on intervals \n";
+ // in this case, we want the program to set up the min_ and max_ values by itself.
+ min_ = std::numeric_limits<int>::max();
+ max_ = -std::numeric_limits<int>::max();
+
+ for (size_t i = 0; i != intervals_.size(); ++i) {
+ if (intervals_[i].first < min_) min_ = intervals_[i].first;
+ if (intervals_[i].second > max_) max_ = intervals_[i].second;
+ }
+ // now we have the structure filled in, and moreover we know min_ and max_ values of the interval, so we know the
+ // range.
+
+ // add some more space:
+ min_ -= fabs(max_ - min_) / 100;
+ max_ += fabs(max_ - min_) / 100;
+ }
+
+ if (dbg) {
+ std::cerr << "min_ : " << min_ << std::endl;
+ std::cerr << "max_ : " << max_ << std::endl;
+ std::cerr << "number_of_pixels : " << number_of_pixels << std::endl;
+ getchar();
+ }
+
+ this->min_ = min_;
+ this->max_ = max_;
+
+ // initialization of the structure heat_map
+ std::vector<std::vector<double> > heat_map_;
+ for (size_t i = 0; i != number_of_pixels; ++i) {
+ std::vector<double> v(number_of_pixels, 0);
+ heat_map_.push_back(v);
+ }
+ this->heat_map = heat_map_;
+
+ if (dbg) std::cerr << "Done creating of the heat map, now we will fill in the structure \n";
+
+ 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);
+
+ if (dbg) {
+ std::cerr << "point : " << intervals_[pt_nr].first << " , " << intervals_[pt_nr].second << std::endl;
+ std::cerr << "x_grid : " << x_grid << std::endl;
+ std::cerr << "y_grid : " << y_grid << std::endl;
+ }
+
+ // x_grid and y_grid gives a center of the kernel. We want to have its lower left corner. To get this, we need to
+ // shift x_grid and y_grid by a grid diameter.
+ x_grid -= filter.size() / 2;
+ y_grid -= filter.size() / 2;
+ // note that the numbers x_grid and y_grid may be negative.
+
+ if (dbg) {
+ std::cerr << "After shift : \n";
+ std::cerr << "x_grid : " << x_grid << std::endl;
+ std::cerr << "y_grid : " << y_grid << std::endl;
+ }
+
+ double scaling_value = this->f(intervals_[pt_nr]);
+
+ for (size_t i = 0; i != filter.size(); ++i) {
+ for (size_t j = 0; j != filter.size(); ++j) {
+ // if the point (x_grid+i,y_grid+j) is the correct point in the grid.
+ if (((x_grid + i) >= 0) && (x_grid + i < this->heat_map.size()) && ((y_grid + j) >= 0) &&
+ (y_grid + j < this->heat_map.size())) {
+ if (dbg) {
+ std::cerr << y_grid + j << " " << x_grid + i << std::endl;
+ }
+ this->heat_map[y_grid + j][x_grid + i] += scaling_value * filter[i][j];
+ if (dbg) {
+ std::cerr << "Position : (" << x_grid + i << "," << y_grid + j
+ << ") got increased by the value : " << filter[i][j] << std::endl;
+ }
+ }
+ }
+ }
+ }
+
+ // now it remains to cut everything below diagonal if the user wants us to.
+ if (erase_below_diagonal) {
+ for (size_t i = 0; i != this->heat_map.size(); ++i) {
+ for (size_t j = i; j != this->heat_map.size(); ++j) {
+ this->heat_map[i][j] = 0;
+ }
+ }
+ }
+} // construct
+
+template <typename Scalling_of_kernels>
+Persistence_heat_maps<Scalling_of_kernels>::Persistence_heat_maps(
+ const std::vector<std::pair<double, double> >& interval, std::vector<std::vector<double> > filter,
+ bool erase_below_diagonal, size_t number_of_pixels, double min_, double max_) {
+ this->construct(interval, filter, erase_below_diagonal, number_of_pixels, min_, max_);
+ this->set_up_parameters_for_basic_classes();
+}
+
+template <typename Scalling_of_kernels>
+Persistence_heat_maps<Scalling_of_kernels>::Persistence_heat_maps(const char* filename,
+ std::vector<std::vector<double> > filter,
+ bool erase_below_diagonal, size_t number_of_pixels,
+ double min_, double max_, unsigned dimension) {
+ std::vector<std::pair<double, double> > intervals_;
+ if (dimension == std::numeric_limits<unsigned>::max()) {
+ intervals_ = read_persistence_intervals_in_one_dimension_from_file(filename);
+ } else {
+ intervals_ = read_persistence_intervals_in_one_dimension_from_file(filename, dimension);
+ }
+ this->construct(intervals_, filter, erase_below_diagonal, number_of_pixels, min_, max_);
+ this->set_up_parameters_for_basic_classes();
+}
+
+template <typename Scalling_of_kernels>
+std::vector<std::vector<double> > Persistence_heat_maps<Scalling_of_kernels>::check_and_initialize_maps(
+ const std::vector<Persistence_heat_maps*>& maps) {
+ // checking if all the heat maps are of the same size:
+ for (size_t i = 0; i != maps.size(); ++i) {
+ if (maps[i]->heat_map.size() != maps[0]->heat_map.size()) {
+ std::cerr << "Sizes of Persistence_heat_maps are not compatible. The program will terminate now \n";
+ throw "Sizes of Persistence_heat_maps are not compatible. The program will terminate now \n";
+ }
+ if (maps[i]->heat_map[0].size() != maps[0]->heat_map[0].size()) {
+ std::cerr << "Sizes of Persistence_heat_maps are not compatible. The program will terminate now \n";
+ throw "Sizes of Persistence_heat_maps are not compatible. The program will terminate now \n";
+ }
+ }
+ std::vector<std::vector<double> > heat_maps(maps[0]->heat_map.size());
+ for (size_t i = 0; i != maps[0]->heat_map.size(); ++i) {
+ std::vector<double> v(maps[0]->heat_map[0].size(), 0);
+ heat_maps[i] = v;
+ }
+ return heat_maps;
+}
+
+template <typename Scalling_of_kernels>
+void Persistence_heat_maps<Scalling_of_kernels>::compute_median(const std::vector<Persistence_heat_maps*>& maps) {
+ std::vector<std::vector<double> > heat_maps = this->check_and_initialize_maps(maps);
+
+ std::vector<double> to_compute_median(maps.size());
+ for (size_t i = 0; i != heat_maps.size(); ++i) {
+ for (size_t j = 0; j != heat_maps[i].size(); ++j) {
+ for (size_t map_no = 0; map_no != maps.size(); ++map_no) {
+ to_compute_median[map_no] = maps[map_no]->heat_map[i][j];
+ }
+ std::nth_element(to_compute_median.begin(), to_compute_median.begin() + to_compute_median.size() / 2,
+ to_compute_median.end());
+ heat_maps[i][j] = to_compute_median[to_compute_median.size() / 2];
+ }
+ }
+ this->heat_map = heat_maps;
+ this->min_ = maps[0]->min_;
+ this->max_ = maps[0]->max_;
+}
+
+template <typename Scalling_of_kernels>
+void Persistence_heat_maps<Scalling_of_kernels>::compute_mean(const std::vector<Persistence_heat_maps*>& maps) {
+ std::vector<std::vector<double> > heat_maps = this->check_and_initialize_maps(maps);
+ for (size_t i = 0; i != heat_maps.size(); ++i) {
+ for (size_t j = 0; j != heat_maps[i].size(); ++j) {
+ double mean = 0;
+ for (size_t map_no = 0; map_no != maps.size(); ++map_no) {
+ mean += maps[map_no]->heat_map[i][j];
+ }
+ heat_maps[i][j] = mean / static_cast<double>(maps.size());
+ }
+ }
+ this->heat_map = heat_maps;
+ this->min_ = maps[0]->min_;
+ this->max_ = maps[0]->max_;
+}
+
+template <typename Scalling_of_kernels>
+void Persistence_heat_maps<Scalling_of_kernels>::compute_percentage_of_active(
+ const std::vector<Persistence_heat_maps*>& maps, size_t cutoff) {
+ std::vector<std::vector<double> > heat_maps = this->check_and_initialize_maps(maps);
+
+ for (size_t i = 0; i != heat_maps.size(); ++i) {
+ for (size_t j = 0; j != heat_maps[i].size(); ++j) {
+ size_t number_of_active_levels = 0;
+ for (size_t map_no = 0; map_no != maps.size(); ++map_no) {
+ if (maps[map_no]->heat_map[i][j]) number_of_active_levels++;
+ }
+ if (number_of_active_levels > cutoff) {
+ heat_maps[i][j] = number_of_active_levels;
+ } else {
+ heat_maps[i][j] = 0;
+ }
+ }
+ }
+ this->heat_map = heat_maps;
+ this->min_ = maps[0]->min_;
+ this->max_ = maps[0]->max_;
+}
+
+template <typename Scalling_of_kernels>
+void Persistence_heat_maps<Scalling_of_kernels>::plot(const char* filename) const {
+ std::ofstream out;
+ std::stringstream gnuplot_script;
+ gnuplot_script << filename << "_GnuplotScript";
+
+ out.open(gnuplot_script.str().c_str());
+ out << "plot '-' matrix with image" << std::endl;
+ for (size_t i = 0; i != this->heat_map.size(); ++i) {
+ for (size_t j = 0; j != this->heat_map[i].size(); ++j) {
+ out << this->heat_map[i][j] << " ";
+ }
+ out << std::endl;
+ }
+ out.close();
+ std::cout << "To visualize, install gnuplot and type the command: gnuplot -persist -e \"load \'"
+ << gnuplot_script.str().c_str() << "\'\"" << std::endl;
+}
+
+template <typename Scalling_of_kernels>
+void Persistence_heat_maps<Scalling_of_kernels>::print_to_file(const char* filename) const {
+ std::ofstream out;
+ out.open(filename);
+
+ // First we store this->min_ and this->max_ values:
+ out << this->min_ << " " << this->max_ << std::endl;
+ for (size_t i = 0; i != this->heat_map.size(); ++i) {
+ for (size_t j = 0; j != this->heat_map[i].size(); ++j) {
+ out << this->heat_map[i][j] << " ";
+ }
+ out << std::endl;
+ }
+ out.close();
+}
+
+template <typename Scalling_of_kernels>
+void Persistence_heat_maps<Scalling_of_kernels>::load_from_file(const char* filename) {
+ bool dbg = false;
+
+ std::ifstream in;
+ in.open(filename);
+
+ // checking if the file exist / if it was open.
+ if (!in.good()) {
+ std::cerr << "The file : " << filename << " do not exist. The program will now terminate \n";
+ throw "The persistence landscape file do not exist. The program will now terminate \n";
+ }
+
+ // now we read the file one by one.
+
+ in >> this->min_ >> this->max_;
+ if (dbg) {
+ std::cerr << "Reading the following values of min and max : " << this->min_ << " , " << this->max_ << std::endl;
+ }
+
+ std::string temp;
+ std::getline(in, temp);
+ while (in.good()) {
+ std::getline(in, temp);
+ std::stringstream lineSS;
+ lineSS << temp;
+
+ std::vector<double> line_of_heat_map;
+ while (lineSS.good()) {
+ double point;
+
+ lineSS >> point;
+ line_of_heat_map.push_back(point);
+ if (dbg) {
+ std::cout << point << " ";
+ }
+ }
+ if (dbg) {
+ std::cout << std::endl;
+ getchar();
+ }
+
+ if (in.good()) this->heat_map.push_back(line_of_heat_map);
+ }
+ in.close();
+ if (dbg) std::cout << "Done \n";
+}
+
+// Concretizations of virtual methods:
+template <typename Scalling_of_kernels>
+std::vector<double> Persistence_heat_maps<Scalling_of_kernels>::vectorize(int number_of_function) const {
+ // convert this->heat_map into one large vector:
+ size_t size_of_result = 0;
+ for (size_t i = 0; i != this->heat_map.size(); ++i) {
+ size_of_result += this->heat_map[i].size();
+ }
+
+ std::vector<double> result;
+ result.reserve(size_of_result);
+
+ for (size_t i = 0; i != this->heat_map.size(); ++i) {
+ for (size_t j = 0; j != this->heat_map[i].size(); ++j) {
+ result.push_back(this->heat_map[i][j]);
+ }
+ }
+
+ return result;
+}
+
+template <typename Scalling_of_kernels>
+double Persistence_heat_maps<Scalling_of_kernels>::distance(const Persistence_heat_maps& second, double power) const {
+ // first we need to check if (*this) and second are defined on the same domain and have the same dimensions:
+ if (!this->check_if_the_same(second)) {
+ std::cerr << "The persistence images are of non compatible sizes. We cannot therefore compute distance between "
+ "them. The program will now terminate";
+ throw "The persistence images are of non compatible sizes. The program will now terminate";
+ }
+
+ // if we are here, we know that the two persistence images are defined on the same domain, so we can start computing
+ // their distances:
+
+ double distance = 0;
+ if (power < std::numeric_limits<double>::max()) {
+ for (size_t i = 0; i != this->heat_map.size(); ++i) {
+ for (size_t j = 0; j != this->heat_map[i].size(); ++j) {
+ distance += pow(fabs(this->heat_map[i][j] - second.heat_map[i][j]), power);
+ }
+ }
+ } else {
+ // in this case, we compute max norm distance
+ for (size_t i = 0; i != this->heat_map.size(); ++i) {
+ for (size_t j = 0; j != this->heat_map[i].size(); ++j) {
+ if (distance < fabs(this->heat_map[i][j] - second.heat_map[i][j])) {
+ distance = fabs(this->heat_map[i][j] - second.heat_map[i][j]);
+ }
+ }
+ }
+ }
+ return distance;
+}
+
+template <typename Scalling_of_kernels>
+double Persistence_heat_maps<Scalling_of_kernels>::project_to_R(int number_of_function) const {
+ double result = 0;
+ for (size_t i = 0; i != this->heat_map.size(); ++i) {
+ for (size_t j = 0; j != this->heat_map[i].size(); ++j) {
+ result += this->heat_map[i][j];
+ }
+ }
+ return result;
+}
+
+template <typename Scalling_of_kernels>
+void Persistence_heat_maps<Scalling_of_kernels>::compute_average(
+ const std::vector<Persistence_heat_maps*>& to_average) {
+ this->compute_mean(to_average);
+}
+
+template <typename Scalling_of_kernels>
+double Persistence_heat_maps<Scalling_of_kernels>::compute_scalar_product(const Persistence_heat_maps& second) const {
+ // first we need to check if (*this) and second are defined on the same domain and have the same dimensions:
+ if (!this->check_if_the_same(second)) {
+ std::cerr << "The persistence images are of non compatible sizes. We cannot therefore compute distance between "
+ "them. The program will now terminate";
+ throw "The persistence images are of non compatible sizes. The program will now terminate";
+ }
+
+ // if we are here, we know that the two persistence images are defined on the same domain, so we can start computing
+ // their scalar product:
+ double scalar_prod = 0;
+ for (size_t i = 0; i != this->heat_map.size(); ++i) {
+ for (size_t j = 0; j != this->heat_map[i].size(); ++j) {
+ scalar_prod += this->heat_map[i][j] * second.heat_map[i][j];
+ }
+ }
+ return scalar_prod;
+}
+
+} // namespace Persistence_representations
+} // namespace Gudhi
+
+#endif // PERSISTENCE_HEAT_MAPS_H_
diff --git a/include/gudhi/Persistence_intervals.h b/include/gudhi/Persistence_intervals.h
new file mode 100644
index 00000000..3d04d8b7
--- /dev/null
+++ b/include/gudhi/Persistence_intervals.h
@@ -0,0 +1,570 @@
+/* This file is part of the Gudhi hiLibrary. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef PERSISTENCE_INTERVALS_H_
+#define PERSISTENCE_INTERVALS_H_
+
+// gudhi include
+#include <gudhi/read_persistence_from_file.h>
+
+// standard include
+#include <limits>
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <algorithm>
+#include <cmath>
+#include <functional>
+#include <utility>
+#include <string>
+
+namespace Gudhi {
+namespace Persistence_representations {
+
+/**
+ * This class implements the following concepts: Vectorized_topological_data, Topological_data_with_distances,
+ *Real_valued_topological_data
+**/
+class Persistence_intervals {
+ public:
+ /**
+ * This is a constructor of a class Persistence_intervals from a text file. Each line of the input file is supposed to
+ *contain two numbers of a type double (or convertible to double)
+ * representing the birth and the death of the persistence interval. If the pairs are not sorted so that birth <=
+ *death, then the constructor will sort then that way.
+ * * The second parameter of a constructor is a dimension of intervals to be read from a file. If your file contains
+ *only birth-death pairs, use the default value.
+ **/
+ Persistence_intervals(const char* filename, unsigned dimension = std::numeric_limits<unsigned>::max());
+
+ /**
+ * This is a constructor of a class Persistence_intervals from a vector of pairs. Each pair is assumed to represent a
+ *persistence interval. We assume that the first elements of pairs
+ * are smaller or equal the second elements of pairs.
+ **/
+ Persistence_intervals(const std::vector<std::pair<double, double> >& intervals);
+
+ /**
+ * This procedure returns x-range of a given persistence diagram.
+ **/
+ std::pair<double, double> get_x_range() const {
+ double min_ = std::numeric_limits<int>::max();
+ double max_ = -std::numeric_limits<int>::max();
+ for (size_t i = 0; i != this->intervals.size(); ++i) {
+ if (this->intervals[i].first < min_) min_ = this->intervals[i].first;
+ if (this->intervals[i].second > max_) max_ = this->intervals[i].second;
+ }
+ return std::make_pair(min_, max_);
+ }
+
+ /**
+ * This procedure returns y-range of a given persistence diagram.
+ **/
+ std::pair<double, double> get_y_range() const {
+ double min_ = std::numeric_limits<int>::max();
+ double max_ = -std::numeric_limits<int>::max();
+ for (size_t i = 0; i != this->intervals.size(); ++i) {
+ if (this->intervals[i].second < min_) min_ = this->intervals[i].second;
+ if (this->intervals[i].second > max_) max_ = this->intervals[i].second;
+ }
+ return std::make_pair(min_, max_);
+ }
+
+ /**
+ * Procedure that compute the vector of lengths of the dominant (i.e. the longest) persistence intervals. The list is
+ *truncated at the parameter of the call where_to_cut (set by default to 100).
+ **/
+ std::vector<double> length_of_dominant_intervals(size_t where_to_cut = 100) const;
+
+ /**
+ * Procedure that compute the vector of the dominant (i.e. the longest) persistence intervals. The parameter of
+ *the procedure (set by default to 100) is the number of dominant intervals returned by the procedure.
+ **/
+ std::vector<std::pair<double, double> > dominant_intervals(size_t where_to_cut = 100) const;
+
+ /**
+ * Procedure to compute a histogram of interval's length. A histogram is a block plot. The number of blocks is
+ *determined by the first parameter of the function (set by default to 10).
+ * For the sake of argument let us assume that the length of the longest interval is 1 and the number of bins is
+ *10. In this case the i-th block correspond to a range between i-1/10 and i10.
+ * The vale of a block supported at the interval is the number of persistence intervals of a length between x_0
+ *and x_1.
+ **/
+ std::vector<size_t> histogram_of_lengths(size_t number_of_bins = 10) const;
+
+ /**
+ * Based on a histogram of intervals lengths computed by the function histogram_of_lengths H the procedure below
+ *computes the cumulative histogram. The i-th position of the resulting histogram
+ * is the sum of values of H for the positions from 0 to i.
+ **/
+ std::vector<size_t> cumulative_histogram_of_lengths(size_t number_of_bins = 10) const;
+
+ /**
+ * In this procedure we assume that each barcode is a characteristic function of a hight equal to its length. The
+ *persistence diagram is a sum of such a functions. The procedure below construct a function being a
+ * sum of the characteristic functions of persistence intervals. The first two parameters are the range in which the
+ *function is to be computed and the last parameter is the number of bins in
+ * the discretization of the interval [_min,_max].
+ **/
+ std::vector<double> characteristic_function_of_diagram(double x_min, double x_max, size_t number_of_bins = 10) const;
+
+ /**
+ * Cumulative version of the function characteristic_function_of_diagram
+ **/
+ std::vector<double> cumulative_characteristic_function_of_diagram(double x_min, double x_max,
+ size_t number_of_bins = 10) const;
+
+ /**
+ * Compute the function of persistence Betti numbers. The returned value is a vector of pair. First element of each
+ *pair is a place where persistence Betti numbers change.
+ * Second element of each pair is the value of Persistence Betti numbers at that point.
+ **/
+ std::vector<std::pair<double, size_t> > compute_persistent_betti_numbers() const;
+
+ /**
+ *This is a non optimal procedure that compute vector of distances from each point of diagram to its k-th nearest
+ *neighbor (k is a parameter of the program). The resulting vector is by default truncated to 10
+ *elements (this value can be changed by using the second parameter of the program). The points are returned in order
+ *from the ones which are farthest away from their k-th nearest neighbors.
+ **/
+ std::vector<double> k_n_n(size_t k, size_t where_to_cut = 10) const;
+
+ /**
+* Operator that send the diagram to a stream.
+**/
+ friend std::ostream& operator<<(std::ostream& out, const Persistence_intervals& intervals) {
+ for (size_t i = 0; i != intervals.intervals.size(); ++i) {
+ out << intervals.intervals[i].first << " " << intervals.intervals[i].second << std::endl;
+ }
+ return out;
+ }
+
+ /**
+ * Generating gnuplot script to plot the interval.
+ **/
+ void plot(const char* filename, double min_x = std::numeric_limits<double>::max(),
+ double max_x = std::numeric_limits<double>::max(), double min_y = std::numeric_limits<double>::max(),
+ double max_y = std::numeric_limits<double>::max()) const {
+ // this program create a gnuplot script file that allows to plot persistence diagram.
+ std::ofstream out;
+
+ std::stringstream gnuplot_script;
+ gnuplot_script << filename << "_GnuplotScript";
+
+ out.open(gnuplot_script.str().c_str());
+
+ std::pair<double, double> min_max_values = this->get_x_range();
+ if (min_x == max_x) {
+ out << "set xrange [" << min_max_values.first - 0.1 * (min_max_values.second - min_max_values.first) << " : "
+ << min_max_values.second + 0.1 * (min_max_values.second - min_max_values.first) << " ]" << std::endl;
+ out << "set yrange [" << min_max_values.first - 0.1 * (min_max_values.second - min_max_values.first) << " : "
+ << min_max_values.second + 0.1 * (min_max_values.second - min_max_values.first) << " ]" << std::endl;
+ } else {
+ out << "set xrange [" << min_x << " : " << max_x << " ]" << std::endl;
+ out << "set yrange [" << min_y << " : " << max_y << " ]" << std::endl;
+ }
+ out << "plot '-' using 1:2 notitle \"" << filename << "\", \\" << std::endl;
+ out << " '-' using 1:2 notitle with lp" << std::endl;
+ for (size_t i = 0; i != this->intervals.size(); ++i) {
+ out << this->intervals[i].first << " " << this->intervals[i].second << std::endl;
+ }
+ out << "EOF" << std::endl;
+ out << min_max_values.first - 0.1 * (min_max_values.second - min_max_values.first) << " "
+ << min_max_values.first - 0.1 * (min_max_values.second - min_max_values.first) << std::endl;
+ out << min_max_values.second + 0.1 * (min_max_values.second - min_max_values.first) << " "
+ << min_max_values.second + 0.1 * (min_max_values.second - min_max_values.first) << std::endl;
+
+ out.close();
+
+ std::cout << "To visualize, install gnuplot and type the command: gnuplot -persist -e \"load \'"
+ << gnuplot_script.str().c_str() << "\'\"" << std::endl;
+ }
+
+ /**
+* Return number of points in the diagram.
+**/
+ size_t size() const { return this->intervals.size(); }
+
+ /**
+ * Return the persistence interval at the given position. Note that intervals are not sorted with respect to their
+ *lengths.
+ **/
+ inline std::pair<double, double> operator[](size_t i) const {
+ if (i >= this->intervals.size()) throw("Index out of range! Operator [], one_d_gaussians class\n");
+ return this->intervals[i];
+ }
+
+ // Implementations of functions for various concepts.
+ /**
+ * This is a simple function projecting the persistence intervals to a real number. The function we use here is a sum
+ *of squared lengths of intervals. It can be naturally interpreted as
+ * sum of step function, where the step hight it equal to the length of the interval.
+ * At the moment this function is not tested, since it is quite likely to be changed in the future. Given this, when
+ *using it, keep in mind that it
+ * will be most likely changed in the next versions.
+ **/
+ double project_to_R(int number_of_function) const;
+ /**
+ * The function gives the number of possible projections to R. This function is required by the
+ *Real_valued_topological_data concept.
+ **/
+ size_t number_of_projections_to_R() const { return this->number_of_functions_for_projections_to_reals; }
+
+ /**
+ * Return a family of vectors obtained from the persistence diagram. The i-th vector consist of the length of i
+ *dominant persistence intervals.
+ **/
+ std::vector<double> vectorize(int number_of_function) const {
+ return this->length_of_dominant_intervals(number_of_function);
+ }
+ /**
+ * This function return the number of functions that allows vectorization of a persistence diagram. It is required
+ *in a concept Vectorized_topological_data.
+ **/
+ size_t number_of_vectorize_functions() const { return this->number_of_functions_for_vectorization; }
+
+ // end of implementation of functions needed for concepts.
+
+ // For visualization use output from vectorize and build histograms.
+ std::vector<std::pair<double, double> > output_for_visualization() { return this->intervals; }
+
+ protected:
+ void set_up_numbers_of_functions_for_vectorization_and_projections_to_reals() {
+ // warning, this function can be only called after filling in the intervals vector.
+ this->number_of_functions_for_vectorization = this->intervals.size();
+ this->number_of_functions_for_projections_to_reals = 1;
+ }
+
+ std::vector<std::pair<double, double> > intervals;
+ size_t number_of_functions_for_vectorization;
+ size_t number_of_functions_for_projections_to_reals;
+};
+
+Persistence_intervals::Persistence_intervals(const char* filename, unsigned dimension) {
+ if (dimension == std::numeric_limits<unsigned>::max()) {
+ this->intervals = read_persistence_intervals_in_one_dimension_from_file(filename);
+ } else {
+ this->intervals = read_persistence_intervals_in_one_dimension_from_file(filename, dimension);
+ }
+ this->set_up_numbers_of_functions_for_vectorization_and_projections_to_reals();
+} // Persistence_intervals
+
+Persistence_intervals::Persistence_intervals(const std::vector<std::pair<double, double> >& intervals_)
+ : intervals(intervals_) {
+ this->set_up_numbers_of_functions_for_vectorization_and_projections_to_reals();
+}
+
+std::vector<double> Persistence_intervals::length_of_dominant_intervals(size_t where_to_cut) const {
+ std::vector<double> result(this->intervals.size());
+ for (size_t i = 0; i != this->intervals.size(); ++i) {
+ result[i] = this->intervals[i].second - this->intervals[i].first;
+ }
+ std::sort(result.begin(), result.end(), std::greater<double>());
+
+ result.resize(std::min(where_to_cut, result.size()));
+ return result;
+} // length_of_dominant_intervals
+
+bool compare(const std::pair<size_t, double>& first, const std::pair<size_t, double>& second) {
+ return first.second > second.second;
+}
+
+std::vector<std::pair<double, double> > Persistence_intervals::dominant_intervals(size_t where_to_cut) const {
+ bool dbg = false;
+ std::vector<std::pair<size_t, double> > position_length_vector(this->intervals.size());
+ for (size_t i = 0; i != this->intervals.size(); ++i) {
+ position_length_vector[i] = std::make_pair(i, this->intervals[i].second - this->intervals[i].first);
+ }
+
+ std::sort(position_length_vector.begin(), position_length_vector.end(), compare);
+
+ std::vector<std::pair<double, double> > result;
+ result.reserve(std::min(where_to_cut, position_length_vector.size()));
+
+ for (size_t i = 0; i != std::min(where_to_cut, position_length_vector.size()); ++i) {
+ result.push_back(this->intervals[position_length_vector[i].first]);
+ if (dbg)
+ std::cerr << "Position : " << position_length_vector[i].first << " length : " << position_length_vector[i].second
+ << std::endl;
+ }
+
+ return result;
+} // dominant_intervals
+
+std::vector<size_t> Persistence_intervals::histogram_of_lengths(size_t number_of_bins) const {
+ bool dbg = false;
+
+ if (dbg) std::cerr << "this->intervals.size() : " << this->intervals.size() << std::endl;
+ // first find the length of the longest interval:
+ double lengthOfLongest = 0;
+ for (size_t i = 0; i != this->intervals.size(); ++i) {
+ if ((this->intervals[i].second - this->intervals[i].first) > lengthOfLongest) {
+ lengthOfLongest = this->intervals[i].second - this->intervals[i].first;
+ }
+ }
+
+ if (dbg) {
+ std::cerr << "lengthOfLongest : " << lengthOfLongest << std::endl;
+ }
+
+ // this is a container we will use to store the resulting histogram
+ std::vector<size_t> result(number_of_bins + 1, 0);
+
+ // for every persistence interval in our collection.
+ for (size_t i = 0; i != this->intervals.size(); ++i) {
+ // compute its length relative to the length of the dominant interval:
+ double relative_length_of_this_interval = (this->intervals[i].second - this->intervals[i].first) / lengthOfLongest;
+
+ // given the relative length (between 0 and 1) compute to which bin should it contribute.
+ size_t position = (size_t)(relative_length_of_this_interval * number_of_bins);
+
+ ++result[position];
+
+ if (dbg) {
+ std::cerr << "i : " << i << std::endl;
+ std::cerr << "Interval : [" << this->intervals[i].first << " , " << this->intervals[i].second << " ] \n";
+ std::cerr << "relative_length_of_this_interval : " << relative_length_of_this_interval << std::endl;
+ std::cerr << "position : " << position << std::endl;
+ getchar();
+ }
+ }
+
+ if (dbg) {
+ for (size_t i = 0; i != result.size(); ++i) std::cerr << result[i] << std::endl;
+ }
+ return result;
+}
+
+std::vector<size_t> Persistence_intervals::cumulative_histogram_of_lengths(size_t number_of_bins) const {
+ std::vector<size_t> histogram = this->histogram_of_lengths(number_of_bins);
+ std::vector<size_t> result(histogram.size());
+
+ size_t sum = 0;
+ for (size_t i = 0; i != histogram.size(); ++i) {
+ sum += histogram[i];
+ result[i] = sum;
+ }
+ return result;
+}
+
+std::vector<double> Persistence_intervals::characteristic_function_of_diagram(double x_min, double x_max,
+ size_t number_of_bins) const {
+ bool dbg = false;
+
+ std::vector<double> result(number_of_bins);
+ std::fill(result.begin(), result.end(), 0);
+
+ for (size_t i = 0; i != this->intervals.size(); ++i) {
+ if (dbg) {
+ std::cerr << "Interval : " << this->intervals[i].first << " , " << this->intervals[i].second << std::endl;
+ }
+
+ size_t beginIt = 0;
+ if (this->intervals[i].first < x_min) beginIt = 0;
+ if (this->intervals[i].first >= x_max) beginIt = result.size();
+ if ((this->intervals[i].first > x_min) && (this->intervals[i].first < x_max)) {
+ beginIt = number_of_bins * (this->intervals[i].first - x_min) / (x_max - x_min);
+ }
+
+ size_t endIt = 0;
+ if (this->intervals[i].second < x_min) endIt = 0;
+ if (this->intervals[i].second >= x_max) endIt = result.size();
+ if ((this->intervals[i].second > x_min) && (this->intervals[i].second < x_max)) {
+ endIt = number_of_bins * (this->intervals[i].second - x_min) / (x_max - x_min);
+ }
+
+ if (beginIt > endIt) {
+ beginIt = endIt;
+ }
+
+ if (dbg) {
+ std::cerr << "beginIt : " << beginIt << std::endl;
+ std::cerr << "endIt : " << endIt << std::endl;
+ }
+
+ 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);
+ }
+ if (dbg) {
+ std::cerr << "Result at this stage \n";
+ for (size_t aa = 0; aa != result.size(); ++aa) {
+ std::cerr << result[aa] << " ";
+ }
+ std::cerr << std::endl;
+ }
+ }
+ return result;
+} // characteristic_function_of_diagram
+
+std::vector<double> Persistence_intervals::cumulative_characteristic_function_of_diagram(double x_min, double x_max,
+ size_t number_of_bins) const {
+ std::vector<double> intsOfBars = this->characteristic_function_of_diagram(x_min, x_max, number_of_bins);
+ std::vector<double> result(intsOfBars.size());
+ double sum = 0;
+ for (size_t i = 0; i != intsOfBars.size(); ++i) {
+ sum += intsOfBars[i];
+ result[i] = sum;
+ }
+ return result;
+} // cumulative_characteristic_function_of_diagram
+
+template <typename T>
+bool compare_first_element_of_pair(const std::pair<T, bool>& f, const std::pair<T, bool>& s) {
+ return (f.first < s.first);
+}
+
+std::vector<std::pair<double, size_t> > Persistence_intervals::compute_persistent_betti_numbers() const {
+ std::vector<std::pair<double, bool> > places_where_pbs_change(2 * this->intervals.size());
+
+ for (size_t i = 0; i != this->intervals.size(); ++i) {
+ places_where_pbs_change[2 * i] = std::make_pair(this->intervals[i].first, true);
+ places_where_pbs_change[2 * i + 1] = std::make_pair(this->intervals[i].second, false);
+ }
+
+ std::sort(places_where_pbs_change.begin(), places_where_pbs_change.end(), compare_first_element_of_pair<double>);
+ size_t pbn = 0;
+ std::vector<std::pair<double, size_t> > pbns(places_where_pbs_change.size());
+ for (size_t i = 0; i != places_where_pbs_change.size(); ++i) {
+ if (places_where_pbs_change[i].second == true) {
+ ++pbn;
+ } else {
+ --pbn;
+ }
+ pbns[i] = std::make_pair(places_where_pbs_change[i].first, pbn);
+ }
+ return pbns;
+}
+
+inline double compute_euclidean_distance(const std::pair<double, double>& f, const std::pair<double, double>& s) {
+ return sqrt((f.first - s.first) * (f.first - s.first) + (f.second - s.second) * (f.second - s.second));
+}
+
+std::vector<double> Persistence_intervals::k_n_n(size_t k, size_t where_to_cut) const {
+ bool dbg = false;
+ if (dbg) {
+ std::cerr << "Here are the intervals : \n";
+ for (size_t i = 0; i != this->intervals.size(); ++i) {
+ std::cerr << "[ " << this->intervals[i].first << " , " << this->intervals[i].second << "] \n";
+ }
+ getchar();
+ }
+
+ std::vector<double> result;
+ // compute all to all distance between point in the diagram. Also, consider points in the diagonal with the infinite
+ // multiplicity.
+ std::vector<std::vector<double> > distances(this->intervals.size());
+ for (size_t i = 0; i != this->intervals.size(); ++i) {
+ std::vector<double> aa(this->intervals.size());
+ std::fill(aa.begin(), aa.end(), 0);
+ distances[i] = aa;
+ }
+ std::vector<double> distances_from_diagonal(this->intervals.size());
+ std::fill(distances_from_diagonal.begin(), distances_from_diagonal.end(), 0);
+
+ for (size_t i = 0; i != this->intervals.size(); ++i) {
+ std::vector<double> distancesFromI;
+ for (size_t j = i + 1; j != this->intervals.size(); ++j) {
+ distancesFromI.push_back(compute_euclidean_distance(this->intervals[i], this->intervals[j]));
+ }
+ // also add a distance from this guy to diagonal:
+ double distanceToDiagonal = compute_euclidean_distance(
+ this->intervals[i], std::make_pair(0.5 * (this->intervals[i].first + this->intervals[i].second),
+ 0.5 * (this->intervals[i].first + this->intervals[i].second)));
+ distances_from_diagonal[i] = distanceToDiagonal;
+
+ if (dbg) {
+ std::cerr << "Here are the distances form the point : [" << this->intervals[i].first << " , "
+ << this->intervals[i].second << "] in the diagram \n";
+ for (size_t aa = 0; aa != distancesFromI.size(); ++aa) {
+ std::cerr << "To : " << i + aa << " : " << distancesFromI[aa] << " ";
+ }
+ std::cerr << std::endl;
+ getchar();
+ }
+
+ // filling in the distances matrix:
+ for (size_t j = i + 1; j != this->intervals.size(); ++j) {
+ distances[i][j] = distancesFromI[j - i - 1];
+ distances[j][i] = distancesFromI[j - i - 1];
+ }
+ }
+ if (dbg) {
+ std::cerr << "Here is the distance matrix : \n";
+ for (size_t i = 0; i != distances.size(); ++i) {
+ for (size_t j = 0; j != distances.size(); ++j) {
+ std::cerr << distances[i][j] << " ";
+ }
+ std::cerr << std::endl;
+ }
+ std::cerr << std::endl << std::endl << "And here are the distances to the diagonal : " << std::endl;
+ for (size_t i = 0; i != distances_from_diagonal.size(); ++i) {
+ std::cerr << distances_from_diagonal[i] << " ";
+ }
+ std::cerr << std::endl << std::endl;
+ getchar();
+ }
+
+ for (size_t i = 0; i != this->intervals.size(); ++i) {
+ std::vector<double> distancesFromI = distances[i];
+ distancesFromI.push_back(distances_from_diagonal[i]);
+
+ // sort it:
+ std::sort(distancesFromI.begin(), distancesFromI.end(), std::greater<double>());
+
+ if (k > distancesFromI.size()) {
+ if (dbg) {
+ std::cerr << "There are not enough neighbors in your set. We set the result to plus infty \n";
+ }
+ result.push_back(std::numeric_limits<double>::max());
+ } else {
+ if (distances_from_diagonal[i] > distancesFromI[k]) {
+ if (dbg) {
+ std::cerr << "The k-th n.n. is on a diagonal. Therefore we set up a distance to diagonal \n";
+ }
+ result.push_back(distances_from_diagonal[i]);
+ } else {
+ result.push_back(distancesFromI[k]);
+ }
+ }
+ }
+ std::sort(result.begin(), result.end(), std::greater<double>());
+ result.resize(std::min(result.size(), where_to_cut));
+
+ return result;
+}
+
+double Persistence_intervals::project_to_R(int number_of_function) const {
+ double result = 0;
+
+ for (size_t i = 0; i != this->intervals.size(); ++i) {
+ result +=
+ (this->intervals[i].second - this->intervals[i].first) * (this->intervals[i].second - this->intervals[i].first);
+ }
+
+ return result;
+}
+
+} // namespace Persistence_representations
+} // namespace Gudhi
+
+#endif // PERSISTENCE_INTERVALS_H_
diff --git a/include/gudhi/Persistence_intervals_with_distances.h b/include/gudhi/Persistence_intervals_with_distances.h
new file mode 100644
index 00000000..79908883
--- /dev/null
+++ b/include/gudhi/Persistence_intervals_with_distances.h
@@ -0,0 +1,63 @@
+/* This file is part of the Gudhi hiLibrary. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef PERSISTENCE_INTERVALS_WITH_DISTANCES_H_
+#define PERSISTENCE_INTERVALS_WITH_DISTANCES_H_
+
+#include <gudhi/Persistence_intervals.h>
+#include <gudhi/Bottleneck.h>
+
+#include <limits>
+
+namespace Gudhi {
+namespace Persistence_representations {
+
+class Persistence_intervals_with_distances : public Persistence_intervals {
+ public:
+ using Persistence_intervals::Persistence_intervals;
+
+ /**
+ *Computations of distance from the current persistnce diagram to the persistence diagram given as a parameter of this
+ *function.
+ *The last but one parameter, power, is here in case we would like to compute p=th Wasserstein distance. At the
+ *moment, this method only implement Bottleneck distance,
+ * which is infinity Wasserstein distance. Therefore any power which is not the default std::numeric_limits< double
+ *>::max() will be ignored and an
+ * exception will be thrown.
+ * The last parameter, tolerance, it is an additiv error of the approimation, set by default to zero.
+ **/
+ double distance(const Persistence_intervals_with_distances& second, double power = std::numeric_limits<double>::max(),
+ double tolerance = (std::numeric_limits<double>::min)()) const {
+ if (power >= std::numeric_limits<double>::max()) {
+ return Gudhi::persistence_diagram::bottleneck_distance(this->intervals, second.intervals, tolerance);
+ } else {
+ std::cerr << "At the moment Gudhi do not support Wasserstein distances. We only support Bottleneck distance."
+ << std::endl;
+ throw "At the moment Gudhi do not support Wasserstein distances. We only support Bottleneck distance.";
+ }
+ }
+};
+
+} // namespace Persistence_representations
+} // namespace Gudhi
+
+#endif // PERSISTENCE_INTERVALS_WITH_DISTANCES_H_
diff --git a/include/gudhi/Persistence_landscape.h b/include/gudhi/Persistence_landscape.h
new file mode 100644
index 00000000..c5aa7867
--- /dev/null
+++ b/include/gudhi/Persistence_landscape.h
@@ -0,0 +1,1376 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef PERSISTENCE_LANDSCAPE_H_
+#define PERSISTENCE_LANDSCAPE_H_
+
+// gudhi include
+#include <gudhi/read_persistence_from_file.h>
+#include <gudhi/common_persistence_representations.h>
+
+// standard include
+#include <cmath>
+#include <iostream>
+#include <vector>
+#include <limits>
+#include <fstream>
+#include <sstream>
+#include <algorithm>
+#include <string>
+#include <utility>
+#include <functional>
+
+namespace Gudhi {
+namespace Persistence_representations {
+
+// pre declaration
+class Persistence_landscape;
+template <typename operation>
+Persistence_landscape operation_on_pair_of_landscapes(const Persistence_landscape& land1,
+ const Persistence_landscape& land2);
+
+/**
+ * \class Persistence_landscape Persistence_landscape.h gudhi/Persistence_landscape.h
+ * \brief A class implementing persistence landscapes data structures.
+ *
+ * \ingroup Persistence_representations
+ *
+ * \details
+ * For theoretical description, please consult <i>Statistical topological data analysis using persistence
+ * landscapes</i>\cite bubenik_landscapes_2015 , and for details of algorithms,
+ * <i>A persistence landscapes toolbox for topological statistics</i>\cite bubenik_dlotko_landscapes_2016.
+ *
+ * Persistence landscapes allow vectorization, computations of distances, computations of projections to Real,
+ * computations of averages and scalar products. Therefore they implement suitable interfaces.
+ * It implements the following concepts: Vectorized_topological_data, Topological_data_with_distances,
+ * Real_valued_topological_data, Topological_data_with_averages, Topological_data_with_scalar_product
+ *
+ * Note that at the moment, due to rounding errors during the construction of persistence landscapes, elements which
+ * are different by 0.000005 are considered the same. If the scale in your persistence diagrams is comparable to this
+ * value, please rescale them before use this code.
+ *
+**/
+class Persistence_landscape {
+ public:
+ /**
+ * Default constructor.
+ **/
+ Persistence_landscape() { this->set_up_numbers_of_functions_for_vectorization_and_projections_to_reals(); }
+
+ /**
+ * 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());
+
+ /**
+ * 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());
+
+ /**
+ * This procedure loads a landscape from file. It erase all the data that was previously stored in this landscape.
+ **/
+ void load_landscape_from_file(const char* filename);
+
+ /**
+ * The procedure stores a landscape to a file. The file can be later used by a procedure load_landscape_from_file.
+ **/
+ void print_to_file(const char* filename) const;
+
+ /**
+ * This function compute integral of the landscape (defined formally as sum of integrals on R of all landscape
+ *functions)
+ **/
+ double compute_integral_of_landscape() const;
+
+ /**
+ * This function compute integral of the 'level'-level of a landscape.
+ **/
+ double compute_integral_of_a_level_of_a_landscape(size_t level) const;
+
+ /**
+ * This function compute integral of the landscape p-th power of a landscape (defined formally as sum of integrals
+ *on R of p-th powers of all landscape functions)
+ **/
+ double compute_integral_of_landscape(double p) const; // this function compute integral of p-th power of landscape.
+
+ /**
+ * A function that computes the value of a landscape at a given point. The parameters of the function are: unsigned
+ *level and double x.
+ * The procedure will compute the value of the level-landscape at the point x.
+ **/
+ double compute_value_at_a_given_point(unsigned level, double x) const;
+
+ /**
+ * Writing landscape into a stream. A i-th level landscape starts with a string "lambda_i". Then the discontinuity
+ *points of the landscapes follows.
+ * Shall those points be joined with lines, we will obtain the i-th landscape function.
+ **/
+ friend std::ostream& operator<<(std::ostream& out, Persistence_landscape& land);
+
+ template <typename operation>
+ friend Persistence_landscape operation_on_pair_of_landscapes(const Persistence_landscape& land1,
+ const Persistence_landscape& land2);
+
+ /**
+ *\private A function that compute sum of two landscapes.
+ **/
+ friend Persistence_landscape add_two_landscapes(const Persistence_landscape& land1,
+ const Persistence_landscape& land2) {
+ return operation_on_pair_of_landscapes<std::plus<double> >(land1, land2);
+ }
+
+ /**
+ *\private A function that compute difference of two landscapes.
+ **/
+ friend Persistence_landscape subtract_two_landscapes(const Persistence_landscape& land1,
+ const Persistence_landscape& land2) {
+ return operation_on_pair_of_landscapes<std::minus<double> >(land1, land2);
+ }
+
+ /**
+ * An operator +, that compute sum of two landscapes.
+ **/
+ friend Persistence_landscape operator+(const Persistence_landscape& first, const Persistence_landscape& second) {
+ return add_two_landscapes(first, second);
+ }
+
+ /**
+ * An operator -, that compute difference of two landscapes.
+ **/
+ friend Persistence_landscape operator-(const Persistence_landscape& first, const Persistence_landscape& second) {
+ return subtract_two_landscapes(first, second);
+ }
+
+ /**
+ * An operator * that allows multiplication of a landscape by a real number.
+ **/
+ friend Persistence_landscape operator*(const Persistence_landscape& first, double con) {
+ return first.multiply_lanscape_by_real_number_not_overwrite(con);
+ }
+
+ /**
+ * An operator * that allows multiplication of a landscape by a real number (order of parameters swapped).
+ **/
+ friend Persistence_landscape operator*(double con, const Persistence_landscape& first) {
+ return first.multiply_lanscape_by_real_number_not_overwrite(con);
+ }
+
+ /**
+ * Operator +=. The second parameter is persistence landscape.
+ **/
+ Persistence_landscape operator+=(const Persistence_landscape& rhs) {
+ *this = *this + rhs;
+ return *this;
+ }
+
+ /**
+ * Operator -=. The second parameter is a persistence landscape.
+ **/
+ Persistence_landscape operator-=(const Persistence_landscape& rhs) {
+ *this = *this - rhs;
+ return *this;
+ }
+
+ /**
+ * Operator *=. The second parameter is a real number by which the y values of all landscape functions are multiplied.
+ *The x-values remain unchanged.
+ **/
+ Persistence_landscape operator*=(double x) {
+ *this = *this * x;
+ return *this;
+ }
+
+ /**
+ * Operator /=. The second parameter is a real number.
+ **/
+ Persistence_landscape operator/=(double x) {
+ if (x == 0) throw("In operator /=, division by 0. Program terminated.");
+ *this = *this * (1 / x);
+ return *this;
+ }
+
+ /**
+ * An operator to compare two persistence landscapes.
+ **/
+ bool operator==(const Persistence_landscape& rhs) const;
+
+ /**
+ * An operator to compare two persistence landscapes.
+ **/
+ bool operator!=(const Persistence_landscape& rhs) const { return !((*this) == rhs); }
+
+ /**
+ * Computations of maximum (y) value of landscape.
+ **/
+ double compute_maximum() const {
+ double maxValue = 0;
+ if (this->land.size()) {
+ maxValue = -std::numeric_limits<int>::max();
+ for (size_t i = 0; i != this->land[0].size(); ++i) {
+ if (this->land[0][i].second > maxValue) maxValue = this->land[0][i].second;
+ }
+ }
+ return maxValue;
+ }
+
+ /**
+ *\private Computations of minimum (y) value of landscape.
+ **/
+ double compute_minimum() const {
+ double minValue = 0;
+ if (this->land.size()) {
+ minValue = std::numeric_limits<int>::max();
+ for (size_t i = 0; i != this->land[0].size(); ++i) {
+ if (this->land[0][i].second < minValue) minValue = this->land[0][i].second;
+ }
+ }
+ return minValue;
+ }
+
+ /**
+ *\private Computations of a \f$L^i\f$ norm of landscape, where i is the input parameter.
+ **/
+ double compute_norm_of_landscape(double i) {
+ Persistence_landscape l;
+ if (i < std::numeric_limits<double>::max()) {
+ return compute_distance_of_landscapes(*this, l, i);
+ } else {
+ return compute_max_norm_distance_of_landscapes(*this, l);
+ }
+ }
+
+ /**
+ * An operator to compute the value of a landscape in the level 'level' at the argument 'x'.
+ **/
+ double operator()(unsigned level, double x) const { return this->compute_value_at_a_given_point(level, x); }
+
+ /**
+ *\private Computations of \f$L^{\infty}\f$ distance between two landscapes.
+ **/
+ friend double compute_max_norm_distance_of_landscapes(const Persistence_landscape& first,
+ const Persistence_landscape& second);
+
+ /**
+ *\private Computations of \f$L^{p}\f$ distance between two landscapes. p is the parameter of the procedure.
+ **/
+ friend double compute_distance_of_landscapes(const Persistence_landscape& first, const Persistence_landscape& second,
+ double p);
+
+ /**
+ * Function to compute absolute value of a PL function. The representation of persistence landscapes allow to store
+ *general PL-function. When computing distance between two landscapes, we compute difference between
+ * them. In this case, a general PL-function with negative value can appear as a result. Then in order to compute
+ *distance, we need to take its absolute value. This is the purpose of this procedure.
+ **/
+ Persistence_landscape abs();
+
+ Persistence_landscape* new_abs();
+
+ /**
+ * Computes the number of landscape functions.
+ **/
+ size_t size() const { return this->land.size(); }
+
+ /**
+ * Compute maximal value of lambda-level landscape.
+ **/
+ double find_max(unsigned lambda) const;
+
+ /**
+ *\private Function to compute inner (scalar) product of two landscapes.
+ **/
+ friend double compute_inner_product(const Persistence_landscape& l1, const Persistence_landscape& l2);
+
+ // Implementations of functions for various concepts.
+
+ /**
+ * The number of projections to R is defined to the number of nonzero landscape functions. I-th projection is an
+ *integral of i-th landscape function over whole R.
+ * This function is required by the Real_valued_topological_data concept.
+ * At the moment this function is not tested, since it is quite likely to be changed in the future. Given this, when
+ *using it, keep in mind that it
+ * will be most likely changed in the next versions.
+ **/
+ double project_to_R(int number_of_function) const {
+ return this->compute_integral_of_a_level_of_a_landscape((size_t)number_of_function);
+ }
+
+ /**
+ * The function gives the number of possible projections to R. This function is required by the
+ *Real_valued_topological_data concept.
+ **/
+ size_t number_of_projections_to_R() const { return this->number_of_functions_for_projections_to_reals; }
+
+ /**
+ * This function produce a vector of doubles based on a landscape. It is required in a concept
+ * Vectorized_topological_data
+ */
+ std::vector<double> vectorize(int number_of_function) const {
+ // TODO(PD) think of something smarter over here
+ std::vector<double> v;
+ if ((size_t)number_of_function > this->land.size()) {
+ return v;
+ }
+ v.reserve(this->land[number_of_function].size());
+ for (size_t i = 0; i != this->land[number_of_function].size(); ++i) {
+ v.push_back(this->land[number_of_function][i].second);
+ }
+ return v;
+ }
+ /**
+ * This function return the number of functions that allows vectorization of persistence landscape. It is required in
+ *a concept Vectorized_topological_data.
+ **/
+ size_t number_of_vectorize_functions() const { return this->number_of_functions_for_vectorization; }
+
+ /**
+ * A function to compute averaged persistence landscape, based on vector of persistence landscapes.
+ * This function is required by Topological_data_with_averages concept.
+ **/
+ void compute_average(const std::vector<Persistence_landscape*>& to_average) {
+ bool dbg = false;
+
+ if (dbg) {
+ std::cerr << "to_average.size() : " << to_average.size() << std::endl;
+ }
+
+ std::vector<Persistence_landscape*> nextLevelMerge(to_average.size());
+ for (size_t i = 0; i != to_average.size(); ++i) {
+ nextLevelMerge[i] = to_average[i];
+ }
+ bool is_this_first_level = true; // in the loop, we will create dynamically a number of intermediate complexes. We
+ // have to clean that up, but we cannot erase the initial landscapes we have
+ // to average. In this case, we simply check if the nextLevelMerge are the input landscapes or the ones created in
+ // that loop by using this extra variable.
+
+ while (nextLevelMerge.size() != 1) {
+ if (dbg) {
+ std::cerr << "nextLevelMerge.size() : " << nextLevelMerge.size() << std::endl;
+ }
+ std::vector<Persistence_landscape*> nextNextLevelMerge;
+ nextNextLevelMerge.reserve(to_average.size());
+ for (size_t i = 0; i < nextLevelMerge.size(); i = i + 2) {
+ if (dbg) {
+ std::cerr << "i : " << i << std::endl;
+ }
+ Persistence_landscape* l = new Persistence_landscape;
+ if (i + 1 != nextLevelMerge.size()) {
+ (*l) = (*nextLevelMerge[i]) + (*nextLevelMerge[i + 1]);
+ } else {
+ (*l) = *nextLevelMerge[i];
+ }
+ nextNextLevelMerge.push_back(l);
+ }
+ if (dbg) {
+ std::cerr << "After this iteration \n";
+ getchar();
+ }
+
+ if (!is_this_first_level) {
+ // deallocate the memory if the vector nextLevelMerge do not consist of the initial landscapes
+ for (size_t i = 0; i != nextLevelMerge.size(); ++i) {
+ delete nextLevelMerge[i];
+ }
+ }
+ is_this_first_level = false;
+ nextLevelMerge.swap(nextNextLevelMerge);
+ }
+ (*this) = (*nextLevelMerge[0]);
+ (*this) *= 1 / static_cast<double>(to_average.size());
+ }
+
+ /**
+ * A function to compute distance between persistence landscape.
+ * The parameter of this function is a Persistence_landscape.
+ * This function is required in Topological_data_with_distances concept.
+ * For max norm distance, set power to std::numeric_limits<double>::max()
+ **/
+ double distance(const Persistence_landscape& second, double power = 1) const {
+ if (power < std::numeric_limits<double>::max()) {
+ return compute_distance_of_landscapes(*this, second, power);
+ } else {
+ return compute_max_norm_distance_of_landscapes(*this, second);
+ }
+ }
+
+ /**
+ * A function to compute scalar product of persistence landscapes.
+ * The parameter of this function is a Persistence_landscape.
+ * This function is required in Topological_data_with_scalar_product concept.
+ **/
+ double compute_scalar_product(const Persistence_landscape& second) const {
+ return compute_inner_product((*this), second);
+ }
+ // end of implementation of functions needed for concepts.
+
+ /**
+ * This procedure returns y-range of a given level persistence landscape. If a default value is used, the y-range
+ * of 0th level landscape is given (and this range contains the ranges of all other landscapes).
+ **/
+ std::pair<double, double> get_y_range(size_t level = 0) const {
+ std::pair<double, double> result;
+ if (level < this->land.size()) {
+ double maxx = this->compute_maximum();
+ double minn = this->compute_minimum();
+ result = std::make_pair(minn, maxx);
+ } else {
+ result = std::make_pair(0, 0);
+ }
+ return result;
+ }
+
+ // a function used to create a gnuplot script for visualization of landscapes
+ void plot(const char* filename, double xRangeBegin = std::numeric_limits<double>::max(),
+ double xRangeEnd = std::numeric_limits<double>::max(),
+ double yRangeBegin = std::numeric_limits<double>::max(),
+ double yRangeEnd = std::numeric_limits<double>::max(), int from = std::numeric_limits<int>::max(),
+ int to = std::numeric_limits<int>::max());
+
+ protected:
+ std::vector<std::vector<std::pair<double, double> > > land;
+ 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());
+ 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,
+ const Persistence_landscape& pl2);
+
+ void set_up_numbers_of_functions_for_vectorization_and_projections_to_reals() {
+ // warning, this function can be only called after filling in the intervals vector.
+ this->number_of_functions_for_vectorization = this->land.size();
+ this->number_of_functions_for_projections_to_reals = this->land.size();
+ }
+};
+
+Persistence_landscape::Persistence_landscape(const char* filename, size_t dimension, size_t number_of_levels) {
+ std::vector<std::pair<double, double> > barcode;
+ if (dimension < std::numeric_limits<double>::max()) {
+ barcode = read_persistence_intervals_in_one_dimension_from_file(filename, dimension);
+ } else {
+ barcode = read_persistence_intervals_in_one_dimension_from_file(filename);
+ }
+ this->construct_persistence_landscape_from_barcode(barcode, number_of_levels);
+ this->set_up_numbers_of_functions_for_vectorization_and_projections_to_reals();
+}
+
+bool operatorEqualDbg = false;
+bool Persistence_landscape::operator==(const Persistence_landscape& rhs) const {
+ if (this->land.size() != rhs.land.size()) {
+ if (operatorEqualDbg) std::cerr << "1\n";
+ return false;
+ }
+ for (size_t level = 0; level != this->land.size(); ++level) {
+ if (this->land[level].size() != rhs.land[level].size()) {
+ if (operatorEqualDbg) std::cerr << "this->land[level].size() : " << this->land[level].size() << "\n";
+ if (operatorEqualDbg) std::cerr << "rhs.land[level].size() : " << rhs.land[level].size() << "\n";
+ if (operatorEqualDbg) std::cerr << "2\n";
+ return false;
+ }
+ for (size_t i = 0; i != this->land[level].size(); ++i) {
+ if (!(almost_equal(this->land[level][i].first, rhs.land[level][i].first) &&
+ almost_equal(this->land[level][i].second, rhs.land[level][i].second))) {
+ if (operatorEqualDbg)
+ std::cerr << "this->land[level][i] : " << this->land[level][i].first << " " << this->land[level][i].second
+ << "\n";
+ if (operatorEqualDbg)
+ std::cerr << "rhs.land[level][i] : " << rhs.land[level][i].first << " " << rhs.land[level][i].second << "\n";
+ if (operatorEqualDbg) std::cerr << "3\n";
+ return false;
+ }
+ }
+ }
+ 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);
+ 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) {
+ bool dbg = false;
+ if (dbg) {
+ std::cerr << "Persistence_landscape::Persistence_landscape( const std::vector< std::pair< double , double > >& p )"
+ << std::endl;
+ }
+
+ // this is a general algorithm to construct persistence landscapes.
+ std::vector<std::pair<double, double> > bars;
+ bars.insert(bars.begin(), p.begin(), p.end());
+ std::sort(bars.begin(), bars.end(), compare_points_sorting);
+
+ if (dbg) {
+ std::cerr << "Bars : \n";
+ for (size_t i = 0; i != bars.size(); ++i) {
+ std::cerr << bars[i].first << " " << bars[i].second << "\n";
+ }
+ getchar();
+ }
+
+ std::vector<std::pair<double, double> > characteristicPoints(p.size());
+ for (size_t i = 0; i != bars.size(); ++i) {
+ characteristicPoints[i] =
+ std::make_pair((bars[i].first + bars[i].second) / 2.0, (bars[i].second - bars[i].first) / 2.0);
+ }
+ std::vector<std::vector<std::pair<double, double> > > Persistence_landscape;
+ size_t number_of_levels_in_the_landscape = 0;
+ while (!characteristicPoints.empty()) {
+ if (dbg) {
+ for (size_t i = 0; i != characteristicPoints.size(); ++i) {
+ std::cout << "(" << characteristicPoints[i].first << " " << characteristicPoints[i].second << ")\n";
+ }
+ std::cin.ignore();
+ }
+
+ std::vector<std::pair<double, double> > lambda_n;
+ lambda_n.push_back(std::make_pair(-std::numeric_limits<int>::max(), 0));
+ lambda_n.push_back(std::make_pair(minus_length(characteristicPoints[0]), 0));
+ lambda_n.push_back(characteristicPoints[0]);
+
+ if (dbg) {
+ std::cerr << "1 Adding to lambda_n : (" << -std::numeric_limits<int>::max() << " " << 0 << ") , ("
+ << minus_length(characteristicPoints[0]) << " " << 0 << ") , (" << characteristicPoints[0].first << " "
+ << characteristicPoints[0].second << ") \n";
+ }
+
+ size_t i = 1;
+ std::vector<std::pair<double, double> > newCharacteristicPoints;
+ while (i < characteristicPoints.size()) {
+ size_t p = 1;
+ if ((minus_length(characteristicPoints[i]) >= minus_length(lambda_n[lambda_n.size() - 1])) &&
+ (birth_plus_deaths(characteristicPoints[i]) > birth_plus_deaths(lambda_n[lambda_n.size() - 1]))) {
+ if (minus_length(characteristicPoints[i]) < birth_plus_deaths(lambda_n[lambda_n.size() - 1])) {
+ std::pair<double, double> point = std::make_pair(
+ (minus_length(characteristicPoints[i]) + birth_plus_deaths(lambda_n[lambda_n.size() - 1])) / 2,
+ (birth_plus_deaths(lambda_n[lambda_n.size() - 1]) - minus_length(characteristicPoints[i])) / 2);
+ lambda_n.push_back(point);
+ if (dbg) {
+ std::cerr << "2 Adding to lambda_n : (" << point.first << " " << point.second << ")\n";
+ }
+
+ if (dbg) {
+ std::cerr << "characteristicPoints[i+p] : " << characteristicPoints[i + p].first << " "
+ << characteristicPoints[i + p].second << "\n";
+ std::cerr << "point : " << point.first << " " << point.second << "\n";
+ getchar();
+ }
+
+ while ((i + p < characteristicPoints.size()) &&
+ (almost_equal(minus_length(point), minus_length(characteristicPoints[i + p]))) &&
+ (birth_plus_deaths(point) <= birth_plus_deaths(characteristicPoints[i + p]))) {
+ newCharacteristicPoints.push_back(characteristicPoints[i + p]);
+ if (dbg) {
+ std::cerr << "3.5 Adding to newCharacteristicPoints : (" << characteristicPoints[i + p].first << " "
+ << characteristicPoints[i + p].second << ")\n";
+ getchar();
+ }
+ ++p;
+ }
+
+ newCharacteristicPoints.push_back(point);
+ if (dbg) {
+ std::cerr << "4 Adding to newCharacteristicPoints : (" << point.first << " " << point.second << ")\n";
+ }
+
+ while ((i + p < characteristicPoints.size()) &&
+ (minus_length(point) <= minus_length(characteristicPoints[i + p])) &&
+ (birth_plus_deaths(point) >= birth_plus_deaths(characteristicPoints[i + p]))) {
+ newCharacteristicPoints.push_back(characteristicPoints[i + p]);
+ if (dbg) {
+ std::cerr << "characteristicPoints[i+p] : " << characteristicPoints[i + p].first << " "
+ << characteristicPoints[i + p].second << "\n";
+ std::cerr << "point : " << point.first << " " << point.second << "\n";
+ std::cerr << "characteristicPoints[i+p] birth and death : " << minus_length(characteristicPoints[i + p])
+ << " , " << birth_plus_deaths(characteristicPoints[i + p]) << "\n";
+ std::cerr << "point birth and death : " << minus_length(point) << " , " << birth_plus_deaths(point)
+ << "\n";
+
+ std::cerr << "3 Adding to newCharacteristicPoints : (" << characteristicPoints[i + p].first << " "
+ << characteristicPoints[i + p].second << ")\n";
+ getchar();
+ }
+ ++p;
+ }
+
+ } else {
+ lambda_n.push_back(std::make_pair(birth_plus_deaths(lambda_n[lambda_n.size() - 1]), 0));
+ lambda_n.push_back(std::make_pair(minus_length(characteristicPoints[i]), 0));
+ if (dbg) {
+ std::cerr << "5 Adding to lambda_n : (" << birth_plus_deaths(lambda_n[lambda_n.size() - 1]) << " " << 0
+ << ")\n";
+ std::cerr << "5 Adding to lambda_n : (" << minus_length(characteristicPoints[i]) << " " << 0 << ")\n";
+ }
+ }
+ lambda_n.push_back(characteristicPoints[i]);
+ if (dbg) {
+ std::cerr << "6 Adding to lambda_n : (" << characteristicPoints[i].first << " "
+ << characteristicPoints[i].second << ")\n";
+ }
+ } else {
+ newCharacteristicPoints.push_back(characteristicPoints[i]);
+ if (dbg) {
+ std::cerr << "7 Adding to newCharacteristicPoints : (" << characteristicPoints[i].first << " "
+ << characteristicPoints[i].second << ")\n";
+ }
+ }
+ i = i + p;
+ }
+ lambda_n.push_back(std::make_pair(birth_plus_deaths(lambda_n[lambda_n.size() - 1]), 0));
+ lambda_n.push_back(std::make_pair(std::numeric_limits<int>::max(), 0));
+
+ characteristicPoints = newCharacteristicPoints;
+
+ 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;
+ }
+ }
+}
+
+// this function find maximum of lambda_n
+double Persistence_landscape::find_max(unsigned lambda) const {
+ if (this->land.size() < lambda) return 0;
+ double maximum = -std::numeric_limits<int>::max();
+ for (size_t i = 0; i != this->land[lambda].size(); ++i) {
+ if (this->land[lambda][i].second > maximum) maximum = this->land[lambda][i].second;
+ }
+ return maximum;
+}
+
+double Persistence_landscape::compute_integral_of_landscape() const {
+ double result = 0;
+ for (size_t i = 0; i != this->land.size(); ++i) {
+ for (size_t nr = 2; nr != this->land[i].size() - 1; ++nr) {
+ // it suffices to compute every planar integral and then sum them up for each lambda_n
+ result += 0.5 * (this->land[i][nr].first - this->land[i][nr - 1].first) *
+ (this->land[i][nr].second + this->land[i][nr - 1].second);
+ }
+ }
+ return result;
+}
+
+double Persistence_landscape::compute_integral_of_a_level_of_a_landscape(size_t level) const {
+ double result = 0;
+ if (level >= this->land.size()) {
+ // this landscape function is constantly equal 0, so is the integral.
+ return result;
+ }
+ // also negative landscapes are assumed to be zero.
+ if (level < 0) return 0;
+
+ for (size_t nr = 2; nr != this->land[level].size() - 1; ++nr) {
+ // it suffices to compute every planar integral and then sum them up for each lambda_n
+ result += 0.5 * (this->land[level][nr].first - this->land[level][nr - 1].first) *
+ (this->land[level][nr].second + this->land[level][nr - 1].second);
+ }
+
+ return result;
+}
+
+double Persistence_landscape::compute_integral_of_landscape(double p) const {
+ bool dbg = false;
+ double result = 0;
+ for (size_t i = 0; i != this->land.size(); ++i) {
+ for (size_t nr = 2; nr != this->land[i].size() - 1; ++nr) {
+ if (dbg) std::cout << "nr : " << nr << "\n";
+ // In this interval, the landscape has a form f(x) = ax+b. We want to compute integral of (ax+b)^p = 1/a *
+ // (ax+b)^{p+1}/(p+1)
+ std::pair<double, double> coef = compute_parameters_of_a_line(this->land[i][nr], this->land[i][nr - 1]);
+ double a = coef.first;
+ double b = coef.second;
+
+ if (dbg)
+ std::cout << "(" << this->land[i][nr].first << "," << this->land[i][nr].second << ") , "
+ << this->land[i][nr - 1].first << "," << this->land[i][nr].second << ")" << std::endl;
+ if (this->land[i][nr].first == this->land[i][nr - 1].first) continue;
+ if (a != 0) {
+ result += 1 / (a * (p + 1)) *
+ (pow((a * this->land[i][nr].first + b), p + 1) - pow((a * this->land[i][nr - 1].first + b), p + 1));
+ } else {
+ result += (this->land[i][nr].first - this->land[i][nr - 1].first) * (pow(this->land[i][nr].second, p));
+ }
+ if (dbg) {
+ std::cout << "a : " << a << " , b : " << b << std::endl;
+ std::cout << "result : " << result << std::endl;
+ }
+ }
+ }
+ return result;
+}
+
+// this is O(log(n)) algorithm, where n is number of points in this->land.
+double Persistence_landscape::compute_value_at_a_given_point(unsigned level, double x) const {
+ bool compute_value_at_a_given_pointDbg = false;
+ // in such a case lambda_level = 0.
+ if (level > this->land.size()) return 0;
+
+ // we know that the points in this->land[level] are ordered according to x coordinate. Therefore, we can find the
+ // point by using bisection:
+ unsigned coordBegin = 1;
+ unsigned coordEnd = this->land[level].size() - 2;
+
+ if (compute_value_at_a_given_pointDbg) {
+ std::cerr << "Here \n";
+ std::cerr << "x : " << x << "\n";
+ std::cerr << "this->land[level][coordBegin].first : " << this->land[level][coordBegin].first << "\n";
+ std::cerr << "this->land[level][coordEnd].first : " << this->land[level][coordEnd].first << "\n";
+ }
+
+ // in this case x is outside the support of the landscape, therefore the value of the landscape is 0.
+ if (x <= this->land[level][coordBegin].first) return 0;
+ if (x >= this->land[level][coordEnd].first) return 0;
+
+ if (compute_value_at_a_given_pointDbg) std::cerr << "Entering to the while loop \n";
+
+ while (coordBegin + 1 != coordEnd) {
+ if (compute_value_at_a_given_pointDbg) {
+ std::cerr << "coordBegin : " << coordBegin << "\n";
+ std::cerr << "coordEnd : " << coordEnd << "\n";
+ std::cerr << "this->land[level][coordBegin].first : " << this->land[level][coordBegin].first << "\n";
+ std::cerr << "this->land[level][coordEnd].first : " << this->land[level][coordEnd].first << "\n";
+ }
+
+ unsigned newCord = (unsigned)floor((coordEnd + coordBegin) / 2.0);
+
+ if (compute_value_at_a_given_pointDbg) {
+ std::cerr << "newCord : " << newCord << "\n";
+ std::cerr << "this->land[level][newCord].first : " << this->land[level][newCord].first << "\n";
+ std::cin.ignore();
+ }
+
+ if (this->land[level][newCord].first <= x) {
+ coordBegin = newCord;
+ if (this->land[level][newCord].first == x) return this->land[level][newCord].second;
+ } else {
+ coordEnd = newCord;
+ }
+ }
+
+ if (compute_value_at_a_given_pointDbg) {
+ std::cout << "x : " << x << " is between : " << this->land[level][coordBegin].first << " a "
+ << this->land[level][coordEnd].first << "\n";
+ std::cout << "the y coords are : " << this->land[level][coordBegin].second << " a "
+ << this->land[level][coordEnd].second << "\n";
+ std::cerr << "coordBegin : " << coordBegin << "\n";
+ std::cerr << "coordEnd : " << coordEnd << "\n";
+ std::cin.ignore();
+ }
+ return function_value(this->land[level][coordBegin], this->land[level][coordEnd], x);
+}
+
+std::ostream& operator<<(std::ostream& out, Persistence_landscape& land) {
+ for (size_t level = 0; level != land.land.size(); ++level) {
+ out << "Lambda_" << level << ":" << std::endl;
+ for (size_t i = 0; i != land.land[level].size(); ++i) {
+ if (land.land[level][i].first == -std::numeric_limits<int>::max()) {
+ out << "-inf";
+ } else {
+ if (land.land[level][i].first == std::numeric_limits<int>::max()) {
+ out << "+inf";
+ } else {
+ out << land.land[level][i].first;
+ }
+ }
+ out << " , " << land.land[level][i].second << std::endl;
+ }
+ }
+ return out;
+}
+
+void Persistence_landscape::multiply_lanscape_by_real_number_overwrite(double x) {
+ for (size_t dim = 0; dim != this->land.size(); ++dim) {
+ for (size_t i = 0; i != this->land[dim].size(); ++i) {
+ this->land[dim][i].second *= x;
+ }
+ }
+}
+
+bool AbsDbg = false;
+Persistence_landscape Persistence_landscape::abs() {
+ Persistence_landscape result;
+ 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;
+}
+
+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;
+}
+
+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) {
+ std::vector<std::pair<double, double> > lambda_dim(this->land[dim].size());
+ for (size_t i = 0; i != this->land[dim].size(); ++i) {
+ lambda_dim[i] = std::make_pair(this->land[dim][i].first, x * this->land[dim][i].second);
+ }
+ result[dim] = lambda_dim;
+ }
+ Persistence_landscape res;
+ // CHANGE
+ // res.land = result;
+ res.land.swap(result);
+ return res;
+} // multiply_lanscape_by_real_number_overwrite
+
+void Persistence_landscape::print_to_file(const char* filename) const {
+ std::ofstream write;
+ write.open(filename);
+ for (size_t dim = 0; dim != this->land.size(); ++dim) {
+ write << "#lambda_" << dim << std::endl;
+ for (size_t i = 1; i != this->land[dim].size() - 1; ++i) {
+ write << this->land[dim][i].first << " " << this->land[dim][i].second << std::endl;
+ }
+ }
+ write.close();
+}
+
+void Persistence_landscape::load_landscape_from_file(const char* filename) {
+ bool dbg = false;
+ // removing the current content of the persistence landscape.
+ this->land.clear();
+
+ // this constructor reads persistence landscape form a file. This file have to be created by this software before head
+ std::ifstream in;
+ in.open(filename);
+ if (!in.good()) {
+ std::cerr << "The file : " << filename << " do not exist. The program will now terminate \n";
+ throw "The persistence landscape file do not exist. The program will now terminate \n";
+ }
+
+ std::string line;
+ std::vector<std::pair<double, double> > landscapeAtThisLevel;
+
+ bool isThisAFirsLine = true;
+ while (in.good()) {
+ getline(in, line);
+ if (!(line.length() == 0 || line[0] == '#')) {
+ std::stringstream lineSS;
+ lineSS << line;
+ double beginn, endd;
+ lineSS >> beginn;
+ lineSS >> endd;
+ landscapeAtThisLevel.push_back(std::make_pair(beginn, endd));
+ if (dbg) {
+ std::cerr << "Reading a point : " << beginn << " , " << endd << std::endl;
+ }
+ } else {
+ if (dbg) {
+ std::cout << "IGNORE LINE\n";
+ getchar();
+ }
+ if (!isThisAFirsLine) {
+ landscapeAtThisLevel.push_back(std::make_pair(std::numeric_limits<int>::max(), 0));
+ this->land.push_back(landscapeAtThisLevel);
+ std::vector<std::pair<double, double> > newLevelOdLandscape;
+ landscapeAtThisLevel.swap(newLevelOdLandscape);
+ }
+ landscapeAtThisLevel.push_back(std::make_pair(-std::numeric_limits<int>::max(), 0));
+ isThisAFirsLine = false;
+ }
+ }
+ if (landscapeAtThisLevel.size() > 1) {
+ // seems that the last line of the file is not finished with the newline sign. We need to put what we have in
+ // landscapeAtThisLevel to the constructed landscape.
+ landscapeAtThisLevel.push_back(std::make_pair(std::numeric_limits<int>::max(), 0));
+ this->land.push_back(landscapeAtThisLevel);
+ }
+
+ in.close();
+}
+
+template <typename T>
+Persistence_landscape operation_on_pair_of_landscapes(const Persistence_landscape& land1,
+ const Persistence_landscape& land2) {
+ bool operation_on_pair_of_landscapesDBG = false;
+ if (operation_on_pair_of_landscapesDBG) {
+ std::cout << "operation_on_pair_of_landscapes\n";
+ std::cin.ignore();
+ }
+ Persistence_landscape result;
+ std::vector<std::vector<std::pair<double, double> > > land(std::max(land1.land.size(), land2.land.size()));
+ result.land = land;
+ T oper;
+
+ if (operation_on_pair_of_landscapesDBG) {
+ for (size_t i = 0; i != std::min(land1.land.size(), land2.land.size()); ++i) {
+ std::cerr << "land1.land[" << i << "].size() : " << land1.land[i].size() << std::endl;
+ std::cerr << "land2.land[" << i << "].size() : " << land2.land[i].size() << std::endl;
+ }
+ getchar();
+ }
+
+ for (size_t i = 0; i != std::min(land1.land.size(), land2.land.size()); ++i) {
+ std::vector<std::pair<double, double> > lambda_n;
+ size_t p = 0;
+ size_t q = 0;
+ while ((p + 1 < land1.land[i].size()) && (q + 1 < land2.land[i].size())) {
+ if (operation_on_pair_of_landscapesDBG) {
+ std::cerr << "p : " << p << "\n";
+ std::cerr << "q : " << q << "\n";
+ std::cerr << "land1.land.size() : " << land1.land.size() << std::endl;
+ std::cerr << "land2.land.size() : " << land2.land.size() << std::endl;
+ std::cerr << "land1.land[" << i << "].size() : " << land1.land[i].size() << std::endl;
+ std::cerr << "land2.land[" << i << "].size() : " << land2.land[i].size() << std::endl;
+ std::cout << "land1.land[i][p].first : " << land1.land[i][p].first << "\n";
+ std::cout << "land2.land[i][q].first : " << land2.land[i][q].first << "\n";
+ }
+
+ if (land1.land[i][p].first < land2.land[i][q].first) {
+ if (operation_on_pair_of_landscapesDBG) {
+ std::cout << "first \n";
+ std::cout << " function_value(land2.land[i][q-1],land2.land[i][q],land1.land[i][p].first) : "
+ << function_value(land2.land[i][q - 1], land2.land[i][q], land1.land[i][p].first) << "\n";
+ }
+ lambda_n.push_back(
+ std::make_pair(land1.land[i][p].first,
+ oper(static_cast<double>(land1.land[i][p].second),
+ function_value(land2.land[i][q - 1], land2.land[i][q], land1.land[i][p].first))));
+ ++p;
+ continue;
+ }
+ if (land1.land[i][p].first > land2.land[i][q].first) {
+ if (operation_on_pair_of_landscapesDBG) {
+ std::cout << "Second \n";
+ std::cout << "function_value(" << land1.land[i][p - 1].first << " " << land1.land[i][p - 1].second << " ,"
+ << land1.land[i][p].first << " " << land1.land[i][p].second << ", " << land2.land[i][q].first
+ << " ) : " << function_value(land1.land[i][p - 1], land1.land[i][p - 1], land2.land[i][q].first)
+ << "\n";
+ std::cout << "oper( " << function_value(land1.land[i][p], land1.land[i][p - 1], land2.land[i][q].first) << ","
+ << land2.land[i][q].second << " : "
+ << oper(land2.land[i][q].second,
+ function_value(land1.land[i][p], land1.land[i][p - 1], land2.land[i][q].first))
+ << "\n";
+ }
+ lambda_n.push_back(std::make_pair(
+ land2.land[i][q].first, oper(function_value(land1.land[i][p], land1.land[i][p - 1], land2.land[i][q].first),
+ land2.land[i][q].second)));
+ ++q;
+ continue;
+ }
+ if (land1.land[i][p].first == land2.land[i][q].first) {
+ if (operation_on_pair_of_landscapesDBG) std::cout << "Third \n";
+ lambda_n.push_back(
+ std::make_pair(land2.land[i][q].first, oper(land1.land[i][p].second, land2.land[i][q].second)));
+ ++p;
+ ++q;
+ }
+ if (operation_on_pair_of_landscapesDBG) {
+ std::cout << "Next iteration \n";
+ }
+ }
+ while ((p + 1 < land1.land[i].size()) && (q + 1 >= land2.land[i].size())) {
+ if (operation_on_pair_of_landscapesDBG) {
+ std::cout << "New point : " << land1.land[i][p].first
+ << " oper(land1.land[i][p].second,0) : " << oper(land1.land[i][p].second, 0) << std::endl;
+ }
+ lambda_n.push_back(std::make_pair(land1.land[i][p].first, oper(land1.land[i][p].second, 0)));
+ ++p;
+ }
+ while ((p + 1 >= land1.land[i].size()) && (q + 1 < land2.land[i].size())) {
+ if (operation_on_pair_of_landscapesDBG) {
+ std::cout << "New point : " << land2.land[i][q].first
+ << " oper(0,land2.land[i][q].second) : " << oper(0, land2.land[i][q].second) << std::endl;
+ }
+ lambda_n.push_back(std::make_pair(land2.land[i][q].first, oper(0, land2.land[i][q].second)));
+ ++q;
+ }
+ lambda_n.push_back(std::make_pair(std::numeric_limits<int>::max(), 0));
+ // CHANGE
+ // result.land[i] = lambda_n;
+ result.land[i].swap(lambda_n);
+ }
+ if (land1.land.size() > std::min(land1.land.size(), land2.land.size())) {
+ if (operation_on_pair_of_landscapesDBG) {
+ std::cout << "land1.land.size() > std::min( land1.land.size() , land2.land.size() )" << std::endl;
+ }
+ for (size_t i = std::min(land1.land.size(), land2.land.size()); i != std::max(land1.land.size(), land2.land.size());
+ ++i) {
+ std::vector<std::pair<double, double> > lambda_n(land1.land[i]);
+ for (size_t nr = 0; nr != land1.land[i].size(); ++nr) {
+ lambda_n[nr] = std::make_pair(land1.land[i][nr].first, oper(land1.land[i][nr].second, 0));
+ }
+ // CHANGE
+ // result.land[i] = lambda_n;
+ result.land[i].swap(lambda_n);
+ }
+ }
+ if (land2.land.size() > std::min(land1.land.size(), land2.land.size())) {
+ if (operation_on_pair_of_landscapesDBG) {
+ std::cout << "( land2.land.size() > std::min( land1.land.size() , land2.land.size() ) ) " << std::endl;
+ }
+ for (size_t i = std::min(land1.land.size(), land2.land.size()); i != std::max(land1.land.size(), land2.land.size());
+ ++i) {
+ std::vector<std::pair<double, double> > lambda_n(land2.land[i]);
+ for (size_t nr = 0; nr != land2.land[i].size(); ++nr) {
+ lambda_n[nr] = std::make_pair(land2.land[i][nr].first, oper(0, land2.land[i][nr].second));
+ }
+ // CHANGE
+ // result.land[i] = lambda_n;
+ result.land[i].swap(lambda_n);
+ }
+ }
+ if (operation_on_pair_of_landscapesDBG) {
+ std::cout << "operation_on_pair_of_landscapes END\n";
+ std::cin.ignore();
+ }
+ return result;
+} // operation_on_pair_of_landscapes
+
+double compute_maximal_distance_non_symmetric(const Persistence_landscape& pl1, const Persistence_landscape& pl2) {
+ bool dbg = false;
+ if (dbg) std::cerr << " compute_maximal_distance_non_symmetric \n";
+ // this distance is not symmetric. It compute ONLY distance between inflection points of pl1 and pl2.
+ double maxDist = 0;
+ size_t minimalNumberOfLevels = std::min(pl1.land.size(), pl2.land.size());
+ for (size_t level = 0; level != minimalNumberOfLevels; ++level) {
+ if (dbg) {
+ std::cerr << "Level : " << level << std::endl;
+ std::cerr << "PL1 : \n";
+ for (size_t i = 0; i != pl1.land[level].size(); ++i) {
+ std::cerr << "(" << pl1.land[level][i].first << "," << pl1.land[level][i].second << ") \n";
+ }
+ std::cerr << "PL2 : \n";
+ for (size_t i = 0; i != pl2.land[level].size(); ++i) {
+ std::cerr << "(" << pl2.land[level][i].first << "," << pl2.land[level][i].second << ") \n";
+ }
+ std::cin.ignore();
+ }
+
+ int p2Count = 0;
+ // In this case, I consider points at the infinity
+ for (size_t i = 1; i != pl1.land[level].size() - 1; ++i) {
+ while (true) {
+ if ((pl1.land[level][i].first >= pl2.land[level][p2Count].first) &&
+ (pl1.land[level][i].first <= pl2.land[level][p2Count + 1].first))
+ break;
+ p2Count++;
+ }
+ double val =
+ fabs(function_value(pl2.land[level][p2Count], pl2.land[level][p2Count + 1], pl1.land[level][i].first) -
+ pl1.land[level][i].second);
+ if (maxDist <= val) maxDist = val;
+
+ if (dbg) {
+ std::cerr << pl1.land[level][i].first << "in [" << pl2.land[level][p2Count].first << ","
+ << pl2.land[level][p2Count + 1].first << "] \n";
+ std::cerr << "pl1[level][i].second : " << pl1.land[level][i].second << std::endl;
+ std::cerr << "function_value( pl2[level][p2Count] , pl2[level][p2Count+1] , pl1[level][i].first ) : "
+ << function_value(pl2.land[level][p2Count], pl2.land[level][p2Count + 1], pl1.land[level][i].first)
+ << std::endl;
+ std::cerr << "val : " << val << std::endl;
+ std::cin.ignore();
+ }
+ }
+ }
+
+ if (dbg) std::cerr << "minimalNumberOfLevels : " << minimalNumberOfLevels << std::endl;
+
+ if (minimalNumberOfLevels < pl1.land.size()) {
+ for (size_t level = minimalNumberOfLevels; level != pl1.land.size(); ++level) {
+ for (size_t i = 0; i != pl1.land[level].size(); ++i) {
+ if (dbg) std::cerr << "pl1[level][i].second : " << pl1.land[level][i].second << std::endl;
+ if (maxDist < pl1.land[level][i].second) maxDist = pl1.land[level][i].second;
+ }
+ }
+ }
+ return maxDist;
+}
+
+double compute_distance_of_landscapes(const Persistence_landscape& first, const Persistence_landscape& second,
+ double p) {
+ bool dbg = false;
+ // This is what we want to compute: (\int_{- \infty}^{+\infty}| first-second |^p)^(1/p). We will do it one step at a
+ // time:
+
+ // first-second :
+ Persistence_landscape lan = first - second;
+
+ //| first-second |:
+ lan = lan.abs();
+
+ if (dbg) {
+ std::cerr << "Abs of difference ; " << lan << std::endl;
+ getchar();
+ }
+
+ if (p < std::numeric_limits<double>::max()) {
+ // \int_{- \infty}^{+\infty}| first-second |^p
+ double result;
+ if (p != 1) {
+ if (dbg) std::cerr << "Power != 1, compute integral to the power p\n";
+ result = lan.compute_integral_of_landscape(p);
+ } else {
+ if (dbg) std::cerr << "Power = 1, compute integral \n";
+ result = lan.compute_integral_of_landscape();
+ }
+ // (\int_{- \infty}^{+\infty}| first-second |^p)^(1/p)
+ return pow(result, 1.0 / p);
+ } else {
+ // p == infty
+ if (dbg) std::cerr << "Power = infty, compute maximum \n";
+ return lan.compute_maximum();
+ }
+}
+
+double compute_max_norm_distance_of_landscapes(const Persistence_landscape& first,
+ const Persistence_landscape& second) {
+ return std::max(compute_maximal_distance_non_symmetric(first, second),
+ compute_maximal_distance_non_symmetric(second, first));
+}
+
+bool comparePairsForMerging(std::pair<double, unsigned> first, std::pair<double, unsigned> second) {
+ return (first.first < second.first);
+}
+
+double compute_inner_product(const Persistence_landscape& l1, const Persistence_landscape& l2) {
+ bool dbg = false;
+ double result = 0;
+
+ for (size_t level = 0; level != std::min(l1.size(), l2.size()); ++level) {
+ if (dbg) {
+ std::cerr << "Computing inner product for a level : " << level << std::endl;
+ getchar();
+ }
+ if (l1.land[level].size() * l2.land[level].size() == 0) continue;
+
+ // endpoints of the interval on which we will compute the inner product of two locally linear functions:
+ double x1 = -std::numeric_limits<int>::max();
+ double x2;
+ if (l1.land[level][1].first < l2.land[level][1].first) {
+ x2 = l1.land[level][1].first;
+ } else {
+ x2 = l2.land[level][1].first;
+ }
+
+ // iterators for the landscapes l1 and l2
+ size_t l1It = 0;
+ size_t l2It = 0;
+
+ while ((l1It < l1.land[level].size() - 1) && (l2It < l2.land[level].size() - 1)) {
+ // compute the value of a inner product on a interval [x1,x2]
+
+ double a, b, c, d;
+
+ if (l1.land[level][l1It + 1].first != l1.land[level][l1It].first) {
+ a = (l1.land[level][l1It + 1].second - l1.land[level][l1It].second) /
+ (l1.land[level][l1It + 1].first - l1.land[level][l1It].first);
+ } else {
+ a = 0;
+ }
+ b = l1.land[level][l1It].second - a * l1.land[level][l1It].first;
+ if (l2.land[level][l2It + 1].first != l2.land[level][l2It].first) {
+ c = (l2.land[level][l2It + 1].second - l2.land[level][l2It].second) /
+ (l2.land[level][l2It + 1].first - l2.land[level][l2It].first);
+ } else {
+ c = 0;
+ }
+ d = l2.land[level][l2It].second - c * l2.land[level][l2It].first;
+
+ double contributionFromThisPart = (a * c * x2 * x2 * x2 / 3 + (a * d + b * c) * x2 * x2 / 2 + b * d * x2) -
+ (a * c * x1 * x1 * x1 / 3 + (a * d + b * c) * x1 * x1 / 2 + b * d * x1);
+
+ result += contributionFromThisPart;
+
+ if (dbg) {
+ std::cerr << "[l1.land[level][l1It].first,l1.land[level][l1It+1].first] : " << l1.land[level][l1It].first
+ << " , " << l1.land[level][l1It + 1].first << std::endl;
+ std::cerr << "[l2.land[level][l2It].first,l2.land[level][l2It+1].first] : " << l2.land[level][l2It].first
+ << " , " << l2.land[level][l2It + 1].first << std::endl;
+ std::cerr << "a : " << a << ", b : " << b << " , c: " << c << ", d : " << d << std::endl;
+ std::cerr << "x1 : " << x1 << " , x2 : " << x2 << std::endl;
+ std::cerr << "contributionFromThisPart : " << contributionFromThisPart << std::endl;
+ std::cerr << "result : " << result << std::endl;
+ getchar();
+ }
+
+ // we have two intervals in which functions are constant:
+ // [l1.land[level][l1It].first , l1.land[level][l1It+1].first]
+ // and
+ // [l2.land[level][l2It].first , l2.land[level][l2It+1].first]
+ // We also have an interval [x1,x2]. Since the intervals in the landscapes cover the whole R, then it is clear
+ // that x2
+ // is either l1.land[level][l1It+1].first of l2.land[level][l2It+1].first or both. Lets test it.
+ if (x2 == l1.land[level][l1It + 1].first) {
+ if (x2 == l2.land[level][l2It + 1].first) {
+ // in this case, we increment both:
+ ++l2It;
+ if (dbg) {
+ std::cerr << "Incrementing both \n";
+ }
+ } else {
+ if (dbg) {
+ std::cerr << "Incrementing first \n";
+ }
+ }
+ ++l1It;
+ } else {
+ // in this case we increment l2It
+ ++l2It;
+ if (dbg) {
+ std::cerr << "Incrementing second \n";
+ }
+ }
+ // Now, we shift x1 and x2:
+ x1 = x2;
+ if (l1.land[level][l1It + 1].first < l2.land[level][l2It + 1].first) {
+ x2 = l1.land[level][l1It + 1].first;
+ } else {
+ x2 = l2.land[level][l2It + 1].first;
+ }
+ }
+ }
+ return result;
+}
+
+void Persistence_landscape::plot(const char* filename, double xRangeBegin, double xRangeEnd, double yRangeBegin,
+ double yRangeEnd, int from, int to) {
+ // this program create a gnuplot script file that allows to plot persistence diagram.
+ std::ofstream out;
+
+ std::ostringstream gnuplot_script;
+ gnuplot_script << filename << "_GnuplotScript";
+ out.open(gnuplot_script.str().c_str());
+
+ if ((xRangeBegin != std::numeric_limits<double>::max()) || (xRangeEnd != std::numeric_limits<double>::max()) ||
+ (yRangeBegin != std::numeric_limits<double>::max()) || (yRangeEnd != std::numeric_limits<double>::max())) {
+ out << "set xrange [" << xRangeBegin << " : " << xRangeEnd << "]" << std::endl;
+ out << "set yrange [" << yRangeBegin << " : " << yRangeEnd << "]" << std::endl;
+ }
+
+ if (from == std::numeric_limits<int>::max()) {
+ from = 0;
+ }
+ if (to == std::numeric_limits<int>::max()) {
+ to = this->land.size();
+ }
+
+ out << "plot ";
+ for (size_t lambda = std::min((size_t)from, this->land.size()); lambda != std::min((size_t)to, this->land.size());
+ ++lambda) {
+ // out << " '-' using 1:2 title 'l" << lambda << "' with lp";
+ out << " '-' using 1:2 notitle with lp";
+ if (lambda + 1 != std::min((size_t)to, this->land.size())) {
+ out << ", \\";
+ }
+ out << std::endl;
+ }
+
+ for (size_t lambda = std::min((size_t)from, this->land.size()); lambda != std::min((size_t)to, this->land.size());
+ ++lambda) {
+ for (size_t i = 1; i != this->land[lambda].size() - 1; ++i) {
+ out << this->land[lambda][i].first << " " << this->land[lambda][i].second << std::endl;
+ }
+ out << "EOF" << std::endl;
+ }
+ std::cout << "To visualize, install gnuplot and type the command: gnuplot -persist -e \"load \'"
+ << gnuplot_script.str().c_str() << "\'\"" << std::endl;
+}
+
+} // namespace Persistence_representations
+} // namespace Gudhi
+
+#endif // PERSISTENCE_LANDSCAPE_H_
diff --git a/include/gudhi/Persistence_landscape_on_grid.h b/include/gudhi/Persistence_landscape_on_grid.h
new file mode 100644
index 00000000..84fd22ed
--- /dev/null
+++ b/include/gudhi/Persistence_landscape_on_grid.h
@@ -0,0 +1,1348 @@
+/** This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+#ifndef PERSISTENCE_LANDSCAPE_ON_GRID_H_
+#define PERSISTENCE_LANDSCAPE_ON_GRID_H_
+
+// gudhi include
+#include <gudhi/read_persistence_from_file.h>
+#include <gudhi/common_persistence_representations.h>
+
+// standard include
+#include <iostream>
+#include <vector>
+#include <limits>
+#include <fstream>
+#include <sstream>
+#include <algorithm>
+#include <cmath>
+#include <functional>
+#include <utility>
+#include <string>
+#include <cstdint>
+
+namespace Gudhi {
+namespace Persistence_representations {
+
+// pre declaration
+class Persistence_landscape_on_grid;
+template <typename operation>
+Persistence_landscape_on_grid operation_on_pair_of_landscapes_on_grid(const Persistence_landscape_on_grid& land1,
+ const Persistence_landscape_on_grid& land2);
+
+/**
+ * \class Persistence_landscape_on_grid Persistence_landscape_on_grid.h gudhi/Persistence_landscape_on_grid.h
+ * \brief A class implementing persistence landscapes by approximating them on a collection of grid points.
+ *
+ * \ingroup Persistence_representations
+ *
+ * \details
+ * Persistence landscapes on grid allows vectorization, computations of distances, computations of projections to Real,
+ * computations of averages and scalar products. Therefore they implement suitable interfaces.
+ * It implements the following concepts: Vectorized_topological_data, Topological_data_with_distances,
+ * Real_valued_topological_data, Topological_data_with_averages, Topological_data_with_scalar_product
+ *
+ * Note that at the moment, due to rounding errors during the construction of persistence landscapes on a grid,
+ * elements which are different by 0.000005 are considered the same. If the scale in your persistence diagrams
+ * is comparable to this value, please rescale them before use this code.
+**/
+
+// this class implements the following concepts: Vectorized_topological_data, Topological_data_with_distances,
+// Real_valued_topological_data, Topological_data_with_averages, Topological_data_with_scalar_product
+class Persistence_landscape_on_grid {
+ public:
+ /**
+ * Default constructor.
+ **/
+ Persistence_landscape_on_grid() {
+ this->set_up_numbers_of_functions_for_vectorization_and_projections_to_reals();
+ this->grid_min = this->grid_max = 0;
+ }
+
+ /**
+ * Constructor that takes as an input a vector of birth-death pairs.
+ **/
+ Persistence_landscape_on_grid(const std::vector<std::pair<double, double> >& p, double grid_min_, double grid_max_,
+ size_t number_of_points_);
+
+ /**
+ * Constructor that takes as an input a vector of birth-death pairs, parameters of the grid and number of
+ *landscape function to be created.
+ **/
+ Persistence_landscape_on_grid(const std::vector<std::pair<double, double> >& p, double grid_min_, double grid_max_,
+ size_t number_of_points_, unsigned number_of_levels_of_landscape);
+
+ /**
+ * 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.
+ *The additional parameters of this procedure are: ranges of grid, resolution of a grid
+ * number of landscape functions to be created and the dimension of intervals that are need to be read from a file
+ *(in case of Gudhi format files).
+ **/
+ Persistence_landscape_on_grid(const char* filename, double grid_min_, double grid_max_, size_t number_of_points_,
+ unsigned number_of_levels_of_landscape,
+ uint16_t dimension_ = std::numeric_limits<uint16_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. The
+ *additional parameters of this procedure are: ranges of grid, resolution of a grid
+ * and the dimension of intervals that are need to be read from a file (in case of Gudhi format files).
+ **/
+ Persistence_landscape_on_grid(const char* filename, double grid_min_, double grid_max_, size_t number_of_points_,
+ uint16_t dimension_ = std::numeric_limits<uint16_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.
+ *The additional parameter is the resolution of a grid and the number of landscape
+ * functions to be created. The remaining parameters are calculated based on data.
+ **/
+ Persistence_landscape_on_grid(const char* filename, size_t number_of_points, unsigned number_of_levels_of_landscape,
+ uint16_t dimension = std::numeric_limits<uint16_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. The
+ *additional parameter is the resolution of a grid. The last parameter is the dimension
+ * of a persistence to read from the file. If your file contains only persistence pair in a single dimension, please
+ *set it up to std::numeric_limits<unsigned>::max().
+ * The remaining parameters are calculated based on data.
+ **/
+ Persistence_landscape_on_grid(const char* filename, size_t number_of_points,
+ uint16_t dimension = std::numeric_limits<uint16_t>::max());
+
+ /**
+ * This procedure loads a landscape from file. It erase all the data that was previously stored in this landscape.
+ **/
+ void load_landscape_from_file(const char* filename);
+
+ /**
+ * The procedure stores a landscape to a file. The file can be later used by a procedure load_landscape_from_file.
+ **/
+ void print_to_file(const char* filename) const;
+
+ /**
+ * This function compute integral of the landscape (defined formally as sum of integrals on R of all landscape
+ *functions)
+ **/
+ double compute_integral_of_landscape() const {
+ size_t maximal_level = this->number_of_nonzero_levels();
+ double result = 0;
+ for (size_t i = 0; i != maximal_level; ++i) {
+ result += this->compute_integral_of_landscape(i);
+ }
+ return result;
+ }
+
+ /**
+ * This function compute integral of the 'level'-level of a landscape.
+ **/
+ double compute_integral_of_landscape(size_t level) const {
+ bool dbg = false;
+ double result = 0;
+ double dx = (this->grid_max - this->grid_min) / static_cast<double>(this->values_of_landscapes.size() - 1);
+
+ if (dbg) {
+ std::cerr << "this->grid_max : " << this->grid_max << std::endl;
+ std::cerr << "this->grid_min : " << this->grid_min << std::endl;
+ std::cerr << "this->values_of_landscapes.size() : " << this->values_of_landscapes.size() << std::endl;
+ getchar();
+ }
+
+ double previous_x = this->grid_min - dx;
+ double previous_y = 0;
+ for (size_t i = 0; i != this->values_of_landscapes.size(); ++i) {
+ double current_x = previous_x + dx;
+ double current_y = 0;
+ if (this->values_of_landscapes[i].size() > level) current_y = this->values_of_landscapes[i][level];
+
+ if (dbg) {
+ std::cerr << "this->values_of_landscapes[i].size() : " << this->values_of_landscapes[i].size()
+ << " , level : " << level << std::endl;
+ if (this->values_of_landscapes[i].size() > level)
+ std::cerr << "this->values_of_landscapes[i][level] : " << this->values_of_landscapes[i][level] << std::endl;
+ std::cerr << "previous_y : " << previous_y << std::endl;
+ std::cerr << "current_y : " << current_y << std::endl;
+ std::cerr << "dx : " << dx << std::endl;
+ std::cerr << "0.5*dx*( previous_y + current_y ); " << 0.5 * dx * (previous_y + current_y) << std::endl;
+ }
+
+ result += 0.5 * dx * (previous_y + current_y);
+ previous_x = current_x;
+ previous_y = current_y;
+ }
+ return result;
+ }
+
+ /**
+ * This function compute integral of the landscape p-th power of a landscape (defined formally as sum of integrals on
+ *R of p-th powers of all landscape functions)
+ **/
+ double compute_integral_of_landscape(double p) const {
+ size_t maximal_level = this->number_of_nonzero_levels();
+ double result = 0;
+ for (size_t i = 0; i != maximal_level; ++i) {
+ result += this->compute_integral_of_landscape(p, i);
+ }
+ return result;
+ }
+
+ /**
+ * This function compute integral of the landscape p-th power of a level of a landscape (defined formally as sum
+ *of integrals on R of p-th powers of all landscape functions)
+ **/
+ double compute_integral_of_landscape(double p, size_t level) const {
+ bool dbg = false;
+
+ double result = 0;
+ double dx = (this->grid_max - this->grid_min) / static_cast<double>(this->values_of_landscapes.size() - 1);
+ double previous_x = this->grid_min;
+ double previous_y = 0;
+ if (this->values_of_landscapes[0].size() > level) previous_y = this->values_of_landscapes[0][level];
+
+ if (dbg) {
+ std::cerr << "dx : " << dx << std::endl;
+ std::cerr << "previous_x : " << previous_x << std::endl;
+ std::cerr << "previous_y : " << previous_y << std::endl;
+ std::cerr << "power : " << p << std::endl;
+ getchar();
+ }
+
+ for (size_t i = 0; i != this->values_of_landscapes.size(); ++i) {
+ double current_x = previous_x + dx;
+ double current_y = 0;
+ if (this->values_of_landscapes[i].size() > level) current_y = this->values_of_landscapes[i][level];
+
+ if (dbg) std::cerr << "current_y : " << current_y << std::endl;
+
+ if (current_y == previous_y) continue;
+
+ std::pair<double, double> coef =
+ compute_parameters_of_a_line(std::make_pair(previous_x, previous_y), std::make_pair(current_x, current_y));
+ double a = coef.first;
+ double b = coef.second;
+
+ if (dbg) {
+ std::cerr << "A line passing through points : (" << previous_x << "," << previous_y << ") and (" << current_x
+ << "," << current_y << ") is : " << a << "x+" << b << std::endl;
+ }
+
+ // In this interval, the landscape has a form f(x) = ax+b. We want to compute integral of (ax+b)^p = 1/a *
+ // (ax+b)^{p+1}/(p+1)
+ double value_to_add = 0;
+ if (a != 0) {
+ value_to_add = 1 / (a * (p + 1)) * (pow((a * current_x + b), p + 1) - pow((a * previous_x + b), p + 1));
+ } else {
+ value_to_add = (current_x - previous_x) * (pow(b, p));
+ }
+ result += value_to_add;
+ if (dbg) {
+ std::cerr << "Increasing result by : " << value_to_add << std::endl;
+ std::cerr << "result : " << result << std::endl;
+ getchar();
+ }
+ previous_x = current_x;
+ previous_y = current_y;
+ }
+ if (dbg) std::cerr << "The total result is : " << result << std::endl;
+ return result;
+ }
+
+ /**
+* Writing landscape into a stream. A i-th level landscape starts with a string "lambda_i". Then the discontinuity points
+*of the landscapes follows.
+* Shall those points be joined with lines, we will obtain the i-th landscape function.
+**/
+ friend std::ostream& operator<<(std::ostream& out, const Persistence_landscape_on_grid& land) {
+ double dx = (land.grid_max - land.grid_min) / static_cast<double>(land.values_of_landscapes.size() - 1);
+ double x = land.grid_min;
+ for (size_t i = 0; i != land.values_of_landscapes.size(); ++i) {
+ out << x << " : ";
+ for (size_t j = 0; j != land.values_of_landscapes[i].size(); ++j) {
+ out << land.values_of_landscapes[i][j] << " ";
+ }
+ out << std::endl;
+ x += dx;
+ }
+ return out;
+ }
+
+ template <typename oper>
+ friend Persistence_landscape_on_grid operation_on_pair_of_landscapes_on_grid(
+ const Persistence_landscape_on_grid& land1, const Persistence_landscape_on_grid& land2);
+
+ /**
+ * A function that computes the value of a landscape at a given point. The parameters of the function are: unsigned
+ *level and double x.
+ * The procedure will compute the value of the level-landscape at the point x.
+ **/
+ double compute_value_at_a_given_point(unsigned level, double x) const {
+ bool dbg = false;
+ if ((x < this->grid_min) || (x > this->grid_max)) return 0;
+
+ // find a position of a vector closest to x:
+ double dx = (this->grid_max - this->grid_min) / static_cast<double>(this->values_of_landscapes.size() - 1);
+ size_t position = size_t((x - this->grid_min) / dx);
+
+ if (dbg) {
+ std::cerr << "This is a procedure compute_value_at_a_given_point \n";
+ std::cerr << "level : " << level << std::endl;
+ std::cerr << "x : " << x << std::endl;
+ std::cerr << "position : " << position << std::endl;
+ }
+ // check if we are not exactly in the grid point:
+ if (almost_equal(position * dx + this->grid_min, x)) {
+ if (this->values_of_landscapes[position].size() < level) {
+ return this->values_of_landscapes[position][level];
+ } else {
+ return 0;
+ }
+ }
+ // in the other case, approximate with a line:
+ std::pair<double, double> line;
+ if ((this->values_of_landscapes[position].size() > level) &&
+ (this->values_of_landscapes[position + 1].size() > level)) {
+ line = compute_parameters_of_a_line(
+ std::make_pair(position * dx + this->grid_min, this->values_of_landscapes[position][level]),
+ std::make_pair((position + 1) * dx + this->grid_min, this->values_of_landscapes[position + 1][level]));
+ } else {
+ if ((this->values_of_landscapes[position].size() > level) ||
+ (this->values_of_landscapes[position + 1].size() > level)) {
+ if ((this->values_of_landscapes[position].size() > level)) {
+ line = compute_parameters_of_a_line(
+ std::make_pair(position * dx + this->grid_min, this->values_of_landscapes[position][level]),
+ std::make_pair((position + 1) * dx + this->grid_min, 0));
+ } else {
+ line = compute_parameters_of_a_line(
+ std::make_pair(position * dx + this->grid_min, 0),
+ std::make_pair((position + 1) * dx + this->grid_min, this->values_of_landscapes[position + 1][level]));
+ }
+ } else {
+ return 0;
+ }
+ }
+ // compute the value of the linear function parametrized by line on a point x:
+ return line.first * x + line.second;
+ }
+
+ public:
+ /**
+ *\private A function that compute sum of two landscapes.
+ **/
+ friend Persistence_landscape_on_grid add_two_landscapes(const Persistence_landscape_on_grid& land1,
+ const Persistence_landscape_on_grid& land2) {
+ return operation_on_pair_of_landscapes_on_grid<std::plus<double> >(land1, land2);
+ }
+
+ /**
+ *\private A function that compute difference of two landscapes.
+ **/
+ friend Persistence_landscape_on_grid subtract_two_landscapes(const Persistence_landscape_on_grid& land1,
+ const Persistence_landscape_on_grid& land2) {
+ return operation_on_pair_of_landscapes_on_grid<std::minus<double> >(land1, land2);
+ }
+
+ /**
+ * An operator +, that compute sum of two landscapes.
+ **/
+ friend Persistence_landscape_on_grid operator+(const Persistence_landscape_on_grid& first,
+ const Persistence_landscape_on_grid& second) {
+ return add_two_landscapes(first, second);
+ }
+
+ /**
+ * An operator -, that compute difference of two landscapes.
+ **/
+ friend Persistence_landscape_on_grid operator-(const Persistence_landscape_on_grid& first,
+ const Persistence_landscape_on_grid& second) {
+ return subtract_two_landscapes(first, second);
+ }
+
+ /**
+ * An operator * that allows multiplication of a landscape by a real number.
+ **/
+ friend Persistence_landscape_on_grid operator*(const Persistence_landscape_on_grid& first, double con) {
+ return first.multiply_lanscape_by_real_number_not_overwrite(con);
+ }
+
+ /**
+ * An operator * that allows multiplication of a landscape by a real number (order of parameters swapped).
+ **/
+ friend Persistence_landscape_on_grid operator*(double con, const Persistence_landscape_on_grid& first) {
+ return first.multiply_lanscape_by_real_number_not_overwrite(con);
+ }
+
+ friend bool check_if_defined_on_the_same_domain(const Persistence_landscape_on_grid& land1,
+ const Persistence_landscape_on_grid& land2) {
+ if (land1.values_of_landscapes.size() != land2.values_of_landscapes.size()) return false;
+ if (land1.grid_min != land2.grid_min) return false;
+ if (land1.grid_max != land2.grid_max) return false;
+ return true;
+ }
+
+ /**
+ * Operator +=. The second parameter is persistence landscape.
+ **/
+ Persistence_landscape_on_grid operator+=(const Persistence_landscape_on_grid& rhs) {
+ *this = *this + rhs;
+ return *this;
+ }
+
+ /**
+ * Operator -=. The second parameter is persistence landscape.
+ **/
+ Persistence_landscape_on_grid operator-=(const Persistence_landscape_on_grid& rhs) {
+ *this = *this - rhs;
+ return *this;
+ }
+
+ /**
+ * Operator *=. The second parameter is a real number by which the y values of all landscape functions are multiplied.
+ *The x-values remain unchanged.
+ **/
+ Persistence_landscape_on_grid operator*=(double x) {
+ *this = *this * x;
+ return *this;
+ }
+
+ /**
+ * Operator /=. The second parameter is a real number.
+ **/
+ Persistence_landscape_on_grid operator/=(double x) {
+ if (x == 0) throw("In operator /=, division by 0. Program terminated.");
+ *this = *this * (1 / x);
+ return *this;
+ }
+
+ /**
+ * An operator to compare two persistence landscapes.
+ **/
+ bool operator==(const Persistence_landscape_on_grid& rhs) const {
+ bool dbg = true;
+ if (this->values_of_landscapes.size() != rhs.values_of_landscapes.size()) {
+ if (dbg) std::cerr << "values_of_landscapes of incompatible sizes\n";
+ return false;
+ }
+ if (!almost_equal(this->grid_min, rhs.grid_min)) {
+ if (dbg) std::cerr << "grid_min not equal\n";
+ return false;
+ }
+ if (!almost_equal(this->grid_max, rhs.grid_max)) {
+ if (dbg) std::cerr << "grid_max not equal\n";
+ return false;
+ }
+ for (size_t i = 0; i != this->values_of_landscapes.size(); ++i) {
+ for (size_t aa = 0; aa != this->values_of_landscapes[i].size(); ++aa) {
+ if (!almost_equal(this->values_of_landscapes[i][aa], rhs.values_of_landscapes[i][aa])) {
+ if (dbg) {
+ std::cerr << "Problem in the position : " << i << " of values_of_landscapes. \n";
+ std::cerr << this->values_of_landscapes[i][aa] << " " << rhs.values_of_landscapes[i][aa] << std::endl;
+ }
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * An operator to compare two persistence landscapes.
+ **/
+ bool operator!=(const Persistence_landscape_on_grid& rhs) const { return !((*this) == rhs); }
+
+ /**
+ * Computations of maximum (y) value of landscape.
+ **/
+ double compute_maximum() const {
+ // since the function can only be entirely positive or negative, the maximal value will be an extremal value in the
+ // arrays:
+ double max_value = -std::numeric_limits<double>::max();
+ for (size_t i = 0; i != this->values_of_landscapes.size(); ++i) {
+ if (this->values_of_landscapes[i].size()) {
+ if (this->values_of_landscapes[i][0] > max_value) max_value = this->values_of_landscapes[i][0];
+ if (this->values_of_landscapes[i][this->values_of_landscapes[i].size() - 1] > max_value)
+ max_value = this->values_of_landscapes[i][this->values_of_landscapes[i].size() - 1];
+ }
+ }
+ return max_value;
+ }
+
+ /**
+ * Computations of minimum and maximum value of landscape.
+ **/
+ std::pair<double, double> compute_minimum_maximum() const {
+ // since the function can only be entirely positive or negative, the maximal value will be an extremal value in the
+ // arrays:
+ double max_value = -std::numeric_limits<double>::max();
+ double min_value = 0;
+ for (size_t i = 0; i != this->values_of_landscapes.size(); ++i) {
+ if (this->values_of_landscapes[i].size()) {
+ if (this->values_of_landscapes[i][0] > max_value) max_value = this->values_of_landscapes[i][0];
+ if (this->values_of_landscapes[i][this->values_of_landscapes[i].size() - 1] > max_value)
+ max_value = this->values_of_landscapes[i][this->values_of_landscapes[i].size() - 1];
+
+ if (this->values_of_landscapes[i][0] < min_value) min_value = this->values_of_landscapes[i][0];
+ if (this->values_of_landscapes[i][this->values_of_landscapes[i].size() - 1] < min_value)
+ min_value = this->values_of_landscapes[i][this->values_of_landscapes[i].size() - 1];
+ }
+ }
+ return std::make_pair(min_value, max_value);
+ }
+
+ /**
+ * This procedure returns x-range of a given level persistence landscape. If a default value is used, the x-range
+ * of 0th level landscape is given (and this range contains the ranges of all other landscapes).
+ **/
+ std::pair<double, double> get_x_range(size_t level = 0) const {
+ return std::make_pair(this->grid_min, this->grid_max);
+ }
+
+ /**
+ * This procedure returns y-range of a persistence landscape. If a default value is used, the y-range
+ * of 0th level landscape is given (and this range contains the ranges of all other landscapes).
+ **/
+ std::pair<double, double> get_y_range(size_t level = 0) const { return this->compute_minimum_maximum(); }
+
+ /**
+ * This function computes maximal lambda for which lambda-level landscape is nonzero.
+ **/
+ size_t number_of_nonzero_levels() const {
+ size_t result = 0;
+ for (size_t i = 0; i != this->values_of_landscapes.size(); ++i) {
+ if (this->values_of_landscapes[i].size() > result) result = this->values_of_landscapes[i].size();
+ }
+ return result;
+ }
+
+ /**
+ * Computations of a \f$L^i\f$ norm of landscape, where i is the input parameter.
+ **/
+ double compute_norm_of_landscape(double i) const {
+ std::vector<std::pair<double, double> > p;
+ Persistence_landscape_on_grid l(p, this->grid_min, this->grid_max, this->values_of_landscapes.size() - 1);
+
+ if (i < std::numeric_limits<double>::max()) {
+ return compute_distance_of_landscapes_on_grid(*this, l, i);
+ } else {
+ return compute_max_norm_distance_of_landscapes(*this, l);
+ }
+ }
+
+ /**
+ * An operator to compute the value of a landscape in the level 'level' at the argument 'x'.
+ **/
+ double operator()(unsigned level, double x) const { return this->compute_value_at_a_given_point(level, x); }
+
+ /**
+ * Computations of \f$L^{\infty}\f$ distance between two landscapes.
+ **/
+ friend double compute_max_norm_distance_of_landscapes(const Persistence_landscape_on_grid& first,
+ const Persistence_landscape_on_grid& second);
+
+ /**
+ * Function to compute absolute value of a PL function. The representation of persistence landscapes allow to store
+ *general PL-function. When computing distance between two landscapes, we compute difference between
+ * them. In this case, a general PL-function with negative value can appear as a result. Then in order to compute
+ *distance, we need to take its absolute value. This is the purpose of this procedure.
+ **/
+ void abs() {
+ for (size_t i = 0; i != this->values_of_landscapes.size(); ++i) {
+ for (size_t j = 0; j != this->values_of_landscapes[i].size(); ++j) {
+ this->values_of_landscapes[i][j] = std::abs(this->values_of_landscapes[i][j]);
+ }
+ }
+ }
+
+ /**
+ * Computes the number of landscape functions.
+ **/
+ size_t size() const { return this->number_of_nonzero_levels(); }
+
+ /**
+ * Compute maximal value of lambda-level landscape.
+ **/
+ double find_max(unsigned lambda) const {
+ double max_value = -std::numeric_limits<double>::max();
+ for (size_t i = 0; i != this->values_of_landscapes.size(); ++i) {
+ if (this->values_of_landscapes[i].size() > lambda) {
+ if (this->values_of_landscapes[i][lambda] > max_value) max_value = this->values_of_landscapes[i][lambda];
+ }
+ }
+ return max_value;
+ }
+
+ /**
+ * Function to compute inner (scalar) product of two landscapes.
+ **/
+ friend double compute_inner_product(const Persistence_landscape_on_grid& l1,
+ const Persistence_landscape_on_grid& l2) {
+ if (!check_if_defined_on_the_same_domain(l1, l2))
+ throw "Landscapes are not defined on the same grid, the program will now terminate";
+ size_t maximal_level = l1.number_of_nonzero_levels();
+ double result = 0;
+ for (size_t i = 0; i != maximal_level; ++i) {
+ result += compute_inner_product(l1, l2, i);
+ }
+ return result;
+ }
+
+ /**
+ * Function to compute inner (scalar) product of given levels of two landscapes.
+ **/
+ friend double compute_inner_product(const Persistence_landscape_on_grid& l1, const Persistence_landscape_on_grid& l2,
+ size_t level) {
+ bool dbg = false;
+
+ if (!check_if_defined_on_the_same_domain(l1, l2))
+ throw "Landscapes are not defined on the same grid, the program will now terminate";
+ double result = 0;
+
+ double dx = (l1.grid_max - l1.grid_min) / static_cast<double>(l1.values_of_landscapes.size() - 1);
+
+ double previous_x = l1.grid_min - dx;
+ double previous_y_l1 = 0;
+ double previous_y_l2 = 0;
+ for (size_t i = 0; i != l1.values_of_landscapes.size(); ++i) {
+ if (dbg) std::cerr << "i : " << i << std::endl;
+
+ double current_x = previous_x + dx;
+ double current_y_l1 = 0;
+ if (l1.values_of_landscapes[i].size() > level) current_y_l1 = l1.values_of_landscapes[i][level];
+
+ double current_y_l2 = 0;
+ if (l2.values_of_landscapes[i].size() > level) current_y_l2 = l2.values_of_landscapes[i][level];
+
+ if (dbg) {
+ std::cerr << "previous_x : " << previous_x << std::endl;
+ std::cerr << "previous_y_l1 : " << previous_y_l1 << std::endl;
+ std::cerr << "current_y_l1 : " << current_y_l1 << std::endl;
+ std::cerr << "previous_y_l2 : " << previous_y_l2 << std::endl;
+ std::cerr << "current_y_l2 : " << current_y_l2 << std::endl;
+ }
+
+ std::pair<double, double> l1_coords = compute_parameters_of_a_line(std::make_pair(previous_x, previous_y_l1),
+ std::make_pair(current_x, current_y_l1));
+ std::pair<double, double> l2_coords = compute_parameters_of_a_line(std::make_pair(previous_x, previous_y_l2),
+ std::make_pair(current_x, current_y_l2));
+
+ // let us assume that the first line is of a form y = ax+b, and the second one is of a form y = cx + d. Then here
+ // are a,b,c,d:
+ double a = l1_coords.first;
+ double b = l1_coords.second;
+
+ double c = l2_coords.first;
+ double d = l2_coords.second;
+
+ if (dbg) {
+ std::cerr << "Here are the formulas for a line: \n";
+ std::cerr << "a : " << a << std::endl;
+ std::cerr << "b : " << b << std::endl;
+ std::cerr << "c : " << c << std::endl;
+ std::cerr << "d : " << d << std::endl;
+ }
+
+ // now, to compute the inner product in this interval we need to compute the integral of (ax+b)(cx+d) = acx^2 +
+ // (ad+bc)x + bd in the interval from previous_x to current_x:
+ // The integral is ac/3*x^3 + (ac+bd)/2*x^2 + bd*x
+
+ double added_value = (a * c / 3 * current_x * current_x * current_x +
+ (a * d + b * c) / 2 * current_x * current_x + b * d * current_x) -
+ (a * c / 3 * previous_x * previous_x * previous_x +
+ (a * d + b * c) / 2 * previous_x * previous_x + b * d * previous_x);
+
+ if (dbg) {
+ std::cerr << "Value of the integral on the left end i.e. : " << previous_x << " is : "
+ << a * c / 3 * previous_x * previous_x * previous_x + (a * d + b * c) / 2 * previous_x * previous_x +
+ b * d * previous_x
+ << std::endl;
+ std::cerr << "Value of the integral on the right end i.e. : " << current_x << " is "
+ << a * c / 3 * current_x * current_x * current_x + (a * d + b * c) / 2 * current_x * current_x +
+ b * d * current_x
+ << std::endl;
+ }
+
+ result += added_value;
+
+ if (dbg) {
+ std::cerr << "added_value : " << added_value << std::endl;
+ std::cerr << "result : " << result << std::endl;
+ getchar();
+ }
+
+ previous_x = current_x;
+ previous_y_l1 = current_y_l1;
+ previous_y_l2 = current_y_l2;
+ }
+ return result;
+ }
+
+ /**
+ * Computations of \f$L^{p}\f$ distance between two landscapes on a grid. p is the parameter of the procedure.
+ * FIXME: Note that, due to the grid representation, the method below may give non--accurate results in case when the
+ *landscape P and Q the difference of which we want to compute
+ * are intersecting. This is a consequence of a general way they are computed. In the future, an integral of absolute
+ *value of a difference of P and Q will be given as a separated
+ * function to fix that inaccuracy.
+ **/
+ friend double compute_distance_of_landscapes_on_grid(const Persistence_landscape_on_grid& first,
+ const Persistence_landscape_on_grid& second, double p) {
+ bool dbg = false;
+ // This is what we want to compute: (\int_{- \infty}^{+\infty}| first-second |^p)^(1/p). We will do it one step at a
+ // time:
+
+ if (dbg) {
+ std::cerr << "first : " << first << std::endl;
+ std::cerr << "second : " << second << std::endl;
+ getchar();
+ }
+
+ // first-second :
+ Persistence_landscape_on_grid lan = first - second;
+
+ if (dbg) {
+ std::cerr << "Difference : " << lan << std::endl;
+ }
+
+ //| first-second |:
+ lan.abs();
+
+ if (dbg) {
+ std::cerr << "Abs : " << lan << std::endl;
+ }
+
+ if (p < std::numeric_limits<double>::max()) {
+ // \int_{- \infty}^{+\infty}| first-second |^p
+ double result;
+ if (p != 1) {
+ if (dbg) {
+ std::cerr << "p : " << p << std::endl;
+ getchar();
+ }
+ result = lan.compute_integral_of_landscape(p);
+ if (dbg) {
+ std::cerr << "integral : " << result << std::endl;
+ getchar();
+ }
+ } else {
+ result = lan.compute_integral_of_landscape();
+ if (dbg) {
+ std::cerr << "integral, without power : " << result << std::endl;
+ getchar();
+ }
+ }
+ // (\int_{- \infty}^{+\infty}| first-second |^p)^(1/p)
+ return pow(result, 1.0 / p);
+ } else {
+ // p == infty
+ return lan.compute_maximum();
+ }
+ }
+
+ // Functions that are needed for that class to implement the concept.
+
+ /**
+ * The number of projections to R is defined to the number of nonzero landscape functions. I-th projection is an
+ *integral of i-th landscape function over whole R.
+ * This function is required by the Real_valued_topological_data concept.
+ * At the moment this function is not tested, since it is quite likely to be changed in the future. Given this, when
+ *using it, keep in mind that it
+ * will be most likely changed in the next versions.
+ **/
+ double project_to_R(int number_of_function) const {
+ return this->compute_integral_of_landscape((size_t)number_of_function);
+ }
+
+ /**
+ * The function gives the number of possible projections to R. This function is required by the
+ *Real_valued_topological_data concept.
+ **/
+ size_t number_of_projections_to_R() const { return number_of_functions_for_projections_to_reals; }
+
+ /**
+ * This function produce a vector of doubles based on a landscape. It is required in a concept
+ * Vectorized_topological_data
+ */
+ std::vector<double> vectorize(int number_of_function) const {
+ // TODO(PD) think of something smarter over here
+ if ((number_of_function < 0) || ((size_t)number_of_function >= this->values_of_landscapes.size())) {
+ throw "Wrong number of function\n";
+ }
+ std::vector<double> v(this->values_of_landscapes.size());
+ for (size_t i = 0; i != this->values_of_landscapes.size(); ++i) {
+ v[i] = 0;
+ if (this->values_of_landscapes[i].size() > (size_t)number_of_function) {
+ v[i] = this->values_of_landscapes[i][number_of_function];
+ }
+ }
+ return v;
+ }
+
+ /**
+ * This function return the number of functions that allows vectorization of persistence landscape. It is required in
+ *a concept Vectorized_topological_data.
+ **/
+ size_t number_of_vectorize_functions() const { return number_of_functions_for_vectorization; }
+
+ /**
+ * A function to compute averaged persistence landscape on a grid, based on vector of persistence landscapes on grid.
+ * This function is required by Topological_data_with_averages concept.
+ **/
+ void compute_average(const std::vector<Persistence_landscape_on_grid*>& to_average) {
+ bool dbg = false;
+ // After execution of this procedure, the average is supposed to be in the current object. To make sure that this is
+ // the case, we need to do some cleaning first.
+ this->values_of_landscapes.clear();
+ this->grid_min = this->grid_max = 0;
+
+ // if there is nothing to average, then the average is a zero landscape.
+ if (to_average.size() == 0) return;
+
+ // now we need to check if the grids in all objects of to_average are the same:
+ for (size_t i = 0; i != to_average.size(); ++i) {
+ if (!check_if_defined_on_the_same_domain(*(to_average[0]), *(to_average[i])))
+ throw "Two grids are not compatible";
+ }
+
+ this->values_of_landscapes = std::vector<std::vector<double> >((to_average[0])->values_of_landscapes.size());
+ this->grid_min = (to_average[0])->grid_min;
+ this->grid_max = (to_average[0])->grid_max;
+
+ if (dbg) {
+ std::cerr << "Computations of average. The data from the current landscape have been cleared. We are ready to do "
+ "the computations. \n";
+ }
+
+ // for every point in the grid:
+ for (size_t grid_point = 0; grid_point != (to_average[0])->values_of_landscapes.size(); ++grid_point) {
+ // set up a vector of the correct size:
+ size_t maximal_size_of_vector = 0;
+ for (size_t land_no = 0; land_no != to_average.size(); ++land_no) {
+ if ((to_average[land_no])->values_of_landscapes[grid_point].size() > maximal_size_of_vector)
+ maximal_size_of_vector = (to_average[land_no])->values_of_landscapes[grid_point].size();
+ }
+ this->values_of_landscapes[grid_point] = std::vector<double>(maximal_size_of_vector);
+
+ if (dbg) {
+ std::cerr << "We are considering the point : " << grid_point
+ << " of the grid. In this point, there are at most : " << maximal_size_of_vector
+ << " nonzero landscape functions \n";
+ }
+
+ // and compute an arithmetic average:
+ for (size_t land_no = 0; land_no != to_average.size(); ++land_no) {
+ // summing:
+ for (size_t i = 0; i != (to_average[land_no])->values_of_landscapes[grid_point].size(); ++i) {
+ // compute the average in a smarter way.
+ this->values_of_landscapes[grid_point][i] += (to_average[land_no])->values_of_landscapes[grid_point][i];
+ }
+ }
+ // normalizing:
+ for (size_t i = 0; i != this->values_of_landscapes[grid_point].size(); ++i) {
+ this->values_of_landscapes[grid_point][i] /= static_cast<double>(to_average.size());
+ }
+ }
+ } // compute_average
+
+ /**
+ * A function to compute distance between persistence landscape on a grid.
+ * The parameter of this function is a Persistence_landscape_on_grid.
+ * This function is required in Topological_data_with_distances concept.
+ * For max norm distance, set power to std::numeric_limits<double>::max()
+ **/
+ double distance(const Persistence_landscape_on_grid& second, double power = 1) const {
+ if (power < std::numeric_limits<double>::max()) {
+ return compute_distance_of_landscapes_on_grid(*this, second, power);
+ } else {
+ return compute_max_norm_distance_of_landscapes(*this, second);
+ }
+ }
+
+ /**
+ * A function to compute scalar product of persistence landscape on a grid.
+ * The parameter of this function is a Persistence_landscape_on_grid.
+ * This function is required in Topological_data_with_scalar_product concept.
+ **/
+ double compute_scalar_product(const Persistence_landscape_on_grid& second) {
+ return compute_inner_product((*this), second);
+ }
+
+ // end of implementation of functions needed for concepts.
+
+ /**
+ * A function that returns values of landscapes. It can be used for visualization
+ **/
+ std::vector<std::vector<double> > output_for_visualization() const { return this->values_of_landscapes; }
+
+ /**
+ * function used to create a gnuplot script for visualization of landscapes. Over here we need to specify which
+ *landscapes do we want to plot.
+ * In addition, the user may specify the range (min and max) where landscape is plot. The default values for min and
+ *max are std::numeric_limits<double>::max(). If the procedure detect those
+ * values, it will determine the range so that the whole landscape is supported there. If at least one min or max value
+ *is different from std::numeric_limits<double>::max(), then the values
+ * provided by the user will be used.
+ **/
+ void plot(const char* filename, size_t from_, size_t to_) const {
+ this->plot(filename, std::numeric_limits<double>::max(), std::numeric_limits<double>::max(),
+ std::numeric_limits<double>::max(), std::numeric_limits<double>::max(), from_, to_);
+ }
+
+ /**
+ * function used to create a gnuplot script for visualization of landscapes. Over here we can restrict also x and y
+ *range of the landscape.
+ **/
+ void plot(const char* filename, double min_x = std::numeric_limits<double>::max(),
+ double max_x = std::numeric_limits<double>::max(), double min_y = std::numeric_limits<double>::max(),
+ double max_y = std::numeric_limits<double>::max(), size_t from_ = std::numeric_limits<size_t>::max(),
+ size_t to_ = std::numeric_limits<size_t>::max()) const;
+
+ protected:
+ double grid_min;
+ double grid_max;
+ std::vector<std::vector<double> > values_of_landscapes;
+ size_t number_of_functions_for_vectorization;
+ size_t number_of_functions_for_projections_to_reals;
+
+ void set_up_numbers_of_functions_for_vectorization_and_projections_to_reals() {
+ // warning, this function can be only called after filling in the values_of_landscapes vector.
+ this->number_of_functions_for_vectorization = this->values_of_landscapes.size();
+ this->number_of_functions_for_projections_to_reals = this->values_of_landscapes.size();
+ }
+ void set_up_values_of_landscapes(const std::vector<std::pair<double, double> >& p, double grid_min_, double grid_max_,
+ size_t number_of_points_,
+ unsigned number_of_levels = std::numeric_limits<unsigned>::max());
+ Persistence_landscape_on_grid multiply_lanscape_by_real_number_not_overwrite(double x) const;
+};
+
+void Persistence_landscape_on_grid::set_up_values_of_landscapes(const std::vector<std::pair<double, double> >& p,
+ double grid_min_, double grid_max_,
+ size_t number_of_points_, unsigned number_of_levels) {
+ bool dbg = false;
+ if (dbg) {
+ std::cerr << "Here is the procedure : set_up_values_of_landscapes. The parameters are : grid_min_ : " << grid_min_
+ << ", grid_max_ : " << grid_max_ << ", number_of_points_ : " << number_of_points_
+ << ", number_of_levels: " << number_of_levels << std::endl;
+ std::cerr << "Here are the intervals at our disposal : \n";
+ for (size_t i = 0; i != p.size(); ++i) {
+ std::cerr << p[i].first << " , " << p[i].second << std::endl;
+ }
+ }
+
+ if ((grid_min_ == std::numeric_limits<double>::max()) || (grid_max_ == std::numeric_limits<double>::max())) {
+ // in this case, we need to find grid_min_ and grid_min_ based on the data.
+ double min = std::numeric_limits<double>::max();
+ double max = std::numeric_limits<double>::min();
+ for (size_t i = 0; i != p.size(); ++i) {
+ if (p[i].first < min) min = p[i].first;
+ if (p[i].second > max) max = p[i].second;
+ }
+ if (grid_min_ == std::numeric_limits<double>::max()) {
+ grid_min_ = min;
+ } else {
+ // in this case grid_max_ == std::numeric_limits<double>::max()
+ grid_max_ = max;
+ }
+ }
+
+ // if number_of_levels == std::numeric_limits<size_t>::max(), then we will have all the nonzero values of landscapes,
+ // and will store them in a vector
+ // if number_of_levels != std::numeric_limits<size_t>::max(), then we will use those vectors as heaps.
+ this->values_of_landscapes = std::vector<std::vector<double> >(number_of_points_ + 1);
+
+ this->grid_min = grid_min_;
+ this->grid_max = grid_max_;
+
+ if (grid_max_ <= grid_min_) {
+ throw "Wrong parameters of grid_min and grid_max given to the procedure. The program will now terminate.\n";
+ }
+
+ double dx = (grid_max_ - grid_min_) / static_cast<double>(number_of_points_);
+ // for every interval in the diagram:
+ for (size_t int_no = 0; int_no != p.size(); ++int_no) {
+ size_t grid_interval_begin = (p[int_no].first - grid_min_) / dx;
+ size_t grid_interval_end = (p[int_no].second - grid_min_) / dx;
+ size_t grid_interval_midpoint = (size_t)(0.5 * (grid_interval_begin + grid_interval_end));
+
+ if (dbg) {
+ std::cerr << "Considering an interval : " << p[int_no].first << "," << p[int_no].second << std::endl;
+
+ std::cerr << "grid_interval_begin : " << grid_interval_begin << std::endl;
+ std::cerr << "grid_interval_end : " << grid_interval_end << std::endl;
+ std::cerr << "grid_interval_midpoint : " << grid_interval_midpoint << std::endl;
+ }
+
+ double landscape_value = dx;
+ for (size_t i = grid_interval_begin + 1; i < grid_interval_midpoint; ++i) {
+ if (dbg) {
+ std::cerr << "Adding landscape value (going up) for a point : " << i << " equal : " << landscape_value
+ << std::endl;
+ }
+ if (number_of_levels != std::numeric_limits<unsigned>::max()) {
+ // we have a heap of no more that number_of_levels values.
+ // Note that if we are using heaps, we want to know the shortest distance in the heap.
+ // This is achieved by putting -distance to the heap.
+ if (this->values_of_landscapes[i].size() >= number_of_levels) {
+ // in this case, the full heap is build, and we need to check if the landscape_value is not larger than the
+ // smallest element in the heap.
+ if (-landscape_value < this->values_of_landscapes[i].front()) {
+ // if it is, we remove the largest value in the heap, and move on.
+ std::pop_heap(this->values_of_landscapes[i].begin(), this->values_of_landscapes[i].end());
+ this->values_of_landscapes[i][this->values_of_landscapes[i].size() - 1] = -landscape_value;
+ std::push_heap(this->values_of_landscapes[i].begin(), this->values_of_landscapes[i].end());
+ }
+ } else {
+ // in this case we are still filling in the array.
+ this->values_of_landscapes[i].push_back(-landscape_value);
+ if (this->values_of_landscapes[i].size() == number_of_levels - 1) {
+ // this->values_of_landscapes[i].size() == number_of_levels
+ // in this case we need to create the heap.
+ std::make_heap(this->values_of_landscapes[i].begin(), this->values_of_landscapes[i].end());
+ }
+ }
+ } else {
+ // we have vector of all values
+ this->values_of_landscapes[i].push_back(landscape_value);
+ }
+ landscape_value += dx;
+ }
+ for (size_t i = grid_interval_midpoint; i <= grid_interval_end; ++i) {
+ if (landscape_value > 0) {
+ if (number_of_levels != std::numeric_limits<unsigned>::max()) {
+ // we have a heap of no more that number_of_levels values
+ if (this->values_of_landscapes[i].size() >= number_of_levels) {
+ // in this case, the full heap is build, and we need to check if the landscape_value is not larger than the
+ // smallest element in the heap.
+ if (-landscape_value < this->values_of_landscapes[i].front()) {
+ // if it is, we remove the largest value in the heap, and move on.
+ std::pop_heap(this->values_of_landscapes[i].begin(), this->values_of_landscapes[i].end());
+ this->values_of_landscapes[i][this->values_of_landscapes[i].size() - 1] = -landscape_value;
+ std::push_heap(this->values_of_landscapes[i].begin(), this->values_of_landscapes[i].end());
+ }
+ } else {
+ // in this case we are still filling in the array.
+ this->values_of_landscapes[i].push_back(-landscape_value);
+ if (this->values_of_landscapes[i].size() == number_of_levels - 1) {
+ // this->values_of_landscapes[i].size() == number_of_levels
+ // in this case we need to create the heap.
+ std::make_heap(this->values_of_landscapes[i].begin(), this->values_of_landscapes[i].end());
+ }
+ }
+ } else {
+ this->values_of_landscapes[i].push_back(landscape_value);
+ }
+
+ if (dbg) {
+ std::cerr << "Adding landscape value (going down) for a point : " << i << " equal : " << landscape_value
+ << std::endl;
+ }
+ }
+ landscape_value -= dx;
+ }
+ }
+
+ if (number_of_levels != std::numeric_limits<unsigned>::max()) {
+ // in this case, vectors are used as heaps. And, since we want to have the smallest element at the top of
+ // each heap, we store minus distances. To get if right at the end, we need to multiply each value
+ // in the heap by -1 to get real vector of distances.
+ for (size_t pt = 0; pt != this->values_of_landscapes.size(); ++pt) {
+ for (size_t j = 0; j != this->values_of_landscapes[pt].size(); ++j) {
+ this->values_of_landscapes[pt][j] *= -1;
+ }
+ }
+ }
+
+ // and now we need to sort the values:
+ for (size_t pt = 0; pt != this->values_of_landscapes.size(); ++pt) {
+ std::sort(this->values_of_landscapes[pt].begin(), this->values_of_landscapes[pt].end(), std::greater<double>());
+ }
+} // set_up_values_of_landscapes
+
+Persistence_landscape_on_grid::Persistence_landscape_on_grid(const std::vector<std::pair<double, double> >& p,
+ double grid_min_, double grid_max_,
+ size_t number_of_points_) {
+ this->set_up_values_of_landscapes(p, grid_min_, grid_max_, number_of_points_);
+} // Persistence_landscape_on_grid
+
+Persistence_landscape_on_grid::Persistence_landscape_on_grid(const std::vector<std::pair<double, double> >& p,
+ double grid_min_, double grid_max_,
+ size_t number_of_points_,
+ unsigned number_of_levels_of_landscape) {
+ this->set_up_values_of_landscapes(p, grid_min_, grid_max_, number_of_points_, number_of_levels_of_landscape);
+}
+
+Persistence_landscape_on_grid::Persistence_landscape_on_grid(const char* filename, double grid_min_, double grid_max_,
+ size_t number_of_points_, uint16_t dimension) {
+ std::vector<std::pair<double, double> > p;
+ if (dimension == std::numeric_limits<uint16_t>::max()) {
+ p = read_persistence_intervals_in_one_dimension_from_file(filename);
+ } else {
+ p = read_persistence_intervals_in_one_dimension_from_file(filename, dimension);
+ }
+ this->set_up_values_of_landscapes(p, grid_min_, grid_max_, number_of_points_);
+}
+
+Persistence_landscape_on_grid::Persistence_landscape_on_grid(const char* filename, double grid_min_, double grid_max_,
+ size_t number_of_points_,
+ unsigned number_of_levels_of_landscape,
+ uint16_t dimension) {
+ std::vector<std::pair<double, double> > p;
+ if (dimension == std::numeric_limits<uint16_t>::max()) {
+ p = read_persistence_intervals_in_one_dimension_from_file(filename);
+ } else {
+ p = read_persistence_intervals_in_one_dimension_from_file(filename, dimension);
+ }
+ this->set_up_values_of_landscapes(p, grid_min_, grid_max_, number_of_points_, number_of_levels_of_landscape);
+}
+
+Persistence_landscape_on_grid::Persistence_landscape_on_grid(const char* filename, size_t number_of_points_,
+ uint16_t dimension) {
+ std::vector<std::pair<double, double> > p;
+ if (dimension == std::numeric_limits<uint16_t>::max()) {
+ p = read_persistence_intervals_in_one_dimension_from_file(filename);
+ } else {
+ p = read_persistence_intervals_in_one_dimension_from_file(filename, dimension);
+ }
+ double grid_min_ = std::numeric_limits<double>::max();
+ double grid_max_ = -std::numeric_limits<double>::max();
+ for (size_t i = 0; i != p.size(); ++i) {
+ if (p[i].first < grid_min_) grid_min_ = p[i].first;
+ if (p[i].second > grid_max_) grid_max_ = p[i].second;
+ }
+ this->set_up_values_of_landscapes(p, grid_min_, grid_max_, number_of_points_);
+}
+
+Persistence_landscape_on_grid::Persistence_landscape_on_grid(const char* filename, size_t number_of_points_,
+ unsigned number_of_levels_of_landscape,
+ uint16_t dimension) {
+ std::vector<std::pair<double, double> > p;
+ if (dimension == std::numeric_limits<uint16_t>::max()) {
+ p = read_persistence_intervals_in_one_dimension_from_file(filename);
+ } else {
+ p = read_persistence_intervals_in_one_dimension_from_file(filename, dimension);
+ }
+ double grid_min_ = std::numeric_limits<double>::max();
+ double grid_max_ = -std::numeric_limits<double>::max();
+ for (size_t i = 0; i != p.size(); ++i) {
+ if (p[i].first < grid_min_) grid_min_ = p[i].first;
+ if (p[i].second > grid_max_) grid_max_ = p[i].second;
+ }
+ this->set_up_values_of_landscapes(p, grid_min_, grid_max_, number_of_points_, number_of_levels_of_landscape);
+}
+
+void Persistence_landscape_on_grid::load_landscape_from_file(const char* filename) {
+ std::ifstream in;
+ in.open(filename);
+ // check if the file exist.
+ if (!in.good()) {
+ std::cerr << "The file : " << filename << " do not exist. The program will now terminate \n";
+ throw "The persistence landscape file do not exist. The program will now terminate \n";
+ }
+
+ size_t number_of_points_in_the_grid = 0;
+ in >> this->grid_min >> this->grid_max >> number_of_points_in_the_grid;
+
+ std::vector<std::vector<double> > v(number_of_points_in_the_grid);
+ std::string line;
+ std::getline(in, line);
+ double number;
+ for (size_t i = 0; i != number_of_points_in_the_grid; ++i) {
+ // read a line of a file and convert it to a vector.
+ std::vector<double> vv;
+ std::getline(in, line);
+ std::istringstream stream(line);
+ while (stream >> number) {
+ vv.push_back(number);
+ }
+ v[i] = vv;
+ }
+ this->values_of_landscapes = v;
+ in.close();
+}
+
+void Persistence_landscape_on_grid::print_to_file(const char* filename) const {
+ std::ofstream out;
+ out.open(filename);
+
+ // first we store the parameters of the grid:
+ out << grid_min << std::endl << grid_max << std::endl << this->values_of_landscapes.size() << std::endl;
+
+ // and now in the following lines, the values of this->values_of_landscapes for the following arguments:
+ for (size_t i = 0; i != this->values_of_landscapes.size(); ++i) {
+ for (size_t j = 0; j != this->values_of_landscapes[i].size(); ++j) {
+ out << this->values_of_landscapes[i][j] << " ";
+ }
+ out << std::endl;
+ }
+
+ out.close();
+}
+
+void Persistence_landscape_on_grid::plot(const char* filename, double min_x, double max_x, double min_y, double max_y,
+ size_t from_, size_t to_) const {
+ // this program create a gnuplot script file that allows to plot persistence diagram.
+ std::ofstream out;
+
+ std::ostringstream gnuplot_script;
+ gnuplot_script << filename << "_GnuplotScript";
+ out.open(gnuplot_script.str().c_str());
+
+ if (min_x == max_x) {
+ std::pair<double, double> min_max = compute_minimum_maximum();
+ out << "set xrange [" << this->grid_min << " : " << this->grid_max << "]" << std::endl;
+ out << "set yrange [" << min_max.first << " : " << min_max.second << "]" << std::endl;
+ } else {
+ out << "set xrange [" << min_x << " : " << max_x << "]" << std::endl;
+ out << "set yrange [" << min_y << " : " << max_y << "]" << std::endl;
+ }
+
+ size_t number_of_nonzero_levels = this->number_of_nonzero_levels();
+ double dx = (this->grid_max - this->grid_min) / static_cast<double>(this->values_of_landscapes.size() - 1);
+
+ size_t from = 0;
+ if (from_ != std::numeric_limits<size_t>::max()) {
+ if (from_ < number_of_nonzero_levels) {
+ from = from_;
+ } else {
+ return;
+ }
+ }
+ size_t to = number_of_nonzero_levels;
+ if (to_ != std::numeric_limits<size_t>::max()) {
+ if (to_ < number_of_nonzero_levels) {
+ to = to_;
+ }
+ }
+
+ out << "plot ";
+ for (size_t lambda = from; lambda != to; ++lambda) {
+ out << " '-' using 1:2 notitle with lp";
+ if (lambda + 1 != to) {
+ out << ", \\";
+ }
+ out << std::endl;
+ }
+
+ for (size_t lambda = from; lambda != to; ++lambda) {
+ double point = this->grid_min;
+ for (size_t i = 0; i != this->values_of_landscapes.size(); ++i) {
+ double value = 0;
+ if (this->values_of_landscapes[i].size() > lambda) {
+ value = this->values_of_landscapes[i][lambda];
+ }
+ out << point << " " << value << std::endl;
+ point += dx;
+ }
+ out << "EOF" << std::endl;
+ }
+ std::cout << "To visualize, install gnuplot and type the command: gnuplot -persist -e \"load \'"
+ << gnuplot_script.str().c_str() << "\'\"" << std::endl;
+}
+
+template <typename T>
+Persistence_landscape_on_grid operation_on_pair_of_landscapes_on_grid(const Persistence_landscape_on_grid& land1,
+ const Persistence_landscape_on_grid& land2) {
+ // first we need to check if the domains are the same:
+ if (!check_if_defined_on_the_same_domain(land1, land2)) throw "Two grids are not compatible";
+
+ T oper;
+ Persistence_landscape_on_grid result;
+ result.values_of_landscapes = std::vector<std::vector<double> >(land1.values_of_landscapes.size());
+ result.grid_min = land1.grid_min;
+ result.grid_max = land1.grid_max;
+
+ // now we perform the operations:
+ for (size_t grid_point = 0; grid_point != land1.values_of_landscapes.size(); ++grid_point) {
+ result.values_of_landscapes[grid_point] = std::vector<double>(
+ std::max(land1.values_of_landscapes[grid_point].size(), land2.values_of_landscapes[grid_point].size()));
+ for (size_t lambda = 0; lambda != std::max(land1.values_of_landscapes[grid_point].size(),
+ land2.values_of_landscapes[grid_point].size());
+ ++lambda) {
+ double value1 = 0;
+ double value2 = 0;
+ if (lambda < land1.values_of_landscapes[grid_point].size())
+ value1 = land1.values_of_landscapes[grid_point][lambda];
+ if (lambda < land2.values_of_landscapes[grid_point].size())
+ value2 = land2.values_of_landscapes[grid_point][lambda];
+ result.values_of_landscapes[grid_point][lambda] = oper(value1, value2);
+ }
+ }
+
+ return result;
+}
+
+Persistence_landscape_on_grid Persistence_landscape_on_grid::multiply_lanscape_by_real_number_not_overwrite(
+ double x) const {
+ Persistence_landscape_on_grid result;
+ result.values_of_landscapes = std::vector<std::vector<double> >(this->values_of_landscapes.size());
+ result.grid_min = this->grid_min;
+ result.grid_max = this->grid_max;
+
+ for (size_t grid_point = 0; grid_point != this->values_of_landscapes.size(); ++grid_point) {
+ result.values_of_landscapes[grid_point] = std::vector<double>(this->values_of_landscapes[grid_point].size());
+ for (size_t i = 0; i != this->values_of_landscapes[grid_point].size(); ++i) {
+ result.values_of_landscapes[grid_point][i] = x * this->values_of_landscapes[grid_point][i];
+ }
+ }
+
+ return result;
+}
+
+double compute_max_norm_distance_of_landscapes(const Persistence_landscape_on_grid& first,
+ const Persistence_landscape_on_grid& second) {
+ double result = 0;
+
+ // first we need to check if first and second is defined on the same domain"
+ if (!check_if_defined_on_the_same_domain(first, second)) throw "Two grids are not compatible";
+
+ for (size_t i = 0; i != first.values_of_landscapes.size(); ++i) {
+ for (size_t j = 0; j != std::min(first.values_of_landscapes[i].size(), second.values_of_landscapes[i].size());
+ ++j) {
+ if (result < abs(first.values_of_landscapes[i][j] - second.values_of_landscapes[i][j])) {
+ result = abs(first.values_of_landscapes[i][j] - second.values_of_landscapes[i][j]);
+ }
+ }
+ if (first.values_of_landscapes[i].size() ==
+ std::min(first.values_of_landscapes[i].size(), second.values_of_landscapes[i].size())) {
+ for (size_t j = first.values_of_landscapes[i].size(); j != second.values_of_landscapes[i].size(); ++j) {
+ if (result < second.values_of_landscapes[i][j]) result = second.values_of_landscapes[i][j];
+ }
+ }
+ if (second.values_of_landscapes[i].size() ==
+ std::min(first.values_of_landscapes[i].size(), second.values_of_landscapes[i].size())) {
+ for (size_t j = second.values_of_landscapes[i].size(); j != first.values_of_landscapes[i].size(); ++j) {
+ if (result < first.values_of_landscapes[i][j]) result = first.values_of_landscapes[i][j];
+ }
+ }
+ }
+ return result;
+}
+
+} // namespace Persistence_representations
+} // namespace Gudhi
+
+#endif // PERSISTENCE_LANDSCAPE_ON_GRID_H_
diff --git a/include/gudhi/Persistence_vectors.h b/include/gudhi/Persistence_vectors.h
new file mode 100644
index 00000000..63577e46
--- /dev/null
+++ b/include/gudhi/Persistence_vectors.h
@@ -0,0 +1,640 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef PERSISTENCE_VECTORS_H_
+#define PERSISTENCE_VECTORS_H_
+
+// gudhi include
+#include <gudhi/read_persistence_from_file.h>
+#include <gudhi/common_persistence_representations.h>
+#include <gudhi/distance_functions.h>
+
+#include <fstream>
+#include <cmath>
+#include <algorithm>
+#include <iostream>
+#include <limits>
+#include <functional>
+#include <utility>
+#include <vector>
+
+namespace Gudhi {
+namespace Persistence_representations {
+
+template <typename T>
+struct Maximum_distance {
+ double operator()(const std::pair<T, T>& f, const std::pair<T, T>& s) {
+ return std::max(fabs(f.first - s.first), fabs(f.second - s.second));
+ }
+};
+
+/**
+ * \class Vector_distances_in_diagram Persistence_vectors.h gudhi/Persistence_vectors.h
+ * \brief A class implementing persistence vectors.
+ *
+ * \ingroup Persistence_representations
+ *
+ * \details
+ * This is an implementation of idea presented in the paper <i>Stable Topological Signatures for Points on 3D
+ * Shapes</i> \cite Carriere_Oudot_Ovsjanikov_top_signatures_3d .<br>
+ * The parameter of the class is the class that computes distance used to construct the vectors. The typical function
+ * is either Euclidean of maximum (Manhattan) distance.
+ *
+ * This class implements the following concepts: Vectorized_topological_data, Topological_data_with_distances,
+ * Real_valued_topological_data, Topological_data_with_averages, Topological_data_with_scalar_product
+ **/
+template <typename F>
+class Vector_distances_in_diagram {
+ public:
+ /**
+ * The default constructor.
+ **/
+ Vector_distances_in_diagram() {}
+
+ /**
+ * The constructor that takes as an input a multiset of persistence intervals (given as vector of birth-death
+ *pairs). The second parameter is the desired length of the output vectors.
+ **/
+ Vector_distances_in_diagram(const std::vector<std::pair<double, double> >& intervals, size_t where_to_cut);
+
+ /**
+ * The constructor taking as an input a file with birth-death pairs. The second parameter is the desired length of
+ *the output vectors.
+ **/
+ Vector_distances_in_diagram(const char* filename, size_t where_to_cut,
+ unsigned dimension = std::numeric_limits<unsigned>::max());
+
+ /**
+ * Writing to a stream.
+ **/
+ template <typename K>
+ friend std::ostream& operator<<(std::ostream& out, const Vector_distances_in_diagram<K>& d) {
+ for (size_t i = 0; i != std::min(d.sorted_vector_of_distances.size(), d.where_to_cut); ++i) {
+ out << d.sorted_vector_of_distances[i] << " ";
+ }
+ return out;
+ }
+
+ /**
+ * This procedure gives the value of a vector on a given position.
+ **/
+ inline double vector_in_position(size_t position) const {
+ if (position >= this->sorted_vector_of_distances.size())
+ throw("Wrong position in accessing Vector_distances_in_diagram::sorted_vector_of_distances\n");
+ return this->sorted_vector_of_distances[position];
+ }
+
+ /**
+ * Return a size of a vector.
+ **/
+ inline size_t size() const { return this->sorted_vector_of_distances.size(); }
+
+ /**
+ * Write a vector to a file.
+ **/
+ void write_to_file(const char* filename) const;
+
+ /**
+ * Write a vector to a file.
+ **/
+ void print_to_file(const char* filename) const { this->write_to_file(filename); }
+
+ /**
+ * Loading a vector to a file.
+ **/
+ void load_from_file(const char* filename);
+
+ /**
+ * Comparison operators:
+ **/
+ bool operator==(const Vector_distances_in_diagram& second) const {
+ if (this->sorted_vector_of_distances.size() != second.sorted_vector_of_distances.size()) return false;
+ for (size_t i = 0; i != this->sorted_vector_of_distances.size(); ++i) {
+ if (!almost_equal(this->sorted_vector_of_distances[i], second.sorted_vector_of_distances[i])) return false;
+ }
+ return true;
+ }
+
+ bool operator!=(const Vector_distances_in_diagram& second) const { return !(*this == second); }
+
+ // Implementations of functions for various concepts.
+ /**
+ * Compute projection to real numbers of persistence vector. This function is required by the
+ *Real_valued_topological_data concept
+ * At the moment this function is not tested, since it is quite likely to be changed in the future. Given this, when
+ *using it, keep in mind that it
+ * will be most likely changed in the next versions.
+ **/
+ double project_to_R(int number_of_function) const;
+ /**
+ * The function gives the number of possible projections to R. This function is required by the
+ *Real_valued_topological_data concept.
+ **/
+ size_t number_of_projections_to_R() const { return this->number_of_functions_for_projections_to_reals; }
+
+ /**
+ * Compute a vectorization of a persistent vectors. It is required in a concept Vectorized_topological_data.
+ **/
+ std::vector<double> vectorize(int number_of_function) const;
+ /**
+ * This function return the number of functions that allows vectorization of a persistence vector. It is required
+ *in a concept Vectorized_topological_data.
+ **/
+ size_t number_of_vectorize_functions() const { return this->number_of_functions_for_vectorization; }
+
+ /**
+ * Compute a average of two persistent vectors. This function is required by Topological_data_with_averages concept.
+ **/
+ void compute_average(const std::vector<Vector_distances_in_diagram*>& to_average);
+
+ /**
+ * Compute a distance of two persistent vectors. This function is required in Topological_data_with_distances concept.
+ * For max norm distance, set power to std::numeric_limits<double>::max()
+ **/
+ double distance(const Vector_distances_in_diagram& second, double power = 1) const;
+
+ /**
+ * Compute a scalar product of two persistent vectors. This function is required in
+ *Topological_data_with_scalar_product concept.
+ **/
+ double compute_scalar_product(const Vector_distances_in_diagram& second) const;
+ // end of implementation of functions needed for concepts.
+
+ /**
+ * For visualization use output from vectorize and build histograms.
+ **/
+ std::vector<double> output_for_visualization() const { return this->sorted_vector_of_distances; }
+
+ /**
+ * Create a gnuplot script to visualize the data structure.
+ **/
+ void plot(const char* filename) const {
+ std::stringstream gnuplot_script;
+ gnuplot_script << filename << "_GnuplotScript";
+ std::ofstream out;
+ out.open(gnuplot_script.str().c_str());
+ out << "set style data histogram" << std::endl;
+ out << "set style histogram cluster gap 1" << std::endl;
+ out << "set style fill solid border -1" << std::endl;
+ out << "plot '-' notitle" << std::endl;
+ for (size_t i = 0; i != this->sorted_vector_of_distances.size(); ++i) {
+ out << this->sorted_vector_of_distances[i] << std::endl;
+ }
+ out << std::endl;
+ out.close();
+ std::cout << "To visualize, install gnuplot and type the command: gnuplot -persist -e \"load \'"
+ << gnuplot_script.str().c_str() << "\'\"" << std::endl;
+ }
+
+ /**
+ * The x-range of the persistence vector.
+ **/
+ std::pair<double, double> get_x_range() const { return std::make_pair(0, this->sorted_vector_of_distances.size()); }
+
+ /**
+ * The y-range of the persistence vector.
+ **/
+ std::pair<double, double> get_y_range() const {
+ if (this->sorted_vector_of_distances.size() == 0) return std::make_pair(0, 0);
+ return std::make_pair(this->sorted_vector_of_distances[0], 0);
+ }
+
+ // arithmetic operations:
+ template <typename Operation_type>
+ friend Vector_distances_in_diagram operation_on_pair_of_vectors(const Vector_distances_in_diagram& first,
+ const Vector_distances_in_diagram& second,
+ Operation_type opertion) {
+ Vector_distances_in_diagram result;
+ // Operation_type operation;
+ result.sorted_vector_of_distances.reserve(
+ std::max(first.sorted_vector_of_distances.size(), second.sorted_vector_of_distances.size()));
+ for (size_t i = 0; i != std::min(first.sorted_vector_of_distances.size(), second.sorted_vector_of_distances.size());
+ ++i) {
+ result.sorted_vector_of_distances.push_back(
+ opertion(first.sorted_vector_of_distances[i], second.sorted_vector_of_distances[i]));
+ }
+ if (first.sorted_vector_of_distances.size() ==
+ std::min(first.sorted_vector_of_distances.size(), second.sorted_vector_of_distances.size())) {
+ for (size_t i = std::min(first.sorted_vector_of_distances.size(), second.sorted_vector_of_distances.size());
+ i != std::max(first.sorted_vector_of_distances.size(), second.sorted_vector_of_distances.size()); ++i) {
+ result.sorted_vector_of_distances.push_back(opertion(0, second.sorted_vector_of_distances[i]));
+ }
+ } else {
+ for (size_t i = std::min(first.sorted_vector_of_distances.size(), second.sorted_vector_of_distances.size());
+ i != std::max(first.sorted_vector_of_distances.size(), second.sorted_vector_of_distances.size()); ++i) {
+ result.sorted_vector_of_distances.push_back(opertion(first.sorted_vector_of_distances[i], 0));
+ }
+ }
+ return result;
+ } // operation_on_pair_of_vectors
+
+ /**
+ * This function implements an operation of multiplying Vector_distances_in_diagram by a scalar.
+ **/
+ Vector_distances_in_diagram multiply_by_scalar(double scalar) const {
+ Vector_distances_in_diagram result;
+ result.sorted_vector_of_distances.reserve(this->sorted_vector_of_distances.size());
+ for (size_t i = 0; i != this->sorted_vector_of_distances.size(); ++i) {
+ result.sorted_vector_of_distances.push_back(scalar * this->sorted_vector_of_distances[i]);
+ }
+ return result;
+ } // multiply_by_scalar
+
+ /**
+ * This function computes a sum of two objects of a type Vector_distances_in_diagram.
+ **/
+ friend Vector_distances_in_diagram operator+(const Vector_distances_in_diagram& first,
+ const Vector_distances_in_diagram& second) {
+ return operation_on_pair_of_vectors(first, second, std::plus<double>());
+ }
+ /**
+* This function computes a difference of two objects of a type Vector_distances_in_diagram.
+**/
+ friend Vector_distances_in_diagram operator-(const Vector_distances_in_diagram& first,
+ const Vector_distances_in_diagram& second) {
+ return operation_on_pair_of_vectors(first, second, std::minus<double>());
+ }
+ /**
+* This function computes a product of an object of a type Vector_distances_in_diagram with real number.
+**/
+ friend Vector_distances_in_diagram operator*(double scalar, const Vector_distances_in_diagram& A) {
+ return A.multiply_by_scalar(scalar);
+ }
+ /**
+* This function computes a product of an object of a type Vector_distances_in_diagram with real number.
+**/
+ friend Vector_distances_in_diagram operator*(const Vector_distances_in_diagram& A, double scalar) {
+ return A.multiply_by_scalar(scalar);
+ }
+ /**
+* This function computes a product of an object of a type Vector_distances_in_diagram with real number.
+**/
+ Vector_distances_in_diagram operator*(double scalar) { return this->multiply_by_scalar(scalar); }
+ /**
+ * += operator for Vector_distances_in_diagram.
+ **/
+ Vector_distances_in_diagram operator+=(const Vector_distances_in_diagram& rhs) {
+ *this = *this + rhs;
+ return *this;
+ }
+ /**
+ * -= operator for Vector_distances_in_diagram.
+ **/
+ Vector_distances_in_diagram operator-=(const Vector_distances_in_diagram& rhs) {
+ *this = *this - rhs;
+ return *this;
+ }
+ /**
+ * *= operator for Vector_distances_in_diagram.
+ **/
+ Vector_distances_in_diagram operator*=(double x) {
+ *this = *this * x;
+ return *this;
+ }
+ /**
+ * /= operator for Vector_distances_in_diagram.
+ **/
+ Vector_distances_in_diagram operator/=(double x) {
+ if (x == 0) throw("In operator /=, division by 0. Program terminated.");
+ *this = *this * (1 / x);
+ return *this;
+ }
+
+ private:
+ std::vector<std::pair<double, double> > intervals;
+ std::vector<double> sorted_vector_of_distances;
+ size_t number_of_functions_for_vectorization;
+ size_t number_of_functions_for_projections_to_reals;
+ size_t where_to_cut;
+
+ void compute_sorted_vector_of_distances_via_heap(size_t where_to_cut);
+ void compute_sorted_vector_of_distances_via_vector_sorting(size_t where_to_cut);
+
+ Vector_distances_in_diagram(const std::vector<double>& sorted_vector_of_distances_)
+ : sorted_vector_of_distances(sorted_vector_of_distances_) {
+ this->set_up_numbers_of_functions_for_vectorization_and_projections_to_reals();
+ }
+
+ void set_up_numbers_of_functions_for_vectorization_and_projections_to_reals() {
+ // warning, this function can be only called after filling in the intervals vector.
+ this->number_of_functions_for_vectorization = this->sorted_vector_of_distances.size();
+ this->number_of_functions_for_projections_to_reals = this->sorted_vector_of_distances.size();
+ }
+};
+
+template <typename F>
+Vector_distances_in_diagram<F>::Vector_distances_in_diagram(const std::vector<std::pair<double, double> >& intervals_,
+ size_t where_to_cut_)
+ : where_to_cut(where_to_cut_) {
+ std::vector<std::pair<double, double> > i(intervals_);
+ this->intervals = i;
+ // this->compute_sorted_vector_of_distances_via_heap( where_to_cut );
+ this->compute_sorted_vector_of_distances_via_vector_sorting(where_to_cut);
+ this->set_up_numbers_of_functions_for_vectorization_and_projections_to_reals();
+}
+
+template <typename F>
+Vector_distances_in_diagram<F>::Vector_distances_in_diagram(const char* filename, size_t where_to_cut,
+ unsigned dimension)
+ : where_to_cut(where_to_cut) {
+ std::vector<std::pair<double, double> > intervals;
+ if (dimension == std::numeric_limits<unsigned>::max()) {
+ intervals = read_persistence_intervals_in_one_dimension_from_file(filename);
+ } else {
+ intervals = read_persistence_intervals_in_one_dimension_from_file(filename, dimension);
+ }
+ this->intervals = intervals;
+ this->compute_sorted_vector_of_distances_via_heap(where_to_cut);
+ // this->compute_sorted_vector_of_distances_via_vector_sorting( where_to_cut );
+ set_up_numbers_of_functions_for_vectorization_and_projections_to_reals();
+}
+
+template <typename F>
+void Vector_distances_in_diagram<F>::compute_sorted_vector_of_distances_via_heap(size_t where_to_cut) {
+ bool dbg = false;
+ if (dbg) {
+ std::cerr << "Here are the intervals : \n";
+ for (size_t i = 0; i != this->intervals.size(); ++i) {
+ std::cerr << this->intervals[i].first << " , " << this->intervals[i].second << std::endl;
+ }
+ }
+ where_to_cut = std::min(
+ where_to_cut, (size_t)(0.5 * this->intervals.size() * (this->intervals.size() - 1) + this->intervals.size()));
+
+ std::vector<double> heap(where_to_cut, std::numeric_limits<int>::max());
+ std::make_heap(heap.begin(), heap.end());
+ F f;
+
+ // for every pair of points in the diagram, compute the minimum of their distance, and distance of those points from
+ // diagonal
+ for (size_t i = 0; i < this->intervals.size(); ++i) {
+ for (size_t j = i + 1; j < this->intervals.size(); ++j) {
+ double value = std::min(
+ f(this->intervals[i], this->intervals[j]),
+ std::min(
+ f(this->intervals[i], std::make_pair(0.5 * (this->intervals[i].first + this->intervals[i].second),
+ 0.5 * (this->intervals[i].first + this->intervals[i].second))),
+ f(this->intervals[j], std::make_pair(0.5 * (this->intervals[j].first + this->intervals[j].second),
+ 0.5 * (this->intervals[j].first + this->intervals[j].second)))));
+
+ if (dbg) {
+ std::cerr << "Value : " << value << std::endl;
+ std::cerr << "heap.front() : " << heap.front() << std::endl;
+ getchar();
+ }
+
+ if (-value < heap.front()) {
+ if (dbg) {
+ std::cerr << "Replacing : " << heap.front() << " with : " << -value << std::endl;
+ getchar();
+ }
+ // remove the first element from the heap
+ std::pop_heap(heap.begin(), heap.end());
+ // heap.pop_back();
+ // and put value there instead:
+ // heap.push_back(-value);
+ heap[where_to_cut - 1] = -value;
+ std::push_heap(heap.begin(), heap.end());
+ }
+ }
+ }
+
+ // now add distances of all points from diagonal
+ for (size_t i = 0; i < this->intervals.size(); ++i) {
+ double value = f(this->intervals[i], std::make_pair(0.5 * (this->intervals[i].first + this->intervals[i].second),
+ 0.5 * (this->intervals[i].first + this->intervals[i].second)));
+ if (-value < heap.front()) {
+ // remove the first element from the heap
+ std::pop_heap(heap.begin(), heap.end());
+ // heap.pop_back();
+ // and put value there instead:
+ // heap.push_back(-value);
+ heap[where_to_cut - 1] = -value;
+ std::push_heap(heap.begin(), heap.end());
+ }
+ }
+
+ std::sort_heap(heap.begin(), heap.end());
+ for (size_t i = 0; i != heap.size(); ++i) {
+ if (heap[i] == std::numeric_limits<int>::max()) {
+ heap[i] = 0;
+ } else {
+ heap[i] *= -1;
+ }
+ }
+
+ if (dbg) {
+ std::cerr << "This is the heap after all the operations :\n";
+ for (size_t i = 0; i != heap.size(); ++i) {
+ std::cout << heap[i] << " ";
+ }
+ std::cout << std::endl;
+ }
+
+ this->sorted_vector_of_distances = heap;
+}
+
+template <typename F>
+void Vector_distances_in_diagram<F>::compute_sorted_vector_of_distances_via_vector_sorting(size_t where_to_cut) {
+ std::vector<double> distances;
+ distances.reserve((size_t)(0.5 * this->intervals.size() * (this->intervals.size() - 1) + this->intervals.size()));
+ F f;
+
+ // for every pair of points in the diagram, compute the minimum of their distance, and distance of those points from
+ // diagonal
+ for (size_t i = 0; i < this->intervals.size(); ++i) {
+ // add distance of i-th point in the diagram from the diagonal to the distances vector
+ distances.push_back(
+ f(this->intervals[i], std::make_pair(0.5 * (this->intervals[i].first + this->intervals[i].second),
+ 0.5 * (this->intervals[i].first + this->intervals[i].second))));
+ for (size_t j = i + 1; j < this->intervals.size(); ++j) {
+ double value = std::min(
+ f(this->intervals[i], this->intervals[j]),
+ std::min(
+ f(this->intervals[i], std::make_pair(0.5 * (this->intervals[i].first + this->intervals[i].second),
+ 0.5 * (this->intervals[i].first + this->intervals[i].second))),
+ f(this->intervals[j], std::make_pair(0.5 * (this->intervals[j].first + this->intervals[j].second),
+ 0.5 * (this->intervals[j].first + this->intervals[j].second)))));
+ distances.push_back(value);
+ }
+ }
+ std::sort(distances.begin(), distances.end(), std::greater<double>());
+ if (distances.size() > where_to_cut) distances.resize(where_to_cut);
+
+ this->sorted_vector_of_distances = distances;
+}
+
+// Implementations of functions for various concepts.
+template <typename F>
+double Vector_distances_in_diagram<F>::project_to_R(int number_of_function) const {
+ if ((size_t)number_of_function > this->number_of_functions_for_projections_to_reals)
+ throw "Wrong index of a function in a method Vector_distances_in_diagram<F>::project_to_R";
+ if (number_of_function < 0)
+ throw "Wrong index of a function in a method Vector_distances_in_diagram<F>::project_to_R";
+
+ double result = 0;
+ for (size_t i = 0; i != (size_t)number_of_function; ++i) {
+ result += sorted_vector_of_distances[i];
+ }
+ return result;
+}
+
+template <typename F>
+void Vector_distances_in_diagram<F>::compute_average(const std::vector<Vector_distances_in_diagram*>& to_average) {
+ if (to_average.size() == 0) {
+ (*this) = Vector_distances_in_diagram<F>();
+ return;
+ }
+
+ size_t maximal_length_of_vector = 0;
+ for (size_t i = 0; i != to_average.size(); ++i) {
+ if (to_average[i]->sorted_vector_of_distances.size() > maximal_length_of_vector) {
+ maximal_length_of_vector = to_average[i]->sorted_vector_of_distances.size();
+ }
+ }
+
+ std::vector<double> av(maximal_length_of_vector, 0);
+ for (size_t i = 0; i != to_average.size(); ++i) {
+ for (size_t j = 0; j != to_average[i]->sorted_vector_of_distances.size(); ++j) {
+ av[j] += to_average[i]->sorted_vector_of_distances[j];
+ }
+ }
+
+ for (size_t i = 0; i != maximal_length_of_vector; ++i) {
+ av[i] /= static_cast<double>(to_average.size());
+ }
+ this->sorted_vector_of_distances = av;
+ this->where_to_cut = av.size();
+}
+
+template <typename F>
+double Vector_distances_in_diagram<F>::distance(const Vector_distances_in_diagram& second_, double power) const {
+ bool dbg = false;
+
+ if (dbg) {
+ std::cerr << "Entering double Vector_distances_in_diagram<F>::distance( const Abs_Topological_data_with_distances* "
+ "second , double power ) procedure \n";
+ std::cerr << "Power : " << power << std::endl;
+ std::cerr << "This : " << *this << std::endl;
+ std::cerr << "second : " << second_ << std::endl;
+ }
+
+ double result = 0;
+ for (size_t i = 0; i != std::min(this->sorted_vector_of_distances.size(), second_.sorted_vector_of_distances.size());
+ ++i) {
+ if (power == 1) {
+ if (dbg) {
+ std::cerr << "|" << this->sorted_vector_of_distances[i] << " - " << second_.sorted_vector_of_distances[i]
+ << " | : " << fabs(this->sorted_vector_of_distances[i] - second_.sorted_vector_of_distances[i])
+ << std::endl;
+ }
+ result += fabs(this->sorted_vector_of_distances[i] - second_.sorted_vector_of_distances[i]);
+ } else {
+ if (power < std::numeric_limits<double>::max()) {
+ result += std::pow(fabs(this->sorted_vector_of_distances[i] - second_.sorted_vector_of_distances[i]), power);
+ } else {
+ // max norm
+ if (result < fabs(this->sorted_vector_of_distances[i] - second_.sorted_vector_of_distances[i]))
+ result = fabs(this->sorted_vector_of_distances[i] - second_.sorted_vector_of_distances[i]);
+ }
+ if (dbg) {
+ std::cerr << "| " << this->sorted_vector_of_distances[i] << " - " << second_.sorted_vector_of_distances[i]
+ << " : " << fabs(this->sorted_vector_of_distances[i] - second_.sorted_vector_of_distances[i])
+ << std::endl;
+ }
+ }
+ }
+ if (this->sorted_vector_of_distances.size() != second_.sorted_vector_of_distances.size()) {
+ if (this->sorted_vector_of_distances.size() > second_.sorted_vector_of_distances.size()) {
+ for (size_t i = second_.sorted_vector_of_distances.size(); i != this->sorted_vector_of_distances.size(); ++i) {
+ result += fabs(this->sorted_vector_of_distances[i]);
+ }
+ } else {
+ // this->sorted_vector_of_distances.size() < second_.sorted_vector_of_distances.size()
+ for (size_t i = this->sorted_vector_of_distances.size(); i != second_.sorted_vector_of_distances.size(); ++i) {
+ result += fabs(second_.sorted_vector_of_distances[i]);
+ }
+ }
+ }
+
+ if (power != 1) {
+ result = std::pow(result, (1.0 / power));
+ }
+ return result;
+}
+
+template <typename F>
+std::vector<double> Vector_distances_in_diagram<F>::vectorize(int number_of_function) const {
+ if ((size_t)number_of_function > this->number_of_functions_for_vectorization)
+ throw "Wrong index of a function in a method Vector_distances_in_diagram<F>::vectorize";
+ if (number_of_function < 0) throw "Wrong index of a function in a method Vector_distances_in_diagram<F>::vectorize";
+
+ std::vector<double> result(std::min((size_t)number_of_function, this->sorted_vector_of_distances.size()));
+ for (size_t i = 0; i != std::min((size_t)number_of_function, this->sorted_vector_of_distances.size()); ++i) {
+ result[i] = this->sorted_vector_of_distances[i];
+ }
+ return result;
+}
+
+template <typename F>
+void Vector_distances_in_diagram<F>::write_to_file(const char* filename) const {
+ std::ofstream out;
+ out.open(filename);
+
+ for (size_t i = 0; i != this->sorted_vector_of_distances.size(); ++i) {
+ out << this->sorted_vector_of_distances[i] << " ";
+ }
+
+ out.close();
+}
+
+template <typename F>
+void Vector_distances_in_diagram<F>::load_from_file(const char* filename) {
+ std::ifstream in;
+ in.open(filename);
+ // check if the file exist.
+ if (!in.good()) {
+ std::cerr << "The file : " << filename << " do not exist. The program will now terminate \n";
+ throw "The persistence landscape file do not exist. The program will now terminate \n";
+ }
+
+ double number;
+ while (in >> number) {
+ this->sorted_vector_of_distances.push_back(number);
+ }
+ in.close();
+}
+
+template <typename F>
+double Vector_distances_in_diagram<F>::compute_scalar_product(const Vector_distances_in_diagram& second_vector) const {
+ double result = 0;
+ for (size_t i = 0;
+ i != std::min(this->sorted_vector_of_distances.size(), second_vector.sorted_vector_of_distances.size()); ++i) {
+ result += this->sorted_vector_of_distances[i] * second_vector.sorted_vector_of_distances[i];
+ }
+ return result;
+}
+
+} // namespace Persistence_representations
+} // namespace Gudhi
+
+#endif // PERSISTENCE_VECTORS_H_
diff --git a/include/gudhi/Simplex_tree.h b/include/gudhi/Simplex_tree.h
index 37b3ea97..7456cb1f 100644
--- a/include/gudhi/Simplex_tree.h
+++ b/include/gudhi/Simplex_tree.h
@@ -49,6 +49,7 @@
#include <initializer_list>
#include <algorithm> // for std::max
#include <cstdint> // for std::uint32_t
+#include <iterator> // for std::distance
namespace Gudhi {
@@ -106,8 +107,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 +123,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,
@@ -391,13 +393,13 @@ class Simplex_tree {
return sh->second.key();
}
- /** \brief Returns the simplex associated to a key.
+ /** \brief Returns the simplex that has index idx in the filtration.
*
* The filtration must be initialized.
* \pre SimplexTreeOptions::store_key
*/
- Simplex_handle simplex(Simplex_key key) const {
- return filtration_vect_[key];
+ Simplex_handle simplex(Simplex_key idx) const {
+ return filtration_vect_[idx];
}
/** \brief Returns the filtration value of a simplex.
@@ -482,7 +484,17 @@ class Simplex_tree {
}
/** \brief Returns an upper bound on the dimension of the simplicial complex. */
- int dimension() const {
+ int upper_bound_dimension() const {
+ return dimension_;
+ }
+
+ /** \brief Returns the dimension of the simplicial complex.
+ \details This function is not constant time because it can recompute dimension if required (can be triggered by
+ `remove_maximal_simplex()` or `prune_above_filtration()`).
+ */
+ int dimension() {
+ if (dimension_to_be_lowered_)
+ lower_upper_bound_dimension();
return dimension_;
}
@@ -490,6 +502,7 @@ class Simplex_tree {
* sh has children.*/
template<class SimplexHandle>
bool has_children(SimplexHandle sh) const {
+ // Here we rely on the root using null_vertex(), which cannot match any real vertex.
return (sh->second.children()->parent() == sh->first);
}
@@ -519,18 +532,30 @@ class Simplex_tree {
Simplex_handle find_simplex(const std::vector<Vertex_handle> & simplex) {
Siblings * tmp_sib = &root_;
Dictionary_it tmp_dit;
- Vertex_handle last = simplex.back();
- for (auto v : simplex) {
- tmp_dit = tmp_sib->members_.find(v);
- if (tmp_dit == tmp_sib->members_.end()) {
+ auto vi = simplex.begin();
+ if (Options::contiguous_vertices) {
+ // Equivalent to the first iteration of the normal loop
+ GUDHI_CHECK(contiguous_vertices(), "non-contiguous vertices");
+ Vertex_handle v = *vi++;
+ if(v < 0 || v >= static_cast<Vertex_handle>(root_.members_.size()))
return null_simplex();
- }
- if (!has_children(tmp_dit) && v != last) {
+ tmp_dit = root_.members_.begin() + v;
+ if (vi == simplex.end())
+ return tmp_dit;
+ if (!has_children(tmp_dit))
+ return null_simplex();
+ tmp_sib = tmp_dit->second.children();
+ }
+ for (;;) {
+ tmp_dit = tmp_sib->members_.find(*vi++);
+ if (tmp_dit == tmp_sib->members_.end())
+ return null_simplex();
+ if (vi == simplex.end())
+ return tmp_dit;
+ if (!has_children(tmp_dit))
return null_simplex();
- }
tmp_sib = tmp_dit->second.children();
}
- return tmp_dit;
}
/** \brief Returns the Simplex_handle corresponding to the 0-simplex
@@ -574,12 +599,14 @@ class Simplex_tree {
std::pair<Simplex_handle, bool> res_insert;
auto vi = simplex.begin();
for (; vi != simplex.end() - 1; ++vi) {
+ GUDHI_CHECK(*vi != null_vertex(), "cannot use the dummy null_vertex() as a real vertex");
res_insert = curr_sib->members_.emplace(*vi, Node(curr_sib, filtration));
if (!(has_children(res_insert.first))) {
res_insert.first->second.assign_children(new Siblings(curr_sib, *vi));
}
curr_sib = res_insert.first->second.children();
}
+ GUDHI_CHECK(*vi != null_vertex(), "cannot use the dummy null_vertex() as a real vertex");
res_insert = curr_sib->members_.emplace(*vi, Node(curr_sib, filtration));
if (!res_insert.second) {
// if already in the complex
@@ -591,7 +618,11 @@ class Simplex_tree {
// if filtration value unchanged
return std::pair<Simplex_handle, bool>(null_simplex(), false);
}
- // otherwise the insertion has succeeded
+ // otherwise the insertion has succeeded - size is a size_type
+ if (static_cast<int>(simplex.size()) - 1 > dimension_) {
+ // Update dimension if needed
+ dimension_ = static_cast<int>(simplex.size()) - 1;
+ }
return res_insert;
}
@@ -650,71 +681,67 @@ 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));
+ GUDHI_CHECK_code(
+ for (Vertex_handle v : copy)
+ GUDHI_CHECK(v != null_vertex(), "cannot use the dummy null_vertex() as a real vertex");
+ )
- 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:
@@ -747,8 +774,12 @@ class Simplex_tree {
return &root_;
}
- /** Set a dimension for the simplicial complex. */
+ /** \brief Set a dimension for the simplicial complex.
+ * \details This function must be used with caution because it disables dimension recomputation when required
+ * (this recomputation can be triggered by `remove_maximal_simplex()` or `prune_above_filtration()`).
+ */
void set_dimension(int dimension) {
+ dimension_to_be_lowered_ = false;
dimension_ = dimension;
}
@@ -923,8 +954,9 @@ class Simplex_tree {
* called.
*
* Inserts all vertices and edges given by a OneSkeletonGraph.
- * OneSkeletonGraph must be a model of boost::AdjacencyGraph,
- * boost::EdgeListGraph and boost::PropertyGraph.
+ * OneSkeletonGraph must be a model of
+ * <a href="http://www.boost.org/doc/libs/1_65_1/libs/graph/doc/EdgeListGraph.html">boost::EdgeListGraph</a>
+ * and <a href="http://www.boost.org/doc/libs/1_65_1/libs/graph/doc/PropertyGraph.html">boost::PropertyGraph</a>.
*
* The vertex filtration value is accessible through the property tag
* vertex_filtration_t.
@@ -934,7 +966,10 @@ class Simplex_tree {
* boost::graph_traits<OneSkeletonGraph>::vertex_descriptor
* must be Vertex_handle.
* boost::graph_traits<OneSkeletonGraph>::directed_category
- * must be undirected_tag. */
+ * must be undirected_tag.
+ *
+ * If an edge appears with multiplicity, the function will arbitrarily pick
+ * one representative to read the filtration value. */
template<class OneSkeletonGraph>
void insert_graph(const OneSkeletonGraph& skel_graph) {
// the simplex tree must be empty
@@ -965,18 +1000,22 @@ class Simplex_tree {
++e_it) {
auto u = source(*e_it, skel_graph);
auto v = target(*e_it, skel_graph);
- if (u < v) {
- // count edges only once { std::swap(u,v); } // u < v
- auto sh = find_vertex(u);
- if (!has_children(sh)) {
- sh->second.assign_children(new Siblings(&root_, sh->first));
- }
-
- sh->second.children()->members().emplace(
- v,
- Node(sh->second.children(),
- boost::get(edge_filtration_t(), skel_graph, *e_it)));
+ if (u == v) throw "Self-loops are not simplicial";
+ // We cannot skip edges with the wrong orientation and expect them to
+ // come a second time with the right orientation, that does not always
+ // happen in practice. emplace() should be a NOP when an element with the
+ // same key is already there, so seeing the same edge multiple times is
+ // ok.
+ // Should we actually forbid multiple edges? That would be consistent
+ // with rejecting self-loops.
+ if (v < u) std::swap(u, v);
+ auto sh = find_vertex(u);
+ if (!has_children(sh)) {
+ sh->second.assign_children(new Siblings(&root_, sh->first));
}
+
+ sh->second.children()->members().emplace(v,
+ Node(sh->second.children(), boost::get(edge_filtration_t(), skel_graph, *e_it)));
}
}
@@ -1067,6 +1106,120 @@ class Simplex_tree {
}
public:
+ /** \brief Expands a simplex tree containing only a graph. Simplices corresponding to cliques in the graph are added
+ * incrementally, faces before cofaces, unless the simplex has dimension larger than `max_dim` or `block_simplex`
+ * returns true for this simplex.
+ *
+ * @param[in] max_dim Expansion maximal dimension value.
+ * @param[in] block_simplex Blocker oracle. Its concept is <CODE>bool block_simplex(Simplex_handle sh)</CODE>
+ *
+ * The function identifies a candidate simplex whose faces are all already in the complex, inserts
+ * it with a filtration value corresponding to the maximum of the filtration values of the faces, then calls
+ * `block_simplex` on a `Simplex_handle` for this new simplex. If `block_simplex` returns true, the simplex is
+ * removed, otherwise it is kept. Note that the evaluation of `block_simplex` is a good time to update the
+ * filtration value of the simplex if you want a customized value. The algorithm then proceeds with the next
+ * candidate.
+ *
+ * @warning several candidates of the same dimension may be inserted simultaneously before calling `block_simplex`,
+ * so if you examine the complex in `block_simplex`, you may hit a few simplices of the same dimension that have not
+ * been vetted by `block_simplex` yet, or have already been rejected but not yet removed.
+ */
+ template< typename Blocker >
+ void expansion_with_blockers(int max_dim, Blocker block_simplex) {
+ // Loop must be from the end to the beginning, as higher dimension simplex are always on the left part of the tree
+ for (auto& simplex : boost::adaptors::reverse(root_.members())) {
+ if (has_children(&simplex)) {
+ siblings_expansion_with_blockers(simplex.second.children(), max_dim, max_dim - 1, block_simplex);
+ }
+ }
+ }
+
+ private:
+ /** \brief Recursive expansion with blockers of the simplex tree.*/
+ template< typename Blocker >
+ void siblings_expansion_with_blockers(Siblings* siblings, int max_dim, int k, Blocker block_simplex) {
+ if (dimension_ < max_dim - k) {
+ dimension_ = max_dim - k;
+ }
+ if (k == 0)
+ return;
+ // No need to go deeper
+ if (siblings->members().size() < 2)
+ return;
+ // Reverse loop starting before the last one for 'next' to be the last one
+ for (auto simplex = siblings->members().rbegin() + 1; simplex != siblings->members().rend(); simplex++) {
+ std::vector<std::pair<Vertex_handle, Node> > intersection;
+ for(auto next = siblings->members().rbegin(); next != simplex; next++) {
+ bool to_be_inserted = true;
+ Filtration_value filt = simplex->second.filtration();
+ // If all the boundaries are present, 'next' needs to be inserted
+ for (Simplex_handle border : boundary_simplex_range(simplex)) {
+ Simplex_handle border_child = find_child(border, next->first);
+ if (border_child == null_simplex()) {
+ to_be_inserted=false;
+ break;
+ }
+ filt = (std::max)(filt, filtration(border_child));
+ }
+ if (to_be_inserted) {
+ intersection.emplace_back(next->first, Node(nullptr, filt));
+ }
+ }
+ if (intersection.size() != 0) {
+ // Reverse the order to insert
+ Siblings * new_sib = new Siblings(siblings, // oncles
+ simplex->first, // parent
+ boost::adaptors::reverse(intersection)); // boost::container::ordered_unique_range_t
+ std::vector<Vertex_handle> blocked_new_sib_vertex_list;
+ // As all intersections are inserted, we can call the blocker function on all new_sib members
+ for (auto new_sib_member = new_sib->members().begin();
+ new_sib_member != new_sib->members().end();
+ new_sib_member++) {
+ bool blocker_result = block_simplex(new_sib_member);
+ // new_sib member has been blocked by the blocker function
+ // add it to the list to be removed - do not perform it while looping on it
+ if (blocker_result) {
+ blocked_new_sib_vertex_list.push_back(new_sib_member->first);
+ }
+ }
+ if (blocked_new_sib_vertex_list.size() == new_sib->members().size()) {
+ // Specific case where all have to be deleted
+ delete new_sib;
+ // ensure the children property
+ simplex->second.assign_children(siblings);
+ } else {
+ for (auto& blocked_new_sib_member : blocked_new_sib_vertex_list) {
+ new_sib->members().erase(blocked_new_sib_member);
+ }
+ // ensure recursive call
+ simplex->second.assign_children(new_sib);
+ siblings_expansion_with_blockers(new_sib, max_dim, k - 1, block_simplex);
+ }
+ } else {
+ // ensure the children property
+ simplex->second.assign_children(siblings);
+ }
+ }
+ }
+
+ /* \private Returns the Simplex_handle composed of the vertex list (from the Simplex_handle), plus the given
+ * Vertex_handle if the Vertex_handle is found in the Simplex_handle children list.
+ * Returns null_simplex() if it does not exist
+ */
+ Simplex_handle find_child(Simplex_handle sh, Vertex_handle vh) const {
+ if (!has_children(sh))
+ return null_simplex();
+
+ Simplex_handle child = sh->second.children()->find(vh);
+ // Specific case of boost::flat_map does not find, returns boost::flat_map::end()
+ // in simplex tree we want a null_simplex()
+ if (child == sh->second.children()->members().end())
+ return null_simplex();
+
+ return child;
+ }
+
+ public:
/** \brief Write the hasse diagram of the simplicial complex in os.
*
* Each row in the file correspond to a simplex. A line is written:
@@ -1142,6 +1295,9 @@ class Simplex_tree {
* \post Some simplex tree functions require the filtration to be valid. `prune_above_filtration()`
* function is not launching `initialize_filtration()` but returns the filtration modification information. If the
* complex has changed , please call `initialize_filtration()` to recompute it.
+ * \post Note that the dimension of the simplicial complex may be lower after calling `prune_above_filtration()`
+ * than it was before. However, `upper_bound_dimension()` will return the old value, which remains a valid upper
+ * bound. If you care, you can call `dimension()` to recompute the exact dimension.
*/
bool prune_above_filtration(Filtration_value filtration) {
return rec_prune_above_filtration(root(), filtration);
@@ -1153,6 +1309,8 @@ class Simplex_tree {
auto last = std::remove_if(list.begin(), list.end(), [=](Dit_value_t& simplex) {
if (simplex.second.filtration() <= filt) return false;
if (has_children(&simplex)) rec_delete(simplex.second.children());
+ // dimension may need to be lowered
+ dimension_to_be_lowered_ = true;
return true;
});
@@ -1161,6 +1319,8 @@ class Simplex_tree {
// Removing the whole siblings, parent becomes a leaf.
sib->oncles()->members()[sib->parent()].assign_children(sib->oncles());
delete sib;
+ // dimension may need to be lowered
+ dimension_to_be_lowered_ = true;
return true;
} else {
// Keeping some elements of siblings. Remove the others, and recurse in the remaining ones.
@@ -1172,12 +1332,45 @@ class Simplex_tree {
return modified;
}
+ private:
+ /** \brief Deep search simplex tree dimension recompute.
+ * @return True if the dimension was modified, false otherwise.
+ * \pre Be sure the simplex tree has not a too low dimension value as the deep search stops when the former dimension
+ * has been reached (cf. `upper_bound_dimension()` and `set_dimension()` methods).
+ */
+ bool lower_upper_bound_dimension() {
+ // reset automatic detection to recompute
+ dimension_to_be_lowered_ = false;
+ int new_dimension = -1;
+ // Browse the tree from the left to the right as higher dimension cells are more likely on the left part of the tree
+ for (Simplex_handle sh : complex_simplex_range()) {
+#ifdef DEBUG_TRACES
+ for (auto vertex : simplex_vertex_range(sh)) {
+ std::cout << " " << vertex;
+ }
+ std::cout << std::endl;
+#endif // DEBUG_TRACES
+
+ int sh_dimension = dimension(sh);
+ if (sh_dimension >= dimension_)
+ // Stop browsing as soon as the dimension is reached, no need to go furter
+ return false;
+ new_dimension = (std::max)(new_dimension, sh_dimension);
+ }
+ dimension_ = new_dimension;
+ return true;
+ }
+
+
public:
/** \brief Remove a maximal simplex.
* @param[in] sh Simplex handle on the maximal simplex to remove.
* \pre Please check the simplex has no coface before removing it.
* \exception std::invalid_argument In debug mode, if sh has children.
* \post Be aware that removing is shifting data in a flat_map (initialize_filtration to be done).
+ * \post Note that the dimension of the simplicial complex may be lower after calling `remove_maximal_simplex()`
+ * than it was before. However, `upper_bound_dimension()` will return the old value, which remains a valid upper
+ * bound. If you care, you can call `dimension()` to recompute the exact dimension.
*/
void remove_maximal_simplex(Simplex_handle sh) {
// Guarantee the simplex has no children
@@ -1195,6 +1388,8 @@ class Simplex_tree {
// Sibling is emptied : must be deleted, and its parent must point on his own Sibling
child->oncles()->members().at(child->parent()).assign_children(child->oncles());
delete child;
+ // dimension may need to be lowered
+ dimension_to_be_lowered_ = true;
}
}
@@ -1207,6 +1402,7 @@ class Simplex_tree {
std::vector<Simplex_handle> filtration_vect_;
/** \brief Upper bound on the dimension of the simplicial complex.*/
int dimension_;
+ bool dimension_to_be_lowered_ = false;
};
// Print a Simplex_tree in os.
diff --git a/include/gudhi/Simplex_tree/Simplex_tree_iterators.h b/include/gudhi/Simplex_tree/Simplex_tree_iterators.h
index 7e0a454d..ab7346d4 100644
--- a/include/gudhi/Simplex_tree/Simplex_tree_iterators.h
+++ b/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/include/gudhi/Skeleton_blocker.h b/include/gudhi/Skeleton_blocker.h
index 32fe411c..aca2aa57 100644
--- a/include/gudhi/Skeleton_blocker.h
+++ b/include/gudhi/Skeleton_blocker.h
@@ -239,9 +239,6 @@ their collaboration to write the two initial papers
about this data-structure
and also Dominique for leaving him use a prototype.
-
-\copyright GNU General Public License v3.
-
@} */
} // namespace skeleton_blocker
diff --git a/include/gudhi/Strong_witness_complex.h b/include/gudhi/Strong_witness_complex.h
index 6f4bcf60..b3d00b11 100644
--- a/include/gudhi/Strong_witness_complex.h
+++ b/include/gudhi/Strong_witness_complex.h
@@ -34,7 +34,8 @@ namespace Gudhi {
namespace witness_complex {
-/* \private
+ /**
+ * \private
* \class Strong_witness_complex
* \brief Constructs strong witness complex for a given table of nearest landmarks with respect to witnesses.
* \ingroup witness_complex
@@ -127,10 +128,11 @@ class Strong_witness_complex {
if ((Landmark_id)simplex.size() - 1 > complex_dim)
complex_dim = simplex.size() - 1;
}
- complex.set_dimension(complex_dim);
return true;
}
+ //@}
+
private:
/* \brief Adds recursively all the faces of a certain dimension dim-1 witnessed by the same witness.
* Iterator is needed to know until how far we can take landmarks to form simplexes.
@@ -171,7 +173,6 @@ class Strong_witness_complex {
simplex.pop_back();
}
}
- //@}
};
} // namespace witness_complex
diff --git a/include/gudhi/Tangential_complex.h b/include/gudhi/Tangential_complex.h
index a5cefd6a..6f061922 100644
--- a/include/gudhi/Tangential_complex.h
+++ b/include/gudhi/Tangential_complex.h
@@ -155,7 +155,7 @@ class Tangential_complex {
>::type Triangulation;
typedef typename Triangulation::Geom_traits Tr_traits;
typedef typename Triangulation::Weighted_point Tr_point;
- typedef typename Triangulation::Bare_point Tr_bare_point;
+ typedef typename Tr_traits::Base::Point_d Tr_bare_point;
typedef typename Triangulation::Vertex_handle Tr_vertex_handle;
typedef typename Triangulation::Full_cell_handle Tr_full_cell_handle;
typedef typename Tr_traits::Vector_d Tr_vector;
diff --git a/include/gudhi/Unitary_tests_utils.h b/include/gudhi/Unitary_tests_utils.h
new file mode 100644
index 00000000..8394a062
--- /dev/null
+++ b/include/gudhi/Unitary_tests_utils.h
@@ -0,0 +1,40 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Vincent Rouvreau
+ *
+ * Copyright (C) 2017 INRIA
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef UNITARY_TESTS_UTILS_H_
+#define UNITARY_TESTS_UTILS_H_
+
+#include <boost/test/unit_test.hpp>
+
+#include <iostream>
+#include <limits> // for std::numeric_limits<>
+
+template<typename FloatingType >
+void GUDHI_TEST_FLOAT_EQUALITY_CHECK(FloatingType a, FloatingType b,
+ FloatingType epsilon = std::numeric_limits<FloatingType>::epsilon()) {
+#ifdef DEBUG_TRACES
+ std::cout << "GUDHI_TEST_FLOAT_EQUALITY_CHECK - " << a << " versus " << b
+ << " | diff = " << std::fabs(a - b) << " - epsilon = " << epsilon << std::endl;
+#endif
+ BOOST_CHECK(std::fabs(a - b) < epsilon);
+}
+
+#endif // UNITARY_TESTS_UTILS_H_
diff --git a/include/gudhi/Witness_complex.h b/include/gudhi/Witness_complex.h
index bcfe8484..53c38520 100644
--- a/include/gudhi/Witness_complex.h
+++ b/include/gudhi/Witness_complex.h
@@ -130,7 +130,6 @@ class Witness_complex {
}
k++;
}
- complex.set_dimension(k-1);
return true;
}
diff --git a/include/gudhi/choose_n_farthest_points.h b/include/gudhi/choose_n_farthest_points.h
index 86500b28..8390b4c9 100644
--- a/include/gudhi/choose_n_farthest_points.h
+++ b/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/include/gudhi/common_persistence_representations.h b/include/gudhi/common_persistence_representations.h
new file mode 100644
index 00000000..44e125a7
--- /dev/null
+++ b/include/gudhi/common_persistence_representations.h
@@ -0,0 +1,127 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef COMMON_PERSISTENCE_REPRESENTATIONS_H_
+#define COMMON_PERSISTENCE_REPRESENTATIONS_H_
+
+#include <utility>
+#include <string>
+#include <cmath>
+
+namespace Gudhi {
+namespace Persistence_representations {
+// this file contain an implementation of some common procedures used in Persistence_representations.
+
+// double epsi = std::numeric_limits<double>::epsilon();
+double epsi = 0.000005;
+
+/**
+ * A procedure used to compare doubles. Typically given two doubles A and B, comparing A == B is not good idea. In this
+ *case, we use the procedure almostEqual with the epsi defined at
+ * the top of the file. Setting up the epsi gives the user a tolerance on what should be consider equal.
+**/
+inline bool almost_equal(double a, double b) {
+ if (std::fabs(a - b) < epsi) return true;
+ return false;
+}
+
+// landscapes
+/**
+ * Extra functions needed in construction of barcodes.
+**/
+double minus_length(std::pair<double, double> a) { return a.first - a.second; }
+double birth_plus_deaths(std::pair<double, double> a) { return a.first + a.second; }
+
+// landscapes
+/**
+ * Given two points in R^2, the procedure compute the parameters A and B of the line y = Ax + B that crosses those two
+ *points.
+**/
+std::pair<double, double> compute_parameters_of_a_line(std::pair<double, double> p1, std::pair<double, double> p2) {
+ double a = (p2.second - p1.second) / (p2.first - p1.first);
+ double b = p1.second - a * p1.first;
+ return std::make_pair(a, b);
+}
+
+// landscapes
+/**
+ * This procedure given two points which lies on the opposite sides of x axis, compute x for which the line connecting
+ *those two points crosses x axis.
+**/
+double find_zero_of_a_line_segment_between_those_two_points(std::pair<double, double> p1,
+ std::pair<double, double> p2) {
+ if (p1.first == p2.first) return p1.first;
+ if (p1.second * p2.second > 0) {
+ std::ostringstream errMessage;
+ errMessage << "In function find_zero_of_a_line_segment_between_those_two_points the arguments are: (" << p1.first
+ << "," << p1.second << ") and (" << p2.first << "," << p2.second
+ << "). There is no zero in line between those two points. Program terminated.";
+ std::string errMessageStr = errMessage.str();
+ const char* err = errMessageStr.c_str();
+ throw(err);
+ }
+ // we assume here, that x \in [ p1.first, p2.first ] and p1 and p2 are points between which we will put the line
+ // segment
+ double a = (p2.second - p1.second) / (p2.first - p1.first);
+ double b = p1.second - a * p1.first;
+ return -b / a;
+}
+
+// landscapes
+/**
+ * This method provides a comparison of points that is used in construction of persistence landscapes. The ordering is
+ *lexicographical for the first coordinate, and reverse-lexicographical for the
+ * second coordinate.
+**/
+bool compare_points_sorting(std::pair<double, double> f, std::pair<double, double> s) {
+ if (f.first < s.first) {
+ return true;
+ } else { // f.first >= s.first
+ if (f.first > s.first) {
+ return false;
+ } else { // f.first == s.first
+ if (f.second > s.second) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+}
+
+// landscapes
+/**
+ * This procedure takes two points in R^2 and a double value x. It computes the line parsing through those two points
+ *and return the value of that linear function at x.
+**/
+double function_value(std::pair<double, double> p1, std::pair<double, double> p2, double x) {
+ // we assume here, that x \in [ p1.first, p2.first ] and p1 and p2 are points between which we will put the line
+ // segment
+ double a = (p2.second - p1.second) / (p2.first - p1.first);
+ double b = p1.second - a * p1.first;
+ return (a * x + b);
+}
+
+} // namespace Persistence_representations
+} // namespace Gudhi
+
+#endif // COMMON_PERSISTENCE_REPRESENTATIONS_H_
diff --git a/include/gudhi/distance_functions.h b/include/gudhi/distance_functions.h
index f6e2ab5a..3a5d1fd5 100644
--- a/include/gudhi/distance_functions.h
+++ b/include/gudhi/distance_functions.h
@@ -23,9 +23,14 @@
#ifndef DISTANCE_FUNCTIONS_H_
#define DISTANCE_FUNCTIONS_H_
+#include <gudhi/Debug_utils.h>
+
+#include <boost/range/metafunctions.hpp>
+
#include <cmath> // for std::sqrt
#include <type_traits> // for std::decay
#include <iterator> // for std::begin, std::end
+#include <utility>
namespace Gudhi {
@@ -37,16 +42,29 @@ namespace Gudhi {
* have the same dimension. */
class Euclidean_distance {
public:
+ // boost::range_value is not SFINAE-friendly so we cannot use it in the return type
template< typename Point >
- auto operator()(const Point& p1, const Point& p2) const -> typename std::decay<decltype(*std::begin(p1))>::type {
- auto it1 = p1.begin();
- auto it2 = p2.begin();
- typename Point::value_type dist = 0.;
- for (; it1 != p1.end(); ++it1, ++it2) {
- typename Point::value_type tmp = (*it1) - (*it2);
+ typename std::iterator_traits<typename boost::range_iterator<Point>::type>::value_type
+ operator()(const Point& p1, const Point& p2) const {
+ auto it1 = std::begin(p1);
+ auto it2 = std::begin(p2);
+ typedef typename boost::range_value<Point>::type NT;
+ NT dist = 0;
+ for (; it1 != std::end(p1); ++it1, ++it2) {
+ GUDHI_CHECK(it2 != std::end(p2), "inconsistent point dimensions");
+ NT tmp = *it1 - *it2;
dist += tmp*tmp;
}
- return std::sqrt(dist);
+ GUDHI_CHECK(it2 == std::end(p2), "inconsistent point dimensions");
+ using std::sqrt;
+ return sqrt(dist);
+ }
+ template< typename T >
+ T operator() (const std::pair< T, T >& f, const std::pair< T, T >& s) const {
+ T dx = f.first - s.first;
+ T dy = f.second - s.second;
+ using std::sqrt;
+ return sqrt(dx*dx + dy*dy);
}
};
diff --git a/include/gudhi/graph_simplicial_complex.h b/include/gudhi/graph_simplicial_complex.h
index 5fe7c826..d84421b2 100644
--- a/include/gudhi/graph_simplicial_complex.h
+++ b/include/gudhi/graph_simplicial_complex.h
@@ -28,6 +28,9 @@
#include <utility> // for pair<>
#include <vector>
#include <map>
+#include <tuple> // for std::tie
+
+namespace Gudhi {
/* Edge tag for Boost PropertyGraph. */
struct edge_filtration_t {
@@ -39,4 +42,64 @@ struct vertex_filtration_t {
typedef boost::vertex_property_tag kind;
};
+template <typename SimplicialComplexForProximityGraph>
+using Proximity_graph = typename boost::adjacency_list < boost::vecS, boost::vecS, boost::undirectedS
+, boost::property < vertex_filtration_t, typename SimplicialComplexForProximityGraph::Filtration_value >
+, boost::property < edge_filtration_t, typename SimplicialComplexForProximityGraph::Filtration_value >>;
+
+/** \brief Computes the proximity graph of the points.
+ *
+ * If points contains n elements, the proximity graph is the graph with n vertices, and an edge [u,v] iff the
+ * distance function between points u and v is smaller than threshold.
+ *
+ * \tparam ForwardPointRange furnishes `.begin()` and `.end()` methods.
+ *
+ * \tparam Distance furnishes `operator()(const Point& p1, const Point& p2)`, where
+ * `Point` is a point from the `ForwardPointRange`, and that returns a `Filtration_value`.
+ */
+template< typename SimplicialComplexForProximityGraph
+ , typename ForwardPointRange
+ , typename Distance >
+Proximity_graph<SimplicialComplexForProximityGraph> compute_proximity_graph(
+ const ForwardPointRange& points,
+ typename SimplicialComplexForProximityGraph::Filtration_value threshold,
+ Distance distance) {
+ using Vertex_handle = typename SimplicialComplexForProximityGraph::Vertex_handle;
+ using Filtration_value = typename SimplicialComplexForProximityGraph::Filtration_value;
+
+ std::vector<std::pair< Vertex_handle, Vertex_handle >> edges;
+ std::vector< Filtration_value > edges_fil;
+ std::map< Vertex_handle, Filtration_value > vertices;
+
+ Vertex_handle idx_u, idx_v;
+ Filtration_value fil;
+ idx_u = 0;
+ for (auto it_u = points.begin(); it_u != points.end(); ++it_u) {
+ idx_v = idx_u + 1;
+ for (auto it_v = it_u + 1; it_v != points.end(); ++it_v, ++idx_v) {
+ fil = distance(*it_u, *it_v);
+ if (fil <= threshold) {
+ edges.emplace_back(idx_u, idx_v);
+ edges_fil.push_back(fil);
+ }
+ }
+ ++idx_u;
+ }
+
+ // Points are labeled from 0 to idx_u-1
+ Proximity_graph<SimplicialComplexForProximityGraph> skel_graph(edges.begin(), edges.end(), edges_fil.begin(), idx_u);
+
+ auto vertex_prop = boost::get(vertex_filtration_t(), skel_graph);
+
+ typename boost::graph_traits<Proximity_graph<SimplicialComplexForProximityGraph>>::vertex_iterator vi, vi_end;
+ for (std::tie(vi, vi_end) = boost::vertices(skel_graph);
+ vi != vi_end; ++vi) {
+ boost::put(vertex_prop, *vi, 0.);
+ }
+
+ return skel_graph;
+}
+
+} // namespace Gudhi
+
#endif // GRAPH_SIMPLICIAL_COMPLEX_H_
diff --git a/include/gudhi/read_persistence_from_file.h b/include/gudhi/read_persistence_from_file.h
new file mode 100644
index 00000000..83b89d0e
--- /dev/null
+++ b/include/gudhi/read_persistence_from_file.h
@@ -0,0 +1,120 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef READ_PERSISTENCE_FROM_FILE_H_
+#define READ_PERSISTENCE_FROM_FILE_H_
+
+#include <gudhi/reader_utils.h>
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <vector>
+#include <algorithm>
+#include <string>
+#include <utility>
+#include <limits> // for std::numeric_limits<>
+
+namespace Gudhi {
+namespace Persistence_representations {
+
+/**
+ * Universal procedure to read files with persistence. It ignores the lines starting from # (treat them as comments).
+ * It reads the fist line which is not a comment and assume that there are some numerical entries over there. The
+ *program assume
+ * that each other line in the file, which is not a comment, have the same number of numerical entries (2, 3 or 4).
+ * If there are two numerical entries per line, then the function assume that they are birth/death coordinates.
+ * If there are three numerical entries per line, then the function assume that they are: dimension and birth/death
+ *coordinates.
+ * If there are four numerical entries per line, then the function assume that they are: the characteristic of a filed
+ *over which
+ * persistence was computed, dimension and birth/death coordinates.
+ * The 'inf' string can appear only as a last element of a line.
+ * 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) {
+ 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> > 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();
+ }
+
+ 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) {
+ // 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();
+ }
+
+ return final_barcode;
+} // read_persistence_intervals_in_one_dimension_from_file
+
+} // namespace Persistence_representations
+} // namespace Gudhi
+
+#endif // READ_PERSISTENCE_FROM_FILE_H_
diff --git a/utilities/Alpha_complex/CMakeLists.txt b/utilities/Alpha_complex/CMakeLists.txt
new file mode 100644
index 00000000..a2dfac20
--- /dev/null
+++ b/utilities/Alpha_complex/CMakeLists.txt
@@ -0,0 +1,65 @@
+cmake_minimum_required(VERSION 2.6)
+project(Alpha_complex_utilities)
+
+if(CGAL_FOUND)
+ add_executable(alpha_complex_3d_persistence alpha_complex_3d_persistence.cpp)
+ target_link_libraries(alpha_complex_3d_persistence ${CGAL_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY})
+ add_executable(exact_alpha_complex_3d_persistence exact_alpha_complex_3d_persistence.cpp)
+ target_link_libraries(exact_alpha_complex_3d_persistence ${CGAL_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY})
+ add_executable(weighted_alpha_complex_3d_persistence weighted_alpha_complex_3d_persistence.cpp)
+ target_link_libraries(weighted_alpha_complex_3d_persistence ${CGAL_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY})
+
+ if (TBB_FOUND)
+ target_link_libraries(alpha_complex_3d_persistence ${TBB_LIBRARIES})
+ target_link_libraries(exact_alpha_complex_3d_persistence ${TBB_LIBRARIES})
+ target_link_libraries(weighted_alpha_complex_3d_persistence ${TBB_LIBRARIES})
+ endif(TBB_FOUND)
+
+ add_test(NAME Alpha_complex_utilities_alpha_complex_3d_persistence COMMAND $<TARGET_FILE:alpha_complex_3d_persistence>
+ "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-p" "2" "-m" "0.45")
+ add_test(NAME Alpha_complex_utilities_exact_alpha_complex_3d COMMAND $<TARGET_FILE:exact_alpha_complex_3d_persistence>
+ "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-p" "2" "-m" "0.45")
+ add_test(NAME Alpha_complex_utilities_weighted_alpha_complex_3d COMMAND $<TARGET_FILE:weighted_alpha_complex_3d_persistence>
+ "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.weights" "-p" "2" "-m" "0.45")
+
+ install(TARGETS alpha_complex_3d_persistence DESTINATION bin)
+ install(TARGETS exact_alpha_complex_3d_persistence DESTINATION bin)
+ install(TARGETS weighted_alpha_complex_3d_persistence DESTINATION bin)
+
+ if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.7.0)
+ add_executable (alpha_complex_persistence alpha_complex_persistence.cpp)
+ target_link_libraries(alpha_complex_persistence ${CGAL_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY})
+
+ add_executable(periodic_alpha_complex_3d_persistence periodic_alpha_complex_3d_persistence.cpp)
+ target_link_libraries(periodic_alpha_complex_3d_persistence ${CGAL_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY})
+
+ if (TBB_FOUND)
+ target_link_libraries(alpha_complex_persistence ${TBB_LIBRARIES})
+ target_link_libraries(periodic_alpha_complex_3d_persistence ${TBB_LIBRARIES})
+ endif(TBB_FOUND)
+ add_test(NAME Alpha_complex_utilities_alpha_complex_persistence COMMAND $<TARGET_FILE:alpha_complex_persistence>
+ "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" "-p" "2" "-m" "0.45")
+ add_test(NAME Alpha_complex_utilities_periodic_alpha_complex_3d_persistence COMMAND $<TARGET_FILE:periodic_alpha_complex_3d_persistence>
+ "${CMAKE_SOURCE_DIR}/data/points/grid_10_10_10_in_0_1.off" "${CMAKE_SOURCE_DIR}/data/points/iso_cuboid_3_in_0_1.txt" "-p" "2" "-m" "0")
+
+ install(TARGETS alpha_complex_persistence DESTINATION bin)
+ install(TARGETS periodic_alpha_complex_3d_persistence DESTINATION bin)
+
+ endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.7.0)
+
+ if (NOT CGAL_VERSION VERSION_LESS 4.11.0)
+ add_executable(weighted_periodic_alpha_complex_3d_persistence weighted_periodic_alpha_complex_3d_persistence.cpp)
+ target_link_libraries(weighted_periodic_alpha_complex_3d_persistence ${CGAL_LIBRARY})
+ if (TBB_FOUND)
+ target_link_libraries(weighted_periodic_alpha_complex_3d_persistence ${TBB_LIBRARIES})
+ endif(TBB_FOUND)
+
+ 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")
+
+ install(TARGETS weighted_periodic_alpha_complex_3d_persistence DESTINATION bin)
+
+ endif (NOT CGAL_VERSION VERSION_LESS 4.11.0)
+
+endif(CGAL_FOUND)
diff --git a/example/Persistent_cohomology/alpha_complex_3d_helper.h b/utilities/Alpha_complex/alpha_complex_3d_helper.h
index 7865e4ec..a59f0654 100644
--- a/example/Persistent_cohomology/alpha_complex_3d_helper.h
+++ b/utilities/Alpha_complex/alpha_complex_3d_helper.h
@@ -23,7 +23,7 @@
#ifndef ALPHA_COMPLEX_3D_HELPER_H_
#define ALPHA_COMPLEX_3D_HELPER_H_
-template<class Vertex_list, class Cell_handle>
+template <class Vertex_list, class Cell_handle>
Vertex_list from_cell(const Cell_handle& ch) {
Vertex_list the_list;
for (auto i = 0; i < 4; i++) {
@@ -35,7 +35,7 @@ Vertex_list from_cell(const Cell_handle& ch) {
return the_list;
}
-template<class Vertex_list, class Facet>
+template <class Vertex_list, class Facet>
Vertex_list from_facet(const Facet& fct) {
Vertex_list the_list;
for (auto i = 0; i < 4; i++) {
@@ -49,21 +49,19 @@ Vertex_list from_facet(const Facet& fct) {
return the_list;
}
-template<class Vertex_list, class Edge_3>
+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;
}
-template<class Vertex_list, class Vertex_handle>
+template <class Vertex_list, class Vertex_handle>
Vertex_list from_vertex(const Vertex_handle& vh) {
Vertex_list the_list;
#ifdef DEBUG_TRACES
diff --git a/example/Persistent_cohomology/alpha_complex_3d_persistence.cpp b/utilities/Alpha_complex/alpha_complex_3d_persistence.cpp
index f63ff0f6..8ef5ffb2 100644
--- a/example/Persistent_cohomology/alpha_complex_3d_persistence.cpp
+++ b/utilities/Alpha_complex/alpha_complex_3d_persistence.cpp
@@ -20,8 +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>
@@ -37,8 +43,8 @@
#include <tuple>
#include <map>
#include <utility>
-#include <list>
#include <vector>
+#include <cstdlib>
#include "alpha_complex_3d_helper.h"
@@ -56,59 +62,50 @@ using Point_3 = Kernel::Point_3;
// filtration with alpha values needed type definition
using Alpha_value_type = Alpha_shape_3::FT;
using Object = CGAL::Object;
-using Dispatch = CGAL::Dispatch_output_iterator<
- CGAL::cpp11::tuple<Object, Alpha_value_type>,
- CGAL::cpp11::tuple<std::back_insert_iterator< std::vector<Object> >,
- std::back_insert_iterator< std::vector<Alpha_value_type> > > >;
+using Dispatch =
+ CGAL::Dispatch_output_iterator<CGAL::cpp11::tuple<Object, Alpha_value_type>,
+ CGAL::cpp11::tuple<std::back_insert_iterator<std::vector<Object> >,
+ std::back_insert_iterator<std::vector<Alpha_value_type> > > >;
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 PCOH = Gudhi::persistent_cohomology::Persistent_cohomology< ST, Gudhi::persistent_cohomology::Field_Zp >;
-
-void usage(const std::string& progName) {
- std::cerr << "Usage:\n" << progName << " path_to_OFF_file coeff_field_characteristic[integer " <<
- "> 0] min_persistence[float >= -1.0]\n";
- std::cerr << " path_to_OFF_file is the path to your points cloud in OFF format.\n";
- exit(-1);
-}
+using Alpha_shape_simplex_tree_map = std::map<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>;
-int main(int argc, char * const argv[]) {
- // program args management
- if (argc != 4) {
- std::cerr << "Error: Number of arguments (" << argc << ") is not correct\n";
- usage(argv[0]);
- }
+void program_options(int argc, char *argv[], std::string &off_file_points, std::string &output_file_diag,
+ int &coeff_field_characteristic, Filtration_value &min_persistence);
- int coeff_field_characteristic = atoi(argv[2]);
+int main(int argc, char **argv) {
+ std::string off_file_points;
+ std::string output_file_diag;
+ int coeff_field_characteristic;
+ Filtration_value min_persistence;
- Filtration_value min_persistence = 0.0;
- int returnedScanValue = sscanf(argv[3], "%f", &min_persistence);
- if ((returnedScanValue == EOF) || (min_persistence < -1.0)) {
- std::cerr << "Error: " << argv[3] << " is not correct\n";
- usage(argv[0]);
- }
+ program_options(argc, argv, off_file_points, output_file_diag, coeff_field_characteristic, min_persistence);
- // Read points from file
- std::string offInputFile(argv[1]);
// Read the OFF file (input file name given as parameter) and triangulate points
- Gudhi::Points_3D_off_reader<Point_3> off_reader(offInputFile);
+ Gudhi::Points_3D_off_reader<Point_3> off_reader(off_file_points);
// Check the read operation was correct
if (!off_reader.is_valid()) {
- std::cerr << "Unable to read file " << offInputFile << std::endl;
- usage(argv[0]);
+ std::cerr << "Unable to read file " << off_file_points << std::endl;
+ 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.
@@ -139,37 +136,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)) {
+ 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)) {
+ } 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)) {
+ } 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)) {
+ } 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()) {
@@ -178,32 +161,26 @@ 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
- Filtration_value filtr = /*std::sqrt*/(*the_alpha_value_iterator);
+ Filtration_value filtr = /*std::sqrt*/ (*the_alpha_value_iterator);
#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;
}
- simplex_tree.set_dimension(dim_max);
#ifdef DEBUG_TRACES
std::cout << "vertices \t\t" << count_vertices << std::endl;
@@ -211,7 +188,6 @@ int main(int argc, char * const argv[]) {
std::cout << "facets \t\t" << count_facets << std::endl;
std::cout << "cells \t\t" << count_cells << std::endl;
-
std::cout << "Information of the Simplex Tree: " << std::endl;
std::cout << " Number of vertices = " << simplex_tree.num_vertices() << " ";
std::cout << " Number of simplices = " << simplex_tree.num_simplices() << std::endl << std::endl;
@@ -230,13 +206,64 @@ int main(int argc, char * const argv[]) {
std::cout << "Simplex_tree dim: " << simplex_tree.dimension() << std::endl;
// Compute the persistence diagram of the complex
- PCOH pcoh(simplex_tree);
+ Persistent_cohomology pcoh(simplex_tree, true);
// initializes the coefficient field for homology
pcoh.init_coefficients(coeff_field_characteristic);
pcoh.compute_persistent_cohomology(min_persistence);
- pcoh.output_diagram();
+ // Output the diagram in filediag
+ if (output_file_diag.empty()) {
+ pcoh.output_diagram();
+ } else {
+ std::cout << "Result in file: " << output_file_diag << std::endl;
+ std::ofstream out(output_file_diag);
+ pcoh.output_diagram(out);
+ out.close();
+ }
return 0;
}
+
+void program_options(int argc, char *argv[], std::string &off_file_points, std::string &output_file_diag,
+ int &coeff_field_characteristic, Filtration_value &min_persistence) {
+ namespace po = boost::program_options;
+ po::options_description hidden("Hidden options");
+ hidden.add_options()("input-file", po::value<std::string>(&off_file_points),
+ "Name of file containing a point set. Format is one point per line: X1 ... Xd ");
+
+ po::options_description visible("Allowed options", 100);
+ visible.add_options()("help,h", "produce help message")(
+ "output-file,o", po::value<std::string>(&output_file_diag)->default_value(std::string()),
+ "Name of file in which the persistence diagram is written. Default print in std::cout")(
+ "field-charac,p", po::value<int>(&coeff_field_characteristic)->default_value(11),
+ "Characteristic p of the coefficient field Z/pZ for computing homology.")(
+ "min-persistence,m", po::value<Filtration_value>(&min_persistence),
+ "Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length "
+ "intervals");
+
+ po::positional_options_description pos;
+ pos.add("input-file", 1);
+
+ po::options_description all;
+ all.add(visible).add(hidden);
+
+ po::variables_map vm;
+ po::store(po::command_line_parser(argc, argv).options(all).positional(pos).run(), vm);
+ po::notify(vm);
+
+ if (vm.count("help") || !vm.count("input-file")) {
+ std::cout << std::endl;
+ std::cout << "Compute the persistent homology with coefficient field Z/pZ \n";
+ std::cout << "of a 3D Alpha complex defined on a set of input points.\n \n";
+ std::cout << "The output diagram contains one bar per line, written with the convention: \n";
+ std::cout << " p dim b d \n";
+ std::cout << "where dim is the dimension of the homological feature,\n";
+ std::cout << "b and d are respectively the birth and death of the feature and \n";
+ std::cout << "p is the characteristic of the field Z/pZ used for homology coefficients." << std::endl << std::endl;
+
+ std::cout << "Usage: " << argv[0] << " [options] input-file" << std::endl << std::endl;
+ std::cout << visible << std::endl;
+ std::abort();
+ }
+}
diff --git a/example/Persistent_cohomology/alpha_complex_persistence.cpp b/utilities/Alpha_complex/alpha_complex_persistence.cpp
index 9e84e91f..2105220a 100644
--- a/example/Persistent_cohomology/alpha_complex_persistence.cpp
+++ b/utilities/Alpha_complex/alpha_complex_persistence.cpp
@@ -14,12 +14,9 @@
using Simplex_tree = Gudhi::Simplex_tree<>;
using Filtration_value = Simplex_tree::Filtration_value;
-void program_options(int argc, char * argv[]
- , std::string & off_file_points
- , std::string & output_file_diag
- , Filtration_value & alpha_square_max_value
- , int & coeff_field_characteristic
- , Filtration_value & min_persistence);
+void program_options(int argc, char *argv[], std::string &off_file_points, std::string &output_file_diag,
+ Filtration_value &alpha_square_max_value, int &coeff_field_characteristic,
+ Filtration_value &min_persistence);
int main(int argc, char **argv) {
std::string off_file_points;
@@ -28,13 +25,13 @@ int main(int argc, char **argv) {
int coeff_field_characteristic;
Filtration_value min_persistence;
- program_options(argc, argv, off_file_points, output_file_diag, alpha_square_max_value,
- coeff_field_characteristic, min_persistence);
+ program_options(argc, argv, off_file_points, output_file_diag, alpha_square_max_value, coeff_field_characteristic,
+ min_persistence);
// ----------------------------------------------------------------------------
// Init of an alpha complex from an OFF file
// ----------------------------------------------------------------------------
- using Kernel = CGAL::Epick_d< CGAL::Dynamic_dimension_tag >;
+ using Kernel = CGAL::Epick_d<CGAL::Dynamic_dimension_tag>;
Gudhi::alpha_complex::Alpha_complex<Kernel> alpha_complex_from_file(off_file_points);
Simplex_tree simplex;
@@ -42,17 +39,16 @@ int main(int argc, char **argv) {
// ----------------------------------------------------------------------------
// Display information about the alpha complex
// ----------------------------------------------------------------------------
- std::cout << "Simplicial complex is of dimension " << simplex.dimension() <<
- " - " << simplex.num_simplices() << " simplices - " <<
- simplex.num_vertices() << " vertices." << std::endl;
+ std::cout << "Simplicial complex is of dimension " << simplex.dimension() << " - " << simplex.num_simplices()
+ << " simplices - " << simplex.num_vertices() << " vertices." << std::endl;
// Sort the simplices in the order of the filtration
simplex.initialize_filtration();
std::cout << "Simplex_tree dim: " << simplex.dimension() << std::endl;
// Compute the persistence diagram of the complex
- Gudhi::persistent_cohomology::Persistent_cohomology< Simplex_tree,
- Gudhi::persistent_cohomology::Field_Zp > pcoh(simplex);
+ Gudhi::persistent_cohomology::Persistent_cohomology<Simplex_tree, Gudhi::persistent_cohomology::Field_Zp> pcoh(
+ simplex);
// initializes the coefficient field for homology
pcoh.init_coefficients(coeff_field_characteristic);
@@ -72,30 +68,26 @@ int main(int argc, char **argv) {
return 0;
}
-void program_options(int argc, char * argv[]
- , std::string & off_file_points
- , std::string & output_file_diag
- , Filtration_value & alpha_square_max_value
- , int & coeff_field_characteristic
- , Filtration_value & min_persistence) {
+void program_options(int argc, char *argv[], std::string &off_file_points, std::string &output_file_diag,
+ Filtration_value &alpha_square_max_value, int &coeff_field_characteristic,
+ Filtration_value &min_persistence) {
namespace po = boost::program_options;
po::options_description hidden("Hidden options");
- hidden.add_options()
- ("input-file", po::value<std::string>(&off_file_points),
- "Name of file containing a point set. Format is one point per line: X1 ... Xd ");
+ hidden.add_options()("input-file", po::value<std::string>(&off_file_points),
+ "Name of file containing a point set. Format is one point per line: X1 ... Xd ");
po::options_description visible("Allowed options", 100);
- visible.add_options()
- ("help,h", "produce help message")
- ("output-file,o", po::value<std::string>(&output_file_diag)->default_value(std::string()),
- "Name of file in which the persistence diagram is written. Default print in std::cout")
- ("max-alpha-square-value,r",
- po::value<Filtration_value>(&alpha_square_max_value)->default_value(std::numeric_limits<Filtration_value>::infinity()),
- "Maximal alpha square value for the Alpha complex construction.")
- ("field-charac,p", po::value<int>(&coeff_field_characteristic)->default_value(11),
- "Characteristic p of the coefficient field Z/pZ for computing homology.")
- ("min-persistence,m", po::value<Filtration_value>(&min_persistence),
- "Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length intervals");
+ visible.add_options()("help,h", "produce help message")(
+ "output-file,o", po::value<std::string>(&output_file_diag)->default_value(std::string()),
+ "Name of file in which the persistence diagram is written. Default print in std::cout")(
+ "max-alpha-square-value,r", po::value<Filtration_value>(&alpha_square_max_value)
+ ->default_value(std::numeric_limits<Filtration_value>::infinity()),
+ "Maximal alpha square value for the Alpha complex construction.")(
+ "field-charac,p", po::value<int>(&coeff_field_characteristic)->default_value(11),
+ "Characteristic p of the coefficient field Z/pZ for computing homology.")(
+ "min-persistence,m", po::value<Filtration_value>(&min_persistence),
+ "Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length "
+ "intervals");
po::positional_options_description pos;
pos.add("input-file", 1);
@@ -104,8 +96,7 @@ void program_options(int argc, char * argv[]
all.add(visible).add(hidden);
po::variables_map vm;
- po::store(po::command_line_parser(argc, argv).
- options(all).positional(pos).run(), vm);
+ po::store(po::command_line_parser(argc, argv).options(all).positional(pos).run(), vm);
po::notify(vm);
if (vm.count("help") || !vm.count("input-file")) {
diff --git a/utilities/Alpha_complex/alphacomplex.md b/utilities/Alpha_complex/alphacomplex.md
new file mode 100644
index 00000000..aace85d3
--- /dev/null
+++ b/utilities/Alpha_complex/alphacomplex.md
@@ -0,0 +1,158 @@
+
+
+# Alpha complex #
+
+
+## alpha_complex_persistence ##
+
+This program computes the persistent homology with coefficient field Z/pZ of the dD alpha complex built from a dD point cloud.
+The output diagram contains one bar per line, written with the convention:
+
+```
+ p dim birth death
+```
+
+where `dim` is the dimension of the homological feature, `birth` and `death` are respectively the birth and death of the feature,
+and `p` is the characteristic of the field *Z/pZ* used for homology coefficients (`p` must be a prime number).
+
+**Usage**
+
+```
+ alpha_complex_persistence [options] <input OFF file>
+```
+
+where
+`<input OFF file>` is the path to the input point cloud in [nOFF ASCII format](http://www.geomview.org/docs/html/OFF.html).
+
+**Allowed options**
+
+* `-h [ --help ]` Produce help message
+* `-o [ --output-file ]` Name of file in which the persistence diagram is written. Default print in standard output.
+* `-r [ --max-alpha-square-value ]` (default = inf) Maximal alpha square value for the Alpha complex construction.
+* `-p [ --field-charac ]` (default = 11) Characteristic p of the coefficient field Z/pZ for computing homology.
+* `-m [ --min-persistence ]` (default = 0) Minimal lifetime of homology feature to be recorded. Enter a negative value to see zero length intervals.
+
+**Example**
+
+```
+ alpha_complex_persistence -r 32 -p 2 -m 0.45 ../../data/points/tore3D_300.off
+```
+
+N.B.:
+
+* Filtration values are alpha square values.
+
+
+## alpha_complex_3d_persistence ##
+This program computes the persistent homology with coefficient field Z/pZ of the 3D alpha complex built from a 3D point cloud. The output diagram contains one bar per line, written with the convention:
+
+```
+p dim birth death
+```
+
+where `dim` is the dimension of the homological feature, `birth` and `death` are respectively the birth and death of the feature, and `p` is the characteristic of the field *Z/pZ* used for homology coefficients (`p` must be a prime number).
+
+**Usage**
+
+```
+ alpha_complex_3d_persistence [options] <input OFF file>
+```
+
+where `<input OFF file>` is the path to the input point cloud in [nOFF ASCII format](http://www.geomview.org/docs/html/OFF.html).
+
+**Allowed options**
+
+* `-h [ --help ]` Produce help message
+* `-o [ --output-file ]` Name of file in which the persistence diagram is written. Default print in standard output.
+* `-p [ --field-charac ]` (default=11) Characteristic p of the coefficient field Z/pZ for computing homology.
+* `-m [ --min-persistence ]` (default = 0) Minimal lifetime of homology feature to be recorded. Enter a negative value to see zero length intervals.
+
+**Example**
+
+```
+alpha_complex_3d_persistence ../../data/points/tore3D_300.off -p 2 -m 0.45
+```
+
+N.B.:
+
+* `alpha_complex_3d_persistence` only accepts OFF files in dimension 3.
+* Filtration values are alpha square values.
+
+
+## exact_alpha_complex_3d_persistence ##
+
+Same as `alpha_complex_3d_persistence`, but using exact computation.
+It is slower, but it is necessary when points are on a grid for instance.
+
+
+
+## weighted_alpha_complex_3d_persistence ##
+
+Same as `alpha_complex_3d_persistence`, but using weighted points.
+
+**Usage**
+
+```
+ weighted_alpha_complex_3d_persistence [options] <input OFF file> <weights input file>
+```
+
+where
+
+* `<input OFF file>` is the path to the input point cloud in [nOFF ASCII format](http://www.geomview.org/docs/html/OFF.html).
+* `<input weights file>` is the path to the file containing the weights of the points (one value per line).
+
+**Allowed options**
+
+* `-h [ --help ]` Produce help message
+* `-o [ --output-file ]` Name of file in which the persistence diagram is written. Default print in standard output.
+* `-p [ --field-charac ]` (default=11) Characteristic p of the coefficient field Z/pZ for computing homology.
+* `-m [ --min-persistence ]` (default = 0) Minimal lifetime of homology feature to be recorded. Enter a negative value to see zero length intervals.
+
+**Example**
+
+```
+ weighted_alpha_complex_3d_persistence ../../data/points/tore3D_300.off ../../data/points/tore3D_300.weights -p 2 -m 0.45
+```
+
+
+N.B.:
+
+* Weights values are explained on CGAL [Alpha shape](https://doc.cgal.org/latest/Alpha_shapes_3/index.html#title0)
+and [Regular triangulation](https://doc.cgal.org/latest/Triangulation_3/index.html#Triangulation3secclassRegulartriangulation) documentation.
+* Filtration values are alpha square values.
+
+
+## periodic_alpha_complex_3d_persistence ##
+Same as `alpha_complex_3d_persistence`, but using periodic alpha shape 3d.
+Refer to the [CGAL's 3D Periodic Triangulations User Manual](https://doc.cgal.org/latest/Periodic_3_triangulation_3/index.html) for more details.
+
+**Usage**
+
+```
+ periodic_alpha_complex_3d_persistence [options] <input OFF file> <cuboid file>
+```
+
+where
+
+* `<input OFF file>` is the path to the input point cloud in [nOFF ASCII format](http://www.geomview.org/docs/html/OFF.html).
+* `<cuboid file>` is the path to the file describing the periodic domain. It must be in the format described
+[here](/doc/latest/fileformats.html#FileFormatsIsoCuboid).
+
+**Allowed options**
+
+* `-h [ --help ]` Produce help message
+* `-o [ --output-file ]` Name of file in which the persistence diagram is written. Default print in standard output.
+* `-p [ --field-charac ]` (default=11) Characteristic p of the coefficient field Z/pZ for computing homology.
+* `-m [ --min-persistence ]` (default = 0) Minimal lifetime of homology feature to be recorded. Enter a negative value to see zero length intervals
+
+
+**Example**
+
+```
+periodic_alpha_complex_3d_persistence ../../data/points/grid_10_10_10_in_0_1.off ../../data/points/iso_cuboid_3_in_0_1.txt -p 3 -m 1.0
+```
+
+N.B.:
+
+* Cuboid file must be in the format described [here](/doc/latest/fileformats.html#FileFormatsIsoCuboid).
+* Filtration values are alpha square values.
diff --git a/example/Persistent_cohomology/exact_alpha_complex_3d_persistence.cpp b/utilities/Alpha_complex/exact_alpha_complex_3d_persistence.cpp
index 09561d03..cceac46e 100644
--- a/example/Persistent_cohomology/exact_alpha_complex_3d_persistence.cpp
+++ b/utilities/Alpha_complex/exact_alpha_complex_3d_persistence.cpp
@@ -4,7 +4,7 @@
*
* Author(s): Vincent Rouvreau
*
- * Copyright (C) 2014 INRIA Saclay (France)
+ * Copyright (C) 2014 INRIA
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -20,6 +20,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <boost/program_options.hpp>
#include <boost/variant.hpp>
#include <gudhi/Simplex_tree.h>
@@ -37,8 +38,8 @@
#include <tuple>
#include <map>
#include <utility>
-#include <list>
#include <vector>
+#include <cstdlib>
#include "alpha_complex_3d_helper.h"
@@ -57,59 +58,45 @@ using Point_3 = Kernel::Point_3;
// filtration with alpha values needed type definition
using Alpha_value_type = Alpha_shape_3::FT;
using Object = CGAL::Object;
-using Dispatch = CGAL::Dispatch_output_iterator<
- CGAL::cpp11::tuple<Object, Alpha_value_type>,
- CGAL::cpp11::tuple<std::back_insert_iterator< std::vector<Object> >,
- std::back_insert_iterator< std::vector<Alpha_value_type> > > >;
+using Dispatch =
+ CGAL::Dispatch_output_iterator<CGAL::cpp11::tuple<Object, Alpha_value_type>,
+ CGAL::cpp11::tuple<std::back_insert_iterator<std::vector<Object> >,
+ std::back_insert_iterator<std::vector<Alpha_value_type> > > >;
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 PCOH = Gudhi::persistent_cohomology::Persistent_cohomology< ST, Gudhi::persistent_cohomology::Field_Zp >;
-
-void usage(char * const progName) {
- std::cerr << "Usage:\n" << progName << " path_to_OFF_file coeff_field_characteristic[integer " <<
- "> 0] min_persistence[float >= -1.0]\n";
- std::cerr << " path_to_OFF_file is the path to your points cloud in OFF format.\n";
- exit(-1);
-}
+using Alpha_shape_simplex_tree_map = std::map<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>;
-int main(int argc, char * const argv[]) {
- // program args management
- if (argc != 4) {
- std::cerr << "Error: Number of arguments (" << argc << ") is not correct\n";
- usage(argv[0]);
- }
+void program_options(int argc, char *argv[], std::string &off_file_points, std::string &output_file_diag,
+ int &coeff_field_characteristic, Filtration_value &min_persistence);
- int coeff_field_characteristic = atoi(argv[2]);
+int main(int argc, char **argv) {
+ std::string off_file_points;
+ std::string output_file_diag;
+ int coeff_field_characteristic;
+ Filtration_value min_persistence;
- Filtration_value min_persistence = 0.0;
- int returnedScanValue = sscanf(argv[3], "%f", &min_persistence);
- if ((returnedScanValue == EOF) || (min_persistence < -1.0)) {
- std::cerr << "Error: " << argv[3] << " is not correct\n";
- usage(argv[0]);
- }
+ program_options(argc, argv, off_file_points, output_file_diag, coeff_field_characteristic, min_persistence);
- // Read points from file
- std::string offInputFile(argv[1]);
// Read the OFF file (input file name given as parameter) and triangulate points
- Gudhi::Points_3D_off_reader<Point_3> off_reader(offInputFile);
+ Gudhi::Points_3D_off_reader<Point_3> off_reader(off_file_points);
// Check the read operation was correct
if (!off_reader.is_valid()) {
- std::cerr << "Unable to read file " << offInputFile << std::endl;
- usage(argv[0]);
+ std::cerr << "Unable to read file " << off_file_points << std::endl;
+ 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.
@@ -140,37 +127,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)) {
+ 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)) {
+ } 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)) {
+ } 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)) {
+ } 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()) {
@@ -179,33 +152,29 @@ 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
// you can also use the_alpha_value_iterator->exact()
- Filtration_value filtr = /*std::sqrt*/CGAL::to_double(the_alpha_value_iterator->exact());
+ Filtration_value filtr = /*std::sqrt*/ CGAL::to_double(the_alpha_value_iterator->exact());
#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
std::cout << "This shall not happen" << std::endl;
}
- simplex_tree.set_dimension(dim_max);
#ifdef DEBUG_TRACES
std::cout << "vertices \t\t" << count_vertices << std::endl;
@@ -213,7 +182,6 @@ int main(int argc, char * const argv[]) {
std::cout << "facets \t\t" << count_facets << std::endl;
std::cout << "cells \t\t" << count_cells << std::endl;
-
std::cout << "Information of the Simplex Tree: " << std::endl;
std::cout << " Number of vertices = " << simplex_tree.num_vertices() << " ";
std::cout << " Number of simplices = " << simplex_tree.num_simplices() << std::endl << std::endl;
@@ -232,13 +200,64 @@ int main(int argc, char * const argv[]) {
std::cout << "Simplex_tree dim: " << simplex_tree.dimension() << std::endl;
// Compute the persistence diagram of the complex
- PCOH pcoh(simplex_tree);
+ Persistent_cohomology pcoh(simplex_tree, true);
// initializes the coefficient field for homology
pcoh.init_coefficients(coeff_field_characteristic);
pcoh.compute_persistent_cohomology(min_persistence);
- pcoh.output_diagram();
+ // Output the diagram in filediag
+ if (output_file_diag.empty()) {
+ pcoh.output_diagram();
+ } else {
+ std::cout << "Result in file: " << output_file_diag << std::endl;
+ std::ofstream out(output_file_diag);
+ pcoh.output_diagram(out);
+ out.close();
+ }
return 0;
}
+
+void program_options(int argc, char *argv[], std::string &off_file_points, std::string &output_file_diag,
+ int &coeff_field_characteristic, Filtration_value &min_persistence) {
+ namespace po = boost::program_options;
+ po::options_description hidden("Hidden options");
+ hidden.add_options()("input-file", po::value<std::string>(&off_file_points),
+ "Name of file containing a point set. Format is one point per line: X1 ... Xd ");
+
+ po::options_description visible("Allowed options", 100);
+ visible.add_options()("help,h", "produce help message")(
+ "output-file,o", po::value<std::string>(&output_file_diag)->default_value(std::string()),
+ "Name of file in which the persistence diagram is written. Default print in std::cout")(
+ "field-charac,p", po::value<int>(&coeff_field_characteristic)->default_value(11),
+ "Characteristic p of the coefficient field Z/pZ for computing homology.")(
+ "min-persistence,m", po::value<Filtration_value>(&min_persistence),
+ "Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length "
+ "intervals");
+
+ po::positional_options_description pos;
+ pos.add("input-file", 1);
+
+ po::options_description all;
+ all.add(visible).add(hidden);
+
+ po::variables_map vm;
+ po::store(po::command_line_parser(argc, argv).options(all).positional(pos).run(), vm);
+ po::notify(vm);
+
+ if (vm.count("help") || !vm.count("input-file")) {
+ std::cout << std::endl;
+ std::cout << "Compute the persistent homology with coefficient field Z/pZ \n";
+ std::cout << "of a 3D Alpha complex defined on a set of input points.\n \n";
+ std::cout << "The output diagram contains one bar per line, written with the convention: \n";
+ std::cout << " p dim b d \n";
+ std::cout << "where dim is the dimension of the homological feature,\n";
+ std::cout << "b and d are respectively the birth and death of the feature and \n";
+ std::cout << "p is the characteristic of the field Z/pZ used for homology coefficients." << std::endl << std::endl;
+
+ std::cout << "Usage: " << argv[0] << " [options] input-file" << std::endl << std::endl;
+ std::cout << visible << std::endl;
+ std::abort();
+ }
+}
diff --git a/utilities/Alpha_complex/periodic_alpha_complex_3d_persistence.cpp b/utilities/Alpha_complex/periodic_alpha_complex_3d_persistence.cpp
new file mode 100644
index 00000000..188cf604
--- /dev/null
+++ b/utilities/Alpha_complex/periodic_alpha_complex_3d_persistence.cpp
@@ -0,0 +1,300 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Vincent Rouvreau
+ * Pawel Dlotko - 2017 - Swansea University, UK
+ *
+ * Copyright (C) 2014 INRIA
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <boost/program_options.hpp>
+#include <boost/variant.hpp>
+
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Persistent_cohomology.h>
+#include <gudhi/Points_3D_off_io.h>
+
+#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
+#include <CGAL/Periodic_3_Delaunay_triangulation_traits_3.h>
+#include <CGAL/Periodic_3_Delaunay_triangulation_3.h>
+#include <CGAL/Alpha_shape_3.h>
+#include <CGAL/iterator.h>
+
+#include <fstream>
+#include <cmath>
+#include <string>
+#include <tuple>
+#include <map>
+#include <utility>
+#include <vector>
+#include <cstdlib>
+
+#include "alpha_complex_3d_helper.h"
+
+// Traits
+using K = CGAL::Exact_predicates_inexact_constructions_kernel;
+using PK = CGAL::Periodic_3_Delaunay_triangulation_traits_3<K>;
+// Vertex type
+using DsVb = CGAL::Periodic_3_triangulation_ds_vertex_base_3<>;
+using Vb = CGAL::Triangulation_vertex_base_3<PK, DsVb>;
+using AsVb = CGAL::Alpha_shape_vertex_base_3<PK, Vb>;
+// Cell type
+using DsCb = CGAL::Periodic_3_triangulation_ds_cell_base_3<>;
+using Cb = CGAL::Triangulation_cell_base_3<PK, DsCb>;
+using AsCb = CGAL::Alpha_shape_cell_base_3<PK, Cb>;
+using Tds = CGAL::Triangulation_data_structure_3<AsVb, AsCb>;
+using P3DT3 = CGAL::Periodic_3_Delaunay_triangulation_3<PK, Tds>;
+using Alpha_shape_3 = CGAL::Alpha_shape_3<P3DT3>;
+using Point_3 = PK::Point_3;
+
+// filtration with alpha values needed type definition
+using Alpha_value_type = Alpha_shape_3::FT;
+using Object = CGAL::Object;
+using Dispatch =
+ CGAL::Dispatch_output_iterator<CGAL::cpp11::tuple<Object, Alpha_value_type>,
+ CGAL::cpp11::tuple<std::back_insert_iterator<std::vector<Object> >,
+ std::back_insert_iterator<std::vector<Alpha_value_type> > > >;
+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::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 Simplex_tree_vector_vertex = std::vector<Simplex_tree_vertex>;
+using Persistent_cohomology =
+ Gudhi::persistent_cohomology::Persistent_cohomology<ST, Gudhi::persistent_cohomology::Field_Zp>;
+
+void program_options(int argc, char *argv[], std::string &off_file_points, std::string &cuboid_file,
+ std::string &output_file_diag, int &coeff_field_characteristic, Filtration_value &min_persistence);
+
+int main(int argc, char **argv) {
+ std::string off_file_points;
+ std::string cuboid_file;
+ std::string output_file_diag;
+ int coeff_field_characteristic;
+ Filtration_value min_persistence;
+
+ program_options(argc, argv, off_file_points, cuboid_file, output_file_diag, coeff_field_characteristic,
+ min_persistence);
+
+ // Read the OFF file (input file name given as parameter) and triangulate points
+ Gudhi::Points_3D_off_reader<Point_3> off_reader(off_file_points);
+ // Check the read operation was correct
+ if (!off_reader.is_valid()) {
+ std::cerr << "Unable to read OFF file " << off_file_points << std::endl;
+ exit(-1);
+ }
+
+ // Read iso_cuboid_3 information from file
+ std::ifstream iso_cuboid_str(cuboid_file);
+ 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 " << 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 points
+ std::vector<Point_3> lp = off_reader.get_point_cloud();
+
+ // Define the periodic cube
+ P3DT3 pdt(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)
+ 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();
+ } 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
+ // Maybe need to set it to GENERAL mode
+ Alpha_shape_3 as(pdt, 0, Alpha_shape_3::GENERAL);
+
+ // filtration with alpha values from alpha shape
+ std::vector<Object> the_objects;
+ std::vector<Alpha_value_type> the_alpha_values;
+
+ Dispatch disp = CGAL::dispatch_output<Object, Alpha_value_type>(std::back_inserter(the_objects),
+ std::back_inserter(the_alpha_values));
+
+ as.filtration_with_alpha_values(disp);
+#ifdef DEBUG_TRACES
+ std::cout << "filtration_with_alpha_values returns : " << the_objects.size() << " objects" << std::endl;
+#endif // DEBUG_TRACES
+
+ Alpha_shape_3::size_type count_vertices = 0;
+ Alpha_shape_3::size_type count_edges = 0;
+ Alpha_shape_3::size_type count_facets = 0;
+ Alpha_shape_3::size_type count_cells = 0;
+
+ // Loop on objects vector
+ Vertex_list vertex_list;
+ 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();
+ 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++;
+ } else if (const Facet *facet = CGAL::object_cast<Facet>(&object_iterator)) {
+ vertex_list = from_facet<Vertex_list, Facet>(*facet);
+ count_facets++;
+ } else if (const Edge_3 *edge = CGAL::object_cast<Edge_3>(&object_iterator)) {
+ vertex_list = from_edge<Vertex_list, Edge_3>(*edge);
+ count_edges++;
+ } 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;
+ 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()) {
+ // alpha shape not found
+ Simplex_tree_vertex vertex = map_cgal_simplex_tree.size();
+#ifdef DEBUG_TRACES
+ std::cout << "vertex [" << the_alpha_shape_vertex->point() << "] not found - insert " << vertex << std::endl;
+#endif // DEBUG_TRACES
+ 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.push_back(vertex);
+ }
+ }
+ // Construction of the simplex_tree
+ Filtration_value filtr = /*std::sqrt*/ (*the_alpha_value_iterator);
+#ifdef DEBUG_TRACES
+ std::cout << "filtration = " << filtr << std::endl;
+#endif // DEBUG_TRACES
+ simplex_tree.insert_simplex(the_simplex, filtr);
+ if (the_alpha_value_iterator != the_alpha_values.end())
+ ++the_alpha_value_iterator;
+ else
+ std::cout << "This shall not happen" << std::endl;
+ }
+
+#ifdef DEBUG_TRACES
+ std::cout << "vertices \t\t" << count_vertices << std::endl;
+ std::cout << "edges \t\t" << count_edges << std::endl;
+ std::cout << "facets \t\t" << count_facets << std::endl;
+ std::cout << "cells \t\t" << count_cells << std::endl;
+
+ std::cout << "Information of the Simplex Tree: " << std::endl;
+ std::cout << " Number of vertices = " << simplex_tree.num_vertices() << " ";
+ std::cout << " Number of simplices = " << simplex_tree.num_simplices() << std::endl << std::endl;
+ std::cout << " Dimension = " << simplex_tree.dimension() << " ";
+#endif // DEBUG_TRACES
+
+#ifdef DEBUG_TRACES
+ std::cout << "Iterator on vertices: " << std::endl;
+ for (auto vertex : simplex_tree.complex_vertex_range()) {
+ std::cout << vertex << " ";
+ }
+#endif // DEBUG_TRACES
+
+ // Sort the simplices in the order of the filtration
+ simplex_tree.initialize_filtration();
+
+ std::cout << "Simplex_tree dim: " << simplex_tree.dimension() << std::endl;
+ // Compute the persistence diagram of the complex
+ Persistent_cohomology pcoh(simplex_tree, true);
+ // initializes the coefficient field for homology
+ pcoh.init_coefficients(coeff_field_characteristic);
+
+ pcoh.compute_persistent_cohomology(min_persistence);
+
+ // Output the diagram in filediag
+ if (output_file_diag.empty()) {
+ pcoh.output_diagram();
+ } else {
+ std::cout << "Result in file: " << output_file_diag << std::endl;
+ std::ofstream out(output_file_diag);
+ pcoh.output_diagram(out);
+ out.close();
+ }
+
+ return 0;
+}
+
+void program_options(int argc, char *argv[], std::string &off_file_points, std::string &cuboid_file,
+ std::string &output_file_diag, int &coeff_field_characteristic,
+ Filtration_value &min_persistence) {
+ namespace po = boost::program_options;
+ po::options_description hidden("Hidden options");
+ hidden.add_options()("input-file", po::value<std::string>(&off_file_points),
+ "Name of file containing a point set. Format is one point per line: X1 ... Xd ")(
+ "cuboid-file", po::value<std::string>(&cuboid_file),
+ "Name of file describing the periodic domain. Format is: min_hx min_hy min_hz\nmax_hx max_hy max_hz");
+
+ po::options_description visible("Allowed options", 100);
+ visible.add_options()("help,h", "produce help message")(
+ "output-file,o", po::value<std::string>(&output_file_diag)->default_value(std::string()),
+ "Name of file in which the persistence diagram is written. Default print in std::cout")(
+ "field-charac,p", po::value<int>(&coeff_field_characteristic)->default_value(11),
+ "Characteristic p of the coefficient field Z/pZ for computing homology.")(
+ "min-persistence,m", po::value<Filtration_value>(&min_persistence),
+ "Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length "
+ "intervals");
+
+ po::positional_options_description pos;
+ pos.add("input-file", 1);
+ pos.add("cuboid-file", 2);
+
+ po::options_description all;
+ all.add(visible).add(hidden);
+
+ po::variables_map vm;
+ po::store(po::command_line_parser(argc, argv).options(all).positional(pos).run(), vm);
+ po::notify(vm);
+
+ if (vm.count("help") || !vm.count("input-file") || !vm.count("cuboid-file")) {
+ std::cout << std::endl;
+ std::cout << "Compute the persistent homology with coefficient field Z/pZ \n";
+ std::cout << "of a periodic 3D Alpha complex defined on a set of input points.\n \n";
+ std::cout << "The output diagram contains one bar per line, written with the convention: \n";
+ std::cout << " p dim b d \n";
+ std::cout << "where dim is the dimension of the homological feature,\n";
+ std::cout << "b and d are respectively the birth and death of the feature and \n";
+ std::cout << "p is the characteristic of the field Z/pZ used for homology coefficients." << std::endl << std::endl;
+
+ std::cout << "Usage: " << argv[0] << " [options] input-file cuboid-file" << std::endl << std::endl;
+ std::cout << visible << std::endl;
+ std::abort();
+ }
+}
diff --git a/example/Persistent_cohomology/weighted_alpha_complex_3d_persistence.cpp b/utilities/Alpha_complex/weighted_alpha_complex_3d_persistence.cpp
index 72268511..93be8a05 100644
--- a/example/Persistent_cohomology/weighted_alpha_complex_3d_persistence.cpp
+++ b/utilities/Alpha_complex/weighted_alpha_complex_3d_persistence.cpp
@@ -20,102 +20,114 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <boost/program_options.hpp>
#include <boost/variant.hpp>
#include <gudhi/Simplex_tree.h>
#include <gudhi/Persistent_cohomology.h>
#include <gudhi/Points_3D_off_io.h>
+#include <CGAL/config.h>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
-#include <CGAL/Regular_triangulation_euclidean_traits_3.h>
#include <CGAL/Regular_triangulation_3.h>
#include <CGAL/Alpha_shape_3.h>
#include <CGAL/iterator.h>
+// For CGAL < 4.11
+#if CGAL_VERSION_NR < 1041100000
+#include <CGAL/Regular_triangulation_euclidean_traits_3.h>
+#endif // CGAL_VERSION_NR < 1041100000
+
#include <fstream>
#include <cmath>
#include <string>
#include <tuple>
#include <map>
#include <utility>
-#include <list>
#include <vector>
#include <cstdlib>
#include "alpha_complex_3d_helper.h"
-// Traits
+// Alpha_shape_3 templates type definitions
using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
+
+// For CGAL < 4.11
+#if CGAL_VERSION_NR < 1041100000
using Gt = CGAL::Regular_triangulation_euclidean_traits_3<Kernel>;
using Vb = CGAL::Alpha_shape_vertex_base_3<Gt>;
using Fb = CGAL::Alpha_shape_cell_base_3<Gt>;
using Tds = CGAL::Triangulation_data_structure_3<Vb, Fb>;
using Triangulation_3 = CGAL::Regular_triangulation_3<Gt, Tds>;
-using Alpha_shape_3 = CGAL::Alpha_shape_3<Triangulation_3>;
// From file type definition
using Point_3 = Gt::Bare_point;
using Weighted_point_3 = Gt::Weighted_point;
+// For CGAL >= 4.11
+#else // CGAL_VERSION_NR < 1041100000
+using Rvb = CGAL::Regular_triangulation_vertex_base_3<Kernel>;
+using Vb = CGAL::Alpha_shape_vertex_base_3<Kernel, Rvb>;
+using Rcb = CGAL::Regular_triangulation_cell_base_3<Kernel>;
+using Cb = CGAL::Alpha_shape_cell_base_3<Kernel, Rcb>;
+using Tds = CGAL::Triangulation_data_structure_3<Vb, Cb>;
+using Triangulation_3 = CGAL::Regular_triangulation_3<Kernel, Tds>;
+
+// From file type definition
+using Point_3 = Triangulation_3::Bare_point;
+using Weighted_point_3 = Triangulation_3::Weighted_point;
+#endif // CGAL_VERSION_NR < 1041100000
+
+using Alpha_shape_3 = CGAL::Alpha_shape_3<Triangulation_3>;
+
// filtration with alpha values needed type definition
using Alpha_value_type = Alpha_shape_3::FT;
using Object = CGAL::Object;
-using Dispatch = CGAL::Dispatch_output_iterator<
- CGAL::cpp11::tuple<Object, Alpha_value_type>,
- CGAL::cpp11::tuple<std::back_insert_iterator< std::vector<Object> >,
- std::back_insert_iterator< std::vector<Alpha_value_type> > > >;
+using Dispatch =
+ CGAL::Dispatch_output_iterator<CGAL::cpp11::tuple<Object, Alpha_value_type>,
+ CGAL::cpp11::tuple<std::back_insert_iterator<std::vector<Object> >,
+ std::back_insert_iterator<std::vector<Alpha_value_type> > > >;
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 >;
-
-void usage(char * const progName) {
- std::cerr << "Usage:\n" << progName << " path_to_OFF_file path_to_weight_file coeff_field_characteristic[integer " <<
- "> 0] min_persistence[float >= -1.0]\n";
- std::cerr << " path_to_OFF_file is the path to your points cloud in OFF format.\n";
- std::cerr << " path_to_weight_file is the path to the weights of your points cloud (one value per line.)\n";
- std::cerr << " Weights values are explained on CGAL documentation:\n";
- std::cerr << " https://doc.cgal.org/latest/Alpha_shapes_3/index.html#title0\n";
- std::cerr << " https://doc.cgal.org/latest/Triangulation_3/index.html#Triangulation3secclassRegulartriangulation\n";
- exit(-1);
-}
+using Alpha_shape_simplex_tree_map = std::map<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>;
-int main(int argc, char * const argv[]) {
- // program args management
- if (argc != 5) {
- std::cerr << "Error: Number of arguments (" << argc << ") is not correct\n";
- usage(argv[0]);
- }
+void program_options(int argc, char *argv[], std::string &off_file_points, std::string &weight_file,
+ std::string &output_file_diag, int &coeff_field_characteristic, Filtration_value &min_persistence);
- int coeff_field_characteristic = atoi(argv[3]);
- Filtration_value min_persistence = strtof(argv[4], nullptr);
+int main(int argc, char **argv) {
+ std::string off_file_points;
+ std::string weight_file;
+ std::string output_file_diag;
+ int coeff_field_characteristic;
+ Filtration_value min_persistence;
+
+ program_options(argc, argv, off_file_points, weight_file, output_file_diag, coeff_field_characteristic,
+ min_persistence);
- // Read points from file
- std::string offInputFile(argv[1]);
// Read the OFF file (input file name given as parameter) and triangulate points
- Gudhi::Points_3D_off_reader<Point_3> off_reader(offInputFile);
+ Gudhi::Points_3D_off_reader<Point_3> off_reader(off_file_points);
// Check the read operation was correct
if (!off_reader.is_valid()) {
- std::cerr << "Unable to read file " << offInputFile << std::endl;
- usage(argv[0]);
+ std::cerr << "Unable to read OFF file " << off_file_points << std::endl;
+ exit(-1);
}
- // Retrieve the triangulation
+ // Retrieve the points
std::vector<Point_3> lp = off_reader.get_point_cloud();
// Read weights information from file
- std::ifstream weights_ifstr(argv[2]);
+ std::ifstream weights_ifstr(weight_file);
std::vector<Weighted_point_3> wp;
if (weights_ifstr.good()) {
double weight = 0.0;
@@ -127,12 +139,12 @@ int main(int argc, char * const argv[]) {
index++;
}
if (index != lp.size()) {
- std::cerr << "Bad number of weights in file " << argv[2] << std::endl;
- usage(argv[0]);
+ std::cerr << "Bad number of weights in file " << weight_file << std::endl;
+ exit(-1);
}
} else {
- std::cerr << "Unable to read file " << argv[2] << std::endl;
- usage(argv[0]);
+ std::cerr << "Unable to read weights file " << weight_file << std::endl;
+ exit(-1);
}
// alpha shape construction from points. CGAL has a strange behavior in REGULARIZED mode.
@@ -163,38 +175,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)) {
+ 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)) {
+ } 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)) {
+ } 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 Alpha_shape_3::Vertex_handle * vertex =
- CGAL::object_cast<Alpha_shape_3::Vertex_handle>(&object_iterator)) {
+ } 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()) {
@@ -203,32 +200,28 @@ 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
- Filtration_value filtr = /*std::sqrt*/(*the_alpha_value_iterator);
+ Filtration_value filtr = /*std::sqrt*/ (*the_alpha_value_iterator);
#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
std::cout << "This shall not happen" << std::endl;
}
- simplex_tree.set_dimension(dim_max);
#ifdef DEBUG_TRACES
std::cout << "vertices \t\t" << count_vertices << std::endl;
@@ -236,7 +229,6 @@ int main(int argc, char * const argv[]) {
std::cout << "facets \t\t" << count_facets << std::endl;
std::cout << "cells \t\t" << count_cells << std::endl;
-
std::cout << "Information of the Simplex Tree: " << std::endl;
std::cout << " Number of vertices = " << simplex_tree.num_vertices() << " ";
std::cout << " Number of simplices = " << simplex_tree.num_simplices() << std::endl << std::endl;
@@ -261,7 +253,62 @@ int main(int argc, char * const argv[]) {
pcoh.compute_persistent_cohomology(min_persistence);
- pcoh.output_diagram();
+ // Output the diagram in filediag
+ if (output_file_diag.empty()) {
+ pcoh.output_diagram();
+ } else {
+ std::cout << "Result in file: " << output_file_diag << std::endl;
+ std::ofstream out(output_file_diag);
+ pcoh.output_diagram(out);
+ out.close();
+ }
return 0;
}
+
+void program_options(int argc, char *argv[], std::string &off_file_points, std::string &weight_file,
+ std::string &output_file_diag, int &coeff_field_characteristic,
+ Filtration_value &min_persistence) {
+ namespace po = boost::program_options;
+ po::options_description hidden("Hidden options");
+ hidden.add_options()("input-file", po::value<std::string>(&off_file_points),
+ "Name of file containing a point set. Format is one point per line: X1 ... Xd ")(
+ "weight-file", po::value<std::string>(&weight_file),
+ "Name of file containing a point weights. Format is one weigt per line: W1\n...\nWn ");
+
+ po::options_description visible("Allowed options", 100);
+ visible.add_options()("help,h", "produce help message")(
+ "output-file,o", po::value<std::string>(&output_file_diag)->default_value(std::string()),
+ "Name of file in which the persistence diagram is written. Default print in std::cout")(
+ "field-charac,p", po::value<int>(&coeff_field_characteristic)->default_value(11),
+ "Characteristic p of the coefficient field Z/pZ for computing homology.")(
+ "min-persistence,m", po::value<Filtration_value>(&min_persistence),
+ "Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length "
+ "intervals");
+
+ po::positional_options_description pos;
+ pos.add("input-file", 1);
+ pos.add("weight-file", 2);
+
+ po::options_description all;
+ all.add(visible).add(hidden);
+
+ po::variables_map vm;
+ po::store(po::command_line_parser(argc, argv).options(all).positional(pos).run(), vm);
+ po::notify(vm);
+
+ if (vm.count("help") || !vm.count("input-file") || !vm.count("weight-file")) {
+ std::cout << std::endl;
+ std::cout << "Compute the persistent homology with coefficient field Z/pZ \n";
+ std::cout << "of a weighted 3D Alpha complex defined on a set of input points.\n \n";
+ std::cout << "The output diagram contains one bar per line, written with the convention: \n";
+ std::cout << " p dim b d \n";
+ std::cout << "where dim is the dimension of the homological feature,\n";
+ std::cout << "b and d are respectively the birth and death of the feature and \n";
+ std::cout << "p is the characteristic of the field Z/pZ used for homology coefficients." << std::endl << std::endl;
+
+ std::cout << "Usage: " << argv[0] << " [options] input-file weight-file" << std::endl << std::endl;
+ std::cout << visible << std::endl;
+ std::abort();
+ }
+}
diff --git a/example/Persistent_cohomology/periodic_alpha_complex_3d_persistence.cpp b/utilities/Alpha_complex/weighted_periodic_alpha_complex_3d_persistence.cpp
index 8140a3c5..5321bb0a 100644
--- a/example/Persistent_cohomology/periodic_alpha_complex_3d_persistence.cpp
+++ b/utilities/Alpha_complex/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
*
@@ -27,8 +28,8 @@
#include <gudhi/Points_3D_off_io.h>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
-#include <CGAL/Periodic_3_Delaunay_triangulation_traits_3.h>
-#include <CGAL/Periodic_3_Delaunay_triangulation_3.h>
+#include <CGAL/Periodic_3_regular_triangulation_traits_3.h>
+#include <CGAL/Periodic_3_regular_triangulation_3.h>
#include <CGAL/Alpha_shape_3.h>
#include <CGAL/iterator.h>
@@ -38,74 +39,67 @@
#include <tuple>
#include <map>
#include <utility>
-#include <list>
#include <vector>
#include <cstdlib>
#include "alpha_complex_3d_helper.h"
// Traits
-using K = CGAL::Exact_predicates_inexact_constructions_kernel;
-using PK = CGAL::Periodic_3_Delaunay_triangulation_traits_3<K>;
+using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
+using PK = CGAL::Periodic_3_regular_triangulation_traits_3<Kernel>;
+
// Vertex type
using DsVb = CGAL::Periodic_3_triangulation_ds_vertex_base_3<>;
-using Vb = CGAL::Triangulation_vertex_base_3<PK, DsVb>;
+using Vb = CGAL::Regular_triangulation_vertex_base_3<PK, DsVb>;
using AsVb = CGAL::Alpha_shape_vertex_base_3<PK, Vb>;
// Cell type
using DsCb = CGAL::Periodic_3_triangulation_ds_cell_base_3<>;
-using Cb = CGAL::Triangulation_cell_base_3<PK, DsCb>;
+using Cb = CGAL::Regular_triangulation_cell_base_3<PK, DsCb>;
using AsCb = CGAL::Alpha_shape_cell_base_3<PK, Cb>;
using Tds = CGAL::Triangulation_data_structure_3<AsVb, AsCb>;
-using P3DT3 = CGAL::Periodic_3_Delaunay_triangulation_3<PK, Tds>;
-using Alpha_shape_3 = CGAL::Alpha_shape_3<P3DT3>;
-using Point_3 = PK::Point_3;
+using P3RT3 = CGAL::Periodic_3_regular_triangulation_3<PK, Tds>;
+using Alpha_shape_3 = CGAL::Alpha_shape_3<P3RT3>;
+
+using Point_3 = P3RT3::Bare_point;
+using Weighted_point_3 = P3RT3::Weighted_point;
// filtration with alpha values needed type definition
using Alpha_value_type = Alpha_shape_3::FT;
using Object = CGAL::Object;
-using Dispatch = CGAL::Dispatch_output_iterator<
- CGAL::cpp11::tuple<Object, Alpha_value_type>,
- CGAL::cpp11::tuple<std::back_insert_iterator< std::vector<Object> >,
- std::back_insert_iterator< std::vector<Alpha_value_type> > > >;
+using Dispatch =
+ CGAL::Dispatch_output_iterator<CGAL::cpp11::tuple<Object, Alpha_value_type>,
+ CGAL::cpp11::tuple<std::back_insert_iterator<std::vector<Object> >,
+ std::back_insert_iterator<std::vector<Alpha_value_type> > > >;
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 >;
-
-void usage(char * const progName) {
- std::cerr << "Usage:\n" << progName << " path_to_OFF_file path_to_iso_cuboid_3_file coeff_field_characteristic[" <<
- "integer > 0] min_persistence[float >= -1.0]\n" <<
- " path_to_OFF_file is the path to your points cloud in OFF format.\n" <<
- " path_to_iso_cuboid_3_file is the path to the iso cuboid file with the following format :\n" <<
- " x_min y_min z_min x_max y_max z_max\n" <<
- " In this example, the periodic cube will be " <<
- "{ x = [x_min,x_max]; y = [y_min,y_max]; z = [z_min,z_max] }.\n" <<
- " For more information, please refer to\n" <<
- " https://doc.cgal.org/latest/Kernel_23/classCGAL_1_1Iso__cuboid__3.html\n";
+using Alpha_shape_simplex_tree_map = std::map<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>;
+void usage(const std::string& progName) {
+ std::cerr << "Usage: " << progName << " path_to_the_OFF_file path_to_weight_file path_to_the_cuboid_file "
+ "coeff_field_characteristic[integer > 0] min_persistence[float >= -1.0]\n";
exit(-1);
}
-int main(int argc, char * const argv[]) {
+int main(int argc, char* const argv[]) {
// program args management
- if (argc != 5) {
+ if (argc != 6) {
std::cerr << "Error: Number of arguments (" << argc << ") is not correct\n";
usage(argv[0]);
}
- int coeff_field_characteristic = atoi(argv[3]);
- Filtration_value min_persistence = strtof(argv[4], nullptr);
+ int coeff_field_characteristic = atoi(argv[4]);
+ Filtration_value min_persistence = strtof(argv[5], nullptr);
// Read points from file
std::string offInputFile(argv[1]);
@@ -117,30 +111,74 @@ int main(int argc, char * const argv[]) {
usage(argv[0]);
}
+ // 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[2]);
+ 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;
+ 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[2] << std::endl;
+ 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);
+ }
- // Retrieve the triangulation
- std::vector<Point_3> lp = off_reader.get_point_cloud();
+ 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.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++;
+ }
+ if (index != lp.size()) {
+ std::cerr << "Bad number of weights in file " << argv[2] << std::endl;
+ usage(argv[0]);
+ }
+ } else {
+ std::cerr << "Unable to read file " << argv[2] << std::endl;
+ usage(argv[0]);
+ }
// Define the periodic cube
- P3DT3 pdt(PK::Iso_cuboid_3(x_min, y_min, z_min, x_max, y_max, z_max));
+ 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)
- 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();
- std::cout << "Periodic Delaunay computed." << std::endl;
+ 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();
+ } 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
- Alpha_shape_3 as(pdt, 0, Alpha_shape_3::GENERAL);
+ Alpha_shape_3 as(prt, 0, Alpha_shape_3::GENERAL);
// filtration with alpha values from alpha shape
std::vector<Object> the_objects;
@@ -164,38 +202,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)) {
+ 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)) {
+ } 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)) {
+ } 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 Alpha_shape_3::Vertex_handle * vertex =
- CGAL::object_cast<Alpha_shape_3::Vertex_handle>(&object_iterator)) {
+ } 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()) {
@@ -204,32 +227,28 @@ 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
- Filtration_value filtr = /*std::sqrt*/(*the_alpha_value_iterator);
+ Filtration_value filtr = /*std::sqrt*/ (*the_alpha_value_iterator);
#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
std::cout << "This shall not happen" << std::endl;
}
- simplex_tree.set_dimension(dim_max);
#ifdef DEBUG_TRACES
std::cout << "vertices \t\t" << count_vertices << std::endl;
@@ -237,7 +256,6 @@ int main(int argc, char * const argv[]) {
std::cout << "facets \t\t" << count_facets << std::endl;
std::cout << "cells \t\t" << count_cells << std::endl;
-
std::cout << "Information of the Simplex Tree: " << std::endl;
std::cout << " Number of vertices = " << simplex_tree.num_vertices() << " ";
std::cout << " Number of simplices = " << simplex_tree.num_simplices() << std::endl << std::endl;
diff --git a/utilities/Bitmap_cubical_complex/CMakeLists.txt b/utilities/Bitmap_cubical_complex/CMakeLists.txt
new file mode 100644
index 00000000..676a730a
--- /dev/null
+++ b/utilities/Bitmap_cubical_complex/CMakeLists.txt
@@ -0,0 +1,29 @@
+cmake_minimum_required(VERSION 2.6)
+project(Bitmap_cubical_complex_utilities)
+
+add_executable ( cubical_complex_persistence cubical_complex_persistence.cpp )
+if (TBB_FOUND)
+ target_link_libraries(cubical_complex_persistence ${TBB_LIBRARIES})
+endif()
+
+add_test(NAME Bitmap_cubical_complex_utility_persistence_one_sphere COMMAND $<TARGET_FILE:cubical_complex_persistence>
+ "${CMAKE_SOURCE_DIR}/data/bitmap/CubicalOneSphere.txt")
+
+add_test(NAME Bitmap_cubical_complex_utility_persistence_two_sphere COMMAND $<TARGET_FILE:cubical_complex_persistence>
+ "${CMAKE_SOURCE_DIR}/data/bitmap/CubicalTwoSphere.txt")
+
+add_executable ( periodic_cubical_complex_persistence periodic_cubical_complex_persistence.cpp )
+if (TBB_FOUND)
+ target_link_libraries(periodic_cubical_complex_persistence ${TBB_LIBRARIES})
+endif()
+
+add_test(NAME Bitmap_cubical_complex_utility_periodic_boundary_conditions_2d_torus
+ COMMAND $<TARGET_FILE:periodic_cubical_complex_persistence>
+ "${CMAKE_SOURCE_DIR}/data/bitmap/2d_torus.txt")
+
+add_test(NAME Bitmap_cubical_complex_utility_periodic_boundary_conditions_3d_torus
+ COMMAND $<TARGET_FILE:periodic_cubical_complex_persistence>
+ "${CMAKE_SOURCE_DIR}/data/bitmap/3d_torus.txt")
+
+install(TARGETS cubical_complex_persistence DESTINATION bin)
+install(TARGETS periodic_cubical_complex_persistence DESTINATION bin)
diff --git a/example/Bitmap_cubical_complex/Bitmap_cubical_complex.cpp b/utilities/Bitmap_cubical_complex/cubical_complex_persistence.cpp
index 67735ba1..9d1bc08c 100644
--- a/example/Bitmap_cubical_complex/Bitmap_cubical_complex.cpp
+++ b/utilities/Bitmap_cubical_complex/cubical_complex_persistence.cpp
@@ -20,7 +20,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-
#include <gudhi/reader_utils.h>
#include <gudhi/Bitmap_cubical_complex.h>
#include <gudhi/Persistent_cohomology.h>
@@ -32,16 +31,18 @@
#include <cstddef>
int main(int argc, char** argv) {
- std::cout << "This program computes persistent homology, by using bitmap_cubical_complex class, of cubical " <<
- "complexes provided in text files in Perseus style (the only numbered in the first line is a dimension D of a" <<
- "bitmap. In the lines I between 2 and D+1 there are numbers of top dimensional cells in the direction I. Let " <<
- "N denote product of the numbers in the lines between 2 and D. In the lines D+2 to D+2+N there are " <<
- "filtrations of top dimensional cells. We assume that the cells are in the lexicographical order. See " <<
- "CubicalOneSphere.txt or CubicalTwoSphere.txt for example.\n" << std::endl;
+ std::cout
+ << "This program computes persistent homology, by using bitmap_cubical_complex class, of cubical "
+ << "complexes provided in text files in Perseus style (the only numbered in the first line is a dimension D of a"
+ << "bitmap. In the lines I between 2 and D+1 there are numbers of top dimensional cells in the direction I. Let "
+ << "N denote product of the numbers in the lines between 2 and D. In the lines D+2 to D+2+N there are "
+ << "filtrations of top dimensional cells. We assume that the cells are in the lexicographical order. See "
+ << "CubicalOneSphere.txt or CubicalTwoSphere.txt for example.\n"
+ << std::endl;
if (argc != 2) {
- std::cerr << "Wrong number of parameters. Please provide the name of a file with a Perseus style bitmap at " <<
- "the input. The program will now terminate.\n";
+ std::cerr << "Wrong number of parameters. Please provide the name of a file with a Perseus style bitmap at "
+ << "the input. The program will now terminate.\n";
return 1;
}
@@ -54,7 +55,7 @@ int main(int argc, char** argv) {
// Compute the persistence diagram of the complex
Persistent_cohomology pcoh(b);
- int p = 2;
+ int p = 11;
double min_persistence = 0;
pcoh.init_coefficients(p); // initializes the coefficient field for homology
@@ -66,7 +67,7 @@ int main(int argc, char** argv) {
std::size_t last_in_path = output_file_name.find_last_of("/\\");
if (last_in_path != std::string::npos) {
- output_file_name = output_file_name.substr(last_in_path+1);
+ output_file_name = output_file_name.substr(last_in_path + 1);
}
std::ofstream out(output_file_name.c_str());
@@ -77,4 +78,3 @@ int main(int argc, char** argv) {
return 0;
}
-
diff --git a/utilities/Bitmap_cubical_complex/cubicalcomplex.md b/utilities/Bitmap_cubical_complex/cubicalcomplex.md
new file mode 100644
index 00000000..6e1b2578
--- /dev/null
+++ b/utilities/Bitmap_cubical_complex/cubicalcomplex.md
@@ -0,0 +1,29 @@
+
+
+# Cubical complex#
+
+## cubical_complex_persistence ##
+This program computes persistent homology, by using the Bitmap_cubical_complex class, of cubical complexes provided in text files in Perseus style.
+See [here](/doc/latest/fileformats.html#FileFormatsPerseus) for a description of the file format.
+
+**Example**
+
+```
+ cubical_complex_persistence data/bitmap/CubicalTwoSphere.txt
+```
+
+* Creates a Cubical Complex from the Perseus style file `CubicalTwoSphere.txt`,
+computes Persistence cohomology from it and writes the results in a persistence file `CubicalTwoSphere.txt_persistence`.
+
+## periodic_cubical_complex_persistence ##
+
+Same as above, but with periodic boundary conditions.
+
+**Example**
+
+```
+ periodic_cubical_complex_persistence data/bitmap/3d_torus.txt
+```
+
+* Creates a Periodical Cubical Complex from the Perseus style file `3d_torus.txt`,
+computes Persistence cohomology from it and writes the results in a persistence file `3d_torus.txt_persistence`.
diff --git a/example/Bitmap_cubical_complex/Bitmap_cubical_complex_periodic_boundary_conditions.cpp b/utilities/Bitmap_cubical_complex/periodic_cubical_complex_persistence.cpp
index 122160a2..c812cb3a 100644
--- a/example/Bitmap_cubical_complex/Bitmap_cubical_complex_periodic_boundary_conditions.cpp
+++ b/utilities/Bitmap_cubical_complex/periodic_cubical_complex_persistence.cpp
@@ -20,7 +20,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-
#include <gudhi/reader_utils.h>
#include <gudhi/Bitmap_cubical_complex.h>
#include <gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h>
@@ -33,22 +32,24 @@
#include <string>
int main(int argc, char** argv) {
- std::cout << "This program computes persistent homology, by using " <<
- "Bitmap_cubical_complex_periodic_boundary_conditions class, of cubical complexes provided in text files in " <<
- "Perseus style (the only numbered in the first line is a dimension D of a bitmap. In the lines I between 2 " <<
- "and D+1 there are numbers of top dimensional cells in the direction I. Let N denote product of the numbers " <<
- "in the lines between 2 and D. In the lines D+2 to D+2+N there are filtrations of top dimensional cells. We " <<
- "assume that the cells are in the lexicographical order. See CubicalOneSphere.txt or CubicalTwoSphere.txt for" <<
- " example.\n" << std::endl;
+ std::cout
+ << "This program computes persistent homology, by using "
+ << "Bitmap_cubical_complex_periodic_boundary_conditions class, of cubical complexes provided in text files in "
+ << "Perseus style (the only numbered in the first line is a dimension D of a bitmap. In the lines I between 2 "
+ << "and D+1 there are numbers of top dimensional cells in the direction I. Let N denote product of the numbers "
+ << "in the lines between 2 and D. In the lines D+2 to D+2+N there are filtrations of top dimensional cells. We "
+ << "assume that the cells are in the lexicographical order. See CubicalOneSphere.txt or CubicalTwoSphere.txt for"
+ << " example.\n"
+ << std::endl;
if (argc != 2) {
- std::cerr << "Wrong number of parameters. Please provide the name of a file with a Perseus style bitmap at " <<
- "the input. The program will now terminate.\n";
+ std::cerr << "Wrong number of parameters. Please provide the name of a file with a Perseus style bitmap at "
+ << "the input. The program will now terminate.\n";
return 1;
}
typedef Gudhi::cubical_complex::Bitmap_cubical_complex_periodic_boundary_conditions_base<double> Bitmap_base;
- typedef Gudhi::cubical_complex::Bitmap_cubical_complex< Bitmap_base > Bitmap_cubical_complex;
+ typedef Gudhi::cubical_complex::Bitmap_cubical_complex<Bitmap_base> Bitmap_cubical_complex;
Bitmap_cubical_complex b(argv[1]);
@@ -57,7 +58,7 @@ int main(int argc, char** argv) {
// Compute the persistence diagram of the complex
Persistent_cohomology pcoh(b, true);
- int p = 2;
+ int p = 11;
double min_persistence = 0;
pcoh.init_coefficients(p); // initializes the coefficient field for homology
pcoh.compute_persistent_cohomology(min_persistence);
@@ -68,7 +69,7 @@ int main(int argc, char** argv) {
std::size_t last_in_path = output_file_name.find_last_of("/\\");
if (last_in_path != std::string::npos) {
- output_file_name = output_file_name.substr(last_in_path+1);
+ output_file_name = output_file_name.substr(last_in_path + 1);
}
std::ofstream out(output_file_name.c_str());
@@ -79,4 +80,3 @@ int main(int argc, char** argv) {
return 0;
}
-
diff --git a/utilities/Bottleneck_distance/CMakeLists.txt b/utilities/Bottleneck_distance/CMakeLists.txt
new file mode 100644
index 00000000..d19e3b1c
--- /dev/null
+++ b/utilities/Bottleneck_distance/CMakeLists.txt
@@ -0,0 +1,16 @@
+cmake_minimum_required(VERSION 2.6)
+project(Bottleneck_distance_utilities)
+
+if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1)
+ add_executable (bottleneck_distance bottleneck_distance.cpp)
+ if (TBB_FOUND)
+ target_link_libraries(bottleneck_distance ${TBB_LIBRARIES})
+ endif(TBB_FOUND)
+
+ add_test(NAME Bottleneck_distance_utilities_Bottleneck_read_file
+ COMMAND $<TARGET_FILE:bottleneck_distance>
+ "${CMAKE_SOURCE_DIR}/data/persistence_diagram/first.pers" "${CMAKE_SOURCE_DIR}/data/persistence_diagram/second.pers")
+
+ install(TARGETS bottleneck_distance DESTINATION bin)
+
+endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1)
diff --git a/example/Bottleneck_distance/bottleneck_read_file_example.cpp b/utilities/Bottleneck_distance/bottleneck_distance.cpp
index 24d73c57..9dd52b31 100644
--- a/example/Bottleneck_distance/bottleneck_read_file_example.cpp
+++ b/utilities/Bottleneck_distance/bottleneck_distance.cpp
@@ -31,7 +31,7 @@
int main(int argc, char** argv) {
if (argc < 3) {
std::cout << "To run this program please provide as an input two files with persistence diagrams. Each file" <<
- " should contain a birth-death pair per line. Third, optional parameter is an error bound on a bottleneck" <<
+ " should contain a birth-death pair per line. Third, optional parameter is an error bound on the bottleneck" <<
" distance (set by default to the smallest positive double value). If you set the error bound to 0, be" <<
" aware this version is exact but expensive. The program will now terminate \n";
return -1;
diff --git a/utilities/Bottleneck_distance/bottleneckdistance.md b/utilities/Bottleneck_distance/bottleneckdistance.md
new file mode 100644
index 00000000..526f5822
--- /dev/null
+++ b/utilities/Bottleneck_distance/bottleneckdistance.md
@@ -0,0 +1,18 @@
+
+
+# Bottleneck distance #
+
+## bottleneck_read_file_example ##
+
+This program computes the Bottleneck distance between two persistence diagram files.
+
+**Usage**
+
+```
+ bottleneck_read_file_example <file_1.pers> <file_2.pers> [<tolerance>]
+```
+
+where
+
+* `<file_1.pers>` and `<file_2.pers>` must be in the format described [here](/doc/latest/fileformats.html#FileFormatsPers).
+* `<tolerance>` is an error bound on the bottleneck distance (set by default to the smallest positive double value).
diff --git a/utilities/Nerve_GIC/CMakeLists.txt b/utilities/Nerve_GIC/CMakeLists.txt
new file mode 100644
index 00000000..7762c8a0
--- /dev/null
+++ b/utilities/Nerve_GIC/CMakeLists.txt
@@ -0,0 +1,24 @@
+cmake_minimum_required(VERSION 2.6)
+project(Nerve_GIC_examples)
+
+if (NOT CGAL_VERSION VERSION_LESS 4.8.1)
+
+ add_executable ( Nerve Nerve.cpp )
+ add_executable ( VoronoiGIC VoronoiGIC.cpp )
+
+ if (TBB_FOUND)
+ target_link_libraries(Nerve ${TBB_LIBRARIES})
+ target_link_libraries(VoronoiGIC ${TBB_LIBRARIES})
+ endif()
+
+ file(COPY KeplerMapperVisuFromTxtFile.py km.py DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
+ # Copy files for not to pollute sources when testing
+ file(COPY "${CMAKE_SOURCE_DIR}/data/points/human.off" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
+
+ add_test(NAME Nerve_GIC_utilities_nerve COMMAND $<TARGET_FILE:Nerve>
+ "human.off" "2" "10" "0.3")
+
+ add_test(NAME Nerve_GIC_utilities_VoronoiGIC COMMAND $<TARGET_FILE:VoronoiGIC>
+ "human.off" "100")
+
+endif (NOT CGAL_VERSION VERSION_LESS 4.8.1)
diff --git a/utilities/Nerve_GIC/KeplerMapperVisuFromTxtFile.py b/utilities/Nerve_GIC/KeplerMapperVisuFromTxtFile.py
new file mode 100755
index 00000000..c811f610
--- /dev/null
+++ b/utilities/Nerve_GIC/KeplerMapperVisuFromTxtFile.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+
+import km
+import numpy as np
+from collections import defaultdict
+import argparse
+
+"""This file is part of the Gudhi Library. The Gudhi library
+ (Geometric Understanding in Higher Dimensions) is a generic C++
+ library for computational topology.
+
+ Author(s): Mathieu Carriere
+
+ Copyright (C) 2017 INRIA
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+__author__ = "Mathieu Carriere"
+__copyright__ = "Copyright (C) 2017 INRIA"
+__license__ = "GPL v3"
+
+parser = argparse.ArgumentParser(description='Creates an html Keppler Mapper '
+ 'file to visualize a SC.txt file.',
+ epilog='Example: '
+ './KeplerMapperVisuFromTxtFile.py '
+ '-f ../../data/points/human.off_sc.txt'
+ '- Constructs an human.off_sc.html file.')
+parser.add_argument("-f", "--file", type=str, required=True)
+
+args = parser.parse_args()
+
+with open(args.file, 'r') as f:
+ network = {}
+ mapper = km.KeplerMapper(verbose=0)
+ data = np.zeros((3,3))
+ projected_data = mapper.fit_transform( data, projection="sum", scaler=None )
+
+ nodes = defaultdict(list)
+ links = defaultdict(list)
+ custom = defaultdict(list)
+
+ dat = f.readline()
+ lens = f.readline()
+ color = f.readline();
+ param = [float(i) for i in f.readline().split(" ")]
+
+ nums = [int(i) for i in f.readline().split(" ")]
+ num_nodes = nums[0]
+ num_edges = nums[1]
+
+ for i in range(0,num_nodes):
+ point = [float(j) for j in f.readline().split(" ")]
+ nodes[ str(int(point[0])) ] = [ int(point[0]), point[1], int(point[2]) ]
+ links[ str(int(point[0])) ] = []
+ custom[ int(point[0]) ] = point[1]
+
+ m = min([custom[i] for i in range(0,num_nodes)])
+ M = max([custom[i] for i in range(0,num_nodes)])
+
+ for i in range(0,num_edges):
+ edge = [int(j) for j in f.readline().split(" ")]
+ links[ str(edge[0]) ].append( str(edge[1]) )
+ links[ str(edge[1]) ].append( str(edge[0]) )
+
+ network["nodes"] = nodes
+ network["links"] = links
+ network["meta"] = lens
+
+ html_output_filename = args.file.rsplit('.', 1)[0] + '.html'
+ mapper.visualize(network, color_function = color, path_html=html_output_filename, title=dat,
+ graph_link_distance=30, graph_gravity=0.1, graph_charge=-120, custom_tooltips=custom, width_html=0,
+ height_html=0, show_tooltips=True, show_title=True, show_meta=True, res=param[0],gain=param[1], minimum=m,maximum=M)
+ message = repr(html_output_filename) + " is generated. You can now use your favorite web browser to visualize it."
+ print(message)
+
+
+ f.close()
diff --git a/utilities/Nerve_GIC/Nerve.cpp b/utilities/Nerve_GIC/Nerve.cpp
new file mode 100644
index 00000000..aefc3874
--- /dev/null
+++ b/utilities/Nerve_GIC/Nerve.cpp
@@ -0,0 +1,96 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Mathieu Carrière
+ *
+ * Copyright (C) 2017 INRIA
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/GIC.h>
+
+#include <string>
+#include <vector>
+
+void usage(int nbArgs, char *const progName) {
+ std::cerr << "Error: Number of arguments (" << nbArgs << ") is not correct\n";
+ std::cerr << "Usage: " << progName << " filename.off coordinate resolution gain [-v] \n";
+ std::cerr << " i.e.: " << progName << " ../../data/points/human.off 2 10 0.3 -v \n";
+ exit(-1); // ----- >>
+}
+
+int main(int argc, char **argv) {
+ if ((argc != 5) && (argc != 6)) usage(argc, argv[0]);
+
+ using Point = std::vector<float>;
+
+ std::string off_file_name(argv[1]);
+ int coord = atoi(argv[2]);
+ int resolution = atoi(argv[3]);
+ double gain = atof(argv[4]);
+ bool verb = 0;
+ if (argc == 6) verb = 1;
+
+ // --------------------------------
+ // Init of a Nerve from an OFF file
+ // --------------------------------
+
+ Gudhi::cover_complex::Cover_complex<Point> SC;
+ SC.set_verbose(verb);
+
+ bool check = SC.read_point_cloud(off_file_name);
+
+ if (!check) {
+ std::cout << "Incorrect OFF file." << std::endl;
+ } else {
+ SC.set_type("Nerve");
+
+ SC.set_color_from_coordinate(coord);
+ SC.set_function_from_coordinate(coord);
+
+ SC.set_graph_from_OFF();
+ SC.set_resolution_with_interval_number(resolution);
+ SC.set_gain(gain);
+ SC.set_cover_from_function();
+
+ SC.find_simplices();
+
+ SC.write_info();
+
+ Gudhi::Simplex_tree<> stree;
+ SC.create_complex(stree);
+ SC.compute_PD();
+
+ // ----------------------------------------------------------------------------
+ // Display information about the graph induced complex
+ // ----------------------------------------------------------------------------
+
+ if (verb) {
+ std::cout << "Nerve is of dimension " << stree.dimension() << " - " << stree.num_simplices() << " simplices - "
+ << stree.num_vertices() << " vertices." << std::endl;
+
+ std::cout << "Iterator on Nerve simplices" << std::endl;
+ for (auto f_simplex : stree.filtration_simplex_range()) {
+ for (auto vertex : stree.simplex_vertex_range(f_simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << std::endl;
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/utilities/Nerve_GIC/Nerve.txt b/utilities/Nerve_GIC/Nerve.txt
new file mode 100644
index 00000000..839ff45e
--- /dev/null
+++ b/utilities/Nerve_GIC/Nerve.txt
@@ -0,0 +1,63 @@
+Min function value = -0.979672 and Max function value = 0.816414
+Interval 0 = [-0.979672, -0.761576]
+Interval 1 = [-0.838551, -0.581967]
+Interval 2 = [-0.658942, -0.402359]
+Interval 3 = [-0.479334, -0.22275]
+Interval 4 = [-0.299725, -0.0431415]
+Interval 5 = [-0.120117, 0.136467]
+Interval 6 = [0.059492, 0.316076]
+Interval 7 = [0.239101, 0.495684]
+Interval 8 = [0.418709, 0.675293]
+Interval 9 = [0.598318, 0.816414]
+Computing preimages...
+Computing connected components...
+.txt generated. It can be visualized with e.g. python KeplerMapperVisuFromTxtFile.py and firefox.
+5 interval(s) in dimension 0:
+ [-0.909111, 0.00817529]
+ [-0.171433, 0.367392]
+ [-0.171433, 0.367392]
+ [-0.909111, 0.745853]
+0 interval(s) in dimension 1:
+Nerve is of dimension 1 - 41 simplices - 21 vertices.
+Iterator on Nerve simplices
+1
+0
+4
+4 0
+2
+2 1
+8
+8 2
+5
+5 4
+9
+9 8
+13
+13 5
+14
+14 9
+19
+19 13
+25
+32
+20
+32 20
+33
+33 25
+26
+26 14
+26 19
+42
+42 26
+34
+34 33
+27
+27 20
+35
+35 27
+35 34
+42 35
+44
+44 35
+54
+54 44 \ No newline at end of file
diff --git a/utilities/Nerve_GIC/VoronoiGIC.cpp b/utilities/Nerve_GIC/VoronoiGIC.cpp
new file mode 100644
index 00000000..54bb871e
--- /dev/null
+++ b/utilities/Nerve_GIC/VoronoiGIC.cpp
@@ -0,0 +1,90 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Mathieu Carrière
+ *
+ * Copyright (C) 2017 INRIA
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/GIC.h>
+
+#include <string>
+#include <vector>
+
+void usage(int nbArgs, char *const progName) {
+ std::cerr << "Error: Number of arguments (" << nbArgs << ") is not correct\n";
+ std::cerr << "Usage: " << progName << " filename.off N [-v] \n";
+ std::cerr << " i.e.: " << progName << " ../../data/points/human.off 100 -v \n";
+ exit(-1); // ----- >>
+}
+
+int main(int argc, char **argv) {
+ if ((argc != 3) && (argc != 4)) usage(argc, argv[0]);
+
+ using Point = std::vector<float>;
+
+ std::string off_file_name(argv[1]);
+ int m = atoi(argv[2]);
+ bool verb = 0;
+ if (argc == 4) verb = 1;
+
+ // ----------------------------------------------------------------------------
+ // Init of a graph induced complex from an OFF file
+ // ----------------------------------------------------------------------------
+
+ Gudhi::cover_complex::Cover_complex<Point> GIC;
+ GIC.set_verbose(verb);
+
+ bool check = GIC.read_point_cloud(off_file_name);
+
+ if (!check) {
+ std::cout << "Incorrect OFF file." << std::endl;
+ } else {
+ GIC.set_type("GIC");
+
+ GIC.set_color_from_coordinate();
+
+ GIC.set_graph_from_OFF();
+ GIC.set_cover_from_Voronoi(Gudhi::Euclidean_distance(), m);
+
+ GIC.find_simplices();
+
+ GIC.plot_OFF();
+
+ Gudhi::Simplex_tree<> stree;
+ GIC.create_complex(stree);
+
+ // ----------------------------------------------------------------------------
+ // Display information about the graph induced complex
+ // ----------------------------------------------------------------------------
+
+ if (verb) {
+ std::cout << "Graph induced complex is of dimension " << stree.dimension() << " - " << stree.num_simplices()
+ << " simplices - " << stree.num_vertices() << " vertices." << std::endl;
+
+ std::cout << "Iterator on graph induced complex simplices" << std::endl;
+ for (auto f_simplex : stree.filtration_simplex_range()) {
+ for (auto vertex : stree.simplex_vertex_range(f_simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << std::endl;
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/utilities/Nerve_GIC/covercomplex.md b/utilities/Nerve_GIC/covercomplex.md
new file mode 100644
index 00000000..f33cb2e0
--- /dev/null
+++ b/utilities/Nerve_GIC/covercomplex.md
@@ -0,0 +1,62 @@
+
+
+# Cover complex #
+
+
+## Nerve ##
+This program builds the Nerve of a point cloud sampled on an OFF file.
+The cover C comes from the preimages of intervals covering a coordinate function,
+which are then refined into their connected components using the triangulation of the .OFF file.
+
+The program also writes a file SC.txt.
+The first three lines in this file are the location of the input point cloud and the function used to compute the cover.
+The fourth line contains the number of vertices nv and edges ne of the Nerve. The next nv lines represent the vertices.
+Each line contains the vertex ID, the number of data points it contains, and their average color function value.
+Finally, the next ne lines represent the edges, characterized by the ID of their vertices.
+
+**Usage**
+
+`Nerve <OFF input file> coordinate resolution gain [-v]`
+
+where
+
+* `coordinate` is the coordinate function to cover
+* `resolution` is the number of the intervals
+* `gain` is the gain for each interval
+* `-v` is optional, it activates verbose mode.
+
+**Example**
+
+`Nerve ../../data/points/human.off 2 10 0.3`
+
+* Builds the Nerve of a point cloud sampled on a 3D human shape (human.off).
+The cover C comes from the preimages of intervals (10 intervals with gain 0.3) covering the height function (coordinate 2).
+
+`python KeplerMapperVisuFromTxtFile.py -f ../../data/points/human.off_sc.txt`
+
+* Constructs `human.off_sc.html` file. You can now use your favorite web browser to visualize it.
+
+## VoronoiGIC ##
+
+This util builds the Graph Induced Complex (GIC) of a point cloud.
+It subsamples *N* points in the point cloud, which act as seeds of a geodesic Voronoï diagram.
+Each cell of the diagram is then an element of C.
+
+The program also writes a file `*_sc.off`, that is an OFF file that can be visualized with GeomView.
+
+**Usage**
+
+`VoroniGIC <OFF input file> samples_number [-v]`
+
+where
+
+* `samples_number` is the number of samples to take from the point cloud
+* `-v` is optional, it activates verbose mode.
+
+**Example**
+
+`VoroniGIC ../../data/points/human.off 700`
+
+* Builds the Voronoi Graph Induced Complex with 700 subsamples from `human.off` file.
+`../../data/points/human_sc.off` can be visualized with GeomView.
+
diff --git a/utilities/Nerve_GIC/km.py b/utilities/Nerve_GIC/km.py
new file mode 100755
index 00000000..53024aab
--- /dev/null
+++ b/utilities/Nerve_GIC/km.py
@@ -0,0 +1,390 @@
+from __future__ import division
+import numpy as np
+from collections import defaultdict
+import json
+import itertools
+from sklearn import cluster, preprocessing, manifold
+from datetime import datetime
+import sys
+
+class KeplerMapper(object):
+ # With this class you can build topological networks from (high-dimensional) data.
+ #
+ # 1) Fit a projection/lens/function to a dataset and transform it.
+ # For instance "mean_of_row(x) for x in X"
+ # 2) Map this projection with overlapping intervals/hypercubes.
+ # Cluster the points inside the interval
+ # (Note: we cluster on the inverse image/original data to lessen projection loss).
+ # If two clusters/nodes have the same members (due to the overlap), then:
+ # connect these with an edge.
+ # 3) Visualize the network using HTML and D3.js.
+ #
+ # functions
+ # ---------
+ # fit_transform: Create a projection (lens) from a dataset
+ # map: Apply Mapper algorithm on this projection and build a simplicial complex
+ # visualize: Turns the complex dictionary into a HTML/D3.js visualization
+
+ def __init__(self, verbose=2):
+ self.verbose = verbose
+
+ self.chunk_dist = []
+ self.overlap_dist = []
+ self.d = []
+ self.nr_cubes = 0
+ self.overlap_perc = 0
+ self.clusterer = False
+
+ def fit_transform(self, X, projection="sum", scaler=preprocessing.MinMaxScaler()):
+ # Creates the projection/lens from X.
+ #
+ # Input: X. Input features as a numpy array.
+ # Output: projected_X. original data transformed to a projection (lens).
+ #
+ # parameters
+ # ----------
+ # projection: Projection parameter is either a string,
+ # a scikit class with fit_transform, like manifold.TSNE(),
+ # or a list of dimension indices.
+ # scaler: if None, do no scaling, else apply scaling to the projection
+ # Default: Min-Max scaling
+
+ self.scaler = scaler
+ self.projection = str(projection)
+
+ # Detect if projection is a class (for scikit-learn)
+ #if str(type(projection))[1:6] == "class": #TODO: de-ugly-fy
+ # reducer = projection
+ # if self.verbose > 0:
+ # try:
+ # projection.set_params(**{"verbose":self.verbose})
+ # except:
+ # pass
+ # print("\n..Projecting data using: \n\t%s\n"%str(projection))
+ # X = reducer.fit_transform(X)
+
+ # Detect if projection is a string (for standard functions)
+ if isinstance(projection, str):
+ if self.verbose > 0:
+ print("\n..Projecting data using: %s"%(projection))
+ # Stats lenses
+ if projection == "sum": # sum of row
+ X = np.sum(X, axis=1).reshape((X.shape[0],1))
+ if projection == "mean": # mean of row
+ X = np.mean(X, axis=1).reshape((X.shape[0],1))
+ if projection == "median": # mean of row
+ X = np.median(X, axis=1).reshape((X.shape[0],1))
+ if projection == "max": # max of row
+ X = np.max(X, axis=1).reshape((X.shape[0],1))
+ if projection == "min": # min of row
+ X = np.min(X, axis=1).reshape((X.shape[0],1))
+ if projection == "std": # std of row
+ X = np.std(X, axis=1).reshape((X.shape[0],1))
+
+ if projection == "dist_mean": # Distance of x to mean of X
+ X_mean = np.mean(X, axis=0)
+ X = np.sum(np.sqrt((X - X_mean)**2), axis=1).reshape((X.shape[0],1))
+
+ # Detect if projection is a list (with dimension indices)
+ if isinstance(projection, list):
+ if self.verbose > 0:
+ print("\n..Projecting data using: %s"%(str(projection)))
+ X = X[:,np.array(projection)]
+
+ # Scaling
+ if scaler is not None:
+ if self.verbose > 0:
+ print("\n..Scaling with: %s\n"%str(scaler))
+ X = scaler.fit_transform(X)
+
+ return X
+
+ def map(self, projected_X, inverse_X=None, clusterer=cluster.DBSCAN(eps=0.5,min_samples=3), nr_cubes=10, overlap_perc=0.1):
+ # This maps the data to a simplicial complex. Returns a dictionary with nodes and links.
+ #
+ # Input: projected_X. A Numpy array with the projection/lens.
+ # Output: complex. A dictionary with "nodes", "links" and "meta information"
+ #
+ # parameters
+ # ----------
+ # projected_X projected_X. A Numpy array with the projection/lens. Required.
+ # inverse_X Numpy array or None. If None then the projection itself is used for clustering.
+ # clusterer Scikit-learn API compatible clustering algorithm. Default: DBSCAN
+ # nr_cubes Int. The number of intervals/hypercubes to create.
+ # overlap_perc Float. The percentage of overlap "between" the intervals/hypercubes.
+
+ start = datetime.now()
+
+ # Helper function
+ def cube_coordinates_all(nr_cubes, nr_dimensions):
+ # Helper function to get origin coordinates for our intervals/hypercubes
+ # Useful for looping no matter the number of cubes or dimensions
+ # Example: if there are 4 cubes per dimension and 3 dimensions
+ # return the bottom left (origin) coordinates of 64 hypercubes,
+ # as a sorted list of Numpy arrays
+ # TODO: elegance-ify...
+ l = []
+ for x in range(nr_cubes):
+ l += [x] * nr_dimensions
+ return [np.array(list(f)) for f in sorted(set(itertools.permutations(l,nr_dimensions)))]
+
+ nodes = defaultdict(list)
+ links = defaultdict(list)
+ complex = {}
+ self.nr_cubes = nr_cubes
+ self.clusterer = clusterer
+ self.overlap_perc = overlap_perc
+
+ if self.verbose > 0:
+ print("Mapping on data shaped %s using dimensions\n"%(str(projected_X.shape)))
+
+ # If inverse image is not provided, we use the projection as the inverse image (suffer projection loss)
+ if inverse_X is None:
+ inverse_X = projected_X
+
+ # We chop up the min-max column ranges into 'nr_cubes' parts
+ self.chunk_dist = (np.max(projected_X, axis=0) - np.min(projected_X, axis=0))/nr_cubes
+
+ # We calculate the overlapping windows distance
+ self.overlap_dist = self.overlap_perc * self.chunk_dist
+
+ # We find our starting point
+ self.d = np.min(projected_X, axis=0)
+
+ # Use a dimension index array on the projected X
+ # (For now this uses the entire dimensionality, but we keep for experimentation)
+ di = np.array([x for x in range(projected_X.shape[1])])
+
+ # Prefix'ing the data with ID's
+ ids = np.array([x for x in range(projected_X.shape[0])])
+ projected_X = np.c_[ids,projected_X]
+ inverse_X = np.c_[ids,inverse_X]
+
+ # Subdivide the projected data X in intervals/hypercubes with overlap
+ if self.verbose > 0:
+ total_cubes = len(cube_coordinates_all(nr_cubes,projected_X.shape[1]))
+ print("Creating %s hypercubes."%total_cubes)
+
+ for i, coor in enumerate(cube_coordinates_all(nr_cubes,di.shape[0])):
+ # Slice the hypercube
+ hypercube = projected_X[ np.invert(np.any((projected_X[:,di+1] >= self.d[di] + (coor * self.chunk_dist[di])) &
+ (projected_X[:,di+1] < self.d[di] + (coor * self.chunk_dist[di]) + self.chunk_dist[di] + self.overlap_dist[di]) == False, axis=1 )) ]
+
+ if self.verbose > 1:
+ print("There are %s points in cube_%s / %s with starting range %s"%
+ (hypercube.shape[0],i,total_cubes,self.d[di] + (coor * self.chunk_dist[di])))
+
+ # If at least one sample inside the hypercube
+ if hypercube.shape[0] > 0:
+ # Cluster the data point(s) in the cube, skipping the id-column
+ # Note that we apply clustering on the inverse image (original data samples) that fall inside the cube.
+ inverse_x = inverse_X[[int(nn) for nn in hypercube[:,0]]]
+
+ clusterer.fit(inverse_x[:,1:])
+
+ if self.verbose > 1:
+ print("Found %s clusters in cube_%s\n"%(np.unique(clusterer.labels_[clusterer.labels_ > -1]).shape[0],i))
+
+ #Now for every (sample id in cube, predicted cluster label)
+ for a in np.c_[hypercube[:,0],clusterer.labels_]:
+ if a[1] != -1: #if not predicted as noise
+ cluster_id = str(coor[0])+"_"+str(i)+"_"+str(a[1])+"_"+str(coor)+"_"+str(self.d[di] + (coor * self.chunk_dist[di])) # TODO: de-rudimentary-ify
+ nodes[cluster_id].append( int(a[0]) ) # Append the member id's as integers
+ else:
+ if self.verbose > 1:
+ print("Cube_%s is empty.\n"%(i))
+
+ # Create links when clusters from different hypercubes have members with the same sample id.
+ candidates = itertools.combinations(nodes.keys(),2)
+ for candidate in candidates:
+ # if there are non-unique members in the union
+ if len(nodes[candidate[0]]+nodes[candidate[1]]) != len(set(nodes[candidate[0]]+nodes[candidate[1]])):
+ links[candidate[0]].append( candidate[1] )
+
+ # Reporting
+ if self.verbose > 0:
+ nr_links = 0
+ for k in links:
+ nr_links += len(links[k])
+ print("\ncreated %s edges and %s nodes in %s."%(nr_links,len(nodes),str(datetime.now()-start)))
+
+ complex["nodes"] = nodes
+ complex["links"] = links
+ complex["meta"] = self.projection
+
+ return complex
+
+ def visualize(self, complex, color_function="", path_html="mapper_visualization_output.html", title="My Data",
+ graph_link_distance=30, graph_gravity=0.1, graph_charge=-120, custom_tooltips=None, width_html=0,
+ height_html=0, show_tooltips=True, show_title=True, show_meta=True, res=0,gain=0,minimum=0,maximum=0):
+ # Turns the dictionary 'complex' in a html file with d3.js
+ #
+ # Input: complex. Dictionary (output from calling .map())
+ # Output: a HTML page saved as a file in 'path_html'.
+ #
+ # parameters
+ # ----------
+ # color_function string. Not fully implemented. Default: "" (distance to origin)
+ # path_html file path as string. Where to save the HTML page.
+ # title string. HTML page document title and first heading.
+ # graph_link_distance int. Edge length.
+ # graph_gravity float. "Gravity" to center of layout.
+ # graph_charge int. charge between nodes.
+ # custom_tooltips None or Numpy Array. You could use "y"-label array for this.
+ # width_html int. Width of canvas. Default: 0 (full width)
+ # height_html int. Height of canvas. Default: 0 (full height)
+ # show_tooltips bool. default:True
+ # show_title bool. default:True
+ # show_meta bool. default:True
+
+ # Format JSON for D3 graph
+ json_s = {}
+ json_s["nodes"] = []
+ json_s["links"] = []
+ k2e = {} # a key to incremental int dict, used for id's when linking
+
+ for e, k in enumerate(complex["nodes"]):
+ # Tooltip and node color formatting, TODO: de-mess-ify
+ if custom_tooltips is not None:
+ tooltip_s = "<h2>Cluster %s</h2>"%k + " ".join(str(custom_tooltips[complex["nodes"][k][0]]).split(" "))
+ if maximum == minimum:
+ tooltip_i = 0
+ else:
+ tooltip_i = int(30*(custom_tooltips[complex["nodes"][k][0]]-minimum)/(maximum-minimum))
+ json_s["nodes"].append({"name": str(k), "tooltip": tooltip_s, "group": 2 * int(np.log(complex["nodes"][k][2])), "color": tooltip_i})
+ else:
+ tooltip_s = "<h2>Cluster %s</h2>Contains %s members."%(k,len(complex["nodes"][k]))
+ json_s["nodes"].append({"name": str(k), "tooltip": tooltip_s, "group": 2 * int(np.log(len(complex["nodes"][k]))), "color": str(k.split("_")[0])})
+ k2e[k] = e
+ for k in complex["links"]:
+ for link in complex["links"][k]:
+ json_s["links"].append({"source": k2e[k], "target":k2e[link],"value":1})
+
+ # Width and height of graph in HTML output
+ if width_html == 0:
+ width_css = "100%"
+ width_js = 'document.getElementById("holder").offsetWidth-20'
+ else:
+ width_css = "%spx" % width_html
+ width_js = "%s" % width_html
+ if height_html == 0:
+ height_css = "100%"
+ height_js = 'document.getElementById("holder").offsetHeight-20'
+ else:
+ height_css = "%spx" % height_html
+ height_js = "%s" % height_html
+
+ # Whether to show certain UI elements or not
+ if show_tooltips == False:
+ tooltips_display = "display: none;"
+ else:
+ tooltips_display = ""
+
+ if show_meta == False:
+ meta_display = "display: none;"
+ else:
+ meta_display = ""
+
+ if show_title == False:
+ title_display = "display: none;"
+ else:
+ title_display = ""
+
+ with open(path_html,"wb") as outfile:
+ html = """<!DOCTYPE html>
+ <meta charset="utf-8">
+ <meta name="generator" content="KeplerMapper">
+ <title>%s | KeplerMapper</title>
+ <link href='https://fonts.googleapis.com/css?family=Roboto:700,300' rel='stylesheet' type='text/css'>
+ <style>
+ * {margin: 0; padding: 0;}
+ html { height: 100%%;}
+ body {background: #111; height: 100%%; font: 100 16px Roboto, Sans-serif;}
+ .link { stroke: #999; stroke-opacity: .333; }
+ .divs div { border-radius: 50%%; background: red; position: absolute; }
+ .divs { position: absolute; top: 0; left: 0; }
+ #holder { position: relative; width: %s; height: %s; background: #111; display: block;}
+ h1 { %s padding: 20px; color: #fafafa; text-shadow: 0px 1px #000,0px -1px #000; position: absolute; font: 300 30px Roboto, Sans-serif;}
+ h2 { text-shadow: 0px 1px #000,0px -1px #000; font: 700 16px Roboto, Sans-serif;}
+ .meta { position: absolute; opacity: 0.9; width: 220px; top: 80px; left: 20px; display: block; %s background: #000; line-height: 25px; color: #fafafa; border: 20px solid #000; font: 100 16px Roboto, Sans-serif;}
+ div.tooltip { position: absolute; width: 380px; display: block; %s padding: 20px; background: #000; border: 0px; border-radius: 3px; pointer-events: none; z-index: 999; color: #FAFAFA;}
+ }
+ </style>
+ <body>
+ <div id="holder">
+ <h1>%s</h1>
+ <p class="meta">
+ <b>Lens</b><br>%s<br><br>
+ <b>Length of intervals</b><br>%s<br><br>
+ <b>Overlap percentage</b><br>%s%%<br><br>
+ <b>Color Function</b><br>%s
+ </p>
+ </div>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
+ <script>
+ var width = %s,
+ height = %s;
+ var color = d3.scale.ordinal()
+ .domain(["0","1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30"])
+ .range(["#FF0000","#FF1400","#FF2800","#FF3c00","#FF5000","#FF6400","#FF7800","#FF8c00","#FFa000","#FFb400","#FFc800","#FFdc00","#FFf000","#fdff00","#b0ff00","#65ff00","#17ff00","#00ff36","#00ff83","#00ffd0","#00e4ff","#00c4ff","#00a4ff","#00a4ff","#0084ff","#0064ff","#0044ff","#0022ff","#0002ff","#0100ff","#0300ff","#0500ff"]);
+ var force = d3.layout.force()
+ .charge(%s)
+ .linkDistance(%s)
+ .gravity(%s)
+ .size([width, height]);
+ var svg = d3.select("#holder").append("svg")
+ .attr("width", width)
+ .attr("height", height);
+
+ var div = d3.select("#holder").append("div")
+ .attr("class", "tooltip")
+ .style("opacity", 0.0);
+
+ var divs = d3.select('#holder').append('div')
+ .attr('class', 'divs')
+ .attr('style', function(d) { return 'overflow: hidden; width: ' + width + 'px; height: ' + height + 'px;'; });
+
+ graph = %s;
+ force
+ .nodes(graph.nodes)
+ .links(graph.links)
+ .start();
+ var link = svg.selectAll(".link")
+ .data(graph.links)
+ .enter().append("line")
+ .attr("class", "link")
+ .style("stroke-width", function(d) { return Math.sqrt(d.value); });
+ var node = divs.selectAll('div')
+ .data(graph.nodes)
+ .enter().append('div')
+ .on("mouseover", function(d) {
+ div.transition()
+ .duration(200)
+ .style("opacity", .9);
+ div .html(d.tooltip + "<br/>")
+ .style("left", (d3.event.pageX + 100) + "px")
+ .style("top", (d3.event.pageY - 28) + "px");
+ })
+ .on("mouseout", function(d) {
+ div.transition()
+ .duration(500)
+ .style("opacity", 0);
+ })
+ .call(force.drag);
+
+ node.append("title")
+ .text(function(d) { return d.name; });
+ force.on("tick", function() {
+ link.attr("x1", function(d) { return d.source.x; })
+ .attr("y1", function(d) { return d.source.y; })
+ .attr("x2", function(d) { return d.target.x; })
+ .attr("y2", function(d) { return d.target.y; });
+ node.attr("cx", function(d) { return d.x; })
+ .attr("cy", function(d) { return d.y; })
+ .attr('style', function(d) { return 'width: ' + (d.group * 2) + 'px; height: ' + (d.group * 2) + 'px; ' + 'left: '+(d.x-(d.group))+'px; ' + 'top: '+(d.y-(d.group))+'px; background: '+color(d.color)+'; box-shadow: 0px 0px 3px #111; box-shadow: 0px 0px 33px '+color(d.color)+', inset 0px 0px 5px rgba(0, 0, 0, 0.2);'})
+ ;
+ });
+ </script>"""%(title,width_css, height_css, title_display, meta_display, tooltips_display, title,complex["meta"],res,gain*100,color_function,width_js,height_js,graph_charge,graph_link_distance,graph_gravity,json.dumps(json_s))
+ outfile.write(html.encode("utf-8"))
+ if self.verbose > 0:
+ print("\nWrote d3.js graph to '%s'"%path_html)
diff --git a/utilities/Nerve_GIC/km.py.COPYRIGHT b/utilities/Nerve_GIC/km.py.COPYRIGHT
new file mode 100644
index 00000000..bef7b121
--- /dev/null
+++ b/utilities/Nerve_GIC/km.py.COPYRIGHT
@@ -0,0 +1,26 @@
+km.py is a fork of https://github.com/MLWave/kepler-mapper.
+Only the visualization part has been kept (Mapper part has been removed).
+
+This file has te following Copyright :
+
+The MIT License (MIT)
+
+Copyright (c) 2015 Triskelion - HJ van Veen - info@mlwave.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/utilities/Persistence_representations/CMakeLists.txt b/utilities/Persistence_representations/CMakeLists.txt
new file mode 100644
index 00000000..137eb0c1
--- /dev/null
+++ b/utilities/Persistence_representations/CMakeLists.txt
@@ -0,0 +1,53 @@
+# Copy files, otherwise result files are created in sources
+file(COPY "${CMAKE_SOURCE_DIR}/data/persistence_diagram/first.pers" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/")
+file(COPY "${CMAKE_SOURCE_DIR}/data/persistence_diagram/second.pers" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/")
+
+function(add_persistence_representation_creation_utility creation_utility)
+ add_executable ( ${creation_utility} ${creation_utility}.cpp )
+
+ # as the function is called in a subdirectory level, need to '../' to find persistence files
+ # ARGN will add all the other arguments (except creation_utility) sent to the CMake functions
+ add_test(NAME Persistence_representation_utilities_${creation_utility} COMMAND $<TARGET_FILE:${creation_utility}>
+ ${ARGN} "${CMAKE_CURRENT_BINARY_DIR}/../first.pers"
+ "${CMAKE_CURRENT_BINARY_DIR}/../second.pers")
+endfunction(add_persistence_representation_creation_utility)
+
+function(add_persistence_representation_plot_utility plot_utility tool_extension)
+ add_executable ( ${plot_utility} ${plot_utility}.cpp )
+
+ # as the function is called in a subdirectory level, need to '../' to find persistence heat maps files
+ add_test(NAME Persistence_representation_utilities_${plot_utility}_first COMMAND $<TARGET_FILE:${plot_utility}>
+ "${CMAKE_CURRENT_BINARY_DIR}/../first.pers${tool_extension}")
+ #add_test(NAME Persistence_representation_utilities_${plot_utility}_second COMMAND $<TARGET_FILE:${plot_utility}>
+ # "${CMAKE_CURRENT_BINARY_DIR}/../second.pers${tool_extension}")
+ if(GNUPLOT_PATH)
+ add_test(NAME Persistence_representation_utilities_${plot_utility}_first_gnuplot COMMAND ${GNUPLOT_PATH}
+ "-e" "load '${CMAKE_CURRENT_BINARY_DIR}/../first.pers${tool_extension}_GnuplotScript'")
+ #add_test(NAME Persistence_representation_utilities_${plot_utility}_second_gnuplot COMMAND ${GNUPLOT_PATH}
+ # "-e" "load '${CMAKE_CURRENT_BINARY_DIR}/../second.pers${tool_extension}_GnuplotScript'")
+ endif()
+endfunction(add_persistence_representation_plot_utility)
+
+function(add_persistence_representation_function_utility function_utility tool_extension)
+ add_executable ( ${function_utility} ${function_utility}.cpp )
+
+ # ARGV2 is an optional argument
+ if (${ARGV2})
+ # as the function is called in a subdirectory level, need to '../' to find persistence heat maps files
+ add_test(NAME Persistence_representation_utilities_${function_utility} COMMAND $<TARGET_FILE:${function_utility}>
+ "${ARGV2}"
+ "${CMAKE_CURRENT_BINARY_DIR}/../first.pers${tool_extension}"
+ "${CMAKE_CURRENT_BINARY_DIR}/../second.pers${tool_extension}")
+ else()
+ # as the function is called in a subdirectory level, need to '../' to find persistence heat maps files
+ add_test(NAME Persistence_representation_utilities_${function_utility} COMMAND $<TARGET_FILE:${function_utility}>
+ "${CMAKE_CURRENT_BINARY_DIR}/../first.pers${tool_extension}"
+ "${CMAKE_CURRENT_BINARY_DIR}/../second.pers${tool_extension}")
+ endif()
+endfunction(add_persistence_representation_function_utility)
+
+add_subdirectory(persistence_heat_maps)
+add_subdirectory(persistence_intervals)
+add_subdirectory(persistence_landscapes)
+add_subdirectory(persistence_landscapes_on_grid)
+add_subdirectory(persistence_vectors)
diff --git a/utilities/Persistence_representations/persistence_heat_maps/CMakeLists.txt b/utilities/Persistence_representations/persistence_heat_maps/CMakeLists.txt
new file mode 100644
index 00000000..386e9fa5
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_heat_maps/CMakeLists.txt
@@ -0,0 +1,15 @@
+cmake_minimum_required(VERSION 2.6)
+project(Persistence_representations_heat_maps_utilities)
+
+add_persistence_representation_creation_utility(create_pssk "10" "-1" "-1" "4" "-1")
+add_persistence_representation_creation_utility(create_p_h_m_weighted_by_arctan_of_their_persistence "10" "-1" "-1" "4" "-1")
+add_persistence_representation_creation_utility(create_p_h_m_weighted_by_distance_from_diagonal "10" "-1" "-1" "4" "-1")
+add_persistence_representation_creation_utility(create_p_h_m_weighted_by_squared_diag_distance "10" "-1" "-1" "4" "-1")
+# Need to set grid min and max for further average, distance and scalar_product
+add_persistence_representation_creation_utility(create_persistence_heat_maps "10" "0" "35" "10" "-1")
+
+add_persistence_representation_plot_utility(plot_persistence_heat_map ".mps")
+
+add_persistence_representation_function_utility(average_persistence_heat_maps ".mps")
+add_persistence_representation_function_utility(compute_distance_of_persistence_heat_maps ".mps" "1")
+add_persistence_representation_function_utility(compute_scalar_product_of_persistence_heat_maps ".mps")
diff --git a/utilities/Persistence_representations/persistence_heat_maps/average_persistence_heat_maps.cpp b/utilities/Persistence_representations/persistence_heat_maps/average_persistence_heat_maps.cpp
new file mode 100644
index 00000000..6739e0b6
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_heat_maps/average_persistence_heat_maps.cpp
@@ -0,0 +1,63 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_heat_maps.h>
+
+#include <iostream>
+#include <vector>
+
+using constant_scaling_function = Gudhi::Persistence_representations::constant_scaling_function;
+using Persistence_heat_maps = Gudhi::Persistence_representations::Persistence_heat_maps<constant_scaling_function>;
+
+int main(int argc, char** argv) {
+ std::cout << "This program computes average of persistence heat maps stored in files (the files needs to be "
+ << "created beforehand).\n"
+ << "The parameters of this programs are names of files with persistence heat maps.\n";
+
+ if (argc < 3) {
+ std::cout << "Wrong number of parameters, the program will now terminate \n";
+ return 1;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 1; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+
+ std::vector<Persistence_heat_maps*> maps;
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ Persistence_heat_maps* l = new Persistence_heat_maps;
+ l->load_from_file(filenames[i]);
+ maps.push_back(l);
+ }
+
+ Persistence_heat_maps av;
+ av.compute_average(maps);
+ av.print_to_file("average.mps");
+
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ delete maps[i];
+ }
+
+ std::cout << "Average can be found in 'average.mps' file\n";
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_heat_maps/compute_distance_of_persistence_heat_maps.cpp b/utilities/Persistence_representations/persistence_heat_maps/compute_distance_of_persistence_heat_maps.cpp
new file mode 100644
index 00000000..ed8278a2
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_heat_maps/compute_distance_of_persistence_heat_maps.cpp
@@ -0,0 +1,94 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_heat_maps.h>
+
+#include <iostream>
+#include <sstream>
+#include <limits>
+#include <vector>
+
+using constant_scaling_function = Gudhi::Persistence_representations::constant_scaling_function;
+using Persistence_heat_maps = Gudhi::Persistence_representations::Persistence_heat_maps<constant_scaling_function>;
+
+int main(int argc, char** argv) {
+ std::cout << "This program computes distance of persistence heat maps stored in files (the files needs to be "
+ << "created beforehand).\n"
+ << "The first parameter of a program is an integer p. The program compute L^p distance of the two heat "
+ << "maps. For L^infty distance choose p = -1. \n"
+ << "The remaining parameters of this program are names of files with persistence heat maps.\n";
+
+ if (argc < 3) {
+ std::cout << "Wrong number of parameters, the program will now terminate \n";
+ return 1;
+ }
+
+ int pp = atoi(argv[1]);
+ double p = std::numeric_limits<double>::max();
+ if (pp != -1) {
+ p = pp;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 2; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+ std::vector<Persistence_heat_maps> maps;
+ maps.reserve(filenames.size());
+ for (size_t file_no = 0; file_no != filenames.size(); ++file_no) {
+ Persistence_heat_maps l;
+ l.load_from_file(filenames[file_no]);
+ maps.push_back(l);
+ }
+
+ // and now we will compute the scalar product of landscapes.
+
+ // first we prepare an array:
+ std::vector<std::vector<double> > distance(filenames.size());
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::vector<double> v(filenames.size(), 0);
+ distance[i] = v;
+ }
+
+ // and now we can compute the distances:
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ for (size_t j = i; j != filenames.size(); ++j) {
+ distance[i][j] = distance[j][i] = maps[i].distance(maps[j], p);
+ }
+ }
+
+ // and now output the result to the screen and a file:
+ std::ofstream out;
+ out.open("distance.mps");
+ for (size_t i = 0; i != distance.size(); ++i) {
+ for (size_t j = 0; j != distance.size(); ++j) {
+ std::cout << distance[i][j] << " ";
+ out << distance[i][j] << " ";
+ }
+ std::cout << std::endl;
+ out << std::endl;
+ }
+ out.close();
+
+ std::cout << "Distance can be found in 'distance.mps' file\n";
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_heat_maps/compute_scalar_product_of_persistence_heat_maps.cpp b/utilities/Persistence_representations/persistence_heat_maps/compute_scalar_product_of_persistence_heat_maps.cpp
new file mode 100644
index 00000000..63626853
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_heat_maps/compute_scalar_product_of_persistence_heat_maps.cpp
@@ -0,0 +1,85 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_heat_maps.h>
+
+#include <iostream>
+#include <sstream>
+#include <vector>
+
+using constant_scaling_function = Gudhi::Persistence_representations::constant_scaling_function;
+using Persistence_heat_maps = Gudhi::Persistence_representations::Persistence_heat_maps<constant_scaling_function>;
+
+int main(int argc, char** argv) {
+ std::cout << "This program computes scalar product of persistence heat maps stored in a file (the file needs to be "
+ << "created beforehand). \n"
+ << "The parameters of this programs are names of files with persistence heat maps.\n";
+
+ if (argc < 3) {
+ std::cout << "Wrong number of parameters, the program will now terminate \n";
+ return 1;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 1; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+ std::vector<Persistence_heat_maps> maps;
+ maps.reserve(filenames.size());
+ for (size_t file_no = 0; file_no != filenames.size(); ++file_no) {
+ Persistence_heat_maps l;
+ l.load_from_file(filenames[file_no]);
+ maps.push_back(l);
+ }
+
+ // and now we will compute the scalar product of landscapes.
+
+ // first we prepare an array:
+ std::vector<std::vector<double> > scalar_product(filenames.size());
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::vector<double> v(filenames.size(), 0);
+ scalar_product[i] = v;
+ }
+
+ // and now we can compute the scalar product:
+ for (size_t i = 0; i != maps.size(); ++i) {
+ for (size_t j = i; j != maps.size(); ++j) {
+ scalar_product[i][j] = scalar_product[j][i] = maps[i].compute_scalar_product(maps[j]);
+ }
+ }
+
+ // and now output the result to the screen and a file:
+ std::ofstream out;
+ out.open("scalar_product.mps");
+ for (size_t i = 0; i != scalar_product.size(); ++i) {
+ for (size_t j = 0; j != scalar_product.size(); ++j) {
+ std::cout << scalar_product[i][j] << " ";
+ out << scalar_product[i][j] << " ";
+ }
+ std::cout << std::endl;
+ out << std::endl;
+ }
+ out.close();
+
+ std::cout << "Distance can be found in 'scalar_product.mps' file\n";
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_arctan_of_their_persistence.cpp b/utilities/Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_arctan_of_their_persistence.cpp
new file mode 100644
index 00000000..b4a1daa5
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_arctan_of_their_persistence.cpp
@@ -0,0 +1,81 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+* (Geometric Understanding in Higher Dimensions) is a generic C++
+* library for computational topology.
+*
+* Author(s): Pawel Dlotko
+*
+* Copyright (C) 2016 INRIA (France)
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <gudhi/Persistence_heat_maps.h>
+
+#include <iostream>
+#include <sstream>
+#include <limits>
+#include <vector>
+
+using arc_tan_of_persistence_of_point = Gudhi::Persistence_representations::arc_tan_of_persistence_of_point;
+using Persistence_heat_maps =
+ Gudhi::Persistence_representations::Persistence_heat_maps<arc_tan_of_persistence_of_point>;
+
+int main(int argc, char** argv) {
+ std::cout << "This program creates persistence heat map files (*.mps) of persistence diagrams files (*.pers) "
+ << "provided as an input.The Gaussian kernels are weighted by the arc tangential of their persistence.\n"
+ << "The first parameter of a program is an integer, a size of a grid.\n"
+ << "The second and third parameters are min and max of the grid. If you want those numbers to be computed "
+ << "based on the data, set them both to -1 \n"
+ << "The fourth parameter is an integer, the standard deviation of a Gaussian kernel expressed in a number "
+ << "of pixels.\n"
+ << "The fifth parameter of this program is a dimension of persistence that will be used in creation of "
+ << "the persistence heat maps."
+ << "If your input files contains persistence pairs of various dimension, as a fifth parameter of the "
+ << "procedure please provide the dimension of persistence you want to use."
+ << "If in your files there are only birth-death pairs of the same dimension, set the fifth parameter to "
+ << "-1.\n"
+ << "The remaining parameters are the names of files with persistence diagrams. \n";
+
+ if (argc < 7) {
+ std::cout << "Wrong parameter list, the program will now terminate \n";
+ return 1;
+ }
+
+ size_t size_of_grid = (size_t)atoi(argv[1]);
+ double min_ = atof(argv[2]);
+ double max_ = atof(argv[3]);
+ size_t stdiv = atof(argv[4]);
+
+ unsigned dimension = std::numeric_limits<unsigned>::max();
+ int dim = atoi(argv[5]);
+ if (dim >= 0) {
+ dimension = (unsigned)dim;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 6; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+
+ std::vector<std::vector<double> > filter = Gudhi::Persistence_representations::create_Gaussian_filter(stdiv, 1);
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::cout << "Creating a heat map based on a file : " << filenames[i] << std::endl;
+ Persistence_heat_maps l(filenames[i], filter, false, size_of_grid, min_, max_, dimension);
+
+ std::stringstream ss;
+ ss << filenames[i] << ".mps";
+ l.print_to_file(ss.str().c_str());
+ }
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_distance_from_diagonal.cpp b/utilities/Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_distance_from_diagonal.cpp
new file mode 100644
index 00000000..c50f9ddb
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_distance_from_diagonal.cpp
@@ -0,0 +1,81 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_heat_maps.h>
+
+#include <iostream>
+#include <sstream>
+#include <limits>
+#include <vector>
+
+using distance_from_diagonal_scaling = Gudhi::Persistence_representations::distance_from_diagonal_scaling;
+using Persistence_heat_maps = Gudhi::Persistence_representations::Persistence_heat_maps<distance_from_diagonal_scaling>;
+
+int main(int argc, char** argv) {
+ std::cout << "This program creates persistence heat map files (*.mps) of persistence diagrams files (*.pers) "
+ << "provided as an input.The Gaussian kernels are weighted by the distance of a center from the "
+ << "diagonal.\n"
+ << "The first parameter of a program is an integer, a size of a grid.\n"
+ << "The second and third parameters are min and max of the grid. If you want those numbers to be computed "
+ << "based on the data, set them both to -1 \n"
+ << "The fourth parameter is an integer, the standard deviation of a Gaussian kernel expressed in a number "
+ << "of pixels.\n"
+ << "The fifth parameter of this program is a dimension of persistence that will be used in creation of "
+ << "the persistence heat maps."
+ << "If your input files contains persistence pairs of various dimension, as a fifth parameter of the "
+ << "procedure please provide the dimension of persistence you want to use."
+ << "If in your files there are only birth-death pairs of the same dimension, set the fifth parameter to "
+ << "-1.\n"
+ << "The remaining parameters are the names of files with persistence diagrams. \n";
+
+ if (argc < 7) {
+ std::cout << "Wrong parameter list, the program will now terminate \n";
+ return 1;
+ }
+
+ size_t size_of_grid = (size_t)atoi(argv[1]);
+ double min_ = atof(argv[2]);
+ double max_ = atof(argv[3]);
+ size_t stdiv = atof(argv[4]);
+
+ unsigned dimension = std::numeric_limits<unsigned>::max();
+ int dim = atoi(argv[5]);
+ if (dim >= 0) {
+ dimension = (unsigned)dim;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 6; i != argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+
+ std::vector<std::vector<double> > filter = Gudhi::Persistence_representations::create_Gaussian_filter(stdiv, 1);
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::cout << "Creating a heat map based on a file : " << filenames[i] << std::endl;
+ Persistence_heat_maps l(filenames[i], filter, false, size_of_grid, min_, max_, dimension);
+
+ std::stringstream ss;
+ ss << filenames[i] << ".mps";
+ l.print_to_file(ss.str().c_str());
+ }
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_squared_diag_distance.cpp b/utilities/Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_squared_diag_distance.cpp
new file mode 100644
index 00000000..59ff3c24
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_heat_maps/create_p_h_m_weighted_by_squared_diag_distance.cpp
@@ -0,0 +1,83 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_heat_maps.h>
+
+#include <iostream>
+#include <sstream>
+#include <limits>
+#include <vector>
+
+using squared_distance_from_diagonal_scaling =
+ Gudhi::Persistence_representations::squared_distance_from_diagonal_scaling;
+using Persistence_heat_maps =
+ Gudhi::Persistence_representations::Persistence_heat_maps<squared_distance_from_diagonal_scaling>;
+
+int main(int argc, char** argv) {
+ std::cout << "This program creates persistence heat map files (*.mps) of persistence diagrams files (*.pers) "
+ << "provided as an input.The Gaussian kernels are weighted by the square of distance of a center from the "
+ << "diagonal.\n"
+ << "The first parameter of a program is an integer, a size of a grid.\n"
+ << "The second and third parameters are min and max of the grid. If you want those numbers to be computed "
+ << "based on the data, set them both to -1 \n"
+ << "The fourth parameter is an integer, the standard deviation of a Gaussian kernel expressed in a number "
+ << "of pixels.\n"
+ << "The fifth parameter of this program is a dimension of persistence that will be used in creation of "
+ << "the persistence heat maps."
+ << "If your input files contains persistence pairs of various dimension, as a fifth parameter of the "
+ << "procedure please provide the dimension of persistence you want to use."
+ << "If in your files there are only birth-death pairs of the same dimension, set the fifth parameter to "
+ << "-1.\n"
+ << "The remaining parameters are the names of files with persistence diagrams. \n";
+
+ if (argc < 7) {
+ std::cout << "Wrong parameter list, the program will now terminate \n";
+ return 1;
+ }
+
+ size_t size_of_grid = (size_t)atoi(argv[1]);
+ double min_ = atof(argv[2]);
+ double max_ = atof(argv[3]);
+ size_t stdiv = atof(argv[4]);
+
+ unsigned dimension = std::numeric_limits<unsigned>::max();
+ int dim = atoi(argv[5]);
+ if (dim >= 0) {
+ dimension = (unsigned)dim;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 6; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+
+ std::vector<std::vector<double> > filter = Gudhi::Persistence_representations::create_Gaussian_filter(stdiv, 1);
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::cout << "Creating a heat map based on a file : " << filenames[i] << std::endl;
+ Persistence_heat_maps l(filenames[i], filter, false, size_of_grid, min_, max_, dimension);
+
+ std::stringstream ss;
+ ss << filenames[i] << ".mps";
+ l.print_to_file(ss.str().c_str());
+ }
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_heat_maps/create_persistence_heat_maps.cpp b/utilities/Persistence_representations/persistence_heat_maps/create_persistence_heat_maps.cpp
new file mode 100644
index 00000000..25cd1067
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_heat_maps/create_persistence_heat_maps.cpp
@@ -0,0 +1,78 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_heat_maps.h>
+
+#include <iostream>
+#include <sstream>
+#include <limits>
+#include <vector>
+
+using constant_scaling_function = Gudhi::Persistence_representations::constant_scaling_function;
+using Persistence_heat_maps = Gudhi::Persistence_representations::Persistence_heat_maps<constant_scaling_function>;
+
+int main(int argc, char** argv) {
+ std::cout << "This program creates persistence heat map files (*.mps) of persistence diagrams files (*.pers) "
+ << "provided as an input.\n"
+ << "The first parameter of a program is an integer, a size of a grid.\n"
+ << "The second and third parameters are min and max of the grid. If you want those numbers to be computed "
+ << "based on the data, set them both to -1 \n"
+ << "The fourth parameter is an integer, the standard deviation of a Gaussian kernel expressed in a number "
+ << "of pixels.\n"
+ << "The fifth parameter of this program is a dimension of persistence that will be used in creation of "
+ << "the persistence heat maps."
+ << "If your input files contains persistence pairs of various dimension, as a fifth parameter of the "
+ << "procedure please provide the dimension of persistence you want to use."
+ << "If in your files there are only birth-death pairs of the same dimension, set the fifth parameter to "
+ << "-1.\n"
+ << "The remaining parameters are the names of files with persistence diagrams. \n";
+
+ if (argc < 7) {
+ std::cout << "Wrong parameter list, the program will now terminate \n";
+ return 1;
+ }
+ size_t size_of_grid = (size_t)atoi(argv[1]);
+ double min_ = atof(argv[2]);
+ double max_ = atof(argv[3]);
+ size_t stdiv = atof(argv[4]);
+
+ unsigned dimension = std::numeric_limits<unsigned>::max();
+ int dim = atoi(argv[5]);
+ if (dim >= 0) {
+ dimension = (unsigned)dim;
+ }
+ std::vector<const char*> filenames;
+ for (int i = 6; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+
+ std::vector<std::vector<double> > filter = Gudhi::Persistence_representations::create_Gaussian_filter(stdiv, 1);
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::cout << "Creating a heat map based on file : " << filenames[i] << std::endl;
+ Persistence_heat_maps l(filenames[i], filter, false, size_of_grid, min_, max_, dimension);
+
+ std::stringstream ss;
+ ss << filenames[i] << ".mps";
+ l.print_to_file(ss.str().c_str());
+ }
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_heat_maps/create_pssk.cpp b/utilities/Persistence_representations/persistence_heat_maps/create_pssk.cpp
new file mode 100644
index 00000000..97ddb8f0
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_heat_maps/create_pssk.cpp
@@ -0,0 +1,79 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/PSSK.h>
+
+#include <iostream>
+#include <sstream>
+#include <limits>
+#include <vector>
+
+using PSSK = Gudhi::Persistence_representations::PSSK;
+
+int main(int argc, char** argv) {
+ std::cout << "This program creates PSSK files (*.pssk) of persistence diagrams files (*.pers) "
+ << "provided as an input.\n"
+ << "The first parameter of a program is an integer, a size of a grid.\n"
+ << "The second and third parameters are min and max of the grid. If you want those numbers to be computed "
+ << "based on the data, set them both to -1 \n"
+ << "The fourth parameter is an integer, the standard deviation of a Gaussian kernel expressed in a number "
+ << "of pixels.\n"
+ << "The fifth parameter of this program is a dimension of persistence that will be used in creation of "
+ << "the PSSK."
+ << "If your input files contains persistence pairs of various dimension, as a fifth parameter of the "
+ << "procedure please provide the dimension of persistence you want to use."
+ << "If in your files there are only birth-death pairs of the same dimension, set the first parameter to "
+ << "-1.\n"
+ << "The remaining parameters are the names of files with persistence diagrams. \n";
+
+ if (argc < 7) {
+ std::cout << "Wrong parameter list, the program will now terminate \n";
+ return 1;
+ }
+
+ size_t size_of_grid = (size_t)atoi(argv[1]);
+ double min_ = atof(argv[2]);
+ double max_ = atof(argv[3]);
+ size_t stdiv = atof(argv[4]);
+
+ unsigned dimension = std::numeric_limits<unsigned>::max();
+ int dim = atoi(argv[5]);
+ if (dim >= 0) {
+ dimension = (unsigned)dim;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 6; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+
+ std::vector<std::vector<double> > filter = Gudhi::Persistence_representations::create_Gaussian_filter(stdiv, 1);
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::cout << "Creating a PSSK based on a file : " << filenames[i] << std::endl;
+ PSSK l(filenames[i], filter, size_of_grid, min_, max_, dimension);
+
+ std::stringstream ss;
+ ss << filenames[i] << ".pssk";
+ l.print_to_file(ss.str().c_str());
+ }
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_heat_maps/plot_persistence_heat_map.cpp b/utilities/Persistence_representations/persistence_heat_maps/plot_persistence_heat_map.cpp
new file mode 100644
index 00000000..63711d83
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_heat_maps/plot_persistence_heat_map.cpp
@@ -0,0 +1,42 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_heat_maps.h>
+
+#include <iostream>
+#include <sstream>
+
+using constant_scaling_function = Gudhi::Persistence_representations::constant_scaling_function;
+using Persistence_heat_maps = Gudhi::Persistence_representations::Persistence_heat_maps<constant_scaling_function>;
+
+int main(int argc, char** argv) {
+ std::cout << "This program creates a gnuplot script from a persistence heat maps stored in a file (the file needs "
+ << "to be created beforehand). Please call the code with the name of a single heat maps file \n";
+ if (argc != 2) {
+ std::cout << "Wrong parameter list, the program will now terminate \n";
+ return 1;
+ }
+ Persistence_heat_maps l;
+ l.load_from_file(argv[1]);
+ l.plot(argv[1]);
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_intervals/CMakeLists.txt b/utilities/Persistence_representations/persistence_intervals/CMakeLists.txt
new file mode 100644
index 00000000..897e12a3
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_intervals/CMakeLists.txt
@@ -0,0 +1,32 @@
+cmake_minimum_required(VERSION 2.6)
+project(Persistence_representations_intervals_utilities)
+
+
+add_executable ( plot_histogram_of_intervals_lengths plot_histogram_of_intervals_lengths.cpp )
+
+add_test(NAME plot_histogram_of_intervals_lengths COMMAND $<TARGET_FILE:plot_histogram_of_intervals_lengths>
+ "${CMAKE_CURRENT_BINARY_DIR}/../first.pers" "-1")
+
+add_persistence_representation_plot_utility(plot_persistence_intervals "")
+add_persistence_representation_plot_utility(plot_persistence_Betti_numbers "")
+
+add_persistence_representation_creation_utility(compute_birth_death_range_in_persistence_diagram "-1")
+
+
+add_executable ( compute_number_of_dominant_intervals compute_number_of_dominant_intervals.cpp )
+add_test(NAME Persistence_representation_utilities_compute_number_of_dominant_intervals
+ COMMAND $<TARGET_FILE:compute_number_of_dominant_intervals>
+ "${CMAKE_CURRENT_BINARY_DIR}/../first.pers" "-1" "2")
+
+
+if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1)
+ add_executable ( compute_bottleneck_distance compute_bottleneck_distance.cpp )
+ if (TBB_FOUND)
+ target_link_libraries(compute_bottleneck_distance ${TBB_LIBRARIES})
+ endif(TBB_FOUND)
+ add_test(NAME Persistence_representation_utilities_compute_bottleneck_distance
+ COMMAND $<TARGET_FILE:compute_bottleneck_distance>
+ "-1"
+ "${CMAKE_CURRENT_BINARY_DIR}/../first.pers"
+ "${CMAKE_CURRENT_BINARY_DIR}/../second.pers")
+endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1)
diff --git a/utilities/Persistence_representations/persistence_intervals/compute_birth_death_range_in_persistence_diagram.cpp b/utilities/Persistence_representations/persistence_intervals/compute_birth_death_range_in_persistence_diagram.cpp
new file mode 100644
index 00000000..9102da79
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_intervals/compute_birth_death_range_in_persistence_diagram.cpp
@@ -0,0 +1,68 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_intervals.h>
+
+#include <iostream>
+#include <vector>
+#include <limits>
+#include <utility>
+
+using Persistence_intervals = Gudhi::Persistence_representations::Persistence_intervals;
+
+int main(int argc, char** argv) {
+ std::cout << "This program computes the range of birth and death times of persistence pairs in diagrams provided as "
+ << "an input.\n"
+ << "The first parameter is the dimension of persistence to be used to create persistence intervals. "
+ << "If your file contains the information about dimension of persistence pairs, please provide here the "
+ << "dimension of persistence pairs you want to use. "
+ << "If your input files consist only of birth-death pairs, please set this first parameter to -1.\n"
+ << "The remaining parameters of the program are the names of files with persistence diagrams.\n";
+
+ if (argc < 3) {
+ std::cout << "Wrong parameter list, the program will now terminate \n";
+ return 1;
+ }
+
+ unsigned dimension = std::numeric_limits<unsigned>::max();
+ int dim = atoi(argv[1]);
+ if (dim >= 0) {
+ dimension = (unsigned)dim;
+ }
+ std::vector<const char*> filenames;
+ for (int i = 2; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+
+ double min_ = std::numeric_limits<double>::max();
+ double max_ = -std::numeric_limits<double>::max();
+
+ for (size_t file_no = 0; file_no != filenames.size(); ++file_no) {
+ std::cout << "Creating diagram based on a file : " << filenames[file_no] << std::endl;
+ Persistence_intervals p(filenames[file_no], dimension);
+ std::pair<double, double> min_max_ = p.get_x_range();
+ if (min_max_.first < min_) min_ = min_max_.first;
+ if (min_max_.second > max_) max_ = min_max_.second;
+ }
+ std::cout << "Birth-death range : min: " << min_ << ", max: " << max_ << std::endl;
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_intervals/compute_bottleneck_distance.cpp b/utilities/Persistence_representations/persistence_intervals/compute_bottleneck_distance.cpp
new file mode 100644
index 00000000..c8290845
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_intervals/compute_bottleneck_distance.cpp
@@ -0,0 +1,95 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_intervals_with_distances.h>
+
+#include <iostream>
+#include <sstream>
+#include <limits>
+#include <vector>
+
+using Persistence_intervals_with_distances = Gudhi::Persistence_representations::Persistence_intervals_with_distances;
+
+int main(int argc, char** argv) {
+ std::cout << "This program computes the bottleneck distance of persistence pairs in diagrams provided as "
+ << "an input.\n"
+ << "The first parameter is the dimension of persistence to be used to create persistence intervals. "
+ << "If your file contains the information about dimension of persistence pairs, please provide here the "
+ << "dimension of persistence pairs you want to use. "
+ << "If your input files consist only of birth-death pairs, please set this first parameter to -1.\n"
+ << "The remaining parameters of the program are the names of files with persistence diagrams.\n";
+
+ if (argc < 3) {
+ std::cout << "Wrong number of parameters, the program will now terminate \n";
+ return 1;
+ }
+
+ unsigned dimension = std::numeric_limits<unsigned>::max();
+ int dim = atoi(argv[1]);
+ if (dim >= 0) {
+ dimension = (unsigned)dim;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 2; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+
+ // reading the persistence intervals:
+ std::vector<Persistence_intervals_with_distances> persistence_intervals;
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ Persistence_intervals_with_distances pers(filenames[i], dimension);
+ persistence_intervals.push_back(pers);
+ }
+
+ // and now we will compute the scalar product of landscapes.
+
+ // first we prepare an array:
+ std::vector<std::vector<double> > distance(filenames.size());
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::vector<double> v(filenames.size(), 0);
+ distance[i] = v;
+ }
+
+ // and now we can compute the distances:
+ for (size_t i = 0; i != persistence_intervals.size(); ++i) {
+ for (size_t j = i + 1; j != persistence_intervals.size(); ++j) {
+ distance[i][j] = distance[j][i] = persistence_intervals[i].distance(persistence_intervals[j]);
+ }
+ }
+
+ // and now output the result to the screen and a file:
+ std::ofstream out;
+ out.open("distance.itv");
+ for (size_t i = 0; i != distance.size(); ++i) {
+ for (size_t j = 0; j != distance.size(); ++j) {
+ std::cout << distance[i][j] << " ";
+ out << distance[i][j] << " ";
+ }
+ std::cout << std::endl;
+ out << std::endl;
+ }
+ out.close();
+
+ std::cout << "Distance can be found in 'distance.itv' file\n";
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_intervals/compute_number_of_dominant_intervals.cpp b/utilities/Persistence_representations/persistence_intervals/compute_number_of_dominant_intervals.cpp
new file mode 100644
index 00000000..b3d126f0
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_intervals/compute_number_of_dominant_intervals.cpp
@@ -0,0 +1,54 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_intervals.h>
+
+#include <iostream>
+#include <limits>
+#include <vector>
+#include <utility>
+
+using Persistence_intervals = Gudhi::Persistence_representations::Persistence_intervals;
+
+int main(int argc, char** argv) {
+ std::cout << "This program compute the dominant intervals. A number of intervals to be displayed is a parameter of "
+ "this program. \n";
+ if (argc != 4) {
+ std::cout << "To run this program, please provide the name of a file with persistence diagram, dimension of "
+ "intervals that should be taken into account (if your file contains only persistence pairs in a "
+ "single dimension, set it up to -1) and number of dominant intervals you would like to get \n";
+ return 1;
+ }
+ int dim = atoi(argv[2]);
+ unsigned dimension = std::numeric_limits<unsigned>::max();
+ if (dim >= 0) {
+ dimension = (unsigned)dim;
+ }
+ Persistence_intervals p(argv[1], dimension);
+ std::vector<std::pair<double, double> > dominant_intervals = p.dominant_intervals(atoi(argv[3]));
+ std::cout << "Here are the dominant intervals : " << std::endl;
+ for (size_t i = 0; i != dominant_intervals.size(); ++i) {
+ std::cout << " " << dominant_intervals[i].first << "," << dominant_intervals[i].second << " " << std::endl;
+ }
+
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_intervals/plot_histogram_of_intervals_lengths.cpp b/utilities/Persistence_representations/persistence_intervals/plot_histogram_of_intervals_lengths.cpp
new file mode 100644
index 00000000..ccb5b645
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_intervals/plot_histogram_of_intervals_lengths.cpp
@@ -0,0 +1,77 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_intervals.h>
+
+#include <iostream>
+#include <vector>
+#include <limits>
+#include <utility>
+
+using Persistence_intervals = Gudhi::Persistence_representations::Persistence_intervals;
+
+int main(int argc, char** argv) {
+ std::cout << "This program computes a histogram of barcode's length. A number of bins in the histogram is a "
+ << "parameter of this program. \n";
+ if ((argc != 3) && (argc != 4)) {
+ std::cout << "To run this program, please provide the name of a file with persistence diagram and number of "
+ << "dominant intervals you would like to get. Set a negative number dominant intervals value "
+ << "If your file contains only birth-death pairs.\n"
+ << "The third parameter is the dimension of the persistence that is to be used. If your "
+ << "file contains only birth-death pairs, you can skip this parameter\n";
+ return 1;
+ }
+
+ unsigned dominant_interval_number = std::numeric_limits<unsigned>::max();
+ int nbr = atoi(argv[2]);
+ if (nbr >= 0) {
+ dominant_interval_number = static_cast<unsigned>(nbr);
+ }
+
+ int persistence_dimension = -1;
+ if (argc == 4) {
+ persistence_dimension = atoi(argv[3]);
+ }
+
+ Persistence_intervals p(argv[1], dominant_interval_number);
+ std::vector<std::pair<double, double> > dominant_intervals = p.dominant_intervals(persistence_dimension);
+ std::vector<size_t> histogram = p.histogram_of_lengths(10);
+
+ std::stringstream gnuplot_script;
+ gnuplot_script << argv[1] << "_GnuplotScript";
+ std::ofstream out;
+ out.open(gnuplot_script.str().c_str());
+
+ out << "set style data histogram" << std::endl;
+ out << "set style histogram cluster gap 1" << std::endl;
+ out << "set style fill solid border -1" << std::endl;
+ out << "plot '-' notitle" << std::endl;
+ for (size_t i = 0; i != histogram.size(); ++i) {
+ out << histogram[i] << std::endl;
+ }
+ out << std::endl;
+ out.close();
+
+ std::cout << "To visualize, install gnuplot and type the command: gnuplot -persist -e \"load \'"
+ << gnuplot_script.str().c_str() << "\'\"" << std::endl;
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_intervals/plot_persistence_Betti_numbers.cpp b/utilities/Persistence_representations/persistence_intervals/plot_persistence_Betti_numbers.cpp
new file mode 100644
index 00000000..b433c2b3
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_intervals/plot_persistence_Betti_numbers.cpp
@@ -0,0 +1,87 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_intervals.h>
+
+#include <iostream>
+#include <vector>
+#include <limits>
+#include <utility>
+
+using Persistence_intervals = Gudhi::Persistence_representations::Persistence_intervals;
+
+int main(int argc, char** argv) {
+ if ((argc != 3) && (argc != 2)) {
+ std::cout << "This program creates a gnuplot script of Betti numbers from a single persistence diagram file"
+ << "(*.pers).\n"
+ << "To run this program, please provide the name of a file with persistence diagram.\n"
+ << "The second optional parameter of a program is the dimension of the persistence that is to be used. "
+ << "If your file contains only birth-death pairs, you can skip this parameter.\n";
+ return 1;
+ }
+
+ unsigned dimension = std::numeric_limits<unsigned>::max();
+ int dim = -1;
+ if (argc == 3) {
+ dim = atoi(argv[2]);
+ }
+ if (dim >= 0) {
+ dimension = (unsigned)dim;
+ }
+
+ Persistence_intervals p(argv[1], dimension);
+ std::vector<std::pair<double, size_t> > pbns = p.compute_persistent_betti_numbers();
+
+ // set up the ranges so that we see the image well.
+ double xRangeBegin = pbns[0].first;
+ double xRangeEnd = pbns[pbns.size() - 1].first;
+ double yRangeBegin = 0;
+ double yRangeEnd = 0;
+ for (size_t i = 0; i != pbns.size(); ++i) {
+ if (pbns[i].second > yRangeEnd) yRangeEnd = pbns[i].second;
+ }
+ xRangeBegin -= (xRangeEnd - xRangeBegin) / 100.0;
+ xRangeEnd += (xRangeEnd - xRangeBegin) / 100.0;
+ yRangeEnd += yRangeEnd / 100;
+
+ std::stringstream gnuplot_script;
+ gnuplot_script << argv[1] << "_GnuplotScript";
+ std::ofstream out;
+ out.open(gnuplot_script.str().c_str());
+
+ out << "set xrange [" << xRangeBegin << " : " << xRangeEnd << "]" << std::endl;
+ out << "set yrange [" << yRangeBegin << " : " << yRangeEnd << "]" << std::endl;
+ out << "plot '-' using 1:2 notitle with lp " << std::endl;
+ double previous_y = 0;
+ for (size_t i = 0; i != pbns.size(); ++i) {
+ out << pbns[i].first << " " << previous_y << std::endl;
+ out << pbns[i].first << " " << pbns[i].second << std::endl;
+ previous_y = pbns[i].second;
+ }
+ out << std::endl;
+ out.close();
+
+ std::cout << "To visualize, install gnuplot and type the command: gnuplot -persist -e \"load \'"
+ << gnuplot_script.str().c_str() << "\'\"" << std::endl;
+
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_intervals/plot_persistence_intervals.cpp b/utilities/Persistence_representations/persistence_intervals/plot_persistence_intervals.cpp
new file mode 100644
index 00000000..33387802
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_intervals/plot_persistence_intervals.cpp
@@ -0,0 +1,53 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_intervals.h>
+
+#include <iostream>
+#include <limits>
+#include <vector>
+#include <utility>
+
+using Persistence_intervals = Gudhi::Persistence_representations::Persistence_intervals;
+
+int main(int argc, char** argv) {
+ if ((argc != 3) && (argc != 2)) {
+ std::cout << "This program creates a gnuplot script from a single persistence diagram file (*.pers).\n"
+ << "To run this program, please provide the name of a file with persistence diagram.\n"
+ << "The second optional parameter of a program is the dimension of the persistence that is to be used. "
+ << "If your file contains only birth-death pairs, you can skip this parameter.\n";
+ return 1;
+ }
+ unsigned dimension = std::numeric_limits<unsigned>::max();
+ int dim = -1;
+ if (argc == 3) {
+ dim = atoi(argv[2]);
+ }
+ if (dim >= 0) {
+ dimension = (unsigned)dim;
+ }
+ std::vector<std::pair<double, double> > intervals =
+ Gudhi::Persistence_representations::read_persistence_intervals_in_one_dimension_from_file(argv[1], dimension);
+ Persistence_intervals b(intervals);
+ b.plot(argv[1]);
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_landscapes/CMakeLists.txt b/utilities/Persistence_representations/persistence_landscapes/CMakeLists.txt
new file mode 100644
index 00000000..d7087ed8
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_landscapes/CMakeLists.txt
@@ -0,0 +1,10 @@
+cmake_minimum_required(VERSION 2.6)
+project(Persistence_representations_landscapes_utilities)
+
+add_persistence_representation_creation_utility(create_landscapes "-1")
+
+add_persistence_representation_plot_utility(plot_landscapes ".land")
+
+add_persistence_representation_function_utility(average_landscapes ".land")
+add_persistence_representation_function_utility(compute_distance_of_landscapes ".land" "1")
+add_persistence_representation_function_utility(compute_scalar_product_of_landscapes ".land")
diff --git a/utilities/Persistence_representations/persistence_landscapes/average_landscapes.cpp b/utilities/Persistence_representations/persistence_landscapes/average_landscapes.cpp
new file mode 100644
index 00000000..1a59be8c
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_landscapes/average_landscapes.cpp
@@ -0,0 +1,63 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_landscape.h>
+
+#include <iostream>
+#include <vector>
+
+using Persistence_landscape = Gudhi::Persistence_representations::Persistence_landscape;
+
+int main(int argc, char** argv) {
+ std::cout << "This program computes average of persistence landscapes stored in files (the files needs to be "
+ << "created beforehand).\n"
+ << "The parameters of this programs are names of files with persistence landscapes.\n";
+ std::vector<const char*> filenames;
+
+ if (argc < 3) {
+ std::cout << "Wrong number of parameters, the program will now terminate \n";
+ return 1;
+ }
+
+ for (int i = 1; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+
+ std::vector<Persistence_landscape*> lands;
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ Persistence_landscape* l = new Persistence_landscape;
+ l->load_landscape_from_file(filenames[i]);
+ lands.push_back(l);
+ }
+
+ Persistence_landscape av;
+ av.compute_average(lands);
+
+ av.print_to_file("average.land");
+
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ delete lands[i];
+ }
+
+ std::cout << "Average can be found in 'average.land' file\n";
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_landscapes/compute_distance_of_landscapes.cpp b/utilities/Persistence_representations/persistence_landscapes/compute_distance_of_landscapes.cpp
new file mode 100644
index 00000000..5062f521
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_landscapes/compute_distance_of_landscapes.cpp
@@ -0,0 +1,93 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_landscape.h>
+
+#include <iostream>
+#include <sstream>
+#include <limits>
+#include <vector>
+
+using Persistence_landscape = Gudhi::Persistence_representations::Persistence_landscape;
+
+int main(int argc, char** argv) {
+ std::cout << "This program computes distance of persistence landscapes stored in files (the files needs to be "
+ << "created beforehand).\n"
+ << "The first parameter of a program is an integer p. The program compute L^p distance of the two heat "
+ << "maps. For L^infty distance choose p = -1. \n"
+ << "The remaining parameters of this program are names of files with persistence landscapes.\n";
+
+ if (argc < 3) {
+ std::cout << "Wrong number of parameters, the program will now terminate \n";
+ return 1;
+ }
+
+ int pp = atoi(argv[1]);
+ double p = std::numeric_limits<double>::max();
+ if (pp != -1) {
+ p = pp;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 2; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+ std::vector<Persistence_landscape> landscaspes;
+ landscaspes.reserve(filenames.size());
+ for (size_t file_no = 0; file_no != filenames.size(); ++file_no) {
+ Persistence_landscape l;
+ l.load_landscape_from_file(filenames[file_no]);
+ landscaspes.push_back(l);
+ }
+
+ // and now we will compute the scalar product of landscapes.
+
+ // first we prepare an array:
+ std::vector<std::vector<double> > distance(filenames.size());
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::vector<double> v(filenames.size(), 0);
+ distance[i] = v;
+ }
+
+ // and now we can compute the distances:
+ for (size_t i = 0; i != landscaspes.size(); ++i) {
+ for (size_t j = i; j != landscaspes.size(); ++j) {
+ distance[i][j] = distance[j][i] = compute_distance_of_landscapes(landscaspes[i], landscaspes[j], p);
+ }
+ }
+
+ // and now output the result to the screen and a file:
+ std::ofstream out;
+ out.open("distance.land");
+ for (size_t i = 0; i != distance.size(); ++i) {
+ for (size_t j = 0; j != distance.size(); ++j) {
+ std::cout << distance[i][j] << " ";
+ out << distance[i][j] << " ";
+ }
+ std::cout << std::endl;
+ out << std::endl;
+ }
+ out.close();
+
+ std::cout << "Distance can be found in 'distance.land' file\n";
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_landscapes/compute_scalar_product_of_landscapes.cpp b/utilities/Persistence_representations/persistence_landscapes/compute_scalar_product_of_landscapes.cpp
new file mode 100644
index 00000000..5b5e9fa3
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_landscapes/compute_scalar_product_of_landscapes.cpp
@@ -0,0 +1,84 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_landscape.h>
+
+#include <iostream>
+#include <sstream>
+#include <vector>
+
+using Persistence_landscape = Gudhi::Persistence_representations::Persistence_landscape;
+
+int main(int argc, char** argv) {
+ std::cout << "This program computes scalar product of persistence landscapes stored in a file (the file needs to be "
+ << "created beforehand). \n"
+ << "The parameters of this programs are names of files with persistence landscapes.\n";
+
+ if (argc < 3) {
+ std::cout << "Wrong number of parameters, the program will now terminate \n";
+ return 1;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 1; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+ std::vector<Persistence_landscape> landscaspes;
+ landscaspes.reserve(filenames.size());
+ for (size_t file_no = 0; file_no != filenames.size(); ++file_no) {
+ Persistence_landscape l;
+ l.load_landscape_from_file(filenames[file_no]);
+ landscaspes.push_back(l);
+ }
+
+ // and now we will compute the scalar product of landscapes.
+
+ // first we prepare an array:
+ std::vector<std::vector<double> > scalar_product(filenames.size());
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::vector<double> v(filenames.size(), 0);
+ scalar_product[i] = v;
+ }
+
+ // and now we can compute the scalar product:
+ for (size_t i = 0; i != landscaspes.size(); ++i) {
+ for (size_t j = i; j != landscaspes.size(); ++j) {
+ scalar_product[i][j] = scalar_product[j][i] = compute_inner_product(landscaspes[i], landscaspes[j]);
+ }
+ }
+
+ // and now output the result to the screen and a file:
+ std::ofstream out;
+ out.open("scalar_product.land");
+ for (size_t i = 0; i != scalar_product.size(); ++i) {
+ for (size_t j = 0; j != scalar_product.size(); ++j) {
+ std::cout << scalar_product[i][j] << " ";
+ out << scalar_product[i][j] << " ";
+ }
+ std::cout << std::endl;
+ out << std::endl;
+ }
+ out.close();
+
+ std::cout << "Distance can be found in 'scalar_product.land' file\n";
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_landscapes/create_landscapes.cpp b/utilities/Persistence_representations/persistence_landscapes/create_landscapes.cpp
new file mode 100644
index 00000000..6030e994
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_landscapes/create_landscapes.cpp
@@ -0,0 +1,65 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_landscape.h>
+
+#include <iostream>
+#include <sstream>
+#include <vector>
+#include <limits>
+
+using Persistence_landscape = Gudhi::Persistence_representations::Persistence_landscape;
+
+int main(int argc, char** argv) {
+ std::cout << "This program creates persistence landscapes files (*.land) of persistence diagrams files (*.pers) "
+ << "provided as an input.\n"
+ << "The first parameter of this program is a dimension of persistence that will be used in creation of "
+ << "the persistence heat maps."
+ << "If your input files contains persistence pairs of various dimension, as a first parameter of the "
+ << "procedure please provide the dimension of persistence you want to use."
+ << "If in your files there are only birth-death pairs of the same dimension, set the first parameter to "
+ << "-1.\n"
+ << "The remaining parameters are the names of files with persistence diagrams. \n";
+
+ if (argc < 3) {
+ std::cout << "Wrong parameter list, the program will now terminate \n";
+ return 1;
+ }
+ std::vector<const char*> filenames;
+ int dim = atoi(argv[1]);
+ unsigned dimension = std::numeric_limits<unsigned>::max();
+ if (dim >= 0) {
+ dimension = (unsigned)dim;
+ }
+ for (int i = 2; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::cout << "Creating a landscape based on file : " << filenames[i] << std::endl;
+ Persistence_landscape l(filenames[i], dimension);
+ std::stringstream ss;
+ ss << filenames[i] << ".land";
+ l.print_to_file(ss.str().c_str());
+ }
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_landscapes/plot_landscapes.cpp b/utilities/Persistence_representations/persistence_landscapes/plot_landscapes.cpp
new file mode 100644
index 00000000..c797a7a8
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_landscapes/plot_landscapes.cpp
@@ -0,0 +1,43 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_landscape.h>
+
+#include <iostream>
+#include <sstream>
+
+using Persistence_landscape = Gudhi::Persistence_representations::Persistence_landscape;
+
+int main(int argc, char** argv) {
+ std::cout << "This program creates a gnuplot script from a persistence landscape stored in a file (the file needs "
+ << "to be created beforehand). Please call the code with the name of a single landscape file.\n";
+ if (argc != 2) {
+ std::cout << "Wrong parameter list, the program will now terminate \n";
+ return 1;
+ }
+
+ Persistence_landscape l;
+ l.load_landscape_from_file(argv[1]);
+ l.plot(argv[1]);
+
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_landscapes_on_grid/CMakeLists.txt b/utilities/Persistence_representations/persistence_landscapes_on_grid/CMakeLists.txt
new file mode 100644
index 00000000..c5ea4bbf
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_landscapes_on_grid/CMakeLists.txt
@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 2.6)
+project(Persistence_representations_lanscapes_on_grid_utilities)
+
+# Need to set grid min and max for further average, distance and scalar_product
+add_persistence_representation_creation_utility(create_landscapes_on_grid "100" "0" "35" "-1")
+
+add_persistence_representation_plot_utility(plot_landscapes_on_grid ".g_land")
+
+add_persistence_representation_function_utility(average_landscapes_on_grid ".g_land")
+add_persistence_representation_function_utility(compute_distance_of_landscapes_on_grid ".g_land" "1")
+add_persistence_representation_function_utility(compute_scalar_product_of_landscapes_on_grid ".g_land")
diff --git a/utilities/Persistence_representations/persistence_landscapes_on_grid/average_landscapes_on_grid.cpp b/utilities/Persistence_representations/persistence_landscapes_on_grid/average_landscapes_on_grid.cpp
new file mode 100644
index 00000000..0b098d1a
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_landscapes_on_grid/average_landscapes_on_grid.cpp
@@ -0,0 +1,63 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_landscape_on_grid.h>
+
+#include <iostream>
+#include <vector>
+
+using Persistence_landscape_on_grid = Gudhi::Persistence_representations::Persistence_landscape_on_grid;
+
+int main(int argc, char** argv) {
+ std::cout << "This program computes average of persistence landscapes on grid stored in files (the files needs to "
+ << "be created beforehand).\n"
+ << "The parameters of this programs are names of files with persistence landscapes on grid.\n";
+
+ if (argc < 3) {
+ std::cout << "Wrong number of parameters, the program will now terminate \n";
+ return 1;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 1; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+
+ std::vector<Persistence_landscape_on_grid*> lands;
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ Persistence_landscape_on_grid* l = new Persistence_landscape_on_grid;
+ l->load_landscape_from_file(filenames[i]);
+ lands.push_back(l);
+ }
+
+ Persistence_landscape_on_grid av;
+ av.compute_average(lands);
+
+ av.print_to_file("average.g_land");
+
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ delete lands[i];
+ }
+
+ std::cout << "Average can be found in 'average.g_land' file\n";
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_landscapes_on_grid/compute_distance_of_landscapes_on_grid.cpp b/utilities/Persistence_representations/persistence_landscapes_on_grid/compute_distance_of_landscapes_on_grid.cpp
new file mode 100644
index 00000000..fd0fcd15
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_landscapes_on_grid/compute_distance_of_landscapes_on_grid.cpp
@@ -0,0 +1,93 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_landscape_on_grid.h>
+
+#include <iostream>
+#include <sstream>
+#include <limits>
+#include <vector>
+
+using Persistence_landscape_on_grid = Gudhi::Persistence_representations::Persistence_landscape_on_grid;
+
+int main(int argc, char** argv) {
+ std::cout << "This program computes distance of persistence landscapes on grid stored in files (the files needs to "
+ << "be created beforehand).\n"
+ << "The first parameter of a program is an integer p. The program compute L^p distance of the two heat "
+ << "maps. For L^infty distance choose p = -1. \n"
+ << "The remaining parameters of this program are names of files with persistence landscapes on grid.\n";
+
+ if (argc < 3) {
+ std::cout << "Wrong number of parameters, the program will now terminate \n";
+ return 1;
+ }
+
+ int pp = atoi(argv[1]);
+ double p = std::numeric_limits<double>::max();
+ if (pp != -1) {
+ p = pp;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 2; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+ std::vector<Persistence_landscape_on_grid> landscaspes;
+ landscaspes.reserve(filenames.size());
+ for (size_t file_no = 0; file_no != filenames.size(); ++file_no) {
+ Persistence_landscape_on_grid l;
+ l.load_landscape_from_file(filenames[file_no]);
+ landscaspes.push_back(l);
+ }
+
+ // and now we will compute the scalar product of landscapes.
+
+ // first we prepare an array:
+ std::vector<std::vector<double> > distance(filenames.size());
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::vector<double> v(filenames.size(), 0);
+ distance[i] = v;
+ }
+
+ // and now we can compute the scalar product:
+ for (size_t i = 0; i != landscaspes.size(); ++i) {
+ for (size_t j = i; j != landscaspes.size(); ++j) {
+ distance[i][j] = distance[j][i] = compute_distance_of_landscapes_on_grid(landscaspes[i], landscaspes[j], p);
+ }
+ }
+
+ // and now output the result to the screen and a file:
+ std::ofstream out;
+ out.open("distance.g_land");
+ for (size_t i = 0; i != distance.size(); ++i) {
+ for (size_t j = 0; j != distance.size(); ++j) {
+ std::cout << distance[i][j] << " ";
+ out << distance[i][j] << " ";
+ }
+ std::cout << std::endl;
+ out << std::endl;
+ }
+ out.close();
+
+ std::cout << "Distance can be found in 'distance.g_land' file\n";
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_landscapes_on_grid/compute_scalar_product_of_landscapes_on_grid.cpp b/utilities/Persistence_representations/persistence_landscapes_on_grid/compute_scalar_product_of_landscapes_on_grid.cpp
new file mode 100644
index 00000000..01de3dee
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_landscapes_on_grid/compute_scalar_product_of_landscapes_on_grid.cpp
@@ -0,0 +1,85 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_landscape_on_grid.h>
+
+#include <iostream>
+#include <sstream>
+#include <vector>
+
+using Persistence_landscape_on_grid = Gudhi::Persistence_representations::Persistence_landscape_on_grid;
+
+int main(int argc, char** argv) {
+ std::cout
+ << "This program computes scalar product of persistence landscapes on grid stored in a file (the file needs to "
+ << "be created beforehand). \n"
+ << "The parameters of this programs are names of files with persistence landscapes on grid.\n";
+
+ if (argc < 3) {
+ std::cout << "Wrong number of parameters, the program will now terminate \n";
+ return 1;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 1; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+ std::vector<Persistence_landscape_on_grid> landscaspes;
+ landscaspes.reserve(filenames.size());
+ for (size_t file_no = 0; file_no != filenames.size(); ++file_no) {
+ Persistence_landscape_on_grid l;
+ l.load_landscape_from_file(filenames[file_no]);
+ landscaspes.push_back(l);
+ }
+
+ // and now we will compute the scalar product of landscapes.
+
+ // first we prepare an array:
+ std::vector<std::vector<double> > scalar_product(filenames.size());
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::vector<double> v(filenames.size(), 0);
+ scalar_product[i] = v;
+ }
+
+ // and now we can compute the scalar product:
+ for (size_t i = 0; i != landscaspes.size(); ++i) {
+ for (size_t j = i; j != landscaspes.size(); ++j) {
+ scalar_product[i][j] = scalar_product[j][i] = compute_inner_product(landscaspes[i], landscaspes[j]);
+ }
+ }
+
+ // and now output the result to the screen and a file:
+ std::ofstream out;
+ out.open("scalar_product.g_land");
+ for (size_t i = 0; i != scalar_product.size(); ++i) {
+ for (size_t j = 0; j != scalar_product.size(); ++j) {
+ std::cout << scalar_product[i][j] << " ";
+ out << scalar_product[i][j] << " ";
+ }
+ std::cout << std::endl;
+ out << std::endl;
+ }
+ out.close();
+
+ std::cout << "Distance can be found in 'scalar_product.g_land' file\n";
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_landscapes_on_grid/create_landscapes_on_grid.cpp b/utilities/Persistence_representations/persistence_landscapes_on_grid/create_landscapes_on_grid.cpp
new file mode 100644
index 00000000..78e8ef57
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_landscapes_on_grid/create_landscapes_on_grid.cpp
@@ -0,0 +1,79 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_landscape_on_grid.h>
+
+#include <iostream>
+#include <sstream>
+#include <limits>
+#include <vector>
+
+using Persistence_landscape_on_grid = Gudhi::Persistence_representations::Persistence_landscape_on_grid;
+
+int main(int argc, char** argv) {
+ std::cout << "This program creates persistence landscapes on grid files (*.g_land) of persistence diagrams files "
+ << "(*.pers) provided as an input.\n"
+ << "The first parameter of a program is an integer, a size of a grid.\n"
+ << "The second and third parameters are min and max of the grid. If you want those numbers to be computed "
+ << "based on the data, set them both to -1 \n"
+ << "The fourth parameter of this program is a dimension of persistence that will be used in creation of "
+ << "the persistence heat maps."
+ << "If your input files contains persistence pairs of various dimension, as a fourth parameter of the "
+ << "procedure please provide the dimension of persistence you want to use."
+ << "If in your files there are only birth-death pairs of the same dimension, set the fourth parameter to "
+ << "-1.\n"
+ << "The remaining parameters are the names of files with persistence diagrams. \n";
+
+ if (argc < 6) {
+ std::cout << "Wrong parameter list, the program will now terminate \n";
+ return 1;
+ }
+
+ size_t size_of_grid = (size_t)atoi(argv[1]);
+ double min_ = atof(argv[2]);
+ double max_ = atof(argv[3]);
+ int dim = atoi(argv[4]);
+ unsigned dimension = std::numeric_limits<unsigned>::max();
+ if (dim >= 0) {
+ dimension = (unsigned)dim;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 5; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::cout << "Creating persistence landscape on a grid based on a file : " << filenames[i] << std::endl;
+ Persistence_landscape_on_grid l;
+ if ((min_ != -1) || (max_ != -1)) {
+ l = Persistence_landscape_on_grid(filenames[i], min_, max_, size_of_grid, dimension);
+ } else {
+ // (min_ == -1) && (max_ == -1), in this case the program will find min_ and max_ based on the data.
+ l = Persistence_landscape_on_grid(filenames[i], size_of_grid, dimension);
+ }
+ std::stringstream ss;
+ ss << filenames[i] << ".g_land";
+ l.print_to_file(ss.str().c_str());
+ }
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_landscapes_on_grid/plot_landscapes_on_grid.cpp b/utilities/Persistence_representations/persistence_landscapes_on_grid/plot_landscapes_on_grid.cpp
new file mode 100644
index 00000000..dddb3615
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_landscapes_on_grid/plot_landscapes_on_grid.cpp
@@ -0,0 +1,44 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_landscape_on_grid.h>
+
+#include <iostream>
+#include <sstream>
+
+using Persistence_landscape_on_grid = Gudhi::Persistence_representations::Persistence_landscape_on_grid;
+
+int main(int argc, char** argv) {
+ std::cout << "This program creates a gnuplot script from a persistence landscape on grid stored in a file (the file "
+ << "needs to be created beforehand). Please call the code with the name of a single landscape on grid file"
+ << ".\n";
+ if (argc != 2) {
+ std::cout << "Wrong parameter list, the program will now terminate \n";
+ return 1;
+ }
+
+ Persistence_landscape_on_grid l;
+ l.load_landscape_from_file(argv[1]);
+ l.plot(argv[1]);
+
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_vectors/CMakeLists.txt b/utilities/Persistence_representations/persistence_vectors/CMakeLists.txt
new file mode 100644
index 00000000..a401c955
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_vectors/CMakeLists.txt
@@ -0,0 +1,10 @@
+cmake_minimum_required(VERSION 2.6)
+project(Persistence_vectors_utilities)
+
+add_persistence_representation_creation_utility(create_persistence_vectors "-1")
+
+add_persistence_representation_plot_utility(plot_persistence_vectors ".vect")
+
+add_persistence_representation_function_utility(average_persistence_vectors ".vect")
+add_persistence_representation_function_utility(compute_distance_of_persistence_vectors ".vect" "1")
+add_persistence_representation_function_utility(compute_scalar_product_of_persistence_vectors ".vect")
diff --git a/utilities/Persistence_representations/persistence_vectors/average_persistence_vectors.cpp b/utilities/Persistence_representations/persistence_vectors/average_persistence_vectors.cpp
new file mode 100644
index 00000000..0144e76f
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_vectors/average_persistence_vectors.cpp
@@ -0,0 +1,65 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_vectors.h>
+
+#include <iostream>
+#include <vector>
+
+using Euclidean_distance = Gudhi::Euclidean_distance;
+using Vector_distances_in_diagram = Gudhi::Persistence_representations::Vector_distances_in_diagram<Euclidean_distance>;
+
+int main(int argc, char** argv) {
+ std::cout << "This program computes average of persistence vectors stored in files (the files needs to "
+ << "be created beforehand).\n"
+ << "The parameters of this programs are names of files with persistence vectors.\n";
+
+ if (argc < 3) {
+ std::cout << "Wrong number of parameters, the program will now terminate \n";
+ return 1;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 1; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+
+ std::vector<Vector_distances_in_diagram*> lands;
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ Vector_distances_in_diagram* l = new Vector_distances_in_diagram;
+ l->load_from_file(filenames[i]);
+ lands.push_back(l);
+ }
+
+ Vector_distances_in_diagram av;
+ av.compute_average(lands);
+
+ av.print_to_file("average.vect");
+
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ delete lands[i];
+ }
+
+ std::cout << "Done \n";
+
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_vectors/compute_distance_of_persistence_vectors.cpp b/utilities/Persistence_representations/persistence_vectors/compute_distance_of_persistence_vectors.cpp
new file mode 100644
index 00000000..7e66d25e
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_vectors/compute_distance_of_persistence_vectors.cpp
@@ -0,0 +1,94 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_vectors.h>
+
+#include <iostream>
+#include <sstream>
+#include <limits>
+#include <vector>
+
+using Euclidean_distance = Gudhi::Euclidean_distance;
+using Vector_distances_in_diagram = Gudhi::Persistence_representations::Vector_distances_in_diagram<Euclidean_distance>;
+
+int main(int argc, char** argv) {
+ std::cout << "This program compute distance of persistence vectors stored in a file (the file needs to be created "
+ "beforehand). \n";
+ std::cout << "The first parameter of a program is an integer p. The program compute l^p distance of the vectors. For "
+ "l^infty distance choose p = -1. \n";
+ std::cout << "The remaining parameters of this programs are names of files with persistence vectors.\n";
+
+ if (argc < 3) {
+ std::cout << "Wrong number of parameters, the program will now terminate \n";
+ return 1;
+ }
+
+ int pp = atoi(argv[1]);
+ double p = std::numeric_limits<double>::max();
+ if (pp != -1) {
+ p = pp;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 2; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+ std::vector<Vector_distances_in_diagram> vectors;
+ vectors.reserve(filenames.size());
+ for (size_t file_no = 0; file_no != filenames.size(); ++file_no) {
+ Vector_distances_in_diagram l;
+ l.load_from_file(filenames[file_no]);
+ vectors.push_back(l);
+ }
+
+ // and now we will compute the scalar product of landscapes.
+
+ // first we prepare an array:
+ std::vector<std::vector<double> > distance(filenames.size());
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::vector<double> v(filenames.size(), 0);
+ distance[i] = v;
+ }
+
+ // and now we can compute the distances:
+ for (size_t i = 0; i != vectors.size(); ++i) {
+ for (size_t j = i + 1; j != vectors.size(); ++j) {
+ distance[i][j] = distance[j][i] = vectors[i].distance(vectors[j], p);
+ }
+ }
+
+ // and now output the result to the screen and a file:
+ std::ofstream out;
+ out.open("distance.vect");
+ for (size_t i = 0; i != distance.size(); ++i) {
+ for (size_t j = 0; j != distance.size(); ++j) {
+ std::cout << distance[i][j] << " ";
+ out << distance[i][j] << " ";
+ }
+ std::cout << std::endl;
+ out << std::endl;
+ }
+ out.close();
+
+ std::cout << "Distance can be found in 'distance.vect' file\n";
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_vectors/compute_scalar_product_of_persistence_vectors.cpp b/utilities/Persistence_representations/persistence_vectors/compute_scalar_product_of_persistence_vectors.cpp
new file mode 100644
index 00000000..303c6e3e
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_vectors/compute_scalar_product_of_persistence_vectors.cpp
@@ -0,0 +1,86 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_vectors.h>
+
+#include <iostream>
+#include <sstream>
+#include <limits>
+#include <vector>
+
+using Euclidean_distance = Gudhi::Euclidean_distance;
+using Vector_distances_in_diagram = Gudhi::Persistence_representations::Vector_distances_in_diagram<Euclidean_distance>;
+
+int main(int argc, char** argv) {
+ std::cout << "This program computes scalar product of persistence vectors stored in a file (the file needs to "
+ << "be created beforehand). \n"
+ << "The parameters of this programs are names of files with persistence vectors.\n";
+
+ if (argc < 3) {
+ std::cout << "Wrong number of parameters, the program will now terminate \n";
+ return 1;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 1; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+ std::vector<Vector_distances_in_diagram> vectors;
+ vectors.reserve(filenames.size());
+ for (size_t file_no = 0; file_no != filenames.size(); ++file_no) {
+ Vector_distances_in_diagram l;
+ l.load_from_file(filenames[file_no]);
+ vectors.push_back(l);
+ }
+
+ // and now we will compute the scalar product of landscapes.
+
+ // first we prepare an array:
+ std::vector<std::vector<double> > scalar_product(filenames.size());
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::vector<double> v(filenames.size(), 0);
+ scalar_product[i] = v;
+ }
+
+ // and now we can compute the scalar product:
+ for (size_t i = 0; i != vectors.size(); ++i) {
+ for (size_t j = i; j != vectors.size(); ++j) {
+ scalar_product[i][j] = scalar_product[j][i] = vectors[i].compute_scalar_product(vectors[j]);
+ }
+ }
+
+ // and now output the result to the screen and a file:
+ std::ofstream out;
+ out.open("scalar_product.vect");
+ for (size_t i = 0; i != scalar_product.size(); ++i) {
+ for (size_t j = 0; j != scalar_product.size(); ++j) {
+ std::cout << scalar_product[i][j] << " ";
+ out << scalar_product[i][j] << " ";
+ }
+ std::cout << std::endl;
+ out << std::endl;
+ }
+ out.close();
+
+ std::cout << "Distance can be found in 'scalar_product.vect' file\n";
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_vectors/create_persistence_vectors.cpp b/utilities/Persistence_representations/persistence_vectors/create_persistence_vectors.cpp
new file mode 100644
index 00000000..cc5e5393
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_vectors/create_persistence_vectors.cpp
@@ -0,0 +1,69 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_vectors.h>
+
+#include <iostream>
+#include <sstream>
+#include <limits>
+#include <vector>
+
+using Euclidean_distance = Gudhi::Euclidean_distance;
+using Vector_distances_in_diagram = Gudhi::Persistence_representations::Vector_distances_in_diagram<Euclidean_distance>;
+
+int main(int argc, char** argv) {
+ std::cout << "This program creates persistence vectors files (*.vect) of persistence diagrams files (*.pers) "
+ << "provided as an input.\n"
+ << "The first parameter of this program is a dimension of persistence that will be used in creation of "
+ << "the persistence heat maps."
+ << "If your input files contains persistence pairs of various dimension, as a first parameter of the "
+ << "procedure please provide the dimension of persistence you want to use."
+ << "If in your files there are only birth-death pairs of the same dimension, set the first parameter to "
+ << "-1.\n"
+ << "The remaining parameters are the names of files with persistence diagrams. \n";
+
+ if (argc < 3) {
+ std::cout << "Wrong parameter list, the program will now terminate \n";
+ return 1;
+ }
+
+ std::cout << "The remaining parameters are the names of files with persistence diagrams. \n";
+ int dim = atoi(argv[1]);
+ unsigned dimension = std::numeric_limits<unsigned>::max();
+ if (dim >= 0) {
+ dimension = (unsigned)dim;
+ }
+
+ std::vector<const char*> filenames;
+ for (int i = 2; i < argc; ++i) {
+ filenames.push_back(argv[i]);
+ }
+
+ for (size_t i = 0; i != filenames.size(); ++i) {
+ std::cerr << "Creating persistence vectors based on a file : " << filenames[i] << std::endl;
+ Vector_distances_in_diagram l(filenames[i], dimension);
+ std::stringstream ss;
+ ss << filenames[i] << ".vect";
+ l.print_to_file(ss.str().c_str());
+ }
+ return 0;
+}
diff --git a/utilities/Persistence_representations/persistence_vectors/plot_persistence_vectors.cpp b/utilities/Persistence_representations/persistence_vectors/plot_persistence_vectors.cpp
new file mode 100644
index 00000000..aa33107d
--- /dev/null
+++ b/utilities/Persistence_representations/persistence_vectors/plot_persistence_vectors.cpp
@@ -0,0 +1,43 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2016 INRIA (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gudhi/Persistence_vectors.h>
+
+#include <iostream>
+#include <sstream>
+
+using Euclidean_distance = Gudhi::Euclidean_distance;
+using Vector_distances_in_diagram = Gudhi::Persistence_representations::Vector_distances_in_diagram<Euclidean_distance>;
+
+int main(int argc, char** argv) {
+ std::cout << "This program create a Gnuplot script to plot persistence vector. Please call this program with the "
+ "name of file with persistence vector. \n";
+ if (argc != 2) {
+ std::cout << "Wrong number of parameters, the program will now terminate. \n";
+ return 1;
+ }
+ Vector_distances_in_diagram l;
+ l.load_from_file(argv[1]);
+ l.plot(argv[1]);
+
+ return 0;
+}
diff --git a/utilities/Rips_complex/CMakeLists.txt b/utilities/Rips_complex/CMakeLists.txt
new file mode 100644
index 00000000..baa571fa
--- /dev/null
+++ b/utilities/Rips_complex/CMakeLists.txt
@@ -0,0 +1,21 @@
+cmake_minimum_required(VERSION 2.6)
+project(Rips_complex_utilities)
+
+add_executable(rips_distance_matrix_persistence rips_distance_matrix_persistence.cpp)
+target_link_libraries(rips_distance_matrix_persistence ${Boost_PROGRAM_OPTIONS_LIBRARY})
+
+add_executable(rips_persistence rips_persistence.cpp)
+target_link_libraries(rips_persistence ${Boost_PROGRAM_OPTIONS_LIBRARY})
+
+if (TBB_FOUND)
+ target_link_libraries(rips_distance_matrix_persistence ${TBB_LIBRARIES})
+ target_link_libraries(rips_persistence ${TBB_LIBRARIES})
+endif()
+
+add_test(NAME Rips_complex_utility_from_rips_distance_matrix COMMAND $<TARGET_FILE:rips_distance_matrix_persistence>
+ "${CMAKE_SOURCE_DIR}/data/distance_matrix/full_square_distance_matrix.csv" "-r" "1.0" "-d" "3" "-p" "3" "-m" "0")
+add_test(NAME Rips_complex_utility_from_rips_on_tore_3D COMMAND $<TARGET_FILE:rips_persistence>
+ "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "3")
+
+install(TARGETS rips_distance_matrix_persistence DESTINATION bin)
+install(TARGETS rips_persistence DESTINATION bin)
diff --git a/example/Persistent_cohomology/rips_distance_matrix_persistence.cpp b/utilities/Rips_complex/rips_distance_matrix_persistence.cpp
index d38808c7..ca3c0327 100644
--- a/example/Persistent_cohomology/rips_distance_matrix_persistence.cpp
+++ b/utilities/Rips_complex/rips_distance_matrix_persistence.cpp
@@ -1,5 +1,5 @@
-/* This file is part of the Gudhi Library. The Gudhi library
- * (Geometric Understanding in Higher Dimensions) is a generic C++
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
* library for computational topology.
*
* Author(s): Pawel Dlotko, Vincent Rouvreau
@@ -36,18 +36,13 @@ using Simplex_tree = Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_fast_persis
using Filtration_value = Simplex_tree::Filtration_value;
using Rips_complex = Gudhi::rips_complex::Rips_complex<Filtration_value>;
using Field_Zp = Gudhi::persistent_cohomology::Field_Zp;
-using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology<Simplex_tree, Field_Zp >;
+using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology<Simplex_tree, Field_Zp>;
using Distance_matrix = std::vector<std::vector<Filtration_value>>;
-void program_options(int argc, char * argv[]
- , std::string & csv_matrix_file
- , std::string & filediag
- , Filtration_value & threshold
- , int & dim_max
- , int & p
- , Filtration_value & min_persistence);
+void program_options(int argc, char* argv[], std::string& csv_matrix_file, std::string& filediag,
+ Filtration_value& threshold, int& dim_max, int& p, Filtration_value& min_persistence);
-int main(int argc, char * argv[]) {
+int main(int argc, char* argv[]) {
std::string csv_matrix_file;
std::string filediag;
Filtration_value threshold;
@@ -88,33 +83,28 @@ int main(int argc, char * argv[]) {
return 0;
}
-void program_options(int argc, char * argv[]
- , std::string & csv_matrix_file
- , std::string & filediag
- , Filtration_value & threshold
- , int & dim_max
- , int & p
- , Filtration_value & min_persistence) {
+void program_options(int argc, char* argv[], std::string& csv_matrix_file, std::string& filediag,
+ Filtration_value& threshold, int& dim_max, int& p, Filtration_value& min_persistence) {
namespace po = boost::program_options;
po::options_description hidden("Hidden options");
- hidden.add_options()
- ("input-file", po::value<std::string>(&csv_matrix_file),
- "Name of file containing a distance matrix. Can be square or lower triangular matrix. Separator is ';'.");
+ hidden.add_options()(
+ "input-file", po::value<std::string>(&csv_matrix_file),
+ "Name of file containing a distance matrix. Can be square or lower triangular matrix. Separator is ';'.");
po::options_description visible("Allowed options", 100);
- visible.add_options()
- ("help,h", "produce help message")
- ("output-file,o", po::value<std::string>(&filediag)->default_value(std::string()),
- "Name of file in which the persistence diagram is written. Default print in std::cout")
- ("max-edge-length,r",
- po::value<Filtration_value>(&threshold)->default_value(std::numeric_limits<Filtration_value>::infinity()),
- "Maximal length of an edge for the Rips complex construction.")
- ("cpx-dimension,d", po::value<int>(&dim_max)->default_value(1),
- "Maximal dimension of the Rips complex we want to compute.")
- ("field-charac,p", po::value<int>(&p)->default_value(11),
- "Characteristic p of the coefficient field Z/pZ for computing homology.")
- ("min-persistence,m", po::value<Filtration_value>(&min_persistence),
- "Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length intervals");
+ visible.add_options()("help,h", "produce help message")(
+ "output-file,o", po::value<std::string>(&filediag)->default_value(std::string()),
+ "Name of file in which the persistence diagram is written. Default print in std::cout")(
+ "max-edge-length,r",
+ po::value<Filtration_value>(&threshold)->default_value(std::numeric_limits<Filtration_value>::infinity()),
+ "Maximal length of an edge for the Rips complex construction.")(
+ "cpx-dimension,d", po::value<int>(&dim_max)->default_value(1),
+ "Maximal dimension of the Rips complex we want to compute.")(
+ "field-charac,p", po::value<int>(&p)->default_value(11),
+ "Characteristic p of the coefficient field Z/pZ for computing homology.")(
+ "min-persistence,m", po::value<Filtration_value>(&min_persistence),
+ "Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length "
+ "intervals");
po::positional_options_description pos;
pos.add("input-file", 1);
@@ -123,8 +113,7 @@ void program_options(int argc, char * argv[]
all.add(visible).add(hidden);
po::variables_map vm;
- po::store(po::command_line_parser(argc, argv).
- options(all).positional(pos).run(), vm);
+ po::store(po::command_line_parser(argc, argv).options(all).positional(pos).run(), vm);
po::notify(vm);
if (vm.count("help") || !vm.count("input-file")) {
diff --git a/example/Persistent_cohomology/rips_persistence.cpp b/utilities/Rips_complex/rips_persistence.cpp
index d504798b..8405c014 100644
--- a/example/Persistent_cohomology/rips_persistence.cpp
+++ b/utilities/Rips_complex/rips_persistence.cpp
@@ -1,5 +1,5 @@
-/* This file is part of the Gudhi Library. The Gudhi library
- * (Geometric Understanding in Higher Dimensions) is a generic C++
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
* library for computational topology.
*
* Author(s): Clément Maria
@@ -37,19 +37,14 @@ using Simplex_tree = Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_fast_persis
using Filtration_value = Simplex_tree::Filtration_value;
using Rips_complex = Gudhi::rips_complex::Rips_complex<Filtration_value>;
using Field_Zp = Gudhi::persistent_cohomology::Field_Zp;
-using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology<Simplex_tree, Field_Zp >;
+using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology<Simplex_tree, Field_Zp>;
using Point = std::vector<double>;
using Points_off_reader = Gudhi::Points_off_reader<Point>;
-void program_options(int argc, char * argv[]
- , std::string & off_file_points
- , std::string & filediag
- , Filtration_value & threshold
- , int & dim_max
- , int & p
- , Filtration_value & min_persistence);
+void program_options(int argc, char* argv[], std::string& off_file_points, std::string& filediag,
+ Filtration_value& threshold, int& dim_max, int& p, Filtration_value& min_persistence);
-int main(int argc, char * argv[]) {
+int main(int argc, char* argv[]) {
std::string off_file_points;
std::string filediag;
Filtration_value threshold;
@@ -91,33 +86,27 @@ int main(int argc, char * argv[]) {
return 0;
}
-void program_options(int argc, char * argv[]
- , std::string & off_file_points
- , std::string & filediag
- , Filtration_value & threshold
- , int & dim_max
- , int & p
- , Filtration_value & min_persistence) {
+void program_options(int argc, char* argv[], std::string& off_file_points, std::string& filediag,
+ Filtration_value& threshold, int& dim_max, int& p, Filtration_value& min_persistence) {
namespace po = boost::program_options;
po::options_description hidden("Hidden options");
- hidden.add_options()
- ("input-file", po::value<std::string>(&off_file_points),
- "Name of an OFF file containing a point set.\n");
+ hidden.add_options()("input-file", po::value<std::string>(&off_file_points),
+ "Name of an OFF file containing a point set.\n");
po::options_description visible("Allowed options", 100);
- visible.add_options()
- ("help,h", "produce help message")
- ("output-file,o", po::value<std::string>(&filediag)->default_value(std::string()),
- "Name of file in which the persistence diagram is written. Default print in std::cout")
- ("max-edge-length,r",
- po::value<Filtration_value>(&threshold)->default_value(std::numeric_limits<Filtration_value>::infinity()),
- "Maximal length of an edge for the Rips complex construction.")
- ("cpx-dimension,d", po::value<int>(&dim_max)->default_value(1),
- "Maximal dimension of the Rips complex we want to compute.")
- ("field-charac,p", po::value<int>(&p)->default_value(11),
- "Characteristic p of the coefficient field Z/pZ for computing homology.")
- ("min-persistence,m", po::value<Filtration_value>(&min_persistence),
- "Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length intervals");
+ visible.add_options()("help,h", "produce help message")(
+ "output-file,o", po::value<std::string>(&filediag)->default_value(std::string()),
+ "Name of file in which the persistence diagram is written. Default print in std::cout")(
+ "max-edge-length,r",
+ po::value<Filtration_value>(&threshold)->default_value(std::numeric_limits<Filtration_value>::infinity()),
+ "Maximal length of an edge for the Rips complex construction.")(
+ "cpx-dimension,d", po::value<int>(&dim_max)->default_value(1),
+ "Maximal dimension of the Rips complex we want to compute.")(
+ "field-charac,p", po::value<int>(&p)->default_value(11),
+ "Characteristic p of the coefficient field Z/pZ for computing homology.")(
+ "min-persistence,m", po::value<Filtration_value>(&min_persistence),
+ "Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length "
+ "intervals");
po::positional_options_description pos;
pos.add("input-file", 1);
@@ -126,8 +115,7 @@ void program_options(int argc, char * argv[]
all.add(visible).add(hidden);
po::variables_map vm;
- po::store(po::command_line_parser(argc, argv).
- options(all).positional(pos).run(), vm);
+ po::store(po::command_line_parser(argc, argv).options(all).positional(pos).run(), vm);
po::notify(vm);
if (vm.count("help") || !vm.count("input-file")) {
diff --git a/utilities/Rips_complex/ripscomplex.md b/utilities/Rips_complex/ripscomplex.md
new file mode 100644
index 00000000..4291fae7
--- /dev/null
+++ b/utilities/Rips_complex/ripscomplex.md
@@ -0,0 +1,49 @@
+
+
+# Rips complex #
+
+## rips_persistence ##
+This program computes the persistent homology with coefficient field *Z/pZ* of a Rips complex defined on a set of input points, using Euclidean distance. The output diagram contains one bar per line, written with the convention:
+
+`p dim birth death`
+
+where `dim` is the dimension of the homological feature, `birth` and `death` are respectively the birth and death of the feature, and `p` is the characteristic of the field *Z/pZ* used for homology coefficients (`p` must be a prime number).
+
+**Usage**
+
+`rips_persistence [options] <OFF input file>`
+
+**Allowed options**
+
+* `-h [ --help ]` Produce help message
+* `-o [ --output-file ]` Name of file in which the persistence diagram is written. Default print in standard output.
+* `-r [ --max-edge-length ]` (default = inf) Maximal length of an edge for the Rips complex construction.
+* `-d [ --cpx-dimension ]` (default = 1) Maximal dimension of the Rips complex we want to compute.
+* `-p [ --field-charac ]` (default = 11) Characteristic p of the coefficient field Z/pZ for computing homology.
+* `-m [ --min-persistence ]` (default = 0) Minimal lifetime of homology feature to be recorded. Enter a negative value to see zero length intervals.
+
+Beware: this program may use a lot of RAM and take a lot of time if `max-edge-length` is set to a large value.
+
+**Example 1 with Z/2Z coefficients**
+
+`rips_persistence ../../data/points/tore3D_1307.off -r 0.25 -m 0.5 -d 3 -p 2`
+
+**Example 2 with Z/3Z coefficients**
+
+`rips_persistence ../../data/points/tore3D_1307.off -r 0.25 -m 0.5 -d 3 -p 3`
+
+
+## rips_distance_matrix_persistence ##
+
+Same as `rips_persistence` but taking a distance matrix as input.
+
+**Usage**
+
+`rips_persistence [options] <CSV input file>`
+
+where
+`<CSV input file>` is the path to the file containing a distance matrix. Can be square or lower triangular matrix. Separator is ';'.
+
+**Example**
+
+`rips_distance_matrix_persistence data/distance_matrix/full_square_distance_matrix.csv -r 15 -d 3 -p 3 -m 0`
diff --git a/utilities/Witness_complex/CMakeLists.txt b/utilities/Witness_complex/CMakeLists.txt
new file mode 100644
index 00000000..125a41ff
--- /dev/null
+++ b/utilities/Witness_complex/CMakeLists.txt
@@ -0,0 +1,28 @@
+cmake_minimum_required(VERSION 2.6)
+project(Witness_complex_utilities)
+
+# CGAL and Eigen3 are required for Euclidean version of Witness
+if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.6.0)
+
+ add_executable ( Witness_complex_strong_witness_persistence strong_witness_persistence.cpp )
+ target_link_libraries(Witness_complex_strong_witness_persistence ${Boost_PROGRAM_OPTIONS_LIBRARY})
+
+ add_executable ( Witness_complex_weak_witness_persistence weak_witness_persistence.cpp )
+ target_link_libraries(Witness_complex_weak_witness_persistence ${Boost_PROGRAM_OPTIONS_LIBRARY})
+
+ if (TBB_FOUND)
+ target_link_libraries(Witness_complex_strong_witness_persistence ${TBB_LIBRARIES})
+ target_link_libraries(Witness_complex_weak_witness_persistence ${TBB_LIBRARIES})
+ endif()
+
+ add_test(NAME Witness_complex_strong_test_torus_persistence
+ COMMAND $<TARGET_FILE:Witness_complex_strong_witness_persistence>
+ "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-l" "20" "-a" "0.5")
+ add_test(NAME Witness_complex_weak_test_torus_persistence
+ COMMAND $<TARGET_FILE:Witness_complex_weak_witness_persistence>
+ "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-l" "20" "-a" "0.5")
+
+ install(TARGETS Witness_complex_strong_witness_persistence DESTINATION bin)
+ install(TARGETS Witness_complex_weak_witness_persistence DESTINATION bin)
+
+endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.6.0)
diff --git a/example/Witness_complex/example_strong_witness_persistence.cpp b/utilities/Witness_complex/strong_witness_persistence.cpp
index f786fe7b..2fba631b 100644
--- a/example/Witness_complex/example_strong_witness_persistence.cpp
+++ b/utilities/Witness_complex/strong_witness_persistence.cpp
@@ -25,6 +25,7 @@
#include <gudhi/Persistent_cohomology.h>
#include <gudhi/Points_off_io.h>
#include <gudhi/pick_n_random_points.h>
+#include <gudhi/choose_n_farthest_points.h>
#include <boost/program_options.hpp>
@@ -46,16 +47,10 @@ using Filtration_value = SimplexTree::Filtration_value;
using Field_Zp = Gudhi::persistent_cohomology::Field_Zp;
using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology<SimplexTree, Field_Zp>;
-void program_options(int argc, char * argv[]
- , int & nbL
- , std::string & file_name
- , std::string & filediag
- , Filtration_value & max_squared_alpha
- , int & p
- , int & dim_max
- , Filtration_value & min_persistence);
+void program_options(int argc, char* argv[], int& nbL, std::string& file_name, std::string& filediag,
+ Filtration_value& max_squared_alpha, int& p, int& dim_max, Filtration_value& min_persistence);
-int main(int argc, char * argv[]) {
+int main(int argc, char* argv[]) {
std::string file_name;
std::string filediag;
Filtration_value max_squared_alpha;
@@ -69,19 +64,20 @@ int main(int argc, char * argv[]) {
Point_vector witnesses, landmarks;
Gudhi::Points_off_reader<Point_d> off_reader(file_name);
if (!off_reader.is_valid()) {
- std::cerr << "Witness complex - Unable to read file " << file_name << "\n";
- exit(-1); // ----- >>
+ std::cerr << "Witness complex - Unable to read file " << file_name << "\n";
+ exit(-1); // ----- >>
}
witnesses = Point_vector(off_reader.get_point_cloud());
std::cout << "Successfully read " << witnesses.size() << " points.\n";
std::cout << "Ambient dimension is " << witnesses[0].dimension() << ".\n";
- // Choose landmarks from witnesses
- Gudhi::subsampling::pick_n_random_points(witnesses, nbL, std::back_inserter(landmarks));
+ // Choose landmarks (decomment one of the following two lines)
+ // Gudhi::subsampling::pick_n_random_points(point_vector, nbL, std::back_inserter(landmarks));
+ Gudhi::subsampling::choose_n_farthest_points(K(), witnesses, nbL, Gudhi::subsampling::random_starting_point,
+ std::back_inserter(landmarks));
// Compute witness complex
- Strong_witness_complex strong_witness_complex(landmarks,
- witnesses);
+ Strong_witness_complex strong_witness_complex(landmarks, witnesses);
strong_witness_complex.create_complex(simplex_tree, max_squared_alpha, lim_d);
@@ -110,37 +106,28 @@ int main(int argc, char * argv[]) {
return 0;
}
-void program_options(int argc, char * argv[]
- , int & nbL
- , std::string & file_name
- , std::string & filediag
- , Filtration_value & max_squared_alpha
- , int & p
- , int & dim_max
- , Filtration_value & min_persistence) {
+void program_options(int argc, char* argv[], int& nbL, std::string& file_name, std::string& filediag,
+ Filtration_value& max_squared_alpha, int& p, int& dim_max, Filtration_value& min_persistence) {
namespace po = boost::program_options;
po::options_description hidden("Hidden options");
- hidden.add_options()
- ("input-file", po::value<std::string>(&file_name),
- "Name of file containing a point set in off format.");
+ hidden.add_options()("input-file", po::value<std::string>(&file_name),
+ "Name of file containing a point set in off format.");
po::options_description visible("Allowed options", 100);
Filtration_value default_alpha = std::numeric_limits<Filtration_value>::infinity();
- visible.add_options()
- ("help,h", "produce help message")
- ("landmarks,l", po::value<int>(&nbL),
- "Number of landmarks to choose from the point cloud.")
- ("output-file,o", po::value<std::string>(&filediag)->default_value(std::string()),
- "Name of file in which the persistence diagram is written. Default print in std::cout")
- ("max-sq-alpha,a", po::value<Filtration_value>(&max_squared_alpha)->default_value(default_alpha),
- "Maximal squared relaxation parameter.")
- ("field-charac,p", po::value<int>(&p)->default_value(11),
- "Characteristic p of the coefficient field Z/pZ for computing homology.")
- ("min-persistence,m", po::value<Filtration_value>(&min_persistence)->default_value(0),
- "Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length intervals")
- ("cpx-dimension,d", po::value<int>(&dim_max)->default_value(std::numeric_limits<int>::max()),
- "Maximal dimension of the strong witness complex we want to compute.");
+ visible.add_options()("help,h", "produce help message")("landmarks,l", po::value<int>(&nbL),
+ "Number of landmarks to choose from the point cloud.")(
+ "output-file,o", po::value<std::string>(&filediag)->default_value(std::string()),
+ "Name of file in which the persistence diagram is written. Default print in std::cout")(
+ "max-sq-alpha,a", po::value<Filtration_value>(&max_squared_alpha)->default_value(default_alpha),
+ "Maximal squared relaxation parameter.")(
+ "field-charac,p", po::value<int>(&p)->default_value(11),
+ "Characteristic p of the coefficient field Z/pZ for computing homology.")(
+ "min-persistence,m", po::value<Filtration_value>(&min_persistence)->default_value(0),
+ "Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length "
+ "intervals")("cpx-dimension,d", po::value<int>(&dim_max)->default_value(std::numeric_limits<int>::max()),
+ "Maximal dimension of the strong witness complex we want to compute.");
po::positional_options_description pos;
pos.add("input-file", 1);
@@ -149,8 +136,7 @@ void program_options(int argc, char * argv[]
all.add(visible).add(hidden);
po::variables_map vm;
- po::store(po::command_line_parser(argc, argv).
- options(all).positional(pos).run(), vm);
+ po::store(po::command_line_parser(argc, argv).options(all).positional(pos).run(), vm);
po::notify(vm);
if (vm.count("help") || !vm.count("input-file")) {
@@ -168,4 +154,3 @@ void program_options(int argc, char * argv[]
std::abort();
}
}
-
diff --git a/example/Witness_complex/example_witness_complex_persistence.cpp b/utilities/Witness_complex/weak_witness_persistence.cpp
index a1146922..23fa93aa 100644
--- a/example/Witness_complex/example_witness_complex_persistence.cpp
+++ b/utilities/Witness_complex/weak_witness_persistence.cpp
@@ -25,6 +25,7 @@
#include <gudhi/Persistent_cohomology.h>
#include <gudhi/Points_off_io.h>
#include <gudhi/pick_n_random_points.h>
+#include <gudhi/choose_n_farthest_points.h>
#include <boost/program_options.hpp>
@@ -46,16 +47,10 @@ using Filtration_value = SimplexTree::Filtration_value;
using Field_Zp = Gudhi::persistent_cohomology::Field_Zp;
using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology<SimplexTree, Field_Zp>;
-void program_options(int argc, char * argv[]
- , int & nbL
- , std::string & file_name
- , std::string & filediag
- , Filtration_value & max_squared_alpha
- , int & p
- , int & dim_max
- , Filtration_value & min_persistence);
+void program_options(int argc, char* argv[], int& nbL, std::string& file_name, std::string& filediag,
+ Filtration_value& max_squared_alpha, int& p, int& dim_max, Filtration_value& min_persistence);
-int main(int argc, char * argv[]) {
+int main(int argc, char* argv[]) {
std::string file_name;
std::string filediag;
Filtration_value max_squared_alpha;
@@ -69,19 +64,20 @@ int main(int argc, char * argv[]) {
Point_vector witnesses, landmarks;
Gudhi::Points_off_reader<Point_d> off_reader(file_name);
if (!off_reader.is_valid()) {
- std::cerr << "Witness complex - Unable to read file " << file_name << "\n";
- exit(-1); // ----- >>
+ std::cerr << "Witness complex - Unable to read file " << file_name << "\n";
+ exit(-1); // ----- >>
}
witnesses = Point_vector(off_reader.get_point_cloud());
std::cout << "Successfully read " << witnesses.size() << " points.\n";
std::cout << "Ambient dimension is " << witnesses[0].dimension() << ".\n";
- // Choose landmarks from witnesses
- Gudhi::subsampling::pick_n_random_points(witnesses, nbL, std::back_inserter(landmarks));
+ // Choose landmarks (decomment one of the following two lines)
+ // Gudhi::subsampling::pick_n_random_points(point_vector, nbL, std::back_inserter(landmarks));
+ Gudhi::subsampling::choose_n_farthest_points(K(), witnesses, nbL, Gudhi::subsampling::random_starting_point,
+ std::back_inserter(landmarks));
// Compute witness complex
- Witness_complex witness_complex(landmarks,
- witnesses);
+ Witness_complex witness_complex(landmarks, witnesses);
witness_complex.create_complex(simplex_tree, max_squared_alpha, lim_d);
@@ -110,38 +106,28 @@ int main(int argc, char * argv[]) {
return 0;
}
-
-void program_options(int argc, char * argv[]
- , int & nbL
- , std::string & file_name
- , std::string & filediag
- , Filtration_value & max_squared_alpha
- , int & p
- , int & dim_max
- , Filtration_value & min_persistence) {
+void program_options(int argc, char* argv[], int& nbL, std::string& file_name, std::string& filediag,
+ Filtration_value& max_squared_alpha, int& p, int& dim_max, Filtration_value& min_persistence) {
namespace po = boost::program_options;
po::options_description hidden("Hidden options");
- hidden.add_options()
- ("input-file", po::value<std::string>(&file_name),
- "Name of file containing a point set in off format.");
+ hidden.add_options()("input-file", po::value<std::string>(&file_name),
+ "Name of file containing a point set in off format.");
Filtration_value default_alpha = std::numeric_limits<Filtration_value>::infinity();
po::options_description visible("Allowed options", 100);
- visible.add_options()
- ("help,h", "produce help message")
- ("landmarks,l", po::value<int>(&nbL),
- "Number of landmarks to choose from the point cloud.")
- ("output-file,o", po::value<std::string>(&filediag)->default_value(std::string()),
- "Name of file in which the persistence diagram is written. Default print in std::cout")
- ("max-sq-alpha,a", po::value<Filtration_value>(&max_squared_alpha)->default_value(default_alpha),
- "Maximal squared relaxation parameter.")
- ("field-charac,p", po::value<int>(&p)->default_value(11),
- "Characteristic p of the coefficient field Z/pZ for computing homology.")
- ("min-persistence,m", po::value<Filtration_value>(&min_persistence)->default_value(0),
- "Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length intervals")
- ("cpx-dimension,d", po::value<int>(&dim_max)->default_value(std::numeric_limits<int>::max()),
- "Maximal dimension of the weak witness complex we want to compute.");
+ visible.add_options()("help,h", "produce help message")("landmarks,l", po::value<int>(&nbL),
+ "Number of landmarks to choose from the point cloud.")(
+ "output-file,o", po::value<std::string>(&filediag)->default_value(std::string()),
+ "Name of file in which the persistence diagram is written. Default print in std::cout")(
+ "max-sq-alpha,a", po::value<Filtration_value>(&max_squared_alpha)->default_value(default_alpha),
+ "Maximal squared relaxation parameter.")(
+ "field-charac,p", po::value<int>(&p)->default_value(11),
+ "Characteristic p of the coefficient field Z/pZ for computing homology.")(
+ "min-persistence,m", po::value<Filtration_value>(&min_persistence)->default_value(0),
+ "Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length "
+ "intervals")("cpx-dimension,d", po::value<int>(&dim_max)->default_value(std::numeric_limits<int>::max()),
+ "Maximal dimension of the weak witness complex we want to compute.");
po::positional_options_description pos;
pos.add("input-file", 1);
@@ -150,8 +136,7 @@ void program_options(int argc, char * argv[]
all.add(visible).add(hidden);
po::variables_map vm;
- po::store(po::command_line_parser(argc, argv).
- options(all).positional(pos).run(), vm);
+ po::store(po::command_line_parser(argc, argv).options(all).positional(pos).run(), vm);
po::notify(vm);
if (vm.count("help") || !vm.count("input-file")) {
diff --git a/utilities/Witness_complex/witnesscomplex.md b/utilities/Witness_complex/witnesscomplex.md
new file mode 100644
index 00000000..2341759b
--- /dev/null
+++ b/utilities/Witness_complex/witnesscomplex.md
@@ -0,0 +1,66 @@
+
+
+# Witness complex #
+
+
+For more details about the witness complex, please read the [user manual of the package](/doc/latest/group__witness__complex.html).
+
+## weak_witness_persistence ##
+This program computes the persistent homology with coefficient field *Z/pZ* of a Weak witness complex defined on a set of input points.
+The output diagram contains one bar per line, written with the convention:
+
+`p dim birth death`
+
+where `dim` is the dimension of the homological feature, `birth` and `death` are respectively the birth and death of the feature,
+and `p` is the characteristic of the field *Z/pZ* used for homology coefficients.
+
+**Usage**
+
+`weak_witness_persistence [options] <OFF input file>`
+
+**Allowed options**
+
+* `-h [ --help ]` Produce help message
+* `-l [ --landmarks ]` Number of landmarks to choose from the point cloud.
+* `-o [ --output-file ]` Name of file in which the persistence diagram is written. By default, print in std::cout.
+* `-a [ --max-sq-alpha ]` (default = inf) Maximal squared relaxation parameter.
+* `-p [ --field-charac ]` (default = 11) Characteristic p of the coefficient field Z/pZ for computing homology.
+* `-m [ --min-persistence ]` (default = 0) Minimal lifetime of homology feature to be recorded. Enter a negative value to see zero length intervals.
+* `-d [ --cpx-dimension ]` (default = 2147483647) Maximal dimension of the weak witness complex we want to compute.
+
+**Example**
+
+`weak_witness_persistence data/points/tore3D_1307.off -l 20 -a 0.5 -m 0.006`
+
+N.B.: output is random as the 20 landmarks are chosen randomly.
+
+
+## strong_witness_persistence ##
+
+This program computes the persistent homology with coefficient field *Z/pZ* of a Strong witness complex defined on a set of input points.
+The output diagram contains one bar per line, written with the convention:
+
+`p dim birth death`
+
+where `dim` is the dimension of the homological feature, `birth` and `death` are respectively the birth and death of the feature,
+and `p` is the characteristic of the field *Z/pZ* used for homology coefficients.
+
+**Usage**
+
+`strong_witness_persistence [options] <OFF input file>`
+
+**Allowed options**
+
+* `-h [ --help ]` Produce help message
+* `-l [ --landmarks ]` Number of landmarks to choose from the point cloud.
+* `-o [ --output-file ]` Name of file in which the persistence diagram is written. By default, print in std::cout.
+* `-a [ --max-sq-alpha ]` (default = inf) Maximal squared relaxation parameter.
+* `-p [ --field-charac ]` (default = 11) Characteristic p of the coefficient field Z/pZ for computing homology.
+* `-m [ --min-persistence ]` (default = 0) Minimal lifetime of homology feature to be recorded. Enter a negative value to see zero length intervals.
+* `-d [ --cpx-dimension ]` (default = 2147483647) Maximal dimension of the weak witness complex we want to compute.
+
+**Example**
+
+`strong_witness_persistence data/points/tore3D_1307.off -l 20 -a 0.5 -m 0.06`
+
+N.B.: output is random as the 20 landmarks are chosen randomly.
diff --git a/utilities/common/README b/utilities/common/README
deleted file mode 100644
index dc841521..00000000
--- a/utilities/common/README
+++ /dev/null
@@ -1,19 +0,0 @@
-======================= off_file_from_shape_generator ==================================
-
-Example of use :
-
-*** on|in sphere|cube|curve|torus|klein generator
-
-./off_file_from_shape_generator on sphere onSphere.off 1000 3 15.2
-
- => generates a onSphere.off file with 1000 points randomized on a sphere of dimension 3 and radius 15.2
-
-./off_file_from_shape_generator in sphere inSphere.off 100 2
-
- => generates a inSphere.off file with 100 points randomized in a sphere of dimension 2 (circle) and radius 1.0 (default)
-
-./off_file_from_shape_generator in cube inCube.off 10000 3 5.8
-
- => generates a inCube.off file with 10000 points randomized in a cube of dimension 3 and side 5.8
-
-!! Warning: hypegenerator on cube is not available !!
diff --git a/utilities/common/pointsetgenerator.md b/utilities/common/pointsetgenerator.md
new file mode 100644
index 00000000..284715d4
--- /dev/null
+++ b/utilities/common/pointsetgenerator.md
@@ -0,0 +1,33 @@
+
+
+# common #
+
+## off_file_from_shape_generator ##
+
+Generates a pointset and save it in an OFF file. Command-line is:
+
+```
+off_file_from_shape_generator on|in sphere|cube|curve|torus|klein <filename> <num_points> <dimension> <parameter1> <parameter2>...
+```
+
+Warning: "on cube" generator is not available!
+
+**Examples**
+
+```
+off_file_from_shape_generator on sphere onSphere.off 1000 3 15.2
+```
+
+* Generates an onSphere.off file with 1000 points randomized on a sphere of dimension 3 and radius 15.2.
+
+```
+off_file_from_shape_generator in sphere inSphere.off 100 2
+```
+
+* Generates an inSphere.off file with 100 points randomized in a sphere of dimension 2 (circle) and radius 1.0 (default).
+
+```
+off_file_from_shape_generator in cube inCube.off 10000 3 5.8
+```
+
+* Generates a inCube.off file with 10000 points randomized in a cube of dimension 3 and side 5.8.