diff options
author | Gard Spreemann <gspreemann@gmail.com> | 2018-02-02 14:05:27 +0100 |
---|---|---|
committer | Gard Spreemann <gspreemann@gmail.com> | 2018-02-02 14:05:27 +0100 |
commit | df9caafd97960a610906a79cf40ba52e40c6cf48 (patch) | |
tree | a9c0b0330239e6438510432b0ba78f35799224d9 | |
parent | 5bb200877fac0090032b9d56b782d2ae361efa9b (diff) | |
parent | 8e51c74d8855a641c006765ee246402e218828f3 (diff) |
Merge branch 'dfsg/latest' into debian/sid
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}\"") @@ -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 %}© <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %} {%- else %} - {% trans copyright=copyright|e %}© 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 Binary files differnew file mode 100644 index 00000000..cb1b9b7f --- /dev/null +++ b/doc/Nerve_GIC/GIC.jpg diff --git a/doc/Nerve_GIC/GIC.pdf b/doc/Nerve_GIC/GIC.pdf Binary files differnew file mode 100644 index 00000000..30525745 --- /dev/null +++ b/doc/Nerve_GIC/GIC.pdf 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 Binary files differnew file mode 100644 index 00000000..313aa1b5 --- /dev/null +++ b/doc/Nerve_GIC/coordGICvisu.pdf diff --git a/doc/Nerve_GIC/coordGICvisu2.jpg b/doc/Nerve_GIC/coordGICvisu2.jpg Binary files differnew file mode 100644 index 00000000..046feb2a --- /dev/null +++ b/doc/Nerve_GIC/coordGICvisu2.jpg diff --git a/doc/Nerve_GIC/funcGICvisu.jpg b/doc/Nerve_GIC/funcGICvisu.jpg Binary files differnew file mode 100644 index 00000000..36b64dde --- /dev/null +++ b/doc/Nerve_GIC/funcGICvisu.jpg diff --git a/doc/Nerve_GIC/funcGICvisu.pdf b/doc/Nerve_GIC/funcGICvisu.pdf Binary files differnew file mode 100644 index 00000000..d7456cd3 --- /dev/null +++ b/doc/Nerve_GIC/funcGICvisu.pdf diff --git a/doc/Nerve_GIC/gicvisu.jpg b/doc/Nerve_GIC/gicvisu.jpg Binary files differnew file mode 100644 index 00000000..576dae47 --- /dev/null +++ b/doc/Nerve_GIC/gicvisu.jpg diff --git a/doc/Nerve_GIC/gicvoronoivisu.jpg b/doc/Nerve_GIC/gicvoronoivisu.jpg Binary files differnew file mode 100644 index 00000000..cd86c411 --- /dev/null +++ b/doc/Nerve_GIC/gicvoronoivisu.jpg diff --git a/doc/Nerve_GIC/nerve.png b/doc/Nerve_GIC/nerve.png Binary files differnew file mode 100644 index 00000000..b66da4a4 --- /dev/null +++ b/doc/Nerve_GIC/nerve.png diff --git a/doc/Nerve_GIC/nervevisu.jpg b/doc/Nerve_GIC/nervevisu.jpg Binary files differnew file mode 100644 index 00000000..67ae1d7e --- /dev/null +++ b/doc/Nerve_GIC/nervevisu.jpg 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 Binary files differnew file mode 100644 index 00000000..ea59926b --- /dev/null +++ b/doc/Persistence_representations/average_landscape.png 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--> Version $projectnumber<!--END PROJECT_NUMBER--> <!--BEGIN PROJECT_BRIEF--> - $projectbrief<!--END PROJECT_BRIEF--> +<!--BEGIN PROJECT_BRIEF--> - 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  <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 ≥ 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 ≥ 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 ≥ 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 ≥ 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® 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® TBB installed is recommended to parallelize and accelerate some GUDHI computations. + * + * The following examples/utilities are using Intel® 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ère<br> + <b>Introduced in:</b> GUDHI 2.1.0<br> + <b>Copyright:</b> GPL v3<br> + <b>Requires:</b> \ref cgal ≥ 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 ≥ 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 ≥ 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 ≥ 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 ≥ 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® 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® TBB installed is recommended to parallelize and accelerate some GUDHI computations. - * - * The following examples are using Intel® 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. |